]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Merge branch 'master' into coderkun_neo2
authorcoderkun <olli@coderkun.de>
Sun, 2 Oct 2016 08:04:29 +0000 (10:04 +0200)
committercoderkun <olli@coderkun.de>
Sun, 2 Oct 2016 08:04:29 +0000 (10:04 +0200)
372 files changed:
.gitattributes
.gitignore
.gitmodules
.travis.yml
Makefile
build_keyboard.mk [new file with mode: 0644]
build_test.mk [new file with mode: 0644]
common.mk [new file with mode: 0644]
doc/VAGRANT_GUIDE.md
keyboards/alps64/Makefile
keyboards/alps64/rules.mk [new file with mode: 0644]
keyboards/amj60/Makefile
keyboards/amj60/rules.mk [new file with mode: 0644]
keyboards/arrow_pad/Makefile
keyboards/arrow_pad/readme.md
keyboards/arrow_pad/rules.mk [new file with mode: 0644]
keyboards/atomic/Makefile
keyboards/atomic/keymaps/pvc/Makefile
keyboards/atomic/keymaps/pvc/config.h
keyboards/atomic/keymaps/pvc/keymap.c
keyboards/atomic/readme.md
keyboards/atomic/rules.mk [new file with mode: 0644]
keyboards/atreus/Makefile
keyboards/atreus/config.h
keyboards/atreus/keymaps/classic/keymap.c [new file with mode: 0644]
keyboards/atreus/keymaps/default/keymap.c
keyboards/atreus/keymaps/erlandsona/config.h [new file with mode: 0644]
keyboards/atreus/keymaps/erlandsona/keymap.c [new file with mode: 0644]
keyboards/atreus/keymaps/jeremy/keymap.c [new file with mode: 0644]
keyboards/atreus/keymaps/jeremy/readme.md [new file with mode: 0644]
keyboards/atreus/readme.md
keyboards/atreus/rules.mk [new file with mode: 0644]
keyboards/bantam44/Makefile
keyboards/bantam44/readme.md
keyboards/bantam44/rules.mk [new file with mode: 0644]
keyboards/chibios_test/Makefile
keyboards/chibios_test/boards/GENERIC_STM32_F103/board.c
keyboards/chibios_test/boards/GENERIC_STM32_F103/board.h
keyboards/chibios_test/boards/GENERIC_STM32_F103/board.mk
keyboards/chibios_test/ld/MKL26Z64.ld
keyboards/chibios_test/ld/STM32F103x8_stm32duino_bootloader.ld
keyboards/chibios_test/rules.mk [new file with mode: 0644]
keyboards/chibios_test/stm32_f072_onekey/Makefile
keyboards/chibios_test/stm32_f072_onekey/mcuconf.h
keyboards/chibios_test/stm32_f072_onekey/rules.mk [new file with mode: 0644]
keyboards/chibios_test/stm32_f103_onekey/Makefile
keyboards/chibios_test/stm32_f103_onekey/mcuconf.h
keyboards/chibios_test/stm32_f103_onekey/rules.mk [new file with mode: 0644]
keyboards/chibios_test/teensy_lc_onekey/Makefile
keyboards/chibios_test/teensy_lc_onekey/chconf.h
keyboards/chibios_test/teensy_lc_onekey/halconf.h
keyboards/chibios_test/teensy_lc_onekey/mcuconf.h
keyboards/chibios_test/teensy_lc_onekey/rules.mk [new file with mode: 0644]
keyboards/clueboard/Makefile
keyboards/clueboard/readme.md
keyboards/clueboard/rev1/Makefile
keyboards/clueboard/rev1/rules.mk [new file with mode: 0644]
keyboards/clueboard/rev2/Makefile
keyboards/clueboard/rev2/rules.mk [new file with mode: 0644]
keyboards/clueboard/rules.mk [new file with mode: 0644]
keyboards/cluecard/Makefile
keyboards/cluecard/readme.md
keyboards/cluecard/rules.mk [new file with mode: 0644]
keyboards/cluepad/Makefile
keyboards/cluepad/rules.mk [new file with mode: 0644]
keyboards/ergodox/Makefile
keyboards/ergodox/ergodox.c
keyboards/ergodox/ez/Makefile
keyboards/ergodox/ez/ez.h
keyboards/ergodox/ez/keymaps/profet_80/ergodox80.png [new file with mode: 0644]
keyboards/ergodox/ez/keymaps/profet_80/keymap.c [new file with mode: 0644]
keyboards/ergodox/ez/keymaps/profet_80/readme.md [new file with mode: 0644]
keyboards/ergodox/ez/rules.mk [new file with mode: 0644]
keyboards/ergodox/infinity/Makefile
keyboards/ergodox/infinity/rules.mk [new file with mode: 0644]
keyboards/ergodox/keymaps/absenth/absenth_highres.png [new file with mode: 0644]
keyboards/ergodox/keymaps/absenth/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/absenth/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/algernon/Makefile
keyboards/ergodox/keymaps/algernon/images/adore-layer.png
keyboards/ergodox/keymaps/algernon/images/base-layer.png
keyboards/ergodox/keymaps/algernon/images/heatmap.png
keyboards/ergodox/keymaps/algernon/keymap.c
keyboards/ergodox/keymaps/algernon/readme.md
keyboards/ergodox/keymaps/algernon/tools/heatmap-adore-layout.json [deleted file]
keyboards/ergodox/keymaps/algernon/tools/heatmap-base-layout.json [deleted file]
keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.ADORE.json [new file with mode: 0644]
keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.Dvorak.json [new file with mode: 0644]
keyboards/ergodox/keymaps/algernon/tools/hid-commands [new file with mode: 0755]
keyboards/ergodox/keymaps/algernon/tools/layer-notify [new file with mode: 0755]
keyboards/ergodox/keymaps/algernon/tools/log-to-heatmap.py
keyboards/ergodox/keymaps/algernon/tools/max-focused [deleted file]
keyboards/ergodox/keymaps/algernon/tools/text-to-log.py [new file with mode: 0755]
keyboards/ergodox/keymaps/bepo_csa/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/bepo_csa/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/default/keymap.c
keyboards/ergodox/keymaps/default/readme.md
keyboards/ergodox/keymaps/kastyle/keymap.c
keyboards/ergodox/keymaps/kastyle/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/mclennon_osx/README.md [new file with mode: 0644]
keyboards/ergodox/keymaps/mclennon_osx/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keyboard-layout.png [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keyboard-layout.png [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/readme.md [new file with mode: 0644]
keyboards/ergodox/keymaps/romanzolotarev-norman-osx/keymap.c
keyboards/ergodox/keymaps/romanzolotarev-norman-osx/readme.md
keyboards/ergodox/keymaps/yoruian/90-ergodox-yoruian.conf [new file with mode: 0644]
keyboards/ergodox/keymaps/yoruian/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/yoruian/README [new file with mode: 0644]
keyboards/ergodox/keymaps/yoruian/ergodox_yoruian [new file with mode: 0644]
keyboards/ergodox/keymaps/yoruian/keymap.c [new file with mode: 0644]
keyboards/ergodox/keymaps/yoruian/yoruian.h [new file with mode: 0644]
keyboards/ergodox/keymaps/zweihander-osx/Makefile [new file with mode: 0644]
keyboards/ergodox/keymaps/zweihander-osx/keymap.c
keyboards/ergodox/keymaps/zweihander-osx/makefile.mk [deleted file]
keyboards/ergodox/keymaps/zweihander-osx/readme.markdown
keyboards/ergodox/readme.md
keyboards/ergodox/rules.mk [new file with mode: 0644]
keyboards/gh60/Makefile
keyboards/gh60/config.h
keyboards/gh60/gh60.c
keyboards/gh60/gh60.h
keyboards/gh60/keymaps/robotmaxtron/Makefile
keyboards/gh60/keymaps/robotmaxtron/config.h
keyboards/gh60/pinout.txt
keyboards/gh60/readme.md
keyboards/gh60/rules.mk [new file with mode: 0644]
keyboards/handwired/CMD60/Makefile
keyboards/handwired/CMD60/rules.mk [new file with mode: 0644]
keyboards/handwired/Makefile
keyboards/handwired/fivethirteen/Makefile
keyboards/handwired/fivethirteen/rules.mk [new file with mode: 0644]
keyboards/handwired/minorca/Makefile
keyboards/handwired/minorca/rules.mk [new file with mode: 0644]
keyboards/handwired/onekey/Makefile
keyboards/handwired/onekey/rules.mk [new file with mode: 0644]
keyboards/handwired/retro_refit/Makefile [new file with mode: 0644]
keyboards/handwired/retro_refit/config.h [new file with mode: 0644]
keyboards/handwired/retro_refit/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/handwired/retro_refit/readme.md [new file with mode: 0644]
keyboards/handwired/retro_refit/retro_refit.c [new file with mode: 0644]
keyboards/handwired/retro_refit/retro_refit.h [new file with mode: 0644]
keyboards/handwired/retro_refit/rules.mk [new file with mode: 0644]
keyboards/handwired/rules.mk [new file with mode: 0644]
keyboards/handwired/traveller/Makefile
keyboards/handwired/traveller/rules.mk [new file with mode: 0644]
keyboards/hhkb/Makefile
keyboards/hhkb/keymaps/dbroqua/keymap.c [new file with mode: 0644]
keyboards/hhkb/keymaps/dbroqua/readme.md [new file with mode: 0644]
keyboards/hhkb/keymaps/jp/Makefile
keyboards/hhkb/keymaps/rdg_jp/Makefile
keyboards/hhkb/readme.md
keyboards/hhkb/rules.mk [new file with mode: 0644]
keyboards/infinity60/MEMO.txt [new file with mode: 0644]
keyboards/infinity60/Makefile [new file with mode: 0644]
keyboards/infinity60/bootloader_defs.h [new file with mode: 0644]
keyboards/infinity60/chconf.h [new file with mode: 0644]
keyboards/infinity60/config.h [new file with mode: 0644]
keyboards/infinity60/halconf.h [new file with mode: 0644]
keyboards/infinity60/infinity60.c [new file with mode: 0644]
keyboards/infinity60/infinity60.h [new file with mode: 0644]
keyboards/infinity60/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/infinity60/keymaps/depariel/keymap.c [new file with mode: 0755]
keyboards/infinity60/keymaps/hasu/keymap.c [new file with mode: 0644]
keyboards/infinity60/led.c [new file with mode: 0644]
keyboards/infinity60/matrix.c [new file with mode: 0644]
keyboards/infinity60/mcuconf.h [new file with mode: 0644]
keyboards/infinity60/readme.md [new file with mode: 0644]
keyboards/infinity60/rules.mk [new file with mode: 0644]
keyboards/infinity_chibios/MEMO.txt [deleted file]
keyboards/infinity_chibios/Makefile [deleted file]
keyboards/infinity_chibios/bootloader_defs.h [deleted file]
keyboards/infinity_chibios/chconf.h [deleted file]
keyboards/infinity_chibios/config.h [deleted file]
keyboards/infinity_chibios/halconf.h [deleted file]
keyboards/infinity_chibios/infinity_chibios.c [deleted file]
keyboards/infinity_chibios/infinity_chibios.h [deleted file]
keyboards/infinity_chibios/keymaps/default/keymap.c [deleted file]
keyboards/infinity_chibios/keymaps/depariel/keymap.c [deleted file]
keyboards/infinity_chibios/keymaps/hasu/keymap.c [deleted file]
keyboards/infinity_chibios/led.c [deleted file]
keyboards/infinity_chibios/matrix.c [deleted file]
keyboards/infinity_chibios/mcuconf.h [deleted file]
keyboards/jd40/Makefile [new file with mode: 0644]
keyboards/jd40/config.h [new file with mode: 0644]
keyboards/jd40/jd40.c [new file with mode: 0644]
keyboards/jd40/jd40.h [new file with mode: 0644]
keyboards/jd40/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/jd40/readme.md [new file with mode: 0644]
keyboards/jd40/rules.mk [new file with mode: 0644]
keyboards/jd45/Makefile
keyboards/jd45/rules.mk [new file with mode: 0644]
keyboards/kc60/Makefile
keyboards/kc60/config.h
keyboards/kc60/keymaps/dbroqua/keymap.c
keyboards/kc60/keymaps/workman-dead/README.md [deleted file]
keyboards/kc60/keymaps/workman-dead/keymap.c
keyboards/kc60/keymaps/workman-dead/readme.md [new file with mode: 0644]
keyboards/kc60/readme.md
keyboards/kc60/rules.mk [new file with mode: 0644]
keyboards/kinesis/Makefile
keyboards/kinesis/readme.md
keyboards/kinesis/rules.mk [new file with mode: 0644]
keyboards/kitten_paw/Makefile
keyboards/kitten_paw/rules.mk [new file with mode: 0644]
keyboards/lets_split/Makefile
keyboards/lets_split/config.h
keyboards/lets_split/i2c.c
keyboards/lets_split/keymaps/i2c/config.h [new file with mode: 0644]
keyboards/lets_split/keymaps/i2c/keymap.c [new file with mode: 0644]
keyboards/lets_split/keymaps/serial/config.h [new file with mode: 0644]
keyboards/lets_split/keymaps/serial/keymap.c [new file with mode: 0644]
keyboards/lets_split/lets_split.c
keyboards/lets_split/matrix.c
keyboards/lets_split/rules.mk [new file with mode: 0644]
keyboards/lets_split/serial.c
keyboards/lets_split/split_util.c
keyboards/phantom/Makefile
keyboards/phantom/rules.mk [new file with mode: 0644]
keyboards/planck/Makefile
keyboards/planck/keymaps/bone2planck/config.h [new file with mode: 0644]
keyboards/planck/keymaps/bone2planck/keymap.c
keyboards/planck/keymaps/bone2planck/readme.md [new file with mode: 0644]
keyboards/planck/keymaps/callum/keymap.c
keyboards/planck/keymaps/callum/readme.md
keyboards/planck/keymaps/cbbrowne/config.h
keyboards/planck/keymaps/cbbrowne/keymap.c
keyboards/planck/keymaps/cbbrowne/readme.md
keyboards/planck/keymaps/impossible/Makefile [new file with mode: 0644]
keyboards/planck/keymaps/impossible/keymap.c [new file with mode: 0644]
keyboards/planck/keymaps/impossible/readme.md [new file with mode: 0644]
keyboards/planck/keymaps/jhenahan/Makefile [new file with mode: 0644]
keyboards/planck/keymaps/jhenahan/config.h [new file with mode: 0644]
keyboards/planck/keymaps/jhenahan/keymap.c [new file with mode: 0644]
keyboards/planck/keymaps/jhenahan/readme.md [new file with mode: 0644]
keyboards/planck/keymaps/pvc/Makefile
keyboards/planck/keymaps/pvc/config.h
keyboards/planck/keymaps/pvc/keymap.c
keyboards/planck/keymaps/sgoodwin/Makefile [new file with mode: 0644]
keyboards/planck/keymaps/sgoodwin/keymap.c [new file with mode: 0644]
keyboards/planck/keymaps/sgoodwin/readme.md [new file with mode: 0644]
keyboards/planck/keymaps/tong92/Makefile [new file with mode: 0644]
keyboards/planck/keymaps/tong92/keymap.c [new file with mode: 0644]
keyboards/planck/keymaps/tong92/readme.md [new file with mode: 0644]
keyboards/planck/readme.md
keyboards/planck/rev3/Makefile
keyboards/planck/rev3/rules.mk [new file with mode: 0644]
keyboards/planck/rev4/Makefile
keyboards/planck/rev4/rules.mk [new file with mode: 0644]
keyboards/planck/rules.mk [new file with mode: 0644]
keyboards/preonic/Makefile
keyboards/preonic/readme.md
keyboards/preonic/rules.mk [new file with mode: 0644]
keyboards/readme.md
keyboards/retro_refit/Makefile [deleted file]
keyboards/retro_refit/config.h [deleted file]
keyboards/retro_refit/keymaps/default/keymap.c [deleted file]
keyboards/retro_refit/readme.md [deleted file]
keyboards/retro_refit/retro_refit.c [deleted file]
keyboards/retro_refit/retro_refit.h [deleted file]
keyboards/s60-x/Makefile
keyboards/s60-x/readme.md
keyboards/s60-x/rules.mk [new file with mode: 0644]
keyboards/satan/Makefile
keyboards/satan/rules.mk [new file with mode: 0644]
keyboards/sixkeyboard/Makefile
keyboards/sixkeyboard/rules.mk [new file with mode: 0644]
keyboards/tada68/Makefile [new file with mode: 0644]
keyboards/tada68/config.h [new file with mode: 0644]
keyboards/tada68/keymaps/default/Makefile [new file with mode: 0644]
keyboards/tada68/keymaps/default/keymap.c [new file with mode: 0644]
keyboards/tada68/keymaps/default/readme.md [new file with mode: 0644]
keyboards/tada68/readme.md [new file with mode: 0644]
keyboards/tada68/rules.mk [new file with mode: 0644]
keyboards/tada68/tada68.c [new file with mode: 0644]
keyboards/tada68/tada68.h [new file with mode: 0644]
keyboards/tv44/Makefile
keyboards/tv44/keymaps/jeebak/Makefile [new file with mode: 0644]
keyboards/tv44/keymaps/jeebak/config.h [new file with mode: 0644]
keyboards/tv44/keymaps/jeebak/keymap.c [new file with mode: 0644]
keyboards/tv44/keymaps/jeebak/readme.md [new file with mode: 0644]
keyboards/tv44/readme.md
keyboards/tv44/rules.mk [new file with mode: 0644]
keyboards/vision_division/Makefile
keyboards/vision_division/config.h
keyboards/vision_division/keymaps/default/Makefile
keyboards/vision_division/keymaps/default/config.h
keyboards/vision_division/keymaps/default/keymap.c
keyboards/vision_division/matrix_types.h
keyboards/vision_division/readme.md
keyboards/vision_division/rules.mk [new file with mode: 0644]
keyboards/vision_division/vision_division.c
lib/googletest [new submodule]
message.mk [new file with mode: 0644]
quantum/keycode_config.h
quantum/keymap.h
quantum/keymap_extras/keymap_canadian_multilingual.h [new file with mode: 0644]
quantum/keymap_extras/keymap_dvorak.h
quantum/process_keycode/process_midi.c
quantum/process_keycode/process_tap_dance.c
quantum/process_keycode/process_tap_dance.h
quantum/process_keycode/process_unicode.c
quantum/process_keycode/process_unicode.h
quantum/quantum.c
quantum/serial_link/protocol/byte_stuffer.c
quantum/serial_link/protocol/byte_stuffer.h
quantum/serial_link/protocol/transport.c
quantum/serial_link/protocol/transport.h
quantum/serial_link/tests/byte_stuffer_tests.c [deleted file]
quantum/serial_link/tests/byte_stuffer_tests.cpp [new file with mode: 0644]
quantum/serial_link/tests/frame_router_tests.c [deleted file]
quantum/serial_link/tests/frame_router_tests.cpp [new file with mode: 0644]
quantum/serial_link/tests/frame_validator_tests.c [deleted file]
quantum/serial_link/tests/frame_validator_tests.cpp [new file with mode: 0644]
quantum/serial_link/tests/rules.mk [new file with mode: 0644]
quantum/serial_link/tests/testlist.mk [new file with mode: 0644]
quantum/serial_link/tests/transport_tests.c [deleted file]
quantum/serial_link/tests/transport_tests.cpp [new file with mode: 0644]
quantum/serial_link/tests/triple_buffered_object_tests.c [deleted file]
quantum/serial_link/tests/triple_buffered_object_tests.cpp [new file with mode: 0644]
quantum/template/Makefile
quantum/template/readme.md
quantum/template/rules.mk [new file with mode: 0644]
readme.md
testlist.mk [new file with mode: 0644]
tmk_core/chibios.mk
tmk_core/common.mk
tmk_core/common/action.c
tmk_core/common/action_util.c
tmk_core/common/avr/bootloader.c
tmk_core/common/avr/xprintf.S
tmk_core/common/avr/xprintf.h
tmk_core/common/bootmagic.c
tmk_core/common/command.c
tmk_core/common/host.c
tmk_core/common/host.h
tmk_core/common/keyboard.c
tmk_core/common/magic.c
tmk_core/common/mbed/xprintf.cpp
tmk_core/common/mbed/xprintf.h
tmk_core/common/print.h
tmk_core/native.mk [new file with mode: 0644]
tmk_core/protocol/chibios/usb_main.c
tmk_core/protocol/iwrap/suart.S
tmk_core/protocol/iwrap/suart.h
tmk_core/protocol/iwrap/wd.h
tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
tmk_core/protocol/lufa/descriptor.h
tmk_core/protocol/lufa/lufa.c
tmk_core/protocol/pjrc/usb.c
tmk_core/protocol/pjrc/usb_keyboard.c
tmk_core/readme.md
tmk_core/rules.mk
util/Win_Check.bat [new file with mode: 0644]
util/install_dependencies.sh [changed mode: 0644->0755]
util/new_project.sh
util/travis_compiled_push.sh

index 8fd1fd7525a7f2209234a6ac03701e94e4255b7e..92dfc3c617709e2666e384a0c5945c84f0b569b1 100644 (file)
@@ -91,3 +91,4 @@ GRAPHICS
 
 # hex files
 *.hex binary
+*.eep binary
index 07bbf13db1229e1c011943ee1a38be75ef08ab6a..153fea093cd58deced4af9fd3b7c2b002a67c5b9 100644 (file)
@@ -29,3 +29,4 @@ CMakeLists.txt
 .idea
 .browse.VC.db*
 *.stackdump
+util/Win_Check_Output.txt
index 7e3c92d031214cecc061c1ca9efa238b30c535d3..12b7cb918f2a7b9ebe35d03cffc1fd2a0c61edec 100644 (file)
@@ -7,3 +7,6 @@
 [submodule "lib/ugfx"]
        path = lib/ugfx
        url = https://bitbucket.org/Tectu/ugfx
+[submodule "lib/googletest"]
+       path = lib/googletest
+       url = https://github.com/google/googletest
index 297cf19a686925e67f68f66da6feccf04a8b5ad7..e74744a967ef316ddff4bc66d6d6bd37d4e33c56 100644 (file)
@@ -9,8 +9,11 @@ branches:
 env:
   global:
   - secure: vBTSL34BDPxDilKUuTXqU4CJ26Pv5hogD2nghatkxSQkI1/jbdnLj/DQdPUrMJFDIY6TK3AltsBx72MaMsLQ1JO/Ou24IeHINHXzUC1FlS9yQa48cpxnhX5kzXNyGs3oa0qaFbvnr7RgYRWtmD52n4bIZuSuW+xpBv05x2OCizdT2ZonH33nATaHGFasxROm4qYZ241VfzcUv766V6RVHgL4x9V08warugs+RENVkfzxxwhk3NmkrISabze0gSVJLHBPHxroZC6EUcf/ocobcuDrCwFqtEt90i7pNIAFUE7gZsN2uE75LmpzAWin21G7lLPcPL2k4FJVd8an1HiP2WmscJU6U89fOfMb2viObnKcCzebozBCmKGtHEuXZo9FcReOx49AnQSpmESJGs+q2dL/FApkTjQiyT4J6O5dJpoww0/r57Wx0cmmqjETKBb5rSgXM51Etk3wO09mvcPHsEwrT7qH8r9XWdyCDoEn7FCLX3/LYnf/D4SmZ633YPl5gv3v9XEwxR5+04akjgnvWDSNIaDbWBdxHNb7l4pMc+WR1bwCyMyA7KXj0RrftEGOrm9ZRLe6BkbT4cycA+j77nbPOMcyZChliV9pPQos+4TOJoTzcK2L8yWVoY409aDNVuAjdP6Yum0R2maBGl/etLmIMpJC35C5/lZ+dUNjJAM=
+  matrix:
+  - TARGET=all-keyboards AUTOGEN=true
+  - TARGET=test AUTOGEN=false
 script:
-- make all-keyboards AUTOGEN=true
+- make $TARGET AUTOGEN=$AUTOGEN
 addons:
   apt:
     packages:
@@ -21,4 +24,8 @@ addons:
     - gcc-arm-none-eabi
     - binutils-arm-none-eabi
     - libnewlib-arm-none-eabi
-after_success: bash util/travis_compiled_push.sh
+    - diffutils
+after_success: 
+  if [ "$AUTOGEN" == "true" ]; then
+    bash util/travis_compiled_push.sh;
+  fi
index 331badcf84fbb243b08c5e475f78638b5694f52e..0aaf585786cbe28bde3ee2ae9ef51c089928e0e7 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,284 +2,518 @@ ifndef VERBOSE
 .SILENT:
 endif
 
-.DEFAULT_GOAL := all
-
-space := $(subst ,, )
-ESCAPED_ABS_PATH = $(subst $(space),_SPACE_,$(abspath $1))
-starting_makefile := $(call ESCAPED_ABS_PATH,$(firstword $(MAKEFILE_LIST)))
-mkfile_path := $(call ESCAPED_ABS_PATH,$(lastword $(MAKEFILE_LIST))))
-abs_tmk_root := $(patsubst %/,%,$(dir $(mkfile_path)))
-
-ifneq (,$(findstring /keyboards/,$(starting_makefile)))
-       possible_keyboard:=$(patsubst %/,%,$(dir $(patsubst $(abs_tmk_root)/keyboards/%,%,$(starting_makefile))))
-       ifneq (,$(findstring /keymaps/,$(possible_keyboard)))
-               KEYMAP_DIR:=$(lastword $(subst /keymaps/, ,$(possible_keyboard)))
-               KEYBOARD_DIR:=$(firstword $(subst /keymaps/, ,$(possible_keyboard)))
-               ifneq (,$(findstring /,$(KEYBOARD_DIR)))
-                       # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR)))
-                       # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR)))
-                       tmk_root = ../../..
-               else
-                       tmk_root = ../../../..
-               endif
-       else
-               KEYMAP_DIR:=default
-               KEYBOARD_DIR:=$(possible_keyboard)
-               ifneq (,$(findstring /,$(KEYBOARD_DIR)))
-                       # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR)))
-                       # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR)))
-                       tmk_root = ../../..
-               else
-                       tmk_root = ../..
-               endif
-       endif
-else
-       tmk_root = .
-endif
-# $(info $(KEYBOARD_DIR))
-# $(info $(KEYMAP_DIR))
-# $(info $(SUBPROJECT_DIR))
-
-# Directory common source filess exist
-TOP_DIR = $(tmk_root)
-TMK_DIR = tmk_core
-TMK_PATH = $(TOP_DIR)/$(TMK_DIR)
-LIB_PATH = $(TOP_DIR)/lib
-
-QUANTUM_DIR = quantum
-QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR)
-
-
+# Never run this makefile in parallel, as it could screw things up
+# It won't affect the submakes, so you still get the speedup from specifying -jx
+.NOTPARALLEL:
+
+# Allow the silent with lower caps to work the same way as upper caps
+ifdef silent
+    SILENT = $(silent)
+endif
+
+ifdef SILENT
+    SUB_IS_SILENT := $(SILENT)
+endif
+
+# We need to make sure that silent is always turned off at the top level
+# Otherwise the [OK], [ERROR] and [WARN] messags won't be displayed correctly
+override SILENT := false
+
+ON_ERROR := error_occured=1
+
+STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST))
+ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST))
+ROOT_DIR := $(dir $(ROOT_MAKEFILE))
+ifeq ($(ROOT_DIR),)
+    ROOT_DIR := .
+endif
+ABS_STARTING_MAKEFILE := $(abspath $(STARTING_MAKEFILE))
+ABS_ROOT_MAKEFILE := $(abspath $(ROOT_MAKEFILE))
+ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
+ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
+STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
+TEST_DIR := $(ROOT_DIR)/.build/test
+
+MAKEFILE_INCLUDED=yes
+
+# Helper function to process the newt element of a space separated path 
+# It works a bit like the traditional functional head tail
+# so the CURRENT_PATH_ELEMENT will beome the new head
+# and the PATH_ELEMENTS are the rest that are still unprocessed
+define NEXT_PATH_ELEMENT
+    $$(eval CURRENT_PATH_ELEMENT := $$(firstword  $$(PATH_ELEMENTS)))
+    $$(eval PATH_ELEMENTS := $$(wordlist  2,9999,$$(PATH_ELEMENTS)))
+endef
+
+# We change the / to spaces so that we more easily can work with the elements 
+# separately
+PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
+# Initialize the path elements list for further processing
+$(eval $(call NEXT_PATH_ELEMENT))
+
+# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct 
+# variables depending on which directory you stand in.
+# It's really a very simple if else chain, if you squint enough, 
+# but the makefile syntax makes it very verbose. 
+# If we are in a subfolder of keyboards
+ifeq ($(CURRENT_PATH_ELEMENT),keyboards)
+    $(eval $(call NEXT_PATH_ELEMENT))
+    KEYBOARD := $(CURRENT_PATH_ELEMENT)
+    $(eval $(call NEXT_PATH_ELEMENT))
+    # If we are in a subfolder of keymaps, or in other words in a keymap
+    # folder
+    ifeq ($(CURRENT_PATH_ELEMENT),keymaps)
+        $(eval $(call NEXT_PATH_ELEMENT))
+        KEYMAP := $(CURRENT_PATH_ELEMENT)
+     # else if we are not in the keyboard folder itself
+    else ifneq ($(CURRENT_PATH_ELEMENT),)
+        # the we can assume it's a subproject, as no other folders
+        # should have make files in them
+        SUBPROJECT := $(CURRENT_PATH_ELEMENT)
+        $(eval $(call NEXT_PATH_ELEMENT))
+        # if we are inside a keymap folder of a subproject
+        ifeq ($(CURRENT_PATH_ELEMENT),keymaps)
+            $(eval $(call NEXT_PATH_ELEMENT))
+            KEYMAP := $(CURRENT_PATH_ELEMENT)
+        endif
+    endif
+endif
+
+# Only consider folders with makefiles, to prevent errors in case there are extra folders
+KEYBOARDS := $(notdir $(patsubst %/Makefile,%,$(wildcard $(ROOT_DIR)/keyboards/*/Makefile)))
+
+#Compability with the old make variables, anything you specify directly on the command line
+# always overrides the detected folders
 ifdef keyboard
-       KEYBOARD ?= $(keyboard)
-endif
-ifdef KEYBOARD_DIR
-       KEYBOARD ?= $(KEYBOARD_DIR)
-endif
-ifndef KEYBOARD
-       KEYBOARD=planck
+    KEYBOARD := $(keyboard)
 endif
-
-MASTER ?= left
-ifdef master
-       MASTER = $(master)
-endif
-
-
-# converts things to keyboards/subproject
-ifneq (,$(findstring /,$(KEYBOARD)))
-       TEMP:=$(KEYBOARD)
-       KEYBOARD:=$(firstword $(subst /, ,$(TEMP)))
-       SUBPROJECT:=$(lastword $(subst /, ,$(TEMP)))
-endif
-
-KEYBOARD_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD)
-
 ifdef sub
-       SUBPROJECT=$(sub)
+    SUBPROJECT := $(sub)
 endif
 ifdef subproject
-       SUBPROJECT=$(subproject)
-endif
-
-ifneq ("$(wildcard $(KEYBOARD_PATH)/$(KEYBOARD).c)","")
-       KEYBOARD_FILE = keyboards/$(KEYBOARD)/$(KEYBOARD).c
-       ifneq ($(call ESCAPED_ABS_PATH,$(KEYBOARD_PATH)/Makefile),$(starting_makefile))
-               -include $(KEYBOARD_PATH)/Makefile
-       endif
-else 
-$(error "$(KEYBOARD_PATH)/$(KEYBOARD).c" does not exist)
-endif
-
-ifdef SUBPROJECT_DEFAULT
-       SUBPROJECT?=$(SUBPROJECT_DEFAULT)
-endif
-
-ifdef SUBPROJECT
-       SUBPROJECT_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)
-       ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","")
-               OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT)
-               SUBPROJECT_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/$(SUBPROJECT).c
-               ifneq ($(call ESCAPED_ABS_PATH,$(SUBPROJECT_PATH)/Makefile),$(starting_makefile))
-                       -include $(SUBPROJECT_PATH)/Makefile
-               endif
-       else 
-$(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist)
-       endif
+    SUBPROJECT := $(subproject)
 endif
-
 ifdef keymap
-       KEYMAP ?= $(keymap)
-endif
-ifdef KEYMAP_DIR
-       KEYMAP ?= $(KEYMAP_DIR)
-endif
-ifndef KEYMAP
-       KEYMAP = default
-endif
-KEYMAP_PATH = $(KEYBOARD_PATH)/keymaps/$(KEYMAP)
-ifneq ("$(wildcard $(KEYMAP_PATH)/keymap.c)","")
-       KEYMAP_FILE = keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/keymap.c
-       ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile))
-               -include $(KEYMAP_PATH)/Makefile
-       endif
-else 
-       ifeq ("$(wildcard $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)/keymap.c)","")
-$(error "$(KEYMAP_PATH)/keymap.c" does not exist)
-       else
-               KEYMAP_PATH = $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)
-               KEYMAP_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/$(KEYMAP)/keymap.c
-               ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile))
-                       -include $(KEYMAP_PATH)/Makefile
-               endif
-       endif
+    KEYMAP := $(keymap)
 endif
 
-ifdef SUBPROJECT
-       TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP)
-else
-       TARGET ?= $(KEYBOARD)_$(KEYMAP)
-endif
-
-BUILD_DIR = $(TOP_DIR)/.build
-
-# Object files directory
-#     To put object files in current directory, use a dot (.), do NOT make
-#     this an empty or blank macro!
-OBJDIR = $(BUILD_DIR)/obj_$(TARGET)
-
+# Uncomment these for debugging
+#$(info Keyboard: $(KEYBOARD))
+#$(info Keymap: $(KEYMAP))
+#$(info Subproject: $(SUBPROJECT))
+#$(info Keyboards: $(KEYBOARDS))
 
 
-ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
-       CONFIG_H = $(KEYMAP_PATH)/config.h
-else
-       CONFIG_H = $(KEYBOARD_PATH)/config.h
-       ifdef SUBPROJECT
-               ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","")
-                       CONFIG_H = $(SUBPROJECT_PATH)/config.h
-               endif
-       endif
-endif
-
-# # project specific files
-SRC += $(KEYBOARD_FILE) \
-       $(KEYMAP_FILE) \
-       $(QUANTUM_DIR)/quantum.c \
-       $(QUANTUM_DIR)/keymap_common.c \
-       $(QUANTUM_DIR)/keycode_config.c \
-       $(QUANTUM_DIR)/process_keycode/process_leader.c
-
-ifdef SUBPROJECT
-       SRC += $(SUBPROJECT_FILE)
-endif
-
-ifdef SUBPROJECT
-       SRC += $(SUBPROJECT_FILE)
-endif
-
-ifdef SUBPROJECT
-       SRC += $(SUBPROJECT_FILE)
-endif
-
-ifndef CUSTOM_MATRIX
-       SRC += $(QUANTUM_DIR)/matrix.c
-endif
-
-ifeq ($(strip $(MIDI_ENABLE)), yes)
-    OPT_DEFS += -DMIDI_ENABLE
-       SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
-endif
-
-ifeq ($(strip $(VIRTSER_ENABLE)), yes)
-    OPT_DEFS += -DVIRTSER_ENABLE
-endif
-
-ifeq ($(strip $(AUDIO_ENABLE)), yes)
-    OPT_DEFS += -DAUDIO_ENABLE
-       SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
-       SRC += $(QUANTUM_DIR)/audio/audio.c
-       SRC += $(QUANTUM_DIR)/audio/voices.c
-       SRC += $(QUANTUM_DIR)/audio/luts.c
-endif
-
-ifeq ($(strip $(UCIS_ENABLE)), yes)
-       OPT_DEFS += -DUCIS_ENABLE
-       UNICODE_ENABLE = yes
-endif
-
-ifeq ($(strip $(UNICODE_ENABLE)), yes)
-    OPT_DEFS += -DUNICODE_ENABLE
-       SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
-endif
-
-ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
-       OPT_DEFS += -DRGBLIGHT_ENABLE
-       SRC += $(QUANTUM_DIR)/light_ws2812.c
-       SRC += $(QUANTUM_DIR)/rgblight.c
-endif
-
-ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
-       OPT_DEFS += -DTAP_DANCE_ENABLE
-       SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
-endif
-
-ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
-       SERIAL_DIR = $(QUANTUM_DIR)/serial_link
-       SERIAL_PATH = $(QUANTUM_PATH)/serial_link
-       SERIAL_SRC = $(wildcard $(SERIAL_PATH)/protocol/*.c)
-       SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
-       SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
-       OPT_DEFS += -DSERIAL_LINK_ENABLE
-       VAPTH += $(SERIAL_PATH)
-endif
-
-# Optimize size but this may cause error "relocation truncated to fit"
-#EXTRALDFLAGS = -Wl,--relax
-
-# Search Path
-VPATH += $(KEYMAP_PATH)
-ifdef SUBPROJECT
-       VPATH += $(SUBPROJECT_PATH)
-endif
-VPATH += $(KEYBOARD_PATH)
-VPATH += $(TOP_DIR)
-VPATH += $(TMK_PATH)
-VPATH += $(QUANTUM_PATH)
-VPATH += $(QUANTUM_PATH)/keymap_extras
-VPATH += $(QUANTUM_PATH)/audio
-VPATH += $(QUANTUM_PATH)/process_keycode
-
-
-# We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA
-ifdef MCU_FAMILY
-       PLATFORM=CHIBIOS
-else
-       PLATFORM=AVR
-endif
-
-include $(TMK_PATH)/common.mk
-ifeq ($(PLATFORM),AVR)
-       include $(TMK_PATH)/protocol/lufa.mk
-       include $(TMK_PATH)/avr.mk
-else ifeq ($(PLATFORM),CHIBIOS)
-       include $(TMK_PATH)/protocol/chibios.mk
-       include $(TMK_PATH)/chibios.mk
-       OPT_OS = chibios
-else
-       $(error Unknown platform)
-endif
-
-ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
-       VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
-       VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
-       include $(VISUALIZER_PATH)/visualizer.mk
-endif
-
-include $(TMK_PATH)/rules.mk
-
+# Set the default goal depening on where we are running make from
+# this handles the case where you run make without any arguments
+.DEFAULT_GOAL := all
+ifneq ($(KEYMAP),)
+    ifeq ($(SUBPROJECT),)
+         # Inside a keymap folder, just build the keymap, with the 
+         # default subproject
+        .DEFAULT_GOAL := $(KEYBOARD)-$(KEYMAP)
+    else
+         # Inside a subproject keyamp folder, build the keymap
+         # for that subproject
+        .DEFAULT_GOAL := $(KEYBOARD)-$(SUBPROJECT)-$(KEYMAP)
+    endif
+else ifneq ($(SUBPROJECT),)
+     # Inside a subproject folder, build all keymaps for that subproject
+    .DEFAULT_GOAL := $(KEYBOARD)-$(SUBPROJECT)-allkm
+else ifneq ($(KEYBOARD),)
+     # Inside a keyboard folder, build all keymaps for all subprojects
+     # Note that this is different from the old behaviour, which would
+     # build only the default keymap of the default keyboard
+    .DEFAULT_GOAL := $(KEYBOARD)-allsp-allkm
+endif
+
+
+# Compare the start of the RULE variable with the first argument($1)
+# If the rules equals $1 or starts with $1-, RULE_FOUND is set to true
+#     and $1 is removed from the RULE variable
+# Otherwise the RULE_FOUND variable is set to false, and RULE left as it was
+# The function is a bit tricky, since there's no built in $(startswith) function
+define COMPARE_AND_REMOVE_FROM_RULE_HELPER
+    ifeq ($1,$$(RULE))
+        RULE:=
+        RULE_FOUND := true
+    else
+        STARTDASH_REMOVED=$$(subst START$1-,,START$$(RULE))
+        ifneq ($$(STARTDASH_REMOVED),START$$(RULE))
+            RULE_FOUND := true
+            RULE := $$(STARTDASH_REMOVED)
+        else
+            RULE_FOUND := false
+        endif
+    endif
+endef
+
+# This makes it easier to call COMPARE_AND_REMOVE_FROM_RULE, since it makes it behave like
+# a function that returns the value
+COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
+
+
+# Recursively try to find a match for the start of the rule to be checked
+# $1 The list to be checked
+# If a match is found, then RULE_FOUND is set to true
+# and MATCHED_ITEM to the item that was matched
+define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
+    ifneq ($1,)
+        ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
+            MATCHED_ITEM := $$(firstword $1)
+        else 
+            $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
+        endif
+    endif
+endef
+
+# A recursive helper function for finding the longest match
+# $1 The list to be checed
+# It works by always removing the currently matched item from the list 
+# and call itself recursively, until a match is found
+define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
+    # Stop the recursion when the list is empty 
+    ifneq ($1,)
+        RULE_BEFORE := $$(RULE)
+        $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
+        # If a match is found in the current list, otherwise just return what we had before
+        ifeq ($$(RULE_FOUND),true)
+            # Save the best match so far and call itself recursivel
+            BEST_MATCH := $$(MATCHED_ITEM)
+            BEST_MATCH_RULE := $$(RULE)
+            RULE_FOUND := false
+            RULE := $$(RULE_BEFORE)
+            $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1)))
+        endif
+     endif
+endef
+
+
+# Recursively try to find the longest match for the start of the rule to be checked
+# $1 The list to be checked
+# If a match is found, then RULE_FOUND is set to true
+# and MATCHED_ITEM to the item that was matched
+define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
+    BEST_MATCH :=
+    $$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1))
+    ifneq ($$(BEST_MATCH),)
+        RULE_FOUND := true
+        RULE := $$(BEST_MATCH_RULE)
+        MATCHED_ITEM := $$(BEST_MATCH)
+    else
+        RULE_FOUND := false
+        MATCHED_ITEM :=
+    endif
+endef
+
+# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
+TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
+
+define ALL_IN_LIST_LOOP
+    OLD_RULE$1 := $$(RULE)
+    $$(eval $$(call $1,$$(ITEM$1)))
+    RULE := $$(OLD_RULE$1)
+endef
+
+define PARSE_ALL_IN_LIST
+    $$(foreach ITEM$1,$2,$$(eval $$(call ALL_IN_LIST_LOOP,$1)))
+endef
+
+# The entry point for rule parsing
+# parses a rule in the format <keyboard>-<subproject>-<keymap>-<target>
+# but this particular function only deals with the first <keyboard> part
+define PARSE_RULE
+    RULE := $1
+    COMMANDS :=
+    # If the rule starts with allkb, then continue the parsing from
+    # PARSE_ALL_KEYBOARDS
+    ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allkb),true)
+        $$(eval $$(call PARSE_ALL_KEYBOARDS))
+    else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,test),true)
+        $$(eval $$(call PARSE_TEST))
+    # If the rule starts with the name of a known keyboard, then continue
+    # the parsing from PARSE_KEYBOARD
+    else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYBOARDS)),true)
+        $$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
+    # Otherwise use the KEYBOARD variable, which is determined either by
+    # the current directory you run make from, or passed in as an argument
+    else ifneq ($$(KEYBOARD),)
+        $$(eval $$(call PARSE_KEYBOARD,$$(KEYBOARD)))
+    else
+        $$(info make: *** No rule to make target '$1'. Stop.)
+        # Notice the tab instead of spaces below!
+               exit 1
+    endif
+endef
+
+# $1 = Keyboard
+# Parses a rule in the format <subproject>-<keymap>-<target>
+# the keyboard is already known when entering this function
+define PARSE_KEYBOARD
+    CURRENT_KB := $1
+    # A subproject is any keyboard subfolder with a makefile
+    SUBPROJECTS := $$(notdir $$(patsubst %/Makefile,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/*/Makefile)))
+    # if the rule starts with allsp, then continue with looping over all subprojects
+    ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allsp),true)
+        $$(eval $$(call PARSE_ALL_SUBPROJECTS))
+    # A special case for matching the defaultsp (default subproject)
+    else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,defaultsp),true)
+        $$(eval $$(call PARSE_SUBPROJECT,defaultsp))
+    # If the rule starts with the name of a known subproject
+    else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(SUBPROJECTS)),true)
+        $$(eval $$(call PARSE_SUBPROJECT,$$(MATCHED_ITEM)))
+    # Try to use the SUBPROJECT variable, which is either determined by the
+    # directory which invoked make, or passed as an argument to make
+    else ifneq ($$(SUBPROJECT),)
+        $$(eval $$(call PARSE_SUBPROJECT,$$(SUBPROJECT)))
+       # If there's no matching subproject, we assume it's the default
+       # This will allow you to leave the subproject part of the target out
+    else 
+        $$(eval $$(call PARSE_SUBPROJECT,))
+    endif
+endef
+
+# if we are going to compile all keyboards, match the rest of the rule
+# for each of them
+define PARSE_ALL_KEYBOARDS
+    $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(KEYBOARDS)))
+endef
+
+# $1 Subproject
+# When entering this, the keyboard and subproject are known, so now we need
+# to determine which keymaps are going to get compiled
+define PARSE_SUBPROJECT
+    # If we want to compile the default subproject, then we need to 
+    # include the correct makefile to determine the actual name of it
+    CURRENT_SP := $1
+    ifeq ($$(CURRENT_SP),)
+        CURRENT_SP := defaultsp
+    endif
+    ifeq ($$(CURRENT_SP),defaultsp)
+        SUBPROJECT_DEFAULT=
+        $$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/Makefile)
+        CURRENT_SP := $$(SUBPROJECT_DEFAULT)
+    endif
+    # If current subproject is empty (the default was not defined), and we have a list of subproject
+    # then make all of them
+    ifeq ($$(CURRENT_SP),)
+        ifneq ($$(SUBPROJECTS),)
+            CURRENT_SP := allsp
+         endif
+    endif
+    # The special allsp is handled later
+    ifneq ($$(CURRENT_SP),allsp) 
+        # get a list of all keymaps
+        KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/keymaps/*/.)))
+        ifneq ($$(CURRENT_SP),)
+            # if the subproject is defined, then also look for keymaps inside the subproject folder
+            SP_KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/$$(CURRENT_SP)/keymaps/*/.)))
+            KEYMAPS := $$(sort $$(KEYMAPS) $$(SP_KEYMAPS))
+        endif
+        # if the rule after removing the start of it is empty (we haven't specified a kemap or target)
+        # compile all the keymaps
+        ifeq ($$(RULE),)
+            $$(eval $$(call PARSE_ALL_KEYMAPS))
+        # The same if allkm was specified
+        else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allkm),true)
+            $$(eval $$(call PARSE_ALL_KEYMAPS))
+        # Try to match the specified keyamp with the list of known keymaps
+        else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYMAPS)),true)
+            $$(eval $$(call PARSE_KEYMAP,$$(MATCHED_ITEM)))
+        # Otherwise try to match the keymap from the current folder, or arguments to the make command
+        else ifneq ($$(KEYMAP),)
+            $$(eval $$(call PARSE_KEYMAP,$$(KEYMAP)))
+        # No matching keymap found, so we assume that the rest of the rule is the target
+        # If we haven't been able to parse out a subproject, then make all of them
+        # This is consistent with running make without any arguments from the keyboard
+        # folder
+        else ifeq ($1,)
+            $$(eval $$(call PARSE_ALL_SUBPROJECTS))
+        # Otherwise, make all keymaps, again this is consistent with how it works without
+        # any arguments
+        else
+            $$(eval $$(call PARSE_ALL_KEYMAPS))
+        endif
+    else
+        # As earlier mentione,d when allsb is specified, we call our self recursively
+        # for all of the subprojects
+        $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_SUBPROJECT,$(SUBPROJECTS)))
+    endif
+endef
+
+# If we want to parse all subprojects, but the keyboard doesn't have any, 
+# then use defaultsp instead
+define PARSE_ALL_SUBPROJECTS
+    ifeq ($$(SUBPROJECTS),)
+        $$(eval $$(call PARSE_SUBPROJECT,defaultsp))
+    else
+        $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_SUBPROJECT,$$(SUBPROJECTS)))
+    endif
+endef
+
+# $1 Keymap
+# This is the meat of compiling a keyboard, when entering this, everything is known
+# keyboard, subproject, and keymap
+# Note that we are not directly calling the command here, but instead building a list,
+# which will later be processed
+define PARSE_KEYMAP
+    CURRENT_KM = $1
+    # The rest of the rule is the target
+    # Remove the leading "-" from the target, as it acts as a separator
+    MAKE_TARGET := $$(patsubst -%,%,$$(RULE))
+    # We need to generate an unique indentifer to append to the COMMANDS list
+    COMMAND := COMMAND_KEYBOARD_$$(CURRENT_KB)_SUBPROJECT_$(CURRENT_SP)_KEYMAP_$$(CURRENT_KM)
+    # If we are compiling a keyboard without a subproject, we want to display just the name
+    # of the keyboard, otherwise keyboard/subproject
+    ifeq ($$(CURRENT_SP),)
+        KB_SP := $(CURRENT_KB)
+    else
+        KB_SP := $(CURRENT_KB)/$$(CURRENT_SP)
+    endif
+    # Format it in bold
+    KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR)
+    # Specify the variables that we are passing forward to submake
+    MAKE_VARS := KEYBOARD=$$(CURRENT_KB) SUBPROJECT=$$(CURRENT_SP) KEYMAP=$$(CURRENT_KM)
+    # And the first part of the make command
+    MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET)
+    # The message to display
+    MAKE_MSG := $$(MSG_MAKE_KB)
+    # We run the command differently, depending on if we want more output or not
+    # The true version for silent output and the false version otherwise
+    $$(eval $$(call BUILD))
+endef
+
+define BUILD
+    MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR)
+    COMMANDS += $$(COMMAND)
+    COMMAND_true_$$(COMMAND) := \
+        printf "$$(MAKE_MSG)" | \
+        $$(MAKE_MSG_FORMAT); \
+        LOG=$$$$($$(MAKE_CMD) $$(MAKE_VARS) SILENT=true 2>&1) ; \
+        if [ $$$$? -gt 0 ]; \
+            then $$(PRINT_ERROR_PLAIN); \
+        elif [ "$$$$LOG" != "" ] ; \
+            then $$(PRINT_WARNING_PLAIN); \
+        else \
+            $$(PRINT_OK); \
+        fi;
+    COMMAND_false_$$(COMMAND) := \
+        printf "$$(MAKE_MSG)\n\n"; \
+        $$(MAKE_CMD) $$(MAKE_VARS) SILENT=false; \
+        if [ $$$$? -gt 0 ]; \
+            then error_occured=1; \
+        fi;
+endef
+
+# Just parse all the keymaps for a specifc keyboard
+define PARSE_ALL_KEYMAPS
+    $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS)))
+endef
+
+define BUILD_TEST
+    TEST_NAME := $1
+    MAKE_TARGET := $2
+    COMMAND := $1
+    MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET)
+    MAKE_VARS := TEST=$$(TEST_NAME)
+    MAKE_MSG := $$(MSG_MAKE_TEST)
+    $$(eval $$(call BUILD))
+    ifneq ($$(MAKE_TARGET),clean)
+        TEST_EXECUTABLE := $$(TEST_DIR)/$$(TEST_NAME).elf
+        TESTS += $$(TEST_NAME)
+        TEST_MSG := $$(MSG_TEST)
+        $$(TEST_NAME)_COMMAND := \
+            printf "$$(TEST_MSG)\n"; \
+            $$(TEST_EXECUTABLE); \
+            if [ $$$$? -gt 0 ]; \
+                then error_occured=1; \
+            fi; \
+            printf "\n";
+    endif
+endef
+
+define PARSE_TEST
+    TESTS :=
+    TEST_NAME := $$(firstword $$(subst -, ,$$(RULE)))
+    TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME)-,,$$(RULE)))
+    ifeq ($$(TEST_NAME),all)
+        MATCHED_TESTS := $$(TEST_LIST)
+    else
+        MATCHED_TESTS := $$(foreach TEST,$$(TEST_LIST),$$(if $$(findstring $$(TEST_NAME),$$(TEST)),$$(TEST),))
+    endif
+    $$(foreach TEST,$$(MATCHED_TESTS),$$(eval $$(call BUILD_TEST,$$(TEST),$$(TEST_TARGET))))
+endef
+
+
+# Set the silent mode depending on if we are trying to compile multiple keyboards or not
+# By default it's on in that case, but it can be overriden by specifying silent=false 
+# from the command line
+define SET_SILENT_MODE
+    ifdef SUB_IS_SILENT
+        SILENT_MODE := $(SUB_IS_SILENT)
+    else ifeq ($$(words $$(COMMANDS)),1)
+        SILENT_MODE := false
+    else
+        SILENT_MODE := true
+    endif
+endef
+
+include $(ROOT_DIR)/message.mk
+
+RUN_COMMAND = \
+$(COMMAND_$(SILENT_MODE)_$(COMMAND))
+
+# Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps
+SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile)))
+.PHONY: $(SUBPROJECTS)
+$(SUBPROJECTS): %: %-allkm 
+
+# Let's match everything, we handle all the rule parsing ourselves
+.PHONY: %
+%: 
+       # Check if we have the CMP tool installed
+       cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
+       # Check if the submodules are dirty, and display a warning if they are
+       git submodule status --recursive 2>/dev/null | \
+       while IFS= read -r x; do \
+               case "$$x" in \
+                       \ *) ;; \
+                       *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \
+               esac \
+       done
+       $(eval $(call PARSE_RULE,$@))
+       $(eval $(call SET_SILENT_MODE))
+       # Run all the commands in the same shell, notice the + at the first line
+       # it has to be there to allow parallel execution of the submake
+       # This always tries to compile everything, even if error occurs in the middle
+       # But we return the error code at the end, to trigger travis failures
+       +error_occured=0; \
+       $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) \
+       if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi;\
+       $(foreach TEST,$(TESTS),$($(TEST)_COMMAND)) \
+       if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi;\
+
+# All should compile everything
+.PHONY: all
+all: all-keyboards test-all
+
+# Define some shortcuts, mostly for compability with the old syntax
+.PHONY: all-keyboards
+all-keyboards: allkb-allsp-allkm
+
+.PHONY: all-keyboards-defaults
+all-keyboards-defaults: allkb-allsp-default
+
+.PHONY: test
+test: test-all
+
+.PHONY: test-clean
+test-clean: test-all-clean
+
+# Generate the version.h file
 GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
 BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
-OPT_DEFS += -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\"
+$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h)
+$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
 
-$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(QUANTUM_PATH)/version.h)
-$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(QUANTUM_PATH)/version.h)
+include $(ROOT_DIR)/testlist.mk
\ No newline at end of file
diff --git a/build_keyboard.mk b/build_keyboard.mk
new file mode 100644 (file)
index 0000000..03a69b1
--- /dev/null
@@ -0,0 +1,226 @@
+ifndef VERBOSE
+.SILENT:
+endif
+
+.DEFAULT_GOAL := all
+
+include common.mk
+
+ifneq ($(SUBPROJECT),)
+       TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP)
+       KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)_$(SUBPROJECT)
+else
+       TARGET ?= $(KEYBOARD)_$(KEYMAP)
+       KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)
+endif
+
+# Force expansion
+TARGET := $(TARGET)
+
+
+MASTER ?= left
+ifdef master
+       MASTER = $(master)
+endif
+
+ifeq ($(MASTER),right) 
+       OPT_DEFS += -DMASTER_IS_ON_RIGHT
+else 
+       ifneq ($(MASTER),left)
+$(error MASTER does not have a valid value(left/right))
+       endif
+endif
+
+
+
+KEYBOARD_PATH := keyboards/$(KEYBOARD)
+KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c
+
+ifneq ("$(wildcard $(KEYBOARD_C))","")
+    include $(KEYBOARD_PATH)/rules.mk
+else 
+    $(error "$(KEYBOARD_C)" does not exist)
+endif
+
+
+ifneq ($(SUBPROJECT),)
+    SUBPROJECT_PATH := keyboards/$(KEYBOARD)/$(SUBPROJECT)
+    SUBPROJECT_C := $(SUBPROJECT_PATH)/$(SUBPROJECT).c
+    ifneq ("$(wildcard $(SUBPROJECT_C))","")
+        OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT)
+        include $(SUBPROJECT_PATH)/rules.mk
+    else 
+        $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist)
+    endif
+endif
+
+# We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA
+ifdef MCU_FAMILY
+       PLATFORM=CHIBIOS
+else
+       PLATFORM=AVR
+endif
+
+ifeq ($(PLATFORM),CHIBIOS)
+       include $(TMK_PATH)/protocol/chibios.mk
+       include $(TMK_PATH)/chibios.mk
+       OPT_OS = chibios
+       ifneq ("$(wildcard $(SUBPROJECT_PATH)/bootloader_defs.h)","")
+               OPT_DEFS += -include $(SUBPROJECT_PATH)/bootloader_defs.h
+       else ifneq ("$(wildcard $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h)","")
+               OPT_DEFS += -include $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h
+       else ifneq ("$(wildcard $(KEYBOARD_PATH)/bootloader_defs.h)","")
+               OPT_DEFS += -include $(KEYBOARD_PATH)/bootloader_defs.h
+       else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","")
+               OPT_DEFS += -include $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h
+       endif
+endif
+
+CONFIG_H = $(KEYBOARD_PATH)/config.h
+ifneq ($(SUBPROJECT),)
+       ifneq ("$(wildcard $(SUBPROJECT_C))","")
+               CONFIG_H = $(SUBPROJECT_PATH)/config.h
+       endif
+endif
+
+# Save the defines and includes here, so we don't include any keymap specific ones 
+PROJECT_DEFS := $(OPT_DEFS)
+PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(SUBPROJECT_PATH) $(KEYBOARD_PATH)
+PROJECT_CONFIG := $(CONFIG_H)
+
+MAIN_KEYMAP_PATH := $(KEYBOARD_PATH)/keymaps/$(KEYMAP)
+MAIN_KEYMAP_C := $(MAIN_KEYMAP_PATH)/keymap.c
+SUBPROJ_KEYMAP_PATH := $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)
+SUBPROJ_KEYMAP_C := $(SUBPROJ_KEYMAP_PATH)/keymap.c
+ifneq ("$(wildcard $(SUBPROJ_KEYMAP_C))","")
+    -include $(SUBPROJ_KEYMAP_PATH)/Makefile
+    KEYMAP_C := $(SUBPROJ_KEYMAP_C)
+    KEYMAP_PATH := $(SUBPROJ_KEYMAP_PATH)
+else ifneq ("$(wildcard $(MAIN_KEYMAP_C))","")
+    -include $(MAIN_KEYMAP_PATH)/Makefile
+    KEYMAP_C := $(MAIN_KEYMAP_C)
+    KEYMAP_PATH := $(MAIN_KEYMAP_PATH)
+else
+    $(error "$(MAIN_KEYMAP_C)/keymap.c" does not exist)
+endif
+
+
+# Object files directory
+#     To put object files in current directory, use a dot (.), do NOT make
+#     this an empty or blank macro!
+KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
+
+
+ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
+       CONFIG_H = $(KEYMAP_PATH)/config.h
+endif
+
+# # project specific files
+SRC += $(KEYBOARD_C) \
+       $(KEYMAP_C) \
+       $(QUANTUM_DIR)/quantum.c \
+       $(QUANTUM_DIR)/keymap_common.c \
+       $(QUANTUM_DIR)/keycode_config.c \
+       $(QUANTUM_DIR)/process_keycode/process_leader.c
+
+ifneq ($(SUBPROJECT),)
+       SRC += $(SUBPROJECT_C)
+endif
+
+ifndef CUSTOM_MATRIX
+       SRC += $(QUANTUM_DIR)/matrix.c
+endif
+
+ifeq ($(strip $(MIDI_ENABLE)), yes)
+    OPT_DEFS += -DMIDI_ENABLE
+       SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
+endif
+
+ifeq ($(strip $(VIRTSER_ENABLE)), yes)
+    OPT_DEFS += -DVIRTSER_ENABLE
+endif
+
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
+    OPT_DEFS += -DAUDIO_ENABLE
+       SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
+       SRC += $(QUANTUM_DIR)/audio/audio.c
+       SRC += $(QUANTUM_DIR)/audio/voices.c
+       SRC += $(QUANTUM_DIR)/audio/luts.c
+endif
+
+ifeq ($(strip $(UCIS_ENABLE)), yes)
+       OPT_DEFS += -DUCIS_ENABLE
+       UNICODE_ENABLE = yes
+endif
+
+ifeq ($(strip $(UNICODE_ENABLE)), yes)
+    OPT_DEFS += -DUNICODE_ENABLE
+       SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
+endif
+
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
+       OPT_DEFS += -DRGBLIGHT_ENABLE
+       SRC += $(QUANTUM_DIR)/light_ws2812.c
+       SRC += $(QUANTUM_DIR)/rgblight.c
+endif
+
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+       OPT_DEFS += -DTAP_DANCE_ENABLE
+       SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
+endif
+
+ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
+       SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
+       OPT_DEFS += $(SERIAL_DEFS)
+       VAPTH += $(SERIAL_PATH)
+endif
+
+# Optimize size but this may cause error "relocation truncated to fit"
+#EXTRALDFLAGS = -Wl,--relax
+
+# Search Path
+VPATH += $(KEYMAP_PATH)
+ifneq ($(SUBPROJECT),)
+       VPATH += $(SUBPROJECT_PATH)
+endif
+VPATH += $(KEYBOARD_PATH)
+VPATH += $(COMMON_VPATH)
+
+
+include $(TMK_PATH)/common.mk
+SRC += $(TMK_COMMON_SRC)
+OPT_DEFS += $(TMK_COMMON_DEFS)
+EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
+
+ifeq ($(PLATFORM),AVR)
+       include $(TMK_PATH)/protocol/lufa.mk
+       include $(TMK_PATH)/avr.mk
+endif
+
+ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
+       VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
+       VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
+       include $(VISUALIZER_PATH)/visualizer.mk
+endif
+
+OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
+$(KEYMAP_OUTPUT)_SRC := $(SRC)
+$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" 
+$(KEYMAP_OUTPUT)_INC :=  $(VPATH) $(EXTRAINCDIRS)
+$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
+$(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC)
+$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS)
+$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC)
+$(KEYBOARD_OUTPUT)_CONFIG  := $(PROJECT_CONFIG)
+
+# Default target.
+all: build sizeafter
+
+# Change the build target to build a HEX file or a library.
+build: elf hex
+#build: elf hex eep lss sym
+#build: lib
+
+
+include $(TMK_PATH)/rules.mk
+
diff --git a/build_test.mk b/build_test.mk
new file mode 100644 (file)
index 0000000..ee15a45
--- /dev/null
@@ -0,0 +1,57 @@
+ifndef VERBOSE
+.SILENT:
+endif
+
+.DEFAULT_GOAL := all
+
+include common.mk
+
+TARGET=test/$(TEST)
+
+GTEST_OUTPUT = $(BUILD_DIR)/gtest
+
+TEST_OBJ = $(BUILD_DIR)/test_obj
+
+OUTPUTS := $(TEST_OBJ)/$(TEST) $(GTEST_OUTPUT)
+
+GTEST_INC := \
+       $(LIB_PATH)/googletest/googletest/include\
+       $(LIB_PATH)/googletest/googlemock/include\
+       
+GTEST_INTERNAL_INC :=\
+       $(LIB_PATH)/googletest/googletest\
+       $(LIB_PATH)/googletest/googlemock
+
+$(GTEST_OUTPUT)_SRC :=\
+       googletest/src/gtest-all.cc\
+       googletest/src/gtest_main.cc\
+       googlemock/src/gmock-all.cc
+
+$(GTEST_OUTPUT)_DEFS := 
+$(GTEST_OUTPUT)_INC := $(GTEST_INC) $(GTEST_INTERNAL_INC)
+
+LDFLAGS += -lstdc++ -lpthread -shared-libgcc
+CREATE_MAP := no
+
+VPATH +=\
+       $(LIB_PATH)/googletest\
+       $(LIB_PATH)/googlemock
+
+all: elf
+
+VPATH += $(COMMON_VPATH)
+
+include $(TMK_PATH)/common.mk
+include $(QUANTUM_PATH)/serial_link/tests/rules.mk
+
+$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
+$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC)
+$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
+
+include $(TMK_PATH)/native.mk
+include $(TMK_PATH)/rules.mk
+
+
+$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
+$(shell mkdir -p $(TEST_OBJ) 2>/dev/null)
+
diff --git a/common.mk b/common.mk
new file mode 100644 (file)
index 0000000..18751cd
--- /dev/null
+++ b/common.mk
@@ -0,0 +1,26 @@
+include message.mk
+
+# Directory common source files exist
+TOP_DIR = .
+TMK_DIR = tmk_core
+TMK_PATH = $(TOP_DIR)/$(TMK_DIR)
+LIB_PATH = $(TOP_DIR)/lib
+
+QUANTUM_DIR = quantum
+QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR)
+
+BUILD_DIR := $(TOP_DIR)/.build
+
+SERIAL_DIR := $(QUANTUM_DIR)/serial_link
+SERIAL_PATH := $(QUANTUM_PATH)/serial_link
+SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
+SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
+SERIAL_DEFS += -DSERIAL_LINK_ENABLE
+
+COMMON_VPATH := $(TOP_DIR)
+COMMON_VPATH += $(TMK_PATH)
+COMMON_VPATH += $(QUANTUM_PATH)
+COMMON_VPATH += $(QUANTUM_PATH)/keymap_extras
+COMMON_VPATH += $(QUANTUM_PATH)/audio
+COMMON_VPATH += $(QUANTUM_PATH)/process_keycode
+COMMON_VPATH += $(SERIAL_PATH)
\ No newline at end of file
index c9958e16b550bea96c12c5e52435d717ef6bbdcb..439e78da7d2cf4f4dae3aae89a3c61886356d945 100644 (file)
@@ -6,7 +6,8 @@ This project includes a Vagrantfile that will allow you to build a new firmware
 
 Using the `/Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion).
 
-*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12.
+*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:** `vagrant plugin install vagrant-vbguest`
+
 
 Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
 
index d8325e6c89dbd33bb251f75e15ece8fcb5804339..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,70 +1,3 @@
-
-
-# Target file name (without extension).
-
-# project specific files
-SRC = led.c
-
-# MCU name
-MCU = atmega32u2
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
-#NKRO_ENABLE = yes     # USB Nkey Rollover - not yet supported in LUFA
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/alps64/rules.mk b/keyboards/alps64/rules.mk
new file mode 100644 (file)
index 0000000..c326d3e
--- /dev/null
@@ -0,0 +1,66 @@
+
+
+# Target file name (without extension).
+
+# project specific files
+SRC = led.c
+
+# MCU name
+MCU = atmega32u2
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+#NKRO_ENABLE = yes     # USB Nkey Rollover - not yet supported in LUFA
\ No newline at end of file
index 1f695aa4d8a524ae33e03fdb5066c545bc6218a1..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,70 +1,3 @@
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= no  # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE  ?= no  # Mouse keys(+4700)
-EXTRAKEY_ENABLE  ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE   ?= yes # Console for debug(+400)
-COMMAND_ENABLE   ?= yes # Commands for debug and configuration
-NKRO_ENABLE      ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-RGBLIGHT_ENABLE  ?= yes # Enable keyboard underlight functionality (+4870)
-BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality (+1150)
-MIDI_ENABLE      ?= no  # MIDI controls
-AUDIO_ENABLE     ?= no
-UNICODE_ENABLE   ?= no  # Unicode
-BLUETOOTH_ENABLE ?= no  # Enable Bluetooth with the Adafruit EZ-Key HID
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/amj60/rules.mk b/keyboards/amj60/rules.mk
new file mode 100644 (file)
index 0000000..18403ac
--- /dev/null
@@ -0,0 +1,66 @@
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no  # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE  ?= no  # Mouse keys(+4700)
+EXTRAKEY_ENABLE  ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE   ?= yes # Console for debug(+400)
+COMMAND_ENABLE   ?= yes # Commands for debug and configuration
+NKRO_ENABLE      ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+RGBLIGHT_ENABLE  ?= yes # Enable keyboard underlight functionality (+4870)
+BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality (+1150)
+MIDI_ENABLE      ?= no  # MIDI controls
+AUDIO_ENABLE     ?= no
+UNICODE_ENABLE   ?= no  # Unicode
+BLUETOOTH_ENABLE ?= no  # Enable Bluetooth with the Adafruit EZ-Key HID
index 09fcf3e7a0e1b61072575f177ce84bc6867167fe..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,74 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-KEYBOARD_LOCK_ENABLE ?= yes  # Allow locking of keyboard via magic key
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= yes           # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index 5aa44cce541548bff51f0d2caf1bfbec19520e66..d0d172272ee48de9e5afc7583b624737f1b728ec 100644 (file)
 arrow_pad keyboard firmware
 ======================
 
+## Keyboard Info
+
+The ArrowPad is a wired conversion that can be made to any stand-alone keypad. It uses two main layers - a standard numpad, and a more advanced arrow cluster navigator.
+
+The first 24-key ArrowPad was handwired, but the PCB was wired as listed below.
+
+```
+<Chip Ref Des> pin <Pin #>
+<Keycap Name> (Silkscreen Name if different) - <Switch Pin #>
+
+
+Note:
+U2 pin 2 is the Num Lock LED and is  active low.
+
+U2 pin 1
+Clear (Num Lock) - 1
+Enter - 2
+Esc (ESC) - 2
+
+
+U2 pin 3
+- - 1
+
+U2 pin 4
+7 - 2
+8 - 2
+9 - 2
+
+U2 pin 5
+* - 2
+Delete (BACK SPACE) -  2
+
+U2 pin 6
+1 - 2
+0 - 2
+. - 2
+, - 2
+
+U2 pin 7
+4 - 2
+5 - 2
+6 - 2
+
+U2 pin 8
+Tab - 2
+= (/) - 2
+
+U2 pin 13
+Delete (BACK SPACE) -  1
+9 - 1
+6 - 1
+3 - 1
+. - 1
+
+U2 pin 14
+Tab - 1
+8 - 1
+5 - 1
+2 - 1
+0 - 1
+
+U2 pin 15
+Esc (ESC) - 1
+= (/) - 1
+/ (*) - 1
+7 - 1
+4 - 1
+1 - 1
++ - 1
+
+U2 pin 16
+Enter - 1
+* (<--) - 1
+, - 1
+
+U2 pin 17
+Fn (#NAME?) - 1
+- - 2
+Clear (Num Lock) - 2
+
+U2 pin 18
+Fn (#NAME?) - 2
+* (<--) - 2
++ - 2
+3 - 2
+2 - 2
+```
+
+More info can be found on [GeekHack](https://geekhack.org/index.php?topic=73632.msg1802497#msg1802497)
+
+The second ArrowPad was a conversion from a 21-key Genovation keypad. It used a 2 row x 11 column matrix.
+
+```
+#define KEYMAP( \
+    KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
+    KM_NUM, KM_FSL, KM_AST, KM_MIN, \
+    KM___7, KM___8, KM___9, ___PLS, \
+    KM___4, KM___5, KM___6, KM_PLS, \
+    KM___1, KM___2, KM___3, ___ENT, \
+    KM___0, _____0, KM_DOT, KM_ENT  \
+) { \
+    { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \
+    { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO,  KM___0, KM_DOT, }, \
+}
+```
+
+
 ## Quantum MK Firmware
 
 For the full Quantum feature list, see [the parent readme.md](/readme.md).
 
 ## Building
 
-Download or clone the whole firmware and navigate to the keyboards/arrow_pad folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
+Download or clone the whole firmware and navigate to the keyboards/arrow_pad folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
 
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|pad_21|pad_24|<name>]
 ```
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
\ No newline at end of file
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/arrow_pad/rules.mk b/keyboards/arrow_pad/rules.mk
new file mode 100644 (file)
index 0000000..3dca9b6
--- /dev/null
@@ -0,0 +1,70 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes  # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= yes           # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
\ No newline at end of file
index 08e9205cbf1f30a6223dd98f0f40f094288556d8..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,73 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= no           # Audio output on port C6
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index 278407e6c974575b2dd867dd68b553b0f71975f9..c7c04485fcea80023fb571aa7dec910bed430a68 100644 (file)
@@ -1,7 +1,7 @@
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = no  # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)
 EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)
-CONSOLE_ENABLE   = no  # Console for debug(+400)
+CONSOLE_ENABLE   = yes # Console for debug(+400)
 COMMAND_ENABLE   = yes # Commands for debug and configuration
 NKRO_ENABLE      = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
index 70353323b678086e9331e16152a15409c2719f93..18a7253f2eb7a9e98d9c740717cec28da4cdc72c 100644 (file)
@@ -150,10 +150,17 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /* disable debug print */
-//#define NO_DEBUG
+#ifndef NO_DEBUG
+#  define NO_DEBUG
+#endif
 
 /* disable print */
-//#define NO_PRINT
+// #ifndef NO_PRINT
+// #  define NO_PRINT
+// #endif
+
+/* Only print user print statements */
+#define USER_PRINT
 
 /* disable action features */
 //#define NO_ACTION_LAYER
index b02e89d2c710d32887bcaf3236894cdd961ba18a..d10bfe3bfceb0be68684ee2aa45e0e0fbb1d153c 100644 (file)
@@ -2,48 +2,59 @@
 #include "action_layer.h"
 #include "eeconfig.h"
 #include "led.h"
+#include "mousekey.h"
 
 #ifdef AUDIO_ENABLE
     #include "audio.h"
     #include "song_list.h"
 #endif
 
-#define LAYER_QWERTY                     0
-#define LAYER_COLEMAK                    1
-#define LAYER_DVORAK                     2
-#define LAYER_UPPER                      3
-#define LAYER_LOWER                      4
-#define LAYER_FUNCTION                   5
-#define LAYER_MOUSE                      6
-#define LAYER_ADJUST                     7
-
-#define MACRO_QWERTY                     0
-#define MACRO_COLEMAK                    1
-#define MACRO_DVORAK                     2
-#define MACRO_UPPER                      3
-#define MACRO_LOWER                      4
-#define MACRO_FUNCTION                   5
-#define MACRO_MOUSE                      6
-#define MACRO_TIMBRE_1                   7
-#define MACRO_TIMBRE_2                   8
-#define MACRO_TIMBRE_3                   9
-#define MACRO_TIMBRE_4                  10
-#define MACRO_TEMPO_U                   11
-#define MACRO_TEMPO_D                   12
-#define MACRO_TONE_DEFAULT              13
-#define MACRO_MUSIC_TOGGLE              14
-#define MACRO_AUDIO_TOGGLE              16
-#define MACRO_INC_VOICE                 18
-#define MACRO_DEC_VOICE                 19
-#define MACRO_BACKLIGHT                 20
-#define MACRO_BREATH_TOGGLE             21
-#define MACRO_BREATH_SPEED_INC          23
-#define MACRO_BREATH_SPEED_DEC          24
-#define MACRO_BREATH_DEFAULT            25
+enum keyboard_layers {
+  LAYER_QWERTY = 0,
+  LAYER_UPPER,
+  LAYER_LOWER,
+  LAYER_FUNCTION,
+  LAYER_MOUSE,
+  LAYER_ADJUST,
+};
+enum keyboard_macros {
+  MACRO_QWERTY = 0,
+  MACRO_UPPER,
+  MACRO_LOWER,
+  MACRO_FUNCTION,
+  MACRO_MOUSE,
+  MACRO_TIMBRE_1,
+  MACRO_TIMBRE_2,
+  MACRO_TIMBRE_3,
+  MACRO_TIMBRE_4,
+  MACRO_TEMPO_U,
+  MACRO_TEMPO_D,
+  MACRO_TONE_DEFAULT,
+  MACRO_MUSIC_TOGGLE,
+  MACRO_AUDIO_TOGGLE,
+  MACRO_INC_VOICE,
+  MACRO_DEC_VOICE,
+  MACRO_BACKLIGHT,
+  MACRO_BREATH_TOGGLE,
+  MACRO_BREATH_SPEED_INC,
+  MACRO_BREATH_SPEED_DEC,
+  MACRO_BREATH_DEFAULT,
+  MACRO_MOUSE_MOVE_UL,
+  MACRO_MOUSE_MOVE_UR,
+  MACRO_MOUSE_MOVE_DL,
+  MACRO_MOUSE_MOVE_DR,
+  MACRO_HELP_1,
+  MACRO_HELP_2,
+  MACRO_HELP_3,
+  MACRO_HELP_4,
+  MACRO_HELP_5,
+  MACRO_HELP_6,
+  MACRO_HELP_7,
+  MACRO_HELP_8,
+  MACRO_HELP_9,
+};
 
 #define M_QWRTY             M(MACRO_QWERTY)
-#define M_COLMK             M(MACRO_COLEMAK)
-#define M_DVORK             M(MACRO_DVORAK)
 #define M_UPPER             M(MACRO_UPPER)
 #define M_LOWER             M(MACRO_LOWER)
 #define M_FUNCT             M(MACRO_FUNCTION)
 #define M_BSPDU             M(MACRO_BREATH_SPEED_INC)
 #define M_BSPDD             M(MACRO_BREATH_SPEED_DEC)
 #define M_BDFLT             M(MACRO_BREATH_DEFAULT)
+#define M_MS_UL             M(MACRO_MOUSE_MOVE_UL)
+#define M_MS_UR             M(MACRO_MOUSE_MOVE_UR)
+#define M_MS_DL             M(MACRO_MOUSE_MOVE_DL)
+#define M_MS_DR             M(MACRO_MOUSE_MOVE_DR)
+#define M_HELP1             M(MACRO_HELP_1)
+#define M_HELP2             M(MACRO_HELP_2)
+#define M_HELP3             M(MACRO_HELP_3)
+#define M_HELP4             M(MACRO_HELP_4)
+#define M_HELP5             M(MACRO_HELP_5)
+#define M_HELP6             M(MACRO_HELP_6)
+#define M_HELP7             M(MACRO_HELP_7)
+#define M_HELP8             M(MACRO_HELP_8)
+#define M_HELP9             M(MACRO_HELP_9)
 
 
 #define VC_UP               M(MACRO_INC_VOICE)
 #define SC_ACLS             LALT(KC_F4)
 #define SC_CCLS             LCTL(KC_F4)
 
+#define TG_NKRO             MAGIC_TOGGLE_NKRO
 #define OS_SHFT             KC_FN0
 
 #define _______             KC_TRNS
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
-/* QWERTY
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | XXXXXX . BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      | ]      | \      | DEL    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * | CAPS   | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | XXXXXX . ENTER  | PG UP  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_QWERTY]       = { // QWERTY
-  { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },
-  { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
-  { KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
-  { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
- },
-
- /* COLEMAK
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | XXXXXX . BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * | TAB    | Q      | W      | F      | P      | G      | J      | L      | U      | Y      | ;      | [      | ]      | \      | DEL    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * | BACKSP | A      | R      | S      | T      | D      | H      | N      | E      | I      | O      | '      | XXXXXX . ENTER  | PG UP  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * | LSHIFT | Z      | X      | C      | V      | B      | K      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_COLEMAK]      = { // COLEMAK
-  { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },
-  { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
-  { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
-  { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
+/* LAYER = LAYER_QWERTY
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | BACKSP . BACKSP |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      | ]      | \      | DEL    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | CAP LK | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | ENTER  . ENTER  | PG UP  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | RSHIFT . RSHIFT | UP     | PG DN  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  . SPACE  | LOWER  | OSHIFT | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_QWERTY] = {
+  { KC_ESC , KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , KC_MINS, KC_EQL , KC_BSPC, KC_BSPC },
+  { KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL  },
+  { KC_CAPS, KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_QUOT, KC_ENT , KC_ENT , KC_PGUP },
+  { KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_RSFT, KC_UP  , KC_PGDN },
+  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC , KC_SPC , M_LOWER, OS_SHFT, KC_RALT, KC_APP , KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }
 },
-
-/* DVORAK
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | [      | ]      | XXXXXX . BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * | TAB    | '      | ,      | .      | P      | Y      | F      | G      | C      | R      | L      | /      | =      | \      | DEL    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * | CAPS   | A      | O      | E      | U      | I      | D      | H      | T      | N      | S      | -      | XXXXXX . ENTER  | PG UP  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * | LSHIFT | ;      | Q      | J      | K      | X      | B      | M      | W      | V      | Z      | XXXXXX . RSHIFT | UP     | PG DN  |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_DVORAK]       = { // DVORAK
-  { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC  },
-  { KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_SLSH, KC_EQL,  KC_BSLS, KC_DEL   },
-  { KC_CAPS, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_MINS, KC_ENT,  KC_ENT,  KC_PGUP  },
-  { KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
- },
-
-/* UPPER
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * | PRINT  | BR TOG | BR SP+ | BR SP- | BR RST | XXXXXX | XXXXXX | NUM LK | /      | *      |        | NUM LK | SCR LK | XXXXXX . PAUSE  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * |        | F1     | F2     | F3     | F4     |        |        | 7      | 8      | 9      | -      |        |        |        | INS    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * | CAP LK | F5     | F6     | F7     | F8     |        |        | 4      | 5      | 6      | +      |        | XXXXXX .        | HOME   |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * |        | F9     | F10    | F11    | F12    |        |        | 1      | 2      | 3      | ENTER  | XXXXXX .        |        | END    |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * |        |        |        |        |        | 0               |        | RALT   | .      | ENTER  |        |        |        |        |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_UPPER]        = { // UPPER
-  { KC_PSCR, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, KC_SLCK, KC_PAUS, KC_PAUS  },
-  { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS   },
-  { KC_CAPS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, ________________, KC_HOME  },
-  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, ________________, _______, KC_END   },
-  { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______  },
- },
-
-/* LOWER
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * |        | F1     | F2     | F3     | F4     | F5     | F6     | F7     | F8     | F9     | F10    | F11    | F12    | XXXXXX . BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * |        | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      |        |        |        | INS    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * |        | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      |        | XXXXXX .        | HOME   |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * |        | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | XXXXXX .        |        | END    |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * |        |        |        |        |        |                 |        |        |        |        |        |        |        |        |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_LOWER]        = { // LOWER
-  { _______, 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_DLR,  KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT,   _______, _______, _______, KC_INS   },
-  { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT,  KC_GRV,  _______, ________________, KC_HOME  },
-  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL,  KC_LT,   KC_GT,   KC_QUES, ________________, _______, KC_END   },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
- },
-
-/* FUNCTION
- * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
- * | NUM LK |        |        |        |        |        |        |        |        |        |        |        |        | XXXXXX .        |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * | SCR LK | F13    | F14    | F15    | F16    |        |        |        |        |        |        |        |        |        |        |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
- * | CAP LK | F17    | F18    | F19    | F20    |        |        |        |        |        |        |        | XXXXXX .        |        |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
- * |        | F21    | F22    | F23    | F24    |        |        |        |        |        |        | XXXXXX .        | VOL UP | MUTE   |
- * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
- * |        |        |        |        |        | PLAY/PAUSE      |        |        |        |        |        | PTRACK | VOL DN | NTRACK |
- * '--------------------------------------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_FUNCTION]     = { // FUNCTION
-  { KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },
-  { KC_SLCK, KC_F13,  KC_F14,  KC_F15,  KC_F16,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
-  { KC_CAPS, KC_F17,  KC_F18,  KC_F19,  KC_F20,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, XXXXXXX  },
-  { _______, KC_F21,  KC_F22,  KC_F23,  KC_F24,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_VOLU, KC_MUTE  },
-  { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT  },
- },
-
-#ifdef MOUSEKEY_ENABLE
-
- [LAYER_MOUSE]        = { // MOUSE
-  { _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },
-  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
-  { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U  },
-  { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_MS_U, KC_WH_D  },
-  { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R  },
- },
-
-#endif
-
- [LAYER_ADJUST]       = { // ADJUST
-  { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, _______, MU_TOG,  AU_TOG,  ________________  },
-  { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
-  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, MUV_IN,  _______  },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, MUV_DE,  _______  },
- },
-
-
-/*
- [LAYER_EMPTY]        = { // LAYER
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, _______  },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
- },
+/* LAYER = LAYER_UPPER
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | PRINT  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | NUM LK | KP /   | KP *   | KP -   | XXXXXX | XXXXXX | ______ . ______ |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | PAUSE  | F1     | F2     | F3     | F4     | NUM LK | KP /   | KP 7   | KP 8   | KP 9   | KP -   | ______ | ______ | ______ | INS    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | F5     | F6     | F7     | F8     | CAP LK | KP *   | KP 4   | KP 5   | KP 6   | KP +   | ______ | ______ . ______ | HOME   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | F9     | F10    | F11    | F12    | SCR LK | KP 0   | KP 1   | KP 2   | KP 3   | KP ENT | ______ . ______ | ______ | END    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | UPPER  | KP 0   . KP 0   | ______ | RALT   | KP .   | KP ENT | ______ | ______ | ______ | ______ |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
 */
-
+[LAYER_UPPER] = {
+  { KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, XXXXXXX, XXXXXXX, _______, _______ },
+  { KC_PAUS, KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS  },
+  { _______, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_CAPS, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, _______, _______, KC_HOME },
+  { _______, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_SLCK, KC_KP_0, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______, _______, _______, KC_END  },
+  { _______, _______, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______ }
+},
+/* LAYER = LAYER_LOWER
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | PRINT  | F1     | F2     | F3     | F4     | F5     | F6     | F7     | F8     | F9     | F10    | F11    | F12    | ______ . ______ |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      | ______ | ______ | ______ | INS    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      | ______ | ______ . ______ | HOME   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | ______ . ______ | ______ | END    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | ______ | ______ . ______ | LOWER  | ______ | ______ | ______ | ______ | ______ | ______ | ______ |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_LOWER] = {
+  { KC_PSCR, 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_DLR , KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT  , _______, _______, _______, KC_INS  },
+  { _______, KC_CIRC, KC_ASTR, KC_PLUS, KC_MINS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT , KC_GRV , _______, _______, _______, KC_HOME },
+  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL , KC_LT  , KC_GT  , KC_QUES, _______, _______, _______, KC_END  },
+  { _______, _______, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, _______, _______, _______, _______ }
+},
+/* LAYER = LAYER_FUNCTION
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX . XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | F13    | F14    | F15    | F16    | NUM LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | F17    | F18    | F19    | F20    | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX . XXXXXX | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | F21    | F22    | F23    | F24    | CAP LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | ______ . ______ | VOL UP | MUTE   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | FN     | ______ | ______ | PLAY   . PLAY   | ______ | ______ | ______ | ______ | ______ | PREV   | VOL DN | NEXT   |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_FUNCTION] = {
+  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { XXXXXXX, KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { _______, KC_F21 , KC_F22 , KC_F23 , KC_F24 , KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_VOLU, KC_MUTE },
+  { _______, _______, M_FUNCT, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT }
+},
+/* LAYER = LAYER_MOUSE
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | ESC    | MS AC0 | MS AC1 | MS AC2 | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX . XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS UL  | MS U   | MS UR  | XXXXXX | XXXXXX | XXXXXX | MS WHL | MS WHR |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | MS BT5 | MS BT4 | MS BT3 | MS BT2 | XXXXXX | XXXXXX | MS L   | XXXXXX | MS R   | XXXXXX | XXXXXX | XXXXXX . XXXXXX | MS WHU |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS DL  | MS D   | MS DR  | XXXXXX | ______ . ______ | MS U   | MS WHD |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | ______ | MS BT1 . MS BT1 | ______ | ______ | ______ | ______ | ______ | MS L   | MS D   | MS R   |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_MOUSE] = {
+  { KC_ESC , KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_UL, KC_MS_U, M_MS_UR, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_R },
+  { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, KC_MS_L, XXXXXXX, KC_MS_R, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U },
+  { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_DL, KC_MS_D, M_MS_DR, XXXXXXX, _______, _______, KC_MS_U, KC_WH_D },
+  { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }
+},
+/* LAYER = LAYER_ADJUST
+  .--------------------------------------------------------------------------------------------------------------------------------------.
+  | XXXXXX | HELP 1 | HELP 2 | HELP 3 | HELP 4 | HELP 5 | HELP 6 | HELP 7 | HELP 8 | HELP 9 | XXXXXX | MUSIC  | AUDIO  | XXXXXX . XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | BRTOG  | BRSPD+ | BRSPD- | BRDFLT | 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 | QWERTY | XXXXXX | XXXXXX | BACKLT | RESET  | XXXXXX | MOUSE  | XXXXXX | XXXXXX | XXXXXX | XXXXXX . XXXXXX | VOICE+ | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | UPPER  | XXXXXX . XXXXXX | LOWER  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | TEMPO- | VOICE- | TEMPO+ |
+  '--------------------------------------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_ADJUST] = {
+  { XXXXXXX, M_HELP1, M_HELP2, M_HELP3, M_HELP4, M_HELP5, M_HELP6, M_HELP7, M_HELP8, M_HELP9, XXXXXXX, MU_TOG , AU_TOG , XXXXXXX, XXXXXXX },
+  { XXXXXXX, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, 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, M_QWRTY, XXXXXXX, XXXXXXX, M_BACKL, RESET  , XXXXXXX, M_MOUSE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MUV_IN , XXXXXXX },
+  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TMPO_DN, MUV_DE , TMPO_UP }
+},
 };
 
 #ifdef AUDIO_ENABLE
@@ -290,61 +272,101 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     switch(id)
     {
 
-        case MACRO_BREATH_TOGGLE:
+        case MACRO_HELP_1:
             if (record->event.pressed)
             {
-                breathing_toggle();
+        uprintf("1");
             }
             break;
 
-        case MACRO_BREATH_SPEED_INC:
+        case MACRO_HELP_2:
             if (record->event.pressed)
             {
-                breathing_speed_inc(1);
+        uprintf("2");
             }
             break;
 
-        case MACRO_BREATH_SPEED_DEC:
+        case MACRO_HELP_3:
             if (record->event.pressed)
             {
-                breathing_speed_dec(1);
+        uprintf("3");
             }
             break;
 
-        case MACRO_BREATH_DEFAULT:
+        case MACRO_HELP_4:
             if (record->event.pressed)
             {
-                breathing_defaults();
+        uprintf("4");
             }
             break;
 
-        case MACRO_QWERTY:
+        case MACRO_HELP_5:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_QWERTY);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
+        uprintf("5");
             }
             break;
 
-        case MACRO_COLEMAK:
+        case MACRO_HELP_6:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_COLEMAK);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
+        uprintf("6");
             }
             break;
 
-        case MACRO_DVORAK:
+        case MACRO_HELP_7:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_DVORAK);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
+        uprintf("7");
+            }
+            break;
+
+        case MACRO_HELP_8:
+            if (record->event.pressed)
+            {
+        uprintf("8");
+            }
+            break;
+
+        case MACRO_HELP_9:
+            if (record->event.pressed)
+            {
+        uprintf("9");
+            }
+            break;
+
+        case MACRO_BREATH_TOGGLE:
+            if (record->event.pressed)
+            {
+                breathing_toggle();
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_INC:
+            if (record->event.pressed)
+            {
+                breathing_speed_inc(1);
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_DEC:
+            if (record->event.pressed)
+            {
+                breathing_speed_dec(1);
+            }
+            break;
+
+        case MACRO_BREATH_DEFAULT:
+            if (record->event.pressed)
+            {
+                breathing_defaults();
+            }
+            break;
+
+        case MACRO_QWERTY:
+            if (record->event.pressed)
+            {
+                persistant_default_layer_set(1UL<<LAYER_QWERTY);
             }
             break;
 
index ab1e7ba1ff8ded2afe672b0276d7742ef50f0e52..674dcf113b394ea3cd17c863f55408bf351e13f3 100644 (file)
@@ -13,13 +13,14 @@ Download or clone the whole firmware and navigate to the keyboards/atomic folder
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/atomic/rules.mk b/keyboards/atomic/rules.mk
new file mode 100644 (file)
index 0000000..d0f3a3a
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
\ No newline at end of file
index 5894d231f9dd9661eb223ddd0e8bf611fc6937b6..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,88 +1,3 @@
-
-
-ifdef TEENSY2
-    OPT_DEFS += -DATREUS_TEENSY2
-    ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex
-else
-    OPT_DEFS += -DATREUS_ASTAR
-    OPT_DEFS += -DCATERINA_BOOTLOADER
-    ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
-                            avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
-endif
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-#BOOTMAGIC_ENABLE = yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - not yet supported in LUFA
-# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
-# MIDI_ENABLE ?= YES           # MIDI controls
-UNICODE_ENABLE ?= YES          # Unicode
-# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-USB ?= /dev/cu.usbmodem1411
-
-upload: build
-       $(ATREUS_UPLOAD_COMMAND)
-       
+endif
\ No newline at end of file
index 624d90188cbcda0750b11f0fba220949b62cae4c..51162cde3af0152268a979c2eedec914642ad2c7 100644 (file)
@@ -37,7 +37,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 // COLS: Left to right, ROWS: Top to bottom
 #if defined(ATREUS_ASTAR)
 #   define MATRIX_ROW_PINS { D0, D1, D3, D2 }
+#if defined(PCBDOWN)
+#   define MATRIX_COL_PINS { B7, D6, F7, F6, B6, D4, E6, B4, B5, C6, D7 }
+#else
 #   define MATRIX_COL_PINS { D7, C6, B5, B4, E6, D4, B6, F6, F7, D6, B7 }
+#endif
 #   define UNUSED_PINS
 #elif defined(ATREUS_TEENSY2)
 #   define MATRIX_ROW_PINS { D0, D1, D2, D3 }
diff --git a/keyboards/atreus/keymaps/classic/keymap.c b/keyboards/atreus/keymaps/classic/keymap.c
new file mode 100644 (file)
index 0000000..6ca0b20
--- /dev/null
@@ -0,0 +1,48 @@
+#include "atreus.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _RS 1
+#define _LW 2
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+  {KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_TRNS,  KC_Y,    KC_U,    KC_I,    KC_O,    KC_P    },
+  {KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_TRNS,  KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN },
+  {KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,   KC_LALT,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH },
+  {KC_ESC, KC_TAB, KC_LGUI,  KC_LSFT, KC_BSPC,  KC_LCTL, KC_SPC,  MO(_RS), KC_MINS, KC_QUOT, KC_ENT  }
+},
+[_RS] = { /* [> RAISE <] */
+  {KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_PGUP, KC_7,    KC_8,   KC_9, KC_ASTR},
+  {KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,  KC_TRNS, KC_PGDN, KC_4,    KC_5,   KC_6, KC_PLUS},
+  {KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_LALT, KC_AMPR, KC_1,    KC_2,   KC_3, KC_BSLS},
+  {TG(_LW), KC_INS,  KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC,  KC_TRNS, KC_DOT, KC_0, KC_EQL}
+},
+[_LW] = { /* [> LOWER <] */
+  {KC_INS,  KC_HOME, KC_UP,   KC_END,  KC_PGUP, KC_TRNS, KC_UP,   KC_F7,   KC_F8,   KC_F9,   KC_F10},
+  {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4,   KC_F5,   KC_F6,   KC_F11},
+  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F12},
+  {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC,  DF(_QW), KC_TRNS, KC_TRNS, RESET}
+}};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
index 1c4280ff5608f540dbbe232b3a8665576cd9cd73..04ad66fed8d27a954e7f97a8c7770cc34a35f0b9 100644 (file)
@@ -18,17 +18,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,   KC_LALT,  KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH },
   {KC_ESC, KC_TAB, KC_LGUI,  KC_LSFT, KC_BSPC,  KC_LCTL, KC_SPC,  MO(_RS), KC_MINS, KC_QUOT, KC_ENT  }
 },
+/*
+ *  !       @     up     {    }        ||     pgup    7     8     9    *
+ *  #     left   down  right  $        ||     pgdn    4     5     6    +
+ *  [       ]      (     )    &        ||       `     1     2     3    \
+ * lower  insert super shift bksp ctrl || alt space   fn    .     0    =
+ */
 [_RS] = { /* [> RAISE <] */
-  {KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_PGUP, KC_7,    KC_8,   KC_9, KC_ASTR},
-  {KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,  KC_TRNS, KC_PGDN, KC_4,    KC_5,   KC_6, KC_PLUS},
-  {KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_LALT, KC_AMPR, KC_1,    KC_2,   KC_3, KC_BSLS},
+  {KC_EXLM, KC_AT,   KC_UP,   KC_LCBR, KC_RCBR, KC_TRNS, KC_PGUP, KC_7,    KC_8,   KC_9, KC_ASTR},
+  {KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR,  KC_TRNS, KC_PGDN, KC_4,    KC_5,   KC_6, KC_PLUS},
+  {KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_LALT, KC_GRV,  KC_1,    KC_2,   KC_3, KC_BSLS},
   {TG(_LW), KC_INS,  KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC,  KC_TRNS, KC_DOT, KC_0, KC_EQL}
 },
+/*
+ * insert home   up  end   pgup       ||      up     F7    F8    F9   F10
+ *  del   left  down right pgdn       ||     down    F4    F5    F6   F11
+ *       volup             reset      ||             F1    F2    F3   F12
+ *       voldn  super shift bksp ctrl || alt space   L0  prtsc scroll pause
+ */
 [_LW] = { /* [> LOWER <] */
   {KC_INS,  KC_HOME, KC_UP,   KC_END,  KC_PGUP, KC_TRNS, KC_UP,   KC_F7,   KC_F8,   KC_F9,   KC_F10},
   {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4,   KC_F5,   KC_F6,   KC_F11},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F12},
-  {KC_TRNS, KC_TRNS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC,  DF(_QW), KC_TRNS, KC_TRNS, RESET}
+  {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET,   KC_LALT, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F12},
+  {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC,  DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS}
 }};
 
 const uint16_t PROGMEM fn_actions[] = {
diff --git a/keyboards/atreus/keymaps/erlandsona/config.h b/keyboards/atreus/keymaps/erlandsona/config.h
new file mode 100644 (file)
index 0000000..d9eb190
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+
+/* Make Overloaded Keys switch faster */
+#define TAPPING_TERM 150
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Technomancy
+#define PRODUCT         Atreus
+#define DESCRIPTION     q.m.k. keyboard firmware for Atreus
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 11
+
+// Change this to how you wired your keyboard
+// COLS: Left to right, ROWS: Top to bottom
+#if defined(ATREUS_ASTAR)
+#   define MATRIX_ROW_PINS { D0, D1, D3, D2 }
+#if defined(PCBDOWN)
+#   define MATRIX_COL_PINS { B7, D6, F7, F6, B6, D4, E6, B4, B5, C6, D7 }
+#else
+#   define MATRIX_COL_PINS { D7, C6, B5, B4, E6, D4, B6, F6, F7, D6, B7 }
+#endif
+#   define UNUSED_PINS
+#elif defined(ATREUS_TEENSY2)
+#   define MATRIX_ROW_PINS { D0, D1, D2, D3 }
+#   define MATRIX_COL_PINS { F6, F5, F4, B7, B6, B5, B4, B3, B2, B1, B0 }
+#   define UNUSED_PINS
+#endif
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+//#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/atreus/keymaps/erlandsona/keymap.c b/keyboards/atreus/keymaps/erlandsona/keymap.c
new file mode 100644 (file)
index 0000000..32c8826
--- /dev/null
@@ -0,0 +1,61 @@
+// this is the style you want to emulate.
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+
+#include "atreus.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define BASE 0
+#define NUMS 1
+#define MOUS 2
+
+// Some quick aliases, just to make it look pretty
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[BASE] = KEYMAP( /* Qwerty */
+  KC_Q       , KC_W   , KC_E   , KC_R   ,  KC_T   ,                 KC_Y  ,  KC_U   , KC_I   , KC_O   , KC_P          ,
+  KC_A       , KC_S   , KC_D   , KC_F   ,  KC_G   ,                 KC_H  ,  KC_J   , KC_K   , KC_L   , KC_SCLN       ,
+  SFT_T(KC_Z), KC_X   , KC_C   , KC_V   ,  KC_B   ,                 KC_N  ,  KC_M   , KC_COMM, KC_DOT , SFT_T(KC_QUOT),
+  KC_LCTL    , KC_LALT, KC_LALT, KC_LGUI,  KC_BSPC, KC_ESC, KC_ENT, KC_SPC,  F(NUMS), KC_RALT, KC_SLSH, KC_BSLS      ),
+
+[NUMS] = KEYMAP( /* Numbers / Arrows / Symbols */
+  KC_GRV , KC_1   , KC_2   , KC_3   , KC_4   ,                   KC_LPRN, KC_RPRN, KC_MINS, KC_EQL , KC_LBRC,
+  KC_TAB , KC_5   , KC_6   , KC_7   , KC_8   ,                   KC_LEFT, KC_DOWN, KC_UP  , KC_RGHT, KC_RBRC,
+  _______, KC_9   , KC_0   , KC_DOT , KC_COMM,                   KC_HOME, KC_PGDN, KC_PGUP, KC_END , _______,
+  _______, _______, _______, _______, KC_DEL , F(MOUS), _______, _______, _______, _______, _______, _______),
+
+[MOUS] = KEYMAP( /* Mouse and Media Keys */
+  KC_SLCK, KC_PAUSE, KC_F11 , KC_F10 , KC_F9  ,                   KC_F8  , KC_F7  , KC_F6  , KC_F5  , KC_F4,
+  KC_VOLD, KC_ACL0 , KC_ACL1, KC_ACL2, KC_VOLU,                   KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_F3,
+  KC_MUTE, KC_MPRV , KC_MPLY, KC_MNXT, KC_MUTE,                   KC_WH_R, KC_WH_U, KC_WH_D, KC_WH_L, KC_F2,
+  _______, _______ , _______, _______, _______, _______, _______, KC_BTN1, F(BASE), RESET  , KC_F12 , KC_F1)
+};
+
+
+// I prefer this layer switching strategy to the TG and MO functions.
+// so that I can get out of mouse mode just by tapping/holding my base layer FN key.
+const uint16_t PROGMEM fn_actions[] = {
+  [BASE] = ACTION_LAYER_OFF(2, 1),  // switch back to layer 0
+  [NUMS] = ACTION_LAYER_MOMENTARY(1),  // to Fn overlay
+  [MOUS] = ACTION_LAYER_ON(2, 1)  // switch to layer 2
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboards/atreus/keymaps/jeremy/keymap.c b/keyboards/atreus/keymaps/jeremy/keymap.c
new file mode 100644 (file)
index 0000000..90ec6f9
--- /dev/null
@@ -0,0 +1,66 @@
+// This is the personal keymap of Jeremy Cowgar (@jcowgar). It is written for the programmer.
+
+#include "atreus.h"
+#include "action_layer.h"
+#include "keymap_colemak.h"
+
+#define PREVENT_STUCK_MODIFIERS
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+#define ALPH 0
+#define NUMS 1
+#define CURS 2
+#define SYMB 3
+#define FKEY 4
+
+// Some handy macros to keep the keymaps clean and easier to maintain
+#define KM_SAVE LGUI(CM_S)
+#define KM_CLSE LGUI(CM_W)
+#define KM_OPEN LGUI(CM_O)
+
+#define KM_COPY LGUI(KC_C)
+#define KM_CUT  LGUI(KC_X)
+#define KM_PAST LGUI(KC_V)
+#define KM_UNDO LGUI(KC_Z)
+#define KM_REDO LGUI(LSFT(KC_Z))
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[ALPH] = {
+  {KC_Q,    KC_W,           KC_E,           KC_R,    KC_T,    KC_TRNS, KC_Y,    KC_U,    KC_I,           KC_O,           KC_P},
+  {KC_A,    LT(NUMS, KC_S), LT(FKEY, KC_D), KC_F,    KC_G,    KC_TRNS, KC_H,    KC_J,    LT(CURS, KC_K), LT(SYMB, KC_L), KC_SCLN},
+  {KC_Z,    KC_X,           KC_C,           KC_V,    KC_B,    KC_LALT, KC_N,    KC_M,    KC_COMM,        KC_DOT,         KC_SLSH},
+  {KC_LCTL, KC_ESC,         KC_NO,          KC_LSFT, KC_SPC,  KC_LGUI, KC_ENT,  KC_RSFT, KC_NO,          KC_ESC,         KC_RCTL}
+},
+[NUMS] = {
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_ASTR, KC_SLSH, KC_TRNS, KC_TRNS, KC_7,    KC_8,           KC_9,           KC_SLSH},
+  {KC_TRNS, KC_TRNS,        KC_EQL,         KC_PLUS, KC_MINS, KC_TRNS, KC_LPRN, KC_4,    KC_5,           KC_6,           KC_ASTR},
+  {KC_TRNS, KC_TRNS,        KC_DOT,         KC_COMM, CM_SCLN, KC_TRNS, KC_RPRN, KC_1,    KC_2,           KC_3,           KC_MINS},
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0,    KC_DOT,         KC_EQL,         KC_PLUS}
+},
+[CURS] = {
+  {KC_TRNS, KC_BSPC,        KC_UP,          KC_DELT, KC_PGUP, KC_TRNS, KC_TRNS, KM_SAVE, KC_TRNS,        KM_OPEN,        KC_TRNS},
+  {KC_TRNS, KC_LEFT,        KC_DOWN,        KC_RGHT, KC_PGDN, KC_TRNS, KM_UNDO, KC_LALT, KC_TRNS,        KC_LGUI,        KC_TRNS},
+  {KC_TRNS, KC_VOLD,        KC_MUTE,        KC_VOLU, KC_MPLY, KM_COPY, KM_REDO, KM_CLSE, KC_TRNS,        KC_TRNS,        KC_TRNS},
+  {KC_TRNS, KC_TRNS,        RESET,          KC_TRNS, KC_TAB,  KM_CUT,  KM_PAST, KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS}
+},
+[SYMB] = {
+  {KC_BSLS, KC_EXLM,        KC_LABK,        KC_RABK, CM_COLN, KC_TRNS, KC_UNDS, KC_DLR,  KC_QUES,       KC_TRNS,         KC_PERC},
+  {KC_AT,   KC_AMPR,        KC_LPRN,        KC_RPRN, CM_SCLN, KC_TRNS, KC_COMM, KC_DOT,  KC_QUOT,       KC_TRNS,         KC_TILD},
+  {KC_HASH, KC_PIPE,        KC_LCBR,        KC_RCBR, KC_SLSH, KC_TRNS, KC_TRNS, KC_GRV,  KC_DQT,        KC_TRNS,         KC_CIRC},
+  {KC_TRNS, KC_TRNS,        KC_LBRC,        KC_RBRC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,       KC_TRNS,         KC_TRNS}
+},
+[FKEY] = {
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F9,   KC_F10,        KC_F11,          KC_F12},
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F5,   KC_F6,         KC_F7,           KC_F8},
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1,   KC_F2,         KC_F3,           KC_F4},
+  {KC_TRNS, KC_TRNS,        KC_TRNS,        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,       KC_TRNS,         KC_TRNS}
+}};
+
+const uint16_t PROGMEM fn_actions[] = {};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  switch(id) {}
+
+  return MACRO_NONE;
+};
diff --git a/keyboards/atreus/keymaps/jeremy/readme.md b/keyboards/atreus/keymaps/jeremy/readme.md
new file mode 100644 (file)
index 0000000..df0179a
--- /dev/null
@@ -0,0 +1,45 @@
+Jeremy's Atreus Key Mapping
+===========================
+
+I am a programmer by trade that suffers from the beginning stages of RSI. As a programmer I use letters, symbols and cursor navigation most often. To prevent strange finger gymnastics, I wrote a script to rank which non-letter characters occurred in my primary source projects most often and then placed these characters in the easiest to reach locations, for me. I made heavy use of momentary layer toggling.
+
+My layout is also geared toward a software based Colemak mapping. I would like it to be hardware, but I use my Laptop on the go frequently and thus my laptop keyboard. I have moved the keycaps to reflect the Colemak layout. My laptop is a MacBook Pro (2015).
+
+## Main Layers
+
+1. [Letters](http://www.keyboard-layout-editor.com/#/gists/6861cb9df09ce78efaddf8aa7471e3ac)
+2. [Symbols](http://www.keyboard-layout-editor.com/#/gists/8956a18b508a78e93b9c38ec3fcccaa5)
+3. [Navigation](http://www.keyboard-layout-editor.com/#/gists/6ed492b714a7f54eb1c5de09b87fd8c4)
+4. [Numbers](http://www.keyboard-layout-editor.com/#/gists/399ceb5624e8388e48a3a5eacac8e973)
+5. [Function Keys](http://www.keyboard-layout-editor.com/#/gists/7fd7dc24c7048316f3724b1893c64e89)
+
+## Notes
+
+### General
+
+Some characters can be accessed multiple ways. This was done because you may be in a given layer, such as numbers, where when doing math, you may need quick access to the parentheses characters for grouping. This prevents some layer switching.
+
+I own an ErgoDox and plan on porting this as a base layer, then using the extra keys the ErgoDox provides accordingly. My goal, though, is to be fully functional on this base setup and build everything into muscle memory.
+
+### Symbol Layer
+
+1. I placed characters that deal with an if statement close together, such as !, & and |.
+2. All matching brace/bracket characters are together as well.
+
+### Number Layer
+
+1. Everything I did was a compromise when trying to mimic a ten-key. I did the best I could.
+2. Operators are duplicated on the right and left. I do not find it comfortable to use my pinky much, so I tend to use my left hand for +, -, * and / but those were also placed on the right hand to mimic the ten-key.
+3. Parentheses were added for typing on the calculator.
+
+### Cursor Layer
+
+1. It includes basic audio controls because they didn't really fit anywhere else
+2. It contains basic file manipulation. I'm not sure that was a good idea. I do save all the time, but Cmd+S isn't exactly hard.
+3. It contains the backspace and delete keys right on top of the left and right arrows.
+4. Cmd and Opt keys are duplicated. This makes for very easy navigation, for example on a Mac, Opt+Left/Right moves word by word. It also backspaces or deletes word by word.
+
+### Function Layer
+
+1. Almost all other layers I saw grouped the F keys into a bunch of three. This only gives nine function keys in order if you attempt to stay as close to the home row as possible. I went with a group of four, which gives all twelve function keys to the right hand, one row below and above the home row.
+2. I duplicated the Command and Option keys the same as on the cursor layer. This makes it dead easy to hit modified function keys such as Cmd+Opt+F5. It's also easy to toss in a Shift modifier in there with the right thumb since the bottom row is preserved.
index 734f58f0f095602ca5882ff53c130cb9ab588ea9..a4077668e3662895f7b6e1b5fbff63236a59893a 100644 (file)
@@ -174,13 +174,14 @@ Download or clone the whole firmware and navigate to the keyboards/planck folder
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/atreus/rules.mk b/keyboards/atreus/rules.mk
new file mode 100644 (file)
index 0000000..3a00993
--- /dev/null
@@ -0,0 +1,82 @@
+
+
+ifdef TEENSY2
+    OPT_DEFS += -DATREUS_TEENSY2
+    ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex
+else
+    OPT_DEFS += -DATREUS_ASTAR
+    OPT_DEFS += -DCATERINA_BOOTLOADER
+    ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
+                            avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
+endif
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+#BOOTMAGIC_ENABLE = yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - not yet supported in LUFA
+# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES           # MIDI controls
+UNICODE_ENABLE ?= YES          # Unicode
+# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
+
+USB ?= /dev/cu.usbmodem1411
+
+upload: build
+       $(ATREUS_UPLOAD_COMMAND)
index 03893dbf8905f5f364d10d28a048cf9593b461b7..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,72 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-# NKRO_ENABLE ?= yes           # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
-# MIDI_ENABLE ?= YES           # MIDI controls
-# UNICODE_ENABLE ?= YES                # Unicode
-# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
+endif
\ No newline at end of file
index 89d7f9d053e4e72ae1cb40bad7dbc0bdd92f92d4..462f67c12458caed189ca2ddd12eb76fdbff515c 100644 (file)
@@ -12,13 +12,14 @@ Download or clone the whole firmware and navigate to the keyboards/Bantam44 fold
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
\ No newline at end of file
diff --git a/keyboards/bantam44/rules.mk b/keyboards/bantam44/rules.mk
new file mode 100644 (file)
index 0000000..baa0e9e
--- /dev/null
@@ -0,0 +1,67 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+# NKRO_ENABLE ?= yes           # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES           # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
index d9f2b8b83bac6ab7d23b3a1ee4ccc52668e0bdc8..4b07a623432e97ec31a0e244cbf084a6d14a9200 100644 (file)
@@ -1,14 +1,5 @@
 SUBPROJECT_DEFAULT = stm32_f072_onekey
 
-#BOOTMAGIC_ENABLE = yes        # Virtual DIP switch configuration
-MOUSEKEY_ENABLE ?= yes # Mouse keys
-EXTRAKEY_ENABLE ?= yes # Audio control and System control
-CONSOLE_ENABLE ?= yes  # Console for debug
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-NKRO_ENABLE ?= yes         # USB Nkey Rollover
-CUSTOM_MATRIX ?= yes # Custom matrix file
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index 31319ef57528338e51c6749ef46e88e73ad6bf9e..2809c9d184ed1a982dff98a14577cc9f70302d48 100644 (file)
@@ -1,49 +1,49 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#include "hal.h"\r
-\r
-/**\r
- * @brief   PAL setup.\r
- * @details Digital I/O ports static configuration as defined in @p board.h.\r
- *          This variable is used by the HAL when initializing the PAL driver.\r
- */\r
-#if HAL_USE_PAL || defined(__DOXYGEN__)\r
-const PALConfig pal_default_config =\r
-{\r
-  {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},\r
-  {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},\r
-  {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},\r
-  {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},\r
-  {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},\r
-};\r
-#endif\r
-\r
-/*\r
- * Early initialization code.\r
- * This initialization must be performed just after stack setup and before\r
- * any other initialization.\r
- */\r
-void __early_init(void) {\r
-\r
-  stm32_clock_init();\r
-}\r
-\r
-/*\r
- * Board-specific initialization code.\r
- */\r
-void boardInit(void) {\r
-}\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#include "hal.h"
+
+/**
+ * @brief   PAL setup.
+ * @details Digital I/O ports static configuration as defined in @p board.h.
+ *          This variable is used by the HAL when initializing the PAL driver.
+ */
+#if HAL_USE_PAL || defined(__DOXYGEN__)
+const PALConfig pal_default_config =
+{
+  {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
+  {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
+  {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
+  {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
+  {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
+};
+#endif
+
+/*
+ * Early initialization code.
+ * This initialization must be performed just after stack setup and before
+ * any other initialization.
+ */
+void __early_init(void) {
+
+  stm32_clock_init();
+}
+
+/*
+ * Board-specific initialization code.
+ */
+void boardInit(void) {
+}
index 7253e7782634bf4e4c327598eaa4ba29f21b0b10..b31d74307b3dd93e85f1b22bfbe08cbc67a1626c 100644 (file)
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#ifndef _BOARD_H_\r
-#define _BOARD_H_\r
-\r
-/*\r
- * Setup for a Generic STM32F103 board.\r
- */\r
-\r
-/*\r
- * Board identifier.\r
- */\r
-#define BOARD_GENERIC_STM32_F103\r
-#define BOARD_NAME              "Generic STM32F103x board"\r
-\r
-/*\r
- * Board frequencies.\r
- */\r
-#define STM32_LSECLK            32768\r
-#define STM32_HSECLK            8000000\r
-\r
-/*\r
- * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.\r
- */\r
-#define STM32F103xB\r
-\r
-/*\r
- * IO pins assignments\r
- */\r
-\r
-/* on-board */\r
-\r
-#define GPIOC_LED               13\r
-#define GPIOD_OSC_IN            0\r
-#define GPIOD_OSC_OUT           1\r
-\r
-/* In case your board has a "USB enable" hardware\r
-   controlled by a pin, define it here. (It could be just\r
-   a 1.5k resistor connected to D+ line.)\r
-*/\r
-/*\r
-#define GPIOB_USB_DISC          10\r
-*/\r
-\r
-/*\r
- * I/O ports initial setup, this configuration is established soon after reset\r
- * in the initialization code.\r
- *\r
- * The digits have the following meaning:\r
- *   0 - Analog input.\r
- *   1 - Push Pull output 10MHz.\r
- *   2 - Push Pull output 2MHz.\r
- *   3 - Push Pull output 50MHz.\r
- *   4 - Digital input.\r
- *   5 - Open Drain output 10MHz.\r
- *   6 - Open Drain output 2MHz.\r
- *   7 - Open Drain output 50MHz.\r
- *   8 - Digital input with PullUp or PullDown resistor depending on ODR.\r
- *   9 - Alternate Push Pull output 10MHz.\r
- *   A - Alternate Push Pull output 2MHz.\r
- *   B - Alternate Push Pull output 50MHz.\r
- *   C - Reserved.\r
- *   D - Alternate Open Drain output 10MHz.\r
- *   E - Alternate Open Drain output 2MHz.\r
- *   F - Alternate Open Drain output 50MHz.\r
- * Please refer to the STM32 Reference Manual for details.\r
- */\r
-\r
-/*\r
- * Port A setup.\r
- * Everything input with pull-up except:\r
- * PA2  - Alternate output  (USART2 TX).\r
- * PA3  - Normal input      (USART2 RX).\r
- * PA9  - Alternate output  (USART1 TX).\r
- * PA10 - Normal input      (USART1 RX).\r
- */\r
-#define VAL_GPIOACRL            0x88884B88      /*  PA7...PA0 */\r
-#define VAL_GPIOACRH            0x888884B8      /* PA15...PA8 */\r
-#define VAL_GPIOAODR            0xFFFFFFFF\r
-\r
-/*\r
- * Port B setup.\r
- * Everything input with pull-up except:\r
- * PB10    - Push Pull output  (USB switch).\r
- */\r
-#define VAL_GPIOBCRL            0x88888888      /*  PB7...PB0 */\r
-#define VAL_GPIOBCRH            0x88888388      /* PB15...PB8 */\r
-#define VAL_GPIOBODR            0xFFFFFFFF\r
-\r
-/*\r
- * Port C setup.\r
- * Everything input with pull-up except:\r
- * PC13    - Push Pull output  (LED).\r
- */\r
-#define VAL_GPIOCCRL            0x88888888      /*  PC7...PC0 */\r
-#define VAL_GPIOCCRH            0x88388888      /* PC15...PC8 */\r
-#define VAL_GPIOCODR            0xFFFFFFFF\r
-\r
-/*\r
- * Port D setup.\r
- * Everything input with pull-up except:\r
- * PD0  - Normal input (XTAL).\r
- * PD1  - Normal input (XTAL).\r
- */\r
-#define VAL_GPIODCRL            0x88888844      /*  PD7...PD0 */\r
-#define VAL_GPIODCRH            0x88888888      /* PD15...PD8 */\r
-#define VAL_GPIODODR            0xFFFFFFFF\r
-\r
-/*\r
- * Port E setup.\r
- * Everything input with pull-up except:\r
- */\r
-#define VAL_GPIOECRL            0x88888888      /*  PE7...PE0 */\r
-#define VAL_GPIOECRH            0x88888888      /* PE15...PE8 */\r
-#define VAL_GPIOEODR            0xFFFFFFFF\r
-\r
-/*\r
- * USB bus activation macro, required by the USB driver.\r
- */\r
-/* The point is that most of the generic STM32F103* boards\r
-   have a 1.5k resistor connected on one end to the D+ line\r
-   and on the other end to some pin. Or even a slightly more\r
-   complicated "USB enable" circuit, controlled by a pin.\r
-   That should go here.\r
-\r
-   However on some boards (e.g. one that I have), there's no\r
-   such hardware. In which case it's better to not do anything.\r
-*/\r
-/*\r
-#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC)\r
-*/\r
-#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT);\r
-\r
-/*\r
- * USB bus de-activation macro, required by the USB driver.\r
- */\r
-/*\r
-#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC)\r
-*/\r
-#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12);\r
-\r
-#if !defined(_FROM_ASM_)\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-  void boardInit(void);\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-#endif /* _FROM_ASM_ */\r
-\r
-#endif /* _BOARD_H_ */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for a Generic STM32F103 board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_GENERIC_STM32_F103
+#define BOARD_NAME              "Generic STM32F103x board"
+
+/*
+ * Board frequencies.
+ */
+#define STM32_LSECLK            32768
+#define STM32_HSECLK            8000000
+
+/*
+ * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.
+ */
+#define STM32F103xB
+
+/*
+ * IO pins assignments
+ */
+
+/* on-board */
+
+#define GPIOC_LED               13
+#define GPIOD_OSC_IN            0
+#define GPIOD_OSC_OUT           1
+
+/* In case your board has a "USB enable" hardware
+   controlled by a pin, define it here. (It could be just
+   a 1.5k resistor connected to D+ line.)
+*/
+/*
+#define GPIOB_USB_DISC          10
+*/
+
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ *
+ * The digits have the following meaning:
+ *   0 - Analog input.
+ *   1 - Push Pull output 10MHz.
+ *   2 - Push Pull output 2MHz.
+ *   3 - Push Pull output 50MHz.
+ *   4 - Digital input.
+ *   5 - Open Drain output 10MHz.
+ *   6 - Open Drain output 2MHz.
+ *   7 - Open Drain output 50MHz.
+ *   8 - Digital input with PullUp or PullDown resistor depending on ODR.
+ *   9 - Alternate Push Pull output 10MHz.
+ *   A - Alternate Push Pull output 2MHz.
+ *   B - Alternate Push Pull output 50MHz.
+ *   C - Reserved.
+ *   D - Alternate Open Drain output 10MHz.
+ *   E - Alternate Open Drain output 2MHz.
+ *   F - Alternate Open Drain output 50MHz.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+
+/*
+ * Port A setup.
+ * Everything input with pull-up except:
+ * PA2  - Alternate output  (USART2 TX).
+ * PA3  - Normal input      (USART2 RX).
+ * PA9  - Alternate output  (USART1 TX).
+ * PA10 - Normal input      (USART1 RX).
+ */
+#define VAL_GPIOACRL            0x88884B88      /*  PA7...PA0 */
+#define VAL_GPIOACRH            0x888884B8      /* PA15...PA8 */
+#define VAL_GPIOAODR            0xFFFFFFFF
+
+/*
+ * Port B setup.
+ * Everything input with pull-up except:
+ * PB10    - Push Pull output  (USB switch).
+ */
+#define VAL_GPIOBCRL            0x88888888      /*  PB7...PB0 */
+#define VAL_GPIOBCRH            0x88888388      /* PB15...PB8 */
+#define VAL_GPIOBODR            0xFFFFFFFF
+
+/*
+ * Port C setup.
+ * Everything input with pull-up except:
+ * PC13    - Push Pull output  (LED).
+ */
+#define VAL_GPIOCCRL            0x88888888      /*  PC7...PC0 */
+#define VAL_GPIOCCRH            0x88388888      /* PC15...PC8 */
+#define VAL_GPIOCODR            0xFFFFFFFF
+
+/*
+ * Port D setup.
+ * Everything input with pull-up except:
+ * PD0  - Normal input (XTAL).
+ * PD1  - Normal input (XTAL).
+ */
+#define VAL_GPIODCRL            0x88888844      /*  PD7...PD0 */
+#define VAL_GPIODCRH            0x88888888      /* PD15...PD8 */
+#define VAL_GPIODODR            0xFFFFFFFF
+
+/*
+ * Port E setup.
+ * Everything input with pull-up except:
+ */
+#define VAL_GPIOECRL            0x88888888      /*  PE7...PE0 */
+#define VAL_GPIOECRH            0x88888888      /* PE15...PE8 */
+#define VAL_GPIOEODR            0xFFFFFFFF
+
+/*
+ * USB bus activation macro, required by the USB driver.
+ */
+/* The point is that most of the generic STM32F103* boards
+   have a 1.5k resistor connected on one end to the D+ line
+   and on the other end to some pin. Or even a slightly more
+   complicated "USB enable" circuit, controlled by a pin.
+   That should go here.
+
+   However on some boards (e.g. one that I have), there's no
+   such hardware. In which case it's better to not do anything.
+*/
+/*
+#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT);
+
+/*
+ * USB bus de-activation macro, required by the USB driver.
+ */
+/*
+#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12);
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+  void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
index d692c0ee460d1e8cc2b316f5d7308929b50ccbee..48e0e51fe670e9c8405538e1fc21b71de0903abf 100644 (file)
@@ -1,5 +1,5 @@
-# List of all the board related files.\r
-BOARDSRC = $(KEYBOARD_PATH)/boards/GENERIC_STM32_F103/board.c\r
-\r
-# Required include directories\r
-BOARDINC = $(KEYBOARD_PATH)/boards/GENERIC_STM32_F103\r
+# List of all the board related files.
+BOARDSRC = $(KEYBOARD_PATH)/boards/GENERIC_STM32_F103/board.c
+
+# Required include directories
+BOARDINC = $(KEYBOARD_PATH)/boards/GENERIC_STM32_F103
index fb141f888cef12c77e6080e37a5db877b87701e8..c4ca8b874cca1f9a05aab983600861d84336ef34 100644 (file)
-/*\r
- * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com\r
- *           (C) 2016 flabbergast <s3+flabbergast@sdfeu.org>\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining\r
- * a copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included in\r
- * all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- * SOFTWARE.\r
- */\r
-\r
-/*\r
- * KL26Z64 memory setup.\r
- */\r
-MEMORY\r
-{\r
-  flash0   : org = 0x00000000, len = 0x100\r
-  flash1   : org = 0x00000400, len = 0x10\r
-  flash2   : org = 0x00000410, len = 62k - 0x410\r
-  flash3   : org = 0x0000F800, len = 2k\r
-  flash4   : org = 0x00000000, len = 0\r
-  flash5   : org = 0x00000000, len = 0\r
-  flash6   : org = 0x00000000, len = 0\r
-  flash7   : org = 0x00000000, len = 0\r
-  ram0     : org = 0x1FFFF800, len = 8k\r
-  ram1     : org = 0x00000000, len = 0\r
-  ram2     : org = 0x00000000, len = 0\r
-  ram3     : org = 0x00000000, len = 0\r
-  ram4     : org = 0x00000000, len = 0\r
-  ram5     : org = 0x00000000, len = 0\r
-  ram6     : org = 0x00000000, len = 0\r
-  ram7     : org = 0x00000000, len = 0\r
-}\r
-\r
-/* Flash region for the configuration bytes.*/\r
-SECTIONS\r
-{\r
-  .cfmprotect : ALIGN(4) SUBALIGN(4)\r
-  {\r
-    KEEP(*(.cfmconfig))\r
-  } > flash1\r
-}\r
-\r
-/* For each data/text section two region are defined, a virtual region\r
-   and a load region (_LMA suffix).*/\r
-\r
-/* Flash region to be used for exception vectors.*/\r
-REGION_ALIAS("VECTORS_FLASH", flash0);\r
-REGION_ALIAS("VECTORS_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for constructors and destructors.*/\r
-REGION_ALIAS("XTORS_FLASH", flash2);\r
-REGION_ALIAS("XTORS_FLASH_LMA", flash2);\r
-\r
-/* Flash region to be used for code text.*/\r
-REGION_ALIAS("TEXT_FLASH", flash2);\r
-REGION_ALIAS("TEXT_FLASH_LMA", flash2);\r
-\r
-/* Flash region to be used for read only data.*/\r
-REGION_ALIAS("RODATA_FLASH", flash2);\r
-REGION_ALIAS("RODATA_FLASH_LMA", flash2);\r
-\r
-/* Flash region to be used for various.*/\r
-REGION_ALIAS("VARIOUS_FLASH", flash2);\r
-REGION_ALIAS("VARIOUS_FLASH_LMA", flash2);\r
-\r
-/* Flash region to be used for RAM(n) initialization data.*/\r
-REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2);\r
-\r
-/* RAM region to be used for Main stack. This stack accommodates the processing\r
-   of all exceptions and interrupts.*/\r
-REGION_ALIAS("MAIN_STACK_RAM", ram0);\r
-\r
-/* RAM region to be used for the process stack. This is the stack used by\r
-   the main() function.*/\r
-REGION_ALIAS("PROCESS_STACK_RAM", ram0);\r
-\r
-/* RAM region to be used for data segment.*/\r
-REGION_ALIAS("DATA_RAM", ram0);\r
-REGION_ALIAS("DATA_RAM_LMA", flash2);\r
-\r
-/* RAM region to be used for BSS segment.*/\r
-REGION_ALIAS("BSS_RAM", ram0);\r
-\r
-/* RAM region to be used for the default heap.*/\r
-REGION_ALIAS("HEAP_RAM", ram0);\r
-\r
-__eeprom_workarea_start__ = ORIGIN(flash3);\r
-__eeprom_workarea_size__  = LENGTH(flash3);\r
-__eeprom_workarea_end__   = __eeprom_workarea_start__ + __eeprom_workarea_size__;\r
-\r
-/* Generic rules inclusion.*/\r
-INCLUDE rules.ld\r
+/*
+ * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com
+ *           (C) 2016 flabbergast <s3+flabbergast@sdfeu.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * KL26Z64 memory setup.
+ */
+MEMORY
+{
+  flash0   : org = 0x00000000, len = 0x100
+  flash1   : org = 0x00000400, len = 0x10
+  flash2   : org = 0x00000410, len = 62k - 0x410
+  flash3   : org = 0x0000F800, len = 2k
+  flash4   : org = 0x00000000, len = 0
+  flash5   : org = 0x00000000, len = 0
+  flash6   : org = 0x00000000, len = 0
+  flash7   : org = 0x00000000, len = 0
+  ram0     : org = 0x1FFFF800, len = 8k
+  ram1     : org = 0x00000000, len = 0
+  ram2     : org = 0x00000000, len = 0
+  ram3     : org = 0x00000000, len = 0
+  ram4     : org = 0x00000000, len = 0
+  ram5     : org = 0x00000000, len = 0
+  ram6     : org = 0x00000000, len = 0
+  ram7     : org = 0x00000000, len = 0
+}
+
+/* Flash region for the configuration bytes.*/
+SECTIONS
+{
+  .cfmprotect : ALIGN(4) SUBALIGN(4)
+  {
+    KEEP(*(.cfmconfig))
+  } > flash1
+}
+
+/* For each data/text section two region are defined, a virtual region
+   and a load region (_LMA suffix).*/
+
+/* Flash region to be used for exception vectors.*/
+REGION_ALIAS("VECTORS_FLASH", flash0);
+REGION_ALIAS("VECTORS_FLASH_LMA", flash0);
+
+/* Flash region to be used for constructors and destructors.*/
+REGION_ALIAS("XTORS_FLASH", flash2);
+REGION_ALIAS("XTORS_FLASH_LMA", flash2);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash2);
+REGION_ALIAS("TEXT_FLASH_LMA", flash2);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash2);
+REGION_ALIAS("RODATA_FLASH_LMA", flash2);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash2);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash2);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2);
+
+/* RAM region to be used for Main stack. This stack accommodates the processing
+   of all exceptions and interrupts.*/
+REGION_ALIAS("MAIN_STACK_RAM", ram0);
+
+/* RAM region to be used for the process stack. This is the stack used by
+   the main() function.*/
+REGION_ALIAS("PROCESS_STACK_RAM", ram0);
+
+/* RAM region to be used for data segment.*/
+REGION_ALIAS("DATA_RAM", ram0);
+REGION_ALIAS("DATA_RAM_LMA", flash2);
+
+/* RAM region to be used for BSS segment.*/
+REGION_ALIAS("BSS_RAM", ram0);
+
+/* RAM region to be used for the default heap.*/
+REGION_ALIAS("HEAP_RAM", ram0);
+
+__eeprom_workarea_start__ = ORIGIN(flash3);
+__eeprom_workarea_size__  = LENGTH(flash3);
+__eeprom_workarea_end__   = __eeprom_workarea_start__ + __eeprom_workarea_size__;
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
index 00613328ed16dfa482f0060698b9327d5bfe5cb4..f9bfe9c005279cbd0b77e0fe9cb2a125dd7b1eb1 100644 (file)
@@ -1,88 +1,88 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-/*\r
- * ST32F103xB memory setup for use with the maplemini bootloader.\r
- * You will have to\r
- *     #define CORTEX_VTOR_INIT 0x5000\r
- * in your projects chconf.h\r
- */\r
-MEMORY\r
-{\r
-    flash0  : org = 0x08002000, len = 128k - 0x2000\r
-    flash1  : org = 0x00000000, len = 0\r
-    flash2  : org = 0x00000000, len = 0\r
-    flash3  : org = 0x00000000, len = 0\r
-    flash4  : org = 0x00000000, len = 0\r
-    flash5  : org = 0x00000000, len = 0\r
-    flash6  : org = 0x00000000, len = 0\r
-    flash7  : org = 0x00000000, len = 0\r
-    ram0    : org = 0x20000000, len = 20k\r
-    ram1    : org = 0x00000000, len = 0\r
-    ram2    : org = 0x00000000, len = 0\r
-    ram3    : org = 0x00000000, len = 0\r
-    ram4    : org = 0x00000000, len = 0\r
-    ram5    : org = 0x00000000, len = 0\r
-    ram6    : org = 0x00000000, len = 0\r
-    ram7    : org = 0x00000000, len = 0\r
-}\r
-\r
-/* For each data/text section two region are defined, a virtual region\r
-   and a load region (_LMA suffix).*/\r
-\r
-/* Flash region to be used for exception vectors.*/\r
-REGION_ALIAS("VECTORS_FLASH", flash0);\r
-REGION_ALIAS("VECTORS_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for constructors and destructors.*/\r
-REGION_ALIAS("XTORS_FLASH", flash0);\r
-REGION_ALIAS("XTORS_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for code text.*/\r
-REGION_ALIAS("TEXT_FLASH", flash0);\r
-REGION_ALIAS("TEXT_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for read only data.*/\r
-REGION_ALIAS("RODATA_FLASH", flash0);\r
-REGION_ALIAS("RODATA_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for various.*/\r
-REGION_ALIAS("VARIOUS_FLASH", flash0);\r
-REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);\r
-\r
-/* Flash region to be used for RAM(n) initialization data.*/\r
-REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);\r
-\r
-/* RAM region to be used for Main stack. This stack accommodates the processing\r
-   of all exceptions and interrupts.*/\r
-REGION_ALIAS("MAIN_STACK_RAM", ram0);\r
-\r
-/* RAM region to be used for the process stack. This is the stack used by\r
-   the main() function.*/\r
-REGION_ALIAS("PROCESS_STACK_RAM", ram0);\r
-\r
-/* RAM region to be used for data segment.*/\r
-REGION_ALIAS("DATA_RAM", ram0);\r
-REGION_ALIAS("DATA_RAM_LMA", flash0);\r
-\r
-/* RAM region to be used for BSS segment.*/\r
-REGION_ALIAS("BSS_RAM", ram0);\r
-\r
-/* RAM region to be used for the default heap.*/\r
-REGION_ALIAS("HEAP_RAM", ram0);\r
-\r
-/* Generic rules inclusion.*/\r
-INCLUDE rules.ld\r
+/*
+    ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/*
+ * ST32F103xB memory setup for use with the maplemini bootloader.
+ * You will have to
+ *     #define CORTEX_VTOR_INIT 0x5000
+ * in your projects chconf.h
+ */
+MEMORY
+{
+    flash0  : org = 0x08002000, len = 128k - 0x2000
+    flash1  : org = 0x00000000, len = 0
+    flash2  : org = 0x00000000, len = 0
+    flash3  : org = 0x00000000, len = 0
+    flash4  : org = 0x00000000, len = 0
+    flash5  : org = 0x00000000, len = 0
+    flash6  : org = 0x00000000, len = 0
+    flash7  : org = 0x00000000, len = 0
+    ram0    : org = 0x20000000, len = 20k
+    ram1    : org = 0x00000000, len = 0
+    ram2    : org = 0x00000000, len = 0
+    ram3    : org = 0x00000000, len = 0
+    ram4    : org = 0x00000000, len = 0
+    ram5    : org = 0x00000000, len = 0
+    ram6    : org = 0x00000000, len = 0
+    ram7    : org = 0x00000000, len = 0
+}
+
+/* For each data/text section two region are defined, a virtual region
+   and a load region (_LMA suffix).*/
+
+/* Flash region to be used for exception vectors.*/
+REGION_ALIAS("VECTORS_FLASH", flash0);
+REGION_ALIAS("VECTORS_FLASH_LMA", flash0);
+
+/* Flash region to be used for constructors and destructors.*/
+REGION_ALIAS("XTORS_FLASH", flash0);
+REGION_ALIAS("XTORS_FLASH_LMA", flash0);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash0);
+REGION_ALIAS("TEXT_FLASH_LMA", flash0);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash0);
+REGION_ALIAS("RODATA_FLASH_LMA", flash0);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash0);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);
+
+/* RAM region to be used for Main stack. This stack accommodates the processing
+   of all exceptions and interrupts.*/
+REGION_ALIAS("MAIN_STACK_RAM", ram0);
+
+/* RAM region to be used for the process stack. This is the stack used by
+   the main() function.*/
+REGION_ALIAS("PROCESS_STACK_RAM", ram0);
+
+/* RAM region to be used for data segment.*/
+REGION_ALIAS("DATA_RAM", ram0);
+REGION_ALIAS("DATA_RAM_LMA", flash0);
+
+/* RAM region to be used for BSS segment.*/
+REGION_ALIAS("BSS_RAM", ram0);
+
+/* RAM region to be used for the default heap.*/
+REGION_ALIAS("HEAP_RAM", ram0);
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
diff --git a/keyboards/chibios_test/rules.mk b/keyboards/chibios_test/rules.mk
new file mode 100644 (file)
index 0000000..4b5a845
--- /dev/null
@@ -0,0 +1,8 @@
+#BOOTMAGIC_ENABLE = yes        # Virtual DIP switch configuration
+MOUSEKEY_ENABLE ?= yes # Mouse keys
+EXTRAKEY_ENABLE ?= yes # Audio control and System control
+CONSOLE_ENABLE ?= yes  # Console for debug
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes         # USB Nkey Rollover
+CUSTOM_MATRIX ?= yes # Custom matrix file
\ No newline at end of file
index eae38c4b2bcdbccab742299d693940a5bc4e0dc0..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,41 +1,3 @@
-# project specific files
-SRC =  matrix.c \
-           led.c
-
-## chip/board settings
-# the next two should match the directories in
-#  <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F0xx
-# linker script to use
-# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#  or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F072xB
-# startup code to use
-# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f0xx
-# it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = ST_STM32F072B_DISCOVERY
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU  = cortex-m0
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 6
-# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
-# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
-# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
-# a custom board definition that you plan to reuse).
-# If you're not setting it here, leave it commented out.
-# It is chip dependent, the correct number can be looked up here (page 175):
-# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
-# This also requires a patch to chibios:
-#   <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
-#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
-
-# Build Options
-#   comment out to disable the options.
-#
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
+endif
\ No newline at end of file
index 3d877aaa2b38bd0abb414b535547bd7f164107da..faca3defdf0e9b5ae523eacc050c0513df2829c1 100644 (file)
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#ifndef _MCUCONF_H_\r
-#define _MCUCONF_H_\r
-\r
-/*\r
- * STM32F0xx drivers configuration.\r
- * The following settings override the default settings present in\r
- * the various device driver implementation headers.\r
- * Note that the settings for each driver only have effect if the whole\r
- * driver is enabled in halconf.h.\r
- *\r
- * IRQ priorities:\r
- * 3...0       Lowest...Highest.\r
- *\r
- * DMA priorities:\r
- * 0...3        Lowest...Highest.\r
- */\r
-\r
-#define STM32F0xx_MCUCONF\r
-\r
-/*\r
- * HAL driver system settings.\r
- */\r
-#define STM32_NO_INIT                       FALSE\r
-#define STM32_PVD_ENABLE                    FALSE\r
-#define STM32_PLS                           STM32_PLS_LEV0\r
-#define STM32_HSI_ENABLED                   TRUE\r
-#define STM32_HSI14_ENABLED                 TRUE\r
-#define STM32_HSI48_ENABLED                 FALSE\r
-#define STM32_LSI_ENABLED                   TRUE\r
-#define STM32_HSE_ENABLED                   FALSE\r
-#define STM32_LSE_ENABLED                   FALSE\r
-#define STM32_SW                            STM32_SW_PLL\r
-#define STM32_PLLSRC                        STM32_PLLSRC_HSI_DIV2\r
-#define STM32_PREDIV_VALUE                  1\r
-#define STM32_PLLMUL_VALUE                  12\r
-#define STM32_HPRE                          STM32_HPRE_DIV1\r
-#define STM32_PPRE                          STM32_PPRE_DIV1\r
-#define STM32_ADCSW                         STM32_ADCSW_HSI14\r
-#define STM32_ADCPRE                        STM32_ADCPRE_DIV4\r
-#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK\r
-#define STM32_ADCPRE                        STM32_ADCPRE_DIV4\r
-#define STM32_ADCSW                         STM32_ADCSW_HSI14\r
-#define STM32_USBSW                         STM32_USBSW_HSI48\r
-#define STM32_CECSW                         STM32_CECSW_HSI\r
-#define STM32_I2C1SW                        STM32_I2C1SW_HSI\r
-#define STM32_USART1SW                      STM32_USART1SW_PCLK\r
-#define STM32_RTCSEL                        STM32_RTCSEL_LSI\r
-\r
-/*\r
- * ADC driver system settings.\r
- */\r
-#define STM32_ADC_USE_ADC1                  FALSE\r
-#define STM32_ADC_ADC1_DMA_PRIORITY         2\r
-#define STM32_ADC_IRQ_PRIORITY              2\r
-#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY     2\r
-\r
-/*\r
- * EXT driver system settings.\r
- */\r
-#define STM32_EXT_EXTI0_1_IRQ_PRIORITY      3\r
-#define STM32_EXT_EXTI2_3_IRQ_PRIORITY      3\r
-#define STM32_EXT_EXTI4_15_IRQ_PRIORITY     3\r
-#define STM32_EXT_EXTI16_IRQ_PRIORITY       3\r
-#define STM32_EXT_EXTI17_IRQ_PRIORITY       3\r
-\r
-/*\r
- * GPT driver system settings.\r
- */\r
-#define STM32_GPT_USE_TIM1                  FALSE\r
-#define STM32_GPT_USE_TIM2                  FALSE\r
-#define STM32_GPT_USE_TIM3                  FALSE\r
-#define STM32_GPT_USE_TIM14                 FALSE\r
-#define STM32_GPT_TIM1_IRQ_PRIORITY         2\r
-#define STM32_GPT_TIM2_IRQ_PRIORITY         2\r
-#define STM32_GPT_TIM3_IRQ_PRIORITY         2\r
-#define STM32_GPT_TIM14_IRQ_PRIORITY        2\r
-\r
-/*\r
- * I2C driver system settings.\r
- */\r
-#define STM32_I2C_USE_I2C1                  FALSE\r
-#define STM32_I2C_USE_I2C2                  FALSE\r
-#define STM32_I2C_BUSY_TIMEOUT              50\r
-#define STM32_I2C_I2C1_IRQ_PRIORITY         3\r
-#define STM32_I2C_I2C2_IRQ_PRIORITY         3\r
-#define STM32_I2C_USE_DMA                   TRUE\r
-#define STM32_I2C_I2C1_DMA_PRIORITY         1\r
-#define STM32_I2C_I2C2_DMA_PRIORITY         1\r
-#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")\r
-\r
-/*\r
- * ICU driver system settings.\r
- */\r
-#define STM32_ICU_USE_TIM1                  FALSE\r
-#define STM32_ICU_USE_TIM2                  FALSE\r
-#define STM32_ICU_USE_TIM3                  FALSE\r
-#define STM32_ICU_TIM1_IRQ_PRIORITY         3\r
-#define STM32_ICU_TIM2_IRQ_PRIORITY         3\r
-#define STM32_ICU_TIM3_IRQ_PRIORITY         3\r
-\r
-/*\r
- * PWM driver system settings.\r
- */\r
-#define STM32_PWM_USE_ADVANCED              FALSE\r
-#define STM32_PWM_USE_TIM1                  FALSE\r
-#define STM32_PWM_USE_TIM2                  FALSE\r
-#define STM32_PWM_USE_TIM3                  FALSE\r
-#define STM32_PWM_TIM1_IRQ_PRIORITY         3\r
-#define STM32_PWM_TIM2_IRQ_PRIORITY         3\r
-#define STM32_PWM_TIM3_IRQ_PRIORITY         3\r
-\r
-/*\r
- * SERIAL driver system settings.\r
- */\r
-#define STM32_SERIAL_USE_USART1             FALSE\r
-#define STM32_SERIAL_USE_USART2             FALSE\r
-#define STM32_SERIAL_USART1_PRIORITY        3\r
-#define STM32_SERIAL_USART2_PRIORITY        3\r
-\r
-/*\r
- * SPI driver system settings.\r
- */\r
-#define STM32_SPI_USE_SPI1                  FALSE\r
-#define STM32_SPI_USE_SPI2                  FALSE\r
-#define STM32_SPI_SPI1_DMA_PRIORITY         1\r
-#define STM32_SPI_SPI2_DMA_PRIORITY         1\r
-#define STM32_SPI_SPI1_IRQ_PRIORITY         2\r
-#define STM32_SPI_SPI2_IRQ_PRIORITY         2\r
-#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")\r
-\r
-/*\r
- * ST driver system settings.\r
- */\r
-#define STM32_ST_IRQ_PRIORITY               2\r
-#define STM32_ST_USE_TIMER                  2\r
-\r
-/*\r
- * UART driver system settings.\r
- */\r
-#define STM32_UART_USE_USART1               FALSE\r
-#define STM32_UART_USE_USART2               FALSE\r
-#define STM32_UART_USART1_IRQ_PRIORITY      3\r
-#define STM32_UART_USART2_IRQ_PRIORITY      3\r
-#define STM32_UART_USART1_DMA_PRIORITY      0\r
-#define STM32_UART_USART2_DMA_PRIORITY      0\r
-#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")\r
-\r
-/*\r
- * USB driver system settings.\r
- */\r
-#define STM32_USB_USE_USB1                  TRUE\r
-#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE\r
-#define STM32_USB_USB1_LP_IRQ_PRIORITY      3\r
-\r
-#endif /* _MCUCONF_H_ */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0       Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3        Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT                       FALSE
+#define STM32_PVD_ENABLE                    FALSE
+#define STM32_PLS                           STM32_PLS_LEV0
+#define STM32_HSI_ENABLED                   TRUE
+#define STM32_HSI14_ENABLED                 TRUE
+#define STM32_HSI48_ENABLED                 FALSE
+#define STM32_LSI_ENABLED                   TRUE
+#define STM32_HSE_ENABLED                   FALSE
+#define STM32_LSE_ENABLED                   FALSE
+#define STM32_SW                            STM32_SW_PLL
+#define STM32_PLLSRC                        STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE                  1
+#define STM32_PLLMUL_VALUE                  12
+#define STM32_HPRE                          STM32_HPRE_DIV1
+#define STM32_PPRE                          STM32_PPRE_DIV1
+#define STM32_ADCSW                         STM32_ADCSW_HSI14
+#define STM32_ADCPRE                        STM32_ADCPRE_DIV4
+#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE                        STM32_ADCPRE_DIV4
+#define STM32_ADCSW                         STM32_ADCSW_HSI14
+#define STM32_USBSW                         STM32_USBSW_HSI48
+#define STM32_CECSW                         STM32_CECSW_HSI
+#define STM32_I2C1SW                        STM32_I2C1SW_HSI
+#define STM32_USART1SW                      STM32_USART1SW_PCLK
+#define STM32_RTCSEL                        STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_IRQ_PRIORITY              2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY     2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY      3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY      3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY     3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY       3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY       3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1                  FALSE
+#define STM32_GPT_USE_TIM2                  FALSE
+#define STM32_GPT_USE_TIM3                  FALSE
+#define STM32_GPT_USE_TIM14                 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY         2
+#define STM32_GPT_TIM2_IRQ_PRIORITY         2
+#define STM32_GPT_TIM3_IRQ_PRIORITY         2
+#define STM32_GPT_TIM14_IRQ_PRIORITY        2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1                  FALSE
+#define STM32_I2C_USE_I2C2                  FALSE
+#define STM32_I2C_BUSY_TIMEOUT              50
+#define STM32_I2C_I2C1_IRQ_PRIORITY         3
+#define STM32_I2C_I2C2_IRQ_PRIORITY         3
+#define STM32_I2C_USE_DMA                   TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY         1
+#define STM32_I2C_I2C2_DMA_PRIORITY         1
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1                  FALSE
+#define STM32_ICU_USE_TIM2                  FALSE
+#define STM32_ICU_USE_TIM3                  FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY         3
+#define STM32_ICU_TIM2_IRQ_PRIORITY         3
+#define STM32_ICU_TIM3_IRQ_PRIORITY         3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED              FALSE
+#define STM32_PWM_USE_TIM1                  FALSE
+#define STM32_PWM_USE_TIM2                  FALSE
+#define STM32_PWM_USE_TIM3                  FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY         3
+#define STM32_PWM_TIM2_IRQ_PRIORITY         3
+#define STM32_PWM_TIM3_IRQ_PRIORITY         3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1             FALSE
+#define STM32_SERIAL_USE_USART2             FALSE
+#define STM32_SERIAL_USART1_PRIORITY        3
+#define STM32_SERIAL_USART2_PRIORITY        3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1                  FALSE
+#define STM32_SPI_USE_SPI2                  FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY         1
+#define STM32_SPI_SPI2_DMA_PRIORITY         1
+#define STM32_SPI_SPI1_IRQ_PRIORITY         2
+#define STM32_SPI_SPI2_IRQ_PRIORITY         2
+#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY               2
+#define STM32_ST_USE_TIMER                  2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1               FALSE
+#define STM32_UART_USE_USART2               FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY      3
+#define STM32_UART_USART2_IRQ_PRIORITY      3
+#define STM32_UART_USART1_DMA_PRIORITY      0
+#define STM32_UART_USART2_DMA_PRIORITY      0
+#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1                  TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY      3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/chibios_test/stm32_f072_onekey/rules.mk b/keyboards/chibios_test/stm32_f072_onekey/rules.mk
new file mode 100644 (file)
index 0000000..eae38c4
--- /dev/null
@@ -0,0 +1,41 @@
+# project specific files
+SRC =  matrix.c \
+           led.c
+
+## chip/board settings
+# the next two should match the directories in
+#  <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F0xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#  or <this_dir>/ld/
+MCU_LDSCRIPT = STM32F072xB
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f0xx
+# it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+BOARD = ST_STM32F072B_DISCOVERY
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU  = cortex-m0
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 6
+# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
+# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
+# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
+# a custom board definition that you plan to reuse).
+# If you're not setting it here, leave it commented out.
+# It is chip dependent, the correct number can be looked up here (page 175):
+# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+# This also requires a patch to chibios:
+#   <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
+
+# Build Options
+#   comment out to disable the options.
+#
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
index 307ca5b198ef28222c00f8f3b4b1cc357f9776fa..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,52 +1,3 @@
-# project specific files
-SRC =  matrix.c \
-           led.c
-
-# GENERIC STM32F103C8T6 board - stm32duino bootloader
-OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
-MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
-BOARD = GENERIC_STM32_F103
-
-# GENERIC STM32F103C8T6 board - no bootloader (programmer over serial or SWD)
-# OPT_DEFS =
-# MCU_LDSCRIPT = STM32F103x8
-# BOARD = GENERIC_STM32_F103
-
-# MAPLE MINI
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x5000
-# MCU_LDSCRIPT = STM32F103xB_maplemini_bootloader
-# BOARD = MAPLEMINI_STM32_F103
-
-## chip/board settings
-# the next two should match the directories in
-#  <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F1xx
-# linker script to use
-# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#  or <this_dir>/ld/
-# startup code to use
-# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f1xx
-# it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU  = cortex-m3
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
-# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
-# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
-# a custom board definition that you plan to reuse).
-# If you're not setting it here, leave it commented out.
-# It is chip dependent, the correct number can be looked up here (page 175):
-# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
-# This also requires a patch to chibios:
-#   <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
-#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
+endif
\ No newline at end of file
index 626332a6aa28bf10f4d299428cbbeb7c190ad86b..276829216ee8e6e70e5ee228c0a6084259baf6ab 100644 (file)
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#ifndef _MCUCONF_H_\r
-#define _MCUCONF_H_\r
-\r
-#define STM32F103_MCUCONF\r
-\r
-/*\r
- * STM32F103 drivers configuration.\r
- * The following settings override the default settings present in\r
- * the various device driver implementation headers.\r
- * Note that the settings for each driver only have effect if the whole\r
- * driver is enabled in halconf.h.\r
- *\r
- * IRQ priorities:\r
- * 15...0       Lowest...Highest.\r
- *\r
- * DMA priorities:\r
- * 0...3        Lowest...Highest.\r
- */\r
-\r
-/*\r
- * HAL driver system settings.\r
- */\r
-#define STM32_NO_INIT                       FALSE\r
-#define STM32_HSI_ENABLED                   TRUE\r
-#define STM32_LSI_ENABLED                   FALSE\r
-#define STM32_HSE_ENABLED                   TRUE\r
-#define STM32_LSE_ENABLED                   FALSE\r
-#define STM32_SW                            STM32_SW_PLL\r
-#define STM32_PLLSRC                        STM32_PLLSRC_HSE\r
-#define STM32_PLLXTPRE                      STM32_PLLXTPRE_DIV1\r
-#define STM32_PLLMUL_VALUE                  9\r
-#define STM32_HPRE                          STM32_HPRE_DIV1\r
-#define STM32_PPRE1                         STM32_PPRE1_DIV2\r
-#define STM32_PPRE2                         STM32_PPRE2_DIV2\r
-#define STM32_ADCPRE                        STM32_ADCPRE_DIV4\r
-#define STM32_USB_CLOCK_REQUIRED            TRUE\r
-#define STM32_USBPRE                        STM32_USBPRE_DIV1P5\r
-#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK\r
-#define STM32_RTCSEL                        STM32_RTCSEL_HSEDIV\r
-#define STM32_PVD_ENABLE                    FALSE\r
-#define STM32_PLS                           STM32_PLS_LEV0\r
-\r
-/*\r
- * ADC driver system settings.\r
- */\r
-#define STM32_ADC_USE_ADC1                  FALSE\r
-#define STM32_ADC_ADC1_DMA_PRIORITY         2\r
-#define STM32_ADC_ADC1_IRQ_PRIORITY         6\r
-\r
-/*\r
- * CAN driver system settings.\r
- */\r
-#define STM32_CAN_USE_CAN1                  FALSE\r
-#define STM32_CAN_CAN1_IRQ_PRIORITY         11\r
-\r
-/*\r
- * EXT driver system settings.\r
- */\r
-#define STM32_EXT_EXTI0_IRQ_PRIORITY        6\r
-#define STM32_EXT_EXTI1_IRQ_PRIORITY        6\r
-#define STM32_EXT_EXTI2_IRQ_PRIORITY        6\r
-#define STM32_EXT_EXTI3_IRQ_PRIORITY        6\r
-#define STM32_EXT_EXTI4_IRQ_PRIORITY        6\r
-#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6\r
-#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6\r
-#define STM32_EXT_EXTI16_IRQ_PRIORITY       6\r
-#define STM32_EXT_EXTI17_IRQ_PRIORITY       6\r
-#define STM32_EXT_EXTI18_IRQ_PRIORITY       6\r
-#define STM32_EXT_EXTI19_IRQ_PRIORITY       6\r
-\r
-/*\r
- * GPT driver system settings.\r
- */\r
-#define STM32_GPT_USE_TIM1                  FALSE\r
-#define STM32_GPT_USE_TIM2                  FALSE\r
-#define STM32_GPT_USE_TIM3                  FALSE\r
-#define STM32_GPT_USE_TIM4                  FALSE\r
-#define STM32_GPT_USE_TIM5                  FALSE\r
-#define STM32_GPT_USE_TIM8                  FALSE\r
-#define STM32_GPT_TIM1_IRQ_PRIORITY         7\r
-#define STM32_GPT_TIM2_IRQ_PRIORITY         7\r
-#define STM32_GPT_TIM3_IRQ_PRIORITY         7\r
-#define STM32_GPT_TIM4_IRQ_PRIORITY         7\r
-#define STM32_GPT_TIM5_IRQ_PRIORITY         7\r
-#define STM32_GPT_TIM8_IRQ_PRIORITY         7\r
-\r
-/*\r
- * I2C driver system settings.\r
- */\r
-#define STM32_I2C_USE_I2C1                  FALSE\r
-#define STM32_I2C_USE_I2C2                  FALSE\r
-#define STM32_I2C_BUSY_TIMEOUT              50\r
-#define STM32_I2C_I2C1_IRQ_PRIORITY         5\r
-#define STM32_I2C_I2C2_IRQ_PRIORITY         5\r
-#define STM32_I2C_I2C1_DMA_PRIORITY         3\r
-#define STM32_I2C_I2C2_DMA_PRIORITY         3\r
-#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")\r
-\r
-/*\r
- * ICU driver system settings.\r
- */\r
-#define STM32_ICU_USE_TIM1                  FALSE\r
-#define STM32_ICU_USE_TIM2                  FALSE\r
-#define STM32_ICU_USE_TIM3                  FALSE\r
-#define STM32_ICU_USE_TIM4                  FALSE\r
-#define STM32_ICU_USE_TIM5                  FALSE\r
-#define STM32_ICU_USE_TIM8                  FALSE\r
-#define STM32_ICU_TIM1_IRQ_PRIORITY         7\r
-#define STM32_ICU_TIM2_IRQ_PRIORITY         7\r
-#define STM32_ICU_TIM3_IRQ_PRIORITY         7\r
-#define STM32_ICU_TIM4_IRQ_PRIORITY         7\r
-#define STM32_ICU_TIM5_IRQ_PRIORITY         7\r
-#define STM32_ICU_TIM8_IRQ_PRIORITY         7\r
-\r
-/*\r
- * PWM driver system settings.\r
- */\r
-#define STM32_PWM_USE_ADVANCED              FALSE\r
-#define STM32_PWM_USE_TIM1                  FALSE\r
-#define STM32_PWM_USE_TIM2                  FALSE\r
-#define STM32_PWM_USE_TIM3                  FALSE\r
-#define STM32_PWM_USE_TIM4                  FALSE\r
-#define STM32_PWM_USE_TIM5                  FALSE\r
-#define STM32_PWM_USE_TIM8                  FALSE\r
-#define STM32_PWM_TIM1_IRQ_PRIORITY         7\r
-#define STM32_PWM_TIM2_IRQ_PRIORITY         7\r
-#define STM32_PWM_TIM3_IRQ_PRIORITY         7\r
-#define STM32_PWM_TIM4_IRQ_PRIORITY         7\r
-#define STM32_PWM_TIM5_IRQ_PRIORITY         7\r
-#define STM32_PWM_TIM8_IRQ_PRIORITY         7\r
-\r
-/*\r
- * RTC driver system settings.\r
- */\r
-#define STM32_RTC_IRQ_PRIORITY              15\r
-\r
-/*\r
- * SERIAL driver system settings.\r
- */\r
-#define STM32_SERIAL_USE_USART1             FALSE\r
-#define STM32_SERIAL_USE_USART2             FALSE\r
-#define STM32_SERIAL_USE_USART3             FALSE\r
-#define STM32_SERIAL_USE_UART4              FALSE\r
-#define STM32_SERIAL_USE_UART5              FALSE\r
-#define STM32_SERIAL_USART1_PRIORITY        12\r
-#define STM32_SERIAL_USART2_PRIORITY        12\r
-#define STM32_SERIAL_USART3_PRIORITY        12\r
-#define STM32_SERIAL_UART4_PRIORITY         12\r
-#define STM32_SERIAL_UART5_PRIORITY         12\r
-\r
-/*\r
- * SPI driver system settings.\r
- */\r
-#define STM32_SPI_USE_SPI1                  FALSE\r
-#define STM32_SPI_USE_SPI2                  FALSE\r
-#define STM32_SPI_USE_SPI3                  FALSE\r
-#define STM32_SPI_SPI1_DMA_PRIORITY         1\r
-#define STM32_SPI_SPI2_DMA_PRIORITY         1\r
-#define STM32_SPI_SPI3_DMA_PRIORITY         1\r
-#define STM32_SPI_SPI1_IRQ_PRIORITY         10\r
-#define STM32_SPI_SPI2_IRQ_PRIORITY         10\r
-#define STM32_SPI_SPI3_IRQ_PRIORITY         10\r
-#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")\r
-\r
-/*\r
- * ST driver system settings.\r
- */\r
-#define STM32_ST_IRQ_PRIORITY               8\r
-#define STM32_ST_USE_TIMER                  2\r
-\r
-/*\r
- * UART driver system settings.\r
- */\r
-#define STM32_UART_USE_USART1               FALSE\r
-#define STM32_UART_USE_USART2               FALSE\r
-#define STM32_UART_USE_USART3               FALSE\r
-#define STM32_UART_USART1_IRQ_PRIORITY      12\r
-#define STM32_UART_USART2_IRQ_PRIORITY      12\r
-#define STM32_UART_USART3_IRQ_PRIORITY      12\r
-#define STM32_UART_USART1_DMA_PRIORITY      0\r
-#define STM32_UART_USART2_DMA_PRIORITY      0\r
-#define STM32_UART_USART3_DMA_PRIORITY      0\r
-#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")\r
-\r
-/*\r
- * USB driver system settings.\r
- */\r
-#define STM32_USB_USE_USB1                  TRUE\r
-#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE\r
-#define STM32_USB_USB1_HP_IRQ_PRIORITY      13\r
-#define STM32_USB_USB1_LP_IRQ_PRIORITY      14\r
-\r
-#endif /* _MCUCONF_H_ */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#define STM32F103_MCUCONF
+
+/*
+ * STM32F103 drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 15...0       Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3        Lowest...Highest.
+ */
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT                       FALSE
+#define STM32_HSI_ENABLED                   TRUE
+#define STM32_LSI_ENABLED                   FALSE
+#define STM32_HSE_ENABLED                   TRUE
+#define STM32_LSE_ENABLED                   FALSE
+#define STM32_SW                            STM32_SW_PLL
+#define STM32_PLLSRC                        STM32_PLLSRC_HSE
+#define STM32_PLLXTPRE                      STM32_PLLXTPRE_DIV1
+#define STM32_PLLMUL_VALUE                  9
+#define STM32_HPRE                          STM32_HPRE_DIV1
+#define STM32_PPRE1                         STM32_PPRE1_DIV2
+#define STM32_PPRE2                         STM32_PPRE2_DIV2
+#define STM32_ADCPRE                        STM32_ADCPRE_DIV4
+#define STM32_USB_CLOCK_REQUIRED            TRUE
+#define STM32_USBPRE                        STM32_USBPRE_DIV1P5
+#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK
+#define STM32_RTCSEL                        STM32_RTCSEL_HSEDIV
+#define STM32_PVD_ENABLE                    FALSE
+#define STM32_PLS                           STM32_PLS_LEV0
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_ADC1_IRQ_PRIORITY         6
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1                  FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY         11
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1                  FALSE
+#define STM32_GPT_USE_TIM2                  FALSE
+#define STM32_GPT_USE_TIM3                  FALSE
+#define STM32_GPT_USE_TIM4                  FALSE
+#define STM32_GPT_USE_TIM5                  FALSE
+#define STM32_GPT_USE_TIM8                  FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY         7
+#define STM32_GPT_TIM2_IRQ_PRIORITY         7
+#define STM32_GPT_TIM3_IRQ_PRIORITY         7
+#define STM32_GPT_TIM4_IRQ_PRIORITY         7
+#define STM32_GPT_TIM5_IRQ_PRIORITY         7
+#define STM32_GPT_TIM8_IRQ_PRIORITY         7
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1                  FALSE
+#define STM32_I2C_USE_I2C2                  FALSE
+#define STM32_I2C_BUSY_TIMEOUT              50
+#define STM32_I2C_I2C1_IRQ_PRIORITY         5
+#define STM32_I2C_I2C2_IRQ_PRIORITY         5
+#define STM32_I2C_I2C1_DMA_PRIORITY         3
+#define STM32_I2C_I2C2_DMA_PRIORITY         3
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1                  FALSE
+#define STM32_ICU_USE_TIM2                  FALSE
+#define STM32_ICU_USE_TIM3                  FALSE
+#define STM32_ICU_USE_TIM4                  FALSE
+#define STM32_ICU_USE_TIM5                  FALSE
+#define STM32_ICU_USE_TIM8                  FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY         7
+#define STM32_ICU_TIM2_IRQ_PRIORITY         7
+#define STM32_ICU_TIM3_IRQ_PRIORITY         7
+#define STM32_ICU_TIM4_IRQ_PRIORITY         7
+#define STM32_ICU_TIM5_IRQ_PRIORITY         7
+#define STM32_ICU_TIM8_IRQ_PRIORITY         7
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED              FALSE
+#define STM32_PWM_USE_TIM1                  FALSE
+#define STM32_PWM_USE_TIM2                  FALSE
+#define STM32_PWM_USE_TIM3                  FALSE
+#define STM32_PWM_USE_TIM4                  FALSE
+#define STM32_PWM_USE_TIM5                  FALSE
+#define STM32_PWM_USE_TIM8                  FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY         7
+#define STM32_PWM_TIM2_IRQ_PRIORITY         7
+#define STM32_PWM_TIM3_IRQ_PRIORITY         7
+#define STM32_PWM_TIM4_IRQ_PRIORITY         7
+#define STM32_PWM_TIM5_IRQ_PRIORITY         7
+#define STM32_PWM_TIM8_IRQ_PRIORITY         7
+
+/*
+ * RTC driver system settings.
+ */
+#define STM32_RTC_IRQ_PRIORITY              15
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1             FALSE
+#define STM32_SERIAL_USE_USART2             FALSE
+#define STM32_SERIAL_USE_USART3             FALSE
+#define STM32_SERIAL_USE_UART4              FALSE
+#define STM32_SERIAL_USE_UART5              FALSE
+#define STM32_SERIAL_USART1_PRIORITY        12
+#define STM32_SERIAL_USART2_PRIORITY        12
+#define STM32_SERIAL_USART3_PRIORITY        12
+#define STM32_SERIAL_UART4_PRIORITY         12
+#define STM32_SERIAL_UART5_PRIORITY         12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1                  FALSE
+#define STM32_SPI_USE_SPI2                  FALSE
+#define STM32_SPI_USE_SPI3                  FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY         1
+#define STM32_SPI_SPI2_DMA_PRIORITY         1
+#define STM32_SPI_SPI3_DMA_PRIORITY         1
+#define STM32_SPI_SPI1_IRQ_PRIORITY         10
+#define STM32_SPI_SPI2_IRQ_PRIORITY         10
+#define STM32_SPI_SPI3_IRQ_PRIORITY         10
+#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY               8
+#define STM32_ST_USE_TIMER                  2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1               FALSE
+#define STM32_UART_USE_USART2               FALSE
+#define STM32_UART_USE_USART3               FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY      12
+#define STM32_UART_USART2_IRQ_PRIORITY      12
+#define STM32_UART_USART3_IRQ_PRIORITY      12
+#define STM32_UART_USART1_DMA_PRIORITY      0
+#define STM32_UART_USART2_DMA_PRIORITY      0
+#define STM32_UART_USART3_DMA_PRIORITY      0
+#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1                  TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE
+#define STM32_USB_USB1_HP_IRQ_PRIORITY      13
+#define STM32_USB_USB1_LP_IRQ_PRIORITY      14
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/chibios_test/stm32_f103_onekey/rules.mk b/keyboards/chibios_test/stm32_f103_onekey/rules.mk
new file mode 100644 (file)
index 0000000..307ca5b
--- /dev/null
@@ -0,0 +1,52 @@
+# project specific files
+SRC =  matrix.c \
+           led.c
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+BOARD = GENERIC_STM32_F103
+
+# GENERIC STM32F103C8T6 board - no bootloader (programmer over serial or SWD)
+# OPT_DEFS =
+# MCU_LDSCRIPT = STM32F103x8
+# BOARD = GENERIC_STM32_F103
+
+# MAPLE MINI
+# OPT_DEFS = -DCORTEX_VTOR_INIT=0x5000
+# MCU_LDSCRIPT = STM32F103xB_maplemini_bootloader
+# BOARD = MAPLEMINI_STM32_F103
+
+## chip/board settings
+# the next two should match the directories in
+#  <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F1xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#  or <this_dir>/ld/
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f1xx
+# it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU  = cortex-m3
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
+# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
+# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
+# a custom board definition that you plan to reuse).
+# If you're not setting it here, leave it commented out.
+# It is chip dependent, the correct number can be looked up here (page 175):
+# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+# This also requires a patch to chibios:
+#   <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
+
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
index 43ea9d82d93830d3786e57b76160a2fea1401135..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,49 +1,3 @@
-# project specific files
-SRC =  matrix.c \
-           led.c
-
-## chip/board settings
-# - the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-# - For Teensies, FAMILY = KINETIS and SERIES is either
-#   KL2x (LC) or K20x (3.0,3.1,3.2).
-MCU_FAMILY = KINETIS
-MCU_SERIES = KL2x
-
-# Linker script to use
-# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
-# - LDSCRIPT =
-#   - MKL26Z64 for Teensy LC
-#   - MK20DX128 for Teensy 3.0
-#   - MK20DX256 for Teensy 3.1 and 3.2
-MCU_LDSCRIPT = MKL26Z64
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-# - STARTUP =
-#   - kl2x for Teensy LC
-#   - k20x5 for Teensy 3.0
-#   - k20x7 for Teensy 3.1 and 3.2
-MCU_STARTUP = kl2x
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-# - BOARD =
-#   - PJRC_TEENSY_LC for Teensy LC
-#   - PJRC_TEENSY_3 for Teensy 3.0
-#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
-BOARD = PJRC_TEENSY_LC
-
-# Cortex version
-# Teensy LC is cortex-m0plus; Teensy 3.x are cortex-m4
-MCU  = cortex-m0plus
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-# I.e. 6 for Teensy LC; 7 for Teensy 3.x
-ARMV = 6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
 endif
\ No newline at end of file
index cb36996c33144933b1462787c22248c6dd23b958..3294ac7eeef438ce9137aed5c71f212b6610350f 100644 (file)
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-/**\r
- * @file    templates/chconf.h\r
- * @brief   Configuration file template.\r
- * @details A copy of this file must be placed in each project directory, it\r
- *          contains the application specific kernel settings.\r
- *\r
- * @addtogroup config\r
- * @details Kernel related settings and hooks.\r
- * @{\r
- */\r
-\r
-#ifndef CHCONF_H\r
-#define CHCONF_H\r
-\r
-#define _CHIBIOS_RT_CONF_\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name System timers settings\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   System time counter resolution.\r
- * @note    Allowed values are 16 or 32 bits.\r
- */\r
-#define CH_CFG_ST_RESOLUTION                32\r
-\r
-/**\r
- * @brief   System tick frequency.\r
- * @details Frequency of the system timer that drives the system ticks. This\r
- *          setting also defines the system tick time unit.\r
- */\r
-#define CH_CFG_ST_FREQUENCY                 1000\r
-\r
-/**\r
- * @brief   Time delta constant for the tick-less mode.\r
- * @note    If this value is zero then the system uses the classic\r
- *          periodic tick. This value represents the minimum number\r
- *          of ticks that is safe to specify in a timeout directive.\r
- *          The value one is not valid, timeouts are rounded up to\r
- *          this value.\r
- */\r
-#define CH_CFG_ST_TIMEDELTA                 0\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Kernel parameters and options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Round robin interval.\r
- * @details This constant is the number of system ticks allowed for the\r
- *          threads before preemption occurs. Setting this value to zero\r
- *          disables the preemption for threads with equal priority and the\r
- *          round robin becomes cooperative. Note that higher priority\r
- *          threads can still preempt, the kernel is always preemptive.\r
- * @note    Disabling the round robin preemption makes the kernel more compact\r
- *          and generally faster.\r
- * @note    The round robin preemption is not supported in tickless mode and\r
- *          must be set to zero in that case.\r
- */\r
-#define CH_CFG_TIME_QUANTUM                 20\r
-\r
-/**\r
- * @brief   Managed RAM size.\r
- * @details Size of the RAM area to be managed by the OS. If set to zero\r
- *          then the whole available RAM is used. The core memory is made\r
- *          available to the heap allocator and/or can be used directly through\r
- *          the simplified core memory allocator.\r
- *\r
- * @note    In order to let the OS manage the whole RAM the linker script must\r
- *          provide the @p __heap_base__ and @p __heap_end__ symbols.\r
- * @note    Requires @p CH_CFG_USE_MEMCORE.\r
- */\r
-#define CH_CFG_MEMCORE_SIZE                 0\r
-\r
-/**\r
- * @brief   Idle thread automatic spawn suppression.\r
- * @details When this option is activated the function @p chSysInit()\r
- *          does not spawn the idle thread. The application @p main()\r
- *          function becomes the idle thread and must implement an\r
- *          infinite loop.\r
- */\r
-#define CH_CFG_NO_IDLE_THREAD               FALSE\r
-\r
-/* Use __WFI in the idle thread for waiting. Does lower the power\r
- * consumption. */\r
-#define CORTEX_ENABLE_WFI_IDLE              TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Performance options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   OS optimization.\r
- * @details If enabled then time efficient rather than space efficient code\r
- *          is used when two possible implementations exist.\r
- *\r
- * @note    This is not related to the compiler optimization options.\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_OPTIMIZE_SPEED               TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Subsystem options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Time Measurement APIs.\r
- * @details If enabled then the time measurement APIs are included in\r
- *          the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_TM                       FALSE\r
-\r
-/**\r
- * @brief   Threads registry APIs.\r
- * @details If enabled then the registry APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_REGISTRY                 TRUE\r
-\r
-/**\r
- * @brief   Threads synchronization APIs.\r
- * @details If enabled then the @p chThdWait() function is included in\r
- *          the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_WAITEXIT                 TRUE\r
-\r
-/**\r
- * @brief   Semaphores APIs.\r
- * @details If enabled then the Semaphores APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_SEMAPHORES               TRUE\r
-\r
-/**\r
- * @brief   Semaphores queuing mode.\r
- * @details If enabled then the threads are enqueued on semaphores by\r
- *          priority rather than in FIFO order.\r
- *\r
- * @note    The default is @p FALSE. Enable this if you have special\r
- *          requirements.\r
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.\r
- */\r
-#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE\r
-\r
-/**\r
- * @brief   Mutexes APIs.\r
- * @details If enabled then the mutexes APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MUTEXES                  TRUE\r
-\r
-/**\r
- * @brief   Enables recursive behavior on mutexes.\r
- * @note    Recursive mutexes are heavier and have an increased\r
- *          memory footprint.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    Requires @p CH_CFG_USE_MUTEXES.\r
- */\r
-#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE\r
-\r
-/**\r
- * @brief   Conditional Variables APIs.\r
- * @details If enabled then the conditional variables APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_MUTEXES.\r
- */\r
-#define CH_CFG_USE_CONDVARS                 TRUE\r
-\r
-/**\r
- * @brief   Conditional Variables APIs with timeout.\r
- * @details If enabled then the conditional variables APIs with timeout\r
- *          specification are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_CONDVARS.\r
- */\r
-#define CH_CFG_USE_CONDVARS_TIMEOUT         TRUE\r
-\r
-/**\r
- * @brief   Events Flags APIs.\r
- * @details If enabled then the event flags APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_EVENTS                   TRUE\r
-\r
-/**\r
- * @brief   Events Flags APIs with timeout.\r
- * @details If enabled then the events APIs with timeout specification\r
- *          are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_EVENTS.\r
- */\r
-#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE\r
-\r
-/**\r
- * @brief   Synchronous Messages APIs.\r
- * @details If enabled then the synchronous messages APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MESSAGES                 TRUE\r
-\r
-/**\r
- * @brief   Synchronous Messages queuing mode.\r
- * @details If enabled then messages are served by priority rather than in\r
- *          FIFO order.\r
- *\r
- * @note    The default is @p FALSE. Enable this if you have special\r
- *          requirements.\r
- * @note    Requires @p CH_CFG_USE_MESSAGES.\r
- */\r
-#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE\r
-\r
-/**\r
- * @brief   Mailboxes APIs.\r
- * @details If enabled then the asynchronous messages (mailboxes) APIs are\r
- *          included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.\r
- */\r
-#define CH_CFG_USE_MAILBOXES                TRUE\r
-\r
-/**\r
- * @brief   Core Memory Manager APIs.\r
- * @details If enabled then the core memory manager APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MEMCORE                  TRUE\r
-\r
-/**\r
- * @brief   Heap Allocator APIs.\r
- * @details If enabled then the memory heap allocator APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or\r
- *          @p CH_CFG_USE_SEMAPHORES.\r
- * @note    Mutexes are recommended.\r
- */\r
-#define CH_CFG_USE_HEAP                     TRUE\r
-\r
-/**\r
- * @brief   Memory Pools Allocator APIs.\r
- * @details If enabled then the memory pools allocator APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MEMPOOLS                 TRUE\r
-\r
-/**\r
- * @brief   Dynamic Threads APIs.\r
- * @details If enabled then the dynamic threads creation APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_WAITEXIT.\r
- * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.\r
- */\r
-#define CH_CFG_USE_DYNAMIC                  TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Debug options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Debug option, kernel statistics.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_STATISTICS                   FALSE\r
-\r
-/**\r
- * @brief   Debug option, system state check.\r
- * @details If enabled the correct call protocol for system APIs is checked\r
- *          at runtime.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_SYSTEM_STATE_CHECK           TRUE\r
-\r
-/**\r
- * @brief   Debug option, parameters checks.\r
- * @details If enabled then the checks on the API functions input\r
- *          parameters are activated.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_ENABLE_CHECKS                TRUE\r
-\r
-/**\r
- * @brief   Debug option, consistency checks.\r
- * @details If enabled then all the assertions in the kernel code are\r
- *          activated. This includes consistency checks inside the kernel,\r
- *          runtime anomalies and port-defined checks.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_ENABLE_ASSERTS               TRUE\r
-\r
-/**\r
- * @brief   Debug option, trace buffer.\r
- * @details If enabled then the trace buffer is activated.\r
- *\r
- * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.\r
- */\r
-#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED\r
-\r
-/**\r
- * @brief   Trace buffer entries.\r
- * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is\r
- *          different from @p CH_DBG_TRACE_MASK_DISABLED.\r
- */\r
-#define CH_DBG_TRACE_BUFFER_SIZE            128\r
-\r
-/**\r
- * @brief   Debug option, stack checks.\r
- * @details If enabled then a runtime stack check is performed.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    The stack check is performed in a architecture/port dependent way.\r
- *          It may not be implemented or some ports.\r
- * @note    The default failure mode is to halt the system with the global\r
- *          @p panic_msg variable set to @p NULL.\r
- */\r
-#define CH_DBG_ENABLE_STACK_CHECK           TRUE\r
-\r
-/**\r
- * @brief   Debug option, stacks initialization.\r
- * @details If enabled then the threads working area is filled with a byte\r
- *          value when a thread is created. This can be useful for the\r
- *          runtime measurement of the used stack.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_FILL_THREADS                 TRUE\r
-\r
-/**\r
- * @brief   Debug option, threads profiling.\r
- * @details If enabled then a field is added to the @p thread_t structure that\r
- *          counts the system ticks occurred while executing the thread.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    This debug option is not currently compatible with the\r
- *          tickless mode.\r
- */\r
-#define CH_DBG_THREADS_PROFILING            FALSE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Kernel hooks\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Threads descriptor structure extension.\r
- * @details User fields added to the end of the @p thread_t structure.\r
- */\r
-#define CH_CFG_THREAD_EXTRA_FIELDS                                          \\r
-  /* Add threads custom fields here.*/\r
-\r
-/**\r
- * @brief   Threads initialization hook.\r
- * @details User initialization code added to the @p chThdInit() API.\r
- *\r
- * @note    It is invoked from within @p chThdInit() and implicitly from all\r
- *          the threads creation APIs.\r
- */\r
-#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \\r
-  /* Add threads initialization code here.*/                                \\r
-}\r
-\r
-/**\r
- * @brief   Threads finalization hook.\r
- * @details User finalization code added to the @p chThdExit() API.\r
- */\r
-#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \\r
-  /* Add threads finalization code here.*/                                  \\r
-}\r
-\r
-/**\r
- * @brief   Context switch hook.\r
- * @details This hook is invoked just before switching between threads.\r
- */\r
-#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \\r
-  /* Context switch code here.*/                                            \\r
-}\r
-\r
-/**\r
- * @brief   ISR enter hook.\r
- */\r
-#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \\r
-  /* IRQ prologue code here.*/                                              \\r
-}\r
-\r
-/**\r
- * @brief   ISR exit hook.\r
- */\r
-#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \\r
-  /* IRQ epilogue code here.*/                                              \\r
-}\r
-\r
-/**\r
- * @brief   Idle thread enter hook.\r
- * @note    This hook is invoked within a critical zone, no OS functions\r
- *          should be invoked from here.\r
- * @note    This macro can be used to activate a power saving mode.\r
- */\r
-#define CH_CFG_IDLE_ENTER_HOOK() {                                          \\r
-  /* Idle-enter code here.*/                                                \\r
-}\r
-\r
-/**\r
- * @brief   Idle thread leave hook.\r
- * @note    This hook is invoked within a critical zone, no OS functions\r
- *          should be invoked from here.\r
- * @note    This macro can be used to deactivate a power saving mode.\r
- */\r
-#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \\r
-  /* Idle-leave code here.*/                                                \\r
-}\r
-\r
-/**\r
- * @brief   Idle Loop hook.\r
- * @details This hook is continuously invoked by the idle thread loop.\r
- */\r
-#define CH_CFG_IDLE_LOOP_HOOK() {                                           \\r
-  /* Idle loop code here.*/                                                 \\r
-}\r
-\r
-/**\r
- * @brief   System tick event hook.\r
- * @details This hook is invoked in the system tick handler immediately\r
- *          after processing the virtual timers queue.\r
- */\r
-#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \\r
-  /* System tick event code here.*/                                         \\r
-}\r
-\r
-/**\r
- * @brief   System halt hook.\r
- * @details This hook is invoked in case to a system halting error before\r
- *          the system is halted.\r
- */\r
-#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \\r
-  /* System halt code here.*/                                               \\r
-}\r
-\r
-/**\r
- * @brief   Trace hook.\r
- * @details This hook is invoked each time a new record is written in the\r
- *          trace buffer.\r
- */\r
-#define CH_CFG_TRACE_HOOK(tep) {                                            \\r
-  /* Trace code here.*/                                                     \\r
-}\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/* Port-specific settings (override port settings defaulted in chcore.h).    */\r
-/*===========================================================================*/\r
-\r
-#endif  /* CHCONF_H */\r
-\r
-/** @} */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    templates/chconf.h
+ * @brief   Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ *          contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   System time counter resolution.
+ * @note    Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION                32
+
+/**
+ * @brief   System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ *          setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY                 1000
+
+/**
+ * @brief   Time delta constant for the tick-less mode.
+ * @note    If this value is zero then the system uses the classic
+ *          periodic tick. This value represents the minimum number
+ *          of ticks that is safe to specify in a timeout directive.
+ *          The value one is not valid, timeouts are rounded up to
+ *          this value.
+ */
+#define CH_CFG_ST_TIMEDELTA                 0
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ *          threads before preemption occurs. Setting this value to zero
+ *          disables the preemption for threads with equal priority and the
+ *          round robin becomes cooperative. Note that higher priority
+ *          threads can still preempt, the kernel is always preemptive.
+ * @note    Disabling the round robin preemption makes the kernel more compact
+ *          and generally faster.
+ * @note    The round robin preemption is not supported in tickless mode and
+ *          must be set to zero in that case.
+ */
+#define CH_CFG_TIME_QUANTUM                 20
+
+/**
+ * @brief   Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ *          then the whole available RAM is used. The core memory is made
+ *          available to the heap allocator and/or can be used directly through
+ *          the simplified core memory allocator.
+ *
+ * @note    In order to let the OS manage the whole RAM the linker script must
+ *          provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note    Requires @p CH_CFG_USE_MEMCORE.
+ */
+#define CH_CFG_MEMCORE_SIZE                 0
+
+/**
+ * @brief   Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ *          does not spawn the idle thread. The application @p main()
+ *          function becomes the idle thread and must implement an
+ *          infinite loop.
+ */
+#define CH_CFG_NO_IDLE_THREAD               FALSE
+
+/* Use __WFI in the idle thread for waiting. Does lower the power
+ * consumption. */
+#define CORTEX_ENABLE_WFI_IDLE              TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ *          is used when two possible implementations exist.
+ *
+ * @note    This is not related to the compiler optimization options.
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_OPTIMIZE_SPEED               TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_TM                       FALSE
+
+/**
+ * @brief   Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY                 TRUE
+
+/**
+ * @brief   Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT                 TRUE
+
+/**
+ * @brief   Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES               TRUE
+
+/**
+ * @brief   Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ *          priority rather than in FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE
+
+/**
+ * @brief   Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES                  TRUE
+
+/**
+ * @brief   Enables recursive behavior on mutexes.
+ * @note    Recursive mutexes are heavier and have an increased
+ *          memory footprint.
+ *
+ * @note    The default is @p FALSE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE
+
+/**
+ * @brief   Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#define CH_CFG_USE_CONDVARS                 TRUE
+
+/**
+ * @brief   Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ *          specification are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_CONDVARS.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT         TRUE
+
+/**
+ * @brief   Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS                   TRUE
+
+/**
+ * @brief   Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ *          are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_EVENTS.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE
+
+/**
+ * @brief   Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES                 TRUE
+
+/**
+ * @brief   Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ *          FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_MESSAGES.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE
+
+/**
+ * @brief   Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ *          included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#define CH_CFG_USE_MAILBOXES                TRUE
+
+/**
+ * @brief   Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MEMCORE                  TRUE
+
+/**
+ * @brief   Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ *          @p CH_CFG_USE_SEMAPHORES.
+ * @note    Mutexes are recommended.
+ */
+#define CH_CFG_USE_HEAP                     TRUE
+
+/**
+ * @brief   Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MEMPOOLS                 TRUE
+
+/**
+ * @brief   Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_WAITEXIT.
+ * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#define CH_CFG_USE_DYNAMIC                  TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Debug option, kernel statistics.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS                   FALSE
+
+/**
+ * @brief   Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ *          at runtime.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK           TRUE
+
+/**
+ * @brief   Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ *          parameters are activated.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_ENABLE_CHECKS                TRUE
+
+/**
+ * @brief   Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ *          activated. This includes consistency checks inside the kernel,
+ *          runtime anomalies and port-defined checks.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_ENABLE_ASSERTS               TRUE
+
+/**
+ * @brief   Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @brief   Trace buffer entries.
+ * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ *          different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE            128
+
+/**
+ * @brief   Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note    The default is @p FALSE.
+ * @note    The stack check is performed in a architecture/port dependent way.
+ *          It may not be implemented or some ports.
+ * @note    The default failure mode is to halt the system with the global
+ *          @p panic_msg variable set to @p NULL.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK           TRUE
+
+/**
+ * @brief   Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ *          value when a thread is created. This can be useful for the
+ *          runtime measurement of the used stack.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_FILL_THREADS                 TRUE
+
+/**
+ * @brief   Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ *          counts the system ticks occurred while executing the thread.
+ *
+ * @note    The default is @p FALSE.
+ * @note    This debug option is not currently compatible with the
+ *          tickless mode.
+ */
+#define CH_DBG_THREADS_PROFILING            FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS                                          \
+  /* Add threads custom fields here.*/
+
+/**
+ * @brief   Threads initialization hook.
+ * @details User initialization code added to the @p chThdInit() API.
+ *
+ * @note    It is invoked from within @p chThdInit() and implicitly from all
+ *          the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \
+  /* Add threads initialization code here.*/                                \
+}
+
+/**
+ * @brief   Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \
+  /* Add threads finalization code here.*/                                  \
+}
+
+/**
+ * @brief   Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \
+  /* Context switch code here.*/                                            \
+}
+
+/**
+ * @brief   ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \
+  /* IRQ prologue code here.*/                                              \
+}
+
+/**
+ * @brief   ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \
+  /* IRQ epilogue code here.*/                                              \
+}
+
+/**
+ * @brief   Idle thread enter hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() {                                          \
+  /* Idle-enter code here.*/                                                \
+}
+
+/**
+ * @brief   Idle thread leave hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \
+  /* Idle-leave code here.*/                                                \
+}
+
+/**
+ * @brief   Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() {                                           \
+  /* Idle loop code here.*/                                                 \
+}
+
+/**
+ * @brief   System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ *          after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \
+  /* System tick event code here.*/                                         \
+}
+
+/**
+ * @brief   System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ *          the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \
+  /* System halt code here.*/                                               \
+}
+
+/**
+ * @brief   Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ *          trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) {                                            \
+  /* Trace code here.*/                                                     \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h).    */
+/*===========================================================================*/
+
+#endif  /* CHCONF_H */
+
+/** @} */
index b1d2cd5502a83392452513f462495a3f471a1dbb..0436408b09c67c186ba77ea1d0a5e1bbe6dea0b9 100644 (file)
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-/**\r
- * @file    templates/halconf.h\r
- * @brief   HAL configuration header.\r
- * @details HAL configuration file, this file allows to enable or disable the\r
- *          various device drivers from your application. You may also use\r
- *          this file in order to override the device drivers default settings.\r
- *\r
- * @addtogroup HAL_CONF\r
- * @{\r
- */\r
-\r
-#ifndef _HALCONF_H_\r
-#define _HALCONF_H_\r
-\r
-#include "mcuconf.h"\r
-\r
-/**\r
- * @brief   Enables the PAL subsystem.\r
- */\r
-#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)\r
-#define HAL_USE_PAL                 TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the ADC subsystem.\r
- */\r
-#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)\r
-#define HAL_USE_ADC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the CAN subsystem.\r
- */\r
-#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)\r
-#define HAL_USE_CAN                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the DAC subsystem.\r
- */\r
-#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)\r
-#define HAL_USE_DAC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the EXT subsystem.\r
- */\r
-#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)\r
-#define HAL_USE_EXT                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the GPT subsystem.\r
- */\r
-#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)\r
-#define HAL_USE_GPT                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the I2C subsystem.\r
- */\r
-#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)\r
-#define HAL_USE_I2C                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the I2S subsystem.\r
- */\r
-#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)\r
-#define HAL_USE_I2S                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the ICU subsystem.\r
- */\r
-#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)\r
-#define HAL_USE_ICU                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the MAC subsystem.\r
- */\r
-#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)\r
-#define HAL_USE_MAC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the MMC_SPI subsystem.\r
- */\r
-#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)\r
-#define HAL_USE_MMC_SPI             FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the PWM subsystem.\r
- */\r
-#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)\r
-#define HAL_USE_PWM                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the RTC subsystem.\r
- */\r
-#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)\r
-#define HAL_USE_RTC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SDC subsystem.\r
- */\r
-#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)\r
-#define HAL_USE_SDC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SERIAL subsystem.\r
- */\r
-#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)\r
-#define HAL_USE_SERIAL              FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SERIAL over USB subsystem.\r
- */\r
-#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)\r
-#define HAL_USE_SERIAL_USB          FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SPI subsystem.\r
- */\r
-#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)\r
-#define HAL_USE_SPI                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the UART subsystem.\r
- */\r
-#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)\r
-#define HAL_USE_UART                FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the USB subsystem.\r
- */\r
-#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)\r
-#define HAL_USE_USB                 TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the WDG subsystem.\r
- */\r
-#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)\r
-#define HAL_USE_WDG                 FALSE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* USB driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables synchronous APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)\r
-#define USB_USE_WAIT                TRUE\r
-#endif\r
-\r
-#endif /* _HALCONF_H_ */\r
-\r
-/** @} */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    templates/halconf.h
+ * @brief   HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ *          various device drivers from your application. You may also use
+ *          this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef _HALCONF_H_
+#define _HALCONF_H_
+
+#include "mcuconf.h"
+
+/**
+ * @brief   Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL                 TRUE
+#endif
+
+/**
+ * @brief   Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN                 FALSE
+#endif
+
+/**
+ * @brief   Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT                 FALSE
+#endif
+
+/**
+ * @brief   Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT                 FALSE
+#endif
+
+/**
+ * @brief   Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C                 FALSE
+#endif
+
+/**
+ * @brief   Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S                 FALSE
+#endif
+
+/**
+ * @brief   Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU                 FALSE
+#endif
+
+/**
+ * @brief   Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI             FALSE
+#endif
+
+/**
+ * @brief   Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM                 FALSE
+#endif
+
+/**
+ * @brief   Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL              FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB          FALSE
+#endif
+
+/**
+ * @brief   Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI                 FALSE
+#endif
+
+/**
+ * @brief   Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART                FALSE
+#endif
+
+/**
+ * @brief   Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB                 TRUE
+#endif
+
+/**
+ * @brief   Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG                 FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT                TRUE
+#endif
+
+#endif /* _HALCONF_H_ */
+
+/** @} */
index c636590197be92908698e8375b3c316817acaeb6..2764e88989c1889ad18956b1469f50c1aa0bb9f4 100644 (file)
@@ -1,55 +1,55 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#ifndef _MCUCONF_H_\r
-#define _MCUCONF_H_\r
-\r
-#define KL2x_MCUCONF\r
-\r
-/*\r
- * HAL driver system settings.\r
- */\r
-#if 1\r
-/* PEE mode - 48MHz system clock driven by (16 MHz) external crystal. */\r
-#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_PEE\r
-#define KINETIS_PLLCLK_FREQUENCY    96000000UL\r
-#define KINETIS_SYSCLK_FREQUENCY    48000000UL\r
-#endif\r
-\r
-#if 0\r
-/* crystal-less FEI mode - 48 MHz with internal 32.768 kHz crystal */\r
-#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_FEI\r
-#define KINETIS_MCG_FLL_DMX32       1           /* Fine-tune for 32.768 kHz */\r
-#define KINETIS_MCG_FLL_DRS         1           /* 1464x FLL factor */\r
-#define KINETIS_SYSCLK_FREQUENCY    47972352UL  /* 32.768 kHz * 1464 (~48 MHz) */\r
-#define KINETIS_CLKDIV1_OUTDIV1     1           /* do not divide system clock */\r
-#endif\r
-\r
-/*\r
- * SERIAL driver system settings.\r
- */\r
-#define KINETIS_SERIAL_USE_UART0              TRUE\r
-\r
-/*\r
- * USB driver settings\r
- */\r
-#define KINETIS_USB_USE_USB0                  TRUE\r
-/* Need to redefine this, since the default is for K20x */\r
-/* This is for Teensy LC; you should comment it out (or change to 5)\r
- * for Teensy 3.x */\r
-#define KINETIS_USB_USB0_IRQ_PRIORITY         2\r
-\r
-#endif /* _MCUCONF_H_ */\r
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#define KL2x_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#if 1
+/* PEE mode - 48MHz system clock driven by (16 MHz) external crystal. */
+#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_PEE
+#define KINETIS_PLLCLK_FREQUENCY    96000000UL
+#define KINETIS_SYSCLK_FREQUENCY    48000000UL
+#endif
+
+#if 0
+/* crystal-less FEI mode - 48 MHz with internal 32.768 kHz crystal */
+#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_FEI
+#define KINETIS_MCG_FLL_DMX32       1           /* Fine-tune for 32.768 kHz */
+#define KINETIS_MCG_FLL_DRS         1           /* 1464x FLL factor */
+#define KINETIS_SYSCLK_FREQUENCY    47972352UL  /* 32.768 kHz * 1464 (~48 MHz) */
+#define KINETIS_CLKDIV1_OUTDIV1     1           /* do not divide system clock */
+#endif
+
+/*
+ * SERIAL driver system settings.
+ */
+#define KINETIS_SERIAL_USE_UART0              TRUE
+
+/*
+ * USB driver settings
+ */
+#define KINETIS_USB_USE_USB0                  TRUE
+/* Need to redefine this, since the default is for K20x */
+/* This is for Teensy LC; you should comment it out (or change to 5)
+ * for Teensy 3.x */
+#define KINETIS_USB_USB0_IRQ_PRIORITY         2
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/chibios_test/teensy_lc_onekey/rules.mk b/keyboards/chibios_test/teensy_lc_onekey/rules.mk
new file mode 100644 (file)
index 0000000..43ea9d8
--- /dev/null
@@ -0,0 +1,49 @@
+# project specific files
+SRC =  matrix.c \
+           led.c
+
+## chip/board settings
+# - the next two should match the directories in
+#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+# - For Teensies, FAMILY = KINETIS and SERIES is either
+#   KL2x (LC) or K20x (3.0,3.1,3.2).
+MCU_FAMILY = KINETIS
+MCU_SERIES = KL2x
+
+# Linker script to use
+# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#   or <this_dir>/ld/
+# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
+# - LDSCRIPT =
+#   - MKL26Z64 for Teensy LC
+#   - MK20DX128 for Teensy 3.0
+#   - MK20DX256 for Teensy 3.1 and 3.2
+MCU_LDSCRIPT = MKL26Z64
+
+# Startup code to use
+#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+# - STARTUP =
+#   - kl2x for Teensy LC
+#   - k20x5 for Teensy 3.0
+#   - k20x7 for Teensy 3.1 and 3.2
+MCU_STARTUP = kl2x
+
+# Board: it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+# - BOARD =
+#   - PJRC_TEENSY_LC for Teensy LC
+#   - PJRC_TEENSY_3 for Teensy 3.0
+#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
+BOARD = PJRC_TEENSY_LC
+
+# Cortex version
+# Teensy LC is cortex-m0plus; Teensy 3.x are cortex-m4
+MCU  = cortex-m0plus
+
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+# I.e. 6 for Teensy LC; 7 for Teensy 3.x
+ARMV = 6
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
\ No newline at end of file
index e6b13f955abe4438937801760515b7a6c8cbfa6b..b9bada8f8d73aa3a06f9f27ca37f0129e4c19728 100644 (file)
@@ -1,109 +1,5 @@
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device.
-#                Please customize your programmer settings(PROGRAM_CMD)
-#
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-#               (must have teensy_loader_cli installed).
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-#            have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-#             have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-#               (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-#                (must have Atmel FLIP installed).
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-#              with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-#                   bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
 SUBPROJECT_DEFAULT = rev2
 
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change to no to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-AUDIO_ENABLE ?= no
-RGBLIGHT_ENABLE ?= no   # Enable keyboard underlight functionality
-MIDI_ENABLE ?= no              # MIDI controls
-UNICODE_ENABLE ?= no           # Unicode
-BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
index 6c29c09eca23a6c9e6c3763d0d4bf81f0ccb81cb..4a76e2908c5e76615bd95ae8d0de707e2d75a31c 100644 (file)
@@ -31,36 +31,36 @@ If you would like to use one of the alternative keymaps, or create your own, see
 
 ## Clueboard 1.0
 
-If you have a first generation Clueboard (one with a black PCB) you will need to use the revision 1 code. To do so add `SUBPROJECT=rev1` to your make command, like this:
+If you have a first generation Clueboard (one with a black PCB) you will need to use the revision 1 code. To do so add `rev1` to your make command, like this:
 
 ```
-$ make SUBPROJECT=rev1
+$ make rev1
 ```
 
 And when flashing your keyboard:
 
 ```
-$ make SUBPROJECT=rev1 dfu
+$ make rev1-dfu
 ```
 
-If you are flashing an alternative layout to your rev1, include both `SUBPROJECT=rev1` and `KEYMAP=<keymap>` in your command, for example when flashing max:
+If you are flashing an alternative layout to your rev1, include both `rev1` and `<keymap>` in your command, for example when flashing max:
 
 ```
-$ make SUBPROJECT=rev1 KEYMAP=max dfu
+$ make rev1-max-dfu
 ```
 
 ## Alternate Keymaps
 
-There are many alternative and user-contributed layouts available in the [keymaps/](keymaps/) directory. To compile and flash an alternative you will want to add `KEYMAP=<keymap>` to your command:
+There are many alternative and user-contributed layouts available in the [keymaps/](keymaps/) directory. To compile and flash an alternative you will want to add `<keymap>` to your command:
 
 ```
-$ make KEYMAP=skully
+$ make skully
 ```
 
-And when flashing your keyboard, put `KEYMAP=<keymap>` between "make" and "dfu":
+And when flashing your keyboard, put `<keymap>` between "make" and "dfu":
 
 ```
-$ make KEYMAP=skully dfu
+$ make skully-dfu
 ```
 
 ### Notable Layouts
@@ -76,15 +76,15 @@ These layouts are notable for one reason or another. If you are looking for idea
 There are a lot of possibilities when creating your own keymap, and the primary documentation for doing that is [Customizing Your Keymap](/readme.md##customizing-your-keymap) in the main readme.md. As a way to get started, here is the procedure I recommend:
 
 * Copy `[keymaps/default](keymaps/default/)` to `keymaps/<your_layout>`.
-* Compile the firmware (`$ make KEYMAP=<your_layout>`)
-* Flash the firmware (`$ make KEYMAP=<your_layout> dfu`)
+* Compile the firmware (`$ make <your_layout>`)
+* Flash the firmware (`$ make <your_layout>-dfu`)
 * Make sure everything works like the default keyboard
 * Modify `keymaps/<your_layout>/readme.md` to tell others about your layout.
 * Modify `keymaps/<your_layout>/keymap.c` to reflect your desired layout.
-* Compile your new custom firmware (`$ make KEYMAP=<your_layout>`)
+* Compile your new custom firmware (`$ make <your_layout>`)
 ** If you have warnings you may flash without fixing them, but something may not work right.
 ** If you have any errors you must fix them before continuing.
-* Flash the firmware (`$ make KEYMAP=<your_layout> dfu`)
+* Flash the firmware (`$ make <your_layout>-dfu`)
 
 ## Share Your Keymap
 
index 80a942d06f7cc35dc8abf7a43d371a2381a84204..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,5 +1,3 @@
-BACKLIGHT_ENABLE = no
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/clueboard/rev1/rules.mk b/keyboards/clueboard/rev1/rules.mk
new file mode 100644 (file)
index 0000000..80a942d
--- /dev/null
@@ -0,0 +1,5 @@
+BACKLIGHT_ENABLE = no
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
index cea967b7955c7958daea51ae2380494d782922fc..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,5 +1,3 @@
-BACKLIGHT_ENABLE = yes
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/clueboard/rev2/rules.mk b/keyboards/clueboard/rev2/rules.mk
new file mode 100644 (file)
index 0000000..cea967b
--- /dev/null
@@ -0,0 +1,5 @@
+BACKLIGHT_ENABLE = yes
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
diff --git a/keyboards/clueboard/rules.mk b/keyboards/clueboard/rules.mk
new file mode 100644 (file)
index 0000000..3909fbd
--- /dev/null
@@ -0,0 +1,103 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+AUDIO_ENABLE ?= no
+RGBLIGHT_ENABLE ?= no   # Enable keyboard underlight functionality
+MIDI_ENABLE ?= no              # MIDI controls
+UNICODE_ENABLE ?= no           # Unicode
+BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
\ No newline at end of file
index 029d0b96700a70c62131a8263e1546bdf9eea1a0..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,76 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-RGBLIGHT_ENABLE ?= yes       # Enable keyboard underlight functionality (+4870)
-BACKLIGHT_ENABLE ?= yes       # Enable keyboard backlight functionality by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= yes           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
index ae1afbbfddb179364ca070adab7e512430100edf..be13fc01713cbb21b1c52e653a9addee55358d6f 100644 (file)
@@ -13,16 +13,16 @@ Depending on which keymap you would like to use, you will have to compile slight
 
 ### Default
 
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
 ```
-$ make keymap=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 
 Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
diff --git a/keyboards/cluecard/rules.mk b/keyboards/cluecard/rules.mk
new file mode 100644 (file)
index 0000000..4542358
--- /dev/null
@@ -0,0 +1,70 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+RGBLIGHT_ENABLE ?= yes       # Enable keyboard underlight functionality (+4870)
+BACKLIGHT_ENABLE ?= yes       # Enable keyboard backlight functionality by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= yes           # Audio output on port C6
index a331ff4dcd97b9a66fa8ddc990f1f89529459ca4..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,70 +1,3 @@
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-# MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-# EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-# CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-# COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= yes  # Enable numpad's backlight functionality
-RGBLIGHT_ENABLE ?= yes
-# MIDI_ENABLE ?= YES           # MIDI controls
-# UNICODE_ENABLE ?= YES                # Unicode
-# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/cluepad/rules.mk b/keyboards/cluepad/rules.mk
new file mode 100644 (file)
index 0000000..19b16b9
--- /dev/null
@@ -0,0 +1,65 @@
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+# MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+# EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+# CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+# COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= yes  # Enable numpad's backlight functionality
+RGBLIGHT_ENABLE ?= yes
+# MIDI_ENABLE ?= YES           # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
\ No newline at end of file
index 05fb588d110b8333bd6da8eb23eaf3b2fda34e4a..7165350050a6296d0f6cfec18d16b7341b051cda 100644 (file)
@@ -1,34 +1,5 @@
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make = Make software.
-#
-# make clean = Clean out built project files.
-#
-# That's pretty much all you need. To compile, always go make clean, 
-# followed by make.
-#
-# For advanced users only:
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-#               (must have teensy_loader_cli installed).
-#
-#----------------------------------------------------------------------------
 SUBPROJECT_DEFAULT = ez
 
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= no  # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE  ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE  ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE   ?= no  # Console for debug(+400)
-COMMAND_ENABLE   ?= yes # Commands for debug and configuration
-CUSTOM_MATRIX    ?= yes # Custom matrix file for the ErgoDox EZ
-SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE      ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-MIDI_ENABLE      ?= no  # MIDI controls
-UNICODE_ENABLE   ?= yes # Unicode
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c88c1ad8909fcd579480a5e8ca5a41eb00cad6a2 100644 (file)
@@ -0,0 +1,24 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+
+// swap-hands action needs a matrix to define the swap
+const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
+    /* Left hand, matrix positions */
+    {{0,13}, {1,13}, {2,13}, {3,13}, {4,13}, {5,13}},
+    {{0,12}, {1,12}, {2,12}, {3,12}, {4,12}, {5,12}},
+    {{0,11}, {1,11}, {2,11}, {3,11}, {4,11}, {5,11}},
+    {{0,10}, {1,10}, {2,10}, {3,10}, {4,10}, {5,10}},
+    {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}},
+    {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}},
+    {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}},
+    /* Right hand, matrix positions */
+    {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}},
+    {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}},
+    {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
+    {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}},
+    {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}},
+    {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}},
+    {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}},
+};
+
index 37e554b30457804a43576c2c13856f5ab6ee35dc..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,76 +1,3 @@
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make = Make software.
-#
-# make clean = Clean out built project files.
-#
-# That's pretty much all you need. To compile, always go make clean, 
-# followed by make.
-#
-# For advanced users only:
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-#               (must have teensy_loader_cli installed).
-#
-#----------------------------------------------------------------------------
-
-# # project specific files
-SRC = twimaster.c \
-         matrix.c
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   comment out to disable the options.
-#
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
+endif
\ No newline at end of file
index db4ec867bc79c2c54c27b9cd5b82e88aaad5c8f5..124bf850e787eeadc120f6b5fd32170cf33c14d4 100644 (file)
@@ -119,4 +119,45 @@ inline void ergodox_led_all_set(uint8_t n)
     { k0D, k1D, k2D, k3D, k4D, KC_NO }    \
    }
 
+#define KEYMAP_80(                                              \
+                                                                \
+    /* left hand, spatial positions */                          \
+    k00,k01,k02,k03,k04,k05,k06,                                \
+    k10,k11,k12,k13,k14,k15,k16,                                \
+    k20,k21,k22,k23,k24,k25,                                    \
+    k30,k31,k32,k33,k34,k35,k36,                                \
+    k40,k41,k42,k43,k44,                                        \
+                            k55,k56,                            \
+                        k45,k46,k54,                            \
+                        k53,k52,k51,                            \
+                                                                \
+    /* right hand, spatial positions */                         \
+        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
+        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
+            k28,k29,k2A,k2B,k2C,k2D,                            \
+        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
+                k49,k4A,k4B,k4C,k4D,                            \
+    k57,k58,                                                    \
+    k59,k47,k48,                                                \
+    k5C,k5B,k5A )                                               \
+                                                                \
+   /* matrix positions */                                       \
+   {                                                            \
+    { k00, k10, k20, k30, k40, KC_NO },   \
+    { k01, k11, k21, k31, k41, k51 },   \
+    { k02, k12, k22, k32, k42, k52 },   \
+    { k03, k13, k23, k33, k43, k53 },   \
+    { k04, k14, k24, k34, k44, k54 },   \
+    { k05, k15, k25, k35, k45, k55 },   \
+    { k06, k16, KC_NO, k36, k46, k56 },   \
+                                                                 \
+    { k07, k17, KC_NO, k37, k47, k57 },   \
+    { k08, k18, k28, k38, k48, k58 },   \
+    { k09, k19, k29, k39, k49, k59 },   \
+    { k0A, k1A, k2A, k3A, k4A, k5A },   \
+    { k0B, k1B, k2B, k3B, k4B, k5B },   \
+    { k0C, k1C, k2C, k3C, k4C, k5C },   \
+    { k0D, k1D, k2D, k3D, k4D, KC_NO }    \
+   }
+
 #endif
diff --git a/keyboards/ergodox/ez/keymaps/profet_80/ergodox80.png b/keyboards/ergodox/ez/keymaps/profet_80/ergodox80.png
new file mode 100644 (file)
index 0000000..66b9752
Binary files /dev/null and b/keyboards/ergodox/ez/keymaps/profet_80/ergodox80.png differ
diff --git a/keyboards/ergodox/ez/keymaps/profet_80/keymap.c b/keyboards/ergodox/ez/keymaps/profet_80/keymap.c
new file mode 100644 (file)
index 0000000..505ff29
--- /dev/null
@@ -0,0 +1,183 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|' / Cmd |
+ * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
+ * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |  1   |  2   | Home |       | PgUp |   3    |   4  |
+ *                                 |------|------|------|       |------|--------|------|
+ *                                 | Space| BkSp | End  |       | PgDn |  Tab   |Enter |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP_80(  // layer 0 : default
+        // left hand
+        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
+        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
+        KC_BSPC,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
+        KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
+        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
+                                              ALT_T(KC_APP),  KC_LGUI,
+                                               KC_1,  KC_2,   KC_HOME,
+                                               KC_SPC,KC_BSPC,KC_END,
+        // right hand
+             KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
+             TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
+                          KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
+             MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
+                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
+             KC_LALT,        CTL_T(KC_ESC),
+             KC_PGUP,KC_3,   KC_4,
+             KC_PGDN,KC_TAB, KC_ENT
+    ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |Version |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |------|------|------|       |------|------|------|
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP_80(
+       // left hand
+       M(0),   KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+                                       KC_TRNS,KC_TRNS,
+                               KC_TRNS,KC_TRNS,KC_TRNS,
+                               KC_TRNS,KC_TRNS,KC_TRNS,
+       // right hand
+       KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
+       KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    KC_ASTR, KC_F12,
+                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_PLUS, KC_TRNS,
+       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
+                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+----------.
+ *                                 |      |      |      |       |      |      |          |
+ *                                 |------|------|------|       |------|------|----------|
+ *                                 |      |      |      |       |      |      |BrwserBack|
+ *                                 `--------------------'       `------------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = KEYMAP_80(
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+                                           KC_TRNS, KC_TRNS,
+                                                                 KC_TRNS, KC_TRNS, KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
+    // right hand
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+                          KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+        if (record->event.pressed) {
+          SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+        }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboards/ergodox/ez/keymaps/profet_80/readme.md b/keyboards/ergodox/ez/keymaps/profet_80/readme.md
new file mode 100644 (file)
index 0000000..b6bbb86
--- /dev/null
@@ -0,0 +1,10 @@
+# ErgoDox 80 Default Configuration
+
+This is based on the default Ergodox EZ keymap.
+The difference is that this keymap supports 80 key layouts.
+If you own an 80 key Ergodox, use this as an example to get your desired keymap.
+
+**NOTE:** This layout is not physically supported by the Ergodox EZ.
+
+
+![Default80](ergodox80.png)
diff --git a/keyboards/ergodox/ez/rules.mk b/keyboards/ergodox/ez/rules.mk
new file mode 100644 (file)
index 0000000..a9715be
--- /dev/null
@@ -0,0 +1,78 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make = Make software.
+#
+# make clean = Clean out built project files.
+#
+# That's pretty much all you need. To compile, always go make clean, 
+# followed by make.
+#
+# For advanced users only:
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+#----------------------------------------------------------------------------
+
+# # project specific files
+SRC = twimaster.c \
+         matrix.c
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   comment out to disable the options.
+#
+
+SLEEP_LED_ENABLE = no
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
index ccb735a485beede2222294951d429ab0e754dc79..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,77 +1,3 @@
-# project specific files
-SRC =  matrix.c \
-       led.c
-
-## chip/board settings
-# - the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-# - For Teensies, FAMILY = KINETIS and SERIES is either
-#   KL2x (LC) or K20x (3.0,3.1,3.2).
-# - For Infinity KB, SERIES = K20x
-MCU_FAMILY = KINETIS
-MCU_SERIES = K20x
-
-# Linker script to use
-# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
-# - LDSCRIPT =
-#   - MKL26Z64 for Teensy LC
-#   - MK20DX128 for Teensy 3.0
-#   - MK20DX256 for Teensy 3.1 and 3.2
-#   - MK20DX128BLDR4 for Infinity 60% with Kiibohd bootloader
-#   - MK20DX256BLDR8 for Infinity ErgoDox with Kiibohd bootloader
-MCU_LDSCRIPT = MK20DX256BLDR8
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-# - STARTUP =
-#   - kl2x for Teensy LC
-#   - k20x5 for Teensy 3.0 and Infinity 60%
-#   - k20x7 for Teensy 3.1, 3.2 and Infinity ErgoDox
-MCU_STARTUP = k20x7
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-# - BOARD =
-#   - PJRC_TEENSY_LC for Teensy LC
-#   - PJRC_TEENSY_3 for Teensy 3.0
-#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
-#   - MCHCK_K20 for Infinity KB
-#BOARD = MCHCK_K20
-BOARD = PJRC_TEENSY_3_1
-
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-# I.e. 6 for Teensy LC; 7 for Teensy 3.x
-ARMV = 7
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-OPT_DEFS += -DCORTEX_VTOR_INIT=0x00002000
-
-# Build Options
-#   comment out to disable the options.
-#
-CUSTOM_MATRIX ?= yes # Custom matrix file
-SERIAL_LINK_ENABLE = yes
-VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile
-LCD_ENABLE ?= yes
-LED_ENABLE ?= yes
-LCD_BACKLIGHT_ENABLE ?= yes
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
-
-ifdef LCD_ENABLE
-include $(SUBPROJECT_PATH)/drivers/gdisp/st7565ergodox/driver.mk
-endif
-
-ifdef LED_ENABLE
-include $(SUBPROJECT_PATH)/drivers/gdisp/IS31FL3731C/driver.mk
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk
new file mode 100644 (file)
index 0000000..ccb735a
--- /dev/null
@@ -0,0 +1,77 @@
+# project specific files
+SRC =  matrix.c \
+       led.c
+
+## chip/board settings
+# - the next two should match the directories in
+#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+# - For Teensies, FAMILY = KINETIS and SERIES is either
+#   KL2x (LC) or K20x (3.0,3.1,3.2).
+# - For Infinity KB, SERIES = K20x
+MCU_FAMILY = KINETIS
+MCU_SERIES = K20x
+
+# Linker script to use
+# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#   or <this_dir>/ld/
+# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
+# - LDSCRIPT =
+#   - MKL26Z64 for Teensy LC
+#   - MK20DX128 for Teensy 3.0
+#   - MK20DX256 for Teensy 3.1 and 3.2
+#   - MK20DX128BLDR4 for Infinity 60% with Kiibohd bootloader
+#   - MK20DX256BLDR8 for Infinity ErgoDox with Kiibohd bootloader
+MCU_LDSCRIPT = MK20DX256BLDR8
+
+# Startup code to use
+#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+# - STARTUP =
+#   - kl2x for Teensy LC
+#   - k20x5 for Teensy 3.0 and Infinity 60%
+#   - k20x7 for Teensy 3.1, 3.2 and Infinity ErgoDox
+MCU_STARTUP = k20x7
+
+# Board: it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+# - BOARD =
+#   - PJRC_TEENSY_LC for Teensy LC
+#   - PJRC_TEENSY_3 for Teensy 3.0
+#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
+#   - MCHCK_K20 for Infinity KB
+#BOARD = MCHCK_K20
+BOARD = PJRC_TEENSY_3_1
+
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU  = cortex-m4
+
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+# I.e. 6 for Teensy LC; 7 for Teensy 3.x
+ARMV = 7
+
+# Vector table for application
+# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
+# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
+OPT_DEFS += -DCORTEX_VTOR_INIT=0x00002000
+
+# Build Options
+#   comment out to disable the options.
+#
+CUSTOM_MATRIX ?= yes # Custom matrix file
+SERIAL_LINK_ENABLE = yes
+VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile
+LCD_ENABLE ?= yes
+LED_ENABLE ?= yes
+LCD_BACKLIGHT_ENABLE ?= yes
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
+
+ifdef LCD_ENABLE
+include $(SUBPROJECT_PATH)/drivers/gdisp/st7565ergodox/driver.mk
+endif
+
+ifdef LED_ENABLE
+include $(SUBPROJECT_PATH)/drivers/gdisp/IS31FL3731C/driver.mk
+endif
diff --git a/keyboards/ergodox/keymaps/absenth/absenth_highres.png b/keyboards/ergodox/keymaps/absenth/absenth_highres.png
new file mode 100644 (file)
index 0000000..c07aa88
Binary files /dev/null and b/keyboards/ergodox/keymaps/absenth/absenth_highres.png differ
diff --git a/keyboards/ergodox/keymaps/absenth/keymap.c b/keyboards/ergodox/keymaps/absenth/keymap.c
new file mode 100644 (file)
index 0000000..ded668e
--- /dev/null
@@ -0,0 +1,183 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "version.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | BkSp   | A/L2 |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|' / Cmd |
+ * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
+ * | LS/PO  |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RS/PC  |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      | Home |       | PgUp |        |      |
+ *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
+ *                                 |      |ace   | End  |       | PgDn |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
+        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
+        KC_BSPC,        LT(MDIA, KC_A),         KC_S,   KC_D,   KC_F,   KC_G,
+        KC_LSPO,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
+        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
+                                              ALT_T(KC_APP),  KC_LGUI,
+                                                              KC_HOME,
+                                               KC_SPC,KC_BSPC,KC_END,
+        // right hand
+             KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
+             TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
+                          KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
+             MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSPC,
+                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
+             KC_LALT,        CTL_T(KC_ESC),
+             KC_PGUP,
+             KC_PGDN,KC_TAB, KC_ENT
+    ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |Version |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+       // left hand
+       M(0),   KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+                                       KC_TRNS,KC_TRNS,
+                                               KC_TRNS,
+                               KC_TRNS,KC_TRNS,KC_TRNS,
+       // right hand
+       KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
+       KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    KC_ASTR, KC_F12,
+                KC_DOWN, KC_4,   KC_5,    KC_6,    KC_PLUS, KC_TRNS,
+       KC_TRNS, KC_AMPR, KC_1,   KC_2,    KC_3,    KC_BSLS, KC_TRNS,
+                         KC_TRNS,KC_DOT,  KC_0,    KC_EQL,  KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |MsLeft|MsDown|MsRght|      |------|           |------| left | down |  up  | down |      |  Play  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |Brwser|
+ *                                 | Lclk | Rclk |------|       |------|      |Back  |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = KEYMAP(
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_BTN1, KC_BTN2, KC_TRNS,
+    // right hand
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                 KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,KC_TRNS, KC_MPLY,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+                          KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+        if (record->event.pressed) {
+          SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+        }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboards/ergodox/keymaps/absenth/readme.md b/keyboards/ergodox/keymaps/absenth/readme.md
new file mode 100644 (file)
index 0000000..0c04bf4
--- /dev/null
@@ -0,0 +1,11 @@
+# ErgoDox EZ Absenth Configuration
+
+## Changelog
+
+
+* Sept. 14, 2016 (V0.2):
+  * Added Space Cadet to Left and Right Shift.  Pressing Left shift with no other key adds an "(" and pressing Right shift with no other key adds an ")"
+* Sept. 8, 2016 (V0.1): 
+  * Made A key double as MEDIA Layer change when you hold it.  Added mouse buttons to the large thumb buttons on the left side on the Media Layer.  Added vi/vim style arrow keys on HJKL on media layer.
+
+![Absenth](absenth_highres.png)
index 00194857ac30f284826d371c3b16f8ada1be8448..699add3ddafd3fcda0b51083a4b2f6fcfb73b3c3 100644 (file)
@@ -1,22 +1,23 @@
 BOOTMAGIC_ENABLE=no
 COMMAND_ENABLE=no
 SLEEP_LED_ENABLE=no
-UNICODE_ENABLE=no
 FORCE_NKRO ?= yes
 DEBUG_ENABLE = no
 CONSOLE_ENABLE = no
 TAP_DANCE_ENABLE = yes
 KEYLOGGER_ENABLE ?= yes
+UCIS_ENABLE = yes
+MOUSEKEY_ENABLE = no
 
-ADORE_AUTOLOG ?= no
+AUTOLOG_ENABLE ?= no
 
 ifeq (${FORCE_NKRO},yes)
 OPT_DEFS += -DFORCE_NKRO
 endif
 
-ifeq (${ADORE_AUTOLOG},yes)
+ifeq (${AUTOLOG_ENABLE},yes)
 KEYLOGGER_ENABLE = yes
-OPT_DEFS += -DADORE_AUTOLOG
+OPT_DEFS += -DAUTOLOG_ENABLE
 endif
 
 ifeq (${KEYLOGGER_ENABLE},yes)
@@ -24,6 +25,8 @@ OPT_DEFS += -DKEYLOGGER_ENABLE
 CONSOLE_ENABLE = yes
 endif
 
+OPT_DEFS += -DUSER_PRINT
+
 KEYMAP_VERSION = $(shell \
  if [ -d "${KEYMAP_PATH}/.git" ]; then \
   cd "${KEYMAP_PATH}" && git describe --abbrev=6 --dirty --always --tags --match 'v*' 2>/dev/null; \
index 44ad8a1eb7560b552aa6010b2051fcabb00f01cd..b611fbc42a702ac135e9fa870aa664c8386a4f68 100644 (file)
Binary files a/keyboards/ergodox/keymaps/algernon/images/adore-layer.png and b/keyboards/ergodox/keymaps/algernon/images/adore-layer.png differ
index da159fbe2ec5e8e084fee3b9ae934b8c1f5aadab..2a981a4706c6cb719c05f95a9b476f781d1c2294 100644 (file)
Binary files a/keyboards/ergodox/keymaps/algernon/images/base-layer.png and b/keyboards/ergodox/keymaps/algernon/images/base-layer.png differ
index 356035e0a60a9307ce6fe81f36cde97a3bd84071..4f55c5adff5703a3b61ac5198694375ad49a405b 100644 (file)
Binary files a/keyboards/ergodox/keymaps/algernon/images/heatmap.png and b/keyboards/ergodox/keymaps/algernon/images/heatmap.png differ
index 144030e2e98e5bca7a555c3b581331315872e73d..248a0ed303ad91af93c02070a7d4249c3c741ac1 100644 (file)
@@ -2,12 +2,12 @@
  * algernon's ErgoDox EZ layout, please see the readme.md file!
  */
 
+#include <stdarg.h>
 #include "ergodox.h"
 #include "led.h"
 #include "debug.h"
 #include "action_layer.h"
 #include "action_util.h"
-#include "mousekey.h"
 #include "timer.h"
 #include "keymap_plover.h"
 #include "eeconfig.h"
@@ -33,22 +33,8 @@ enum {
   // Buttons that do extra stuff
   A_GUI,
   A_PLVR,
-  A_ESC,
   A_MPN,
 
-  // Function / number keys
-  KF_1, // 1, F1
-  KF_2, // 2, F2
-  KF_3, // ...
-  KF_4,
-  KF_5,
-  KF_6,
-  KF_7,
-  KF_8,
-  KF_9,
-  KF_10,
-  KF_11, // =, F11
-
   // Application select keys
   APP_SLK, // Slack
   APP_EMCS, // Emacs
@@ -56,12 +42,6 @@ enum {
   APP_CHRM, // Chrome
   APP_MSIC, // Music
 
-  // Diagonal mouse movement
-  A_MUL,
-  A_MUR,
-  A_MDL,
-  A_MDR,
-
   // Hungarian layer keys
   HU_AA, // Á
   HU_OO, // Ó
@@ -72,6 +52,18 @@ enum {
   HU_UE, // Ü
   HU_OEE, // Ő
   HU_UEE, // Ű
+
+  // number/symbol keys
+  A_1, // 1
+  A_2, // 2
+  A_3, // ...
+  A_4,
+  A_5,
+  A_6,
+  A_7,
+  A_8,
+  A_9,
+  A_0,
 };
 
 /* Fn keys */
@@ -89,10 +81,11 @@ enum {
 
 enum {
   CT_CLN = 0,
-  CT_MNS,
   CT_TA,
   CT_LBP,
-  CT_RBP
+  CT_RBP,
+  CT_TMUX,
+  CT_TPS,
 };
 
 /* States & timers */
@@ -102,11 +95,17 @@ uint16_t gui_timer = 0;
 uint16_t kf_timers[12];
 
 #if KEYLOGGER_ENABLE
+# ifdef AUTOLOG_ENABLE
+bool log_enable = true;
+# else
 bool log_enable = false;
+# endif
 #endif
 
 bool time_travel = false;
 
+static uint8_t is_adore = 0;
+
 /* The Keymap */
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -114,13 +113,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Base Layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | Next/Prev | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
+ * | Next/Prev | 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  F12 | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * |         ~ |   '  |   ,  |   .  |   P  |   Y  |   [  |           |  ]   |   F  |   G  |   C  |   R  |  L   | \         |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |         ~ |   '  |   ,  |   .  |   P  |   Y  |   (  |           |  )   |   F  |   G  |   C  |   R  |  L   | \         |
+ * |-----------+------+------+------+------+------|   [  |           |  ]   |------+------+------+------+------+-----------|
  * | Tab/ARROW |   A  |   O  |   E  |   U  |   I  |------|           |------|   D  |   H  |   T  |   N  |  S   | = / Arrow |
- * |-----------+------+------+------+------+------|   (  |           |  )   |------+------+------+------+------+-----------|
- * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           |      |   B  |   M  |   W  |   V  |  Z   |      Stop |
+ * |-----------+------+------+------+------+------| tmux |           | tmux |------+------+------+------+------+-----------|
+ * | Play/Pause|   /  |   Q  |   J  |   K  |   X  |      |           | Pane |   B  |   M  |   W  |   V  |  Z   |      Stop |
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
  *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |
  *     `-----------------------------------'                                       `-----------------------------------'
@@ -134,22 +133,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  */
 [BASE] = KEYMAP(
 // left hand
- M(A_MPN)           ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
-,KC_GRV             ,KC_QUOT     ,KC_COMM     ,KC_DOT ,KC_P   ,KC_Y   ,KC_LBRC
-,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_U   ,KC_I
-,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J   ,KC_K   ,KC_X   ,KC_LPRN
-,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,TD(CT_CLN)
+ M(A_MPN)           ,M(A_9)      ,M(A_7)      ,M(A_5)  ,M(A_3)  ,M(A_1)  ,KC_F11
+,KC_GRV             ,KC_QUOT     ,KC_COMM     ,KC_DOT  ,KC_P    ,KC_Y    ,TD(CT_LBP)
+,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E    ,KC_U    ,KC_I
+,KC_MPLY            ,KC_SLSH     ,KC_Q        ,KC_J    ,KC_K    ,KC_X    ,TD(CT_TMUX)
+,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO   ,TD(CT_CLN)
 
                                                             ,F(F_ALT),F(F_GUI)
                                                                      ,F(F_CTRL)
-                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)
+                                                    ,KC_BSPC,F(F_SFT),KC_ESC
 
                                                                 // right hand
-                                                               ,KC_APP    ,M(KF_6),M(KF_7)   ,M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
-                                                               ,KC_RBRC   ,KC_F   ,KC_G      ,KC_C   ,KC_R    ,KC_L     ,KC_BSLS
-                                                                          ,KC_D   ,KC_H      ,KC_T   ,KC_N    ,KC_S     ,KC_EQL
-                                                               ,KC_RPRN   ,KC_B   ,KC_M      ,KC_W   ,KC_V    ,KC_Z     ,KC_MSTP
-                                                                                  ,TD(CT_MNS),KC_NO  ,KC_NO   ,KC_NO    ,KC_NO
+                                                               ,KC_F12    ,M(A_0)  ,M(A_2)    ,M(A_4)  ,M(A_6)  ,M(A_8)   ,M(A_PLVR)
+                                                               ,TD(CT_RBP),KC_F    ,KC_G      ,KC_C    ,KC_R    ,KC_L     ,KC_BSLS
+                                                                          ,KC_D    ,KC_H      ,KC_T    ,KC_N    ,KC_S     ,KC_EQL
+                                                               ,TD(CT_TPS),KC_B    ,KC_M      ,KC_W    ,KC_V    ,KC_Z     ,KC_MSTP
+                                                                                   ,KC_MINS   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
 
                                                                ,OSL(NMDIA),KC_DEL
                                                                ,KC_LEAD
@@ -159,15 +158,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 1: Adore layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | Play/Pause| 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr |           | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10|       F11 |
+ * | Play/Pause| 9    | 7  @ | 5  * | 3  ^ | 1  $ | F11  |           |  F12 | 0  % | 2  ! | 4  # | 6  & | 8    |    Plover |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * |        `~ |   X  |   W  |   K  |   L  |   M  |   (  |           |  )   |   F  |   H  |   C  |   P  |  Y   | \         |
+ * |        `~ |   X  |   W  |   G  |   L  |   M  |   (  |           |  )   |   F  |   H  |   C  |   P  |  Y   | \         |
  * |-----------+------+------+------+------+------|   [  |           |  ]   |------+------+------+------+------+-----------|
  * | Tab/Arrow |   A  |   O  |   E  |   I  |   U  |------|           |------|   D  |   R  |   T  |   N  |  S   | =         |
- * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
- * |           |   Z  |   Q  |   '  |   ,  |   .  |   :  |           |  -   |   B  |   G  |   V  |   J  |  /   |           |
+ * |-----------+------+------+------+------+------| tmux |           | tmux |------+------+------+------+------+-----------|
+ * |           |   Z  |   Q  |   '  |   ,  |   .  |      |           | pane |   B  |   K  |   V  |   J  |  /   |           |
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
- *     |       |      |      |      |      |                                       |      |      |      |      |       |
+ *     |       |      |      |      |   :  |                                       |   -  |      |      |      |       |
  *     `-----------------------------------'                                       `-----------------------------------'
  *                                         ,-------------.           ,-------------.
  *                                         | LAlt | GUI  |           | MDIA | Del  |
@@ -179,22 +178,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  */
 [ADORE] = KEYMAP(
 // left hand
- KC_MPLY            ,M(KF_1)     ,M(KF_2)     ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
-,KC_GRV             ,KC_X        ,KC_W        ,KC_K   ,KC_L   ,KC_M   ,TD(CT_LBP)
-,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E   ,KC_I   ,KC_U
-,KC_NO              ,KC_Z        ,KC_Q        ,KC_QUOT,KC_COMM,KC_DOT ,TD(CT_CLN)
-,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO  ,KC_NO
+ KC_MPLY            ,M(A_9)      ,M(A_7)      ,M(A_5)  ,M(A_3)  ,M(A_1) ,KC_F11
+,KC_GRV             ,KC_X        ,KC_W        ,KC_G    ,KC_L    ,KC_M   ,TD(CT_LBP)
+,TD(CT_TA)          ,KC_A        ,KC_O        ,KC_E    ,KC_I    ,KC_U
+,KC_NO              ,KC_Z        ,KC_Q        ,KC_QUOT ,KC_COMM ,KC_DOT ,TD(CT_TMUX)
+,KC_NO              ,KC_NO       ,KC_NO       ,KC_NO   ,TD(CT_CLN)
 
                                                             ,F(F_ALT),F(F_GUI)
                                                                      ,F(F_CTRL)
-                                                    ,KC_BSPC,F(F_SFT),M(A_ESC)
+                                                    ,KC_BSPC,F(F_SFT),KC_ESC
 
                                                                 // right hand
-                                                               ,KC_APP    ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
-                                                               ,TD(CT_RBP),KC_F   ,KC_H   ,KC_C   ,KC_P    ,KC_Y     ,KC_BSLS
-                                                                          ,KC_D   ,KC_R   ,KC_T   ,KC_N    ,KC_S     ,KC_EQL
-                                                               ,TD(CT_MNS),KC_B   ,KC_G   ,KC_V   ,KC_J    ,KC_SLSH  ,KC_NO
-                                                                                  ,KC_NO  ,KC_NO  ,KC_NO   ,KC_NO    ,KC_NO
+                                                               ,KC_F12    ,M(A_0)   ,M(A_2)  ,M(A_4)  ,M(A_6)  ,M(A_8)  ,M(A_PLVR)
+                                                               ,TD(CT_RBP),KC_F     ,KC_H    ,KC_C    ,KC_P    ,KC_Y    ,KC_BSLS
+                                                                          ,KC_D     ,KC_R    ,KC_T    ,KC_N    ,KC_S    ,KC_EQL
+                                                               ,TD(CT_TPS),KC_B     ,KC_K    ,KC_V    ,KC_J    ,KC_SLSH ,KC_NO
+                                                                                    ,KC_MINS ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
 
                                                                ,OSL(NMDIA),KC_DEL
                                                                ,F(F_HUN)
@@ -343,45 +342,45 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 5: Navigation & Media layer
  *
  * ,-----------------------------------------------------.           ,-----------------------------------------------------.
- * | MS Slow   |      |      |      |      |      |ScrLCK|           |ScrLCK|      |      |      |      |      |           |
+ * |           |  F9  |  F7  |  F5  |  F3  |  F1  |      |           |ScrLCK| F10  |  F2  |  F4  |  F6  |  F8  |           |
  * |-----------+------+------+------+------+-------------|           |------+------+------+------+------+------+-----------|
- * | MS Normal |      | Home |  Up  | PgUp |      |      |           |Scroll|      |MsUpL | MsUp |MsUpR |      |PrintScreen|
- * |-----------+------+------+------+------+------|      |           |  Up  |------+------+------+------+------+-----------|
- * | MS Fast   |      | Left | Down | Right|      |------|           |------|      |MsLeft| MsDn |MsRght|      |           |
- * |-----------+------+------+------+------+------|      |           |Scroll|------+------+------+------+------+-----------|
- * | Play/Pause|      | End  | Down | PgDn |      |      |           | Down |      |MsDnL | MsDn |MsDnR |      |      Stop |
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |------|           |------|      |      |      |      |      |           |
+ * |-----------+------+------+------+------+------|      |           |      |------+------+------+------+------+-----------|
+ * |           |      |      |      |      |      |      |           |      |      |      |      |      |      |           |
  * `-----------+------+------+------+------+-------------'           `-------------+------+------+------+------+-----------'
  *      |      |      |      |      |      |                                       |      |      |      |      |      |
  *      `----------------------------------'                                       `----------------------------------'
  *                                         ,-------------.           ,-------------.
- *                                         | Mute | VlUp |           | BASE | MClk |
+ *                                         | Mute | VlUp |           | BASE |      |
  *                                  ,------|------|------|           |------+------+------.
- *                                  |      |      | VlDn |           | Prev |Left  |Right |
- *                                  |  SPC | Enter|------|           |------| Click| Click|
- *                                  |      |      | ESC  |           | Next |      |      |
+ *                                  |      |      | VlDn |           |      |      |      |
+ *                                  |      |      |------|           |------|      |      |
+ *                                  |      |      |      |           |      |      |      |
  *                                  `--------------------'           `--------------------'
  */
 [NMDIA] = KEYMAP(
 // left hand
- KC_ACL0    ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,LGUI(KC_L)
-,KC_ACL1    ,KC_NO       ,KC_HOME    ,KC_UP   ,KC_PGUP ,KC_NO   ,KC_NO
-,KC_ACL2    ,KC_NO       ,KC_LEFT    ,KC_DOWN ,KC_RIGHT,KC_NO
-,KC_MPLY    ,KC_NO       ,KC_END     ,KC_DOWN ,KC_PGDN ,KC_NO   ,KC_NO
+ KC_NO      ,KC_F9       ,KC_F7      ,KC_F5   ,KC_F3   ,KC_F1   ,KC_NO
+,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
+,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO
+,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO
 ,KC_NO      ,KC_NO       ,KC_NO      ,KC_NO   ,KC_NO
                                                         ,KC_MUTE ,KC_VOLU
                                                                  ,KC_VOLD
-                                                 ,KC_SPC,KC_ENTER,M(A_ESC)
+                                                 ,KC_NO ,KC_NO   ,KC_TRNS
 
                                                                      // right hand
-                                                                     ,LGUI(KC_L),KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
-                                                                     ,KC_WH_U   ,KC_NO   ,M(A_MUL),KC_MS_U ,M(A_MUR),KC_NO    ,KC_PSCR
-                                                                                ,KC_NO   ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_NO    ,KC_NO
-                                                                     ,KC_WH_D   ,KC_NO   ,M(A_MDL),KC_MS_D ,M(A_MDR),KC_NO    ,KC_MSTP
+                                                                     ,LGUI(KC_L),KC_F10  ,KC_F2   ,KC_F4   ,KC_F6   ,KC_F8    ,KC_NO
+                                                                     ,KC_NO     ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
+                                                                                ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
+                                                                     ,KC_NO     ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
                                                                                          ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO    ,KC_NO
 
-                                                                     ,KC_TRNS   ,KC_MS_BTN3
-                                                                     ,KC_MPRV
-                                                                     ,KC_MNXT   ,KC_BTN1 ,KC_BTN2
+                                                                     ,KC_TRNS   ,KC_NO
+                                                                     ,KC_NO
+                                                                     ,KC_NO     ,KC_NO   ,KC_NO
     ),
 
 /* Keymap 6: Steno for Plover
@@ -439,7 +438,7 @@ const uint16_t PROGMEM fn_actions[] = {
   ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
 };
 
-void toggle_steno(int pressed)
+static void toggle_steno(int pressed)
 {
   uint8_t layer = biton32(layer_state);
 
@@ -462,7 +461,7 @@ void toggle_steno(int pressed)
   }
 }
 
-macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
+static macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
 {
   uint8_t need_shift = 0;
   uint8_t hold_shift = 0;
@@ -507,46 +506,65 @@ macro_t *ang_do_hun (keyrecord_t *record, uint16_t accent, uint16_t hun_char)
   return MACRO_NONE;
 }
 
-void ang_handle_kf (keyrecord_t *record, uint8_t id)
-{
-  uint8_t code = id - KF_1;
+static void ang_handle_num_row(uint8_t id, keyrecord_t *record) {
+  uint8_t idx = id - A_1;
+  uint8_t kc;
+  static bool shifted[10];
 
-  if (record->event.pressed) {
-    kf_timers[code] = timer_read ();
+  if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
+      ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
+    if (record->event.pressed)
+      shifted[idx] = true;
+  }
+
+  if (!shifted[idx]) {
+    kc = idx + KC_1;
   } else {
-    uint8_t kc;
-
-    if (timer_elapsed (kf_timers[code]) > TAPPING_TERM) {
-      // Long press
-      kc = KC_F1 + code;
-    } else {
-      if (id == KF_11)
-        kc = KC_EQL;
-      else
-        kc = KC_1 + code;
+    switch (id) {
+    case A_8:
+    case A_9:
+      shifted[idx] = false;
+      return;
+
+    case A_7:
+      kc = KC_2;
+      break;
+    case A_5:
+      kc = KC_8;
+      break;
+    case A_3:
+      kc = KC_6;
+      break;
+    case A_1:
+      kc = KC_4;
+      break;
+
+    case A_0:
+      kc = KC_5;
+      break;
+    case A_2:
+      kc = KC_1;
+      break;
+    case A_4:
+      kc = KC_3;
+      break;
+    case A_6:
+      kc = KC_7;
+      break;
     }
+  }
 
+  if (record->event.pressed) {
     register_code (kc);
+  } else {
     unregister_code (kc);
+    shifted[idx] = false;
   }
 }
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
       switch(id) {
-      case A_ESC:
-        if (record->event.pressed) {
-          if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
-            clear_oneshot_mods ();
-          } else {
-            register_code (KC_ESC);
-          }
-          layer_off (HUN);
-        } else {
-          unregister_code (KC_ESC);
-        }
-        break;
-
       case A_MPN:
         if (record->event.pressed) {
           if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
@@ -588,51 +606,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
       case HU_UEE:
         return ang_do_hun (record, KC_EQL, KC_U);
 
-        /* Mouse movement */
-      case A_MUL:
-        if (record->event.pressed) {
-          mousekey_on(KC_MS_UP);
-          mousekey_on(KC_MS_LEFT);
-        } else {
-          mousekey_off(KC_MS_UP);
-          mousekey_off(KC_MS_LEFT);
-        }
-        mousekey_send();
-        break;
-
-      case A_MUR:
-        if (record->event.pressed) {
-          mousekey_on(KC_MS_UP);
-          mousekey_on(KC_MS_RIGHT);
-        } else {
-          mousekey_off(KC_MS_UP);
-          mousekey_off(KC_MS_RIGHT);
-        }
-        mousekey_send();
-        break;
-
-      case A_MDL:
-        if (record->event.pressed) {
-          mousekey_on(KC_MS_DOWN);
-          mousekey_on(KC_MS_LEFT);
-        } else {
-          mousekey_off(KC_MS_DOWN);
-          mousekey_off(KC_MS_LEFT);
-        }
-        mousekey_send();
-        break;
-
-      case A_MDR:
-        if (record->event.pressed) {
-          mousekey_on(KC_MS_DOWN);
-          mousekey_on(KC_MS_RIGHT);
-        } else {
-          mousekey_off(KC_MS_DOWN);
-          mousekey_off(KC_MS_RIGHT);
-        }
-        mousekey_send();
-        break;
-
         /* Plover base */
       case A_PLVR:
         toggle_steno(record->event.pressed);
@@ -644,7 +617,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           register_code (KC_LGUI);
           if (record->tap.count && !record->tap.interrupted) {
             if (record->tap.count >= 2) {
-              register_code (KC_W);
               layer_on (APPSEL);
               set_oneshot_layer (APPSEL, ONESHOT_START);
             }
@@ -655,7 +627,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
         } else {
           if (record->tap.count >= 2)
             {
-              unregister_code (KC_W);
               clear_oneshot_layer_state (ONESHOT_PRESSED);
             }
           gui_timer = timer_read ();
@@ -663,35 +634,45 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
         break;
 
       case APP_SLK:
-        return MACRODOWN(T(S), T(L), T(A), T(C), T(K), T(ENT), END);
+        if (record->event.pressed)
+          uprintf("CMD:appsel_slack\n");
+        break;
 
       case APP_EMCS:
-        return MACRODOWN(T(G), T(N), T(U), T(SPC), T(E), T(M), T(A), T(C), T(S), T(SPC), T(2), T(4), T(ENT), END);
+        if (record->event.pressed)
+          uprintf("CMD:appsel_emacs\n");
+        break;
 
       case APP_TERM:
-        return MACRODOWN(T(T), T(E), T(R), T(M), T(ENT), END);
+        if (record->event.pressed)
+          uprintf("CMD:appsel_term\n");
+        break;
 
       case APP_CHRM:
-        return MACRODOWN(T(C), T(H), T(R), T(O), T(M), T(ENT), END);
+        if (record->event.pressed)
+          uprintf("CMD:appsel_chrome\n");
+        break;
 
       case APP_MSIC:
-        return MACRODOWN(T(R), T(H), T(Y), T(T), T(H), T(M), T(B), T(O), T(X), T(ENT), END);
+        if (record->event.pressed)
+          uprintf("CMD:appsel_music\n");
+        break;
 
-        /* Function keys */
-      case KF_1 ... KF_11:
-        ang_handle_kf (record, id);
+        // number row and symbols
+      case A_1 ... A_0:
+        ang_handle_num_row(id, record);
         break;
       }
 
       return MACRO_NONE;
 };
 
-uint8_t is_adore = 0;
-
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
   uint8_t dl;
 
+  set_unicode_input_mode(UC_LNX);
+
   ergodox_led_all_on();
   for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
     ergodox_led_all_set (i);
@@ -709,120 +690,38 @@ void matrix_init_user(void) {
   dl = eeconfig_read_default_layer ();
   if (dl == (1UL << ADORE)) {
     is_adore = 1;
-#if ADORE_AUTOLOG
-    log_enable = true;
-#endif
   }
 };
 
 LEADER_EXTERNS();
 
-void ang_do_unicode (void) {
-  register_code (KC_RCTL);
-  register_code (KC_RSFT);
-  register_code (KC_U);
-  unregister_code (KC_U);
-  unregister_code (KC_RSFT);
-  unregister_code (KC_RCTL);
-  wait_ms (100);
-}
+static void ang_tap (uint8_t code, ...) {
+  uint8_t kc = code;
+  va_list ap;
 
-void ang_tap (uint16_t codes[]) {
-  for (int i = 0; codes[i] != 0; i++) {
-    register_code (codes[i]);
-    unregister_code (codes[i]);
-    wait_ms (50);
-  }
+  va_start(ap, code);
+
+  do {
+    register_code(kc);
+    unregister_code(kc);
+    wait_ms(50);
+    kc = va_arg(ap, int);
+  } while (kc != 0);
+  va_end(ap);
 }
 
 #define TAP_ONCE(code)  \
   register_code (code); \
   unregister_code (code)
 
-void ang_tap_dance_bp_finished (qk_tap_dance_state_t *state, void *user_data) {
-  bool left, parens;
-
-  if (state->count > 2) {
-    state->count = 0;
-    return;
-  }
-
-  if (state->keycode == TD(CT_LBP))
-    left = true;
-  else
-    left = false;
-
-  if (state->count == 1)
-    parens = false;
-  else
-    parens = true;
-
-  if (parens) {
-    register_code (KC_RSFT);
-    if (left) {
-      TAP_ONCE(KC_9);
-    } else {
-      TAP_ONCE(KC_0);
-    }
-    unregister_code (KC_RSFT);
-  } else {
-    if (left) {
-      TAP_ONCE (KC_LBRC);
-    } else {
-      TAP_ONCE (KC_RBRC);
-    }
-  }
-}
-
-void ang_tap_dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    register_code (KC_RSFT);
-    register_code (KC_SCLN);
-  } else if (state->count == 2) {
-    register_code (KC_SCLN);
-  }
-}
-
-void ang_tap_dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    unregister_code (KC_SCLN);
-    unregister_code (KC_RSFT);
-  } else if (state->count == 2) {
-    unregister_code (KC_SCLN);
-  }
-}
-
-void ang_tap_dance_mns_finished (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    register_code (KC_MINS);
-  } else if (state->count == 2) {
-    register_code (KC_RSFT);
-    register_code (KC_MINS);
-  }
-}
-
-void ang_tap_dance_mns_reset (qk_tap_dance_state_t *state, void *user_data) {
-  if (state->count == 1) {
-    unregister_code (KC_MINS);
-  } else if (state->count == 2) {
-    unregister_code (KC_RSFT);
-    unregister_code (KC_MINS);
-  }
-}
-
 typedef struct {
   bool layer_toggle;
   bool sticky;
-  bool finished_once;
 } td_ta_state_t;
 
-void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
+static void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
   td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
 
-  if (td_ta->finished_once) {
-    return;
-  }
-
   if (td_ta->sticky) {
     td_ta->sticky = false;
     td_ta->layer_toggle = false;
@@ -830,7 +729,6 @@ void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
     return;
   }
 
-  td_ta->finished_once = true;
   if (state->count == 1 && !state->pressed) {
     register_code (KC_TAB);
     td_ta->sticky = false;
@@ -842,35 +740,70 @@ void ang_tap_dance_ta_finished (qk_tap_dance_state_t *state, void *user_data) {
   }
 }
 
-void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
+static void ang_tap_dance_ta_reset (qk_tap_dance_state_t *state, void *user_data) {
   td_ta_state_t *td_ta = (td_ta_state_t *) user_data;
 
   if (!td_ta->layer_toggle)
     unregister_code (KC_TAB);
   if (!td_ta->sticky)
     layer_off (ARRW);
+}
 
-  td_ta->finished_once = false;
+static void ang_tap_dance_tmux_finished (qk_tap_dance_state_t *state, void *user_data) {
+  if (state->count == 1) {
+    register_code(KC_LALT);
+    register_code(KC_SPC);
+    unregister_code(KC_SPC);
+    unregister_code(KC_LALT);
+  } else {
+    register_code(KC_LCTL);
+    register_code(KC_A);
+    unregister_code(KC_A);
+    unregister_code(KC_LCTL);
+  }
+}
+
+static void ang_tap_dance_tmux_pane_select (qk_tap_dance_state_t *state, void *user_data) {
+  uint8_t kc = KC_P;
+
+  if (state->count >= 2) {
+    kc = KC_Z;
+  }
+  
+  register_code(KC_LALT);
+  register_code(KC_SPC);
+  unregister_code(KC_SPC);
+  unregister_code(KC_LALT);
+
+  register_code(kc);
+  unregister_code(kc);
 }
 
 qk_tap_dance_action_t tap_dance_actions[] = {
-   [CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_cln_finished, ang_tap_dance_cln_reset)
-  ,[CT_MNS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ang_tap_dance_mns_finished, ang_tap_dance_mns_reset)
+   [CT_CLN] = ACTION_TAP_DANCE_DOUBLE (KC_COLN, KC_SCLN)
   ,[CT_TA]  = {
      .fn = { NULL, ang_tap_dance_ta_finished, ang_tap_dance_ta_reset },
-     .user_data = (void *)&((td_ta_state_t) { false, false, false })
+     .user_data = (void *)&((td_ta_state_t) { false, false })
    }
-  ,[CT_LBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
-  ,[CT_RBP] = ACTION_TAP_DANCE_FN (ang_tap_dance_bp_finished)
+  ,[CT_LBP] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, KC_LPRN)
+  ,[CT_RBP] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, KC_RPRN)
+  ,[CT_TMUX]= ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_finished)
+  ,[CT_TPS] = ACTION_TAP_DANCE_FN (ang_tap_dance_tmux_pane_select)
 };
 
-static uint16_t uni[32];
-static uint8_t unicnt;
-static bool unimagic = false;
-
 // Runs constantly in the background, in a loop.
 void matrix_scan_user(void) {
+  static uint32_t prev_layer_state;
   uint8_t layer = biton32(layer_state);
+  bool is_arrow = false;
+  static char *layer_lookup[] = {"Dvorak", "ADORE", "Arrows", "AppSel", "Hungarian", "Nav/Media", "Plover"};
+
+  if (layer_state != prev_layer_state) {
+    prev_layer_state = layer_state;
+    if (layer_lookup[layer])
+      uprintf("LAYER: %s\n", layer_lookup[layer]);
+  }
+
 
   if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
     unregister_code (KC_LGUI);
@@ -893,13 +826,19 @@ void matrix_scan_user(void) {
     ergodox_right_led_2_set (LED_BRIGHTNESS_HI);
   }
 
+  if (layer_state & (1UL << ARRW)) {
+    ergodox_right_led_1_on ();
+    ergodox_right_led_3_on ();
+    is_arrow = true;
+  }
+
   if (keyboard_report->mods & MOD_BIT(KC_LSFT) ||
       ((get_oneshot_mods() & MOD_BIT(KC_LSFT)) && !has_oneshot_mods_timed_out())) {
     ergodox_right_led_1_set (LED_BRIGHTNESS_HI);
     ergodox_right_led_1_on ();
   } else {
     ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
-    if (layer != NMDIA && layer != PLVR && layer != ADORE)
+    if (layer != NMDIA && layer != PLVR && layer != ADORE && !is_arrow)
       ergodox_right_led_1_off ();
   }
 
@@ -919,7 +858,7 @@ void matrix_scan_user(void) {
     ergodox_right_led_3_on ();
   } else {
     ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
-    if (layer != HUN && layer != PLVR && layer != ADORE)
+    if (layer != HUN && layer != PLVR && layer != ADORE && !is_arrow)
       ergodox_right_led_3_off ();
   }
 
@@ -936,20 +875,17 @@ void matrix_scan_user(void) {
     }
 #endif
 
+    SEQ_ONE_KEY (KC_Q) {
+      register_code16 (LCTL(KC_1));
+      unregister_code16 (LCTL(KC_1));
+    }
+
     SEQ_ONE_KEY (KC_T) {
       time_travel = !time_travel;
     }
 
     SEQ_ONE_KEY (KC_U) {
-      ang_do_unicode ();
-    }
-
-    SEQ_TWO_KEYS (KC_LEAD, KC_U) {
-      unicnt = 0;
-      unimagic = true;
-      register_code(KC_RSFT);
-      TAP_ONCE(KC_U);
-      unregister_code(KC_RSFT);
+      qk_ucis_start();
     }
 
     SEQ_ONE_KEY (KC_V) {
@@ -958,41 +894,27 @@ void matrix_scan_user(void) {
 
     SEQ_ONE_KEY (KC_L) {
       /* λ */
-      ang_do_unicode ();
-
-      uint16_t codes[] = {KC_0, KC_3, KC_B, KC_B, KC_ENT, 0};
-      ang_tap (codes);
+      unicode_input_start();
+      register_hex(0x03bb);
+      unicode_input_finish();
     }
 
     SEQ_ONE_KEY (KC_Y) {
-      uint16_t codes[] = {KC_BSLS, KC_O, KC_SLSH, 0};
-      ang_tap (codes);
+      ang_tap (KC_BSLS, KC_O, KC_SLSH, 0);
     }
 
     SEQ_ONE_KEY (KC_S) {
-      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+      unicode_input_start(); register_hex(0xaf); unicode_input_finish();
       TAP_ONCE (KC_BSLS);
       register_code (KC_RSFT); TAP_ONCE (KC_MINS); TAP_ONCE (KC_9); unregister_code (KC_RSFT);
-      ang_do_unicode (); TAP_ONCE (KC_3); TAP_ONCE (KC_0); TAP_ONCE (KC_C); TAP_ONCE (KC_4); TAP_ONCE (KC_SPC);
+      unicode_input_start (); register_hex(0x30c4); unicode_input_finish();
       register_code (KC_RSFT); TAP_ONCE (KC_0); TAP_ONCE (KC_MINS); unregister_code (KC_RSFT);
       TAP_ONCE (KC_SLSH);
-      ang_do_unicode (); TAP_ONCE (KC_A); TAP_ONCE (KC_F); TAP_ONCE (KC_SPC);
+      unicode_input_start (); register_hex(0xaf); unicode_input_finish();
     }
 
     SEQ_TWO_KEYS (KC_W, KC_M) {
-      register_code (KC_LALT);
-      register_code (KC_F2);
-      unregister_code (KC_F2);
-      unregister_code (KC_LALT);
-
-      wait_ms (1000);
-
-      uint16_t codes[] = {KC_M, KC_A, KC_X, KC_MINS, KC_F, KC_O, KC_C, KC_U, KC_S, KC_E, KC_D, KC_ENT, 0};
-      ang_tap (codes);
-      register_code (KC_LGUI);
-      register_code (KC_UP);
-      unregister_code (KC_UP);
-      unregister_code (KC_LGUI);
+      uprintf("CMD:wm\n");
     }
 
     SEQ_ONE_KEY (KC_A) {
@@ -1013,13 +935,7 @@ void matrix_scan_user(void) {
         ergodox_right_led_2_off ();
         wait_ms (100);
         ergodox_right_led_1_off ();
-#if ADORE_AUTOLOG
-        log_enable = true;
-#endif
       } else {
-#if ADORE_AUTOLOG
-        log_enable = false;
-#endif
         is_adore = 0;
         default_layer_and (0);
         default_layer_or (1UL << BASE);
@@ -1043,140 +959,41 @@ void matrix_scan_user(void) {
 
 static uint16_t last4[4];
 
-bool is_uni_seq(char *seq) {
-  uint8_t i;
-
-  for (i = 0; seq[i]; i++) {
-    uint16_t code;
-    if (('1' <= seq[i]) && (seq[i] <= '9'))
-      code = seq[i] - '1' + KC_1;
-    else if (seq[i] == '0')
-      code = KC_0;
-    else
-      code = seq[i] - 'a' + KC_A;
-
-    if (i > unicnt)
-      return false;
-    if (uni[i] != code)
-      return false;
-  }
-
-  if (uni[i] == KC_ENT || uni[i] == KC_SPC)
-    return true;
-
-  return false;
-}
+const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE
+(
+ UCIS_SYM("poop", 0x1f4a9),
+ UCIS_SYM("rofl", 0x1f923),
+ UCIS_SYM("kiss", 0x1f619),
+ UCIS_SYM("snowman", 0x2603),
+ UCIS_SYM("coffee", 0x2615),
+ UCIS_SYM("heart", 0x2764),
+ UCIS_SYM("bolt", 0x26a1)
+);
 
-uint16_t hex_to_keycode(uint8_t hex)
-{
-  if (hex == 0x0) {
-    return KC_0;
-  } else if (hex < 0xA) {
-    return KC_1 + (hex - 0x1);
-  } else {
-    return KC_A + (hex - 0xA);
-  }
-}
+bool process_record_user (uint16_t keycode, keyrecord_t *record) {
+#if KEYLOGGER_ENABLE
+  if (log_enable) {
+    uint8_t layer = biton32(layer_state);
 
-void register_hex(uint16_t hex) {
-  bool leading_zeros = true;
-
-  for(int i = 3; i >= 0; i--) {
-    uint8_t digit = ((hex >> (i*4)) & 0xF);
-    if (digit != 0)
-      leading_zeros = false;
-    else if (leading_zeros)
-      continue;
-    register_code(hex_to_keycode(digit));
-    unregister_code(hex_to_keycode(digit));
-    wait_ms(10);
+    if ((layer == ADORE) || (layer == BASE))
+      uprintf ("KL: col=%02d, row=%02d, pressed=%d, layer=%s\n", record->event.key.col,
+               record->event.key.row, record->event.pressed, (is_adore) ? "ADORE" : "Dvorak");
   }
-}
-
-typedef struct {
-  char *symbol;
-  uint16_t codes[4];
-} qk_ucis_symbol_t;
-
-static qk_ucis_symbol_t ucis_symbol_table[] = {
-  {"poop", {0x1, 0xf4a9, 0}},
-  {"rofl", {0x1, 0xf923, 0}},
-  {"kiss", {0x1, 0xf619, 0}},
-  {"snowman", {0x2603, 0}},
-  {NULL, {}}
-};
-
-bool process_record_ucis (uint16_t keycode, keyrecord_t *record) {
-  uint8_t i;
-
-  if (!unimagic)
-    return true;
-
-  if (!record->event.pressed)
-    return true;
+#endif
 
-  uni[unicnt] = keycode;
-  unicnt++;
+  if (keycode == KC_ESC && record->event.pressed) {
+    bool queue = true;
 
-  if (keycode == KC_BSPC) {
-    if (unicnt >= 2) {
-      unicnt-= 2;
-      return true;
-    } else {
-      unicnt--;
-      return false;
+    if ((get_oneshot_mods ()) && !has_oneshot_mods_timed_out ()) {
+      clear_oneshot_mods ();
+      queue = false;
     }
-  }
-
-  if (keycode == KC_ENT || keycode == KC_SPC) {
-    bool symbol_found = false;
-
-    for (i = unicnt; i > 0; i--) {
-      register_code (KC_BSPC);
-      unregister_code (KC_BSPC);
-      wait_ms(10);
+    if (layer_state & (1UL<<HUN)) {
+      layer_off (HUN);
+      queue = false;
     }
-
-    ang_do_unicode();
-    wait_ms(10);
-    for (i = 0; ucis_symbol_table[i].symbol; i++) {
-      if (is_uni_seq (ucis_symbol_table[i].symbol)) {
-        symbol_found = true;
-        for (uint8_t j = 0; ucis_symbol_table[i].codes[j]; j++) {
-          register_hex(ucis_symbol_table[i].codes[j]);
-        }
-        break;
-      }
-    }
-    if (!symbol_found) {
-      for (i = 0; i < unicnt - 1; i++) {
-        uint8_t code;
-
-        if (uni[i] > KF_1)
-          code = uni[i] - KF_1 + KC_1;
-        else
-          code = uni[i];
-        TAP_ONCE(code);
-        wait_ms (10);
-      }
-    }
-
-    unimagic = false;
-    return true;
+    return queue;
   }
-  return true;
-}
-
-bool process_record_user (uint16_t keycode, keyrecord_t *record) {
-#if KEYLOGGER_ENABLE
-  if (log_enable) {
-    xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
-             record->event.key.row);
-  }
-#endif
-
-  if (!process_record_ucis (keycode, record))
-    return false;
 
   if (time_travel && !record->event.pressed) {
     uint8_t p;
@@ -1188,15 +1005,13 @@ bool process_record_user (uint16_t keycode, keyrecord_t *record) {
     last4[3] = keycode;
 
     if (last4[0] == KC_D && last4[1] == KC_A && last4[2] == KC_T && last4[3] == KC_E) {
-      uint16_t codes[] = {KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0};
-      ang_tap (codes);
+      ang_tap (KC_E, KC_SPC, KC_MINS, KC_D, KC_SPC, KC_QUOT, 0);
       register_code (KC_RSFT);
       register_code (KC_EQL);
       unregister_code (KC_EQL);
       unregister_code (KC_RSFT);
 
-      uint16_t codes2[] = {KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0};
-      ang_tap (codes2);
+      ang_tap (KC_4, KC_SPC, KC_D, KC_A, KC_Y, KC_S, KC_QUOT, 0);
 
       return false;
     }
@@ -1204,3 +1019,17 @@ bool process_record_user (uint16_t keycode, keyrecord_t *record) {
 
   return true;
 }
+
+void qk_ucis_symbol_fallback (void) {
+  for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
+    uint8_t code;
+
+    if ((qk_ucis_state.codes[i] >= M(A_1)) && (qk_ucis_state.codes[i] <= M(A_0)))
+      code = qk_ucis_state.codes[i] - M(A_1) + KC_1;
+    else
+      code = qk_ucis_state.codes[i];
+    register_code(code);
+    unregister_code(code);
+    wait_ms (10);
+  }
+}
index 26dfddbe6a25ca64740af56112acc7cb6cd6afeb..f15b676528008d15901cf4866a7873f8296f1d23 100644 (file)
@@ -3,23 +3,26 @@
 algernon's layout
 =======================
 
-This is an unconventional layout for the ErgoDox EZ. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox].
+This is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox].
 
+ [ez]: https://ergodox-ez.com/
  [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/
 
-Some of the things in the layout only work when one uses Spacemacs and GNOME under Linux. Your mileage may vary.
+Some of the things in the layout only work when one uses [Spacemacs][spacemacs] and [GNOME][gnome] under Linux. Your mileage may vary.
+
+ [spacemacs]: http://spacemacs.org/
+ [gnome]: https://www.gnome.org/
 
 ## Table of Contents
 
 * [Layouts](#layouts)
     - [Base layer](#base-layer)
     - [ADORE layer](#adore-layer)
-    - [Hungarian layer](#hungarian-layer)
-    - [Navigation and media layer](#navigation-and-media-layer)
     - [Steno layer](#steno-layer)
     - [LED states](#led-states)
 * [Tools](#tools)
     - [Heatmap](#heatmap)
+    - [Layer notification](#layer-notification)
 * [Special features](#special-features)
     - [Unicode Symbol Input](#unicode-symbol-input)
 * [Building](#building)
@@ -35,15 +38,15 @@ Some of the things in the layout only work when one uses Spacemacs and GNOME und
 
 At its core, this is a Dvorak layout, with some minor changes. The more interesting parts are how certain keys behave:
 
-* The keys on the number row double as function keys, when held for a bit longer than an usual tap. This allows me to use the function keys without having to switch layers.
+* The number row is the same as in the [ADORE](#adore-layer) layer. The function keys are on the **Media** layer.
 * The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they are considered active for the next key press only. When double tapped, they toggle on, until a third, single tap sometime later. When held, they act as expected. My usual pattern is that I use these for the next keypress only, so this behaviour is perfect. If I need them held, I'll just double-tap.
 * The `GUI` key is special, because when I double-tap it, it sends `GUI + w`, which pops up an application selector. It also switches to a one-shot layer, where the number row on the left half turns into app selector macros, for the most common things I usually want to switch to. Otherwise it behaves as on a normal layout.
 * The `ESC` key also doubles as a one-shot cancel key: if tapped while any of the one-shot modifiers are in-flight (as in, single-tapped, and not expired yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if active. Otherwise it sends the usual keycode.
 * The **Media** and **Hun** layer keys are one-shot, the **STENO** key is a toggle.
-* When holding any of the **Arrow** layer keys, the arrow layer activates while the layer key is held. Tapping the key produces the normal key.
+* When holding the `Tab`/**Arrow** key, the arrow layer activates while the key is held. Tapping the key produces the normal, `Tab` key. Double-tapping it toggles the **Arrow** layer on until a third tap.
 * Tapping the `:` key once yields `:`, tapping it twice yields `;`.
+* Tapping the `[{(`/`)}]` keys once yields `[` (or `{` when shifted), tapping them twice yields `(`.
 * The **Lead** key allows me to type in a sequence of keys, and trigger some actions:
-    - `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that does this.
     - `LEAD l` uses the unicode input method to enter a `λ`.
     - `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯`
     - `LEAD y` types `\o/`.
@@ -52,29 +55,17 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest
     - `LEAD v` prints the firmware version, the keyboard and the keymap.
     - `LEAD d` toggles logging keypress positions to the HID console.
     - `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader.
-    - `LEAD LEAD u` enters the [Unicode symbol input][#unicode-symbol-input] mode.
+    - `LEAD u` enters the [Unicode symbol input](#unicode-symbol-input) mode.
+    
+The symbols on the front in the image above have the same color as the key that activates them, with the exception of the **Arrow** layer, which is just black on the front.
 
 ## ADORE layer
 
 [![ADORE layer](images/adore-layer.png)](http://www.keyboard-layout-editor.com/#/gists/45681a17453d235925b6028dd83bf12a)
 
-While using the standard Dvorak layout, I encountered a number of inconveniences, and on this layer, I am playing with ideas to make the layout feel better. Initially, it was based on [Capewell-Dvorak][cpd], but that too, had shortcomings I was not happy with. So now this is something inbetween, with own observations thrown in. How it works out in the long run remains to be seen.
-
- [cpd]: http://www.michaelcapewell.com/projects/keyboard/layout_capewell-dvorak.htm
-Based on a week and a half of typing, the keys were rearranged, and the home row neatly spelled out **ADORE**, that gave the layout its name.
-
-## Hungarian layer
-
-[![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9)
-
-On this layer, the accented characters are at the same position as their base variant. For some, which can have other diatribes, the long one is on top, short's on bottom. Tapping any of the accented characters takes us back to the base layer.
+My experimental layout, that I keep tweaking. No full description here, because things are very much in flux.
 
-## Navigation and media layer
-
-[![Navigation and media layer](images/nav-n-media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892)
-
-This layer is primarily for navigating with the cursor or the mouse, and some media things.
+Note that the **HUN** layer does not work well with ADORE: it still has the same layout as on the [Base](#base-layer) layer. This will remain until ADORE becomes the default.
 
 ## Steno layer
 
@@ -89,8 +80,9 @@ The primary purpose of the LEDs is to show the modifier status, a secondary, to
 For the layers, the following rules apply:
 
 * When the [ADORE layer](#adore-layer) is toggled on, LEDs will light up from left to right in a sequence, then turn off. When the layer is toggled off, the LEDs light up and turn off in the other direction. No LEDs are on while the layer is active.
-* When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue* LEDs are on.
-* When the [Navigation and media layer](#navigation-and-media-layer) is active, the *red* and *green* ones are on.
+* When the **Hungarian** layer is active, the *green* and *blue* LEDs are on.
+* When the **Media** layer is active, the *red* and *green* ones are on.
+* When the **ARROW** layer is active, the *red* and *blue* ones are on.
 * For the [Steno layer](#steno-layer), all LEDs will be turned on.
 
 Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers use a stronger one, and modifiers override any layer preferences. For example, when on the one-handed layer, with the left side active (*red* light blinking), if `Shift` is on, the *red* light will be constantly on.
@@ -116,7 +108,7 @@ This is an experimental feature, and may or may not work reliably.
 
 When the keypress logging functionality is enabled (by `LEAD d`), the keyboard will output a line every time a key is pressed, containing the position of the key in the matrix. This allows one to collect this information, and build analytics over it, such as a heat map, including dead keys too.
 
-Included with the firmware is a small tool that can parse these logs, and create a heatmap that one can import into [KLE][kle]. To use it, simply point `tools/log-to-heatmap.py` to a base layout file (one is included in the `tools/` directory), and the key position log. The latter one can create by running `hid-listen`, and redirecting its output to a file.
+Included with the firmware is a small tool that can parse these logs, and create a heatmap that one can import into [KLE][kle]. To use it, either pipe the output of `hid_listen` into it, or pipe it an already saved log, and it will save the results into files in an output directory (given on the command-line). See the output of `tools/log-to-heatmap.py --help` for more information.
 
  [kle]: http://www.keyboard-layout-editor.com/
 
@@ -124,6 +116,10 @@ The generated heatmap looks somewhat like this:
 
  ![Heatmap](images/heatmap.png)
 
+## Layer notification
+
+There is a very small tool in `tools/layer-notify`, that listens to the HID console, looking for layer change events, and pops up a notification for every detected change. It is a very simple tool, mainly serving as an example.
+
 # Building
 
 To make my workflow easier, this layout is maintained in [its own repository][algernon:ez-layout]. To build it, you will need the [QMK][qmk] firmware checked out, and this repo either checked out to something like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
@@ -151,7 +147,72 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
 
 # Changelog
 
-## v1.5 - 2016-08-12
+## v1.7
+
+*2016-09-18*
+
+### Overall changes
+
+* The number row has been completely rearranged on both the [Base](#base-layer) and the [ADORE](#adore-layer) layers.
+* The number/function key behavior was changed: function keys are now on the **Media**.
+* The `:`/`;` and `-`/`_` keys were put back to their thumb position on the bottom row, on both the [Base](#base-layer) and [ADORE](#adore-layer) layers.
+* The bottom large keys on the inner side of each half now function as [tmux](http://tmux.github.io/) keys: the left to send the prefix, the right to send the `display-panes` key. The left also doubles as a GNU screen prefix key, and sends `C-a` when double tapped.
+* A number of functions, such as the **AppSel** layer, now require the `hid-commands` tool to be running, with the output of `hid_listen` being piped to it.
+
+### ADORE
+
+* `Y` and `X` have been swapped again.
+
+### Media/Navigation layer
+
+* The function keys are now on this layer.
+* Mouse keys have been removed.
+* Media start/stop/prev/next have been removed.
+* `Print screen` has been removed.
+* There is only one screen lock key now.
+
+### Heatmap
+
+* Fixed a few issues in the finger-stats calculation.
+* The tool now also timestamps and saves all input lines to a logfile, which it loads on start, allowing one to continue the collection after upgrading the tool.
+* The heatmap tool will now colorize the stats by default.
+* The periodic stats are now printed in a more compact format.
+
+### Tools
+
+* Added a new tool, `tools/layer-notify` that listens to layer change events on the HID console, and pops up a notification on layer changes.
+* Another new tool, `tools/text-to-log.py` has been added that converts arbitrary text to a keylogger output, which can be fed to the heatmap generator.
+* A number of features have been moved to the `tools/hid-commands` utility. These generally are OS dependent, and are easier to implement on the software side.
+
+## v1.6
+
+*2016-08-24*
+
+### Base layer changes
+
+* The parentheses & bracket keys have been merged: tapping them results in `[` or `{` (if it was shifted), double tapping leads to `(`.
+* The `:;` and `-_` keys are now available on the base layer, on their [ADORE](#adore-layer) location, too, just below `[{(`/`]})`.
+* The `Apps` key has been replaced by `F12`.
+* The `-`/`_` is no longer a tap-dance key.
+
+### ADORE layer changes
+
+* Adjustments were made to the [ADORE](#adore-layer) layer, to separate some inconvenient combinations.
+
+### Miscellaneous changes
+
+* `LEAD u` now starts the symbolic unicode input system, instead of the OS-one.
+* The mouse acceleration keys on the **Navigation/Media** layer have been turned into toggles: tap them once to turn them on, until tapped again. Tapping an accelerator button will turn all the others off.
+* When the **ARROW** layer is on, the *red* and *blue* LEDs light up now.
+
+### Heatmap
+
+* The built-in keylogger has been greatly enhanced, it now outputs the pressed state, and the layer (Dvorak or ADORE). As such, the `ADORE_AUTOLOG` option has been removed, instead there is `AUTOLOG_ENABLE` now, which when enabled, makes the keylogger start when the keyboard boots. It defaults to off.
+* The heatmap generator received a lot of updates.
+
+## v1.5
+
+*2016-08-12*
 
 * The **1HAND** layer has been removed.
 * A `Delete` key is now available on the right thumb cluster.
@@ -161,7 +222,9 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
 * On the **ARROW** layer, `Backspace` has been replaced by `Enter`.
 * There is some experimental support for entering Unicode symbols.
 
-## v1.4 - 2016-07-29
+## v1.4
+
+*2016-07-29*
 
 * When toggling the key logging on or off, the LEDs will do a little dance.
 * The keylogger is now optional, but enabled by default. Use `KEYLOGGER_ENABLE=no` on the `make` command line to disable it.
@@ -169,25 +232,31 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
 * The `-`/`_` key was turned into a tap-dance key too.
 * There is now a way to travel time with the keyboard, toggle the feature on by hitting `LEAD t`.
 
-## v1.3 - 2016-07-06
+## v1.3
+
+*2016-07-06*
 
 * Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs.
 * The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the [base layer](#base-layer) for an image that shows where arrows are.
 * The **experimental** layer has been redone, and is now called [ADORE](#adore-layer), and as such, can be enabled by `LEAD a` now.
 * Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot.
 
-## v1.2 - 2016-06-22
+## v1.2
+
+*2016-06-22*
 
 * The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with [certain operating systems](#using-on-windows).
 * The `:;` key has changed behaviour: to access the `;` symbol, the key needs to be double-tapped, instead of shifted.
 * The `=` and `\` keys were swapped, `=` moved to the home row, on both the [base](#base-layer) and the **experimental** layers.
 * The arrow and navigation keys were redone, they are now more accessible, but the navigation keys require an extra tap to access.
-* The **Emacs** layer is gone, replaced by a simplified [navigation and media](#navigation-and-media-layer) layer.
+* The **Emacs** layer is gone, replaced by a simplified **navigation and media** layer.
 * `LEAD v` types the firmware version, and the keymap version.
 * On the **experimental** layer, the `L` and `Q`, and the `K` and `G` keys were swapped.
 * The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it easier on my fingers.
 
-## v1.1 - 2016-06-14
+## v1.1
+
+*2016-06-14*
 
 * The keyboard starts in NKRO mode, bootmagic and other things are disabled.
 * A [Steno](#steno-layer) layer was added, to be used with Plover.
@@ -199,9 +268,11 @@ The keymap default to forcing NKRO, which seems to upset Windows, and except the
     - `-` on the left half was replaced by `Tab`.
     - `Tab`'s original position is taken by a `Media Next`/`Media Prev` key.
     - `:` now inputs `;` when shifted.
-* `ESC` cancels the [Hungarian](#hungarian-layer) layer too, not just modifiers.
+* `ESC` cancels the **Hungarian** layer too, not just modifiers.
+
+## v1.0
 
-## v1.0 - 2016-05-26
+*2016-05-26*
 
 Initial version.
 
diff --git a/keyboards/ergodox/keymaps/algernon/tools/heatmap-adore-layout.json b/keyboards/ergodox/keymaps/algernon/tools/heatmap-adore-layout.json
deleted file mode 100644 (file)
index 544f61c..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-[
-  {
-    "backcolor": "#ffffff",
-    "name": "ErgoDox - algernon's layout: Heatmap",
-    "author": "Gergely Nagy <kbd@gergo.csillger.hu>",
-    "notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
-    "switchMount": "cherry",
-    "switchBrand": "gateron",
-    "switchType": "KS-3-Tea",
-    "pcb": true,
-    "css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
-  },
-  [
-    {
-      "x": 3.5,
-      "c": "#a7d0db",
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "#\n3\nF3",
-    {
-      "x": 10.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "*\n8\nF8"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "@\n2\nF2",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "$\n4\nF4",
-    {
-      "x": 8.5
-    },
-    "&\n7\nF7",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "(\n9\nF9"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "%\n5\nF5",
-    {
-      "c": "#f9cd31",
-      "a": 7,
-      "f": 2
-    },
-    "STENO",
-    {
-      "x": 4.5,
-      "f": 6
-    },
-    "<i class='mss mss-Unicode-Option-3'></i>",
-    {
-      "c": "#7adabd",
-      "a": 4,
-      "f": 3,
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "^\n6\nF6"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb2d2",
-      "f": 3,
-      "w": 1.5
-    },
-    "\n\n~\n`",
-    {
-      "t": "#0d0d0b"
-    },
-    "!\n1\nF1",
-    {
-      "x": 14.5
-    },
-    ")\n0\nF10",
-    {
-      "a": 7,
-      "w": 1.5
-    },
-    "F11"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 6
-    },
-    "L",
-    {
-      "x": 10.5
-    },
-    "C"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b",
-      "a": 4
-    },
-    ">\n.",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000",
-      "a": 6
-    },
-    "W",
-    {
-      "x": 8.5
-    },
-    "H",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "P"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "M",
-    {
-      "c": "#93c9b7",
-      "a": 4,
-      "h": 1.5
-    },
-    "{\n[",
-    {
-      "x": 4.5,
-      "h": 1.5
-    },
-    "}\n]",
-    {
-      "c": "#7adabd",
-      "a": 6
-    },
-    "F"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb07b",
-      "t": "#0d0d0b",
-      "f": 6,
-      "w": 1.5
-    },
-    "<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
-    {
-      "c": "#ffb2d2",
-      "a": 4,
-      "f": 3
-    },
-    "<\n,",
-    {
-      "x": 14.5,
-      "a": 6
-    },
-    "Y",
-    {
-      "a": 4,
-      "w": 1.5
-    },
-    "|\n\\"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 6
-    },
-    "E",
-    {
-      "x": 10.5
-    },
-    "T"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "O",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000",
-      "n": true
-    },
-    "I",
-    {
-      "x": 8.5,
-      "n": true
-    },
-    "R",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "N"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "U",
-    {
-      "x": 6.5
-    },
-    "D"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb2d2",
-      "t": "#0d0d0b",
-      "fa": [
-        6
-      ],
-      "w": 1.5
-    },
-    "<i class='fa fa-arrows'></i>\n\nTab",
-    {
-      "f": 3
-    },
-    "A",
-    {
-      "x": 14.5,
-      "f": 3
-    },
-    "S",
-    {
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        6
-      ],
-      "w": 1.5
-    },
-    "+\n="
-  ],
-  [
-    {
-      "y": -0.625,
-      "x": 6.5,
-      "c": "#93c9b7",
-      "t": "#000000",
-      "a": 7,
-      "h": 1.5
-    },
-    "(",
-    {
-      "x": 4.5,
-      "h": 1.5
-    },
-    ")"
-  ],
-  [
-    {
-      "y": -0.75,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "a": 4,
-      "f": 3
-    },
-    "\"\n'",
-    {
-      "x": 10.5
-    },
-    "V"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "Z",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "K",
-    {
-      "x": 8.5
-    },
-    "G",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "J"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "X",
-    {
-      "x": 6.5
-    },
-    "B"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb07b",
-      "f": 9,
-      "w": 1.5
-    },
-    "\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
-    {
-      "c": "#ffb2d2",
-      "t": "#0d0d0b",
-      "a": 4,
-      "f": 3
-    },
-    "?\n/",
-    {
-      "x": 14.5,
-      "a": 6
-    },
-    "Q",
-    {
-      "c": "#ffb07b",
-      "t": "#000000",
-      "f": 9,
-      "w": 1.5
-    },
-    "<i class='kb kb-Multimedia-Stop'></i>"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#d9dae0",
-      "g": true,
-      "a": 7,
-      "f": 3
-    },
-    "",
-    {
-      "x": 10.5
-    },
-    ""
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5
-    },
-    "",
-    {
-      "x": 1,
-      "c": "#d4872a",
-      "g": false,
-      "a": 5
-    },
-    ";\n:",
-    {
-      "x": 8.5
-    },
-    "_\n-",
-    {
-      "x": 1,
-      "c": "#d9dae0",
-      "g": true,
-      "a": 7
-    },
-    ""
-  ],
-  [
-    {
-      "y": -0.75,
-      "x": 0.5
-    },
-    "",
-    {},
-    "",
-    {
-      "x": 14.5
-    },
-    "",
-    {},
-    ""
-  ],
-  [
-    {
-      "r": 30,
-      "rx": 6.5,
-      "ry": 4.25,
-      "y": -1,
-      "x": 1,
-      "c": "#f9cd31",
-      "g": false
-    },
-    "Alt",
-    {
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        0,
-        9
-      ]
-    },
-    "\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
-  ],
-  [
-    {
-      "c": "#d4872a",
-      "a": 7,
-      "f": 9,
-      "h": 2
-    },
-    "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
-    {
-      "h": 2
-    },
-    "<i class='fa fa-angle-double-up'></i>",
-    {
-      "c": "#f9cd31",
-      "f": 3
-    },
-    "Ctrl"
-  ],
-  [
-    {
-      "x": 2,
-      "c": "#e26757"
-    },
-    "ESC"
-  ],
-  [
-    {
-      "r": -30,
-      "rx": 13,
-      "y": -1,
-      "x": -3,
-      "c": "#f9cd31",
-      "f": 2
-    },
-    "MEDIA",
-    {},
-    "1HAND"
-  ],
-  [
-    {
-      "x": -3
-    },
-    "LEAD",
-    {
-      "c": "#d4872a",
-      "f": 9,
-      "h": 2
-    },
-    "<i class='kb kb-Return-2'></i>",
-    {
-      "f": 3,
-      "h": 2
-    },
-    "SPC"
-  ],
-  [
-    {
-      "x": -3,
-      "c": "#f9cd31",
-      "f": 2
-    },
-    "HUN"
-  ]
-]
diff --git a/keyboards/ergodox/keymaps/algernon/tools/heatmap-base-layout.json b/keyboards/ergodox/keymaps/algernon/tools/heatmap-base-layout.json
deleted file mode 100644 (file)
index 148bb1f..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-[
-  {
-    "backcolor": "#ffffff",
-    "name": "ErgoDox - algernon's layout: Heatmap",
-    "author": "Gergely Nagy <kbd@gergo.csillger.hu>",
-    "notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
-    "switchMount": "cherry",
-    "switchBrand": "gateron",
-    "switchType": "KS-3-Tea",
-    "pcb": true,
-    "css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
-  },
-  [
-    {
-      "x": 3.5,
-      "c": "#a7d0db",
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "#\n3\nF3",
-    {
-      "x": 10.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "*\n8\nF8"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "@\n2\nF2",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "$\n4\nF4",
-    {
-      "x": 8.5
-    },
-    "&\n7\nF7",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "(\n9\nF9"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "%\n5\nF5",
-    {
-      "c": "#f9cd31",
-      "a": 7,
-      "f": 2
-    },
-    "STENO",
-    {
-      "x": 4.5,
-      "f": 6
-    },
-    "<i class='mss mss-Unicode-Option-3'></i>",
-    {
-      "c": "#7adabd",
-      "a": 4,
-      "f": 3,
-      "fa": [
-        0,
-        0,
-        2
-      ]
-    },
-    "^\n6\nF6"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb2d2",
-      "f": 3,
-      "w": 1.5
-    },
-    "\n\n~\n`",
-    {
-      "t": "#0d0d0b"
-    },
-    "!\n1\nF1",
-    {
-      "x": 14.5
-    },
-    ")\n0\nF10",
-    {
-      "a": 7,
-      "w": 1.5
-    },
-    "F11"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 4
-    },
-    ">\n.",
-    {
-      "x": 10.5,
-      "a": 6
-    },
-    "C"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b",
-      "a": 4
-    },
-    "<\n,",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000",
-      "a": 6
-    },
-    "P",
-    {
-      "x": 8.5
-    },
-    "G",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "R"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "Y",
-    {
-      "c": "#93c9b7",
-      "a": 4,
-      "h": 1.5
-    },
-    "{\n[",
-    {
-      "x": 4.5,
-      "h": 1.5
-    },
-    "}\n]",
-    {
-      "c": "#7adabd",
-      "a": 6
-    },
-    "F"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb07b",
-      "t": "#0d0d0b",
-      "f": 6,
-      "w": 1.5
-    },
-    "<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
-    {
-      "c": "#ffb2d2",
-      "a": 4,
-      "f": 3
-    },
-    "\"\n'",
-    {
-      "x": 14.5,
-      "a": 6
-    },
-    "L",
-    {
-      "a": 4,
-      "w": 1.5
-    },
-    "|\n\\"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "t": "#000000",
-      "a": 6
-    },
-    "E",
-    {
-      "x": 10.5
-    },
-    "T"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "O",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000",
-      "n": true
-    },
-    "U",
-    {
-      "x": 8.5,
-      "n": true
-    },
-    "H",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "N"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "I",
-    {
-      "x": 6.5
-    },
-    "D"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb2d2",
-      "t": "#0d0d0b",
-      "fa": [
-        6
-      ],
-      "w": 1.5
-    },
-    "<i class='fa fa-arrows'></i>\n\nTab",
-    {
-      "f": 3
-    },
-    "A",
-    {
-      "x": 14.5,
-      "f": 3
-    },
-    "S",
-    {
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        6
-      ],
-      "w": 1.5
-    },
-    "+\n="
-  ],
-  [
-    {
-      "y": -0.625,
-      "x": 6.5,
-      "c": "#93c9b7",
-      "t": "#000000",
-      "a": 7,
-      "h": 1.5
-    },
-    "(",
-    {
-      "x": 4.5,
-      "h": 1.5
-    },
-    ")"
-  ],
-  [
-    {
-      "y": -0.75,
-      "x": 3.5,
-      "c": "#a7d0db",
-      "a": 6
-    },
-    "J",
-    {
-      "x": 10.5
-    },
-    "W"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "Q",
-    {
-      "x": 1,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "K",
-    {
-      "x": 8.5
-    },
-    "M",
-    {
-      "x": 1,
-      "c": "#bfbad1",
-      "t": "#0d0d0b"
-    },
-    "V"
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 5.5,
-      "c": "#7adabd",
-      "t": "#000000"
-    },
-    "X",
-    {
-      "x": 6.5
-    },
-    "B"
-  ],
-  [
-    {
-      "y": -0.875,
-      "c": "#ffb07b",
-      "f": 9,
-      "w": 1.5
-    },
-    "\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
-    {
-      "c": "#ffb2d2",
-      "t": "#0d0d0b",
-      "a": 4,
-      "f": 3
-    },
-    "?\n/",
-    {
-      "x": 14.5,
-      "a": 6
-    },
-    "Z",
-    {
-      "c": "#ffb07b",
-      "t": "#000000",
-      "f": 9,
-      "w": 1.5
-    },
-    "<i class='kb kb-Multimedia-Stop'></i>"
-  ],
-  [
-    {
-      "y": -0.375,
-      "x": 3.5,
-      "c": "#d9dae0",
-      "g": true,
-      "a": 7,
-      "f": 3
-    },
-    "",
-    {
-      "x": 10.5
-    },
-    ""
-  ],
-  [
-    {
-      "y": -0.875,
-      "x": 2.5
-    },
-    "",
-    {
-      "x": 1,
-      "c": "#d4872a",
-      "g": false,
-      "a": 5
-    },
-    ";\n:",
-    {
-      "x": 8.5
-    },
-    "_\n-",
-    {
-      "x": 1,
-      "c": "#d9dae0",
-      "g": true,
-      "a": 7
-    },
-    ""
-  ],
-  [
-    {
-      "y": -0.75,
-      "x": 0.5
-    },
-    "",
-    {},
-    "",
-    {
-      "x": 14.5
-    },
-    "",
-    {},
-    ""
-  ],
-  [
-    {
-      "r": 30,
-      "rx": 6.5,
-      "ry": 4.25,
-      "y": -1,
-      "x": 1,
-      "c": "#f9cd31",
-      "g": false
-    },
-    "Alt",
-    {
-      "a": 4,
-      "fa": [
-        0,
-        0,
-        0,
-        9
-      ]
-    },
-    "\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
-  ],
-  [
-    {
-      "c": "#d4872a",
-      "a": 7,
-      "f": 9,
-      "h": 2
-    },
-    "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
-    {
-      "h": 2
-    },
-    "<i class='fa fa-angle-double-up'></i>",
-    {
-      "c": "#f9cd31",
-      "f": 3
-    },
-    "Ctrl"
-  ],
-  [
-    {
-      "x": 2,
-      "c": "#e26757"
-    },
-    "ESC"
-  ],
-  [
-    {
-      "r": -30,
-      "rx": 13,
-      "y": -1,
-      "x": -3,
-      "c": "#f9cd31",
-      "f": 2
-    },
-    "MEDIA",
-    {},
-    "1HAND"
-  ],
-  [
-    {
-      "x": -3
-    },
-    "LEAD",
-    {
-      "c": "#d4872a",
-      "f": 9,
-      "h": 2
-    },
-    "<i class='kb kb-Return-2'></i>",
-    {
-      "f": 3,
-      "h": 2
-    },
-    "SPC"
-  ],
-  [
-    {
-      "x": -3,
-      "c": "#f9cd31",
-      "f": 2
-    },
-    "HUN"
-  ]
-]
diff --git a/keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.ADORE.json b/keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.ADORE.json
new file mode 100644 (file)
index 0000000..502d1e6
--- /dev/null
@@ -0,0 +1,487 @@
+[
+  {
+    "backcolor": "#ffffff",
+    "name": "ErgoDox - algernon's layout: Heatmap",
+    "author": "Gergely Nagy <kbd@gergo.csillger.hu>",
+    "notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
+    "switchMount": "cherry",
+    "switchBrand": "gateron",
+    "switchType": "KS-3-Tea",
+    "pcb": true,
+    "css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
+  },
+  [
+    {
+      "x": 3.5,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "*\n5\nF5",
+    {
+      "x": 10.5,
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "#\n4\nF4"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "@\n7\nF7",
+    {
+      "x": 1
+    },
+    "^\n3\nF3",
+    {
+      "x": 8.5
+    },
+    "!\n2\nF2",
+    {
+      "x": 1
+    },
+    "&\n6\nF6"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "$\n1\nF1",
+    {
+      "a": 7,
+      "f": 3
+    },
+    "F11",
+    {
+      "x": 4.5,
+      "f": 3
+    },
+    "F12",
+    {
+      "a": 4,
+      "f": 3,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "%\n0\nF10"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 9,
+      "a": 6,
+      "w": 1.5
+    },
+    "\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
+    {
+      "f": 3,
+      "a": 4,
+      "fa": [
+          0,
+          0,
+          2
+      ]
+    },
+    " \n9\nF9",
+    {
+      "x": 14.5
+    },
+    " \n8\nF8",
+    {
+      "a": 7,
+      "w": 1.5
+    },
+    "STENO"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "a": 6
+    },
+    "G",
+    {
+      "x": 10.5
+    },
+    "C"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5,
+      "a": 6
+    },
+    "W",
+    {
+      "x": 1,
+      "a": 6
+    },
+    "L",
+    {
+      "x": 8.5
+    },
+    "H",
+    {
+      "x": 1
+    },
+    "P"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "M",
+    {
+      "a": 4,
+      "fa": [0, 0, 0],
+      "h": 1.5
+    },
+    "{\n(\n[",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "}\n)\n]",
+    {
+      "a": 6
+    },
+    "F"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 3,
+      "a": 4,
+      "w": 1.5
+    },
+    "\n\n~\n`",
+    {
+      "a": 6,
+      "f": 3
+    },
+    "X",
+    {
+      "x": 14.5,
+      "a": 6
+    },
+    "Y",
+    {
+      "a": 4,
+      "w": 1.5
+    },
+    "|\n\\"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "a": 6
+    },
+    "E",
+    {
+      "x": 10.5
+    },
+    "T"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "O",
+    {
+      "x": 1,
+      "n": true
+    },
+    "I",
+    {
+      "x": 8.5,
+      "n": true
+    },
+    "R",
+    {
+      "x": 1
+    },
+    "N"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "U",
+    {
+      "x": 6.5
+    },
+    "D"
+  ],
+  [
+    {
+      "y": -0.875,
+      "fa": [
+        6
+      ],
+      "w": 1.5
+    },
+    "<i class='fa fa-arrows'></i>\n\nTab",
+    {
+      "f": 3
+    },
+    "A",
+    {
+      "x": 14.5,
+      "f": 3
+    },
+    "S",
+    {
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        6
+      ],
+      "w": 1.5
+    },
+    "+\n="
+  ],
+  [
+    {
+      "y": -0.625,
+      "x": 6.5,
+      "a": 7,
+      "f": 9,
+      "h": 1.5
+    },
+    "<i class='fa fa-columns'></i>",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "<i class='fa fa-table'></i>"
+  ],
+  [
+    {
+      "y": -0.75,
+      "x": 3.5,
+      "a": 4,
+      "f": 3
+    },
+    "\"\n'",
+    {
+      "x": 10.5,
+      "a": 6,
+      "f": 3
+    },
+    "V"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5,
+      "a": 6
+    },
+    "Q",
+    {
+      "x": 1,
+      "a": 4
+    },
+    "<\n,",
+    {
+      "x": 8.5,
+      "a": 6
+    },
+    "K",
+    {
+      "x": 1
+    },
+    "J"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5,
+      "a": 4
+    },
+    ">\n.",
+    {
+      "x": 6.5,
+      "a": 6
+    },
+    "B"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 9,
+      "w": 1.5,
+      "g": true
+    },
+    "",
+    {
+      "a": 6,
+      "f": 3,
+      "g": false
+    },
+    "Z",
+    {
+      "x": 14.5,
+      "a": 4
+    },
+    "?\n/",
+    {
+      "f": 9,
+      "g": true,
+      "w": 1.5,
+      "a": 4
+    },
+    ""
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "g": true,
+      "a": 7,
+      "f": 3
+    },
+    "",
+    {
+      "x": 10.5
+    },
+    ""
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "",
+    {
+      "x": 1,
+      "g": false,
+      "a": 5
+    },
+    ";\n:",
+    {
+      "x": 8.5
+    },
+    "_\n-",
+    {
+      "x": 1,
+      "g": true,
+      "a": 7
+    },
+    ""
+  ],
+  [
+    {
+      "y": -0.75,
+      "x": 0.5
+    },
+    "",
+    {},
+    "",
+    {
+      "x": 14.5
+    },
+    "",
+    {},
+    ""
+  ],
+  [
+    {
+      "r": 30,
+      "rx": 6.5,
+      "ry": 4.25,
+      "y": -1,
+      "x": 1,
+      "g": false
+    },
+    "Alt",
+    {
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        0,
+        9
+      ]
+    },
+    "\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
+  ],
+  [
+    {
+      "a": 7,
+      "f": 9,
+      "h": 2
+    },
+    "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
+    {
+      "h": 2
+    },
+    "<i class='fa fa-angle-double-up'></i>",
+    {
+      "f": 3
+    },
+    "Ctrl"
+  ],
+  [
+    {
+      "x": 2
+    },
+    "ESC"
+  ],
+  [
+    {
+      "r": -30,
+      "rx": 13,
+      "y": -1,
+      "x": -3,
+      "f": 2
+    },
+    "MEDIA",
+    {},
+    "DEL"
+  ],
+  [
+    {
+      "x": -3
+    },
+    "HUN",
+    {
+      "f": 9,
+      "h": 2
+    },
+    "<i class='kb kb-Return-2'></i>",
+    {
+      "f": 3,
+      "h": 2
+    },
+    "SPC"
+  ],
+  [
+    {
+      "x": -3,
+      "f": 2
+    },
+    "LEAD"
+  ]
+]
diff --git a/keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.Dvorak.json b/keyboards/ergodox/keymaps/algernon/tools/heatmap-layout.Dvorak.json
new file mode 100644 (file)
index 0000000..5b4ca06
--- /dev/null
@@ -0,0 +1,477 @@
+[
+  {
+    "backcolor": "#ffffff",
+    "name": "ErgoDox - algernon's layout: Heatmap",
+    "author": "Gergely Nagy <kbd@gergo.csillger.hu>",
+    "notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
+    "switchMount": "cherry",
+    "switchBrand": "gateron",
+    "switchType": "KS-3-Tea",
+    "pcb": true,
+    "css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
+  },
+  [
+    {
+      "x": 3.5,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "*\n5\nF5",
+    {
+      "x": 10.5,
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "#\n4\nF4"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "@\n7\nF7",
+    {
+      "x": 1
+    },
+    "^\n3\nF3",
+    {
+      "x": 8.5
+    },
+    "!\n2\nF2",
+    {
+      "x": 1
+    },
+    "&\n6\nF6"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "$\n1\nF1",
+    {
+      "a": 7,
+      "f": 3
+    },
+    "F11",
+    {
+      "x": 4.5,
+      "f": 3
+    },
+    "F12",
+    {
+      "a": 4,
+      "f": 3,
+      "fa": [
+        0,
+        0,
+        2
+      ]
+    },
+    "%\n0\nF10"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 6,
+      "a": 6,
+      "w": 1.5
+    },
+    "<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
+    {
+      "f": 3,
+      "a": 4,
+      "fa": [
+          0,
+          0,
+          2
+      ]
+
+    },
+    " \n9\nF9",
+    {
+      "x": 14.5
+    },
+    " \n8\nF8",
+    {
+      "a": 7,
+      "w": 1.5
+    },
+    "STENO"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "a": 4
+    },
+    ">\n.",
+    {
+      "x": 10.5,
+      "a": 6
+    },
+    "C"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5,
+      "a": 4
+    },
+    "<\n,",
+    {
+      "x": 1,
+      "a": 6
+    },
+    "P",
+    {
+      "x": 8.5
+    },
+    "G",
+    {
+      "x": 1
+    },
+    "R"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "Y",
+    {
+      "a": 4,
+      "h": 1.5
+    },
+    "{\n(\n[",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "}\n)\n]",
+    {
+      "a": 6
+    },
+    "F"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 3,
+      "a": 4,
+      "w": 1.5
+    },
+    "\n\n~\n`",
+    {
+      "a": 4,
+      "f": 3
+    },
+    "\"\n'",
+    {
+      "x": 14.5,
+      "a": 6
+    },
+    "L",
+    {
+      "a": 4,
+      "w": 1.5
+    },
+    "|\n\\"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "a": 6
+    },
+    "E",
+    {
+      "x": 10.5
+    },
+    "T"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "O",
+    {
+      "x": 1,
+      "n": true
+    },
+    "U",
+    {
+      "x": 8.5,
+      "n": true
+    },
+    "H",
+    {
+      "x": 1
+    },
+    "N"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "I",
+    {
+      "x": 6.5
+    },
+    "D"
+  ],
+  [
+    {
+      "y": -0.875,
+      "fa": [
+        6
+      ],
+      "w": 1.5
+    },
+    "<i class='fa fa-arrows'></i>\n\nTab",
+    {
+      "f": 3
+    },
+    "A",
+    {
+      "x": 14.5,
+      "f": 3
+    },
+    "S",
+    {
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        6
+      ],
+      "w": 1.5
+    },
+    "+\n="
+  ],
+  [
+    {
+      "y": -0.625,
+      "x": 6.5,
+      "a": 7,
+      "f": 9,
+      "h": 1.5
+    },
+    "<i class='fa fa-columns'></i>",
+    {
+      "x": 4.5,
+      "h": 1.5
+    },
+    "<i class='fa fa-table'></i>"
+  ],
+  [
+    {
+      "y": -0.75,
+      "x": 3.5,
+      "f": 3,
+      "a": 6
+    },
+    "J",
+    {
+      "x": 10.5
+    },
+    "W"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "Q",
+    {
+      "x": 1
+    },
+    "K",
+    {
+      "x": 8.5
+    },
+    "M",
+    {
+      "x": 1
+    },
+    "V"
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 5.5
+    },
+    "X",
+    {
+      "x": 6.5
+    },
+    "B"
+  ],
+  [
+    {
+      "y": -0.875,
+      "f": 9,
+      "w": 1.5
+    },
+    "\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
+    {
+      "a": 4,
+      "f": 3
+    },
+    "?\n/",
+    {
+      "x": 14.5,
+      "a": 6
+    },
+    "Z",
+    {
+      "f": 9,
+      "w": 1.5
+    },
+    "<i class='kb kb-Multimedia-Stop'></i>"
+  ],
+  [
+    {
+      "y": -0.375,
+      "x": 3.5,
+      "g": true,
+      "a": 7,
+      "f": 3
+    },
+    "",
+    {
+      "x": 10.5
+    },
+    ""
+  ],
+  [
+    {
+      "y": -0.875,
+      "x": 2.5
+    },
+    "",
+    {
+      "x": 1,
+      "g": false,
+      "a": 5
+    },
+    ";\n:",
+    {
+      "x": 8.5
+    },
+    "_\n-",
+    {
+      "x": 1,
+      "g": true,
+      "a": 7
+    },
+    ""
+  ],
+  [
+    {
+      "y": -0.75,
+      "x": 0.5
+    },
+    "",
+    {},
+    "",
+    {
+      "x": 14.5
+    },
+    "",
+    {},
+    ""
+  ],
+  [
+    {
+      "r": 30,
+      "rx": 6.5,
+      "ry": 4.25,
+      "y": -1,
+      "x": 1,
+      "g": false
+    },
+    "Alt",
+    {
+      "a": 4,
+      "fa": [
+        0,
+        0,
+        0,
+        9
+      ]
+    },
+    "\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
+  ],
+  [
+    {
+      "a": 7,
+      "f": 9,
+      "h": 2
+    },
+    "<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
+    {
+      "h": 2
+    },
+    "<i class='fa fa-angle-double-up'></i>",
+    {
+      "f": 3
+    },
+    "Ctrl"
+  ],
+  [
+    {
+      "x": 2
+    },
+    "ESC"
+  ],
+  [
+    {
+      "r": -30,
+      "rx": 13,
+      "y": -1,
+      "x": -3,
+      "f": 2
+    },
+    "MEDIA",
+    {},
+    "DEL"
+  ],
+  [
+    {
+      "x": -3
+    },
+    "LEAD",
+    {
+      "f": 9,
+      "h": 2
+    },
+    "<i class='kb kb-Return-2'></i>",
+    {
+      "f": 3,
+      "h": 2
+    },
+    "SPC"
+  ],
+  [
+    {
+      "x": -3,
+      "f": 2
+    },
+    "HUN"
+  ]
+]
diff --git a/keyboards/ergodox/keymaps/algernon/tools/hid-commands b/keyboards/ergodox/keymaps/algernon/tools/hid-commands
new file mode 100755 (executable)
index 0000000..f3b83cf
--- /dev/null
@@ -0,0 +1,61 @@
+#!/bin/bash
+set -e
+
+cmd_wm () {
+    WIN="$(xdotool getactivewindow)"
+    wmctrl -i -r ${WIN} -b remove,maximized_vert,maximized_horz
+    xdotool windowsize ${WIN} 100% 100%
+    wmctrl -i -r ${WIN} -b add,maximized_vert,maximized_horz
+}
+
+_cmd_appsel () {
+    wmctrl -x -a $1 || true
+    xdotool key Escape
+}
+
+cmd_appsel_music () {
+    wmctrl -x -a rhythmbox || wmctrl -x -a spotify || true
+    xdotool key Escape
+}
+
+cmd_appsel_slack () {
+    _cmd_appsel slack
+}
+
+cmd_appsel_emacs () {
+    _cmd_appsel emacs24
+}
+
+cmd_appsel_term () {
+    _cmd_appsel gnome-terminal
+}
+
+cmd_appsel_chrome () {
+    _cmd_appsel chromium
+}
+
+cmd_help () {
+    cat <<EOF
+Use the source, Luke!
+EOF
+}
+
+while read l; do
+    case "$l" in
+        "CMD:"*)
+            ;;
+        *)
+            continue
+            ;;
+    esac
+
+    cmd="$(echo $l | cut -d: -f2-)"
+
+    echo "Got command: ${cmd}"
+
+    if type cmd_${cmd} >/dev/null 2>&1; then
+        cmd_${cmd}
+    fi
+done
+
+
diff --git a/keyboards/ergodox/keymaps/algernon/tools/layer-notify b/keyboards/ergodox/keymaps/algernon/tools/layer-notify
new file mode 100755 (executable)
index 0000000..627c286
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+HL="${HID_LISTEN:-$HOME/src/ext/hid_listen/hid_listen}"
+
+sudo "${HL}" | grep --line-buffered LAYER: | \
+(while read line; do
+     case $line in
+         LAYER:*)
+             layer="$(echo $(echo $line | cut -d: -f2-))"
+             notify-send -i mark-location-symbolic "Switched to layer: $layer"
+             ;;
+     esac
+ done)
index a13d12e81af03c1fce2c39db6b12f12241254b4f..09c737646ceb335de0cba1878241601ba3feea8b 100755 (executable)
-#! /usr/bin/env python
+#! /usr/bin/env python3
 import json
 import os
 import sys
 import re
+import argparse
+import time
 
 from math import floor
+from os.path import dirname
+from subprocess import Popen, PIPE, STDOUT
+from blessings import Terminal
 
-cr_coord_map = [
-    [
-        # Row 0
-        [ 4,  0], [ 4,  2], [ 2,  0], [ 1,  0], [ 2,  2], [ 3,  0], [ 3,  2],
-        [ 3,  4], [ 3,  6], [ 2,  4], [ 1,  2], [ 2,  6], [ 4,  4], [ 4,  6],
-    ],
-    [
-        # Row 1
-        [ 8,  0], [ 8,  2], [ 6,  0], [ 5,  0], [ 6,  2], [ 7,  0], [ 7,  2],
-        [ 7,  4], [ 7,  6], [ 6,  4], [ 5,  2], [ 6,  6], [ 8,  4], [ 8,  6],
-    ],
-    [
-        # Row 2
-        [12,  0], [12,  2], [10,  0], [ 9,  0], [10,  2], [11, 0], [     ],
-        [      ], [11,  2], [10,  4], [ 9,  2], [10,  6], [12, 4], [12, 6],
-    ],
-    [
-        # Row 3
-        [17,  0], [17,  2], [15,  0], [14,  0], [15,  2], [16,  0], [13,  0],
-        [13,  2], [16,  2], [15,  4], [14,  2], [15,  6], [17,  4], [17,  6],
-    ],
-    [
-        # Row 4
-        [20,  0], [20,  2], [19,  0], [18,  0], [19,  2], [], [], [], [],
-        [19,  4], [18,  2], [19,  6], [20,  4], [20,  6],
-    ],
-    [
-        # Row 5
-        [     ], [23,  0], [22,  2], [22,  0], [22,  4], [21,  0], [21,  2],
-        [24, 0], [24,  2], [25,  0], [25,  4], [25,  2], [26,  0], [      ],
-    ],
-]
-
-def set_attr_at(j, b, n, attr, fn, val):
-    blk = j[b][n]
-    if attr in blk:
-        blk[attr] = fn(blk[attr], val)
+class Heatmap(object):
+    coords = [
+        [
+            # Row 0
+            [ 4,  0], [ 4,  2], [ 2,  0], [ 1,  0], [ 2,  2], [ 3,  0], [ 3,  2],
+            [ 3,  4], [ 3,  6], [ 2,  4], [ 1,  2], [ 2,  6], [ 4,  4], [ 4,  6],
+        ],
+        [
+            # Row 1
+            [ 8,  0], [ 8,  2], [ 6,  0], [ 5,  0], [ 6,  2], [ 7,  0], [ 7,  2],
+            [ 7,  4], [ 7,  6], [ 6,  4], [ 5,  2], [ 6,  6], [ 8,  4], [ 8,  6],
+        ],
+        [
+            # Row 2
+            [12,  0], [12,  2], [10,  0], [ 9,  0], [10,  2], [11, 0], [     ],
+            [      ], [11,  2], [10,  4], [ 9,  2], [10,  6], [12, 4], [12, 6],
+        ],
+        [
+            # Row 3
+            [17,  0], [17,  2], [15,  0], [14,  0], [15,  2], [16,  0], [13,  0],
+            [13,  2], [16,  2], [15,  4], [14,  2], [15,  6], [17,  4], [17,  6],
+        ],
+        [
+            # Row 4
+            [20,  0], [20,  2], [19,  0], [18,  0], [19,  2], [], [], [], [],
+            [19,  4], [18,  2], [19,  6], [20,  4], [20,  6], [], [], [], []
+        ],
+        [
+            # Row 5
+            [     ], [23,  0], [22,  2], [22,  0], [22,  4], [21,  0], [21,  2],
+            [24, 0], [24,  2], [25,  0], [25,  4], [25,  2], [26,  0], [      ],
+        ],
+    ]
+
+    def set_attr_at(self, block, n, attr, fn, val):
+        blk = self.heatmap[block][n]
+        if attr in blk:
+            blk[attr] = fn(blk[attr], val)
+        else:
+            blk[attr] = fn(None, val)
+
+    def coord(self, col, row):
+        return self.coords[row][col]
+
+    @staticmethod
+    def set_attr(orig, new):
+        return new
+
+    def set_bg(self, coords, color):
+        (block, n) = coords
+        self.set_attr_at(block, n, "c", self.set_attr, color)
+        #self.set_attr_at(block, n, "g", self.set_attr, False)
+
+    def set_tap_info(self, coords, count, cap):
+        (block, n) = coords
+        def _set_tap_info(o, _count, _cap):
+            ns = 4 - o.count ("\n")
+            return o + "\n" * ns + "%.02f%%" % (float(_count) / float(_cap) * 100)
+
+        if not cap:
+            cap = 1
+        self.heatmap[block][n + 1] = _set_tap_info (self.heatmap[block][n + 1], count, cap)
+
+    @staticmethod
+    def heatmap_color (v):
+        colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
+        fb = 0
+        if v <= 0:
+            idx1, idx2 = 0, 0
+        elif v >= 1:
+            idx1, idx2 = len(colors) - 1, len(colors) - 1
+        else:
+            val = v * (len(colors) - 1)
+            idx1 = int(floor(val))
+            idx2 = idx1 + 1
+            fb = val - float(idx1)
+
+        r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
+        g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
+        b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
+
+        r, g, b = [x * 255 for x in (r, g, b)]
+        return "#%02x%02x%02x" % (int(r), int(g), int(b))
+
+    def __init__(self, layout):
+        self.log = {}
+        self.total = 0
+        self.max_cnt = 0
+        self.layout = layout
+
+    def update_log(self, coords):
+        (c, r) = coords
+        if not (c, r) in self.log:
+            self.log[(c, r)] = 0
+        self.log[(c, r)] = self.log[(c, r)] + 1
+        self.total = self.total + 1
+        if self.max_cnt < self.log[(c, r)]:
+            self.max_cnt = self.log[(c, r)]
+
+    def get_heatmap(self):
+        with open("%s/heatmap-layout.%s.json" % (dirname(sys.argv[0]), self.layout), "r") as f:
+            self.heatmap = json.load (f)
+
+        ## Reset colors
+        for row in self.coords:
+            for coord in row:
+                if coord != []:
+                    self.set_bg (coord, "#d9dae0")
+
+        for (c, r) in self.log:
+            coords = self.coord(c, r)
+            b, n = coords
+            cap = self.max_cnt
+            if cap == 0:
+                cap = 1
+            v = float(self.log[(c, r)]) / cap
+            self.set_bg (coords, self.heatmap_color (v))
+            self.set_tap_info (coords, self.log[(c, r)], self.total)
+        return self.heatmap
+
+    def get_stats(self):
+        usage = [
+            # left hand
+            [0, 0, 0, 0, 0],
+            # right hand
+            [0, 0, 0, 0, 0]
+        ]
+        finger_map = [0, 0, 1, 2, 3, 3, 3, 1, 1, 1, 2, 3, 4, 4]
+        for (c, r) in self.log:
+            if r == 5: # thumb cluster
+                if c <= 6: # left side
+                    usage[0][4] = usage[0][4] + self.log[(c, r)]
+                else:
+                    usage[1][0] = usage[1][0] + self.log[(c, r)]
+            else:
+                fc = c
+                hand = 0
+                if fc >= 7:
+                    hand = 1
+                fm = finger_map[fc]
+                usage[hand][fm] = usage[hand][fm] + self.log[(c, r)]
+        hand_usage = [0, 0]
+        for f in usage[0]:
+            hand_usage[0] = hand_usage[0] + f
+        for f in usage[1]:
+            hand_usage[1] = hand_usage[1] + f
+
+        total = self.total
+        if total == 0:
+            total = 1
+        stats = {
+            "total-keys": total,
+            "hands": {
+                "left": {
+                    "usage": round(float(hand_usage[0]) / total * 100, 2),
+                    "fingers": {
+                        "pinky": 0,
+                        "ring": 0,
+                        "middle": 0,
+                        "index": 0,
+                        "thumb": 0,
+                    }
+                },
+                "right": {
+                    "usage": round(float(hand_usage[1]) / total * 100, 2),
+                    "fingers": {
+                        "thumb": 0,
+                        "index": 0,
+                        "middle": 0,
+                        "ring": 0,
+                        "pinky": 0,
+                    }
+                },
+            }
+        }
+
+        hmap = ['left', 'right']
+        fmap = ['pinky', 'ring', 'middle', 'index', 'thumb',
+                'thumb', 'index', 'middle', 'ring', 'pinky']
+        for hand_idx in range(len(usage)):
+            hand = usage[hand_idx]
+            for finger_idx in range(len(hand)):
+                stats['hands'][hmap[hand_idx]]['fingers'][fmap[finger_idx + hand_idx * 5]] = round(float(hand[finger_idx]) / total * 100, 2)
+        return stats
+
+def dump_all(out_dir, heatmaps):
+    stats = {}
+    t = Terminal()
+    t.clear()
+    sys.stdout.write("\x1b[2J\x1b[H")
+
+    print ('{t.underline}{outdir}{t.normal}\n'.format(t=t, outdir=out_dir))
+
+    keys = list(heatmaps.keys())
+    keys.sort()
+
+    for layer in keys:
+        if len(heatmaps[layer].log) == 0:
+            continue
+
+        with open ("%s/%s.json" % (out_dir, layer), "w") as f:
+            json.dump(heatmaps[layer].get_heatmap(), f)
+        stats[layer] = heatmaps[layer].get_stats()
+
+        left = stats[layer]['hands']['left']
+        right = stats[layer]['hands']['right']
+
+        print ('{t.bold}{layer}{t.normal} ({total:,} taps):'.format(t=t, layer=layer,
+                                                                    total=int(stats[layer]['total-keys'] / 2)))
+        print (('{t.underline}        | ' + \
+                'left ({l[usage]:6.2f}%)  | ' + \
+                'right ({r[usage]:6.2f}%) |{t.normal}').format(t=t, l=left, r=right))
+        print ((' {t.bright_magenta}pinky{t.white}  |     {left[pinky]:6.2f}%     |     {right[pinky]:6.2f}%     |\n' + \
+                ' {t.bright_cyan}ring{t.white}   |     {left[ring]:6.2f}%     |     {right[ring]:6.2f}%     |\n' + \
+                ' {t.bright_blue}middle{t.white} |     {left[middle]:6.2f}%     |     {right[middle]:6.2f}%     |\n' + \
+                ' {t.bright_green}index{t.white}  |     {left[index]:6.2f}%     |     {right[index]:6.2f}%     |\n' + \
+                ' {t.bright_red}thumb{t.white}  |     {left[thumb]:6.2f}%     |     {right[thumb]:6.2f}%     |\n' + \
+                '').format(left=left['fingers'], right=right['fingers'], t=t))
+
+def process_line(line, heatmaps, opts, stamped_log = None):
+    m = re.search ('KL: col=(\d+), row=(\d+), pressed=(\d+), layer=(.*)', line)
+    if not m:
+        return False
+    if stamped_log is not None:
+        if line.startswith("KL:"):
+            print ("%10.10f %s" % (time.time(), line),
+                   file = stamped_log, end = '')
+        else:
+            print (line,
+                   file = stamped_log, end = '')
+        stamped_log.flush()
+
+    (c, r, l) = (int(m.group (2)), int(m.group (1)), m.group (4))
+    if (c, r) not in opts.allowed_keys:
+        return False
+
+    heatmaps[l].update_log ((c, r))
+
+    return True
+
+def setup_allowed_keys(opts):
+    if len(opts.only_key):
+        incmap={}
+        for v in opts.only_key:
+            m = re.search ('(\d+),(\d+)', v)
+            if not m:
+                continue
+            (c, r) = (int(m.group(1)), int(m.group(2)))
+            incmap[(c, r)] = True
     else:
-        blk[attr] = fn(None, val)
+        incmap={}
+        for r in range(0, 6):
+            for c in range(0, 14):
+                incmap[(c, r)] = True
+
+        for v in opts.ignore_key:
+            m = re.search ('(\d+),(\d+)', v)
+            if not m:
+                continue
+            (c, r) = (int(m.group(1)), int(m.group(2)))
+            del(incmap[(c, r)])
+
+    return incmap
 
-def coord(col, row):
-    return cr_coord_map[row][col]
+def main(opts):
+    heatmaps = {"Dvorak": Heatmap("Dvorak"),
+                "ADORE": Heatmap("ADORE")
+    }
+    cnt = 0
+    out_dir = opts.outdir
 
-def set_attr(orig, new):
-    return new
+    if not os.path.exists(out_dir):
+        os.makedirs(out_dir)
 
-def set_bg(j, (b, n), color):
-    set_attr_at(j, b, n, "c", set_attr, color)
-    #set_attr_at(j, b, n, "g", set_attr, False)
+    opts.allowed_keys = setup_allowed_keys(opts)
 
-def _set_tap_info(o, count, cap):
-    ns = 4 - o.count ("\n")
-    return o + "\n" * ns + "%.02f%%" % (float(count) / float(cap) * 100)
+    if not opts.one_shot:
 
-def set_tap_info(j, (b, n), count, cap):
-    j[b][n + 1] = _set_tap_info (j[b][n + 1], count, cap)
+        try:
+            with open("%s/stamped-log" % out_dir, "r") as f:
+                while True:
+                    line = f.readline()
+                    if not line:
+                        break
+                    if not process_line(line, heatmaps, opts):
+                        continue
+        except:
+            pass
 
-def heatmap_color (v):
-    colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
-    fb = 0
-    if v <= 0:
-        idx1, idx2 = 0, 0
-    elif v >= 1:
-        idx1, idx2 = len(colors) - 1, len(colors) - 1
+        stamped_log = open ("%s/stamped-log" % (out_dir), "a+")
     else:
-        val = v * (len(colors) - 1)
-        idx1 = int(floor(val))
-        idx2 = idx1 + 1
-        fb = val - float(idx1)
-
-    r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
-    g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
-    b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
-
-    r, g, b = [x * 255 for x in r, g, b]
-    return "#%02x%02x%02x" % (r, g, b)
-
-# Load the keylog
-def load_keylog(fname, restrict_row):
-    keylog = {}
-    total = 0
-    with open(fname, "r") as f:
-        lines = f.readlines()
-    for line in lines:
-        m = re.search ('KL: col=(\d+), row=(\d+)', line)
-        if not m:
-            continue
-        (c, r) = (int(m.group (2)), int(m.group (1)))
-        if restrict_row != None and r != int(restrict_row):
+        stamped_log = None
+
+    while True:
+        line = sys.stdin.readline()
+        if not line:
+            break
+        if not process_line(line, heatmaps, opts, stamped_log):
             continue
-        if (c, r) in keylog:
-            keylog[(c, r)] = keylog[(c, r)] + 1
-        else:
-            keylog[(c, r)] = 1
-        total = total + 1
-    return total / 2, keylog
-
-def l_flat(s):
-    f = s.split("\n")
-    return ", ".join (f)
-
-def main(base_fn, log_fn, restrict_row = None):
-
-    with open(base_fn, "r") as f:
-        layout = json.load (f)
-
-    ## Reset colors
-    for row in cr_coord_map:
-        for col in row:
-            if col != []:
-                set_bg (layout, col, "#d9dae0")
-                #set_attr_at (layout, col[0], col[1], "g", set_attr, True)
-
-    total, log = load_keylog (log_fn, restrict_row)
-    max_cnt = 0
-    for (c, r) in log:
-        max_cnt = max(max_cnt, log[(c, r)])
-
-    # Create the heatmap
-    for (c, r) in log:
-        coords = coord(c, r)
-        b, n = coords
-        cap = max_cnt
-        v = float(log[(c, r)]) / cap
-        print >> sys.stderr, "%s => %d/%d => %f = %s" % (l_flat(layout[b][n+1]), log[(c,r)], cap, v, heatmap_color(v))
-        set_bg (layout, coord(c, r), heatmap_color (v))
-        set_tap_info (layout, coord (c, r), log[(c, r)], total)
-
-    print json.dumps(layout)
 
-if __name__ == "__main__":
-    if len(sys.argv) < 3:
-        print """Log to Heatmap -- creates a heatmap out of keyboard logs
+        cnt = cnt + 1
+
+        if opts.dump_interval != -1 and cnt >= opts.dump_interval and not opts.one_shot:
+            cnt = 0
+            dump_all(out_dir, heatmaps)
 
-Usage: log-to-heatmap.py base-layout.json logfile [row] >layout.json"""
-        sys.exit (1)
-    main(*sys.argv[1:])
+    dump_all (out_dir, heatmaps)
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser (description = "keylog to heatmap processor")
+    parser.add_argument ('outdir', action = 'store',
+                         help = 'Output directory')
+    parser.add_argument ('--dump-interval', dest = 'dump_interval', action = 'store', type = int,
+                         default = 100, help = 'Dump stats and heatmap at every Nth event, -1 for dumping at EOF only')
+    parser.add_argument ('--ignore-key', dest = 'ignore_key', action = 'append', type = str,
+                         default = [], help = 'Ignore the key at position (x, y)')
+    parser.add_argument ('--only-key', dest = 'only_key', action = 'append', type = str,
+                         default = [], help = 'Only include key at position (x, y)')
+    parser.add_argument ('--one-shot', dest = 'one_shot', action = 'store_true',
+                         help = 'Do not load previous data, and do not update it, either.')
+    args = parser.parse_args()
+    if len(args.ignore_key) and len(args.only_key):
+        print ("--ignore-key and --only-key are mutually exclusive, please only use one of them!",
+               file = sys.stderr)
+        sys.exit(1)
+    main(args)
diff --git a/keyboards/ergodox/keymaps/algernon/tools/max-focused b/keyboards/ergodox/keymaps/algernon/tools/max-focused
deleted file mode 100755 (executable)
index 4d5220a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-WIN="$(xdotool getactivewindow)"
-wmctrl -i -r ${WIN} -b remove,maximized_vert,maximized_horz
-xdotool windowsize ${WIN} 100% 100%
-wmctrl -i -r ${WIN} -b add,maximized_vert,maximized_horz
diff --git a/keyboards/ergodox/keymaps/algernon/tools/text-to-log.py b/keyboards/ergodox/keymaps/algernon/tools/text-to-log.py
new file mode 100755 (executable)
index 0000000..e068c3c
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+charmap = {
+    '9': [[1, 0]],
+    '7': [[2, 0]], '@': [[2, 5], [2, 0]],
+    '5': [[3, 0]], '*': [[2, 5], [3, 0]],
+    '3': [[4, 0]], '^': [[2, 5], [4, 0]],
+    '1': [[5, 0]], '$': [[2, 5], [5, 0]],
+    '0': [[8, 0]], '%': [[2, 5], [8, 0]],
+    '2': [[9, 0]], '!': [[2, 5], [9, 0]],
+    '4': [[10, 0]], '#': [[2, 5], [10, 0]],
+    '6': [[11, 0]], '&': [[2, 5], [11, 0]],
+    '8': [[12, 0]],
+
+    '`': [[0, 1]], '~': [[2, 5], [0, 1]],
+    'y': [[1, 1]], 'Y': [[2, 5], [1, 1]],
+    'w': [[2, 1]], 'W': [[2, 5], [2, 1]],
+    'g': [[3, 1]], 'G': [[2, 5], [3, 1]],
+    'l': [[4, 1]], 'L': [[2, 5], [4, 1]],
+    'm': [[5, 1]], 'M': [[2, 5], [5, 1]],
+    '[': [[6, 1]], '{': [[2, 5], [6, 1]], '(': [[6, 1], [6, 1]],
+    ']': [[7, 1]], '}': [[2, 5], [7, 1]], ')': [[7, 1], [7, 1]],
+    'f': [[8, 1]], 'F': [[2, 5], [8, 1]],
+    'h': [[9, 1]], 'H': [[2, 5], [9, 1]],
+    'c': [[10, 1]], 'C': [[2, 5], [10, 1]],
+    'p': [[11, 1]], 'P': [[2, 5], [11, 1]],
+    'x': [[12, 1]], 'X': [[2, 5], [12, 1]],
+    '\\': [[13, 1]], '|': [[2, 5], [13, 1]],
+
+    '\t': [[0, 2]],
+    'a': [[1, 2]], 'A': [[2, 5], [1, 2]],
+    'o': [[2, 2]], 'O': [[2, 5], [2, 2]],
+    'e': [[3, 2]], 'E': [[2, 5], [3, 2]],
+    'i': [[4, 2]], 'I': [[2, 5], [4, 2]],
+    'u': [[5, 2]], 'U': [[2, 5], [5, 2]],
+    'd': [[8, 2]], 'D': [[2, 5], [8, 2]],
+    'r': [[9, 2]], 'R': [[2, 5], [9, 2]],
+    't': [[10, 2]], 'T': [[2, 5], [10, 2]],
+    'n': [[11, 2]], 'N': [[2, 5], [11, 2]],
+    's': [[12, 2]], 'S': [[2, 5], [12, 2]],
+    '=': [[13, 2]], '+': [[2, 5], [13, 2]],
+
+    'z': [[1, 3]], 'Z': [[2, 5], [1, 3]],
+    'q': [[2, 3]], 'Q': [[2, 5], [2, 3]],
+    '\'': [[3, 3]], '"': [[2, 5], [3, 3]],
+    ',': [[4, 3]], '<': [[2, 5], [4, 3]],
+    '.': [[5, 3]], '>': [[2, 5], [5, 3]],
+    'b': [[8, 3]], 'B': [[2, 5], [8, 3]],
+    'k': [[9, 3]], 'K': [[2, 5], [9, 3]],
+    'v': [[10, 3]], 'V': [[2, 5], [10, 3]],
+    'j': [[11, 3]], 'J': [[2, 5], [11, 3]],
+    '/': [[12, 3]], '?': [[2, 5], [12, 3]],
+
+    ':': [[4, 4]], ';': [[4, 4], [4, 4]],
+    '-': [[9, 4]], '_': [[2, 5], [9, 4]],
+
+    ' ': [[10, 5]],
+    '\n': [[11, 5]],
+
+    ## Layered things
+    # Hungarian
+    'á': [[9, 5], [1, 2]],  'Á': [[2, 5], [9, 5], [1, 2]],
+    'ó': [[9, 5], [2, 2]],  'Ó': [[2, 5], [9, 5], [2, 2]],
+    'ő': [[9, 5], [2, 1]],  'Ő': [[2, 5], [9, 5], [2, 1]],
+    'ö': [[9, 5], [2, 3]],  'Ö': [[2, 5], [9, 5], [2, 3]],
+    'é': [[9, 5], [3, 2]],  'É': [[2, 5], [9, 5], [3, 2]],
+    'ú': [[9, 5], [4, 2]],  'Ú': [[2, 5], [9, 5], [4, 2]],
+    'ű': [[9, 5], [4, 1]],  'Ű': [[2, 5], [9, 5], [4, 1]],
+    'ü': [[9, 5], [4, 3]],  'Ü': [[2, 5], [9, 5], [4, 3]],
+    'í': [[9, 5], [5, 2]],  'Í': [[2, 5], [9, 5], [5, 2]],
+}
+
+def lookup_char(layer, ch):
+    if ch in charmap:
+        return charmap[ch]
+    return None
+
+def process_char(layer, ch, out=sys.stdout):
+    keys = lookup_char(layer, ch)
+    if not keys:
+        print ("Unknown char: %s" % ch, file=sys.stderr)
+    else:
+        for (c, r) in keys:
+            print ("KL: col=%d, row=%d, pressed=1, layer=%s" % (r, c, layer), file=out)
+            print ("KL: col=%d, row=%d, pressed=0, layer=%s" % (r, c, layer), file=out)
+
+def process_file(fn, layer, out=sys.stdout):
+    with open(fn, "r") as f:
+        ch = f.read(1)
+        while ch:
+            process_char(layer, ch, out)
+            ch = f.read(1)
+
+if sys.argv[1] == '-':
+    out='/dev/stdin'
+else:
+    out=sys.argv[1]
+
+if len(sys.argv) >= 2:
+    layer = 'ADORE'
+else:
+    layer = sys.argv[2]
+
+process_file(out, layer = layer)
diff --git a/keyboards/ergodox/keymaps/bepo_csa/keymap.c b/keyboards/ergodox/keymaps/bepo_csa/keymap.c
new file mode 100644 (file)
index 0000000..495242a
--- /dev/null
@@ -0,0 +1,527 @@
+/* TypeMatrix-2030-like keymap  */
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "action_util.h"
+#include "led.h"
+#include "keymap_extras/keymap_bepo.h"
+#include "keymap_extras/keymap_canadian_multilingual.h"
+
+enum layers {
+    LR_BASE, // default layer
+    LR_CSA, // BÉPO over Canadian Multilingual (CSA)
+    LR_CSA_SFT, // shifted BÉPO over CSA
+    LR_CSA_AGR, // altgr-ed BÉPO over CSA
+    LR_CSA_AGR_SFT, // altgr-shifted BÉPO over CSA
+    LR_NUMR, // numeric layer
+    LR_FN, // fn layer
+};
+
+#define IS_CA_MULT_ENABLED()    (layer_state & (1 << LR_CSA))
+
+enum macros {
+    // Characters that do not exist in CSA and must be implemented based on unicode support
+    // Note: these are intentionally declared first to be used as indexes in spec_chars below
+    UC_NDSH, // –
+    UC_MDSH, // —
+    UC_ELPS, // …
+    END_UC, // indicates the last unicode character macro
+    // other macros
+    M_CSA_SFT, // toggle shift on CSA
+    M_CSA_AGR_SFT, // toggle shift on LR_CSA_AGR (goes to LR_CSA_AGR_SFT)
+    M_CSA_SFT_AGR, // toggle AltGr on LR_CSA_SFT (goes to LR_CSA_AGR_SFT)
+    // macros for characters that need to be un-shifted in LR_CA_MULT_SHIFT
+    M_1,
+    M_2,
+    M_3,
+    M_4,
+    M_5,
+    M_6,
+    M_7,
+    M_8,
+    M_9,
+    M_0,
+    M_DEGR,
+    M_SCLN,
+    M_GRV,
+    M_NBSP,
+    // macros for characters that don't have a simple key combination in LR_CA_MULT_ALTGR
+    M_CRC,
+    // other layer macros
+    M_DBL0, // double 0
+    M_FNLR, // fn layer
+    M_NMAL, // num+alt
+};
+
+#define CSA(name)   M(M_CSA_##name)     // calls a CSA macro
+
+const uint16_t unicode_chars[] = {
+        [UC_NDSH] = L'–',
+        [UC_MDSH] = L'—',
+        [UC_ELPS] = L'…',
+};
+
+/* shortcut for unicode character macros */
+#define MUC(name)   M(UC_##name)    // calls a unicode macro
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Basic layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   $    |   "  |   «  |   »  |   (  |   )  | Del  |           | Del  |   @  |   +  |   -  |   /  |   *  |   W    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * | Tab    |   B  |   É  |   P  |   O  |   È  |Backsp|           |Backsp|   ^  |   V  |   D  |   L  |   J  |   Z    |
+ * |--------+------+------+------+------+------|ace   |           |ace   |------+------+------+------+------+--------|
+ * |   =    |   A  |   U  |   I  |   E  |   ,  |------|           |------|   C  |   T  |   S  |   R  |   N  |   M    |
+ * |--------+------+------+------+------+------|Enter |           |Enter |------+------+------+------+------+--------|
+ * | LShift |   À  |   Y  |   X  |   .  |   K  |      |           |      |   '  |   Q  |   G  |   H  |   F  | RShift |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |LCtrl |  fn  | LGui |numAlt| LAlt |                                       |Alt Gr|   %  |  App |   Ç  | RCtrl|
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                       ,--------------.       ,-------------.
+ *                                       |  Esc  | num  |       | Left |Right |
+ *                                ,------+-------+------|       |------+------+------.
+ *                                |      |       | PgUp |       |  Up  |      |      |
+ *                                |Space | Home  |------|       |------| End  |Space |
+ *                                |      |       | PgDn |       | Down |      |      |
+ *                                `---------------------'       `--------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[LR_BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        BP_DLR,     KC_1,      KC_2,    KC_3,      KC_4,     KC_5,    KC_DELT,
+        KC_TAB,     BP_B,      BP_ECUT, BP_P,      BP_O,     BP_EGRV, KC_BSPC,
+        BP_EQL,     BP_A,      BP_U,    BP_I,      BP_E,     BP_COMM,
+        KC_LSFT,    BP_AGRV,   BP_Y,    BP_X,      BP_DOT,   BP_K,    KC_ENT,
+        KC_LCTL,    M(M_FNLR), KC_LGUI, M(M_NMAL), KC_LALT,
+
+                                                   KC_ESC,   TG(LR_NUMR),
+                                                             KC_PGUP,
+                                          KC_SPC,  KC_HOME,  KC_PGDN,
+
+        // right hand
+        KC_DELT,   KC_6,     KC_7,    KC_8,    KC_9,    KC_0,     BP_W,
+        KC_BSPC,   BP_DCRC,  BP_V,    BP_D,    BP_L,    BP_J,     BP_Z,
+                   BP_C,     BP_T,    BP_S,    BP_R,    BP_N,     BP_M,
+        KC_ENT,    BP_APOS,  BP_Q,    BP_G,    BP_H,    BP_F,     KC_RSFT,
+                             BP_ALGR, BP_PERC, KC_APP,  BP_CCED,  KC_RCTL,
+
+        KC_LEFT, KC_RGHT,
+        KC_UP,
+        KC_DOWN, KC_END,   KC_SPC
+    ),
+/**
+ * Same as default but for use with Canadian Multilingual on OS side
+ */
+[LR_CSA] = KEYMAP(
+        // left hand
+        KC_DLR,      CSA_DQOT,   CSA_LGIL,  CSA_RGIL,  KC_LPRN,  KC_RPRN,   KC_TRNS,
+        KC_TRNS,     KC_B,       CSA_ECUT,  KC_P,      KC_O,     CSA_EGRV,  KC_TRNS,
+        KC_EQL,      KC_A,       KC_U,      KC_I,      KC_E,     KC_COMM,
+        CSA(SFT),    CSA_AGRV,   KC_Y,      KC_X,      KC_DOT,   KC_K,      KC_TRNS,
+        KC_TRNS,     KC_TRNS,    KC_TRNS,   KC_TRNS,   KC_TRNS,
+
+                                                       KC_TRNS,  KC_TRNS,
+                                                                 KC_TRNS,
+                                            KC_TRNS,   KC_TRNS,  KC_TRNS,
+
+        // right hand
+        KC_TRNS,  KC_AT,     KC_PLUS,  KC_MINS,  CSA_SLSH,  KC_ASTR,   KC_W,
+        KC_TRNS,  CSA_DCRC,  KC_V,     KC_D,     KC_L,      KC_J,      KC_Z,
+                  KC_C,      KC_T,     KC_S,     KC_R,      KC_N,      KC_M,
+        KC_TRNS,  CSA_APOS,  KC_Q,     KC_G,     KC_H,      KC_F,      CSA(SFT),
+                      MO(LR_CSA_AGR),  KC_PERC,  KC_TRNS,   CSA_CCED,  KC_LCTL, // RCTL has a special behaviour in CSA so use LCTL
+
+        KC_TRNS,  KC_TRNS,
+        KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS
+    ),
+/* Shifted BÉPO over Canadian Multilingual
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   #    |   1  |   2  |   3  |   4  |   5  |      |           |      |   6  |   7  |   8  |   9  |   0  |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |   !  |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   °    |      |      |      |      |   ;  |------|           |------|      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |   :  |      |      |           |      |   ?  |      |      |      |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |   `  |      |      |       |
+ *   `----------------------------------'                                       `-----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[LR_CSA_SFT] = KEYMAP(
+        // left hand
+        KC_HASH,  M(M_1),   M(M_2),   M(M_3),  M(M_4),   M(M_5),   KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS,
+        M(M_DEGR),KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS,  M(M_SCLN),
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_COLN,  KC_TRNS,  KC_TRNS,
+        KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS,
+
+                                                      KC_TRNS,  KC_TRNS,
+                                                                KC_TRNS,
+                                          M(M_NBSP),  KC_TRNS,  KC_TRNS,
+
+        // right hand
+        KC_TRNS,  M(M_6),    M(M_7),   M(M_8),   M(M_9),   M(M_0),   KC_TRNS,
+        KC_TRNS,  KC_EXLM,   KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
+                  KC_TRNS,   KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
+        KC_TRNS,  CSA_QEST,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,
+                        CSA(SFT_AGR),  M(M_GRV), KC_TRNS,  KC_TRNS,  KC_TRNS,
+
+        KC_TRNS,  KC_TRNS,
+        KC_TRNS,
+        KC_TRNS,  KC_TRNS,  M(M_NBSP)
+    ),
+/* AltGr-ed BÉPO over Canadian Multilingual
+ * "////" indicates that the key is disabled (unsupported bépo character)
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |    –   |   —  |   <  |   >  |   [  |   ]  |      |           |      |   ^  |   ±  | //// |   ÷  |   ×  | dead ˘ |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   |  |dead '|   &  |   œ  |dead `|      |           |      |   ¡  |dead ˇ|   ð  | //// |   ij  | ////// |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | ////// |   æ  |   ù  |dead "|   €  |   ̛’  |------|           |------|   ©  |   þ  |   ß  |   ®  |dead ~| dead ¯ |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |   \  |   {  |   }  |   …  |   ~  |      |           |      |   ¿  |dead °|   μ  | //// |dead ˛|        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      | //// |      |dead ¸|       |
+ *   `----------------------------------'                                       `-----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |   _  |      |------|       |------|      |  _   |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[LR_CSA_AGR] = KEYMAP(
+        // left hand
+        MUC(NDSH),    MUC(MDSH),  CSA_LESS,  CSA_GRTR,  CSA_LBRC,   CSA_RBRC,  KC_TRNS,
+        KC_TRNS,      CSA_PIPE,   CSA_DACT,  KC_AMPR,   CSA_OE,     CSA_DGRV,  KC_TRNS,
+        KC_NO,        CSA_AE,     CSA_UGRV,  CSA_DTRM,  CSA_EURO,   CSA_RQOT,
+        CSA(AGR_SFT), CSA_BSLS,   CSA_LCBR,  CSA_RCBR,  MUC(ELPS),  CSA_TILD,  KC_TRNS,
+        KC_TRNS,      KC_TRNS,    KC_TRNS,   KC_TRNS,   KC_TRNS,
+
+                                                      KC_TRNS,  KC_TRNS,
+                                                                KC_TRNS,
+                                        KC_UNDS, CSA(AGR_SFT),  KC_TRNS,
+
+        // right hand
+        KC_TRNS,  M(M_CRC),  CSA_PSMS,  KC_NO,     CSA_DVSN, CSA_TIMS,  CSA_DBRV,
+        KC_TRNS,  CSA_IXLM,  CSA_DCAR,  CSA_ETH,   KC_NO,    CSA_IJ,    KC_NO,
+                  CSA_CPRT,  CSA_THRN,  CSA_SRPS,  CSA_RTM,  CSA_DTLD,  CSA_DMCR,
+        KC_TRNS,  CSA_IQST,  CSA_DRNG,  CSA_MU,    KC_NO,    CSA_DOGO,  CSA(AGR_SFT),
+                             KC_TRNS,   KC_NO,     KC_TRNS,  CSA_DCED,  KC_TRNS,
+
+        KC_TRNS,  KC_TRNS,
+        KC_TRNS,
+        KC_TRNS,  CSA(AGR_SFT),  KC_UNDS
+    ),
+/* AltGr-shifted BÉPO over Canadian Multilingual
+ * "////" indicates that the key is disabled (unsupported bépo character or unused in bépo)
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |    ¶   | //// |   “  |   ”  | //// | //// |      |           |      | //// |   ¬  |   ¼  |   ½  |   ¾  | ////// |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |   ¦  |   ˝  |   §  |   Œ  |   `  |      |           |      | //// | //// |   Ð  | //// |   IJ  | ////// |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | ////// |   Æ  |   Ù  |dead-˙| //// | //// |------|           |------| //// |   Þ  |   ẞ   |   ™  | //// |   º    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        | //// |   ‘  |   ’  | //// | //// |      |           |      | //// | //// | //// | //// |   ª  |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[LR_CSA_AGR_SFT] = KEYMAP(
+        // left hand
+        CSA_PARG,      KC_NO,     CSA_LDQT,    CSA_RDQT,  KC_NO,     KC_NO,     KC_TRNS,
+        KC_TRNS,       CSA_BPIP,  CSA_DDCT,    CSA_SECT,  S(CSA_OE), M(M_GRV),  KC_TRNS,
+        KC_NO,         S(CSA_AE), S(CSA_UGRV), CSA_DDTA,  KC_NO,     KC_NO,
+        CSA(AGR_SFT),  KC_NO,     CSA_LQOT,    CSA_RQOT,  KC_NO,     KC_NO,     KC_TRNS,
+        KC_TRNS,       KC_TRNS,   KC_TRNS,     KC_TRNS,   KC_TRNS,
+
+        KC_TRNS,  KC_TRNS,
+        KC_TRNS,
+        KC_TRNS,  CSA(AGR_SFT),  KC_TRNS,
+
+        // right hand
+        KC_TRNS,  KC_NO,     CSA_NEGT,    CSA_1QRT,    CSA_1HLF,  CSA_3QRT,   KC_NO,
+        KC_TRNS,  KC_NO,     KC_NO,       S(CSA_ETH),  KC_NO,     S(CSA_IJ),  KC_NO,
+                  KC_NO,     S(CSA_THRN), S(CSA_SRPS), CSA_TM,    KC_NO,      CSA_ORDO,
+        KC_TRNS,  KC_NO,     KC_NO,       KC_NO,       KC_NO,     CSA_ORDA,   CSA(AGR_SFT),
+                        CSA(SFT_AGR),     KC_TRNS,     KC_TRNS,   KC_TRNS,    KC_TRNS,
+
+        KC_TRNS,  KC_TRNS,
+        KC_TRNS,
+        KC_TRNS,  CSA(AGR_SFT),  KC_TRNS
+    ),
+/* Numeric Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |      |      |  Tab |   /  |   *  |   -    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |  F6  |  F7  |  F8  |  F9  |  F10 |      |           |      |      | Home |   7  |   8  |   9  |   +    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  F11 |  F12 |      |      |      |------|           |------|  Up  | End  |   4  |   5  |   6  |   +    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           | Left | Down | Right|   1  |   2  |   3  |KpEnter |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |   0  |  00  |   .  |Etr/Ctl|
+ *   `----------------------------------'                                       `-----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |n.lock|c.lock|
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// SYMBOLS
+[LR_NUMR] = KEYMAP(
+       // left hand
+       KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_TRNS,
+       KC_TRNS, KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_TRNS,
+       KC_TRNS, KC_F11,  KC_F12,  KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+
+                                       KC_TRNS,KC_TRNS,
+                                               KC_TRNS,
+                              KC_TRNS, KC_TRNS,KC_TRNS,
+
+       // right hand
+       KC_TRNS, KC_F6,   KC_F7,   KC_TAB,  KC_PSLS,  KC_PAST, KC_PMNS,
+       KC_TRNS, KC_TRNS, KC_HOME, KC_P7,   KC_P8,    KC_P9,   KC_PPLS,
+                KC_UP,   KC_END,  KC_P4,   KC_P5,    KC_P6,   KC_PPLS,
+       KC_LEFT, KC_DOWN, KC_RGHT, KC_P1,   KC_P2,    KC_P3,   KC_PENT,
+                         KC_TRNS, KC_P0,   M(M_DBL0),KC_PDOT, CTL_T(KC_PENT),
+
+       KC_NLCK, KC_CAPS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* fn layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |~CA-mult|      |      |      |      |      |Insert|           |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |VolUp |           |      |      |      |      |      |      | Pause  |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |  RESET |      |      | Calc | Mail |Browsr|------|           |------|      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        | App  | cut  | copy |paste | Mute |VolDn |           |      |      |      |      |      |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      | Next |       |      |      |      |
+ *                                 | Mute | play |------|       |------|      |      |
+ *                                 |      |      | Prev |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// MEDIA AND MOUSE
+[LR_FN] = KEYMAP(
+       TG(LR_CSA), KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,      KC_TRNS, KC_INS,
+       KC_TRNS,    KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,      KC_TRNS, KC_VOLU,
+       RESET,      KC_TRNS, KC_TRNS,      KC_CALC,     KC_MAIL,      KC_WHOM,
+       KC_TRNS,    KC_APP,  S(KC_DELT),   LCTL(KC_INS),S(KC_INS),    KC_MUTE, KC_VOLD,
+       KC_TRNS,    KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,
+
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_MPRV,
+                                  KC_MUTE, KC_MPLY, KC_MNXT,
+
+    // right hand
+       KC_INS,   KC_EJCT, KC_PWR,  KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS,
+                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+};
+
+void hold_shift(void) {
+    register_code(KC_LSHIFT);
+}
+
+void release_shift(void) {
+    unregister_code(KC_LSHIFT);
+}
+
+uint16_t hextokeycode(int hex) {
+    if (hex == 0x0) {
+        return KC_P0;
+    } else if (hex < 0xA) {
+        return KC_P1 + (hex - 0x1);
+    } else {
+        return KC_A + (hex - 0xA);
+    }
+}
+
+void send_unicode(uint16_t unicode)
+{
+    // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
+    // Implemented for Windows:
+    // Pressing ALT followed by + followed by the unicode code point in hex.
+    // Requires registry key HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad set to String 1
+    register_code(KC_LALT);
+    register_code(KC_PPLS);
+    unregister_code(KC_PPLS);
+
+    for (int i = 12; i >= 0; i -= 4) {
+        register_code(hextokeycode((unicode >> i) & 0xF));
+        unregister_code(hextokeycode((unicode >> i) & 0xF));
+    }
+
+    unregister_code(KC_LALT);
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+    switch(id) {
+        case 0 ... END_UC:
+            if (record->event.pressed) {
+                send_unicode(unicode_chars[id]);
+            }
+            break;
+        case M_CSA_SFT:
+            // BÉPO over CSA: toggle shift layer
+            layer_invert(LR_CSA_SFT);
+            if (record->event.pressed) {
+                hold_shift();
+            } else {
+                release_shift();
+            }
+            break;
+        case M_CSA_SFT_AGR:
+            // BÉPO over CSA: from shift layer, momentary altgr+shift layer
+            layer_invert(LR_CSA_AGR);
+            layer_invert(LR_CSA_AGR_SFT);
+            if (record->event.pressed) {
+                // shift not needed for LR_CSA_AGR_SFT
+                release_shift();
+            } else {
+                // back to shift layer
+                hold_shift();
+            }
+            break;
+        case M_CSA_AGR_SFT:
+            // BÉPO over CSA: from altgr layer, momentary altgr+shift layer
+            layer_invert(LR_CSA_SFT);
+            layer_invert(LR_CSA_AGR_SFT);
+            break;
+        case M_1 ... M_0:
+        case M_DEGR:
+        case M_SCLN:
+        case M_GRV:
+        case M_NBSP:
+            // macros of the shift layer that require to release shift
+            if (record->event.pressed) {
+                release_shift();
+                switch (id) {
+                    case M_1 ... M_0:
+                        register_code(KC_1 + (id - M_1));
+                        break;
+                    case M_DEGR:
+                        return MACRO(DOWN(CSA_ALTGR), D(SCLN), END);
+                    case M_SCLN:
+                        return MACRO(D(SCLN), END);
+                    case M_GRV:
+                        return MACRO(I(75), DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END);
+                    case M_NBSP:
+                        // use weak mod such that pressing another key will not be affected
+                        add_weak_mods(MOD_BIT(CSA_ALTGR));
+                        return MACRO(D(SPACE), END);
+                }
+            } else {
+                hold_shift();
+                switch (id) {
+                    case M_1 ... M_0:
+                        unregister_code(KC_1 + (id - M_1));
+                        break;
+                    case M_DEGR:
+                        return MACRO(UP(CSA_ALTGR), U(SCLN), END);
+                    case M_SCLN:
+                        return MACRO(U(SCLN), END);
+                    case M_NBSP:
+                        del_weak_mods(MOD_BIT(CSA_ALTGR));
+                        return MACRO(U(SPACE), END);
+                }
+            }
+            break;
+        case M_CRC:
+            if (record->event.pressed) {
+                return MACRO(I(75), TYPE(CSA_DCRC), T(SPACE), END);
+            }
+            break;
+        case M_DBL0:
+            if (record->event.pressed) {
+                return MACRO( I(25), T(P0), T(P0), END );
+            }
+        break;
+        case M_FNLR:
+            layer_invert(LR_NUMR);
+            layer_invert(LR_FN);
+            break;
+        case M_NMAL:
+            layer_invert(LR_NUMR);
+            if (record->event.pressed) {
+                register_code(KC_LALT);
+            } else {
+                unregister_code(KC_LALT);
+            }
+            break;
+    }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    // led 1: numeric layer
+    if (layer_state & (1 << LR_NUMR)) {
+        ergodox_right_led_1_on();
+    }
+    // led 2: BÉPO over Canadian Multilingual
+    if (IS_CA_MULT_ENABLED()) {
+        ergodox_right_led_2_on();
+    }
+    // led 3: caps lock
+    if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
+      ergodox_right_led_3_on();
+    }
+};
diff --git a/keyboards/ergodox/keymaps/bepo_csa/readme.md b/keyboards/ergodox/keymaps/bepo_csa/readme.md
new file mode 100644 (file)
index 0000000..d4975b2
--- /dev/null
@@ -0,0 +1,162 @@
+# BÉPO Keymap with firmware-remapping for software CSA layout
+
+This is a keymap intended to be used with the [BÉPO layout](http://bepo.fr), a French ergonomic layout designed by following Dvorak's principles.
+
+The particularity of this keymap is that it supports using the [Canadian Multilingual Standard layout](https://en.wikipedia.org/wiki/QWERTY#Canadian_Multilingual_Standard) (also known as _ACNOR keyboard_ or _CSA keyboard_, see also the [French page](https://fr.wikipedia.org/wiki/QWERTY#Clavier_canadien_multilingue_standard) which contains more details) on the OS side, by enabling the _CSA_ layer. This is especially useful for operating systems that natively provide CSA, but not BÉPO, like Windows. The CSA layout was chosen because it is probably the standard layout that provides the best character set coverage.
+
+This keymap is based on the [tm2030](../tm2030/) keymap, whose goal was to have a [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) inspired layout for the ErgoDox EZ.
+
+As this keyboard is intended for French people, the rest of this page will be in French.
+
+# Keymap BÉPO avec support en firmware pour utilisation avec la disposition CSA en software
+
+Cette keymap a été conçue pour être utilisée avec la [disposition BÉPO](http://bepo.fr), la disposition francophone, ergonomique et libre basée sure les principes de Dvorak.
+
+La particularité de cette keymap est qu'elle supporte l'utilisation du [clavier canadien multilingue standard](https://fr.wikipedia.org/wiki/QWERTY#Clavier_canadien_multilingue_standard) (aussi appelé _clavier ACNOR_ ou _clavier CSA_) du côté du système d'exploitation, en activant la couche _CSA_. Ceci s'avère particulièrement utile pour les systèmes d'exploitations qui fournissent nativement le CSA, mais pas le BÉPO, comme Windows. Le clavier CSA a été choisi comme base car c'est probablement la disposition standard qui fournit la meilleure couverture en termes de caractères disponibles.
+
+Cette keymap est basée sur la keymap [tm2030](../tm2030/), dont le but est de fournir une disposition inspirée du [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) pour l'ErgoDox EZ.
+
+## Couche de base
+C'est la couche par défaut, proche du TypeMatrix, avec les différences suivantes:
+- La ligne du haut (les touches `F`) et la colonne de droite sont retirées, les touches correspondantes étant déplacées ailleurs.
+- Les touches situés en bas à gauche sont redisposées dans cet ordre: `Ctrl`, `fn`, `Gui`, `num+Alt`, `Alt`
+- Les touches `shuffle` (`Alt+Tab`) et `desktop` ne sont pas supportés
+- `W` est déplacé à la place de `=`
+- `=` est déplacé sous `Tab` (au lieu d'avoir un grand `Shift`)
+- `%` et `Ç` sont déplacés à la place de `Home` et `End` respectivement
+- Les flèches ainsi que `PgUp`/`PgDown`/`Home`/`End` sont déplacées sur les pouces
+
+À noter que pour `W` et `Ç`, le but a été de ne pas les déplacer trop par rapport à la disposition BÉPO _standard_, afin de pouvoir repasser facilement sur un TypeMatrix ou un clavier traditionnel.
+
+
+```
+,--------------------------------------------------.           ,--------------------------------------------------.
+|   $    |   "  |   «  |   »  |   (  |   )  | Del  |           | Del  |   @  |   +  |   -  |   /  |   *  |   W    |
+|--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+| Tab    |   B  |   É  |   P  |   O  |   È  |Backsp|           |Backsp|   ^  |   V  |   D  |   L  |   J  |   Z    |
+|--------+------+------+------+------+------|ace   |           |ace   |------+------+------+------+------+--------|
+|   =    |   A  |   U  |   I  |   E  |   ,  |------|           |------|   C  |   T  |   S  |   R  |   N  |   M    |
+|--------+------+------+------+------+------|Enter |           |Enter |------+------+------+------+------+--------|
+| LShift |   À  |   Y  |   X  |   .  |   K  |      |           |      |   '  |   Q  |   G  |   H  |   F  | RShift |
+`--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+  |LCtrl |  fn  | LGui |numAlt| LAlt |                                       |Alt Gr|   %  |  App |   Ç  | RCtrl|
+  `----------------------------------'                                       `----------------------------------'
+                                      ,--------------.       ,-------------.
+                                      |  Esc  | num  |       | Left |Right |
+                               ,------+-------+------|       |------+------+------.
+                               |      |       | PgUp |       |  Up  |      |      |
+                               |Space | Home  |------|       |------| End  |Space |
+                               |      |       | PgDn |       | Down |      |      |
+                               `---------------------'       `--------------------'
+```
+
+### Changer de couche
+
+- Utilisez `num` pour activer/désactiver [la couche numérique](#couche-numérique)
+- Maintenez `fn` pour activer temporairement [les couches numériques et Fn](#couche-fn)
+- Maintenez `numAlt` pour activer temporairement la couche numérique combinée avec `Alt` (facilite l'utilisation des raccourcis tels que `Alt`+`F4`)
+
+### Diodes
+Les diodes de l'ErgoDox EZ (côté droit) sont utilisées de la façon suivante :
+
+- diode de gauche (rouge) : indique l'activation de [la couche numérique](#couche-numérique)
+- diode du milieu (verte) : indique l'activation du [mode CSA](#couche-csa)
+- diode de droite (bleue) : indique le verrouillage majuscules
+
+## Couche CSA
+La couche _CSA_ est la même que la couche de base, pour une utilisation avec un clavier Canadien Multilingue configuré dans le système d'exploitation.
+
+Pour l'activer, appuyez sur `fn`+`$`. La [diode](#diodes) verte indique que la couche CSA est activée.
+
+### Limitations
+Seuls les caractères présents dans le clavier CSA sont parfaitement supportés. De manière générale, il s'agit des caractères suivants :
+
+- toute la couche de base
+- tous les caractères accessibles en `Shift`
+- tous les caractères de la main gauche accessibles en `AltGr` à l'exception du `≠`
+- environ la moitié des caractères de la main droite accessibles en `AltGr` et la moitié des caractères accessibles en `AltGr`+`Shift` (consultez [le fichier source](keymap.c) pour voir les caractères supportés)
+
+En particulier, les caractères suivants sont émulés via le support Unicode (Windows seulement):
+
+- le tiret cadratin (tiret long) : —
+- le tiret demi-cadratin (demi tiret) : –
+- les points de suspension : …
+
+L'implémentation actuelle ne fonctionne pas dans toutes les applications, en particulier les applications MS Office.
+
+Il est probable que l'utilisation de la couche CSA ne fonctionne pas correctement dans certains jeux vidéos.
+
+Cette fonctionnalité a été conçue et testée essentiellment pour Windows (7).
+
+### Détails techniques
+Techniquement, la couche CSA est en réalité composée de 4 couches servant à émuler la couche de base, les appuis sur `Shift` ou `Alt` et la combinaison des deux.
+
+Le changement de couches se fait par des macros afin d'activer ou désactiver plusieurs couches et la touche `Shift` en même temps.
+
+Certains caractères sont également implémentés par des macros, notamment ceux de la couche `Shift` qui n'ont pas besoin de cette touche en CSA, comme les chiffres.
+
+Les caractères Unicode se basent sur une implémentation spécifique et non celle fournie dans QMK — il faudrait sans doute migrer le code. Notez la façon dont ces caractères sont déclarés tels quels dans [le code source](keymap.c) (tableau `unicode_char`).
+
+## Couche numérique
+Couche numérique proche du TM lorsqu'on active `num`, avec les différences suivantes :
+
+- Le clavier numérique est déplacés de 1 vers le haut et vers la droite.
+- Les flèches sont décalées de 1 vers la gauche.
+- Fournit l'accès aux touches `F1` à `F12`, `caps-lock` et `num-lock`.
+
+La couche numérique est indiquée par la [diode](#diodes) de gauche (rouge). Caps-lock est indiqué par la diode de droite (bleue).
+
+La touche `numAlt` de [la couche de base](#couche-de-base) permet d'activer la couche numérique et la touche `Alt` simultanément, afin de faciliter les raccourcis claviers comme `Alt`+`F4`.
+
+```
+,--------------------------------------------------.           ,--------------------------------------------------.
+|        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |      |      |  Tab |   /  |   *  |   -    |
+|--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+|        |  F6  |  F7  |  F8  |  F9  |  F10 |      |           |      |      | Home |   7  |   8  |   9  |   +    |
+|--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+|        |  F11 |  F12 |      |      |      |------|           |------|  Up  | End  |   4  |   5  |   6  |   +    |
+|--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+|        |      |      |      |      |      |      |           | Left | Down | Right|   1  |   2  |   3  |KpEnter |
+`--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+  |      |      |      |      |      |                                       |      |   0  |  00  |   .  |Etr/Ctl|
+  `----------------------------------'                                       `-----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       |      |      |       |n.lock|c.lock|
+                                ,------|------|------|       |------+------+------.
+                                |      |      |      |       |      |      |      |
+                                |      |      |------|       |------|      |      |
+                                |      |      |      |       |      |      |      |
+                                `--------------------'       `--------------------'
+```
+
+## Couche Fn
+Activée simultanément avec la couche numérique lorsque l'on maintient la touche `fn`. Comme sur le TM, elle fournit l'accès aux fonctionnalités suivantes :
+
+- `couper`, `copier` et `coller` — attention: ne pas utiliser dans l'explorateur de fichiers.
+- monter/baisser/couper le volume — seulement accessible en main gauche, contrairement au TM.
+- piste précédente/suivante
+- calculatrice, e-mail et page d'accueil du navigateur web
+- `insert`, `power`, `sleep`, `wake`, `print screen`, `scroll-lock` et `pause`
+- ~CSA: (dés)activation de [la couche CSA](#couche-csa) sur `$`
+- RESET: rechargement du firmware avec Teensy-Loader (pour les développeurs)
+
+```
+,--------------------------------------------------.           ,--------------------------------------------------.
+|  ~CSA  |      |      |      |      |      |Insert|           |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
+|--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+|        |      |      |      |      |      |VolUp |           |      |      |      |      |      |      | Pause  |
+|--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+|  RESET |      |      | Calc | Mail |Browsr|------|           |------|      |      |      |      |      |        |
+|--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+|        | App  | cut  | copy |paste | Mute |VolDn |           |      |      |      |      |      |      |        |
+`--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+  |      |      |      |      |      |                                       |      |      |      |      |      |
+  `----------------------------------'                                       `----------------------------------'
+                                       ,-------------.       ,-------------.
+                                       |      |      |       |      |      |
+                                ,------|------|------|       |------+------+------.
+                                |      |      | Next |       |      |      |      |
+                                | Mute | play |------|       |------|      |      |
+                                |      |      | Prev |       |      |      |      |
+                                `--------------------'       `--------------------'
+```
\ No newline at end of file
index 1b80cb3a236f628f99ef05a2ae4f7ad5066d9aeb..2f399bd18150959813c30746124b80570bebec56 100644 (file)
@@ -7,6 +7,8 @@
 #define SYMB 1 // symbols
 #define MDIA 2 // media keys
 
+#define EPRM M(1) // Macro 1: Reset EEPROM
+
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 0: Basic layer
  *
@@ -62,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
  * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
+ *   | EPRM |      |      |      |      |                                       |      |    . |   0  |   =  |      |
  *   `----------------------------------'                                       `----------------------------------'
  *                                        ,-------------.       ,-------------.
  *                                        |      |      |       |      |      |
@@ -79,7 +81,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
        KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
        KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
-       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+          EPRM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
                                        KC_TRNS,KC_TRNS,
                                                KC_TRNS,
                                KC_TRNS,KC_TRNS,KC_TRNS,
@@ -149,6 +151,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
           SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
         }
         break;
+        case 1:
+        if (record->event.pressed) { // For resetting EEPROM
+          eeconfig_init();
+        }
+        break;
       }
     return MACRO_NONE;
 };
@@ -158,6 +165,7 @@ void matrix_init_user(void) {
 
 };
 
+
 // Runs constantly in the background, in a loop.
 void matrix_scan_user(void) {
 
index 8f6dba45e9a67d28de86d871996b180384b66f2e..f68138ed628f3e4281590fa922247292b11342d8 100644 (file)
@@ -2,6 +2,8 @@
 
 ## Changelog
 
+* Sep 22, 2016:
+  * Created a new key in layer 1 (bottom-corner key) that resets the EEPROM.
 * Feb 2, 2016 (V1.1): 
   * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows).
 
index a920850039eba96cc0d1bd98fdead41cc3ad5111..467996686977e5f1d6fb2549b28f545dc4876ea1 100644 (file)
@@ -1,3 +1,6 @@
+/* Setup to approximate a Kinesis Advantage with an eye to use in a
+ * Mac/OSX environment 
+ * This version adds a hand swap feature to flip the keyboard */
 #include "ergodox.h"
 #include "debug.h"
 #include "action_layer.h"
@@ -18,10 +21,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
  * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
- *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
+ *   |Grv/L1|   \  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  |Grv/L1|
  *   `----------------------------------'                                       `----------------------------------'
  *                                      ,---------------.       ,---------------.
- *                                      |Ctrl/Esc| Alt  |       | Alt  |Ctrl/Esc|
+ *                                      |  LGUI  |Al/Esc|       |Al/Esc|  RGUI  |
  *                               ,------|--------|------|       |------+--------+------.
  *                               |      |        | Home |       | PgUp |        |      |
  *                               |Backsp|   Del  |------|       |------| Enter  | Space|
@@ -31,33 +34,34 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
 // Otherwise, it needs KC_*
 [BASE] = KEYMAP(  // layer 0 : default
-        // left hand
-        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LGUI,
-        KC_TAB,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(1),
-        KC_LCTL,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
-        KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
-        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
-                                              CTL_T(KC_ESC),  ALT_T(KC_APP),
-                                                              KC_HOME,
-                                               KC_BSPC,KC_DEL,KC_END,
-        // right hand
-             KC_APP,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
-             TG(1),       KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
-                          KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),KC_QUOT,
-             MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
-                                  KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
-             KC_LALT,        CTL_T(KC_ESC),
-             KC_PGUP,
-             KC_PGDN,KC_ENT, KC_SPC
-    ),
+    // left hand
+    KC_EQL,          KC_1,         KC_2,          KC_3,    KC_4,    KC_5,   KC_LGUI,
+    KC_TAB,          KC_Q,         KC_W,          KC_E,    KC_R,    KC_T,   TG(1),
+    KC_LCTL,         KC_A,         KC_S,          KC_D,    KC_F,    KC_G,
+    KC_LSFT,         CTL_T(KC_Z),  KC_X,          KC_C,    KC_V,    KC_B,   ALL_T(KC_NO),
+    KC_FN1, KC_BSLS,      LALT(KC_LSFT), KC_LEFT, KC_RGHT,
+                                                                    KC_LGUI,         ALT_T(KC_ESC),
+                                                                                     KC_HOME,
+                                                                    KC_BSPC, KC_DEL, KC_END,
+    // right hand
+    KC_APP,       KC_6,    KC_7,    KC_8,    KC_9,    KC_0,              KC_MINS,
+    TG(1),        KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,              KC_BSLS,
+                  KC_H,    KC_J,    KC_K,    KC_L,    LT(MDIA, KC_SCLN), KC_QUOT,
+    MEH_T(KC_NO), KC_N,    KC_M,    KC_COMM, KC_DOT,  CTL_T(KC_SLSH),    KC_RSFT,
+                           KC_UP,   KC_DOWN, KC_LBRC, KC_RBRC,           KC_FN1,
+    ALT_T(KC_ESC),         KC_RGUI,
+    KC_PGUP,
+    KC_PGDN,      KC_ENT,  KC_SPC
+),
+
 /* Keymap 1: Symbol Layer
  *
  * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * | PrScr  |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
- * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
+ * | ScrLk  |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
+ * | Pause  |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
  * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
@@ -74,14 +78,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // SYMBOLS
 [SYMB] = KEYMAP(
        // left hand
-       KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
-       KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
-       KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
-       KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
-       KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
-                                       KC_TRNS,KC_TRNS,
-                                               KC_TRNS,
-                               KC_TRNS,KC_TRNS,KC_TRNS,
+       KC_PSCR, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_TRNS,
+       KC_SLCK, KC_EXLM, KC_AT,   KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS,
+       KC_PAUS, KC_HASH, KC_DLR,  KC_LPRN, KC_RPRN, KC_GRV,
+       KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
        // right hand
        KC_TRNS, KC_F6,   KC_F7,  KC_F8,   KC_F9,   KC_F10,  KC_F11,
        KC_TRNS, KC_UP,   KC_7,   KC_8,    KC_9,    KC_ASTR, KC_F12,
@@ -92,6 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS
 ),
+
 /* Keymap 2: Media and mouse keys
  *
  * ,--------------------------------------------------.           ,--------------------------------------------------.
@@ -135,10 +140,6 @@ KEYMAP(
 ),
 };
 
-const uint16_t PROGMEM fn_actions[] = {
-    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
-};
-
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
   // MACRODOWN only works in this function
@@ -154,6 +155,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     return MACRO_NONE;
 };
 
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_SWAP_HANDS_TAP_KEY(KC_GRV)       // FN1 - Tap = Grave/Tilde - Hold Momentary swap hands
+};
+
 // Runs just one time when the keyboard initializes.
 void matrix_init_user(void) {
 
diff --git a/keyboards/ergodox/keymaps/kastyle/readme.md b/keyboards/ergodox/keymaps/kastyle/readme.md
new file mode 100644 (file)
index 0000000..944286a
--- /dev/null
@@ -0,0 +1,14 @@
+The kastyle keymap was originally intended to remap the ErgoDox EZ to more
+closely approximate the layout of a Kinesis Advantage. Notable changes
+over the stock ErgoDox layout include:
+
+  * Re-arragnement of tab, enter, space, and delete to match the Kinesis
+  * Addition of print screen, pause, etc. keys following the kines-ish keymap
+  on L1
+  * GUI keys have replaced Ctrl on the thumb keys (for Mac use), and Alt keys
+  are mapped to allow Esc on tap (good for Vi users)
+  * Most notably, the addition of a momentary one-handed mode for quick and
+  easy access to keys on the other half of the keyboard, e.g. while using a 
+  mouse in one hand, one may add text to a dialogue box with the other without
+  having to reach across the keyboard or remove one's hand from the mouse.
+
diff --git a/keyboards/ergodox/keymaps/mclennon_osx/README.md b/keyboards/ergodox/keymaps/mclennon_osx/README.md
new file mode 100644 (file)
index 0000000..60980d0
--- /dev/null
@@ -0,0 +1,5 @@
+# Ergodox EZ for OS X
+
+This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. 
+
+If you choose to compile this yourself, be sure to compile with `#define PREVENT_STUCK_MODIFIERS` in your `config.h`. Firmware built using [qmk_firmware](https://github.com/jackhumbert/qmk_firmware/).
diff --git a/keyboards/ergodox/keymaps/mclennon_osx/keymap.c b/keyboards/ergodox/keymaps/mclennon_osx/keymap.c
new file mode 100644 (file)
index 0000000..627ff01
--- /dev/null
@@ -0,0 +1,144 @@
+// Media keys work on OSX, but not on Windows.
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0  // Default layer
+#define AUXI 1  // Auxiliary layer
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   ~`   |   1  |   2  |   3  |   4  |   5  |   6  |           |   7  |   8  |   9  |   0  |   -_ |   += |  Bkspc |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |   Tab  |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  Del |   Y  |   U  |   I  |   O  |   P  |   |\   |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   L1   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |  ;:  |  Enter |
+ * |--------+------+------+------+------+------| {[   |           | }]   |------+------+------+------+------+--------|
+ * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   <, |   >. |  ?/  |   "'   |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |LCtrl |      |      |      |  Esc |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |Power |      |
+ *                                 ,------|------|------|       |------+--------+------.
+ *                                 |      |      |      |       |      |        |      |
+ *                                 | LGui | LAlt |------|       |------|  Bkspc |Space |
+ *                                 |      |      |      |       |  Del |        |      |
+ *                                 `--------------------'       `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP(  // layer 0 : default
+        // left hand
+        KC_GRV,     KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,
+        KC_TAB,     KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   MO(1),
+        MO(1),      KC_A,   KC_S,   KC_D,   KC_F,   KC_G,
+        KC_LSHIFT,  KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_LBRC,
+        KC_LCTL,    KC_TRNS,KC_TRNS,KC_TRNS,KC_ESC,
+                                                    KC_TRNS,KC_TRNS,
+                                                            KC_TRNS,
+                                            KC_LGUI,KC_LALT,KC_TRNS,
+
+        // right hand
+        KC_7,       KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSPC,
+        KC_DELETE,  KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_BSLASH,
+                    KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_ENT,
+        KC_RBRC,    KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,KC_QUOT,
+                         KC_TRNS,   KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+        KC_PWR,    KC_TRNS,
+        KC_TRNS,
+        KC_DELETE,    KC_BSPC, KC_SPC
+    ),
+/* Keymap 1: Auxiliary Layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |           |  F7  |  F8  |  F9  | F10  | F11  | F12  |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      |      |      |      | TRNS |           |      | Mute | VolDn| VolUp| Play |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |   TRNS |      |LShift| LCtrl|      |      |------|           |------| LEFT | DOWN | UP   |RIGHT |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * | LShift |      |      |      |      |      |      |           |      | MPrv | MNxt |      |      |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |LCtrl |      |      |      |      |                                       |      |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 | LGui | LAlt |------|       |------| Bkspc| Space|
+ *                                 |      |      |      |       |  Del |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+// AUXILIARY
+[AUXI] = KEYMAP(
+       // left hand
+       KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_LSHIFT,KC_LCTL, KC_TRNS, KC_TRNS,
+       KC_LSHIFT,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_LGUI, KC_LALT, KC_TRNS,
+       // right hand
+       KC_F7,    KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS,
+       KC_TRNS,  KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_TRNS, KC_TRNS,
+                 KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_PWR, KC_TRNS,
+       KC_TRNS,
+       KC_DELETE, KC_BSPC, KC_SPC
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_LAYER_TAP_TOGGLE(AUXI)                // FN1 - Momentary Layer 1 (Auxiliary)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+          break;
+      }
+    return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+    uint8_t layer = biton32(layer_state);
+
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+    switch (layer) {
+      // TODO: Make this relevant to the ErgoDox EZ.
+        case 1:
+            ergodox_right_led_1_on();
+            break;
+        case 2:
+            ergodox_right_led_2_on();
+            break;
+        default:
+            // none
+            break;
+    }
+
+};
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keyboard-layout.png b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keyboard-layout.png
new file mode 100644 (file)
index 0000000..544b565
Binary files /dev/null and b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keyboard-layout.png differ
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keymap.c b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/keymap.c
new file mode 100644 (file)
index 0000000..1d505f8
--- /dev/null
@@ -0,0 +1,180 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "keymap_norwegian.h"
+
+#define BASE 0 // default layer
+#define BASE_MAC 1 // default layer mac
+#define NUMB_FUNC 2 // numbers and function keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Keymap 0: Basic layer PC
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |    *   |   [  |   ]  |   {  |   }  |   ~  |Mac/PC|           |   ^  |   $  |   (  |   )  |   <  |   >  |   @    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |    +   |   Q  |   W  |   E  |   R  |   T  |  "   |           |   '  |   Y  |   U  |   I  |   O  |   P  |   Å    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |    /   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   Ø  |   Æ    |
+ * |--------+------+------+------+------+------|  ;   |           |   =  |------+------+------+------+------+--------|
+ * |    -   |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  | RIGHT| DOWN |   UP |   _    |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Alt/esc|  !  |   ?  |   :  | TAB  |                                       | LEFT |  _  |   &   |   |  |Num/fn|
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,--------------.
+ *                                        |   #  |  `   |       |Insert|   %   |
+ *                                 ,------|------|------|       |------+-------+------.
+ *                                 |      |      |  ´   |       |  Del |       |      |
+ *                                 | Shift|Ctrl/.|------|       |------| Enter |Space |
+ *                                 |      |      |GUI/, |       | Bspc |       |      |
+ *                                 `--------------------'       `---------------------'
+ */
+[BASE] = KEYMAP(
+        // left hand
+        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, KC_FN2,  TG(1),
+        KC_PPLS,         KC_Q,         KC_W,    KC_E,   KC_R,   KC_T,   NO_QUO2,
+        KC_PSLS,         KC_A,         KC_S,    KC_D,   KC_F,   KC_G,
+        KC_PMNS,        KC_Z,         KC_X,    KC_C,   KC_V,   KC_B,   NO_SCLN,
+        ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
+                                                      KC_HASH, KC_FN7,
+                                                              KC_FN6,
+                                               KC_FN1,CTL_T(KC_DOT),GUI_T(KC_COMMA),
+        // right hand
+             KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
+             NO_APOS,      KC_Y,    KC_U,    KC_I,      KC_O,     KC_P,   NO_AA  ,
+                           KC_H,    KC_J,    KC_K,      KC_L,  NO_OSLH,    NO_AE,
+             NO_EQL,        KC_N,    KC_M, KC_RIGHT,  KC_DOWN,   KC_UP,    NO_BSLS,
+                                  KC_LEFT,  NO_UNDS, NO_AMPR,  NO_PIPE,    OSL(2),
+             KC_INSERT,  KC_PERC,
+             KC_DELT,
+             KC_BSPC,KC_ENT,KC_SPC
+    ),
+/* Keymap 1: Basic layer MACS (Same as pc, except for cmd/ctrl, which are swapped)
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   \    |      |      |   {  |   }  |      |      |           |      |   $  |      |      |  <   |   >  |    @   |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |  '   |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |------|           |------|      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |,/Ctrl|                                       |      |      |  `   |      |Num/fn|
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |  `   |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |   ´  |       |      |      |      |
+ *                                 |      |GUI/. |------|       |------|      |      |
+ *                                 |      |      |crtl/,|       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[BASE_MAC] = KEYMAP(
+       KC_TRNS, KC_TRNS,KC_TRNS, NO_LCBR_MAC,NO_RCBR_MAC, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, NO_GRV_MAC,
+                                                    KC_FN10,
+                                  KC_TRNS,GUI_T(KC_DOT) , CTL_T(KC_COMMA),
+    // right hand
+       KC_TRNS,  NO_DLR_MAC, KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_AT_MAC,
+       NO_APOS_MAC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NO_BSLS_MAC,
+                          KC_TRNS, KC_TRNS, KC_TRNS, NO_PIPE_MAC, OSL(2),
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+/* Keymap 2: Number ++´ánd Fn layer
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |  F9  |  F10 |  F11 |  F12 |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |  8   |  7   |  6   |   5  |  9   |      |           |      |      |  F5  |  F6  |  F7  |  F8  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  4   |  3   |  2   |   1  |  0   |------|           |------|      |  F1  |  F2  |  F3  |  F4  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |  END | PGDWN| PGUP |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       | HOME |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[NUMB_FUNC] = KEYMAP(
+       NO_ASTR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       NO_PLUS, KC_8, KC_7,KC_6,KC_5, KC_9 , KC_TRNS,
+       NO_SLSH , KC_4   , KC_3   , KC_2   , KC_1   , KC_0,
+       NO_MINS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
+    // right hand
+       KC_TRNS,  KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_F5, KC_F6 , KC_F7, KC_F8, KC_TRNS,
+                 KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS,
+       KC_TRNS,  KC_HOME, KC_TRNS, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
+                          KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+)
+};
+
+enum macro_id {
+    TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO,  GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_MODS_ONESHOT(MOD_LSFT),  // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
+    [2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
+    [3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
+    [4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
+    [5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
+    [6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
+    [7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
+    [8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
+    [9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
+    [10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
+};
+
+
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    keyevent_t event = record->event;
+
+    switch (id) {
+        case TILDE_NO:
+            return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
+        case LESS_NO:
+            return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
+        case GRTR_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
+        case CIRC_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
+        case ACUT_NO:
+            return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC),  END ) : MACRO_NONE);
+        case GRV_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT),  END ) : MACRO_NONE);
+        case LESS_NO_MAC:
+            return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
+        case GRTR_NO_MAC:
+            return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
+        case ACUT_NO_MAC:
+            return (event.pressed ? MACRO( T(EQL), T(SPC),  END ) : MACRO_NONE);
+    }
+    return MACRO_NONE;
+};
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/readme.md b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc/readme.md
new file mode 100644 (file)
index 0000000..f7e8baf
--- /dev/null
@@ -0,0 +1,30 @@
+# Norwegian setup with osx/pc toggle
+
+## Motivation
+I wanted a Norwegian setup that worked in a similar way on both my Mac and PC. I also wanted the keyboard to translate from a standard Norwegian keyboard OS setup.
+
+## Overview
+The setup is created to be programmer friendly.
+- Most of the symbols used in code can be activated without using layers or shift key.
+- You can reach the IDE/OS shortcut activators(Ctrl, Win/Cmd, Alt, Shift) with the thumb or the wrist.
+- Navigation is prioritized, arrows below the home row.
+
+## PC/Mac toggle
+The default setup is for Norwegian keyboard setting(on a PC(Windows or Linux) or Mac. Use the Mac/PC toggle button to switch between OSX and PC setup. The settings will be reverted to PC setup each time you restart/connect the keyboard.
+
+## Layers
+Since symbols are prioritized in this setup, numbers and function keys are on a new layer. The easiest way to use the layer switch(and also the alt key), is to push your hand right below the little finger, on the key. You will then have all your fingers free to type numbers or press function keys.
+
+## Tap-shift
+Tap for the next character to be shifted, hold down for regular shift.
+
+## Comma dot and escape
+Comma, dot and escape share buttons with modifier keys. Tap to access these keys, hold down to use the keys as modifier keys.
+
+## Numpad symbols
++-/* are implemented with the numpad keycodes. The benefit is that they will work better with shortcuts in certain programs. For some reason, the default setting in the osx terminal is to not accept numpad characters for '/' and '-'. For a solution, see https://discussions.apple.com/thread/6613968?start=0&tstart=0.
+If you really need the norwegian symbols in a program, you can access them using the number toggle button. 
+
+## Layout
+
+![keyboard-layout](keyboard-layout.png)
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keyboard-layout.png b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keyboard-layout.png
new file mode 100644 (file)
index 0000000..462de5c
Binary files /dev/null and b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keyboard-layout.png differ
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keymap.c b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/keymap.c
new file mode 100644 (file)
index 0000000..acf74a4
--- /dev/null
@@ -0,0 +1,180 @@
+#include "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "keymap_norwegian.h"
+
+#define BASE 0 // default layer
+#define BASE_MAC 1 // default layer mac
+#define NUMB_FUNC 2 // numbers and function keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Keymap 0: Basic layer PC
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |    *   |   [  |   ]  |   {  |   }  |   ~  |Mac/PC|           |   ^  |   $  |   (  |   )  |   <  |   >  |   @    |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |    +   |   Q  |   W  |   F  |   P  |   G  |  "   |           |   '  |   J  |   L  |   U  |   Y  |   Å  |   Æ    |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |    /   |   A  |   R  |   S  |   T  |   D  |------|           |------|   H  |   N  |   E  |   I  |   O  |   Ø    |
+ * |--------+------+------+------+------+------|  ;   |           |   =  |------+------+------+------+------+--------|
+ * |    -   |   Z  |   X  |   C  |   V  |   B  |      |           |      |   K  |   M  | RIGHT| DOWN |   UP |   _    |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |Alt/esc|  !  |   ?  |   :  | TAB  |                                       | LEFT |  _  |   &   |   |  |Num/fn|
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,--------------.
+ *                                        |   #  |  `   |       |Insert|   %   |
+ *                                 ,------|------|------|       |------+-------+------.
+ *                                 |      |      |  ´   |       |  Del |       |      |
+ *                                 | Shift|Ctrl/.|------|       |------| Enter |Space |
+ *                                 |      |      |GUI/, |       | Bspc |       |      |
+ *                                 `--------------------'       `---------------------'
+ */
+[BASE] = KEYMAP(
+        // left hand
+        KC_PAST,       NO_LBRC, NO_RBRC, NO_LCBR,  NO_RCBR, KC_FN2,  TG(1),
+        KC_PPLS,         KC_Q,         KC_W,    KC_F,   KC_P,   KC_G,   NO_QUO2,
+        KC_PSLS,         KC_A,         KC_R,    KC_S,   KC_T,   KC_D,
+        KC_PMNS,        KC_Z,         KC_X,    KC_C,   KC_V,   KC_B,   NO_SCLN,
+        ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
+                                                      KC_HASH, KC_FN7,
+                                                              KC_FN6,
+                                               KC_FN1,CTL_T(KC_DOT),GUI_T(KC_COMMA),
+        // right hand
+             KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
+             NO_APOS,      KC_J,    KC_L,    KC_U,      KC_Y,     NO_AA,   NO_AE  ,
+                           KC_H,    KC_N,    KC_E,      KC_I,      KC_O,    NO_OSLH,
+             NO_EQL,        KC_K,    KC_M, KC_RIGHT,  KC_DOWN,   KC_UP,    NO_BSLS,
+                                  KC_LEFT,  NO_UNDS, NO_AMPR,  NO_PIPE,    OSL(2),
+             KC_INSERT,  KC_PERC,
+             KC_DELT,
+             KC_BSPC,KC_ENT,KC_SPC
+    ),
+/* Keymap 1: Basic layer MAC (Same as pc, except for cmd/ctrl, which are swapped)
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |   \    |      |      |   {  |   }  |      |      |           |      |   $  |      |      |  <   |   >  |    @   |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |  '   |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |------|           |------|      |      |      |      |      |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |,/Ctrl|                                       |      |      |  `   |      |Num/fn|
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |  `   |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |   ´  |       |      |      |      |
+ *                                 |      |GUI/. |------|       |------|      |      |
+ *                                 |      |      |crtl/,|       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[BASE_MAC] = KEYMAP(
+       KC_TRNS, KC_TRNS,KC_TRNS, NO_LCBR_MAC,NO_RCBR_MAC, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, NO_GRV_MAC,
+                                                    KC_FN10,
+                                  KC_TRNS,GUI_T(KC_DOT) , CTL_T(KC_COMMA),
+    // right hand
+       KC_TRNS,  NO_DLR_MAC, KC_TRNS,KC_TRNS,KC_FN8, KC_FN9,NO_AT_MAC,
+       NO_APOS_MAC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NO_BSLS_MAC,
+                          KC_TRNS, KC_TRNS, KC_TRNS, NO_PIPE_MAC, OSL(2),
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+/* Keymap 2: Number ++´ánd Fn layer pc
+ *
+ * ,--------------------------------------------------.           ,--------------------------------------------------.
+ * |        |      |      |      |      |      |      |           |      |      |  F9  |  F10 |  F11 |  F12 |        |
+ * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
+ * |        |  8   |  7   |  6   |   5  |  9   |      |           |      |      |  F5  |  F6  |  F7  |  F8  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |  4   |  3   |  2   |   1  |  0   |------|           |------|      |  F1  |  F2  |  F3  |  F4  |        |
+ * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
+ * |        |      |      |      |      |      |      |           |      |      |      |  END | PGDWN| PGUP |        |
+ * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
+ *   |      |      |      |      |      |                                       | HOME |      |      |      |      |
+ *   `----------------------------------'                                       `----------------------------------'
+ *                                        ,-------------.       ,-------------.
+ *                                        |      |      |       |      |      |
+ *                                 ,------|------|------|       |------+------+------.
+ *                                 |      |      |      |       |      |      |      |
+ *                                 |      |      |------|       |------|      |      |
+ *                                 |      |      |      |       |      |      |      |
+ *                                 `--------------------'       `--------------------'
+ */
+[NUMB_FUNC] = KEYMAP(
+       NO_ASTR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       NO_PLUS, KC_8, KC_7,KC_6,KC_5, KC_9 , KC_TRNS,
+       NO_SLSH , KC_4   , KC_3   , KC_2   , KC_1   , KC_0,
+       NO_MINS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+                                           KC_TRNS, KC_TRNS,
+                                                    KC_TRNS,
+                                  KC_TRNS, KC_TRNS, KC_TRNS,
+    // right hand
+       KC_TRNS,  KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
+       KC_TRNS,  KC_TRNS, KC_F5, KC_F6 , KC_F7, KC_F8, KC_TRNS,
+                 KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRNS,
+       KC_TRNS,  KC_HOME, KC_TRNS, KC_END, KC_PGDN, KC_PGUP, KC_TRNS,
+                          KC_HOME, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+       KC_TRNS, KC_TRNS,
+       KC_TRNS,
+       KC_TRNS, KC_TRNS, KC_TRNS
+)
+};
+
+enum macro_id {
+    TILDE_NO, LESS_NO, GRTR_NO, CIRC_NO, ACUT_NO,  GRV_NO, LESS_NO_MAC, GRTR_NO_MAC, ACUT_NO_MAC
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [1] = ACTION_MODS_ONESHOT(MOD_LSFT),  // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
+    [2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
+    [3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
+    [4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
+    [5] = ACTION_MACRO(CIRC_NO), // Completed ^ character, no space needed.
+    [6] = ACTION_MACRO(ACUT_NO), // Completed ´ character, no space needed.
+    [7] = ACTION_MACRO(GRV_NO), // Completed ` character, no space needed.
+    [8] = ACTION_MACRO(LESS_NO_MAC), // < completed on keypress down, to avoid same button problem when typing <> quickly
+    [9] = ACTION_MACRO(GRTR_NO_MAC), // > completed on keypress down, to avoid same button problem when typing <> quickly
+    [10] = ACTION_MACRO(ACUT_NO_MAC), // Completed ´ character, no space needed
+};
+
+
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    keyevent_t event = record->event;
+
+    switch (id) {
+        case TILDE_NO:
+            return (event.pressed ? MACRO( D(RALT), T(RBRC), U(RALT), T(SPC), END ) : MACRO_NONE);
+        case LESS_NO:
+            return (event.pressed ? MACRO( T(NUBS), END ) : MACRO_NONE);
+        case GRTR_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(NUBS), U(LSFT), END ) : MACRO_NONE);
+        case CIRC_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(RBRC), U(LSFT), T(SPC), END ) : MACRO_NONE);
+        case ACUT_NO:
+            return (event.pressed ? MACRO( D(RALT), T(EQL), U(RALT), T(SPC),  END ) : MACRO_NONE);
+        case GRV_NO:
+            return (event.pressed ? MACRO( D(LSFT), T(EQL), T(SPC), U(LSFT),  END ) : MACRO_NONE);
+        case LESS_NO_MAC:
+            return (event.pressed ? MACRO( T(GRV), END ) : MACRO_NONE);
+        case GRTR_NO_MAC:
+            return (event.pressed ? MACRO( D(LSFT), T(GRV), U(LSFT), END ) : MACRO_NONE);
+        case ACUT_NO_MAC:
+            return (event.pressed ? MACRO( T(EQL), T(SPC),  END ) : MACRO_NONE);
+    }
+    return MACRO_NONE;
+};
diff --git a/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/readme.md b/keyboards/ergodox/keymaps/norwegian_programmer_osx_pc_colemak/readme.md
new file mode 100644 (file)
index 0000000..aaaec3e
--- /dev/null
@@ -0,0 +1,30 @@
+# Norwegian Colemak setup with osx/pc toggle
+
+## Motivation
+I wanted a Norwegian Colemak setup that worked in a similar way on both my Mac and PC. I also wanted the keyboard to translate from a standard Norwegian keyboard OS setup.
+
+## Overview
+The setup is created to be programmer friendly.
+- Most of the symbols used in code can be activated without using layers or shift key.
+- You can reach the IDE/OS shortcut activators(Ctrl, Win/Cmd, Alt, Shift) with the thumb or the wrist.
+- Navigation is prioritized, arrows below the home row.
+
+## PC/Mac toggle
+The default setup is for Norwegian keyboard setting(not colemak software variants) on a PC(Windows or Linux) or Mac. Use the Mac/PC toggle button to switch between OSX and PC setup. The settings will be reverted to PC setup each time you restart/connect the keyboard.
+
+## Layers
+Since symbols are prioritized in this setup, numbers and function keys are on a new layer. The easiest way to use the layer switch(and also the alt key), is to push your hand right below the little finger, on the key. You will then have all your fingers free to type numbers or press function keys.
+
+## Tap-shift
+Tap for the next character to be shifted, hold down for regular shift.
+
+## Comma dot and escape
+Comma, dot and escape share buttons with modifier keys. Tap to access these keys, hold down to use the keys as modifier keys.
+
+## Numpad symbols
++-/* are implemented with the numpad keycodes. The benefit is that they will work better with shortcuts in certain programs. For some reason, the default setting in the osx terminal is to not accept numpad characters for '/' and '-'. For a solution, see https://discussions.apple.com/thread/6613968?start=0&tstart=0.
+If you really need the norwegian symbols in a program, you can access them using the number toggle button. 
+
+## Layout
+
+![keyboard-layout](keyboard-layout.png)
index 24d0c4ecb7829b542d264fee2f1ed95f007b7781..2c643044049b1572ee19c9dbf30cad676ea146cf 100644 (file)
@@ -6,23 +6,23 @@
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [BASE] = KEYMAP(
-    KC_GRV,        KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_F5,
-    KC_TAB,        KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_BSLS,
-    CTL_T(KC_ESC), KC_A,    KC_S,    KC_E,    KC_T,    KC_G,
-    KC_LSFT,       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_LBRC,
-    KC_F1,         KC_F2,   KC_F3,   KC_F4,   KC_LGUI, 
-    /*-*/          /*-*/    /*-*/    /*-*/    /*-*/    KC_VOLD, KC_MUTE,
-    /*-*/          /*-*/    /*-*/    /*-*/    /*-*/    /*-*/    KC_VOLU,
-    /*-*/          /*-*/    /*-*/    /*-*/    /*-*/    KC_BSPC, CTL_T(KC_ESC), KC_LALT,
+    KC_GRV,   KC_1,    KC_2,  KC_3,    KC_4,    KC_5,    KC_F5,
+    KC_TAB,   KC_Q,    KC_W,  KC_D,    KC_F,    KC_K,    KC_BSLS,
+    KC_LCTRL, KC_A,    KC_S,  KC_E,    KC_T,    KC_G,
+    KC_LSFT,  KC_Z,    KC_X,  KC_C,    KC_V,    KC_B,    KC_LBRC,
+    KC_F1,    KC_F2,   KC_F3, KC_F4,   KC_LGUI,
+    /*-*/     /*-*/    /*-*/  /*-*/    /*-*/    KC_VOLD, KC_MUTE,
+    /*-*/     /*-*/    /*-*/  /*-*/    /*-*/    /*-*/    KC_VOLU,
+    /*-*/     /*-*/    /*-*/  /*-*/    /*-*/    KC_BSPC, CTL_T(KC_ESC), KC_LALT,
     //
-    /*-*/          KC_F6,   KC_6,    KC_7,    KC_8,    KC_9,    KC_0,          KC_EQL,
-    /*-*/          KC_NO,   KC_J,    KC_U,    KC_R,    KC_L,    KC_SCLN,       KC_MINS,
-    /*-*/          /*-*/    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,          KC_ENT,
-    /*-*/          KC_RBRC, KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,       KC_RSFT,
-    /*-*/          /*-*/    /*-*/    KC_RGUI, KC_LEFT, KC_DOWN, KC_UP,         KC_RGHT, 
-    KC_MPLY,       KC_MNXT,
+    /*-*/     KC_F6,   KC_6,  KC_7,    KC_8,    KC_9,    KC_0,          KC_EQL,
+    /*-*/     KC_NO,   KC_J,  KC_U,    KC_R,    KC_L,    KC_SCLN,       KC_MINS,
+    /*-*/     /*-*/    KC_Y,  KC_N,    KC_I,    KC_O,    KC_H,          KC_ENT,
+    /*-*/     KC_RBRC, KC_P,  KC_M,    KC_COMM, KC_DOT,  KC_SLSH,       KC_RSFT,
+    /*-*/     /*-*/    /*-*/  KC_RGUI, KC_LEFT, KC_DOWN, KC_UP,         KC_RGHT,
+    KC_MPLY,  KC_MNXT,
     KC_MPRV,
-    KC_RALT,       KC_QUOT, KC_SPC
+    KC_RALT,  KC_QUOT, KC_SPC
     )
 };
 
index 80475ab21e73918c9ba1e341242b0dce5d23e297..4fa1814fb163770000f1a134c4591c746d4b18ac 100644 (file)
@@ -1,28 +1,41 @@
 # Roman's Layout
 
-There is only one layer based on [Norman layout](https://normanlayout.info/).
+There is only one layer, and it is  based on [Norman
+layout](https://normanlayout.info/).
 
 Looking for multiple-layer layouts?
 
-- [Symbols, arrows, plover, HJKL arrows](../romanzolotarev-norman-plover-osx-hjkl/)
+- [Symbols, arrows, plover, HJKL
+  arrows](../romanzolotarev-norman-plover-osx-hjkl/)
 - [Same with IJKL arrows](../romanzolotarev-norman-plover-osx/)
 
 [![keyboard-layout](romanzolotarev-norman-osx.png)](http://www.keyboard-layout-editor.com/#/gists/9e89d54f1ea6eeeb7dab1b2d19d28195)
 
-## Functional Keys
+## How to use Vim key
 
-- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/).
-- Tap `F2` to copy screenshot to the clipboard.
-- Hold `SHIFT` and tap `F2` to save screenshot as a file.
-- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
-
-## CTRL/ESC
-
-CTRL and ESC are frequently used in Vim.
+It is `CTL_T(KC_ESC)` and it works this way:
 
 - Tap `CTRL/ESC` to send `ESC`.
 - Hold `CTRL/ESC` to use as `CTRL`.
 
-## Activate N-rollover
+## How to activate N-rollover
+
+- Hold left `SHIFT` and right `SHIFT` and then tap `N`.
+
+## How to make and flash on OS X
+
+First you need to install few brew packages.
+
+```bash
+brew tap osx-cross/avr
+brew install dfu-programmer avr-libc teensy_loader_cli
+```
+
+Then you can clone this repository, make and flash your ErgoDox.
 
-- Hold left `SHIFT` and right `SHIRT` and then tap `N`.
+```bash
+git clone https://github.com/romanzolotarev/qmk_firmware
+cd qmk_firmware/keyboards/ergodox
+# Optionally tweak ./keymaps/romanzolotarev-norman-osx/keymap.c
+SLEEP_LED_ENABLED=no KEYMAP=romanzolotarev-norman-osx make teensy
+```
diff --git a/keyboards/ergodox/keymaps/yoruian/90-ergodox-yoruian.conf b/keyboards/ergodox/keymaps/yoruian/90-ergodox-yoruian.conf
new file mode 100644 (file)
index 0000000..ce4fce3
--- /dev/null
@@ -0,0 +1,6 @@
+Section "InputClass"
+       Identifier      "ErgoDox EZ"
+       MatchIsKeyboard "on"
+       MatchProduct    "ErgoDox EZ ErgoDox EZ"
+       Option          "XkbLayout"     "ergodox_yoruian"
+EndSection
diff --git a/keyboards/ergodox/keymaps/yoruian/Makefile b/keyboards/ergodox/keymaps/yoruian/Makefile
new file mode 100644 (file)
index 0000000..b43a24c
--- /dev/null
@@ -0,0 +1,13 @@
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
+
+install-xorg-configuration:
+       install -m 0664 90-$(KEYBOARD)-$(KEYMAP).conf \
+           /etc/X11/xorg.conf.d/90-$(KEYBOARD)-$(KEYMAP).conf
+       install -m 0644 $(KEYBOARD)_$(KEYMAP) \
+           /usr/share/X11/xkb/symbols/$(KEYBOARD)_$(KEYMAP)
+
+uninstall-xorg-configuration:
+       -rm -f /etc/X11/xorg.conf.d/90-$(KEYBOARD)-$(KEYMAP).conf
+       -rm -f /usr/share/X11/xkb/symbols/$(KEYBOARD)_$(KEYMAP)
diff --git a/keyboards/ergodox/keymaps/yoruian/README b/keyboards/ergodox/keymaps/yoruian/README
new file mode 100644 (file)
index 0000000..99b4143
--- /dev/null
@@ -0,0 +1,102 @@
+          Snarfangel's YORUIAN for the ErgoDox EZ
+          ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+DEFAULT
+┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓ ┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓
+┃ ` │ ; │ : │ - │ / │ ( │ < ┃ ┃ > │ ) │ ^ │ * │ ~ │ Γ │ σ ┃
+┠───┼───┼───┼───┼───┼───┼───┨ ┠───┼───┼───┼───┼───┼───┼───┨
+┃ ⎋ │ . │ y │ o │ r │ ? │ ✦ ┃ ┃ ✦ │ j │ v │ d │ f │ w │ q ┃
+┠───┼───┼───┼───┼───┼───┤   ┃ ┃   ├───┼───┼───┼───┼───┼───┨
+┃ ⎈ │ u │ i │ a │ n │ ! ├───┨ ┠───┤ m │ h │ t │ s │ c │ ⎈ ┃
+┠───┼───┼───┼───┼───┼───┤ ❖ ┃ ┃ ❖ ├───┼───┼───┼───┼───┼───┨
+┃ λ │ ' │ " │ , │ _ │ = │   ┃ ┃   │ k │ l │ p │ g │ b │ x ┃
+┠───┼───┼───┼───┼───╆━━━┷━━━┛ ┗━━━┷━━━╅───┼───┼───┼───┼───┨
+┃ ⎀ │ E │   │   │ ◆ ┃                 ┃ ◆ │   │   │ z │ ⎙ ┃
+┗━━━┷━━━┷━━━┷━━━┷━━━┛                 ┗━━━┷━━━┷━━━┷━━━┷━━━┛
+                    ┏━━━┯━━━┓ ┏━━━┯━━━┓
+                    ┃ ⌫ │ ⌥ ┃ ┃ ⎄ │ ↹ ┃
+                ┏━━━╃───┼───┨ ┠───┼───╄━━━┓
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┃ e │ ⇧ ├───┨ ┠───┤ ⏎ │ ␣ ┃
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┗━━━┷━━━┷━━━┛ ┗━━━┷━━━┷━━━┛
+SHIFTED
+┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓ ┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓
+┃ 9 │ 7 │ 5 │ 3 │ 1 │ [ │ { ┃ ┃ } │ ] │ 0 │ 2 │ 4 │ 6 │ 8 ┃
+┠───┼───┼───┼───┼───┼───┼───┨ ┠───┼───┼───┼───┼───┼───┼───┨
+┃   │ * │ Y │ O │ R │ \ │   ┃ ┃   │ J │ V │ D │ F │ W │ Q ┃
+┠───┼───┼───┼───┼───┼───┤   ┃ ┃   ├───┼───┼───┼───┼───┼───┨
+┃   │ U │ I │ A │ N │ | ├───┨ ┠───┤ M │ H │ T │ S │ C │   ┃
+┠───┼───┼───┼───┼───┼───┤   ┃ ┃   ├───┼───┼───┼───┼───┼───┨
+┃   │ # │ $ │ @ │ & │ + │   ┃ ┃   │ K │ L │ P │ G │ B │ X ┃
+┠───┼───┼───┼───┼───╆━━━┷━━━┛ ┗━━━┷━━━╅───┼───┼───┼───┼───┨
+┃   │   │   │   │   ┃                 ┃   │   │   │ Z │   ┃
+┗━━━┷━━━┷━━━┷━━━┷━━━┛                 ┗━━━┷━━━┷━━━┷━━━┷━━━┛
+                    ┏━━━┯━━━┓ ┏━━━┯━━━┓
+                    ┃   │   ┃ ┃   │   ┃
+                ┏━━━╃───┼───┨ ┠───┼───╄━━━┓
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┃   │   ├───┨ ┠───┤   │   ┃
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┗━━━┷━━━┷━━━┛ ┗━━━┷━━━┷━━━┛
+λ LAYER
+┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓ ┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓
+┃   │   │   │   │   │   │   ┃ ┃   │   │ ⑤ │ ⑥ │ ⑦ │ ⑧ │ ⑨ ┃
+┠───┼───┼───┼───┼───┼───┼───┨ ┠───┼───┼───┼───┼───┼───┼───┨
+┃   │   │   │   │   │   │   ┃ ┃   │   │ ① │ ② │ ③ │ ④ │ ⑩ ┃
+┠───┼───┼───┼───┼───┼───┤   ┃ ┃   ├───┼───┼───┼───┼───┼───┨
+┃   │   │   │   │   │   ├───┨ ┠───┤ ⎉ │ ← │ ↓ │ ↑ │ → │ ⑪ ┃
+┠───┼───┼───┼───┼───┼───┤   ┃ ┃   ├───┼───┼───┼───┼───┼───┨
+┃ λ │   │   │   │   │   │   ┃ ┃   │   │ ⇱ │ ⎘ │ ⎗ │ ⇲ │ ⑫ ┃
+┠───┼───┼───┼───┼───╆━━━┷━━━┛ ┗━━━┷━━━╅───┼───┼───┼───┼───┨
+┃   │   │   │   │   ┃                 ┃   │   │   │   │   ┃
+┗━━━┷━━━┷━━━┷━━━┷━━━┛                 ┗━━━┷━━━┷━━━┷━━━┷━━━┛
+                    ┏━━━┯━━━┓ ┏━━━┯━━━┓
+                    ┃   │   ┃ ┃   │   ┃
+                ┏━━━╃───┼───┨ ┠───┼───╄━━━┓
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┃   │   ├───┨ ┠───┤   │   ┃
+                ┃   │   │   ┃ ┃   │   │   ┃
+                ┗━━━┷━━━┷━━━┛ ┗━━━┷━━━┷━━━┛
+
+Installation (X only)
+‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+   1. Build and flash firmware as usual
+
+   2. sudo make install-xorg-configuration
+
+   3. Restart X
+
+Features
+‾‾‾‾‾‾‾‾
+   • E on the thumb
+
+   • Emacs-friendly
+
+   • Symmetric control keys for finger wear levelling
+
+   • Greek and subscript dead keys
+
+   • Compose key for arbitrary Unicode input via ~/.XCompose
+
+Don't Cares
+‾‾‾‾‾‾‾‾‾‾‾
+   • Easy migration from QWERTY
+
+   • Compatbility with non-XKB systems
+
+   • Mouse emulation
+
+   • Media keys
+
+Acknowledgements
+‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+Snarfangel, for designing the layout.
+
+The GNU FreeFont project and Steve White, for adding new keyboard
+symbols.
+
+Xah Lee, for http://xahlee.info/comp/unicode_computing_symbols.html
+
+Colophon
+‾‾‾‾‾‾‾‾
+This file is best-viewed with an SVN version of GNU FreeFont Mono.
diff --git a/keyboards/ergodox/keymaps/yoruian/ergodox_yoruian b/keyboards/ergodox/keymaps/yoruian/ergodox_yoruian
new file mode 100644 (file)
index 0000000..0d13fbf
--- /dev/null
@@ -0,0 +1,34 @@
+partial alphanumeric_keys modifier_keys
+xkb_symbols "ergodox_yoruian" {
+    include "us"
+    name[Group1]= "English (yoruian-1.0.0)";
+
+    replace key <KP2>  { [    Multi_key, Multi_key    ] };
+    replace key <KP3>  { [    Hyper_L,   Hyper_L      ] };
+    replace key <AE09> { [        grave, 9            ] };
+    replace key <AE07> { [    semicolon, 7            ] };
+    replace key <AE05> { [        colon, 5            ] };
+    replace key <AE03> { [        minus, 3            ] };
+    replace key <AE01> { [        slash, 1            ] };
+    replace key <AE10> { [  asciicircum, 0            ] };
+    replace key <AE02> { [      percent, 2            ] };
+    replace key <AE04> { [   asciitilde, 4            ] };
+    replace key <AE06> { [   dead_greek, 6            ] };
+    replace key <AE08> { [   dead_caron, 8            ] };
+    replace key <KP1>  { [            E, E            ] };
+    replace key <AD12> { [       period, asterisk     ] };
+    replace key <BKSL> { [     question, backslash    ] };
+    replace key <AC10> { [       exclam, bar          ] };
+    replace key <AC11> { [   apostrophe, numbersign   ] };
+    replace key <AB08> { [     quotedbl, dollar       ] };
+    replace key <AB09> { [        comma, at           ] };
+    replace key <AB10> { [   underscore, ampersand    ] };
+    replace key <KP0>  { [        equal, plus         ] };
+    replace key <TLDE> { [    parenleft, bracketleft  ] };
+    replace key <AE11> { [         less, braceleft    ] };
+    replace key <AE12> { [      greater, braceright   ] };
+    replace key <AD11> { [   parenright, bracketright ] };
+
+    modifier_map none { <HYPR> };
+    modifier_map Mod3 { <KP3>  };
+};
diff --git a/keyboards/ergodox/keymaps/yoruian/keymap.c b/keyboards/ergodox/keymaps/yoruian/keymap.c
new file mode 100644 (file)
index 0000000..d3635dd
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 Thomas Fitzsimmons <fitzsim@fitzsim.org>
+ *
+ * This program is free software: you can 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 "yoruian.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = KEYMAP\
+(9,  7,    5,    3,    1,    GRV,  MINS, EQL,  LBRC, 0,    2,    4,    6,    8,
+ ES, RBRC, Y,    O,    R,    BSLS, P3,   P3,   J,    V,    D,    F,    W,    Q,
+ LC, U,    I,    A,    N,    SCLN,             M,    H,    T,    S,    C,    RC,
+ FF, QUOT, COMM, DOT,  SLSH, P0,   LGUI, LGUI, K,    L,    P,    G,    B,    X,
+ IN, P1,   NO,   NO,   LALT,                         LALT, NO,   NO,   Z,    PS,
+                             BSPC, RALT, P2,   TAB,
+                                   NO,   NO,
+                       E,    LSFT, NO,   NO,   ENT,  SPC),
+[1] = KEYMAP\
+(TR, TR,   TR,   TR,   TR,   TR,   TR,   TR,   TR,   F5,   F6,   F7,   F8,   F9,
+ TR, TR,   TR,   TR,   TR,   TR,   TR,   TR,   TR,   F1,   F2,   F3,   F4,   FT,
+ TR, TR,   TR,   TR,   TR,   TR,               PAUS, LEFT, DOWN, UP,   RGHT, FE,
+ TR, TR,   TR,   TR,   TR,   TR,   TR,   TR,   TR,   HOME, PGDN, PGUP, END,  FW,
+ TR, TR,   TR,   TR,   TR,                           TR,   TR,   TR,   TR,   TR,
+                             TR,   TR,   TR,   TR,
+                                   TR,   TR,
+                       TR,   TR,   TR,   TR,   TR,   TR),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+    return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+};
+
+void matrix_scan_user(void) {
+    ergodox_board_led_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
+};
+
+/*
+ * Local Variables:
+ * electric-indent-mode: nil
+ * End:
+ */
diff --git a/keyboards/ergodox/keymaps/yoruian/yoruian.h b/keyboards/ergodox/keymaps/yoruian/yoruian.h
new file mode 100644 (file)
index 0000000..1adcb7f
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 Thomas Fitzsimmons <fitzsim@fitzsim.org>
+ *
+ * This program is free software: you can 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 "ergodox.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#undef KEYMAP
+#define KEYMAP\
+(                                                                      \
+ /* Spacial positions. */                                              \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
+ k20, k21, k22, k23, k24, k25,           k28, k29, k2A, k2B, k2C, k2D, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, \
+ k40, k41, k42, k43, k44,                     k49, k4A, k4B, k4C, k4D, \
+                          k55, k56, k57, k58,                           \
+                               k54, k59,                                \
+                     k53, k52, k51, k5C, k5B, k5A)                      \
+                                                                       \
+ /* Matrix positions. */                                               \
+ {                                                                     \
+   { KC_##k00, KC_##k10, KC_##k20, KC_##k30, KC_##k40, KC_NO    },     \
+   { KC_##k01, KC_##k11, KC_##k21, KC_##k31, KC_##k41, KC_##k51 },      \
+   { KC_##k02, KC_##k12, KC_##k22, KC_##k32, KC_##k42, KC_##k52 },      \
+   { KC_##k03, KC_##k13, KC_##k23, KC_##k33, KC_##k43, KC_##k53 },      \
+   { KC_##k04, KC_##k14, KC_##k24, KC_##k34, KC_##k44, KC_##k54 },      \
+   { KC_##k05, KC_##k15, KC_##k25, KC_##k35, KC_NO,    KC_##k55 },      \
+   { KC_##k06, KC_##k16, KC_NO,    KC_##k36, KC_NO,    KC_##k56 },      \
+   { KC_##k07, KC_##k17, KC_NO,    KC_##k37, KC_NO,    KC_##k57 },      \
+   { KC_##k08, KC_##k18, KC_##k28, KC_##k38, KC_NO,    KC_##k58 },      \
+   { KC_##k09, KC_##k19, KC_##k29, KC_##k39, KC_##k49, KC_##k59 },      \
+   { KC_##k0A, KC_##k1A, KC_##k2A, KC_##k3A, KC_##k4A, KC_##k5A },      \
+   { KC_##k0B, KC_##k1B, KC_##k2B, KC_##k3B, KC_##k4B, KC_##k5B },      \
+   { KC_##k0C, KC_##k1C, KC_##k2C, KC_##k3C, KC_##k4C, KC_##k5C },      \
+   { KC_##k0D, KC_##k1D, KC_##k2D, KC_##k3D, KC_##k4D, KC_NO    }       \
+ }
+
+#define KC_ES  KC_ESC
+#define KC_LC  KC_LCTL
+#define KC_RC  KC_RCTL
+#define KC_FF  MO(1)
+#define KC_IN  KC_INS
+#define KC_PS  KC_PSCR
+#define KC_TR  KC_TRNS
+#define KC_FT  KC_F10
+#define KC_FE  KC_F11
+#define KC_FW  KC_F12
diff --git a/keyboards/ergodox/keymaps/zweihander-osx/Makefile b/keyboards/ergodox/keymaps/zweihander-osx/Makefile
new file mode 100644 (file)
index 0000000..6e3d088
--- /dev/null
@@ -0,0 +1,2 @@
+# Don’t do a tricolor wave when the computer is shut down in Windows
+SLEEP_LED_ENABLE = no
index d6d66fd55d2b3023f078003ae2e33d6467cd4cb1..725a73e346d5eec40ed0d64ad2e811f31c84a591 100644 (file)
@@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  *                                 ,------|------|------|       |------+--------+------.
  *                                 |      |      | PgUp |       | PgDn |        |      |
  *                                 |      |   ⇥  |------|       |------|    ⇥   |Enter |
- *                                 |      |      |  L⌥  |       |  L⌃  |        |      |
+ *                                 |      |      |  R⌥  |       |  R⌃  |        |      |
  *                                 `--------------------'       `----------------------'
  */
 // If it accepts an argument (i.e, is a function), it doesn't need KC_.
@@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         KC_LCTL,        KC_LALT,      KC_LGUI,KC_LEFT,KC_RGHT,
                                               KC_GRV, KC_QUOT,
                                                               KC_PGUP,
-                                               KC_SPC,KC_TAB ,KC_LALT,
+                                               KC_SPC,KC_TAB ,KC_RALT,
         // right hand
              TG(SYMB),  KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
              MO(SYMB),  KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
@@ -55,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
                                 KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_SPC ,
              KC_ESC,            KC_BSPC,
              KC_PGDN,
-             KC_LCTL,           KC_TAB,      KC_ENT
+             KC_RCTL,           KC_TAB,      KC_ENT
     ),
 /* Keymap 1: Symbol Layer
  *
@@ -102,13 +102,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Keymap 2: Media keys
  *
  * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |        |  F14 |  F15 |      |      |      |      |           |  ⌘Q  |  ⌘W  | ⌘⇧`  |  ⌘`  |      |      |  Power |
+ * |        |  F14 |  F15 |PrtScr|SclLck| Pause|      |           |  ⌘Q  |  ⌘W  | ⌘⇧`  |  ⌘`  |      |      |  Power |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
  * |        |      |      | PgUp |⌘S⌘⇥⌘R| Term |      |           |      |  ⌘]  | ⌥⌘↑  |   ↑  | ⌥⌘↓  |      |        |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
  * |        |      |Safari| PgDn |      |      |------|           |------|  ⌘[  |   ←  |   ↓  |   →  |      |    ⏯  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
- * |        |      |      |      |      |BBEdit|      |           |      |L⇧+Spc|  Spc |  ⏮  |   ⏭ |      |        |
+ * |        |      |      |      |      |BBEdit|      |           |      |      |  ⏯  |  ⏮  |   ⏭ |      |        |
  * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
  *   |      |      |      |      |      |                                       |VolUp |VolDn | Mute |      |      |
  *   `----------------------------------'                                       `----------------------------------'
@@ -122,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  */
 // MEDIA AND MOUSE
 [MDIA] = KEYMAP(
-       KC_TRNS, KC_F14 , KC_F15 , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  /* F14 dims screen, F15 brightens */
+       KC_TRNS, KC_F14 , KC_F15 , KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,  /* F14 dims screen, F15 brightens */
        KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, M(SGWF), M(TMNL), KC_TRNS,
        KC_TRNS, KC_TRNS, M(SAFA), KC_PGDN, KC_TRNS, KC_TRNS,
        KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, M(BBED), KC_TRNS,
@@ -134,7 +134,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
        LGUI(KC_Q),  LGUI(KC_W),     LGUI(LSFT(KC_GRV)), LGUI(KC_GRV),   KC_TRNS,                KC_TRNS,        KC_PWR ,
        KC_TRNS,     LGUI(KC_RBRC),  LGUI(LALT(KC_UP)),  KC_UP  ,        LGUI(LALT(KC_DOWN)),    KC_TRNS,        KC_TRNS,
                     LGUI(KC_LBRC),  KC_LEFT,            KC_DOWN,        KC_RGHT,                KC_TRNS,        KC_MPLY,
-       KC_TRNS,     LSFT(KC_SPC),   KC_SPC ,            KC_MPRV,        KC_MNXT,                KC_TRNS,        KC_TRNS,
+       KC_TRNS,     KC_TRNS,        KC_MPLY,            KC_MPRV,        KC_MNXT,                KC_TRNS,        KC_TRNS,
                                     KC_VOLU,            KC_VOLD,        KC_MUTE,                KC_TRNS,        KC_TRNS,
        KC_TRNS,     KC_TRNS,
        KC_END ,
diff --git a/keyboards/ergodox/keymaps/zweihander-osx/makefile.mk b/keyboards/ergodox/keymaps/zweihander-osx/makefile.mk
deleted file mode 100644 (file)
index 6e3d088..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-# Don’t do a tricolor wave when the computer is shut down in Windows
-SLEEP_LED_ENABLE = no
index 3b7f52941a975126bab5e63039fc2a7218f6cbf8..5125a12ee16accb74e3fbae5eedc307b1f28e3a9 100644 (file)
@@ -7,7 +7,7 @@ This layout is tuned for people who…
 
 ## use OS X
 
-This layout doesn’t make any concessions for Windows use. While it should work fine in Windows, I’m not about to devote precious keyboard space to Windows-specific shortcuts.
+While this layout should work fine in Windows, it’s not tuned for it. No sane person who primarily uses Windows would put this many Windows keys on a keyboard layout.
 
 
 ## mouse left-handed while doing other things with the right hand
@@ -21,8 +21,6 @@ I tend to have my mouse in my left hand, but I like to use my other hand to make
 - Go Up and Close Just-Left Folder (⌥⌘↑)
 - Cycle through open windows in current application (⌘\` and ⌘⇧\`)
 - Cycle through tabs in current window (⌥⇥ and ⌥⇧⇥)
-- Space (page down in browsers; Quick Look in the Finder)
-- Shift-Space (page up in web browsers)
 
 Because moving letter-by-letter is way slower than moving word-by-word, I added Option (⌥) to the bottommost button on the left side. This key can be held easily while holding ; (activate media layer) and pressing J and L to move left and right by word.
 
@@ -34,11 +32,15 @@ I wanted to preserve the feel of a number of shortcuts that involve pressing lot
 - Empty Trash Without Asking for Confirmation (⇧⌥⌘⌫)
 - Shut Down Without Asking for Confirmation (⇧⌥⌘ power)
 
+⇧⌥⌘⌫, when you press the backspace on the right half of the keyboard, is much more satisfying than if you curl your left hand into a claw to press all the keys on the left. Try both; you’ll agree.
+
 
 ## use Emacs-style shortcuts
 
 I press C-a, C-e, and C-k all the time. It’s difficult to press these key combinations with the control key on the bottom left and I’m too quick on the draw for the control function on the / key to work reliably, so the bottommost thumb button on the right side is another control key.
 
+Having trouble remembering which thumb key is alt and which is ctrl? It’s like on the lower right of a normal keyboard — leftmost is alt, rightmost is ctrl.
+
 
 ## use spreadsheets
 
index f81d7cd8df1338eec5a877eb457a5a2ca8da3b22..3bbe98fd699b1532d182e0f9fca88ca88d09ac3a 100644 (file)
-# Getting started
+# The Easy Way
 
-There are two main ways you could customize the ErgoDox (EZ and Infinity)
+If you can find firmware someone else has made that does what you want, that
+is the easiest way to customize your ErgoDox.  It requires no programming
+experience or the setup of a build environment.
 
-## The Easy Way: Use an existing firmware file and just flash it (ErgoDox EZ only)
+Quickstart:
 
-1. Download and install the [Teensy Loader](https://www.pjrc.com/teensy/loader.html). Some Linux distributions already provide a binary (may be called `teensy-loader-cli`), so you may prefer to use this.
-2. Find a firmware file you like. There are [dozens of community-contributed keymaps](http://qmk.fm/keyboards/ergodox/) you can browse and download. You can also use the [Massdrop configurator](https://keyboard-configurator.massdrop.com/ext/ergodox) to create a firmware Hex file you like.
-3. Download the firmware file
-4. Connect the keyboard, press its Reset button (gently insert a paperclip into the hole in the top-right corner) and flash it using the Teensy loader you installed on step 1 and the firmware you downloaded.
+  - Find and download an existing firmware
+    [from Other Firmware Options](#other-firmware-options)
 
-## More technical: compile an existing keymap, or create your own totally custom firmware by editing the source files.
+  - Then flash the firmware to your [ErgoDox Ez](#ergodox-ez)
+    or [ErgoDox Infinity](#ergodox-infinity)
 
-This requires a little bit of familiarity with coding.
-If you are just compiling an existing keymap and don't want to create your own, you can skip step 4, 5 and 8.
+# Customizing Keymaps
 
-1. Go to https://github.com/jackhumbert/qmk_firmware and read the readme at the base of this repository, top to bottom. Then come back here :)
-2. Clone the repository (download it)
-3. Set up a build environment as per the readme.
-4. Copy `keyboards/ergodox/keymaps/default/keymap.c` into `keymaps/your_name/keymap.c` (for example, `keymaps/german/keymap.c`)
-5. Edit this file, changing keycodes to your liking (see "Finding the keycodes you need" below). Try to edit the comments as well, so the "text graphics" represent your layout correctly. See below for more tips on sharing your work.
-6. Compile your firmware by running `make keymap=keymap_name`. For example, `make keymap=german`. This will result in a hex file, which will be called `ergodox_ez_keymap_name.hex`, e.g. `ergodox_ez_german.hex`. For **Infinity ErgoDox** you need to add `subproject=infinity` to the make command.
-7. **ErgoDox EZ** - Flash this hex file using the [Teensy loader](https://www.pjrc.com/teensy/loader.html) as described in step 4 in the "Easy Way" above. If you prefer you can automatically flash the hex file after successful build by running `make teensy keymap=keymap_name`.
+There are many existing keymaps in the "keymaps" directory.  If you just want
+to use one of them, you don't need to modify keymaps and can just build and
+flash the firmware as described below.  These directories each have a
+"readme.md" file which describe them.
 
-   **Infinity ErgoDox** - Flash the firmware by running `make dfu-util keymap=keymap_name subproject=infinity`
-8. Submit your work as a pull request to this repository, so others can also use it. :) See below on specifics.
+If none of the existing keymaps suit you, you can create your own custom
+keymap.  This will require some experience with coding.  Follow these steps
+to customize a keymap:
 
-Good luck! :)
+  - Read the [qmk firmware README](https://github.com/jackhumbert/qmk_firmware) from top to bottom.  Then come back here.  :)
 
-## Contributing your keymap
+  - Clone the qmk_firmware repository
+
+  - Set up your build environment (see below).
+
+  - Make a new directory under "keymaps" to hold your customizations.
+
+  - Copy an existing keymap that is close to what you want, such as
+    "keymaps/default/keymap.c".
+
+  - Use an editor to modify the new "keymap.c".  See "Finding the keycodes you
+    need" below).  Try to edit the comments as well, so the "text graphics"
+    represent your layout correctly.
+
+  - Compile your new firmware (see below)
+
+  - Flash your firmware (see below)
+
+  - Test the changes.
+
+  - Submit your keymap as a pull request to the qmk_firmware repository so
+    others can use it.  You will want to add a "readme.md" that describes the
+    keymap.
+
+# Build Dependencies
+
+Before you can build, you will need the build dependencies.  There is a script
+to try to do this for Linux:
+
+  - Run the `util/install_dependencies.sh` script as root.
+
+For the Infinity, you need the chibios submodules to be checked out or you
+will receive errors about the build process being unable to find the chibios
+files.  Check them out with:
+
+  - Go to the top level repo directory and run: `git submodule update --init --recursive`
+
+# Flashing Firmware
+
+## ErgoDox Ez
+
+The Ez uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html).
+
+Linux users need to modify udev rules as described on the Teensy Linux page.
+Some distributions provide a binary, maybe called `teensy-loader-cli`).
+
+To flash the firmware:
+
+  - Build the firmware with `make keymapname`, for example `make default` 
+  - This will result in a hex file called `ergodox_ez_keymapname.hex`, e.g.
+    `ergodox_ez_default.hex`
+
+  - Start the teensy loader.
+
+  - Load the .hex file into it.
+
+  - Press the Reset button by inserting a paperclip gently into the reset hole
+    in the top right corder.
+
+  - Click the button in the Teensy app to download the firmware.
+
+## ErgoDox Infinity
+
+The Infinity is two completely independent keyboards, and needs to be flashed
+for the left and right halves seperately.  To flash them:
+
+  - Build the firmware with `make infinity-keymapname`
+
+  - Plug in the left hand keyboard only.
+
+  - Press the program button (back of keyboard, above thumb pad).
+
+  - Install the firmware with `sudo make infinity-keymapname-dfu-util`
+
+  - Build left hand firmware with `make infinity-keymapname MASTER=right`
+
+  - Plug in the right hand keyboard only.
+
+  - Press the program button (back of keyboard, above thumb pad).
+
+  - Install the firmware with `sudo make infinity-keymapname-dfu-util MASTER=right`
+
+More information on the Infinity firmware is available in the [TMK/chibios for
+Input Club Infinity Ergodox](https://github.com/fredizzimo/infinity_ergodox/blob/master/README.md)
+
+### Infinity Master/Two Halves
+
+The Infinity is two completely independent keyboards, that can connect together.
+You have a few options in how you flash the firmware:
+
+- Flash the left half, rebuild the firmware with "MASTER=right" and then flash
+  the right half.  This allows you to plug in either half directly to the
+  computer and is what the above instructions do.
+
+- Flash the left half, then flash the same firmware on the right.  This only
+  works when the left half is plugged directly to the computer and the keymap
+  is mirrored.  It saves the small extra step of rebuilding with
+  "MASTER=right".
+
+- The same as the previous one but with "MASTER=right" when you build the
+  firmware, then flash the same firmware to both halves.  You just have to
+  directly connect the right half to the computer.
+
+- For minor changes such as changing only the keymap without having updated
+  any part of the firmware code itself, you can program only the MASTER half.
+  It is safest to program both halves though.
+
+# Contributing your keymap
 
 The QMK firmware is open-source, so it would be wonderful to have your contribution! Within a very short time after launching we already amassed dozens of user-contributed keymaps, with all sorts of creative improvements and tweaks. This is very valuable for people who aren't comfortable coding, but do want to customize their ErgoDox. To make it easy for these people to use your layout, I recommend submitting your PR in the following format.
 
@@ -36,11 +140,26 @@ The QMK firmware is open-source, so it would be wonderful to have your contribut
 3. `readme.md` - a readme file, which GitHub would display by default when people go to your directory. Explain what's different about your keymap, what you tweaked or how it works. No specific format to follow, just communicate what you did. :)
 4. Any graphics you wish to add. This is absolutely not a must. If you feel like it, you can use [Keyboard Layout Editor](http://keyboard-layout-editor.com) to make something and grab a screenshot, but it's really not a must. If you do have graphics, your readme can just embed the graphic as a link, just like I did with the default layout.
 
-
-## Finding the keycodes you need
+# Finding the keycodes you need
 
 Let's say you want a certain key in your layout to send a colon; to figure out what keycode to use to make it do that, you're going to need `quantum/keymap_common.h`.
 
 That file contains a big list of all of the special, fancy keys (like, being able to send % on its own and whatnot).
 
 If you want to send a plain vanilla key, you can look up its code under `doc/keycode.txt`. That's where all the boring keys hang out.
+
+# Other Firmware Options
+
+There are external tools for customizing the layout, but those do not use
+the featurs of this qmk firmware.  These sites include:
+
+  - [Massdrop configurator](https://keyboard-configurator.massdrop.com/ext/ergodox) for Ez
+  - [Input Club configurator](https://input.club/configurator-ergodox) for Infinity, provides left and right files
+
+You can also find an existing firmware that you like, for example from:
+
+  - [Dozens of community-contributed keymaps](http://qmk.fm/keyboards/ergodox/)
+
+This qmk firmware also provides the ability to customize keymaps, but requires
+a toolchain to build the firmware.  See below for instructions on building
+firmware and customizing keymaps.
diff --git a/keyboards/ergodox/rules.mk b/keyboards/ergodox/rules.mk
new file mode 100644 (file)
index 0000000..add64ec
--- /dev/null
@@ -0,0 +1,29 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make = Make software.
+#
+# make clean = Clean out built project files.
+#
+# That's pretty much all you need. To compile, always go make clean, 
+# followed by make.
+#
+# For advanced users only:
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+#----------------------------------------------------------------------------
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no  # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE  ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE  ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE   ?= no  # Console for debug(+400)
+COMMAND_ENABLE   ?= yes # Commands for debug and configuration
+CUSTOM_MATRIX    ?= yes # Custom matrix file for the ErgoDox EZ
+SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE      ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+MIDI_ENABLE      ?= no  # MIDI controls
+UNICODE_ENABLE   ?= yes # Unicode
+ONEHAND_ENABLE   ?= yes # Allow swapping hands of keyboard
index 39a9cc0ae1caa9204284c01c754ea897d2a69018..57b2ef62e5f3a43b7338f789a5d4800c577b763d 100644 (file)
@@ -1,74 +1,3 @@
-\r
-\r
-# MCU name\r
-#MCU = at90usb1287\r
-MCU = atmega32u4\r
-\r
-# Processor frequency.\r
-#     This will define a symbol, F_CPU, in all source code files equal to the\r
-#     processor frequency in Hz. You can then use this symbol in your source code to\r
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done\r
-#     automatically to create a 32-bit value in your source code.\r
-#\r
-#     This will be an integer division of F_USB below, as it is sourced by\r
-#     F_USB after it has run through any CPU prescalers. Note that this value\r
-#     does not *change* the processor frequency - it should merely be updated to\r
-#     reflect the processor speed set externally so that the code can use accurate\r
-#     software delays.\r
-F_CPU = 16000000\r
-\r
-\r
-#\r
-# LUFA specific\r
-#\r
-# Target architecture (see library "Board Types" documentation).\r
-ARCH = AVR8\r
-\r
-# Input clock frequency.\r
-#     This will define a symbol, F_USB, in all source code files equal to the\r
-#     input clock frequency (before any prescaling is performed) in Hz. This value may\r
-#     differ from F_CPU if prescaling is used on the latter, and is required as the\r
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed\r
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'\r
-#     at the end, this will be done automatically to create a 32-bit value in your\r
-#     source code.\r
-#\r
-#     If no clock division is performed on the input clock inside the AVR (via the\r
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.\r
-F_USB = $(F_CPU)\r
-\r
-# Interrupt driven control endpoint task(+60)\r
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT\r
-\r
-\r
-# Boot Section Size in *bytes*\r
-#   Teensy halfKay   512\r
-#   Teensy++ halfKay 1024\r
-#   Atmel DFU loader 4096\r
-#   LUFA bootloader  4096\r
-#   USBaspLoader     2048\r
-OPT_DEFS += -DBOOTLOADER_SIZE=4096\r
-\r
-\r
-# Build Options\r
-#   comment out to disable the options.\r
-#\r
-BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)\r
-MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)\r
-EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)\r
-# CONSOLE_ENABLE ?= yes                # Console for debug(+400)\r
-# COMMAND_ENABLE ?= yes                # Commands for debug and configuration\r
-KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key\r
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE\r
-# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend\r
-NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work\r
-# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality\r
-# MIDI_ENABLE ?= YES                   # MIDI controls\r
-# UNICODE_ENABLE ?= YES                # Unicode\r
-# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID\r
-\r
-\r
-ifndef QUANTUM_DIR\r
-       include ../../Makefile\r
-endif\r
-\r
+ifndef MAKEFILE_INCLUDED
+       include ../../Makefile
+endif
index 4813c4e786ff43012daeffb825534462998f25fc..97753bc069d2f3caba3bc4f1d02457005b5e4f63 100644 (file)
-/*\r
-Copyright 2012 Jun Wako <wakojun@gmail.com>\r
-\r
-This program is free software: you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation, either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-*/\r
-\r
-#ifndef CONFIG_H\r
-#define CONFIG_H\r
-\r
-#include "config_common.h"\r
-\r
-/* USB Device descriptor parameter */\r
-#define VENDOR_ID    0xFEED\r
-#define PRODUCT_ID   0x6060\r
-#define DEVICE_VER   0x0001\r
-#define MANUFACTURER    geekhack\r
-#define PRODUCT         GH60\r
-#define DESCRIPTION     t.m.k. keyboard firmware for GH60\r
-\r
-/* key matrix size */\r
-#define MATRIX_ROWS 5\r
-#define MATRIX_COLS 14\r
-\r
-/*\r
- * Keyboard Matrix Assignments\r
- *\r
- * Change this to how you wired your keyboard\r
- * COLS: AVR pins used for columns, left to right\r
- * ROWS: AVR pins used for rows, top to bottom\r
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)\r
- *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)\r
- *\r
-*/\r
- #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }\r
-// Rev A\r
-// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }\r
-// Rev B/C\r
-   #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }\r
-#define UNUSED_PINS\r
-\r
-/* COL2ROW or ROW2COL */\r
-#define DIODE_DIRECTION COL2ROW\r
-\r
-/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */\r
-#define DEBOUNCING_DELAY 5\r
-\r
-/* define if matrix has ghost (lacks anti-ghosting diodes) */\r
-//#define MATRIX_HAS_GHOST\r
-\r
-/* number of backlight levels */\r
-#define BACKLIGHT_LEVELS 3\r
-\r
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */\r
-#define LOCKING_SUPPORT_ENABLE\r
-/* Locking resynchronize hack */\r
-#define LOCKING_RESYNC_ENABLE\r
-\r
-/*\r
- * Force NKRO\r
- *\r
- * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved\r
- * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the\r
- * makefile for this to work.)\r
- *\r
- * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)\r
- * until the next keyboard reset.\r
- *\r
- * NKRO may prevent your keystrokes from being detected in the BIOS, but it is\r
- * fully operational during normal computer usage.\r
- *\r
- * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)\r
- * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by\r
- * bootmagic, NKRO mode will always be enabled until it is toggled again during a\r
- * power-up.\r
- *\r
- */\r
-//#define FORCE_NKRO\r
-\r
-/*\r
- * Magic Key Options\r
- *\r
- * Magic keys are hotkey commands that allow control over firmware functions of\r
- * the keyboard. They are best used in combination with the HID Listen program,\r
- * found here: https://www.pjrc.com/teensy/hid_listen.html\r
- *\r
- * The options below allow the magic key functionality to be changed. This is\r
- * useful if your keyboard/keypad is missing keys and you want magic key support.\r
- *\r
- */\r
-\r
-/* key combination for magic key command */\r
-#define IS_COMMAND() ( \\r
-  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \\r
-)\r
-\r
-/* control how magic key switches layers */\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false\r
-\r
-/* override magic key keymap */\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM\r
-//#define MAGIC_KEY_HELP1     H\r
-//#define MAGIC_KEY_HELP2     SLASH\r
-//#define MAGIC_KEY_DEBUG     D\r
-//#define MAGIC_KEY_DEBUG_MATRIX  X\r
-//#define MAGIC_KEY_DEBUG_KBD   K\r
-//#define MAGIC_KEY_DEBUG_MOUSE  M\r
-//#define MAGIC_KEY_VERSION    V\r
-//#define MAGIC_KEY_STATUS     S\r
-//#define MAGIC_KEY_CONSOLE    C\r
-//#define MAGIC_KEY_LAYER0_ALT1  ESC\r
-//#define MAGIC_KEY_LAYER0_ALT2  GRAVE\r
-//#define MAGIC_KEY_LAYER0     0\r
-//#define MAGIC_KEY_LAYER1     1\r
-//#define MAGIC_KEY_LAYER2     2\r
-//#define MAGIC_KEY_LAYER3     3\r
-//#define MAGIC_KEY_LAYER4     4\r
-//#define MAGIC_KEY_LAYER5     5\r
-//#define MAGIC_KEY_LAYER6     6\r
-//#define MAGIC_KEY_LAYER7     7\r
-//#define MAGIC_KEY_LAYER8     8\r
-//#define MAGIC_KEY_LAYER9     9\r
-//#define MAGIC_KEY_BOOTLOADER   PAUSE\r
-//#define MAGIC_KEY_LOCK      CAPS\r
-//#define MAGIC_KEY_EEPROM     E\r
-//#define MAGIC_KEY_NKRO      N\r
-//#define MAGIC_KEY_SLEEP_LED   Z\r
-\r
-/*\r
- * Feature disable options\r
- * These options are also useful to firmware size reduction.\r
- */\r
-\r
-/* disable debug print */\r
-//#define NO_DEBUG\r
-\r
-/* disable print */\r
-//#define NO_PRINT\r
-\r
-/* disable action features */\r
-//#define NO_ACTION_LAYER\r
-//#define NO_ACTION_TAPPING\r
-//#define NO_ACTION_ONESHOT\r
-//#define NO_ACTION_MACRO\r
-//#define NO_ACTION_FUNCTION\r
-\r
-#endif\r
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID    0xFEED
+#define PRODUCT_ID   0x6060
+#define DEVICE_VER   0x0001
+#define MANUFACTURER    geekhack
+#define PRODUCT         GH60
+#define DESCRIPTION     t.m.k. keyboard firmware for GH60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+ #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }
+// Rev A
+// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }
+// Rev B/C
+   #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1     H
+//#define MAGIC_KEY_HELP2     SLASH
+//#define MAGIC_KEY_DEBUG     D
+//#define MAGIC_KEY_DEBUG_MATRIX  X
+//#define MAGIC_KEY_DEBUG_KBD   K
+//#define MAGIC_KEY_DEBUG_MOUSE  M
+//#define MAGIC_KEY_VERSION    V
+//#define MAGIC_KEY_STATUS     S
+//#define MAGIC_KEY_CONSOLE    C
+//#define MAGIC_KEY_LAYER0_ALT1  ESC
+//#define MAGIC_KEY_LAYER0_ALT2  GRAVE
+//#define MAGIC_KEY_LAYER0     0
+//#define MAGIC_KEY_LAYER1     1
+//#define MAGIC_KEY_LAYER2     2
+//#define MAGIC_KEY_LAYER3     3
+//#define MAGIC_KEY_LAYER4     4
+//#define MAGIC_KEY_LAYER5     5
+//#define MAGIC_KEY_LAYER6     6
+//#define MAGIC_KEY_LAYER7     7
+//#define MAGIC_KEY_LAYER8     8
+//#define MAGIC_KEY_LAYER9     9
+//#define MAGIC_KEY_BOOTLOADER   PAUSE
+//#define MAGIC_KEY_LOCK      CAPS
+//#define MAGIC_KEY_EEPROM     E
+//#define MAGIC_KEY_NKRO      N
+//#define MAGIC_KEY_SLEEP_LED   Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
index 255d87de996274d1574fd8d757d5ecc9c8eb25dd..f5a158e12f99bd1e2a6d306e232e3d145057f8f8 100644 (file)
@@ -1,25 +1,25 @@
-#include "gh60.h"\r
-\r
-void led_set_kb(uint8_t usb_led) {\r
-       // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here\r
-       \r
-    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {\r
-               gh60_caps_led_on();\r
-               } else {\r
-               gh60_caps_led_off(); \r
-    }\r
-       \r
-    // if (usb_led & (1<<USB_LED_NUM_LOCK)) {\r
-               // gh60_esc_led_on();\r
-               // } else {\r
-               // gh60_esc_led_off(); \r
-    // }\r
-       \r
-    // if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {\r
-               // gh60_fn_led_on();\r
-               // } else {\r
-               // gh60_fn_led_off();   \r
-    // }\r
-\r
-       led_set_user(usb_led);  \r
-}\r
+#include "gh60.h"
+
+void led_set_kb(uint8_t usb_led) {
+       // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+       
+    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+               gh60_caps_led_on();
+               } else {
+               gh60_caps_led_off(); 
+    }
+       
+    // if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+               // gh60_esc_led_on();
+               // } else {
+               // gh60_esc_led_off(); 
+    // }
+       
+    // if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+               // gh60_fn_led_on();
+               // } else {
+               // gh60_fn_led_off();   
+    // }
+
+       led_set_user(usb_led);  
+}
index ca30562a44a94d466da262e87bab81b477d3f099..82624b614844ca4a139696f2960ad4c01d4ef886 100644 (file)
@@ -1,74 +1,74 @@
-#ifndef GH60_H\r
-#define GH60_H\r
-\r
-#include "quantum.h"\r
-#include "led.h"\r
-\r
-/* GH60 LEDs \r
- *   GPIO pads\r
- *   0 F7 WASD LEDs\r
- *   1 F6 ESC LED\r
- *   2 F5 FN LED\r
- *   3 F4 POKER Arrow LEDs\r
- *   B2 Capslock LED\r
- *   B0 not connected\r
- */\r
-inline void gh60_caps_led_on(void)      { DDRB |=  (1<<2); PORTB &= ~(1<<2); }\r
-inline void gh60_poker_leds_on(void)    { DDRF |=  (1<<4); PORTF &= ~(1<<4); }\r
-inline void gh60_fn_led_on(void)       { DDRF |=  (1<<5); PORTF &= ~(1<<5); }\r
-inline void gh60_esc_led_on(void)      { DDRF |=  (1<<6); PORTF &= ~(1<<6); }\r
-inline void gh60_wasd_leds_on(void)            { DDRF |=  (1<<7); PORTF &= ~(1<<7); }\r
-\r
-inline void gh60_caps_led_off(void)     { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }\r
-inline void gh60_poker_leds_off(void)   { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }\r
-inline void gh60_fn_led_off(void)      { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }\r
-inline void gh60_esc_led_off(void)     { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }\r
-inline void gh60_wasd_leds_off(void)           { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }\r
-\r
-/* GH60 keymap definition macro\r
- * K2C, K31 and  K3C are extra keys for ISO\r
- */\r
-#define KEYMAP( \\r
-    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \\r
-    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \\r
-    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \\r
-    K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \\r
-    K40, K41, K42,           K45,                K49, K4A, K4B, K4C, K4D  \\r
-) { \\r
-    { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \\r
-    { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \\r
-    { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \\r
-    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \\r
-    { KC_##K40, KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_##K45, KC_NO,    KC_NO,    KC_NO,    KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }  \\r
-}\r
-\r
-/* ANSI valiant. No extra keys for ISO */\r
-#define KEYMAP_ANSI( \\r
-    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \\r
-    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \\r
-    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2D, \\r
-    K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,           K3D, \\r
-    K40, K41, K42,           K45,                     K4A, K4B, K4C, K4D  \\r
-) KEYMAP( \\r
-    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \\r
-    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \\r
-    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO,  K2D, \\r
-    K30, NO,  K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO,  K3D, \\r
-    K40, K41, K42,           K45,                NO,  K4A, K4B, K4C, K4D  \\r
-)\r
-\r
-#define KEYMAP_HHKB( \\r
-    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\\r
-    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \\r
-    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2D, \\r
-    K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3C, \\r
-    K40, K41, K42,           K45,                     K4A, K4B, K4C, K4D  \\r
-) KEYMAP( \\r
-    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \\r
-    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \\r
-    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO,  K2D, \\r
-    K30, NO,  K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \\r
-    K40, K41, K42,           K45,                K49, K4A, K4B, K4C, K4D  \\r
-)\r
-\r
-#endif\r
+#ifndef GH60_H
+#define GH60_H
+
+#include "quantum.h"
+#include "led.h"
+
+/* GH60 LEDs 
+ *   GPIO pads
+ *   0 F7 WASD LEDs
+ *   1 F6 ESC LED
+ *   2 F5 FN LED
+ *   3 F4 POKER Arrow LEDs
+ *   B2 Capslock LED
+ *   B0 not connected
+ */
+inline void gh60_caps_led_on(void)      { DDRB |=  (1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_on(void)    { DDRF |=  (1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_on(void)       { DDRF |=  (1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_on(void)      { DDRF |=  (1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_on(void)            { DDRF |=  (1<<7); PORTF &= ~(1<<7); }
+
+inline void gh60_caps_led_off(void)     { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_off(void)   { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_off(void)      { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_off(void)     { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_off(void)           { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
+
+/* GH60 keymap definition macro
+ * K2C, K31 and  K3C are extra keys for ISO
+ */
+#define KEYMAP( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+    K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+    K40, K41, K42,           K45,                K49, K4A, K4B, K4C, K4D  \
+) { \
+    { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
+    { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
+    { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
+    { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
+    { KC_##K40, KC_##K41, KC_##K42, KC_NO,    KC_NO,    KC_##K45, KC_NO,    KC_NO,    KC_NO,    KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D }  \
+}
+
+/* ANSI valiant. No extra keys for ISO */
+#define KEYMAP_ANSI( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2D, \
+    K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,           K3D, \
+    K40, K41, K42,           K45,                     K4A, K4B, K4C, K4D  \
+) KEYMAP( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO,  K2D, \
+    K30, NO,  K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO,  K3D, \
+    K40, K41, K42,           K45,                NO,  K4A, K4B, K4C, K4D  \
+)
+
+#define KEYMAP_HHKB( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,      K2D, \
+    K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B,      K3D, K3C, \
+    K40, K41, K42,           K45,                     K4A, K4B, K4C, K4D  \
+) KEYMAP( \
+    K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+    K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+    K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO,  K2D, \
+    K30, NO,  K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+    K40, K41, K42,           K45,                K49, K4A, K4B, K4C, K4D  \
+)
+
+#endif
index 2e69aee298130c343a163075af3243f81b42eeef..c73cf114172ce101039196cad50aef9af22facd6 100644 (file)
-#----------------------------------------------------------------------------\r
-# On command line:\r
-#\r
-# make all = Make software.\r
-#\r
-# make clean = Clean out built project files.\r
-#\r
-# make coff = Convert ELF to AVR COFF.\r
-#\r
-# make extcoff = Convert ELF to AVR Extended COFF.\r
-#\r
-# make program = Download the hex file to the device.\r
-#                Please customize your programmer settings(PROGRAM_CMD)\r
-#\r
-# make teensy = Download the hex file to the device, using teensy_loader_cli.\r
-#               (must have teensy_loader_cli installed).\r
-#\r
-# make dfu = Download the hex file to the device, using dfu-programmer (must\r
-#            have dfu-programmer installed).\r
-#\r
-# make flip = Download the hex file to the device, using Atmel FLIP (must\r
-#             have Atmel FLIP installed).\r
-#\r
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer\r
-#               (must have dfu-programmer installed).\r
-#\r
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP\r
-#                (must have Atmel FLIP installed).\r
-#\r
-# make debug = Start either simulavr or avarice as specified for debugging, \r
-#              with avr-gdb or avr-insight as the front end for debugging.\r
-#\r
-# make filename.s = Just compile filename.c into the assembler code only.\r
-#\r
-# make filename.i = Create a preprocessed source file for use in submitting\r
-#                   bug reports to the GCC project.\r
-#\r
-# To rebuild project do "make clean" then "make all".\r
-#----------------------------------------------------------------------------\r
-\r
-# MCU name\r
-#MCU = at90usb1287\r
-MCU = atmega32u4\r
-\r
-# Processor frequency.\r
-#     This will define a symbol, F_CPU, in all source code files equal to the\r
-#     processor frequency in Hz. You can then use this symbol in your source code to\r
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done\r
-#     automatically to create a 32-bit value in your source code.\r
-#\r
-#     This will be an integer division of F_USB below, as it is sourced by\r
-#     F_USB after it has run through any CPU prescalers. Note that this value\r
-#     does not *change* the processor frequency - it should merely be updated to\r
-#     reflect the processor speed set externally so that the code can use accurate\r
-#     software delays.\r
-F_CPU = 16000000\r
-\r
-\r
-#\r
-# LUFA specific\r
-#\r
-# Target architecture (see library "Board Types" documentation).\r
-ARCH = AVR8\r
-\r
-# Input clock frequency.\r
-#     This will define a symbol, F_USB, in all source code files equal to the\r
-#     input clock frequency (before any prescaling is performed) in Hz. This value may\r
-#     differ from F_CPU if prescaling is used on the latter, and is required as the\r
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed\r
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'\r
-#     at the end, this will be done automatically to create a 32-bit value in your\r
-#     source code.\r
-#\r
-#     If no clock division is performed on the input clock inside the AVR (via the\r
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.\r
-F_USB = $(F_CPU)\r
-\r
-# Interrupt driven control endpoint task(+60)\r
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT\r
-\r
-\r
-# Boot Section Size in *bytes*\r
-#   Teensy halfKay   512\r
-#   Teensy++ halfKay 1024\r
-#   Atmel DFU loader 4096\r
-#   LUFA bootloader  4096\r
-#   USBaspLoader     2048\r
-OPT_DEFS += -DBOOTLOADER_SIZE=4096\r
-\r
-\r
-# Build Options\r
-#   comment out to disable the options.\r
-#\r
-BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)\r
-MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)\r
-EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)\r
-# CONSOLE_ENABLE ?= yes                # Console for debug(+400)\r
-# COMMAND_ENABLE ?= yes                # Commands for debug and configuration\r
-KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key\r
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE\r
-# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend\r
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work\r
-# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality\r
-# MIDI_ENABLE ?= YES           # MIDI controls\r
-# UNICODE_ENABLE ?= YES                # Unicode\r
-# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID\r
-RGBLIGHT_ENABLE ?= yes          # Enable RGB Underglow\r
-\r
-ifndef QUANTUM_DIR\r
-       include ../../../../Makefile\r
-endif\r
-\r
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging, 
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
+# CONSOLE_ENABLE ?= yes                # Console for debug(+400)
+# COMMAND_ENABLE ?= yes                # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES           # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= yes          # Enable RGB Underglow
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
+
index 8272875ed0efda5df6a1d70df7b56141da7f4ab8..6a29e6b8c264dfd7d623567eafeaea96592c329a 100644 (file)
-/*\r
-Copyright 2012 Jun Wako <wakojun@gmail.com>\r
-\r
-This program is free software: you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation, either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with this program. If not, see <http://www.gnu.org/licenses/>.\r
-*/\r
-\r
-#ifndef CONFIG_H\r
-#define CONFIG_H\r
-\r
-#include "config_common.h"\r
-\r
-/* USB Device descriptor parameter */\r
-#define VENDOR_ID    0xFEED\r
-#define PRODUCT_ID   0x6060\r
-#define DEVICE_VER   0x0001\r
-#define MANUFACTURER    geekhack\r
-#define PRODUCT         GH60\r
-#define DESCRIPTION     t.m.k. keyboard firmware for GH60\r
-\r
-/* key matrix size */\r
-#define MATRIX_ROWS 5\r
-#define MATRIX_COLS 14\r
-\r
-/*\r
- * Keyboard Matrix Assignments\r
- *\r
- * Change this to how you wired your keyboard\r
- * COLS: AVR pins used for columns, left to right\r
- * ROWS: AVR pins used for rows, top to bottom\r
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)\r
- *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)\r
- *\r
-*/\r
- #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }\r
-// Rev A\r
-// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }\r
-// Rev B/C\r
-   #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }\r
-#define UNUSED_PINS\r
-\r
-/* COL2ROW or ROW2COL */\r
-#define DIODE_DIRECTION COL2ROW\r
-\r
-/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */\r
-#define DEBOUNCING_DELAY 5\r
-\r
-/* define if matrix has ghost (lacks anti-ghosting diodes) */\r
-//#define MATRIX_HAS_GHOST\r
-\r
-/* number of backlight levels */\r
-#define BACKLIGHT_LEVELS 3\r
-\r
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */\r
-#define LOCKING_SUPPORT_ENABLE\r
-/* Locking resynchronize hack */\r
-#define LOCKING_RESYNC_ENABLE\r
-\r
-/*\r
- * Force NKRO\r
- *\r
- * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved\r
- * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the\r
- * makefile for this to work.)\r
- *\r
- * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)\r
- * until the next keyboard reset.\r
- *\r
- * NKRO may prevent your keystrokes from being detected in the BIOS, but it is\r
- * fully operational during normal computer usage.\r
- *\r
- * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)\r
- * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by\r
- * bootmagic, NKRO mode will always be enabled until it is toggled again during a\r
- * power-up.\r
- *\r
- */\r
-//#define FORCE_NKRO\r
-\r
-/*\r
- * Magic Key Options\r
- *\r
- * Magic keys are hotkey commands that allow control over firmware functions of\r
- * the keyboard. They are best used in combination with the HID Listen program,\r
- * found here: https://www.pjrc.com/teensy/hid_listen.html\r
- *\r
- * The options below allow the magic key functionality to be changed. This is\r
- * useful if your keyboard/keypad is missing keys and you want magic key support.\r
- *\r
- */\r
-\r
-/* key combination for magic key command */\r
-#define IS_COMMAND() ( \\r
-  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \\r
-)\r
-\r
-/* control how magic key switches layers */\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false\r
-\r
-/* override magic key keymap */\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS\r
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM\r
-//#define MAGIC_KEY_HELP1     H\r
-//#define MAGIC_KEY_HELP2     SLASH\r
-//#define MAGIC_KEY_DEBUG     D\r
-//#define MAGIC_KEY_DEBUG_MATRIX  X\r
-//#define MAGIC_KEY_DEBUG_KBD   K\r
-//#define MAGIC_KEY_DEBUG_MOUSE  M\r
-//#define MAGIC_KEY_VERSION    V\r
-//#define MAGIC_KEY_STATUS     S\r
-//#define MAGIC_KEY_CONSOLE    C\r
-//#define MAGIC_KEY_LAYER0_ALT1  ESC\r
-//#define MAGIC_KEY_LAYER0_ALT2  GRAVE\r
-//#define MAGIC_KEY_LAYER0     0\r
-//#define MAGIC_KEY_LAYER1     1\r
-//#define MAGIC_KEY_LAYER2     2\r
-//#define MAGIC_KEY_LAYER3     3\r
-//#define MAGIC_KEY_LAYER4     4\r
-//#define MAGIC_KEY_LAYER5     5\r
-//#define MAGIC_KEY_LAYER6     6\r
-//#define MAGIC_KEY_LAYER7     7\r
-//#define MAGIC_KEY_LAYER8     8\r
-//#define MAGIC_KEY_LAYER9     9\r
-//#define MAGIC_KEY_BOOTLOADER   PAUSE\r
-//#define MAGIC_KEY_LOCK      CAPS\r
-//#define MAGIC_KEY_EEPROM     E\r
-//#define MAGIC_KEY_NKRO      N\r
-//#define MAGIC_KEY_SLEEP_LED   Z\r
-\r
-/*\r
- * Feature disable options\r
- * These options are also useful to firmware size reduction.\r
- */\r
-\r
-/* disable debug print */\r
-//#define NO_DEBUG\r
-\r
-/* disable print */\r
-//#define NO_PRINT\r
-\r
-/* disable action features */\r
-//#define NO_ACTION_LAYER\r
-//#define NO_ACTION_TAPPING\r
-//#define NO_ACTION_ONESHOT\r
-//#define NO_ACTION_MACRO\r
-//#define NO_ACTION_FUNCTION\r
-\r
-/*\r
- * RGB Underglow\r
- * These settings are for the F4 by default:\r
- * \r
- *\r
- * #define ws2812_PORTREG  PORTF\r
- * #define ws2812_DDRREG   DDRF\r
- * #define ws2812_pin PF4\r
- * #define RGBLED_NUM 14     // Number of LEDs\r
- * #define RGBLIGHT_HUE_STEP 10\r
- * #define RGBLIGHT_SAT_STEP 17\r
- * #define RGBLIGHT_VAL_STEP 17\r
- *\r
- * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. \r
- * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. \r
- * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c\r
-*/\r
-\r
-/* Deprecated code below\r
-#define ws2812_PORTREG  PORTF \r
-#define ws2812_DDRREG   DDRF\r
-#define ws2812_pin PF4\r
-*/ \r
-#define RGB_DI_PIN F4\r
-#define RGBLIGHT_TIMER\r
-#define RGBLED_NUM 8         // Number of LEDs\r
-#define RGBLIGHT_HUE_STEP 8\r
-#define RGBLIGHT_SAT_STEP 8\r
-#define RGBLIGHT_VAL_STEP 8\r
-#endif\r
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID    0xFEED
+#define PRODUCT_ID   0x6060
+#define DEVICE_VER   0x0001
+#define MANUFACTURER    geekhack
+#define PRODUCT         GH60
+#define DESCRIPTION     t.m.k. keyboard firmware for GH60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+ #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }
+// Rev A
+// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }
+// Rev B/C
+   #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1     H
+//#define MAGIC_KEY_HELP2     SLASH
+//#define MAGIC_KEY_DEBUG     D
+//#define MAGIC_KEY_DEBUG_MATRIX  X
+//#define MAGIC_KEY_DEBUG_KBD   K
+//#define MAGIC_KEY_DEBUG_MOUSE  M
+//#define MAGIC_KEY_VERSION    V
+//#define MAGIC_KEY_STATUS     S
+//#define MAGIC_KEY_CONSOLE    C
+//#define MAGIC_KEY_LAYER0_ALT1  ESC
+//#define MAGIC_KEY_LAYER0_ALT2  GRAVE
+//#define MAGIC_KEY_LAYER0     0
+//#define MAGIC_KEY_LAYER1     1
+//#define MAGIC_KEY_LAYER2     2
+//#define MAGIC_KEY_LAYER3     3
+//#define MAGIC_KEY_LAYER4     4
+//#define MAGIC_KEY_LAYER5     5
+//#define MAGIC_KEY_LAYER6     6
+//#define MAGIC_KEY_LAYER7     7
+//#define MAGIC_KEY_LAYER8     8
+//#define MAGIC_KEY_LAYER9     9
+//#define MAGIC_KEY_BOOTLOADER   PAUSE
+//#define MAGIC_KEY_LOCK      CAPS
+//#define MAGIC_KEY_EEPROM     E
+//#define MAGIC_KEY_NKRO      N
+//#define MAGIC_KEY_SLEEP_LED   Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * RGB Underglow
+ * These settings are for the F4 by default:
+ * 
+ *
+ * #define ws2812_PORTREG  PORTF
+ * #define ws2812_DDRREG   DDRF
+ * #define ws2812_pin PF4
+ * #define RGBLED_NUM 14     // Number of LEDs
+ * #define RGBLIGHT_HUE_STEP 10
+ * #define RGBLIGHT_SAT_STEP 17
+ * #define RGBLIGHT_VAL_STEP 17
+ *
+ * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. 
+ * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. 
+ * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c
+*/
+
+/* Deprecated code below
+#define ws2812_PORTREG  PORTF 
+#define ws2812_DDRREG   DDRF
+#define ws2812_pin PF4
+*/ 
+#define RGB_DI_PIN F4
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8         // Number of LEDs
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#endif
index 3787f938e7883a972ae83c41d0ba01b4af5bd6c7..e9bf1983a5b772d81a4395972e48dee91271a358 100644 (file)
@@ -1,18 +1,18 @@
-    /* Column pin configuration\r
-    * col: 0   1   2   3   4   5   6   7   8   9   10  11  12  13\r
-    * pin: F0  F1  E6  C7  C6  B6  D4  B1  B7  B5  B4  D7  D6  B3  (Rev.C)\r
-    */\r
-     \r
-    /* Row pin configuration\r
-    * row: 0   1   2   3   4\r
-    * pin: D0  D1  D2  D3  D5\r
-    */\r
-     \r
-    GPIO pads\r
-    0 F7 WASD LEDs\r
-    1 F6 ESC LED\r
-    2 F5 FN LED\r
-    3 F4 POKER Arrow LEDs\r
-     \r
-    B2 Capslock LED\r
+    /* Column pin configuration
+    * col: 0   1   2   3   4   5   6   7   8   9   10  11  12  13
+    * pin: F0  F1  E6  C7  C6  B6  D4  B1  B7  B5  B4  D7  D6  B3  (Rev.C)
+    */
+     
+    /* Row pin configuration
+    * row: 0   1   2   3   4
+    * pin: D0  D1  D2  D3  D5
+    */
+     
+    GPIO pads
+    0 F7 WASD LEDs
+    1 F6 ESC LED
+    2 F5 FN LED
+    3 F4 POKER Arrow LEDs
+     
+    B2 Capslock LED
     B0 not connected
\ No newline at end of file
index 92302d507ccb4d22d9e70b17bc4bc9104fe162ea..8c744bfd3c5327e44111cf0dfa23d579614ce878 100644 (file)
@@ -1,60 +1,62 @@
-## gh60 Rev C keyboard firmware\r
-\r
-![gh60 Rev C PCB](gh60revc.jpg)\r
-\r
-    /* Column pin configuration\r
-    * col: 0   1   2   3   4   5   6   7   8   9   10  11  12  13\r
-    * pin: F0  F1  E6  C7  C6  B6  D4  B1  B7  B5  B4  D7  D6  B3  (Rev.C)\r
-    */\r
-     \r
-    /* Row pin configuration\r
-    * row: 0   1   2   3   4\r
-    * pin: D0  D1  D2  D3  D5\r
-    */\r
-     \r
-    GPIO pads\r
-    0 F7 WASD LEDs\r
-    1 F6 ESC LED\r
-    2 F5 FN LED\r
-    3 F4 POKER Arrow LEDs\r
-     \r
-    B2 Capslock LED\r
-    B0 not connected\r
-       \r
-Functions to controls LED clusters\r
-       \r
-    gh60_caps_led_on()\r
-    gh60_poker_leds_on()\r
-    gh60_fn_led_on()\r
-    gh60_esc_led_on()\r
-    gh60_wasd_leds_on()\r
-    \r
-    gh60_caps_led_off()\r
-    gh60_poker_leds_off()\r
-    gh60_fn_led_off()\r
-    gh60_esc_led_off()\r
-    gh60_wasd_leds_off()\r
-       \r
-======================\r
-\r
-## Quantum MK Firmware\r
-\r
-For the full Quantum feature list, see [the parent readme.md](/readme.md).\r
-\r
-## Building\r
-\r
-Download or clone the whole firmware and navigate to the keyboards/gh60_rev_c folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. \r
-\r
-Depending on which keymap you would like to use, you will have to compile slightly differently.\r
-\r
-### Default\r
-To build with the default keymap, simply run `make`.\r
-\r
-### Other Keymaps\r
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.\r
-\r
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:\r
-```\r
-$ make KEYMAP=[default|jack|<name>]\r
-```\r
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.\r
+## gh60 Rev C keyboard firmware
+
+![gh60 Rev C PCB](gh60revc.jpg)
+
+    /* Column pin configuration
+    * col: 0   1   2   3   4   5   6   7   8   9   10  11  12  13
+    * pin: F0  F1  E6  C7  C6  B6  D4  B1  B7  B5  B4  D7  D6  B3  (Rev.C)
+    */
+     
+    /* Row pin configuration
+    * row: 0   1   2   3   4
+    * pin: D0  D1  D2  D3  D5
+    */
+     
+    GPIO pads
+    0 F7 WASD LEDs
+    1 F6 ESC LED
+    2 F5 FN LED
+    3 F4 POKER Arrow LEDs
+     
+    B2 Capslock LED
+    B0 not connected
+       
+Functions to controls LED clusters
+       
+    gh60_caps_led_on()
+    gh60_poker_leds_on()
+    gh60_fn_led_on()
+    gh60_esc_led_on()
+    gh60_wasd_leds_on()
+    
+    gh60_caps_led_off()
+    gh60_poker_leds_off()
+    gh60_fn_led_off()
+    gh60_esc_led_off()
+    gh60_wasd_leds_off()
+       
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme.md](/readme.md).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/gh60_rev_c folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
+
+Depending on which keymap you would like to use, you will have to compile slightly differently.
+
+### Default
+To build with the default keymap, simply run `make default`.
+
+### Other Keymaps
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
+
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
+```
+$ make [default|jack|<name>]
+```
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/gh60/rules.mk b/keyboards/gh60/rules.mk
new file mode 100644 (file)
index 0000000..aba680e
--- /dev/null
@@ -0,0 +1,66 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
+# CONSOLE_ENABLE ?= yes                # Console for debug(+400)
+# COMMAND_ENABLE ?= yes                # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES                   # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
index 711759917370a6886c1e3e79a9fde4c7a5fff1f7..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,73 +1,3 @@
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
-
-
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/CMD60/rules.mk b/keyboards/handwired/CMD60/rules.mk
new file mode 100644 (file)
index 0000000..7117599
--- /dev/null
@@ -0,0 +1,73 @@
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
+
+
index 57493a47caffa019f6112be7d716a01f18e7b6ab..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,3 +1,3 @@
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index 711759917370a6886c1e3e79a9fde4c7a5fff1f7..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,73 +1,3 @@
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
-
-
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/fivethirteen/rules.mk b/keyboards/handwired/fivethirteen/rules.mk
new file mode 100644 (file)
index 0000000..7117599
--- /dev/null
@@ -0,0 +1,73 @@
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
+
+
index 155c1f9a296fff6fbebdc5876b8331354fd5c8e8..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,71 +1,3 @@
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= no           # Audio output on port C6
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE ?= yes       # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/handwired/minorca/rules.mk b/keyboards/handwired/minorca/rules.mk
new file mode 100644 (file)
index 0000000..c51371a
--- /dev/null
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= yes       # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
\ No newline at end of file
index c6d10856a187c74e24d0c916c83f406418128090..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,65 +1,3 @@
-
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
-#NKRO_ENABLE = yes     # USB Nkey Rollover - not yet supported in LUFA
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/handwired/onekey/rules.mk b/keyboards/handwired/onekey/rules.mk
new file mode 100644 (file)
index 0000000..c6d1085
--- /dev/null
@@ -0,0 +1,65 @@
+
+
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+#NKRO_ENABLE = yes     # USB Nkey Rollover - not yet supported in LUFA
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/retro_refit/Makefile b/keyboards/handwired/retro_refit/Makefile
new file mode 100644 (file)
index 0000000..191c6bb
--- /dev/null
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+       include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/retro_refit/config.h b/keyboards/handwired/retro_refit/config.h
new file mode 100644 (file)
index 0000000..f2194e5
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Nobody
+#define PRODUCT         retro_refit
+#define DESCRIPTION     Retro Refit
+
+/* key matrix size */
+#define MATRIX_ROWS 11
+#define MATRIX_COLS 8
+
+// See note in retro_refit.h for an explanation of how this matrix is wired up
+#define MATRIX_ROW_PINS { D4, D7, B4, B5, B6, F7, F6, F5, F4, F1, F0 }
+#define MATRIX_COL_PINS { B0, B1, B2, B3, D2, D3, C7, D5 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 0
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+/* Force NKRO Mode - If forced on, must be disabled via magic key (default = LShift+RShift+N) */
+#define FORCE_NKRO
+
+/*
+ * Magic key options
+ * These options allow the magic key functionality to be changed. This is useful
+ * if your keyboard/keypad is missing keys and you want magic key support.
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS  true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS  true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* remap magic keys */
+//#define MAGIC_KEY_HELP1          H
+//#define MAGIC_KEY_HELP2          SLASH
+//#define MAGIC_KEY_DEBUG          D
+//#define MAGIC_KEY_DEBUG_MATRIX   X
+//#define MAGIC_KEY_DEBUG_KBD      K
+//#define MAGIC_KEY_DEBUG_MOUSE    M
+//#define MAGIC_KEY_VERSION        V
+//#define MAGIC_KEY_STATUS         S
+//#define MAGIC_KEY_CONSOLE        C
+//#define MAGIC_KEY_LAYER0_ALT1    ESC
+//#define MAGIC_KEY_LAYER0_ALT2    GRAVE
+//#define MAGIC_KEY_LAYER0         0
+//#define MAGIC_KEY_LAYER1         1
+//#define MAGIC_KEY_LAYER2         2
+//#define MAGIC_KEY_LAYER3         3
+//#define MAGIC_KEY_LAYER4         4
+//#define MAGIC_KEY_LAYER5         5
+//#define MAGIC_KEY_LAYER6         6
+//#define MAGIC_KEY_LAYER7         7
+//#define MAGIC_KEY_LAYER8         8
+//#define MAGIC_KEY_LAYER9         9
+//#define MAGIC_KEY_BOOTLOADER     PAUSE
+#define MAGIC_KEY_LOCK             BSLS
+//#define MAGIC_KEY_EEPROM         E
+//#define MAGIC_KEY_NKRO           N
+//#define MAGIC_KEY_SLEEP_LED      Z
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/handwired/retro_refit/keymaps/default/keymap.c b/keyboards/handwired/retro_refit/keymaps/default/keymap.c
new file mode 100644 (file)
index 0000000..405402d
--- /dev/null
@@ -0,0 +1,33 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "retro_refit.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] =
+       KEYMAP( ESC,    F1,   F2,   F3,   F4,   F5,   F6,   F7,   F8,  F9,  F10, NLCK, SLCK, PSCR, PAUS, \
+                       GRV,     1,    2,    3,    4,    5,    6,    7,    8,   9,    0, MINS,  EQL, BSPC, HOME, \
+                       TAB,     Q,    W,    E,    R,    T,    Y,    U,    I,   O,    P, LBRC, RBRC,       PGUP, \
+                       BSLS,    A,    S,    D,    F,    G,    H,    J,    K,   L, SCLN, QUOT,        ENT, PGDN, \
+                       LSFT,          Z,    X,    C,    V,    B,    N,    M, COMM, DOT, SLSH, RSFT,   UP,  END, \
+                       LCTL, LGUI, LALT,        SPC,                               INS,  DEL, LEFT, DOWN, RGHT),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboards/handwired/retro_refit/readme.md b/keyboards/handwired/retro_refit/readme.md
new file mode 100644 (file)
index 0000000..9f10edf
--- /dev/null
@@ -0,0 +1,60 @@
+retro_refit keyboard firmware
+======================
+
+## Keyboard Info
+
+The retro refit keyboard used a Teensy to replace the original controller on a 386 "laptop".
+
+http://imgur.com/a/08Fyj
+
+This keyboard uses a KEYMAP macro that is a great example of using a non-standard row-column matrix. The keyboard in question had 11 rows and 8 columns, but the rows were not all horizontal, and the columns were not all vertical. For example, row 2 contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and"Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", "Left Alt", "Up Arrow", and "Down Arrow".
+
+The macro makes programming the keys easier and in a more straight-forward manner because it realigns the keys into a 6x15 sensible keyboard layout instead of the obtuse 11x8 matrix. Each Kxy corrisponds to a key in row x column y.
+
+```
+#define KEYMAP( \
+       K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
+       K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
+       K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45,      K97, \
+       K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30,      K44, K87, \
+       K26,      K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
+       K10, K06, K25,                K07,                K86, K85, K95, K90, K93  \
+) { \
+{      KC_##K00,       KC_##K01,       KC_##K02,       KC_##K03,       KC_##K04,       KC_##K05,       KC_##K06,       KC_##K07,       }, \
+{      KC_##K10,       KC_##K11,       KC_##K12,       KC_##K13,       KC_##K14,       KC_##K15,       KC_##K16,       KC_##K17,       }, \
+{      KC_##K20,       KC_##K21,       KC_##K22,       KC_##K23,       KC_##K24,       KC_##K25,       KC_##K26,       KC_##K27,       }, \
+{      KC_##K30,       KC_##K31,       KC_##K32,       KC_##K33,       KC_##K34,       KC_##K35,       KC_##K36,       KC_##K37,       }, \
+{      KC_##K40,       KC_##K41,       KC_##K42,       KC_##K43,       KC_##K44,       KC_##K45,       KC_##K46,       KC_##K47,       }, \
+{      KC_##K50,       KC_##K51,       KC_##K52,       KC_##K53,       KC_##K54,       KC_##K55,       KC_##K56,       KC_##K57,       }, \
+{      KC_##K60,       KC_##K61,       KC_##K62,       KC_##K63,       KC_##K64,       KC_##K65,       KC_##K66,       KC_##K67,       }, \
+{      KC_##K70,       KC_##K71,       KC_##K72,       KC_##K73,       KC_##K74,       KC_##K75,       KC_##K76,       KC_##K77,       }, \
+{      KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_##K85,       KC_##K86,       KC_##K87,       }, \
+{      KC_##K90,       KC_##K91,       KC_NO,          KC_##K93,       KC_##K94,       KC_##K95,       KC_NO,          KC_##K97,       }, \
+{      KC_##KA0,       KC_##KA1,       KC_##KA2,       KC_##KA3,       KC_##KA4,       KC_##KA5,       KC_##KA6,       KC_##KA7,       }  \
+}
+```
+
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme.md](/readme.md).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/retro_refit folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
+
+Depending on which keymap you would like to use, you will have to compile slightly differently.
+
+### Default
+To build with the default keymap, simply run `make default`.
+
+### Other Keymaps
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
+
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
+```
+$ make [default|jack|<name>]
+```
+
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
\ No newline at end of file
diff --git a/keyboards/handwired/retro_refit/retro_refit.c b/keyboards/handwired/retro_refit/retro_refit.c
new file mode 100644 (file)
index 0000000..3d610eb
--- /dev/null
@@ -0,0 +1,47 @@
+#include "retro_refit.h"
+#include "led.h"
+
+void matrix_init_kb(void) {
+    // put your keyboard start-up code here
+    // runs once when the firmware starts up
+
+    // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
+    DDRD |= (1<<6);
+    PORTD |= (1<<6);
+
+    matrix_init_user();
+};
+
+void led_set_kb(uint8_t usb_led) {
+    // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+
+    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+        // output low
+        DDRD |= (1<<0);
+        PORTD &= ~(1<<0);
+    } else {
+        // Hi-Z
+        DDRD &= ~(1<<0);
+        PORTD &= ~(1<<0);
+    }
+    if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+        // output low
+        DDRD |= (1<<1);
+        PORTD &= ~(1<<1);
+    } else {
+        // Hi-Z
+        DDRD &= ~(1<<1);
+        PORTD &= ~(1<<1);
+    }
+    if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+        // output low
+        DDRC |= (1<<6);
+        PORTC &= ~(1<<6);
+    } else {
+        // Hi-Z
+        DDRC &= ~(1<<6);
+        PORTC &= ~(1<<6);
+    }
+
+    led_set_user(usb_led);
+};
\ No newline at end of file
diff --git a/keyboards/handwired/retro_refit/retro_refit.h b/keyboards/handwired/retro_refit/retro_refit.h
new file mode 100644 (file)
index 0000000..109acdc
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef RETRO_REFIT_H
+#define RETRO_REFIT_H
+
+#include "quantum.h"
+
+// This macro is an example of using a non-standard row-column matrix. The 
+// keyboard in question had 11 rows and 8 columns, but the rows were not all 
+// horizontal, and the columns were not all vertical. For example, row 2 
+// contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and
+// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", 
+// "Left Alt", "Up Arrow", and "Down Arrow".
+//
+// The macro makes programming the keys easier and in a more straight-forward
+// manner because it realigns the keys into a 6x15 sensible keyboard layout 
+// instead of the obtuse 11x8 matrix.
+
+#define KEYMAP( \
+       K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
+       K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
+       K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45,      K97, \
+       K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30,      K44, K87, \
+       K26,      K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
+       K10, K06, K25,                K07,                K86, K85, K95, K90, K93  \
+) { \
+{      KC_##K00,       KC_##K01,       KC_##K02,       KC_##K03,       KC_##K04,       KC_##K05,       KC_##K06,       KC_##K07,       }, \
+{      KC_##K10,       KC_##K11,       KC_##K12,       KC_##K13,       KC_##K14,       KC_##K15,       KC_##K16,       KC_##K17,       }, \
+{      KC_##K20,       KC_##K21,       KC_##K22,       KC_##K23,       KC_##K24,       KC_##K25,       KC_##K26,       KC_##K27,       }, \
+{      KC_##K30,       KC_##K31,       KC_##K32,       KC_##K33,       KC_##K34,       KC_##K35,       KC_##K36,       KC_##K37,       }, \
+{      KC_##K40,       KC_##K41,       KC_##K42,       KC_##K43,       KC_##K44,       KC_##K45,       KC_##K46,       KC_##K47,       }, \
+{      KC_##K50,       KC_##K51,       KC_##K52,       KC_##K53,       KC_##K54,       KC_##K55,       KC_##K56,       KC_##K57,       }, \
+{      KC_##K60,       KC_##K61,       KC_##K62,       KC_##K63,       KC_##K64,       KC_##K65,       KC_##K66,       KC_##K67,       }, \
+{      KC_##K70,       KC_##K71,       KC_##K72,       KC_##K73,       KC_##K74,       KC_##K75,       KC_##K76,       KC_##K77,       }, \
+{      KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_##K85,       KC_##K86,       KC_##K87,       }, \
+{      KC_##K90,       KC_##K91,       KC_NO,          KC_##K93,       KC_##K94,       KC_##K95,       KC_NO,          KC_##K97,       }, \
+{      KC_##KA0,       KC_##KA1,       KC_##KA2,       KC_##KA3,       KC_##KA4,       KC_##KA5,       KC_##KA6,       KC_##KA7,       } \
+}
+
+#endif
\ No newline at end of file
diff --git a/keyboards/handwired/retro_refit/rules.mk b/keyboards/handwired/retro_refit/rules.mk
new file mode 100644 (file)
index 0000000..10fbfa5
--- /dev/null
@@ -0,0 +1,68 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes          # Console for debug(+400)
+COMMAND_ENABLE ?= yes          # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES                   # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
diff --git a/keyboards/handwired/rules.mk b/keyboards/handwired/rules.mk
new file mode 100644 (file)
index 0000000..e69de29
index 12a4b71f4e13e2eebea753d346231d16b1572c9e..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,89 +1,3 @@
-
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-# for avr upload
-USB ?= /dev/cu.usbmodem1421
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-
-ifdef TEENSY2
-    OPT_DEFS += -DATREUS_TEENSY2
-    ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex
-else
-    OPT_DEFS += -DATREUS_ASTAR
-    OPT_DEFS += -DCATERINA_BOOTLOADER
-    ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
-                            avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
-endif
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# MCU name
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no        # Console for debug(+400)
-COMMAND_ENABLE ?= no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-RGBLIGHT_ENABLE = yes
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
-endif
-
-upload: build
-       $(ATREUS_UPLOAD_COMMAND)
-
+endif
\ No newline at end of file
diff --git a/keyboards/handwired/traveller/rules.mk b/keyboards/handwired/traveller/rules.mk
new file mode 100644 (file)
index 0000000..12a4b71
--- /dev/null
@@ -0,0 +1,89 @@
+
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+# for avr upload
+USB ?= /dev/cu.usbmodem1421
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+
+ifdef TEENSY2
+    OPT_DEFS += -DATREUS_TEENSY2
+    ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex
+else
+    OPT_DEFS += -DATREUS_ASTAR
+    OPT_DEFS += -DCATERINA_BOOTLOADER
+    ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
+                            avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
+endif
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# MCU name
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no        # Console for debug(+400)
+COMMAND_ENABLE ?= no        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
+RGBLIGHT_ENABLE = yes
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
+
+upload: build
+       $(ATREUS_UPLOAD_COMMAND)
+
index 6fe973e1ebb6892e542e618d4a3e783cf586664a..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,90 +1,3 @@
-
-
-# project specific files
-SRC = matrix.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-#OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# as per original hasu settings
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-CUSTOM_MATRIX    ?= yes # Custom matrix file for the HHKB
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-# NKRO_ENABLE ?= yes           # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
-# MIDI_ENABLE ?= YES           # MIDI controls
-# UNICODE_ENABLE ?= YES                # Unicode
-# BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-ifneq (, $(findstring yes, $(HHKB_JP)))
-       OPT_DEFS += -DHHKB_JP
-endif
-
-debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
-debug-on: all
-
-debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
-debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS))
-debug-off: all
+endif
\ No newline at end of file
diff --git a/keyboards/hhkb/keymaps/dbroqua/keymap.c b/keyboards/hhkb/keymaps/dbroqua/keymap.c
new file mode 100644 (file)
index 0000000..ef43aae
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * dbroqua HHKB Layout
+ */
+#include "hhkb.h"
+
+#define BASE 0
+#define FN 1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /* BASE Level: Default Layer
+     * ,-----------------------------------------------------------------------------------------.
+     * | Esc |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |  -  |  =  |  \  |  `  |
+     * |-----------------------------------------------------------------------------------------+
+     * | Tab    |  Q  |  W  |  E  |  R  |  T  |  Y  |  U  |  I  |  O  |  P  |  [  |  ]  |  Bksp  |
+     * |-----------------------------------------------------------------------------------------+
+     * | Ctrl    |  A  |  S  |  D  |  F  |  G  |  H  |  J  |  K  |  L  |  ;  |  '  |    Enter    |
+     * |-----------------------------------------------------------------------------------------+
+     * | Shift     |  Z  |  X  |  C  |  V  |  B  |  N  |  M  |  ,  |  .  |  /  |    Left   |Right|
+     * +-----------------------------------------------------------------------------------------+
+     *         | Gui |  Alt   |               Space               | AltGr |  fn |
+     *         `----------------------------------------------------------------´
+     */
+    [BASE] = KEYMAP(
+        KC_ESC,   KC_1,  KC_2,  KC_3,  KC_4,  KC_5,  KC_6,  KC_7,  KC_8,     KC_9,    KC_0,     KC_MINS,  KC_EQL,    KC_BSLS,  KC_GRV, \
+        KC_TAB,   KC_Q,  KC_W,  KC_E,  KC_R,  KC_T,  KC_Y,  KC_U,  KC_I,     KC_O,    KC_P,     KC_LBRC,  KC_RBRC,   KC_BSPC,          \
+        KC_LCTL,  KC_A,  KC_S,  KC_D,  KC_F,  KC_G,  KC_H,  KC_J,  KC_K,     KC_L,    KC_SCLN,  KC_QUOT,  KC_ENT,                      \
+        KC_LSFT,  KC_Z,  KC_X,  KC_C,  KC_V,  KC_B,  KC_N,  KC_M,  KC_COMM,  KC_DOT,  KC_SLSH,  KC_LEFT,  KC_RGHT,                    \
+                        KC_LGUI, KC_LALT,  /*        */ KC_SPC, KC_RALT, MO(FN)
+    ),
+
+    /* BASE Level: Default Layer
+     * ,-----------------------------------------------------------------------------------------.
+     * |     |  F1  | F2  | F3  | F4  | F5  | F6  | F7  | F8  | F9  | F0  | F11 | F12 | Ins | Del|
+     * |-----------------------------------------------------------------------------------------+
+     * | Caps   |     |     |     |     |     |     |     |     |     |     |  Up |     |        |
+     * |-----------------------------------------------------------------------------------------+
+     * |         | Vol-| Vol+| Mute|     |     |     |PrtSc| Home| PgUp| Left |Right|            |
+     * |-----------------------------------------------------------------------------------------+
+     * |           | Prev| Play| Next|     |     |     |     | End |PgDwn| Down|    Up     | Down|
+     * +-----------------------------------------------------------------------------------------+
+     *         |     |        |                                   |       |     |
+     *         `----------------------------------------------------------------´
+     */
+    [FN] = KEYMAP(
+        KC_TRNS,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_INS,   KC_DEL, \
+        KC_CAPS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_UP,    KC_TRNS,  KC_TRNS,          \
+        KC_TRNS,  KC_VOLD,  KC_VOLU,  KC_MUTE,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PSCR,  KC_HOME,  KC_PGUP,  KC_LEFT,  KC_RGHT,  KC_TRNS,                    \
+        KC_TRNS,  KC_MPRV,  KC_MPLY,  KC_MNXT,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_END,   KC_PGDN,  KC_DOWN,  KC_UP,  KC_DOWN,                    \
+                        KC_TRNS, KC_TRNS,           KC_TRNS,                KC_TRNS, KC_TRNS
+    )
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
diff --git a/keyboards/hhkb/keymaps/dbroqua/readme.md b/keyboards/hhkb/keymaps/dbroqua/readme.md
new file mode 100644 (file)
index 0000000..0afebc8
--- /dev/null
@@ -0,0 +1,9 @@
+# Dbroqua Layout
+
+* Online keyboard layout editor: http://www.keyboard-layout-editor.com/#/gists/78eaf35e80bb714eea80cb4049dedb01
+
+# Programming Instructions:
+Enter into programming mode and run the following command.
+```
+$ sudo KEYMAP=dbroqua make dfu
+```
\ No newline at end of file
index 92986292a233dd6403c6b2f242237021cbbd50fa..a7f700f019c2f3312dc7ca3e58b7bc18cc1f90a9 100644 (file)
@@ -1 +1 @@
-HHKB_JP=yes
+OPT_DEFS += -DHHKB_JP
index 92986292a233dd6403c6b2f242237021cbbd50fa..a7f700f019c2f3312dc7ca3e58b7bc18cc1f90a9 100644 (file)
@@ -1 +1 @@
-HHKB_JP=yes
+OPT_DEFS += -DHHKB_JP
index 39d49b32a1766312c361e1cbdbf7cf77300ff93e..367c0a08f7e51b866594ad3d7608f31f46bfe34a 100644 (file)
@@ -168,13 +168,15 @@ Download or clone the whole firmware and navigate to the keyboards/planck folder
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
+
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/hhkb/rules.mk b/keyboards/hhkb/rules.mk
new file mode 100644 (file)
index 0000000..a46271f
--- /dev/null
@@ -0,0 +1,80 @@
+
+
+# project specific files
+SRC = matrix.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+#OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# as per original hasu settings
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes  # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes  # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes   # Console for debug(+400)
+COMMAND_ENABLE ?= yes   # Commands for debug and configuration
+CUSTOM_MATRIX ?= yes    # Custom matrix file for the HHKB
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+# NKRO_ENABLE ?= yes       # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= yes       # MIDI controls
+# UNICODE_ENABLE ?= yes    # Unicode
+# BLUETOOTH_ENABLE ?= yes  # Enable Bluetooth with the Adafruit EZ-Key HID
+
+debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
+debug-on: all
+
+debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
+debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS))
+debug-off: all
diff --git a/keyboards/infinity60/MEMO.txt b/keyboards/infinity60/MEMO.txt
new file mode 100644 (file)
index 0000000..e2886aa
--- /dev/null
@@ -0,0 +1,385 @@
+flabbergast's TMK/ChibiOS port
+==============================
+2015/10/16
+
+
+Build
+-----
+$ git clone -b chibios https://github.com/flabbergast/tmk_keyboard.git
+
+$ cd tmk_keyboard
+$ git submodule add -f -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
+or
+$ cd tmk_keyboard/tmk_core/tool/chibios
+$ git clone -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
+
+$ cd tmk_keyboard/keyboard/infinity_chibios
+$ make
+
+
+
+
+Chibios Configuration
+---------------------
+halconf.h: for HAL configuration
+    placed in project directory
+    read in chibios/os/hal/hal.mk
+    included in chibios/os/hal/include/hal.h
+mcuconf.h: for MCU configuration
+    placed in project directory
+    included in halconf.h
+
+
+Chibios Term
+------------
+PAL = Port Abstraction Layer
+    palWritePad
+    palReadPad
+    palSetPad
+    chibios/os/hal/include/pal.h
+
+LLD = Low Level Driver
+
+
+Makefile
+--------
+    #   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+    MCU_FAMILY = KINETIS
+    MCU_SERIES = KL2x
+
+    # - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+    #   or <this_dir>/ld/
+    MCU_LDSCRIPT = MKL26Z64
+
+    #  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+    MCU_STARTUP = kl2x
+
+    # Board: it should exist either in <chibios>/os/hal/boards/
+    #  or <this_dir>/boards
+    BOARD = PJRC_TEENSY_LC
+
+    MCU  = cortex-m0
+
+    # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+    ARMV = 6
+
+
+halconf.h
+---------
+
+
+mcuconf.h
+---------
+
+
+chconf.h
+--------
+
+
+ld script
+---------
+--- ../../tmk_core/tool/chibios/chibios/os/common/ports/ARMCMx/compilers/GCC/ld/MKL26Z64.ld     2015-10-15 09:08:58.732904304 +0900
++++ ld/MKL26Z64.ld      2015-10-15 08:48:06.430215496 +0900
+@@ -27,7 +27,8 @@
+ {
+   flash0   :  org = 0x00000000,  len = 0xc0
+   flashcfg :  org = 0x00000400,  len = 0x10
+-  flash    :  org = 0x00000410,  len = 64k - 0x410
++  flash    :  org = 0x00000410,  len = 62k - 0x410
++  eeprom_emu : org = 0x0000F800, len = 2k
+   ram      :  org = 0x1FFFF800,  len = 8k
+ }
+
+@@ -35,6 +36,10 @@
+ __ram_size__            = LENGTH(ram);
+ __ram_end__             = __ram_start__ + __ram_size__;
+
++__eeprom_workarea_start__ = ORIGIN(eeprom_emu);
++__eeprom_workarea_size__  = LENGTH(eeprom_emu);
++__eeprom_workarea_end__   = __eeprom_workarea_start__ + __eeprom_workarea_size__;
++
+ SECTIONS
+ {
+   . = 0;
+
+
+
+Configuration/Startup for Infinity 60%
+--------------------------------------
+Configuration:
+
+
+Clock:
+Inifinity   
+    FEI(FLL Engaged Internal) mode with core clock:48MHz, bus clock:48MHz, flash clock:24MHz
+    Clock dividor:
+    SIM_CLKDIV1[OUTDIV1] = 0 divide-by-1 for core clock
+    SIM_CLKDIV1[OUTDIV2] = 0 divide-by-1 for bus clock
+    SIM_CLKDIV1[OUTDIV4] = 1 divide-by-2 for flash clock
+    Internal reference clock:
+    MCG_C1[IREFS] = 1 Internal Reference Select for clock source for FLL
+    MCG_C1[IRCLKEN] = 1 Internal Reference Clock Enable
+    FLL multipilication:
+    MCG_C4[DMX32] = 1
+    MCG_C4[DRST_DRS] = 01   FLL factor 1464 * 32.768kHz = 48MHz
+
+chibios/os/hal/ports/KINETIS/K20x/hal_lld.c
+    k20x_clock_init(): called in __early_init() defined in board.c
+        disable watchdog and configure clock
+
+        configurable macros:
+        KINETIS_NO_INIT: whether init or not
+        KINETIS_MCG_MODE: clock mode   
+            KINETIS_MCG_MODE_FEI
+            KINETIS_MCG_MODE_PEE
+                hal/ports/KINETIS/K20x/hal_lld.h
+            
+
+chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.h
+    PALConfig pal_default_config
+    boardInit()
+    __early_init()
+    macro definitions for board infos, freq and mcu type
+
+chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.c
+
+USB
+
+
+Startup
+-------
+    common/ports/ARMCMx/GCC/crt0_v[67]m.s
+        Reset_Handler: startup code
+    common/ports/ARMCMx/GCC/crt1.c
+        __core_init(): weak
+        __early_init(): weak
+        __late_init(): weak
+        __default_exit(): weak
+            called from Reset_Handler of crt0
+    common/ports/ARMCMx/GCC/vector.c
+    common/ports/ARMCMx/GCC/ld/*.ld
+
+chibios/os/common/ports/ARMCMx/compilers/GCC/
+├── crt0_v6m.s
+├── crt0_v7m.s
+├── crt1.c
+├── ld
+│   ├── MK20DX128BLDR3.ld
+│   ├── MK20DX128BLDR4.ld
+│   ├── MK20DX128.ld
+│   ├── MK20DX256.ld
+│   ├── MKL25Z128.ld
+│   ├── MKL26Z128.ld
+│   ├── MKL26Z64.ld
+│   └── STM32L476xG.ld
+├── mk
+│   ├── startup_k20x5.mk
+│   ├── startup_k20x7.mk
+│   ├── startup_k20x.mk
+│   ├── startup_kl2x.mk
+│   └── startup_stm32l4xx.mk
+├── rules.ld
+├── rules.mk
+└── vectors.c
+
+chibios/os/hal/
+├── boards
+│   ├── FREESCALE_FREEDOM_K20D50M
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── MCHCK_K20
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── PJRC_TEENSY_3
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── PJRC_TEENSY_3_1
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── PJRC_TEENSY_LC
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── readme.txt
+│   ├── simulator
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   └── board.mk
+│   ├── ST_NUCLEO_F030R8
+│   │   ├── board.c
+│   │   ├── board.h
+│   │   ├── board.mk
+│   │   └── cfg
+│   │       └── board.chcfg
+├── hal.mk
+├── include
+│   ├── adc.h
+│   ├── can.h
+│   ├── dac.h
+│   ├── ext.h
+│   ├── gpt.h
+│   ├── hal_channels.h
+│   ├── hal_files.h
+│   ├── hal.h
+│   ├── hal_ioblock.h
+│   ├── hal_mmcsd.h
+│   ├── hal_queues.h
+│   ├── hal_streams.h
+│   ├── i2c.h
+│   ├── i2s.h
+│   ├── icu.h
+│   ├── mac.h
+│   ├── mii.h
+│   ├── mmc_spi.h
+│   ├── pal.h
+│   ├── pwm.h
+│   ├── rtc.h
+│   ├── sdc.h
+│   ├── serial.h
+│   ├── serial_usb.h
+│   ├── spi.h
+│   ├── st.h
+│   ├── uart.h
+│   └── usb.h
+├── lib
+│   └── streams
+│       ├── chprintf.c
+│       ├── chprintf.h
+│       ├── memstreams.c
+│       ├── memstreams.h
+│       ├── nullstreams.c
+│       └── nullstreams.h
+├── osal
+│   ├── nil
+│   │   ├── osal.c
+│   │   ├── osal.h
+│   │   └── osal.mk
+│   ├── os-less
+│   │   └── ARMCMx
+│   │       ├── osal.c
+│   │       ├── osal.h
+│   │       └── osal.mk
+│   └── rt
+│       ├── osal.c
+│       ├── osal.h
+│       └── osal.mk
+├── ports
+│   ├── AVR
+│   ├── common
+│   │   └── ARMCMx
+│   │       ├── mpu.h
+│   │       ├── nvic.c
+│   │       └── nvic.h
+│   ├── KINETIS
+│   │   ├── K20x
+│   │   │   ├── hal_lld.c
+│   │   │   ├── hal_lld.h
+│   │   │   ├── kinetis_registry.h
+│   │   │   ├── platform.dox
+│   │   │   ├── platform.mk
+│   │   │   ├── pwm_lld.c
+│   │   │   ├── pwm_lld.h
+│   │   │   ├── spi_lld.c
+│   │   │   └── spi_lld.h
+│   │   ├── KL2x
+│   │   │   ├── hal_lld.c
+│   │   │   ├── hal_lld.h
+│   │   │   ├── kinetis_registry.h
+│   │   │   ├── platform.mk
+│   │   │   ├── pwm_lld.c
+│   │   │   └── pwm_lld.h
+│   │   ├── LLD
+│   │   │   ├── adc_lld.c
+│   │   │   ├── adc_lld.h
+│   │   │   ├── ext_lld.c
+│   │   │   ├── ext_lld.h
+│   │   │   ├── gpt_lld.c
+│   │   │   ├── gpt_lld.h
+│   │   │   ├── i2c_lld.c
+│   │   │   ├── i2c_lld.h
+│   │   │   ├── pal_lld.c
+│   │   │   ├── pal_lld.h
+│   │   │   ├── serial_lld.c
+│   │   │   ├── serial_lld.h
+│   │   │   ├── st_lld.c
+│   │   │   ├── st_lld.h
+│   │   │   ├── usb_lld.c
+│   │   │   └── usb_lld.h
+│   │   └── README.md
+│   ├── LPC
+│   ├── simulator
+│   └── STM32
+├── src
+│   ├── adc.c
+│   ├── can.c
+│   ├── dac.c
+│   ├── ext.c
+│   ├── gpt.c
+│   ├── hal.c
+│   ├── hal_mmcsd.c
+│   ├── hal_queues.c
+│   ├── i2c.c
+│   ├── i2s.c
+│   ├── icu.c
+│   ├── mac.c
+│   ├── mmc_spi.c
+│   ├── pal.c
+│   ├── pwm.c
+│   ├── rtc.c
+│   ├── sdc.c
+│   ├── serial.c
+│   ├── serial_usb.c
+│   ├── spi.c
+│   ├── st.c
+│   ├── uart.c
+│   └── usb.c
+└── templates
+    ├── adc_lld.c
+    ├── adc_lld.h
+    ├── can_lld.c
+    ├── can_lld.h
+    ├── dac_lld.c
+    ├── dac_lld.h
+    ├── ext_lld.c
+    ├── ext_lld.h
+    ├── gpt_lld.c
+    ├── gpt_lld.h
+    ├── halconf.h
+    ├── hal_lld.c
+    ├── hal_lld.h
+    ├── i2c_lld.c
+    ├── i2c_lld.h
+    ├── i2s_lld.c
+    ├── i2s_lld.h
+    ├── icu_lld.c
+    ├── icu_lld.h
+    ├── mac_lld.c
+    ├── mac_lld.h
+    ├── mcuconf.h
+    ├── osal
+    │   ├── osal.c
+    │   ├── osal.h
+    │   └── osal.mk
+    ├── pal_lld.c
+    ├── pal_lld.h
+    ├── platform.mk
+    ├── pwm_lld.c
+    ├── pwm_lld.h
+    ├── rtc_lld.c
+    ├── rtc_lld.h
+    ├── sdc_lld.c
+    ├── sdc_lld.h
+    ├── serial_lld.c
+    ├── serial_lld.h
+    ├── spi_lld.c
+    ├── spi_lld.h
+    ├── st_lld.c
+    ├── st_lld.h
+    ├── uart_lld.c
+    ├── uart_lld.h
+    ├── usb_lld.c
+    └── usb_lld.h
diff --git a/keyboards/infinity60/Makefile b/keyboards/infinity60/Makefile
new file mode 100644 (file)
index 0000000..4e2a6f0
--- /dev/null
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+       include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/infinity60/bootloader_defs.h b/keyboards/infinity60/bootloader_defs.h
new file mode 100644 (file)
index 0000000..c67153b
--- /dev/null
@@ -0,0 +1 @@
+#define KIIBOHD_BOOTLOADER
diff --git a/keyboards/infinity60/chconf.h b/keyboards/infinity60/chconf.h
new file mode 100644 (file)
index 0000000..43c8457
--- /dev/null
@@ -0,0 +1,524 @@
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    templates/chconf.h
+ * @brief   Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ *          contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   System time counter resolution.
+ * @note    Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION                32
+
+/**
+ * @brief   System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ *          setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY                 1000
+
+/**
+ * @brief   Time delta constant for the tick-less mode.
+ * @note    If this value is zero then the system uses the classic
+ *          periodic tick. This value represents the minimum number
+ *          of ticks that is safe to specify in a timeout directive.
+ *          The value one is not valid, timeouts are rounded up to
+ *          this value.
+ */
+#define CH_CFG_ST_TIMEDELTA                 0
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ *          threads before preemption occurs. Setting this value to zero
+ *          disables the preemption for threads with equal priority and the
+ *          round robin becomes cooperative. Note that higher priority
+ *          threads can still preempt, the kernel is always preemptive.
+ * @note    Disabling the round robin preemption makes the kernel more compact
+ *          and generally faster.
+ * @note    The round robin preemption is not supported in tickless mode and
+ *          must be set to zero in that case.
+ */
+#define CH_CFG_TIME_QUANTUM                 20
+
+/**
+ * @brief   Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ *          then the whole available RAM is used. The core memory is made
+ *          available to the heap allocator and/or can be used directly through
+ *          the simplified core memory allocator.
+ *
+ * @note    In order to let the OS manage the whole RAM the linker script must
+ *          provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note    Requires @p CH_CFG_USE_MEMCORE.
+ */
+#define CH_CFG_MEMCORE_SIZE                 0
+
+/**
+ * @brief   Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ *          does not spawn the idle thread. The application @p main()
+ *          function becomes the idle thread and must implement an
+ *          infinite loop.
+ */
+#define CH_CFG_NO_IDLE_THREAD               FALSE
+
+/* Use __WFI in the idle thread for waiting. Does lower the power
+ * consumption. */
+#define CORTEX_ENABLE_WFI_IDLE              TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ *          is used when two possible implementations exist.
+ *
+ * @note    This is not related to the compiler optimization options.
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_OPTIMIZE_SPEED               TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_TM                       FALSE
+
+/**
+ * @brief   Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY                 TRUE
+
+/**
+ * @brief   Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT                 TRUE
+
+/**
+ * @brief   Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES               TRUE
+
+/**
+ * @brief   Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ *          priority rather than in FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE
+
+/**
+ * @brief   Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES                  TRUE
+
+/**
+ * @brief   Enables recursive behavior on mutexes.
+ * @note    Recursive mutexes are heavier and have an increased
+ *          memory footprint.
+ *
+ * @note    The default is @p FALSE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE
+
+/**
+ * @brief   Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#define CH_CFG_USE_CONDVARS                 TRUE
+
+/**
+ * @brief   Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ *          specification are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_CONDVARS.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT         TRUE
+
+/**
+ * @brief   Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS                   TRUE
+
+/**
+ * @brief   Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ *          are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_EVENTS.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE
+
+/**
+ * @brief   Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES                 TRUE
+
+/**
+ * @brief   Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ *          FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_MESSAGES.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE
+
+/**
+ * @brief   Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ *          included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#define CH_CFG_USE_MAILBOXES                TRUE
+
+/**
+ * @brief   Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MEMCORE                  TRUE
+
+/**
+ * @brief   Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ *          @p CH_CFG_USE_SEMAPHORES.
+ * @note    Mutexes are recommended.
+ */
+#define CH_CFG_USE_HEAP                     TRUE
+
+/**
+ * @brief   Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#define CH_CFG_USE_MEMPOOLS                 TRUE
+
+/**
+ * @brief   Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_WAITEXIT.
+ * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#define CH_CFG_USE_DYNAMIC                  TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Debug option, kernel statistics.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS                   FALSE
+
+/**
+ * @brief   Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ *          at runtime.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK           FALSE
+
+/**
+ * @brief   Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ *          parameters are activated.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_ENABLE_CHECKS                FALSE
+
+/**
+ * @brief   Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ *          activated. This includes consistency checks inside the kernel,
+ *          runtime anomalies and port-defined checks.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_ENABLE_ASSERTS               FALSE
+
+/**
+ * @brief   Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @brief   Trace buffer entries.
+ * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ *          different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE            128
+
+/**
+ * @brief   Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note    The default is @p FALSE.
+ * @note    The stack check is performed in a architecture/port dependent way.
+ *          It may not be implemented or some ports.
+ * @note    The default failure mode is to halt the system with the global
+ *          @p panic_msg variable set to @p NULL.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK           FALSE
+
+/**
+ * @brief   Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ *          value when a thread is created. This can be useful for the
+ *          runtime measurement of the used stack.
+ *
+ * @note    The default is @p FALSE.
+ */
+#define CH_DBG_FILL_THREADS                 FALSE
+
+/**
+ * @brief   Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ *          counts the system ticks occurred while executing the thread.
+ *
+ * @note    The default is @p FALSE.
+ * @note    This debug option is not currently compatible with the
+ *          tickless mode.
+ */
+#define CH_DBG_THREADS_PROFILING            FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS                                          \
+  /* Add threads custom fields here.*/
+
+/**
+ * @brief   Threads initialization hook.
+ * @details User initialization code added to the @p chThdInit() API.
+ *
+ * @note    It is invoked from within @p chThdInit() and implicitly from all
+ *          the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \
+  /* Add threads initialization code here.*/                                \
+}
+
+/**
+ * @brief   Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \
+  /* Add threads finalization code here.*/                                  \
+}
+
+/**
+ * @brief   Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \
+  /* Context switch code here.*/                                            \
+}
+
+/**
+ * @brief   ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \
+  /* IRQ prologue code here.*/                                              \
+}
+
+/**
+ * @brief   ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \
+  /* IRQ epilogue code here.*/                                              \
+}
+
+/**
+ * @brief   Idle thread enter hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() {                                          \
+  /* Idle-enter code here.*/                                                \
+}
+
+/**
+ * @brief   Idle thread leave hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \
+  /* Idle-leave code here.*/                                                \
+}
+
+/**
+ * @brief   Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() {                                           \
+  /* Idle loop code here.*/                                                 \
+}
+
+/**
+ * @brief   System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ *          after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \
+  /* System tick event code here.*/                                         \
+}
+
+/**
+ * @brief   System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ *          the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \
+  /* System halt code here.*/                                               \
+}
+
+/**
+ * @brief   Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ *          trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) {                                            \
+  /* Trace code here.*/                                                     \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h).    */
+/*===========================================================================*/
+
+#endif  /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/infinity60/config.h b/keyboards/infinity60/config.h
new file mode 100644 (file)
index 0000000..f8346fe
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+Copyright 2015 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#define PREVENT_STUCK_MODIFIERS
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6464
+#define DEVICE_VER      0x0001
+/* in python2: list(u"whatever".encode('utf-16-le')) */
+/*   at most 32 characters or the ugly hack in usb_main.c borks */
+#define MANUFACTURER "Input Club"
+#define USBSTR_MANUFACTURER    'I', '\x00', 'n', '\x00', 'p', '\x00', 'u', '\x00', 't', '\x00', ' ', '\x00', 'C', '\x00', 'l', '\x00', 'u', '\x00', 'b', '\x00'
+#define PRODUCT "Infinity keyboard/QMK"
+#define USBSTR_PRODUCT         'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00'
+/* key matrix size */
+#define MATRIX_ROWS 9
+#define MATRIX_COLS 7
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE    5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+//#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+//#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* Keymap for Infinity prototype */
+//#define INFINITY_PROTOTYPE
+
+/* Keymap for Infinity 1.1a (first revision with LED support) */
+//#define INFINITY_LED
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/infinity60/halconf.h b/keyboards/infinity60/halconf.h
new file mode 100644 (file)
index 0000000..46b37a4
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    templates/halconf.h
+ * @brief   HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ *          various device drivers from your application. You may also use
+ *          this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef _HALCONF_H_
+#define _HALCONF_H_
+
+#include "mcuconf.h"
+
+/**
+ * @brief   Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL                 TRUE
+#endif
+
+/**
+ * @brief   Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN                 FALSE
+#endif
+
+/**
+ * @brief   Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT                 FALSE
+#endif
+
+/**
+ * @brief   Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT                 FALSE
+#endif
+
+/**
+ * @brief   Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C                 FALSE
+#endif
+
+/**
+ * @brief   Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S                 FALSE
+#endif
+
+/**
+ * @brief   Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU                 FALSE
+#endif
+
+/**
+ * @brief   Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI             FALSE
+#endif
+
+/**
+ * @brief   Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM                 FALSE
+#endif
+
+/**
+ * @brief   Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC                 FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL              FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB          TRUE
+#endif
+
+/**
+ * @brief   Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI                 FALSE
+#endif
+
+/**
+ * @brief   Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART                FALSE
+#endif
+
+/**
+ * @brief   Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB                 TRUE
+#endif
+
+/**
+ * @brief   Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG                 FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT                TRUE
+#endif
+
+/**
+ * @brief   Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE          TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY           FALSE
+#endif
+
+/**
+ * @brief   Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS              TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings.                                          */
+/*===========================================================================*/
+
+/**
+ * @brief   Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ *          routines releasing some extra CPU time for the threads with
+ *          lower priority, this may slow down the driver a bit however.
+ *          This option is recommended also if the SPI driver does not
+ *          use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING            TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Number of initialization attempts before rejecting the card.
+ * @note    Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY              100
+#endif
+
+/**
+ * @brief   Include support for MMC cards.
+ * @note    MMC support is not yet implemented so this option must be kept
+ *          at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT             FALSE
+#endif
+
+/**
+ * @brief   Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ *          routines releasing some extra CPU time for the threads with
+ *          lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING            TRUE
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings.                                           */
+/*===========================================================================*/
+
+/**
+ * @brief   Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ *          default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE      38400
+#endif
+
+/**
+ * @brief   Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ *          buffers depending on the requirements of your application.
+ * @note    The default is 64 bytes for both the transmission and receive
+ *          buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE         16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting.                                        */
+/*===========================================================================*/
+
+/**
+ * @brief   Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ *          the USB data endpoint maximum packet size.
+ * @note    The default is 64 bytes for both the transmission and receive
+ *          buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE     256
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT                TRUE
+#endif
+
+/**
+ * @brief   Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT                TRUE
+#endif
+
+#endif /* _HALCONF_H_ */
+
+/** @} */
diff --git a/keyboards/infinity60/infinity60.c b/keyboards/infinity60/infinity60.c
new file mode 100644 (file)
index 0000000..e471250
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "infinity60.h"
diff --git a/keyboards/infinity60/infinity60.h b/keyboards/infinity60/infinity60.h
new file mode 100644 (file)
index 0000000..f1ba15e
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+Copyright 2014 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef KEYMAP_COMMON_H
+#define KEYMAP_COMMON_H
+
+#include "quantum.h"
+
+#ifdef INFINITY_PROTOTYPE
+
+/* Infinity prototype */
+#define KEYMAP( \
+    K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K86, \
+    K51, K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, \
+    K13, K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, \
+    K54, K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, \
+    K06, K16, K26,           K36,                K46, K56, K66, K76 \
+) { \
+    { K00, K01, K02, K03, K04, K05, K06 }, \
+    { K10, K11, K12, K13, K14, K15, K16 }, \
+    { K20, K21, K22, K23, K24, K25, K26 }, \
+    { K30, K31, K32, K33, K34, K35, K36 }, \
+    { K40, K41, K42, K43, K44, K45, K46 }, \
+    { K50, K51, K52, K53, K54, K55, K56 }, \
+    { K60, K61, K62, K63, K64, K65, K66 }, \
+    { K70, K71, K72, K73, K74, K75, K76 }, \
+    { K80, K81, K82, K83, K84, K85, K86 }  \
+}
+
+#else
+
+/* Infinity production */
+#define KEYMAP( \
+    K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, \
+    K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, \
+    K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, \
+    K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, K06, \
+    K16, K26, K36,           K46,                K56, K66, K76, K86 \
+) { \
+    { K00, K01, K02, K03, K04, K05, K06 }, \
+    { K10, K11, K12, K13, K14, K15, K16 }, \
+    { K20, K21, K22, K23, K24, K25, K26 }, \
+    { K30, K31, K32, K33, K34, K35, K36 }, \
+    { K40, K41, K42, K43, K44, K45, K46 }, \
+    { K50, K51, K52, K53, K54, K55, K56 }, \
+    { K60, K61, K62, K63, K64, K65, K66 }, \
+    { K70, K71, K72, K73, K74, K75, K76 }, \
+    { K80, K81, K82, K83, K84, K85, K86 }  \
+}
+
+#endif
+
+#endif
diff --git a/keyboards/infinity60/keymaps/default/keymap.c b/keyboards/infinity60/keymaps/default/keymap.c
new file mode 100644 (file)
index 0000000..4434128
--- /dev/null
@@ -0,0 +1,48 @@
+#include "infinity60.h"
+
+const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /* Layer 0: Default Layer
+     * ,-----------------------------------------------------------.
+     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  `|BSp|
+     * |-----------------------------------------------------------|
+     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
+     * |-----------------------------------------------------------|
+     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
+     * |-----------------------------------------------------------|
+     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn0|
+     * |-----------------------------------------------------------'
+     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
+     * `-----------------------------------------------------------'
+     */
+    [0] = KEYMAP(
+      KC_ESC, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSLS, KC_GRV, \
+      KC_TAB, KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC,KC_RBRC,KC_BSPC, \
+      KC_LCTL,KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,KC_ENT,  \
+      KC_LSFT,KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,MO(1), \
+      KC_NO,  KC_LGUI,KC_LALT,          KC_SPC,                KC_RALT,KC_RGUI,KC_NO, KC_NO),
+
+    /* Layer 1: HHKB mode (HHKB Fn)
+     * ,-----------------------------------------------------------.
+     * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+     * |-----------------------------------------------------------|
+     * |Caps |   |   |   |   |   |   |   |Psc|Slk|Pus|Up |   |Backs|
+     * |-----------------------------------------------------------|
+     * |      |VoD|VoU|Mut|   |   |  *|  /|Hom|PgU|Lef|Rig|Enter   |
+     * |-----------------------------------------------------------|
+     * |        |   |   |   |   |   |  +|  -|End|PgD|Dow|      |   |
+     * `-----------------------------------------------------------'
+     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
+     * `-----------------------------------------------------------'
+     */ 
+    [1] = KEYMAP(
+      KC_PWR, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,   \
+      KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,      \
+      KC_TRNS,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_PENT,            \
+      KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_TRNS,KC_TRNS,            \
+      KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,               KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
+};
+
+const uint16_t fn_actions[] = {
+    
+};
+
diff --git a/keyboards/infinity60/keymaps/depariel/keymap.c b/keyboards/infinity60/keymaps/depariel/keymap.c
new file mode 100755 (executable)
index 0000000..7412b9b
--- /dev/null
@@ -0,0 +1,82 @@
+#include "infinity60.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /* Layer 0: Default Layer
+     * ,-----------------------------------------------------------.
+     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  \|  `|
+     * |-----------------------------------------------------------|
+     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]| Bksp|
+     * |-----------------------------------------------------------|
+     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
+     * |-----------------------------------------------------------|
+     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn2|
+     * |-----------------------------------------------------------'
+     * |Fn2 |Gui |Alt |         Space           |RAlt|Prv|PlPs|Next|
+     * `-----------------------------------------------------------'
+     */
+    [0] = KEYMAP(
+        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,            KC_BSLS,  KC_GRV, \
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,           KC_BSPC, \
+        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, LT(5, KC_ENT),  \
+        KC_LSPO, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSPC, MO(4), \
+        MO(4),   KC_LGUI, KC_LALT,               LT(3, KC_SPC),                 KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
+
+    /* Layer 1: "Toggle" off SpaceFn for League of Legends
+     */
+    [1] = KEYMAP(
+        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS,  KC_GRV, \
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, \
+        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  \
+        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, MO(4), \
+        MO(4),   KC_LGUI, KC_LALT,                   KC_SPC,                    KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
+           
+    /* Layer 2: "Toggle" off SpaceFn for MapleRoyals
+     */
+    [2] = KEYMAP(
+        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS,  KC_GRV, \
+        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, \
+        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  \
+        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_UP,   KC_LSFT, \
+        MO(4),   KC_LGUI, KC_LALT,                   KC_SPC,                    KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
+
+    /* Layer 3: FN layer 1
+     */ 
+    [3] = KEYMAP(
+        KC_NO,           KC_F1,   KC_F2,   KC_F3,   KC_F4,          KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,   \
+        KC_NO,           KC_BTN1, KC_MS_U, KC_BTN2, LALT(KC_F4),    KC_HOME, KC_PGUP, KC_PSCR, KC_SLCK, KC_UP,   KC_NO,   KC_LPRN, KC_RPRN, KC_DEL,      \
+        MO(6),           KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,          KC_END,  KC_PGDN, KC_TILD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,           \
+        LGUI(KC_SPC),    KC_NO,   KC_NO,   KC_NO,   KC_NO,          KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_CALC, KC_MENU, KC_TRNS, TG(4),           \
+        KC_TRNS,         KC_TRNS, KC_TRNS,                       LT(3, KC_SPC),                KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU),
+    
+    /* Layer 4: FN layer 2
+     */ 
+    [4] = KEYMAP(
+        KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_PMNS, KC_PPLS, KC_PSLS, TG(2),   \
+        KC_CAPS, KC_NO,   KC_UP,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_PSCR, KC_NO,   KC_P7,   KC_P8,   KC_P9,   KC_PAST, KC_BSPC,      \
+        KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PENT,           \
+        KC_LSFT, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_RSFT, MO(4),           \
+        KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_P0,   KC_PDOT, KC_NO,   TG(1)),
+    
+    /* Layer 5: FN layer 3
+     */ 
+    [5] = KEYMAP(
+        KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,            KC_NO,   KC_NO,   \
+        KC_TAB , KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_NO,            KC_TRNS,      \
+        KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F17,  KC_F18,  KC_F19,  KC_F20,  LT(5, KC_ENT),           \
+        KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F21,  KC_F22,  KC_F23,  KC_F24,  KC_TRNS, KC_TRNS,           \
+        KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_RALT, KC_NO,   KC_NO,  KC_NO),
+    
+    /* Layer 6: FN layer 4
+     */ 
+    [6] = KEYMAP(
+        KC_NO,                 KC_NO,            KC_NO,          KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   \
+        LCTL(LSFT(KC_TAB)),    KC_NO,            LGUI(KC_UP),    KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,      \
+        MO(6),                 LGUI(KC_LEFT),    LGUI(KC_DOWN),  LGUI(KC_RGHT),    KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,       \
+        KC_TRNS,               KC_NO,            KC_NO,          KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_TRNS, KC_TRNS,           \
+        KC_TRNS,               KC_TRNS,          KC_TRNS,                   KC_TRNS,                 KC_TRNS, KC_NO,   KC_NO,   KC_NO),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
diff --git a/keyboards/infinity60/keymaps/hasu/keymap.c b/keyboards/infinity60/keymaps/hasu/keymap.c
new file mode 100644 (file)
index 0000000..d372886
--- /dev/null
@@ -0,0 +1,113 @@
+#include "infinity60.h"
+
+const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+    /* Layer 0: Default Layer
+     * ,-----------------------------------------------------------.
+     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  `|BSp|
+     * |-----------------------------------------------------------|
+     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
+     * |-----------------------------------------------------------|
+     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
+     * |-----------------------------------------------------------|
+     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn0|
+     * |-----------------------------------------------------------'
+     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
+     * `-----------------------------------------------------------'
+     */
+    [0] = KEYMAP(
+        KC_ESC,    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,           KC_MINS,KC_EQL, KC_BSLS,KC_GRV, \
+        KC_TAB,    KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,           KC_LBRC,KC_RBRC,KC_BSPC, \
+        KC_LCTL,   KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   LT(3, KC_SCLN), KC_QUOT,MT(KC_RCTL, KC_ENT), \
+        OSM(MOD_LSFT), KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, LT(2, KC_SLSH), KC_RSFT,TG(1), \
+        KC_NO,     KC_LGUI,KC_LALT,         LT(4, KC_SPC),                 MO(4),  KC_RGUI,KC_NO,          KC_NO),
+
+    /* Layer 1: HHKB mode (HHKB Fn)
+     * ,-----------------------------------------------------------.
+     * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+     * |-----------------------------------------------------------|
+     * |Caps |   |   |   |   |   |   |   |Psc|Slk|Pus|Up |   |Backs|
+     * |-----------------------------------------------------------|
+     * |      |VoD|VoU|Mut|   |   |  *|  /|Hom|PgU|Lef|Rig|Enter   |
+     * |-----------------------------------------------------------|
+     * |        |   |   |   |   |   |  +|  -|End|PgD|Dow|      |   |
+     * `-----------------------------------------------------------'
+     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
+     * `-----------------------------------------------------------'
+     */ 
+    [1] = KEYMAP(
+        KC_PWR, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \
+        KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,  KC_TRNS,KC_BSPC, \
+        KC_LCTL,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_ENT, \
+        KC_LSFT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_RSFT,KC_TRNS, \
+        KC_TRNS,KC_LGUI,KC_LALT,          KC_TRNS,                      KC_RALT,KC_RGUI,KC_TRNS,KC_TRNS),
+
+    /* Layer 2: Vi mode[Slash]
+     * ,-----------------------------------------------------------.
+     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+     * |-----------------------------------------------------------|
+     * |Tab  |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd|   |   |   |Backs|
+     * |-----------------------------------------------------------|
+     * |Contro|   |Lef|Dow|Rig|   |Lef|Dow|Up |Rig|   |   |Return  |
+     * |-----------------------------------------------------------|
+     * |Shift   |   |   |   |   |   |Hom|PgD|PgUlEnd|Fn0|Shift |   |
+     * `-----------------------------------------------------------'
+     *       |Gui|Alt  |          Space        |Alt  |Gui|
+     *       `-------------------------------------------'
+     */
+    [2] = KEYMAP(
+        KC_GRV, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10,         KC_F11, KC_F12, KC_INS, KC_DEL, \
+        KC_TAB, KC_HOME,KC_PGDN,KC_UP,  KC_PGUP,KC_END, KC_HOME,KC_PGDN,KC_PGUP,KC_END, KC_NO,          KC_NO,  KC_NO,  KC_BSPC, \
+        KC_LCTL,KC_NO,  KC_LEFT,KC_DOWN,KC_RGHT,KC_NO,  KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,KC_NO,          KC_NO,  KC_ENT, \
+        KC_LSFT,KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_HOME,KC_PGDN,KC_PGUP,KC_END, LT(2, KC_SLSH), KC_RSFT,KC_TRNS, \
+        KC_TRNS,KC_LGUI,KC_LALT,          KC_SPC,                       KC_RALT,KC_RGUI,KC_TRNS,        KC_TRNS),
+
+    /* Layer 3: Mouse mode(IJKL)[Semicolon]
+     * ,-----------------------------------------------------------.
+     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+     * |-----------------------------------------------------------|
+     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
+     * |-----------------------------------------------------------|
+     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Fn |   |Return  |
+     * |-----------------------------------------------------------|
+     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   |
+     * `-----------------------------------------------------------'
+     *      |Gui |Alt  |          Mb1          |Fn   |Fn |
+     *      `--------------------------------------------'
+     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
+     */
+    [3] = KEYMAP(
+        KC_GRV,       KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,          KC_F9,          KC_F10,         KC_F11,         KC_F12,        KC_INS, KC_DEL, \
+        LALT(KC_TAB), KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_WH_L,KC_WH_D,KC_MS_U,        KC_WH_U,        KC_WH_R,        ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), \
+        KC_LCTL,      KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO,  KC_NO,  KC_MS_L,KC_MS_D,        KC_MS_R,        LT(3, KC_SCLN), KC_NO,          KC_ENT, \
+        KC_LSFT,      KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO,          KC_RSFT,        KC_TRNS, \
+        KC_TRNS,      KC_LGUI,KC_LALT,          KC_BTN1,                      KC_TRNS,        KC_TRNS,        KC_TRNS,        KC_TRNS),
+
+    /* Layer 4: Mouse mode(IJKL)[Space]
+     * ,-----------------------------------------------------------.
+     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+     * |-----------------------------------------------------------|
+     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
+     * |-----------------------------------------------------------|
+     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Mb1|   |Return  |
+     * |-----------------------------------------------------------|
+     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   |
+     * `-----------------------------------------------------------'
+     *      |Gui |Alt  |          Mb1          |Fn   |Fn |
+     *      `--------------------------------------------'
+     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
+     */
+    [4] = KEYMAP(
+        KC_GRV,       KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,         KC_F9,         KC_F10, KC_F11, KC_F12, KC_INS,       KC_DEL, \
+        LALT(KC_TAB), KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_WH_L,KC_WH_D,KC_MS_U,       KC_WH_U,       KC_WH_R,KC_BTN4,KC_BTN5,LALT(KC_TAB), \
+        KC_LCTL,      KC_VOLD,KC_VOLU,KC_MUTE,KC_NO,  KC_NO,  KC_NO,  KC_MS_L,KC_MS_D,       KC_MS_R,       KC_BTN1,KC_NO,  KC_ENT, \
+        KC_LSFT,      KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT),ALT_T(KC_RGHT),KC_NO,  KC_RSFT,KC_TRNS, \
+        KC_TRNS,      KC_LGUI,KC_LALT,          KC_TRNS,                      KC_TRNS,       KC_TRNS,       KC_TRNS,KC_TRNS),
+
+};
+
+/*
+ * Fn action definition
+ */
+const uint16_t fn_actions[] = {
+
+};
diff --git a/keyboards/infinity60/led.c b/keyboards/infinity60/led.c
new file mode 100644 (file)
index 0000000..aed66c7
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "hal.h"
+
+#include "led.h"
+
+
+void led_set(uint8_t usb_led) {
+}
diff --git a/keyboards/infinity60/matrix.c b/keyboards/infinity60/matrix.c
new file mode 100644 (file)
index 0000000..62c165a
--- /dev/null
@@ -0,0 +1,171 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+#include "hal.h"
+#include "timer.h"
+#include "wait.h"
+#include "print.h"
+#include "matrix.h"
+
+
+/*
+ * Infinity Pinusage:
+ * Column pins are input with internal pull-down. Row pins are output and strobe with high.
+ * Key is high or 1 when it turns on.
+ *  INFINITY PRODUCTION (NO LED)
+ *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
+ *     row: { PTB0, PTB1, PTB2, PTB3, PTB16, PTB17, PTC4, PTC5, PTD0 }
+ *  INFINITY PRODUCTION (WITH LED)
+ *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
+ *     row: { PTC0, PTC1, PTC2, PTC3, PTC4, PTC5, PTC6, PTC7, PTD0 }
+ */
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+static bool debouncing = false;
+static uint16_t debouncing_time = 0;
+
+
+void matrix_init(void)
+{
+    /* Column(sense) */
+    palSetPadMode(GPIOD, 1,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 2,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 3,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 4,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 5,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 6,  PAL_MODE_INPUT_PULLDOWN);
+    palSetPadMode(GPIOD, 7,  PAL_MODE_INPUT_PULLDOWN);
+
+#ifdef INFINITY_LED
+    /* Row(strobe) */
+    palSetPadMode(GPIOC, 0,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 1,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 2,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 3,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 6,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 7,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
+#else
+    /* Row(strobe) */
+    palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 2,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 3,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
+    palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
+#endif
+    memset(matrix, 0, MATRIX_ROWS);
+    memset(matrix_debouncing, 0, MATRIX_ROWS);
+}
+
+uint8_t matrix_scan(void)
+{
+    for (int row = 0; row < MATRIX_ROWS; row++) {
+        matrix_row_t data = 0;
+    #ifdef INFINITY_LED
+        // strobe row
+        switch (row) {
+            case 0: palSetPad(GPIOC, 0);    break;
+            case 1: palSetPad(GPIOC, 1);    break;
+            case 2: palSetPad(GPIOC, 2);    break;
+            case 3: palSetPad(GPIOC, 3);    break;
+            case 4: palSetPad(GPIOC, 4);    break;
+            case 5: palSetPad(GPIOC, 5);    break;
+            case 6: palSetPad(GPIOC, 6);    break;
+            case 7: palSetPad(GPIOC, 7);    break;
+            case 8: palSetPad(GPIOD, 0);    break;
+        }
+    #else
+        // strobe row
+        switch (row) {
+            case 0: palSetPad(GPIOB, 0);    break;
+            case 1: palSetPad(GPIOB, 1);    break;
+            case 2: palSetPad(GPIOB, 2);    break;
+            case 3: palSetPad(GPIOB, 3);    break;
+            case 4: palSetPad(GPIOB, 16);   break;
+            case 5: palSetPad(GPIOB, 17);   break;
+            case 6: palSetPad(GPIOC, 4);    break;
+            case 7: palSetPad(GPIOC, 5);    break;
+            case 8: palSetPad(GPIOD, 0);    break;
+        }
+    #endif
+
+        wait_us(1); // need wait to settle pin state
+
+        // read col data
+        data = (palReadPort(GPIOD)>>1);
+    #ifdef INFINITY_LED
+        // un-strobe row
+        switch (row) {
+            case 0: palClearPad(GPIOC, 0);    break;
+            case 1: palClearPad(GPIOC, 1);    break;
+            case 2: palClearPad(GPIOC, 2);    break;
+            case 3: palClearPad(GPIOC, 3);    break;
+            case 4: palClearPad(GPIOC, 4);    break;
+            case 5: palClearPad(GPIOC, 5);    break;
+            case 6: palClearPad(GPIOC, 6);    break;
+            case 7: palClearPad(GPIOC, 7);    break;
+            case 8: palClearPad(GPIOD, 0);    break;
+        }
+    #else
+        // un-strobe row
+        switch (row) {
+            case 0: palClearPad(GPIOB, 0);    break;
+            case 1: palClearPad(GPIOB, 1);    break;
+            case 2: palClearPad(GPIOB, 2);    break;
+            case 3: palClearPad(GPIOB, 3);    break;
+            case 4: palClearPad(GPIOB, 16);   break;
+            case 5: palClearPad(GPIOB, 17);   break;
+            case 6: palClearPad(GPIOC, 4);    break;
+            case 7: palClearPad(GPIOC, 5);    break;
+            case 8: palClearPad(GPIOD, 0);    break;
+        }
+    #endif
+
+        if (matrix_debouncing[row] != data) {
+            matrix_debouncing[row] = data;
+            debouncing = true;
+            debouncing_time = timer_read();
+        }
+    }
+
+    if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
+        for (int row = 0; row < MATRIX_ROWS; row++) {
+            matrix[row] = matrix_debouncing[row];
+        }
+        debouncing = false;
+    }
+    return 1;
+}
+
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+    return (matrix[row] & (1<<col));
+}
+
+matrix_row_t matrix_get_row(uint8_t row)
+{
+    return matrix[row];
+}
+
+void matrix_print(void)
+{
+    xprintf("\nr/c 01234567\n");
+    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+        xprintf("%02X: ");
+        matrix_row_t data = matrix_get_row(row);
+        for (int col = 0; col < MATRIX_COLS; col++) {
+            if (data & (1<<col))
+                xprintf("1");
+            else
+                xprintf("0");
+        }
+        xprintf("\n");
+    }
+}
diff --git a/keyboards/infinity60/mcuconf.h b/keyboards/infinity60/mcuconf.h
new file mode 100644 (file)
index 0000000..f453304
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#define K20x_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+
+/* Select the MCU clocking mode below by enabling the appropriate block. */
+
+#define KINETIS_NO_INIT             FALSE
+
+/* FEI mode - 48 MHz with internal 32.768 kHz crystal */
+#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_FEI
+#define KINETIS_MCG_FLL_DMX32       1           /* Fine-tune for 32.768 kHz */
+#define KINETIS_MCG_FLL_DRS         1           /* 1464x FLL factor */
+#define KINETIS_SYSCLK_FREQUENCY    47972352UL  /* 32.768 kHz * 1464 (~48 MHz) */
+#define KINETIS_CLKDIV1_OUTDIV1     1
+#define KINETIS_CLKDIV1_OUTDIV2     1
+#define KINETIS_CLKDIV1_OUTDIV4     2
+#define KINETIS_BUSCLK_FREQUENCY    KINETIS_SYSCLK_FREQUENCY
+#define KINETIS_FLASHCLK_FREQUENCY  KINETIS_SYSCLK_FREQUENCY/2
+
+/*
+ * SERIAL driver system settings.
+ */
+#define KINETIS_SERIAL_USE_UART0            TRUE
+
+/*
+ * USB driver settings
+ */
+#define KINETIS_USB_USE_USB0                TRUE
+/* Need to redefine this, since the default is for K20x */
+/* This is for Teensy LC; you should comment it out (or change to 5)
+ * for Teensy 3.x */
+#define KINETIS_USB_USB0_IRQ_PRIORITY       2
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/infinity60/readme.md b/keyboards/infinity60/readme.md
new file mode 100644 (file)
index 0000000..97457b4
--- /dev/null
@@ -0,0 +1,29 @@
+Infinity 60% keyboard firmware
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme](/).
+
+## Keymaps
+
+Several versions of keymaps are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
+
+Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
+
+
+## Compiling
+
+Download or clone the whole firmware and navigate to the keyboards/infinity60 folder. Once your dev env is setup, you'll be able to use the `make` command to both compile your keymap and flash it to your keyboard.
+
+To just compile, which generates the output files in the `.build` folder at the root of the repository, run `make keymap`, where keymap is the name of the keymap that you want to compile.
+
+## Flashing
+
+To flash the firmware to the keyboard
+
+1. First press the flash button on the bottom of the keyboard. If you already have a flah button mapped in a keyboard layout running on the keyboard, you can also use that.
+2. Then run `make keymap-dfu-util`, where keymap is the name of the keymap you want to flash. On Linux based operating systems you might need to run the comamnd as root, for example `sudo make keymap-dfu-util` on Ubuntu.
+
+**Tip** `make keymap-dfu-util` will also compile the keymap if needed, so you can skip the compilation step if you want to.
+
diff --git a/keyboards/infinity60/rules.mk b/keyboards/infinity60/rules.mk
new file mode 100644 (file)
index 0000000..56d6470
--- /dev/null
@@ -0,0 +1,66 @@
+# project specific files
+SRC =  matrix.c \
+       led.c
+
+## chip/board settings
+# - the next two should match the directories in
+#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+# - For Teensies, FAMILY = KINETIS and SERIES is either
+#   KL2x (LC) or K20x (3.0,3.1,3.2).
+# - For Infinity KB, SERIES = K20x
+MCU_FAMILY = KINETIS
+MCU_SERIES = K20x
+
+# Linker script to use
+# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+#   or <this_dir>/ld/
+# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
+# - LDSCRIPT =
+#   - MKL26Z64 for Teensy LC
+#   - MK20DX128 for Teensy 3.0
+#   - MK20DX256 for Teensy 3.1 and 3.2
+#   - MK20DX128BLDR4 for Infinity with Kiibohd bootloader
+MCU_LDSCRIPT = MK20DX128BLDR4
+
+# Startup code to use
+#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+# - STARTUP =
+#   - kl2x for Teensy LC
+#   - k20x5 for Teensy 3.0 and Infinity KB
+#   - k20x7 for Teensy 3.1 and 3.2
+MCU_STARTUP = k20x5
+
+# Board: it should exist either in <chibios>/os/hal/boards/
+#  or <this_dir>/boards
+# - BOARD =
+#   - PJRC_TEENSY_LC for Teensy LC
+#   - PJRC_TEENSY_3 for Teensy 3.0
+#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
+#   - MCHCK_K20 for Infinity KB
+BOARD = MCHCK_K20
+
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU  = cortex-m4
+
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+# I.e. 6 for Teensy LC; 7 for Teensy 3.x
+ARMV = 7
+
+# Vector table for application
+# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
+# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration
+## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
+MOUSEKEY_ENABLE ?= yes # Mouse keys
+EXTRAKEY_ENABLE ?= yes # Audio control and System control
+CONSOLE_ENABLE ?= yes  # Console for debug
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes         # USB Nkey Rollover
+CUSTOM_MATRIX ?= yes # Custom matrix file
\ No newline at end of file
diff --git a/keyboards/infinity_chibios/MEMO.txt b/keyboards/infinity_chibios/MEMO.txt
deleted file mode 100644 (file)
index e2886aa..0000000
+++ /dev/null
@@ -1,385 +0,0 @@
-flabbergast's TMK/ChibiOS port
-==============================
-2015/10/16
-
-
-Build
------
-$ git clone -b chibios https://github.com/flabbergast/tmk_keyboard.git
-
-$ cd tmk_keyboard
-$ git submodule add -f -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
-or
-$ cd tmk_keyboard/tmk_core/tool/chibios
-$ git clone -b kinetis https://github.com/flabbergast/ChibiOS.git tmk_core/tool/chibios/chibios
-
-$ cd tmk_keyboard/keyboard/infinity_chibios
-$ make
-
-
-
-
-Chibios Configuration
----------------------
-halconf.h: for HAL configuration
-    placed in project directory
-    read in chibios/os/hal/hal.mk
-    included in chibios/os/hal/include/hal.h
-mcuconf.h: for MCU configuration
-    placed in project directory
-    included in halconf.h
-
-
-Chibios Term
-------------
-PAL = Port Abstraction Layer
-    palWritePad
-    palReadPad
-    palSetPad
-    chibios/os/hal/include/pal.h
-
-LLD = Low Level Driver
-
-
-Makefile
---------
-    #   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-    MCU_FAMILY = KINETIS
-    MCU_SERIES = KL2x
-
-    # - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-    #   or <this_dir>/ld/
-    MCU_LDSCRIPT = MKL26Z64
-
-    #  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-    MCU_STARTUP = kl2x
-
-    # Board: it should exist either in <chibios>/os/hal/boards/
-    #  or <this_dir>/boards
-    BOARD = PJRC_TEENSY_LC
-
-    MCU  = cortex-m0
-
-    # ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-    ARMV = 6
-
-
-halconf.h
----------
-
-
-mcuconf.h
----------
-
-
-chconf.h
---------
-
-
-ld script
----------
---- ../../tmk_core/tool/chibios/chibios/os/common/ports/ARMCMx/compilers/GCC/ld/MKL26Z64.ld     2015-10-15 09:08:58.732904304 +0900
-+++ ld/MKL26Z64.ld      2015-10-15 08:48:06.430215496 +0900
-@@ -27,7 +27,8 @@
- {
-   flash0   :  org = 0x00000000,  len = 0xc0
-   flashcfg :  org = 0x00000400,  len = 0x10
--  flash    :  org = 0x00000410,  len = 64k - 0x410
-+  flash    :  org = 0x00000410,  len = 62k - 0x410
-+  eeprom_emu : org = 0x0000F800, len = 2k
-   ram      :  org = 0x1FFFF800,  len = 8k
- }
-
-@@ -35,6 +36,10 @@
- __ram_size__            = LENGTH(ram);
- __ram_end__             = __ram_start__ + __ram_size__;
-
-+__eeprom_workarea_start__ = ORIGIN(eeprom_emu);
-+__eeprom_workarea_size__  = LENGTH(eeprom_emu);
-+__eeprom_workarea_end__   = __eeprom_workarea_start__ + __eeprom_workarea_size__;
-+
- SECTIONS
- {
-   . = 0;
-
-
-
-Configuration/Startup for Infinity 60%
---------------------------------------
-Configuration:
-
-
-Clock:
-Inifinity   
-    FEI(FLL Engaged Internal) mode with core clock:48MHz, bus clock:48MHz, flash clock:24MHz
-    Clock dividor:
-    SIM_CLKDIV1[OUTDIV1] = 0 divide-by-1 for core clock
-    SIM_CLKDIV1[OUTDIV2] = 0 divide-by-1 for bus clock
-    SIM_CLKDIV1[OUTDIV4] = 1 divide-by-2 for flash clock
-    Internal reference clock:
-    MCG_C1[IREFS] = 1 Internal Reference Select for clock source for FLL
-    MCG_C1[IRCLKEN] = 1 Internal Reference Clock Enable
-    FLL multipilication:
-    MCG_C4[DMX32] = 1
-    MCG_C4[DRST_DRS] = 01   FLL factor 1464 * 32.768kHz = 48MHz
-
-chibios/os/hal/ports/KINETIS/K20x/hal_lld.c
-    k20x_clock_init(): called in __early_init() defined in board.c
-        disable watchdog and configure clock
-
-        configurable macros:
-        KINETIS_NO_INIT: whether init or not
-        KINETIS_MCG_MODE: clock mode   
-            KINETIS_MCG_MODE_FEI
-            KINETIS_MCG_MODE_PEE
-                hal/ports/KINETIS/K20x/hal_lld.h
-            
-
-chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.h
-    PALConfig pal_default_config
-    boardInit()
-    __early_init()
-    macro definitions for board infos, freq and mcu type
-
-chibios/os/hal/boards/FREESCALE_FREEDOM_K20D50M/board.c
-
-USB
-
-
-Startup
--------
-    common/ports/ARMCMx/GCC/crt0_v[67]m.s
-        Reset_Handler: startup code
-    common/ports/ARMCMx/GCC/crt1.c
-        __core_init(): weak
-        __early_init(): weak
-        __late_init(): weak
-        __default_exit(): weak
-            called from Reset_Handler of crt0
-    common/ports/ARMCMx/GCC/vector.c
-    common/ports/ARMCMx/GCC/ld/*.ld
-
-chibios/os/common/ports/ARMCMx/compilers/GCC/
-├── crt0_v6m.s
-├── crt0_v7m.s
-├── crt1.c
-├── ld
-│   ├── MK20DX128BLDR3.ld
-│   ├── MK20DX128BLDR4.ld
-│   ├── MK20DX128.ld
-│   ├── MK20DX256.ld
-│   ├── MKL25Z128.ld
-│   ├── MKL26Z128.ld
-│   ├── MKL26Z64.ld
-│   └── STM32L476xG.ld
-├── mk
-│   ├── startup_k20x5.mk
-│   ├── startup_k20x7.mk
-│   ├── startup_k20x.mk
-│   ├── startup_kl2x.mk
-│   └── startup_stm32l4xx.mk
-├── rules.ld
-├── rules.mk
-└── vectors.c
-
-chibios/os/hal/
-├── boards
-│   ├── FREESCALE_FREEDOM_K20D50M
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── MCHCK_K20
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_3
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_3_1
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── PJRC_TEENSY_LC
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── readme.txt
-│   ├── simulator
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   └── board.mk
-│   ├── ST_NUCLEO_F030R8
-│   │   ├── board.c
-│   │   ├── board.h
-│   │   ├── board.mk
-│   │   └── cfg
-│   │       └── board.chcfg
-├── hal.mk
-├── include
-│   ├── adc.h
-│   ├── can.h
-│   ├── dac.h
-│   ├── ext.h
-│   ├── gpt.h
-│   ├── hal_channels.h
-│   ├── hal_files.h
-│   ├── hal.h
-│   ├── hal_ioblock.h
-│   ├── hal_mmcsd.h
-│   ├── hal_queues.h
-│   ├── hal_streams.h
-│   ├── i2c.h
-│   ├── i2s.h
-│   ├── icu.h
-│   ├── mac.h
-│   ├── mii.h
-│   ├── mmc_spi.h
-│   ├── pal.h
-│   ├── pwm.h
-│   ├── rtc.h
-│   ├── sdc.h
-│   ├── serial.h
-│   ├── serial_usb.h
-│   ├── spi.h
-│   ├── st.h
-│   ├── uart.h
-│   └── usb.h
-├── lib
-│   └── streams
-│       ├── chprintf.c
-│       ├── chprintf.h
-│       ├── memstreams.c
-│       ├── memstreams.h
-│       ├── nullstreams.c
-│       └── nullstreams.h
-├── osal
-│   ├── nil
-│   │   ├── osal.c
-│   │   ├── osal.h
-│   │   └── osal.mk
-│   ├── os-less
-│   │   └── ARMCMx
-│   │       ├── osal.c
-│   │       ├── osal.h
-│   │       └── osal.mk
-│   └── rt
-│       ├── osal.c
-│       ├── osal.h
-│       └── osal.mk
-├── ports
-│   ├── AVR
-│   ├── common
-│   │   └── ARMCMx
-│   │       ├── mpu.h
-│   │       ├── nvic.c
-│   │       └── nvic.h
-│   ├── KINETIS
-│   │   ├── K20x
-│   │   │   ├── hal_lld.c
-│   │   │   ├── hal_lld.h
-│   │   │   ├── kinetis_registry.h
-│   │   │   ├── platform.dox
-│   │   │   ├── platform.mk
-│   │   │   ├── pwm_lld.c
-│   │   │   ├── pwm_lld.h
-│   │   │   ├── spi_lld.c
-│   │   │   └── spi_lld.h
-│   │   ├── KL2x
-│   │   │   ├── hal_lld.c
-│   │   │   ├── hal_lld.h
-│   │   │   ├── kinetis_registry.h
-│   │   │   ├── platform.mk
-│   │   │   ├── pwm_lld.c
-│   │   │   └── pwm_lld.h
-│   │   ├── LLD
-│   │   │   ├── adc_lld.c
-│   │   │   ├── adc_lld.h
-│   │   │   ├── ext_lld.c
-│   │   │   ├── ext_lld.h
-│   │   │   ├── gpt_lld.c
-│   │   │   ├── gpt_lld.h
-│   │   │   ├── i2c_lld.c
-│   │   │   ├── i2c_lld.h
-│   │   │   ├── pal_lld.c
-│   │   │   ├── pal_lld.h
-│   │   │   ├── serial_lld.c
-│   │   │   ├── serial_lld.h
-│   │   │   ├── st_lld.c
-│   │   │   ├── st_lld.h
-│   │   │   ├── usb_lld.c
-│   │   │   └── usb_lld.h
-│   │   └── README.md
-│   ├── LPC
-│   ├── simulator
-│   └── STM32
-├── src
-│   ├── adc.c
-│   ├── can.c
-│   ├── dac.c
-│   ├── ext.c
-│   ├── gpt.c
-│   ├── hal.c
-│   ├── hal_mmcsd.c
-│   ├── hal_queues.c
-│   ├── i2c.c
-│   ├── i2s.c
-│   ├── icu.c
-│   ├── mac.c
-│   ├── mmc_spi.c
-│   ├── pal.c
-│   ├── pwm.c
-│   ├── rtc.c
-│   ├── sdc.c
-│   ├── serial.c
-│   ├── serial_usb.c
-│   ├── spi.c
-│   ├── st.c
-│   ├── uart.c
-│   └── usb.c
-└── templates
-    ├── adc_lld.c
-    ├── adc_lld.h
-    ├── can_lld.c
-    ├── can_lld.h
-    ├── dac_lld.c
-    ├── dac_lld.h
-    ├── ext_lld.c
-    ├── ext_lld.h
-    ├── gpt_lld.c
-    ├── gpt_lld.h
-    ├── halconf.h
-    ├── hal_lld.c
-    ├── hal_lld.h
-    ├── i2c_lld.c
-    ├── i2c_lld.h
-    ├── i2s_lld.c
-    ├── i2s_lld.h
-    ├── icu_lld.c
-    ├── icu_lld.h
-    ├── mac_lld.c
-    ├── mac_lld.h
-    ├── mcuconf.h
-    ├── osal
-    │   ├── osal.c
-    │   ├── osal.h
-    │   └── osal.mk
-    ├── pal_lld.c
-    ├── pal_lld.h
-    ├── platform.mk
-    ├── pwm_lld.c
-    ├── pwm_lld.h
-    ├── rtc_lld.c
-    ├── rtc_lld.h
-    ├── sdc_lld.c
-    ├── sdc_lld.h
-    ├── serial_lld.c
-    ├── serial_lld.h
-    ├── spi_lld.c
-    ├── spi_lld.h
-    ├── st_lld.c
-    ├── st_lld.h
-    ├── uart_lld.c
-    ├── uart_lld.h
-    ├── usb_lld.c
-    └── usb_lld.h
diff --git a/keyboards/infinity_chibios/Makefile b/keyboards/infinity_chibios/Makefile
deleted file mode 100644 (file)
index 649b43e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-# project specific files
-SRC =  matrix.c \
-       led.c
-
-## chip/board settings
-# - the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-# - For Teensies, FAMILY = KINETIS and SERIES is either
-#   KL2x (LC) or K20x (3.0,3.1,3.2).
-# - For Infinity KB, SERIES = K20x
-MCU_FAMILY = KINETIS
-MCU_SERIES = K20x
-
-# Linker script to use
-# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
-# - LDSCRIPT =
-#   - MKL26Z64 for Teensy LC
-#   - MK20DX128 for Teensy 3.0
-#   - MK20DX256 for Teensy 3.1 and 3.2
-#   - MK20DX128BLDR4 for Infinity with Kiibohd bootloader
-MCU_LDSCRIPT = MK20DX128BLDR4
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
-# - STARTUP =
-#   - kl2x for Teensy LC
-#   - k20x5 for Teensy 3.0 and Infinity KB
-#   - k20x7 for Teensy 3.1 and 3.2
-MCU_STARTUP = k20x5
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-# - BOARD =
-#   - PJRC_TEENSY_LC for Teensy LC
-#   - PJRC_TEENSY_3 for Teensy 3.0
-#   - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2
-#   - MCHCK_K20 for Infinity KB
-BOARD = MCHCK_K20
-
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-# I.e. 6 for Teensy LC; 7 for Teensy 3.x
-ARMV = 7
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration
-## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
-MOUSEKEY_ENABLE ?= yes # Mouse keys
-EXTRAKEY_ENABLE ?= yes # Audio control and System control
-CONSOLE_ENABLE ?= yes  # Console for debug
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-NKRO_ENABLE ?= yes         # USB Nkey Rollover
-CUSTOM_MATRIX ?= yes # Custom matrix file
-
-ifndef QUANTUM_DIR
-       include ../../Makefile
-endif
\ No newline at end of file
diff --git a/keyboards/infinity_chibios/bootloader_defs.h b/keyboards/infinity_chibios/bootloader_defs.h
deleted file mode 100644 (file)
index c67153b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#define KIIBOHD_BOOTLOADER
diff --git a/keyboards/infinity_chibios/chconf.h b/keyboards/infinity_chibios/chconf.h
deleted file mode 100644 (file)
index b886c38..0000000
+++ /dev/null
@@ -1,524 +0,0 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-/**\r
- * @file    templates/chconf.h\r
- * @brief   Configuration file template.\r
- * @details A copy of this file must be placed in each project directory, it\r
- *          contains the application specific kernel settings.\r
- *\r
- * @addtogroup config\r
- * @details Kernel related settings and hooks.\r
- * @{\r
- */\r
-\r
-#ifndef CHCONF_H\r
-#define CHCONF_H\r
-\r
-#define _CHIBIOS_RT_CONF_\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name System timers settings\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   System time counter resolution.\r
- * @note    Allowed values are 16 or 32 bits.\r
- */\r
-#define CH_CFG_ST_RESOLUTION                32\r
-\r
-/**\r
- * @brief   System tick frequency.\r
- * @details Frequency of the system timer that drives the system ticks. This\r
- *          setting also defines the system tick time unit.\r
- */\r
-#define CH_CFG_ST_FREQUENCY                 1000\r
-\r
-/**\r
- * @brief   Time delta constant for the tick-less mode.\r
- * @note    If this value is zero then the system uses the classic\r
- *          periodic tick. This value represents the minimum number\r
- *          of ticks that is safe to specify in a timeout directive.\r
- *          The value one is not valid, timeouts are rounded up to\r
- *          this value.\r
- */\r
-#define CH_CFG_ST_TIMEDELTA                 0\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Kernel parameters and options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Round robin interval.\r
- * @details This constant is the number of system ticks allowed for the\r
- *          threads before preemption occurs. Setting this value to zero\r
- *          disables the preemption for threads with equal priority and the\r
- *          round robin becomes cooperative. Note that higher priority\r
- *          threads can still preempt, the kernel is always preemptive.\r
- * @note    Disabling the round robin preemption makes the kernel more compact\r
- *          and generally faster.\r
- * @note    The round robin preemption is not supported in tickless mode and\r
- *          must be set to zero in that case.\r
- */\r
-#define CH_CFG_TIME_QUANTUM                 20\r
-\r
-/**\r
- * @brief   Managed RAM size.\r
- * @details Size of the RAM area to be managed by the OS. If set to zero\r
- *          then the whole available RAM is used. The core memory is made\r
- *          available to the heap allocator and/or can be used directly through\r
- *          the simplified core memory allocator.\r
- *\r
- * @note    In order to let the OS manage the whole RAM the linker script must\r
- *          provide the @p __heap_base__ and @p __heap_end__ symbols.\r
- * @note    Requires @p CH_CFG_USE_MEMCORE.\r
- */\r
-#define CH_CFG_MEMCORE_SIZE                 0\r
-\r
-/**\r
- * @brief   Idle thread automatic spawn suppression.\r
- * @details When this option is activated the function @p chSysInit()\r
- *          does not spawn the idle thread. The application @p main()\r
- *          function becomes the idle thread and must implement an\r
- *          infinite loop.\r
- */\r
-#define CH_CFG_NO_IDLE_THREAD               FALSE\r
-\r
-/* Use __WFI in the idle thread for waiting. Does lower the power\r
- * consumption. */\r
-#define CORTEX_ENABLE_WFI_IDLE              TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Performance options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   OS optimization.\r
- * @details If enabled then time efficient rather than space efficient code\r
- *          is used when two possible implementations exist.\r
- *\r
- * @note    This is not related to the compiler optimization options.\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_OPTIMIZE_SPEED               TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Subsystem options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Time Measurement APIs.\r
- * @details If enabled then the time measurement APIs are included in\r
- *          the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_TM                       FALSE\r
-\r
-/**\r
- * @brief   Threads registry APIs.\r
- * @details If enabled then the registry APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_REGISTRY                 TRUE\r
-\r
-/**\r
- * @brief   Threads synchronization APIs.\r
- * @details If enabled then the @p chThdWait() function is included in\r
- *          the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_WAITEXIT                 TRUE\r
-\r
-/**\r
- * @brief   Semaphores APIs.\r
- * @details If enabled then the Semaphores APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_SEMAPHORES               TRUE\r
-\r
-/**\r
- * @brief   Semaphores queuing mode.\r
- * @details If enabled then the threads are enqueued on semaphores by\r
- *          priority rather than in FIFO order.\r
- *\r
- * @note    The default is @p FALSE. Enable this if you have special\r
- *          requirements.\r
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.\r
- */\r
-#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE\r
-\r
-/**\r
- * @brief   Mutexes APIs.\r
- * @details If enabled then the mutexes APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MUTEXES                  TRUE\r
-\r
-/**\r
- * @brief   Enables recursive behavior on mutexes.\r
- * @note    Recursive mutexes are heavier and have an increased\r
- *          memory footprint.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    Requires @p CH_CFG_USE_MUTEXES.\r
- */\r
-#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE\r
-\r
-/**\r
- * @brief   Conditional Variables APIs.\r
- * @details If enabled then the conditional variables APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_MUTEXES.\r
- */\r
-#define CH_CFG_USE_CONDVARS                 TRUE\r
-\r
-/**\r
- * @brief   Conditional Variables APIs with timeout.\r
- * @details If enabled then the conditional variables APIs with timeout\r
- *          specification are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_CONDVARS.\r
- */\r
-#define CH_CFG_USE_CONDVARS_TIMEOUT         TRUE\r
-\r
-/**\r
- * @brief   Events Flags APIs.\r
- * @details If enabled then the event flags APIs are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_EVENTS                   TRUE\r
-\r
-/**\r
- * @brief   Events Flags APIs with timeout.\r
- * @details If enabled then the events APIs with timeout specification\r
- *          are included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_EVENTS.\r
- */\r
-#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE\r
-\r
-/**\r
- * @brief   Synchronous Messages APIs.\r
- * @details If enabled then the synchronous messages APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MESSAGES                 TRUE\r
-\r
-/**\r
- * @brief   Synchronous Messages queuing mode.\r
- * @details If enabled then messages are served by priority rather than in\r
- *          FIFO order.\r
- *\r
- * @note    The default is @p FALSE. Enable this if you have special\r
- *          requirements.\r
- * @note    Requires @p CH_CFG_USE_MESSAGES.\r
- */\r
-#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE\r
-\r
-/**\r
- * @brief   Mailboxes APIs.\r
- * @details If enabled then the asynchronous messages (mailboxes) APIs are\r
- *          included in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.\r
- */\r
-#define CH_CFG_USE_MAILBOXES                TRUE\r
-\r
-/**\r
- * @brief   Core Memory Manager APIs.\r
- * @details If enabled then the core memory manager APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MEMCORE                  TRUE\r
-\r
-/**\r
- * @brief   Heap Allocator APIs.\r
- * @details If enabled then the memory heap allocator APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or\r
- *          @p CH_CFG_USE_SEMAPHORES.\r
- * @note    Mutexes are recommended.\r
- */\r
-#define CH_CFG_USE_HEAP                     TRUE\r
-\r
-/**\r
- * @brief   Memory Pools Allocator APIs.\r
- * @details If enabled then the memory pools allocator APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- */\r
-#define CH_CFG_USE_MEMPOOLS                 TRUE\r
-\r
-/**\r
- * @brief   Dynamic Threads APIs.\r
- * @details If enabled then the dynamic threads creation APIs are included\r
- *          in the kernel.\r
- *\r
- * @note    The default is @p TRUE.\r
- * @note    Requires @p CH_CFG_USE_WAITEXIT.\r
- * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.\r
- */\r
-#define CH_CFG_USE_DYNAMIC                  TRUE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Debug options\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Debug option, kernel statistics.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_STATISTICS                   FALSE\r
-\r
-/**\r
- * @brief   Debug option, system state check.\r
- * @details If enabled the correct call protocol for system APIs is checked\r
- *          at runtime.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_SYSTEM_STATE_CHECK           FALSE\r
-\r
-/**\r
- * @brief   Debug option, parameters checks.\r
- * @details If enabled then the checks on the API functions input\r
- *          parameters are activated.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_ENABLE_CHECKS                FALSE\r
-\r
-/**\r
- * @brief   Debug option, consistency checks.\r
- * @details If enabled then all the assertions in the kernel code are\r
- *          activated. This includes consistency checks inside the kernel,\r
- *          runtime anomalies and port-defined checks.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_ENABLE_ASSERTS               FALSE\r
-\r
-/**\r
- * @brief   Debug option, trace buffer.\r
- * @details If enabled then the trace buffer is activated.\r
- *\r
- * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.\r
- */\r
-#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED\r
-\r
-/**\r
- * @brief   Trace buffer entries.\r
- * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is\r
- *          different from @p CH_DBG_TRACE_MASK_DISABLED.\r
- */\r
-#define CH_DBG_TRACE_BUFFER_SIZE            128\r
-\r
-/**\r
- * @brief   Debug option, stack checks.\r
- * @details If enabled then a runtime stack check is performed.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    The stack check is performed in a architecture/port dependent way.\r
- *          It may not be implemented or some ports.\r
- * @note    The default failure mode is to halt the system with the global\r
- *          @p panic_msg variable set to @p NULL.\r
- */\r
-#define CH_DBG_ENABLE_STACK_CHECK           FALSE\r
-\r
-/**\r
- * @brief   Debug option, stacks initialization.\r
- * @details If enabled then the threads working area is filled with a byte\r
- *          value when a thread is created. This can be useful for the\r
- *          runtime measurement of the used stack.\r
- *\r
- * @note    The default is @p FALSE.\r
- */\r
-#define CH_DBG_FILL_THREADS                 FALSE\r
-\r
-/**\r
- * @brief   Debug option, threads profiling.\r
- * @details If enabled then a field is added to the @p thread_t structure that\r
- *          counts the system ticks occurred while executing the thread.\r
- *\r
- * @note    The default is @p FALSE.\r
- * @note    This debug option is not currently compatible with the\r
- *          tickless mode.\r
- */\r
-#define CH_DBG_THREADS_PROFILING            FALSE\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/**\r
- * @name Kernel hooks\r
- * @{\r
- */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Threads descriptor structure extension.\r
- * @details User fields added to the end of the @p thread_t structure.\r
- */\r
-#define CH_CFG_THREAD_EXTRA_FIELDS                                          \\r
-  /* Add threads custom fields here.*/\r
-\r
-/**\r
- * @brief   Threads initialization hook.\r
- * @details User initialization code added to the @p chThdInit() API.\r
- *\r
- * @note    It is invoked from within @p chThdInit() and implicitly from all\r
- *          the threads creation APIs.\r
- */\r
-#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \\r
-  /* Add threads initialization code here.*/                                \\r
-}\r
-\r
-/**\r
- * @brief   Threads finalization hook.\r
- * @details User finalization code added to the @p chThdExit() API.\r
- */\r
-#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \\r
-  /* Add threads finalization code here.*/                                  \\r
-}\r
-\r
-/**\r
- * @brief   Context switch hook.\r
- * @details This hook is invoked just before switching between threads.\r
- */\r
-#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \\r
-  /* Context switch code here.*/                                            \\r
-}\r
-\r
-/**\r
- * @brief   ISR enter hook.\r
- */\r
-#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \\r
-  /* IRQ prologue code here.*/                                              \\r
-}\r
-\r
-/**\r
- * @brief   ISR exit hook.\r
- */\r
-#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \\r
-  /* IRQ epilogue code here.*/                                              \\r
-}\r
-\r
-/**\r
- * @brief   Idle thread enter hook.\r
- * @note    This hook is invoked within a critical zone, no OS functions\r
- *          should be invoked from here.\r
- * @note    This macro can be used to activate a power saving mode.\r
- */\r
-#define CH_CFG_IDLE_ENTER_HOOK() {                                          \\r
-  /* Idle-enter code here.*/                                                \\r
-}\r
-\r
-/**\r
- * @brief   Idle thread leave hook.\r
- * @note    This hook is invoked within a critical zone, no OS functions\r
- *          should be invoked from here.\r
- * @note    This macro can be used to deactivate a power saving mode.\r
- */\r
-#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \\r
-  /* Idle-leave code here.*/                                                \\r
-}\r
-\r
-/**\r
- * @brief   Idle Loop hook.\r
- * @details This hook is continuously invoked by the idle thread loop.\r
- */\r
-#define CH_CFG_IDLE_LOOP_HOOK() {                                           \\r
-  /* Idle loop code here.*/                                                 \\r
-}\r
-\r
-/**\r
- * @brief   System tick event hook.\r
- * @details This hook is invoked in the system tick handler immediately\r
- *          after processing the virtual timers queue.\r
- */\r
-#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \\r
-  /* System tick event code here.*/                                         \\r
-}\r
-\r
-/**\r
- * @brief   System halt hook.\r
- * @details This hook is invoked in case to a system halting error before\r
- *          the system is halted.\r
- */\r
-#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \\r
-  /* System halt code here.*/                                               \\r
-}\r
-\r
-/**\r
- * @brief   Trace hook.\r
- * @details This hook is invoked each time a new record is written in the\r
- *          trace buffer.\r
- */\r
-#define CH_CFG_TRACE_HOOK(tep) {                                            \\r
-  /* Trace code here.*/                                                     \\r
-}\r
-\r
-/** @} */\r
-\r
-/*===========================================================================*/\r
-/* Port-specific settings (override port settings defaulted in chcore.h).    */\r
-/*===========================================================================*/\r
-\r
-#endif  /* CHCONF_H */\r
-\r
-/** @} */\r
diff --git a/keyboards/infinity_chibios/config.h b/keyboards/infinity_chibios/config.h
deleted file mode 100644 (file)
index 452cc2a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-Copyright 2015 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#define PREVENT_STUCK_MODIFIERS
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x6464
-#define DEVICE_VER      0x0001
-/* in python2: list(u"whatever".encode('utf-16-le')) */
-/*   at most 32 characters or the ugly hack in usb_main.c borks */
-#define MANUFACTURER "TMK"
-#define USBSTR_MANUFACTURER    'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', '\xc6', '\x00'
-#define PRODUCT "Infinity keyboard/TMK"
-#define USBSTR_PRODUCT         'I', '\x00', 'n', '\x00', 'f', '\x00', 'i', '\x00', 'n', '\x00', 'i', '\x00', 't', '\x00', 'y', '\x00', ' ', '\x00', 'k', '\x00', 'e', '\x00', 'y', '\x00', 'b', '\x00', 'o', '\x00', 'a', '\x00', 'r', '\x00', 'd', '\x00', '/', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00'
-
-/* key matrix size */
-#define MATRIX_ROWS 9
-#define MATRIX_COLS 7
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCE    5
-
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
-//#define LOCKING_SUPPORT_ENABLE
-/* Locking resynchronize hack */
-//#define LOCKING_RESYNC_ENABLE
-
-/* key combination for command */
-#define IS_COMMAND() ( \
-    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
-)
-
-/* Keymap for Infinity prototype */
-//#define INFINITY_PROTOTYPE
-
-/* Keymap for Infinity 1.1a (first revision with LED support) */
-//#define INFINITY_LED
-
-/*
- * Feature disable options
- *  These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
-
-#endif
diff --git a/keyboards/infinity_chibios/halconf.h b/keyboards/infinity_chibios/halconf.h
deleted file mode 100644 (file)
index 53538de..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-/**\r
- * @file    templates/halconf.h\r
- * @brief   HAL configuration header.\r
- * @details HAL configuration file, this file allows to enable or disable the\r
- *          various device drivers from your application. You may also use\r
- *          this file in order to override the device drivers default settings.\r
- *\r
- * @addtogroup HAL_CONF\r
- * @{\r
- */\r
-\r
-#ifndef _HALCONF_H_\r
-#define _HALCONF_H_\r
-\r
-#include "mcuconf.h"\r
-\r
-/**\r
- * @brief   Enables the PAL subsystem.\r
- */\r
-#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)\r
-#define HAL_USE_PAL                 TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the ADC subsystem.\r
- */\r
-#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)\r
-#define HAL_USE_ADC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the CAN subsystem.\r
- */\r
-#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)\r
-#define HAL_USE_CAN                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the DAC subsystem.\r
- */\r
-#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)\r
-#define HAL_USE_DAC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the EXT subsystem.\r
- */\r
-#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)\r
-#define HAL_USE_EXT                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the GPT subsystem.\r
- */\r
-#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)\r
-#define HAL_USE_GPT                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the I2C subsystem.\r
- */\r
-#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)\r
-#define HAL_USE_I2C                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the I2S subsystem.\r
- */\r
-#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)\r
-#define HAL_USE_I2S                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the ICU subsystem.\r
- */\r
-#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)\r
-#define HAL_USE_ICU                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the MAC subsystem.\r
- */\r
-#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)\r
-#define HAL_USE_MAC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the MMC_SPI subsystem.\r
- */\r
-#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)\r
-#define HAL_USE_MMC_SPI             FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the PWM subsystem.\r
- */\r
-#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)\r
-#define HAL_USE_PWM                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the RTC subsystem.\r
- */\r
-#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)\r
-#define HAL_USE_RTC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SDC subsystem.\r
- */\r
-#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)\r
-#define HAL_USE_SDC                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SERIAL subsystem.\r
- */\r
-#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)\r
-#define HAL_USE_SERIAL              FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SERIAL over USB subsystem.\r
- */\r
-#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)\r
-#define HAL_USE_SERIAL_USB          TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the SPI subsystem.\r
- */\r
-#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)\r
-#define HAL_USE_SPI                 FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the UART subsystem.\r
- */\r
-#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)\r
-#define HAL_USE_UART                FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the USB subsystem.\r
- */\r
-#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)\r
-#define HAL_USE_USB                 TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the WDG subsystem.\r
- */\r
-#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)\r
-#define HAL_USE_WDG                 FALSE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* ADC driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables synchronous APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)\r
-#define ADC_USE_WAIT                TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)\r
-#define ADC_USE_MUTUAL_EXCLUSION    TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* CAN driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Sleep mode related APIs inclusion switch.\r
- */\r
-#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)\r
-#define CAN_USE_SLEEP_MODE          TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* I2C driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables the mutual exclusion APIs on the I2C bus.\r
- */\r
-#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)\r
-#define I2C_USE_MUTUAL_EXCLUSION    TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* MAC driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables an event sources for incoming packets.\r
- */\r
-#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)\r
-#define MAC_USE_ZERO_COPY           FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables an event sources for incoming packets.\r
- */\r
-#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)\r
-#define MAC_USE_EVENTS              TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* MMC_SPI driver related settings.                                          */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Delays insertions.\r
- * @details If enabled this options inserts delays into the MMC waiting\r
- *          routines releasing some extra CPU time for the threads with\r
- *          lower priority, this may slow down the driver a bit however.\r
- *          This option is recommended also if the SPI driver does not\r
- *          use a DMA channel and heavily loads the CPU.\r
- */\r
-#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)\r
-#define MMC_NICE_WAITING            TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* SDC driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Number of initialization attempts before rejecting the card.\r
- * @note    Attempts are performed at 10mS intervals.\r
- */\r
-#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)\r
-#define SDC_INIT_RETRY              100\r
-#endif\r
-\r
-/**\r
- * @brief   Include support for MMC cards.\r
- * @note    MMC support is not yet implemented so this option must be kept\r
- *          at @p FALSE.\r
- */\r
-#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)\r
-#define SDC_MMC_SUPPORT             FALSE\r
-#endif\r
-\r
-/**\r
- * @brief   Delays insertions.\r
- * @details If enabled this options inserts delays into the MMC waiting\r
- *          routines releasing some extra CPU time for the threads with\r
- *          lower priority, this may slow down the driver a bit however.\r
- */\r
-#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)\r
-#define SDC_NICE_WAITING            TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* SERIAL driver related settings.                                           */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Default bit rate.\r
- * @details Configuration parameter, this is the baud rate selected for the\r
- *          default configuration.\r
- */\r
-#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)\r
-#define SERIAL_DEFAULT_BITRATE      38400\r
-#endif\r
-\r
-/**\r
- * @brief   Serial buffers size.\r
- * @details Configuration parameter, you can change the depth of the queue\r
- *          buffers depending on the requirements of your application.\r
- * @note    The default is 64 bytes for both the transmission and receive\r
- *          buffers.\r
- */\r
-#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)\r
-#define SERIAL_BUFFERS_SIZE         16\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* SERIAL_USB driver related setting.                                        */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Serial over USB buffers size.\r
- * @details Configuration parameter, the buffer size must be a multiple of\r
- *          the USB data endpoint maximum packet size.\r
- * @note    The default is 64 bytes for both the transmission and receive\r
- *          buffers.\r
- */\r
-#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)\r
-#define SERIAL_USB_BUFFERS_SIZE     256\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* SPI driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables synchronous APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)\r
-#define SPI_USE_WAIT                TRUE\r
-#endif\r
-\r
-/**\r
- * @brief   Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)\r
-#define SPI_USE_MUTUAL_EXCLUSION    TRUE\r
-#endif\r
-\r
-/*===========================================================================*/\r
-/* USB driver related settings.                                              */\r
-/*===========================================================================*/\r
-\r
-/**\r
- * @brief   Enables synchronous APIs.\r
- * @note    Disabling this option saves both code and data space.\r
- */\r
-#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)\r
-#define USB_USE_WAIT                TRUE\r
-#endif\r
-\r
-#endif /* _HALCONF_H_ */\r
-\r
-/** @} */\r
diff --git a/keyboards/infinity_chibios/infinity_chibios.c b/keyboards/infinity_chibios/infinity_chibios.c
deleted file mode 100644 (file)
index 845eda0..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#include "infinity_chibios.h"
diff --git a/keyboards/infinity_chibios/infinity_chibios.h b/keyboards/infinity_chibios/infinity_chibios.h
deleted file mode 100644 (file)
index f1ba15e..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-Copyright 2014 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef KEYMAP_COMMON_H
-#define KEYMAP_COMMON_H
-
-#include "quantum.h"
-
-#ifdef INFINITY_PROTOTYPE
-
-/* Infinity prototype */
-#define KEYMAP( \
-    K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K86, \
-    K51, K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, \
-    K13, K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, \
-    K54, K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, \
-    K06, K16, K26,           K36,                K46, K56, K66, K76 \
-) { \
-    { K00, K01, K02, K03, K04, K05, K06 }, \
-    { K10, K11, K12, K13, K14, K15, K16 }, \
-    { K20, K21, K22, K23, K24, K25, K26 }, \
-    { K30, K31, K32, K33, K34, K35, K36 }, \
-    { K40, K41, K42, K43, K44, K45, K46 }, \
-    { K50, K51, K52, K53, K54, K55, K56 }, \
-    { K60, K61, K62, K63, K64, K65, K66 }, \
-    { K70, K71, K72, K73, K74, K75, K76 }, \
-    { K80, K81, K82, K83, K84, K85, K86 }  \
-}
-
-#else
-
-/* Infinity production */
-#define KEYMAP( \
-    K00, K10, K20, K30, K40, K50, K60, K70, K80, K01, K11, K21, K31, K41, K51, \
-    K61, K71, K81, K02, K12, K22, K32, K42, K52, K62, K72, K82, K03, K13, \
-    K23, K33, K43, K53, K63, K73, K83, K04, K14, K24, K34, K44, K54, \
-    K64, K74, K84, K05, K15, K25, K35, K45, K55, K65, K75, K85, K06, \
-    K16, K26, K36,           K46,                K56, K66, K76, K86 \
-) { \
-    { K00, K01, K02, K03, K04, K05, K06 }, \
-    { K10, K11, K12, K13, K14, K15, K16 }, \
-    { K20, K21, K22, K23, K24, K25, K26 }, \
-    { K30, K31, K32, K33, K34, K35, K36 }, \
-    { K40, K41, K42, K43, K44, K45, K46 }, \
-    { K50, K51, K52, K53, K54, K55, K56 }, \
-    { K60, K61, K62, K63, K64, K65, K66 }, \
-    { K70, K71, K72, K73, K74, K75, K76 }, \
-    { K80, K81, K82, K83, K84, K85, K86 }  \
-}
-
-#endif
-
-#endif
diff --git a/keyboards/infinity_chibios/keymaps/default/keymap.c b/keyboards/infinity_chibios/keymaps/default/keymap.c
deleted file mode 100644 (file)
index 5f3b46a..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#include "infinity_chibios.h"
-
-const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    /* Layer 0: Default Layer
-     * ,-----------------------------------------------------------.
-     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  `|BSp|
-     * |-----------------------------------------------------------|
-     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
-     * |-----------------------------------------------------------|
-     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
-     * |-----------------------------------------------------------|
-     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn0|
-     * |-----------------------------------------------------------'
-     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
-     * `-----------------------------------------------------------'
-     */
-    [0] = KEYMAP(
-      KC_ESC, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSLS, KC_GRV, \
-      KC_TAB, KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC,KC_RBRC,KC_BSPC, \
-      KC_LCTL,KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,KC_ENT,  \
-      KC_LSFT,KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,MO(1), \
-      KC_NO,  KC_LGUI,KC_LALT,          KC_SPC,                KC_RALT,KC_RGUI,KC_NO, KC_NO),
-
-    /* Layer 1: HHKB mode (HHKB Fn)
-     * ,-----------------------------------------------------------.
-     * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
-     * |-----------------------------------------------------------|
-     * |Caps |   |   |   |   |   |   |   |Psc|Slk|Pus|Up |   |Backs|
-     * |-----------------------------------------------------------|
-     * |      |VoD|VoU|Mut|   |   |  *|  /|Hom|PgU|Lef|Rig|Enter   |
-     * |-----------------------------------------------------------|
-     * |        |   |   |   |   |   |  +|  -|End|PgD|Dow|      |   |
-     * `-----------------------------------------------------------'
-     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
-     * `-----------------------------------------------------------'
-     */ 
-    [1] = KEYMAP(
-      KC_PWR, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,   \
-      KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,      \
-      KC_TRNS,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_PENT,            \
-      KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_TRNS,KC_TRNS,            \
-      KC_TRNS,KC_TRNS,KC_TRNS,          KC_TRNS,               KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS),
-};
-
-const uint16_t fn_actions[] = {
-    
-};
-
diff --git a/keyboards/infinity_chibios/keymaps/depariel/keymap.c b/keyboards/infinity_chibios/keymaps/depariel/keymap.c
deleted file mode 100755 (executable)
index e68891f..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "infinity_chibios.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    /* Layer 0: Default Layer
-     * ,-----------------------------------------------------------.
-     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  \|  `|
-     * |-----------------------------------------------------------|
-     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]| Bksp|
-     * |-----------------------------------------------------------|
-     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
-     * |-----------------------------------------------------------|
-     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn2|
-     * |-----------------------------------------------------------'
-     * |Fn2 |Gui |Alt |         Space           |RAlt|Prv|PlPs|Next|
-     * `-----------------------------------------------------------'
-     */
-    [0] = KEYMAP(
-        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,            KC_BSLS,  KC_GRV, \
-        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,           KC_BSPC, \
-        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, LT(5, KC_ENT),  \
-        KC_LSPO, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSPC, MO(4), \
-        MO(4),   KC_LGUI, KC_LALT,               LT(3, KC_SPC),                 KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
-
-    /* Layer 1: "Toggle" off SpaceFn for League of Legends
-     */
-    [1] = KEYMAP(
-        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS,  KC_GRV, \
-        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, \
-        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  \
-        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, MO(4), \
-        MO(4),   KC_LGUI, KC_LALT,                   KC_SPC,                    KC_RALT, KC_MPRV, KC_MPLY, KC_MNXT),
-           
-    /* Layer 2: "Toggle" off SpaceFn for MapleRoyals
-     */
-    [2] = KEYMAP(
-        KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS,  KC_GRV, \
-        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, \
-        KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  \
-        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_UP,   KC_LSFT, \
-        MO(4),   KC_LGUI, KC_LALT,                   KC_SPC,                    KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT),
-
-    /* Layer 3: FN layer 1
-     */ 
-    [3] = KEYMAP(
-        KC_NO,           KC_F1,   KC_F2,   KC_F3,   KC_F4,          KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NO,   KC_NO,   \
-        KC_NO,           KC_BTN1, KC_MS_U, KC_BTN2, LALT(KC_F4),    KC_HOME, KC_PGUP, KC_PSCR, KC_SLCK, KC_UP,   KC_NO,   KC_LPRN, KC_RPRN, KC_DEL,      \
-        MO(6),           KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,          KC_END,  KC_PGDN, KC_TILD, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,           \
-        LGUI(KC_SPC),    KC_NO,   KC_NO,   KC_NO,   KC_NO,          KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_CALC, KC_MENU, KC_TRNS, TG(4),           \
-        KC_TRNS,         KC_TRNS, KC_TRNS,                       LT(3, KC_SPC),                KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU),
-    
-    /* Layer 4: FN layer 2
-     */ 
-    [4] = KEYMAP(
-        KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_PMNS, KC_PPLS, KC_PSLS, TG(2),   \
-        KC_CAPS, KC_NO,   KC_UP,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_PSCR, KC_NO,   KC_P7,   KC_P8,   KC_P9,   KC_PAST, KC_BSPC,      \
-        KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PENT,           \
-        KC_LSFT, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_RSFT, MO(4),           \
-        KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_P0,   KC_PDOT, KC_NO,   TG(1)),
-    
-    /* Layer 5: FN layer 3
-     */ 
-    [5] = KEYMAP(
-        KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,            KC_NO,   KC_NO,   \
-        KC_TAB , KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_NO,            KC_TRNS,      \
-        KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F17,  KC_F18,  KC_F19,  KC_F20,  LT(5, KC_ENT),           \
-        KC_TRNS, KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_F21,  KC_F22,  KC_F23,  KC_F24,  KC_TRNS, KC_TRNS,           \
-        KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_RALT, KC_NO,   KC_NO,  KC_NO),
-    
-    /* Layer 6: FN layer 4
-     */ 
-    [6] = KEYMAP(
-        KC_NO,                 KC_NO,            KC_NO,          KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   \
-        LCTL(LSFT(KC_TAB)),    KC_NO,            LGUI(KC_UP),    KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,      \
-        MO(6),                 LGUI(KC_LEFT),    LGUI(KC_DOWN),  LGUI(KC_RGHT),    KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,       \
-        KC_TRNS,               KC_NO,            KC_NO,          KC_NO,            KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   KC_TRNS, KC_TRNS,           \
-        KC_TRNS,               KC_TRNS,          KC_TRNS,                   KC_TRNS,                 KC_TRNS, KC_NO,   KC_NO,   KC_NO),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
diff --git a/keyboards/infinity_chibios/keymaps/hasu/keymap.c b/keyboards/infinity_chibios/keymaps/hasu/keymap.c
deleted file mode 100644 (file)
index a1954d2..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#include "infinity_chibios.h"
-
-const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    /* Layer 0: Default Layer
-     * ,-----------------------------------------------------------.
-     * |Esc|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|  `|BSp|
-     * |-----------------------------------------------------------|
-     * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|    \|
-     * |-----------------------------------------------------------|
-     * |Contro|  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Enter   |
-     * |-----------------------------------------------------------|
-     * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift |Fn0|
-     * |-----------------------------------------------------------'
-     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
-     * `-----------------------------------------------------------'
-     */
-    [0] = KEYMAP(
-        KC_ESC,    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,           KC_MINS,KC_EQL, KC_BSLS,KC_GRV, \
-        KC_TAB,    KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,           KC_LBRC,KC_RBRC,KC_BSPC, \
-        KC_LCTL,   KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   LT(3, KC_SCLN), KC_QUOT,MT(KC_RCTL, KC_ENT), \
-        OSM(MOD_LSFT), KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, LT(2, KC_SLSH), KC_RSFT,TG(1), \
-        KC_NO,     KC_LGUI,KC_LALT,         LT(4, KC_SPC),                 MO(4),  KC_RGUI,KC_NO,          KC_NO),
-
-    /* Layer 1: HHKB mode (HHKB Fn)
-     * ,-----------------------------------------------------------.
-     * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
-     * |-----------------------------------------------------------|
-     * |Caps |   |   |   |   |   |   |   |Psc|Slk|Pus|Up |   |Backs|
-     * |-----------------------------------------------------------|
-     * |      |VoD|VoU|Mut|   |   |  *|  /|Hom|PgU|Lef|Rig|Enter   |
-     * |-----------------------------------------------------------|
-     * |        |   |   |   |   |   |  +|  -|End|PgD|Dow|      |   |
-     * `-----------------------------------------------------------'
-     * |     |Gui|Alt  |         Space         |Alt  |Gui|   |     |
-     * `-----------------------------------------------------------'
-     */ 
-    [1] = KEYMAP(
-        KC_PWR, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, \
-        KC_CAPS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,  KC_TRNS,KC_BSPC, \
-        KC_LCTL,KC_VOLD,KC_VOLU,KC_MUTE,KC_TRNS,KC_TRNS,KC_PAST,KC_PSLS,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT,KC_ENT, \
-        KC_LSFT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PPLS,KC_PMNS,KC_END, KC_PGDN,KC_DOWN,KC_RSFT,KC_TRNS, \
-        KC_TRNS,KC_LGUI,KC_LALT,          KC_TRNS,                      KC_RALT,KC_RGUI,KC_TRNS,KC_TRNS),
-
-    /* Layer 2: Vi mode[Slash]
-     * ,-----------------------------------------------------------.
-     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
-     * |-----------------------------------------------------------|
-     * |Tab  |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd|   |   |   |Backs|
-     * |-----------------------------------------------------------|
-     * |Contro|   |Lef|Dow|Rig|   |Lef|Dow|Up |Rig|   |   |Return  |
-     * |-----------------------------------------------------------|
-     * |Shift   |   |   |   |   |   |Hom|PgD|PgUlEnd|Fn0|Shift |   |
-     * `-----------------------------------------------------------'
-     *       |Gui|Alt  |          Space        |Alt  |Gui|
-     *       `-------------------------------------------'
-     */
-    [2] = KEYMAP(
-        KC_GRV, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9,  KC_F10,         KC_F11, KC_F12, KC_INS, KC_DEL, \
-        KC_TAB, KC_HOME,KC_PGDN,KC_UP,  KC_PGUP,KC_END, KC_HOME,KC_PGDN,KC_PGUP,KC_END, KC_NO,          KC_NO,  KC_NO,  KC_BSPC, \
-        KC_LCTL,KC_NO,  KC_LEFT,KC_DOWN,KC_RGHT,KC_NO,  KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,KC_NO,          KC_NO,  KC_ENT, \
-        KC_LSFT,KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_HOME,KC_PGDN,KC_PGUP,KC_END, LT(2, KC_SLSH), KC_RSFT,KC_TRNS, \
-        KC_TRNS,KC_LGUI,KC_LALT,          KC_SPC,                       KC_RALT,KC_RGUI,KC_TRNS,        KC_TRNS),
-
-    /* Layer 3: Mouse mode(IJKL)[Semicolon]
-     * ,-----------------------------------------------------------.
-     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
-     * |-----------------------------------------------------------|
-     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
-     * |-----------------------------------------------------------|
-     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Fn |   |Return  |
-     * |-----------------------------------------------------------|
-     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   |
-     * `-----------------------------------------------------------'
-     *      |Gui |Alt  |          Mb1          |Fn   |Fn |
-     *      `--------------------------------------------'
-     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
-     */
-    [3] = KEYMAP(
-        KC_GRV,       KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,          KC_F9,          KC_F10,         KC_F11,         KC_F12,        KC_INS, KC_DEL, \
-        LALT(KC_TAB), KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_WH_L,KC_WH_D,KC_MS_U,        KC_WH_U,        KC_WH_R,        ALT_T(KC_LEFT), ALT_T(KC_RGHT),LALT(KC_TAB), \
-        KC_LCTL,      KC_ACL0,KC_ACL1,KC_ACL2,KC_ACL2,KC_NO,  KC_NO,  KC_MS_L,KC_MS_D,        KC_MS_R,        LT(3, KC_SCLN), KC_NO,          KC_ENT, \
-        KC_LSFT,      KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT), ALT_T(KC_RGHT), KC_NO,          KC_RSFT,        KC_TRNS, \
-        KC_TRNS,      KC_LGUI,KC_LALT,          KC_BTN1,                      KC_TRNS,        KC_TRNS,        KC_TRNS,        KC_TRNS),
-
-    /* Layer 4: Mouse mode(IJKL)[Space]
-     * ,-----------------------------------------------------------.
-     * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
-     * |-----------------------------------------------------------|
-     * |Tab  |   |   |   |   |   |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T|
-     * |-----------------------------------------------------------|
-     * |Contro|   |   |   |   |   |Mb2|McL|McD|McR|Mb1|   |Return  |
-     * |-----------------------------------------------------------|
-     * |Shift   |   |   |   |   |Mb3|Mb2|Mb1|Mb4|Mb5|   |Shift |   |
-     * `-----------------------------------------------------------'
-     *      |Gui |Alt  |          Mb1          |Fn   |Fn |
-     *      `--------------------------------------------'
-     * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
-     */
-    [4] = KEYMAP(
-        KC_GRV,       KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,         KC_F9,         KC_F10, KC_F11, KC_F12, KC_INS,       KC_DEL, \
-        LALT(KC_TAB), KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_WH_L,KC_WH_D,KC_MS_U,       KC_WH_U,       KC_WH_R,KC_BTN4,KC_BTN5,LALT(KC_TAB), \
-        KC_LCTL,      KC_VOLD,KC_VOLU,KC_MUTE,KC_NO,  KC_NO,  KC_NO,  KC_MS_L,KC_MS_D,       KC_MS_R,       KC_BTN1,KC_NO,  KC_ENT, \
-        KC_LSFT,      KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_BTN3,KC_BTN2,KC_BTN1,ALT_T(KC_LEFT),ALT_T(KC_RGHT),KC_NO,  KC_RSFT,KC_TRNS, \
-        KC_TRNS,      KC_LGUI,KC_LALT,          KC_TRNS,                      KC_TRNS,       KC_TRNS,       KC_TRNS,KC_TRNS),
-
-};
-
-/*
- * Fn action definition
- */
-const uint16_t fn_actions[] = {
-
-};
diff --git a/keyboards/infinity_chibios/led.c b/keyboards/infinity_chibios/led.c
deleted file mode 100644 (file)
index aed66c7..0000000
+++ /dev/null
@@ -1,24 +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/>.
-*/
-
-#include "hal.h"
-
-#include "led.h"
-
-
-void led_set(uint8_t usb_led) {
-}
diff --git a/keyboards/infinity_chibios/matrix.c b/keyboards/infinity_chibios/matrix.c
deleted file mode 100644 (file)
index 62c165a..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include "hal.h"
-#include "timer.h"
-#include "wait.h"
-#include "print.h"
-#include "matrix.h"
-
-
-/*
- * Infinity Pinusage:
- * Column pins are input with internal pull-down. Row pins are output and strobe with high.
- * Key is high or 1 when it turns on.
- *  INFINITY PRODUCTION (NO LED)
- *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
- *     row: { PTB0, PTB1, PTB2, PTB3, PTB16, PTB17, PTC4, PTC5, PTD0 }
- *  INFINITY PRODUCTION (WITH LED)
- *     col: { PTD1, PTD2, PTD3, PTD4, PTD5, PTD6, PTD7 }
- *     row: { PTC0, PTC1, PTC2, PTC3, PTC4, PTC5, PTC6, PTC7, PTD0 }
- */
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-static bool debouncing = false;
-static uint16_t debouncing_time = 0;
-
-
-void matrix_init(void)
-{
-    /* Column(sense) */
-    palSetPadMode(GPIOD, 1,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 2,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 3,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 4,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 5,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 6,  PAL_MODE_INPUT_PULLDOWN);
-    palSetPadMode(GPIOD, 7,  PAL_MODE_INPUT_PULLDOWN);
-
-#ifdef INFINITY_LED
-    /* Row(strobe) */
-    palSetPadMode(GPIOC, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 1,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 2,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 3,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 6,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 7,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-#else
-    /* Row(strobe) */
-    palSetPadMode(GPIOB, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 1,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 2,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 3,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 4,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOC, 5,  PAL_MODE_OUTPUT_PUSHPULL);
-    palSetPadMode(GPIOD, 0,  PAL_MODE_OUTPUT_PUSHPULL);
-#endif
-    memset(matrix, 0, MATRIX_ROWS);
-    memset(matrix_debouncing, 0, MATRIX_ROWS);
-}
-
-uint8_t matrix_scan(void)
-{
-    for (int row = 0; row < MATRIX_ROWS; row++) {
-        matrix_row_t data = 0;
-    #ifdef INFINITY_LED
-        // strobe row
-        switch (row) {
-            case 0: palSetPad(GPIOC, 0);    break;
-            case 1: palSetPad(GPIOC, 1);    break;
-            case 2: palSetPad(GPIOC, 2);    break;
-            case 3: palSetPad(GPIOC, 3);    break;
-            case 4: palSetPad(GPIOC, 4);    break;
-            case 5: palSetPad(GPIOC, 5);    break;
-            case 6: palSetPad(GPIOC, 6);    break;
-            case 7: palSetPad(GPIOC, 7);    break;
-            case 8: palSetPad(GPIOD, 0);    break;
-        }
-    #else
-        // strobe row
-        switch (row) {
-            case 0: palSetPad(GPIOB, 0);    break;
-            case 1: palSetPad(GPIOB, 1);    break;
-            case 2: palSetPad(GPIOB, 2);    break;
-            case 3: palSetPad(GPIOB, 3);    break;
-            case 4: palSetPad(GPIOB, 16);   break;
-            case 5: palSetPad(GPIOB, 17);   break;
-            case 6: palSetPad(GPIOC, 4);    break;
-            case 7: palSetPad(GPIOC, 5);    break;
-            case 8: palSetPad(GPIOD, 0);    break;
-        }
-    #endif
-
-        wait_us(1); // need wait to settle pin state
-
-        // read col data
-        data = (palReadPort(GPIOD)>>1);
-    #ifdef INFINITY_LED
-        // un-strobe row
-        switch (row) {
-            case 0: palClearPad(GPIOC, 0);    break;
-            case 1: palClearPad(GPIOC, 1);    break;
-            case 2: palClearPad(GPIOC, 2);    break;
-            case 3: palClearPad(GPIOC, 3);    break;
-            case 4: palClearPad(GPIOC, 4);    break;
-            case 5: palClearPad(GPIOC, 5);    break;
-            case 6: palClearPad(GPIOC, 6);    break;
-            case 7: palClearPad(GPIOC, 7);    break;
-            case 8: palClearPad(GPIOD, 0);    break;
-        }
-    #else
-        // un-strobe row
-        switch (row) {
-            case 0: palClearPad(GPIOB, 0);    break;
-            case 1: palClearPad(GPIOB, 1);    break;
-            case 2: palClearPad(GPIOB, 2);    break;
-            case 3: palClearPad(GPIOB, 3);    break;
-            case 4: palClearPad(GPIOB, 16);   break;
-            case 5: palClearPad(GPIOB, 17);   break;
-            case 6: palClearPad(GPIOC, 4);    break;
-            case 7: palClearPad(GPIOC, 5);    break;
-            case 8: palClearPad(GPIOD, 0);    break;
-        }
-    #endif
-
-        if (matrix_debouncing[row] != data) {
-            matrix_debouncing[row] = data;
-            debouncing = true;
-            debouncing_time = timer_read();
-        }
-    }
-
-    if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
-        for (int row = 0; row < MATRIX_ROWS; row++) {
-            matrix[row] = matrix_debouncing[row];
-        }
-        debouncing = false;
-    }
-    return 1;
-}
-
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
-    return (matrix[row] & (1<<col));
-}
-
-matrix_row_t matrix_get_row(uint8_t row)
-{
-    return matrix[row];
-}
-
-void matrix_print(void)
-{
-    xprintf("\nr/c 01234567\n");
-    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
-        xprintf("%02X: ");
-        matrix_row_t data = matrix_get_row(row);
-        for (int col = 0; col < MATRIX_COLS; col++) {
-            if (data & (1<<col))
-                xprintf("1");
-            else
-                xprintf("0");
-        }
-        xprintf("\n");
-    }
-}
diff --git a/keyboards/infinity_chibios/mcuconf.h b/keyboards/infinity_chibios/mcuconf.h
deleted file mode 100644 (file)
index 66b6ce2..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*\r
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio\r
-\r
-    Licensed under the Apache License, Version 2.0 (the "License");\r
-    you may not use this file except in compliance with the License.\r
-    You may obtain a copy of the License at\r
-\r
-        http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-    Unless required by applicable law or agreed to in writing, software\r
-    distributed under the License is distributed on an "AS IS" BASIS,\r
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-    See the License for the specific language governing permissions and\r
-    limitations under the License.\r
-*/\r
-\r
-#ifndef _MCUCONF_H_\r
-#define _MCUCONF_H_\r
-\r
-#define K20x_MCUCONF\r
-\r
-/*\r
- * HAL driver system settings.\r
- */\r
-\r
-/* Select the MCU clocking mode below by enabling the appropriate block. */\r
-\r
-#define KINETIS_NO_INIT             FALSE\r
-\r
-/* FEI mode - 48 MHz with internal 32.768 kHz crystal */\r
-#define KINETIS_MCG_MODE            KINETIS_MCG_MODE_FEI\r
-#define KINETIS_MCG_FLL_DMX32       1           /* Fine-tune for 32.768 kHz */\r
-#define KINETIS_MCG_FLL_DRS         1           /* 1464x FLL factor */\r
-#define KINETIS_SYSCLK_FREQUENCY    47972352UL  /* 32.768 kHz * 1464 (~48 MHz) */\r
-#define KINETIS_CLKDIV1_OUTDIV1     1\r
-#define KINETIS_CLKDIV1_OUTDIV2     1\r
-#define KINETIS_CLKDIV1_OUTDIV4     2\r
-#define KINETIS_BUSCLK_FREQUENCY    KINETIS_SYSCLK_FREQUENCY\r
-#define KINETIS_FLASHCLK_FREQUENCY  KINETIS_SYSCLK_FREQUENCY/2\r
-\r
-/*\r
- * SERIAL driver system settings.\r
- */\r
-#define KINETIS_SERIAL_USE_UART0            TRUE\r
-\r
-/*\r
- * USB driver settings\r
- */\r
-#define KINETIS_USB_USE_USB0                TRUE\r
-/* Need to redefine this, since the default is for K20x */\r
-/* This is for Teensy LC; you should comment it out (or change to 5)\r
- * for Teensy 3.x */\r
-#define KINETIS_USB_USB0_IRQ_PRIORITY       2\r
-\r
-#endif /* _MCUCONF_H_ */\r
diff --git a/keyboards/jd40/Makefile b/keyboards/jd40/Makefile
new file mode 100644 (file)
index 0000000..2427481
--- /dev/null
@@ -0,0 +1,74 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
+# CONSOLE_ENABLE ?= yes                # Console for debug(+400)
+# COMMAND_ENABLE ?= yes                # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES                   # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= yes          # Enable RGB Underglow
+
+ifndef QUANTUM_DIR
+       include ../../Makefile
+endif
+
diff --git a/keyboards/jd40/config.h b/keyboards/jd40/config.h
new file mode 100644 (file)
index 0000000..e2594f4
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID    0xFEED
+#define PRODUCT_ID   0x6060
+#define DEVICE_VER   0x0001
+#define MANUFACTURER    geekhack
+#define PRODUCT         jd40v2
+#define DESCRIPTION     t.m.k. keyboard firmware for JD40 MKII
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+#define MATRIX_ROW_PINS { F0, F1, F5, B4 }
+#define MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+#define RGB_DI_PIN D3
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 12         // Number of LEDs
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+#endif
diff --git a/keyboards/jd40/jd40.c b/keyboards/jd40/jd40.c
new file mode 100644 (file)
index 0000000..fa06356
--- /dev/null
@@ -0,0 +1,26 @@
+#include "jd40.h"
+
+void led_set_kb(uint8_t usb_led) {
+       // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+       
+
+  //  if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+       //      gh60_caps_led_on();
+       //      } else {
+       //      gh60_caps_led_off(); 
+  //  }
+       
+    // if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+               // gh60_esc_led_on();
+               // } else {
+               // gh60_esc_led_off(); 
+    // }
+       
+    // if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+               // gh60_fn_led_on();
+               // } else {
+               // gh60_fn_led_off();   
+    // }
+
+       led_set_user(usb_led);  
+}
diff --git a/keyboards/jd40/jd40.h b/keyboards/jd40/jd40.h
new file mode 100644 (file)
index 0000000..77a1222
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef JD40_H
+#define JD40_H
+
+#include "quantum.h"
+#include "led.h"
+
+/* GH60 LEDs 
+ *   GPIO pads
+ *   0 F7 WASD LEDs
+ *   1 F6 ESC LED
+ *   2 F5 FN LED
+ *   3 F4 POKER Arrow LEDs
+ *   B2 Capslock LED
+ *   B0 not connected
+ */
+ /*
+inline void gh60_caps_led_on(void)      { DDRB |=  (1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_on(void)    { DDRF |=  (1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_on(void)       { DDRF |=  (1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_on(void)      { DDRF |=  (1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_on(void)            { DDRF |=  (1<<7); PORTF &= ~(1<<7); }
+
+inline void gh60_caps_led_off(void)     { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_off(void)   { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_off(void)      { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_off(void)     { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_off(void)           { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
+*/
+
+/* JD40 MKII keymap definition macro
+ */
+#define KEYMAP( \
+    K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, \
+       K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, \
+       K24, K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, \
+       K35, K36, K37, K38, K39, K40, K41, K42, K43, K44 \
+) { \
+    { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12 }, \
+    { KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_NO    }, \
+    { KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_NO    }, \
+    { KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_NO,    KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_NO    }  \
+}
+
+#endif
diff --git a/keyboards/jd40/keymaps/default/keymap.c b/keyboards/jd40/keymaps/default/keymap.c
new file mode 100644 (file)
index 0000000..79ac146
--- /dev/null
@@ -0,0 +1,164 @@
+#include "jd40.h"
+#include "action_layer.h"
+
+#define _BL 0
+#define _AL 1
+#define _FL 2
+#define _UL 3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+       [_BL] = KEYMAP(
+  F12,  Q,    W,    E,    R,    T,    Y,    U,    I,    O,    P,   BSPC,
+  TAB,  A,    S,    D,    F,    G,    H,    J,    K,    L,    ENT,
+  LSFT, Z,    X,    C,    V,    B,    N,    M,    COMM, UP, DOT,
+  LCTL, LGUI, LALT, FN0,  SPC,  SPC,  FN0,  LEFT,  DOWN, RIGHT ),
+  
+       [_AL] = KEYMAP(
+  GRV,   F1,   F2,   F3,   F4,   F5,   F6,   F7,   F8,   F9,  F10,  DEL,
+  CAPS, 1,    2,    3,    4,    5,    6,    7,    8,    9,    0,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, SCLN, PGUP, QUOT,
+  TRNS, TRNS, TRNS, TRNS, FN3,  FN3,  TRNS, HOME, PGDN, END ),
+
+       [_FL] = KEYMAP(
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ),
+   
+       [_UL] = KEYMAP(
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, FN4,  FN5,  FN11, FN10, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+  TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS ),
+};
+
+enum function_id {
+    RGBLED_TOGGLE,
+    RGBLED_STEP_MODE,
+    RGBLED_INCREASE_HUE,
+    RGBLED_DECREASE_HUE,
+    RGBLED_INCREASE_SAT,
+    RGBLED_DECREASE_SAT,
+    RGBLED_INCREASE_VAL,
+    RGBLED_DECREASE_VAL,
+    SHIFT_ESC, 
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+    [0]  = ACTION_LAYER_MOMENTARY(1),  // Momentary Fn overlay
+    [1]  = ACTION_LAYER_TOGGLE(2),     // Toggle Arrow Layer overlay
+    [2]  = ACTION_LAYER_TAP_KEY(2, KC_CAPS), // Tap to toggle caps lock and hold to activate function layer
+    [3]  = ACTION_LAYER_TOGGLE(3),     // Toggle Underglow Layer overlay
+    [4]  = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
+    [5]  = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
+    [6]  = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
+    [7]  = ACTION_FUNCTION(RGBLED_DECREASE_HUE),
+    [8]  = ACTION_FUNCTION(RGBLED_INCREASE_SAT),
+    [9]  = ACTION_FUNCTION(RGBLED_DECREASE_SAT),
+    [10] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
+    [11] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
+    [12] = ACTION_FUNCTION(SHIFT_ESC),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+  // MACRODOWN only works in this function 
+      switch(id) {
+        case 0:
+          if (record->event.pressed) {
+            register_code(KC_RSFT);
+          } else {
+            unregister_code(KC_RSFT);
+          }
+        break;
+      }
+    return MACRO_NONE;
+};
+
+void matrix_scan_user(void) {
+
+// Layer LED indicators
+// ESC led on when in function layer, WASD cluster leds enabled when on arrow cluster
+    uint32_t layer = layer_state;
+    if (layer & (1<<1)) {
+        //gh60_wasd_leds_on();
+    } else {
+        //gh60_wasd_leds_off();
+    }
+
+    if (layer & (1<<2)) {
+        //gh60_esc_led_on();
+    } else {
+        //gh60_esc_led_off();
+    }
+};
+
+#define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
+  switch (id) {
+    case RGBLED_TOGGLE:
+      //led operations
+      if (record->event.pressed) {
+        rgblight_toggle();
+        }
+        break;
+    case RGBLED_INCREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_increase_hue();
+        }
+        break;
+    case RGBLED_DECREASE_HUE:
+      if (record->event.pressed) {
+        rgblight_decrease_hue();
+        }
+        break;
+    case RGBLED_INCREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_increase_sat();
+        }
+        break;
+    case RGBLED_DECREASE_SAT:
+      if (record->event.pressed) {
+        rgblight_decrease_sat();
+        }
+        break;
+    case RGBLED_INCREASE_VAL:
+        if (record->event.pressed) {
+          rgblight_increase_val();
+        }
+        break;
+    case RGBLED_DECREASE_VAL:
+        if (record->event.pressed) {
+          rgblight_decrease_val();
+        }
+        break;
+    case RGBLED_STEP_MODE:
+        if (record->event.pressed) {
+          rgblight_step();
+        }
+        break;
+    static uint8_t shift_esc_shift_mask;
+    // Shift + ESC = ~
+    case SHIFT_ESC:
+      shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
+      if (record->event.pressed) {
+        if (shift_esc_shift_mask) {
+          add_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          add_key(KC_ESC);
+          send_keyboard_report();
+        }
+      } else {
+        if (shift_esc_shift_mask) {
+          del_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          del_key(KC_ESC);
+          send_keyboard_report();
+        }
+      }
+      break;
+    }
+};
diff --git a/keyboards/jd40/readme.md b/keyboards/jd40/readme.md
new file mode 100644 (file)
index 0000000..7daa098
--- /dev/null
@@ -0,0 +1,17 @@
+## jd40 mkii keyboard firmware
+
+    Pins:
+    MATRIX_ROW_PINS { F0, F1, F5, B4 }
+    MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2 }
+    RGB_DI_PIN D3      
+       
+======================
+
+## Quantum MK Firmware
+
+For the full Quantum feature list, see [the parent readme.md](/readme.md).
+
+## Building
+
+Download or clone the whole firmware and navigate to the keyboards/jd40 folder. 
+Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Amtel Flip to program your .hex file. 
diff --git a/keyboards/jd40/rules.mk b/keyboards/jd40/rules.mk
new file mode 100644 (file)
index 0000000..2f18fdf
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
+# CONSOLE_ENABLE ?= yes                # Console for debug(+400)
+# COMMAND_ENABLE ?= yes                # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+# MIDI_ENABLE ?= YES                   # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= yes          # Enable RGB Underglow
\ No newline at end of file
index 75d544f16aa8e07d059adef8c5c75aa8f321b797..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,71 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
-# NKRO_ENABLE ?= yes           # USB Nkey Rollover - not yet supported in LUFA
-BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
-MIDI_ENABLE ?= YES             # MIDI controls
-# UNICODE_ENABLE ?= YES                # Unicode
-BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/jd45/rules.mk b/keyboards/jd45/rules.mk
new file mode 100644 (file)
index 0000000..2f1e266
--- /dev/null
@@ -0,0 +1,67 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE ?= yes  # Breathing sleep LED during USB suspend
+# NKRO_ENABLE ?= yes           # USB Nkey Rollover - not yet supported in LUFA
+BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality
+MIDI_ENABLE ?= YES             # MIDI controls
+# UNICODE_ENABLE ?= YES                # Unicode
+BLUETOOTH_ENABLE ?= yes # Enable Bluetooth with the Adafruit EZ-Key HID
\ No newline at end of file
index 0d17d32dac89751c375f8f79205f0270b4053f97..57b2ef62e5f3a43b7338f789a5d4800c577b763d 100644 (file)
@@ -1,77 +1,3 @@
-# project specific files
-SRC = led.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-KEYBOARD_LOCK_ENABLE ?= yes  # Allow locking of keyboard via magic key
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
-
index c4a9b9ff82de09de25d5d22051c0f82a5c5de303..29695d0b9d74a93eecca350d12e12cd3db5ad2a0 100644 (file)
@@ -62,7 +62,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define MATRIX_HAS_GHOST
 
 /* number of backlight levels */
-#define BACKLIGHT_LEVELS 3
+#define BACKLIGHT_LEVELS 5
 
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 #define LOCKING_SUPPORT_ENABLE
index e17827fad9c3ffc1c35d9f009e24e6ea8587369d..1b645ea938e9364630b72bfe58707be9c89f4c25 100644 (file)
@@ -34,9 +34,9 @@ const uint16_t PROGMEM fn_actions[] = {
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* Qwerty
  * ,-----------------------------------------------------------------------------------------.
- * | Esc |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |  -  |  =  |  `  | Bksp|
+ * | Esc |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  |  -  |  =  |  \  |  `  |
  * |-----------------------------------------------------------------------------------------+
- * | Tab    |  Q  |  W  |  E  |  R  |  T  |  Y  |  U  |  I  |  O  |  P  |  [  |  ]  |   \    |
+ * | Tab    |  Q  |  W  |  E  |  R  |  T  |  Y  |  U  |  I  |  O  |  P  |  [  |  ]  |  Bksp  |
  * |-----------------------------------------------------------------------------------------+
  * | Caps/FN1|  A  |  S  |  D  |  F  |  G  |  H  |  J  |  K  |  L  |  ;  |  '  |    Enter    |
  * |-----------------------------------------------------------------------------------------+
@@ -46,11 +46,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  * `-----------------------------------------------------------------------------------------'
  */
   [0] = KEYMAP( /* Basic QWERTY */
-      KC_ESC,   KC_1,     KC_2,     KC_3,    KC_4,     KC_5,     KC_6,     KC_7,    KC_8,  KC_9,     KC_0,     KC_MINS,  KC_EQL,   KC_GRV,  \
-      KC_TAB,   KC_Q,     KC_W,     KC_E,    KC_R,     KC_T,     KC_Y,     KC_U,    KC_I,  KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSLS,  \
+      KC_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_TAB,   KC_Q,     KC_W,     KC_E,    KC_R,     KC_T,     KC_Y,     KC_U,    KC_I,  KC_O,     KC_P,     KC_LBRC,  KC_RBRC,  KC_BSPC,  \
       LT(_FNCAPS, KC_CAPS),  KC_A,     KC_S,     KC_D,    KC_F,     KC_G,     KC_H,     KC_J,    KC_K,  KC_L,     KC_SCLN,  KC_QUOT,  KC_NO,    KC_ENT,   \
       KC_LSFT,  KC_NO,    KC_Z,     KC_X,    KC_C,     KC_V,     KC_B,     KC_N,    KC_M,  KC_COMM,  KC_DOT,   KC_SLSH,  MO(_FNRIGHTSHIFT),  KC_UP,  \
-      KC_LCTL,  KC_LGUI,  KC_LALT,  KC_SPC,  KC_BSPC,  KC_RALT,  KC_LEFT, KC_DOWN, KC_RIGHT \
+      KC_LCTL,  KC_LGUI,  KC_LALT,  KC_SPC,  KC_GRV,  KC_RALT,  KC_LEFT, KC_DOWN, KC_RIGHT \
       ),
 
 /* Layer 1
diff --git a/keyboards/kc60/keymaps/workman-dead/README.md b/keyboards/kc60/keymaps/workman-dead/README.md
deleted file mode 100644 (file)
index f1fcdc9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-# Workman dead with spacefn (kc60 @ QMK)
-
-## Layout reference
-![workman dead with spacefn](./kc60-wm-dead.png)
-
-## Build
-
-To build this keymap, simply run `make KEYMAP=workman-dead`.
-
-## Notes
-
-* the default layout is `workman` (try it out, it's awesome!), but it can be changed to `qwerty` with the `rebel` key (the function layer won't change though)
-* `comma` acts as a dead key, that means tapping/holding it will activate the **oneshot** `dead key` layer (marked red in the reference)
-* hold `space` to access the `function` layer (marked blue in the reference)
-* hold `tab` to activate the mouse layer
-* the `function` layer contains mostly osx specific shortcuts
-* on the right side of the bottom row `alt` and `super` are switched compared to a standard layout
index 9786e37d8ce132eb70ef3bd4325a215ed3c7b7fe..9e3b9bb656a80a3287c4be898e17957eec70b80b 100644 (file)
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_TABM,          KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \
   KC_LCTL,          KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    KC_QUOT, _______, KC_ENT,  \
   KC_LSFT, _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    DK_ACT,  KC_DOT,  KC_SLSH,          _______, KC_RSFT, \
-  KC_LCTL, KC_LALT, KC_LGUI,                   KC_SPFN,          KC_NO,   KC_RALT, KC_RGUI, KC_RCTL, KC_DFQW),
+  KC_LCTL, KC_LALT, KC_LGUI,                   KC_SPFN,          _______, KC_RALT, KC_RGUI, KC_RCTL, KC_DFQW),
 
 // QWERTY
 /*
@@ -77,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_TABM,          KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, \
   KC_LCTL,          KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, _______, KC_ENT,  \
   KC_LSFT, _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    DK_ACT,  KC_DOT,  KC_SLSH,          _______, KC_RSFT, \
-  KC_LCTL, KC_LALT, KC_LGUI,                   KC_SPFN,          KC_NO,   KC_RALT, KC_RGUI, KC_RCTL, KC_DOWN),
+  KC_LCTL, KC_LALT, KC_LGUI,                   KC_SPFN,          _______, KC_RALT, KC_RGUI, KC_RCTL, KC_DFWM),
 
 // dead key layer
 /*
@@ -98,7 +98,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   XXXXXXX,          KC_PERC, KC_AMPR, KC_QUES, KC_PLUS, KC_AT,   KC_DLR,  KC_UNDS, KC_LBRC, KC_RBRC, KC_EXLM, KC_TILD, KC_CIRC, _______, \
   _______,          KC_HASH, KC_LPRN, KC_EQL,  KC_0,    KC_LCBR, KC_RCBR, KC_1,    KC_ASTR, KC_RPRN, KC_MINS, KC_GRV,  _______, KC_CENT, \
   _______, _______, KC_6,    KC_7,    KC_8,    KC_9,    KC_PIPE, KC_BSLS, KC_2,    DK_REL,  KC_4,    KC_5,             _______, _______, \
-  KC_LCTL, KC_LALT, KC_LGUI,                   KC_COMS,          KC_NO,   KC_RALT, KC_RGUI, KC_RCTL, _______),
+  KC_LCTL, KC_LALT, KC_LGUI,                   KC_COMS,          _______, KC_RALT, KC_RGUI, KC_RCTL, _______),
 
 // function layer
 /*
@@ -119,7 +119,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   KC_ESC,           KC_CMDQ, KC_CMDD, KC_CSTB, KC_C_TB, _______, _______, KC_PGDN, KC_UP,   KC_PGUP, _______, _______, _______, KC_INS,  \
   KC_LSFT,          KC_CMDA, KC_CMDS, KC_C_LF, KC_C_RT, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_HOME, KC_END,  _______, KC_BSPC, \
   KC_LSFT, _______, KC_CMDZ, KC_CMDX, _______, KC_CMDC, KC_CMDV, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______,          _______, _______, \
-  KC_LCTL, KC_LALT, KC_LGUI,                   KC_TRNS,          KC_NO,   KC_RALT, KC_RGUI, KC_RCTL, RESET),
+  KC_LCTL, KC_LALT, KC_LGUI,                   KC_TRNS,          _______, KC_RALT, KC_RGUI, KC_RCTL, RESET),
 
 // mouse layer
 /*
diff --git a/keyboards/kc60/keymaps/workman-dead/readme.md b/keyboards/kc60/keymaps/workman-dead/readme.md
new file mode 100644 (file)
index 0000000..f1fcdc9
--- /dev/null
@@ -0,0 +1,17 @@
+# Workman dead with spacefn (kc60 @ QMK)
+
+## Layout reference
+![workman dead with spacefn](./kc60-wm-dead.png)
+
+## Build
+
+To build this keymap, simply run `make KEYMAP=workman-dead`.
+
+## Notes
+
+* the default layout is `workman` (try it out, it's awesome!), but it can be changed to `qwerty` with the `rebel` key (the function layer won't change though)
+* `comma` acts as a dead key, that means tapping/holding it will activate the **oneshot** `dead key` layer (marked red in the reference)
+* hold `space` to access the `function` layer (marked blue in the reference)
+* hold `tab` to activate the mouse layer
+* the `function` layer contains mostly osx specific shortcuts
+* on the right side of the bottom row `alt` and `super` are switched compared to a standard layout
index b29c6be302879c615a59bb789590e986502b9b68..da84f6159afef6516686c6e319a9e17d08213a06 100644 (file)
@@ -10,25 +10,27 @@ Download or clone the whole firmware and navigate to the keyboards/kc60 folder.
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
+
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
 
 ## WS2812 Support
 ![Image of KC60 with RGB Underglow](keymaps/ws2812/ws2812_example.jpg)
 
-Build with WS2812 Support by running `make KEYMAP=ws2812`.
+Build with WS2812 Support by running `make ws2812`.
 
 ## Warning
 For those who want to use 2x1U instead of classic backspace you need to use K0D and K49 like this:
 * K0D represents the key at the right of =.
 * K49 represents the last key of the row (is wired at the right of the space key on the PCB)
 
-In kc60.h I've put several definitions' examples of possible layouts proposed by online editor (http://123.57.250.164:9128/).
\ No newline at end of file
+In kc60.h I've put several definitions' examples of possible layouts proposed by online editor (http://123.57.250.164:9128/).
diff --git a/keyboards/kc60/rules.mk b/keyboards/kc60/rules.mk
new file mode 100644 (file)
index 0000000..a935ed1
--- /dev/null
@@ -0,0 +1,71 @@
+# project specific files
+SRC = led.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+KEYBOARD_LOCK_ENABLE ?= yes  # Allow locking of keyboard via magic key
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
index ca077e63662065c94c8c87adfa2ff51531b2d6fa..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,79 +1,3 @@
-
-## Project specific files
-
-SRC=  matrix.c 
-
-# MCU name
-MCU = at90usb1286
-#MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=1024
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no        # Console for debug(+400)
-COMMAND_ENABLE ?= no
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no # Audio output should be port E6, current quantum library hardcodes C6, which we use for programming
-CUSTOM_MATRIX=yes # need to do our own thing with the matrix
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
index a990f9cb997437d82a3baa90e21b0d04eae3d2e3..79c86581e6930c7bdf5121080ea16c2c2ec8d1d2 100644 (file)
@@ -27,16 +27,16 @@ Depending on which keymap you would like to use, you will have to compile slight
 
 ### Default
 
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
 ```
-$ make keymap=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 
 Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
diff --git a/keyboards/kinesis/rules.mk b/keyboards/kinesis/rules.mk
new file mode 100644 (file)
index 0000000..a4a2b7d
--- /dev/null
@@ -0,0 +1,73 @@
+
+## Project specific files
+
+SRC=  matrix.c 
+
+# MCU name
+MCU = at90usb1286
+#MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=1024
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no        # Console for debug(+400)
+COMMAND_ENABLE ?= no
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output should be port E6, current quantum library hardcodes C6, which we use for programming
+CUSTOM_MATRIX=yes # need to do our own thing with the matrix
index 3b5585ed6f89bd7fd4010e24dccfc9ad0742a358..57b2ef62e5f3a43b7338f789a5d4800c577b763d 100644 (file)
@@ -1,77 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u2
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-       OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-CUSTOM_MATRIX = yes
-SRC += matrix.c
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
-
diff --git a/keyboards/kitten_paw/rules.mk b/keyboards/kitten_paw/rules.mk
new file mode 100644 (file)
index 0000000..b0c909d
--- /dev/null
@@ -0,0 +1,72 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u2
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+       OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
+
+CUSTOM_MATRIX = yes
+SRC += matrix.c
index b9f07636be0c25186f1fd745e46c040003b31e8d..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,78 +1,3 @@
-SRC += matrix.c \
-          i2c.c \
-          split_util.c \
-          serial.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= yes           # Audio output on port C6
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
-
-CUSTOM_MATRIX = yes
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index ec99514aa37ba08ace4eab83a38ba93c9650d15e..f4d900accbe410f98c13b00bba935d4577344bcc 100644 (file)
@@ -41,6 +41,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // #define USE_I2C
 
+// Use serial if not using I2C
+#ifndef USE_I2C
+#  define USE_SERIAL
+#endif
+
 // #define EE_HANDS
 
 #define I2C_MASTER_LEFT
@@ -94,4 +99,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
 
-#endif
\ No newline at end of file
+#endif
index c72789403e558eb7288b1852d6a96ff47842910f..084c890c405fa6f7ebfc1be7a699e3d120e5c482 100644 (file)
@@ -6,6 +6,8 @@
 #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.
@@ -157,3 +159,4 @@ ISR(TWI_vect) {
   // 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/lets_split/keymaps/i2c/config.h b/keyboards/lets_split/keymaps/i2c/config.h
new file mode 100644 (file)
index 0000000..2671fab
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x3060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Wootpatoot
+#define PRODUCT         Lets Split
+#define DESCRIPTION     A split keyboard for the cheap makers
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 6
+
+// wiring of each half
+#define MATRIX_ROW_PINS { B5, B4, E6, D7 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
+
+#define CATERINA_BOOTLOADER
+
+#define USE_I2C
+
+// Use serial if not using I2C
+#ifndef USE_I2C
+#  define USE_SERIAL
+#endif
+
+// #define EE_HANDS
+
+#define I2C_MASTER_LEFT
+// #define I2C_MASTER_RIGHT
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+// #define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D4
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/lets_split/keymaps/i2c/keymap.c b/keyboards/lets_split/keymaps/i2c/keymap.c
new file mode 100644 (file)
index 0000000..0d2d94b
--- /dev/null
@@ -0,0 +1,214 @@
+#include "lets_split.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum custom_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  LOWER,
+  RAISE,
+  ADJUST,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \
+  KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = KEYMAP( \
+  KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \
+  KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |     |    \  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = KEYMAP( \
+  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = KEYMAP( \
+  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] =  KEYMAP( \
+  _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+  _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+
+
+};
+
+#ifdef AUDIO_ENABLE
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+#endif
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case ADJUST:
+      if (record->event.pressed) {
+        layer_on(_ADJUST);
+      } else {
+        layer_off(_ADJUST);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
\ No newline at end of file
diff --git a/keyboards/lets_split/keymaps/serial/config.h b/keyboards/lets_split/keymaps/serial/config.h
new file mode 100644 (file)
index 0000000..f4d900a
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x3060
+#define DEVICE_VER      0x0001
+#define MANUFACTURER    Wootpatoot
+#define PRODUCT         Lets Split
+#define DESCRIPTION     A split keyboard for the cheap makers
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 6
+
+// wiring of each half
+#define MATRIX_ROW_PINS { B5, B4, E6, D7 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
+
+#define CATERINA_BOOTLOADER
+
+// #define USE_I2C
+
+// Use serial if not using I2C
+#ifndef USE_I2C
+#  define USE_SERIAL
+#endif
+
+// #define EE_HANDS
+
+#define I2C_MASTER_LEFT
+// #define I2C_MASTER_RIGHT
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+// #define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D4
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 8     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/lets_split/keymaps/serial/keymap.c b/keyboards/lets_split/keymaps/serial/keymap.c
new file mode 100644 (file)
index 0000000..0d2d94b
--- /dev/null
@@ -0,0 +1,214 @@
+#include "lets_split.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum custom_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  LOWER,
+  RAISE,
+  ADJUST,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = KEYMAP( \
+  KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \
+  KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \
+  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = KEYMAP( \
+  KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC, \
+  KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \
+  KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \
+  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |     |    \  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = KEYMAP( \
+  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = KEYMAP( \
+  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
+  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \
+  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] =  KEYMAP( \
+  _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+  _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+
+
+};
+
+#ifdef AUDIO_ENABLE
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+#endif
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case ADJUST:
+      if (record->event.pressed) {
+        layer_on(_ADJUST);
+      } else {
+        layer_off(_ADJUST);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
\ No newline at end of file
index 574c116a75463358cb61b7df14e55729b61223fa..c505d3a6e317630df35f0d166a77bf4de841f11e 100644 (file)
@@ -24,7 +24,9 @@ void matrix_init_kb(void) {
 };
 
 void shutdown_user(void) {
-    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
-    _delay_ms(150);
-    stop_all_notes();
+    #ifdef AUDIO_ENABLE
+        PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+       _delay_ms(150);
+       stop_all_notes();
+    #endif
 }
index 1d768c59b32ed8e4c53a9ccf9d122fa05b28f7a4..13896900421f0654f29e75f46f9eeddc22ea1015 100644 (file)
@@ -28,14 +28,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "util.h"
 #include "matrix.h"
-#include "i2c.h"
-#include "serial.h"
 #include "split_util.h"
 #include "pro_micro.h"
 #include "config.h"
 
+#ifdef USE_I2C
+#  include "i2c.h"
+#else // USE_SERIAL
+#  include "serial.h"
+#endif
+
 #ifndef DEBOUNCE
-#   define DEBOUNCE    5
+#  define DEBOUNCE     5
 #endif
 
 #define ERROR_DISCONNECT_COUNT 5
@@ -145,6 +149,8 @@ uint8_t _matrix_scan(void)
     return 1;
 }
 
+#ifdef USE_I2C
+
 // Get rows from other half over i2c
 int i2c_transaction(void) {
     int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
@@ -176,7 +182,8 @@ i2c_error: // the cable is disconnceted, or something else went wrong
     return 0;
 }
 
-#ifndef USE_I2C
+#else // USE_SERIAL
+
 int serial_transaction(void) {
     int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
 
@@ -199,7 +206,7 @@ uint8_t matrix_scan(void)
 
 #ifdef USE_I2C
     if( i2c_transaction() ) {
-#else
+#else // USE_SERIAL
     if( serial_transaction() ) {
 #endif
         // turn on the indicator led when halves are disconnected
@@ -235,7 +242,7 @@ void matrix_slave_scan(void) {
         /* i2c_slave_buffer[i] = matrix[offset+i]; */
         i2c_slave_buffer[i] = matrix[offset+i];
     }
-#else
+#else // USE_SERIAL
     for (int i = 0; i < ROWS_PER_HAND; ++i) {
         serial_slave_buffer[i] = matrix[offset+i];
     }
@@ -290,7 +297,7 @@ static void  init_cols(void)
 static matrix_row_t read_cols(void)
 {
     matrix_row_t result = 0;
-    for(int x = 0; x < MATRIX_COLS; x++) {     
+    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;
@@ -298,7 +305,7 @@ static matrix_row_t read_cols(void)
 
 static void unselect_rows(void)
 {
-    for(int x = 0; x < ROWS_PER_HAND; x++) { 
+    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);
     }
diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk
new file mode 100644 (file)
index 0000000..6fde8a4
--- /dev/null
@@ -0,0 +1,74 @@
+SRC += matrix.c \
+          i2c.c \
+          split_util.c \
+          serial.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= yes           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
+
+CUSTOM_MATRIX = yes
index f439c2f20bf20d4b390af21e10a8a3676bd3ffcd..6faed09ce077c7b5d300b182d4705c8166e295fe 100644 (file)
 #include <avr/interrupt.h>
 #include <util/delay.h>
 #include <stdbool.h>
-
 #include "serial.h"
 
+#ifdef USE_SERIAL
+
 // Serial pulse period in microseconds. Its probably a bad idea to lower this
 // value.
 #define SERIAL_DELAY 24
@@ -223,3 +224,5 @@ int serial_update_buffers(void) {
   sei();
   return 0;
 }
+
+#endif
index 65003a71a46d6ea699eac1f4900ce499ba4e51ec..461921798f912215ac8b48173e424c9e641d39bd 100644 (file)
@@ -6,11 +6,15 @@
 #include <avr/eeprom.h>
 #include "split_util.h"
 #include "matrix.h"
-#include "i2c.h"
-#include "serial.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) {
index 3a71fd0ee3e56db8271343a1db792e8f57f75f16..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,74 +1,3 @@
-
-
-SRC = led.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-RGBLIGHT_ENABLE ?=yes   # Enable keyboard underlight functionality (+4870)
-BACKLIGHT_ENABLE ?= no  # Enable keyboard backlight functionality (+1150)
-MIDI_ENABLE ?= no              # MIDI controls
-AUDIO_ENABLE ?= no
-UNICODE_ENABLE ?= no           # Unicode
-BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/phantom/rules.mk b/keyboards/phantom/rules.mk
new file mode 100644 (file)
index 0000000..c6b8ca6
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+SRC = led.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= yes        # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+RGBLIGHT_ENABLE ?=yes   # Enable keyboard underlight functionality (+4870)
+BACKLIGHT_ENABLE ?= no  # Enable keyboard backlight functionality (+1150)
+MIDI_ENABLE ?= no              # MIDI controls
+AUDIO_ENABLE ?= no
+UNICODE_ENABLE ?= no           # Unicode
+BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
index 23944f92ea3b5785ee452bf66d942951fa865cf6..7d49c5ef967d46e5f0beacd470bbc34e90b393c1 100644 (file)
@@ -1,74 +1,5 @@
-
 SUBPROJECT_DEFAULT = rev4
 
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= no           # Audio output on port C6
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/planck/keymaps/bone2planck/config.h b/keyboards/planck/keymaps/bone2planck/config.h
new file mode 100644 (file)
index 0000000..60aff6d
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+#endif
+
+#include "../../config.h"
+
+#define PREVENT_STUCK_MODIFIERS
\ No newline at end of file
index 66cf9386dfd24179ce262a8a44221653bdca68a0..69d164b8c7a4d8a1b37d2de5bca51944bf0da27e 100644 (file)
@@ -4,6 +4,13 @@
 #endif
 #include "keymap_german.h"
 
+// for intellisense, has to be commented for building
+/*
+#include "..\..\..\..\quantum\keymap_extras\keymap_german.h"
+#include "..\..\..\..\quantum\keymap_common.h"
+#include "..\..\..\..\tmk_core\common\keycode.h"
+*/
+
 #define _______ KC_TRNS
 
 /* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
@@ -24,14 +31,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|   F  |   V  |   Ü  |   Ä  |   Ö  |   Y  |   Z  |   ,  |   .  |   K  |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |  M4  |  M2  |    Space    |  M2  |  M4  |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |  M4  |  M2  |    Space    |  M2  |  M4  | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 [0] = {
-       { DE_Q,         DE_J,    DE_D,    DE_U,  DE_A,  DE_X,   DE_P,   DE_H,  DE_L,    DE_M,   DE_W,    DE_SS        },
-       { LT(1,KC_TAB), DE_C,    DE_T,    DE_I,  DE_E,  DE_O,   DE_B,   DE_N,  DE_R,    DE_S,   DE_G,    LT(1,KC_ENT) },
-       { KC_LSFT,      DE_F,    DE_V,    DE_UE, DE_AE, DE_OE,  DE_Y,   DE_Z,  DE_COMM, DE_DOT, DE_K,    KC_LSFT      },
-       { KC_LGUI,      KC_LCTL, KC_LALT, MO(4), MO(2), KC_SPC, KC_SPC, MO(2), MO(4),   KC_NO,  KC_RCTL, KC_ESC       }
+       { DE_Q,         DE_J,    DE_D,    DE_U,  DE_A,  DE_X,   DE_P,   DE_H,  DE_L,    DE_M,    DE_W,    DE_SS        },
+       { LT(1,KC_TAB), DE_C,    DE_T,    DE_I,  DE_E,  DE_O,   DE_B,   DE_N,  DE_R,    DE_S,    DE_G,    LT(1,KC_ENT) },
+       { KC_LSFT,      DE_F,    DE_V,    DE_UE, DE_AE, DE_OE,  DE_Y,   DE_Z,  DE_COMM, DE_DOT,  DE_K,    KC_LSFT      },
+       { KC_LCTL,      KC_RGUI, KC_LALT, MO(4), MO(2), KC_SPC, KC_SPC, MO(2), MO(4),   KC_RALT, KC_ESC,  KC_RCTL      }
 },
 
 /* M1 Special Characters
@@ -43,7 +50,7 @@ very ergonomic placement for coding
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|   #  |   $  |   |  |   ~  |   €  |   +  |   %  |   "  |   '  |   ;  |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |  M4  |  M2  |    Space    |  M2  |  M4  |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |  M4  |  M2  |    Space    |  M2  |  M4  | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 [1] = {
@@ -56,37 +63,37 @@ very ergonomic placement for coding
 /* Navigation & Number Blocks
 very easy to get used to & intuituve placement
 * ,-----------------------------------------------------------------------------------.
-* |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |   7  |   8  |   9  |      |      |
+* |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |   7  |   8  |   9  |      | Ins  |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * |  Tab | Home |  Lft | Down | Right| End  |   .  |   4  |   5  |   6  |   ,  | Enter|
 * |------+------+------+------+------+------|------+------+------+------+------+------|
-* | Shift|      |  Tab | Ins  | Enter|      |   0  |   1  |   2  |   3  |   ;  |Shift |
+* | Shift|      |  Tab |      | Enter|      |   0  |   1  |   2  |   3  |   ;  |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 [2] = {
-       { KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO,   DE_7,    DE_8,  DE_9,    KC_NO,   KC_NO   },
+       { KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO,   DE_7,    DE_8,  DE_9,    KC_NO,   KC_INS  },
        { KC_TAB,  KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  DE_DOT,  DE_4,    DE_5,  DE_6,    DE_COMM, KC_ENT  },
-       { _______, KC_NO,   KC_TAB,  KC_INS,  KC_ENT,  KC_NO,   DE_0,    DE_1,    DE_2,  DE_3,    DE_SCLN, _______ },
+       { _______, KC_NO,   KC_TAB,  KC_NO,   KC_ENT,  KC_NO,   DE_0,    DE_1,    DE_2,  DE_3,    DE_SCLN, _______ },
        { _______, _______, _______, MO(3),   _______, _______, _______, _______, MO(3), _______, _______, _______ }
 },
 
 /* Flipped Navigation & Number Blocks for one handed use
 accessed by sliding from M2 to M3 with thumb
 * ,-----------------------------------------------------------------------------------.
-* |      |      |  7   |  8   |  9   |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |
+* | Ins  |      |  7   |  8   |  9   |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * |  Tab |  .   |  4   |  5   |  6   |   ,  | Home | Left | Down | Right| End  | Enter|
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|  0   |  1   |  2   |  3   |   ;  |      | Tab  |  Ins | Enter|      |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |  M3  |      |    Space    |      |  M3  |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |  M3  |      |    Space    |      |  M3  | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 
 [3] = {
-       { KC_NO,   KC_NO,   DE_7,    DE_8,    DE_9,  KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO   },
+       { KC_INS,   KC_NO,   DE_7,    DE_8,    DE_9,  KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO   },
        { _______, DE_DOT,  DE_4,    DE_5,    DE_6,  DE_COMM, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  _______ },
        { _______, DE_0,    DE_1,    DE_2,    DE_3,  DE_SCLN, KC_NO,   KC_TAB,  KC_INS,  KC_ENT,  KC_NO,   _______ },
        { _______, _______, _______, _______, KC_NO, _______, _______, KC_NO,   _______, _______, _______, _______ }
@@ -102,7 +109,7 @@ slide from m4 to m5 to access flipped version
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|      | Prev | Play | Next |      |   ²  |  F1  |  F2  |  F3  |  F10 |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |  M4  |  M5  |    Space    |  M5  |  M4  |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |  M4  |  M5  |    Space    |  M5  |  M4  | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 [4] = {
@@ -115,19 +122,19 @@ slide from m4 to m5 to access flipped version
 
 /* flipped Function & Media Keys
 * ,-----------------------------------------------------------------------------------.
-* |      |      |  F7  |  F8  |  F9  |      |      | Print|Scroll| Pause|      |      |
+* |      |      |  F7  |  F8  |  F9  |  F12 |      | Print|Scroll| Pause|      |      |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
-* |      |  ³   |  F4  |  F5  |  F6  |      |      | Mute | Vol- | Vol+ |      |      |
+* |      |  ³   |  F4  |  F5  |  F6  |  F11 |      | Mute | Vol- | Vol+ |      |      |
 * |------+------+------+------+------+------|------+------+------+------+------+------|
-* | Shift|  ²   |  F1  |  F2  |  F3  |      |      | Prev | Play | Next |      |Shift |
+* | Shift|  ²   |  F1  |  F2  |  F3  |  F10 |      | Prev | Play | Next |      |Shift |
 * |------+------+------+------+------+------+------+------+------+------+------+------|
-* | GUI  | Ctrl | Alt  |      |  M5  |    Space    |  M5  |      |      | Ctrl | Esc  |
+* | Ctrl | GUI  | Alt  |      |  M5  |    Space    |  M5  |      | Alt  | Esc  | Ctrl |
 * `-----------------------------------------------------------------------------------'
 */
 [5] = {
-       { KC_NO,   KC_NO,   KC_F7,   KC_F8, KC_F9,   KC_NO,   KC_NO,   KC_PSCR, KC_SLCK, KC_PAUS, KC_NO,   KC_NO   },
-       { KC_NO,   DE_SQ3,  KC_F4,   KC_F5, KC_F6,   KC_NO,   KC_NO,   KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,   KC_NO   },
-       { _______, DE_SQ2,  KC_F1,   KC_F2, KC_F3,   KC_NO,   KC_NO,   KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,   _______ },
+       { KC_NO,   KC_NO,   KC_F7,   KC_F8, KC_F9,   KC_F12,  KC_NO,   KC_PSCR, KC_SLCK, KC_PAUS, KC_NO,   KC_NO   },
+       { KC_NO,   DE_SQ3,  KC_F4,   KC_F5, KC_F6,   KC_F11,  KC_NO,   KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,   KC_NO   },
+       { _______, DE_SQ2,  KC_F1,   KC_F2, KC_F3,   KC_F10,  KC_NO,   KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,   _______ },
        { _______, _______, _______, KC_NO, _______, _______, _______, _______, KC_NO,   _______, _______, _______ }
 }
 };
diff --git a/keyboards/planck/keymaps/bone2planck/readme.md b/keyboards/planck/keymaps/bone2planck/readme.md
new file mode 100644 (file)
index 0000000..3c425ef
--- /dev/null
@@ -0,0 +1,8 @@
+check keymap.c to the layers
+
+This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
+It has "üäöß" as it is optimized for a mix of German & English.
+My favourite features are the placement of the special characters often used for programming right on the home row
+and the number & navigation block combo, so you never have to move your hands from their home position.
+
+Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
\ No newline at end of file
index ed187df1da3a140464a9ab3ca479f0a348764e91..82ba83f4e4e6c92a8c765323a08a34acb17c1e1c 100644 (file)
@@ -14,13 +14,21 @@ extern keymap_config_t keymap_config;
 #define _BASE 0
 #define _MOVE 1
 #define _SYMB 2
-#define _FUNC 3
+#define _MOUSE 3
+#define _FUNC 4
 
 enum planck_keycodes {
-  BASE = SAFE_RANGE,
-  MOVE,
+  MOVE = SAFE_RANGE,
   SYMB,
-  FUNC
+  FUNC,
+  CMDLEFT,
+  CMDRGHT,
+  BELOW,
+  ABOVE,
+  DASH,
+  GBP,
+  VOLUP,
+  VOLDN
 };
 
 // Fillers to make layering more clear
@@ -32,73 +40,91 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 /* BASE
  * ,-----------------------------------------------------------------------------------.
  * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  |  -   |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
  * | Bksp |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Shift |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Func | GUI  | Alt  | Ctrl | Symb |Enter |Space | Move | GUI  | Alt  | Ctrl |Caps  |
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  | Shift|
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Func | Ctrl |  Alt |  Cmd | Symb | Enter| Space| Move |  Cmd |  Alt | Ctrl | Func |
  * `-----------------------------------------------------------------------------------'
  */
 [_BASE] = {
   {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_MINS},
   {KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT},
-  {FUNC,    KC_LGUI, KC_LALT, KC_LCTL, SYMB,    KC_ENT,  KC_SPC,  MOVE,    KC_RGUI, KC_RALT, KC_RCTL, KC_CAPS}
+  {FUNC,    KC_LCTL, KC_LALT, KC_LGUI, SYMB,    KC_ENT,  KC_SPC,  MOVE,    KC_RGUI, KC_RALT, KC_RCTL, FUNC   }
 },
 
 /* MOVE
  * ,-----------------------------------------------------------------------------------.
- * | Esc  |      | Home |  Up  | End  |      |      | Home |  Up  | End  |      | Esc  |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Del  |      | Left | Down |Right |      |      | Left | Down |Right |      | Del  |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      |      |      |Pg Up |Pg Dn |      |      |Pg Dn |Pg Up |      |      |      |
+ * |  Esc |      | Cmd-L|  Up  | Cmd-R|      |      | Cmd-L|  Up  | Cmd-R|      |  Esc |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |  Del |      | Left | Down | Right|      |      | Left | Down | Right|      |  Del |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      | Pg Up| Pg Dn| Above|      | Pg Dn| Pg Up|      | Caps |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      | Below|      |      |      |      |      |      |
  * `-----------------------------------------------------------------------------------'
  */
 [_MOVE] = {
-  {KC_ESC,  _______, KC_HOME,   KC_UP,  KC_END, _______, _______, KC_HOME,   KC_UP,  KC_END, _______,  KC_ESC},
-  {KC_DEL,  _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______,  KC_DEL},
-  {_______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, KC_PGDN, KC_PGUP, _______, _______, _______},
-  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+  {KC_ESC,  XXXXXXX, CMDLEFT, KC_UP,   CMDRGHT, XXXXXXX, XXXXXXX, CMDLEFT, KC_UP,   CMDRGHT, XXXXXXX, KC_ESC },
+  {KC_DEL,  KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL },
+  {_______, XXXXXXX, XXXXXXX, KC_PGUP, KC_PGDN,   ABOVE, XXXXXXX, KC_PGDN, KC_PGUP, XXXXXXX, XXXXXXX, _______},
+  {_______, _______, _______, _______, _______,   BELOW, _______, _______, _______, _______, _______, _______}
 },
 
 /* SYMB
  * ,-----------------------------------------------------------------------------------.
- * |  Esc |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Esc  |
- * |-----------------------------------------------------------------------------------.
- * |  Del |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |  Esc |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |   –  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |  Del |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   £  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |   ~  |   `  |   +  |   =  |   |  |   \  |   [  |   ]  |   {  |   }  |      |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |      |      |      |      |      |      |      |      |      |      |      |      |
  * `-----------------------------------------------------------------------------------'
  */
 [_SYMB] = {
-  {KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_ESC },
-  {KC_DEL,  KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL },
+  {KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    DASH   },
+  {KC_DEL,  KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, GBP    },
   {_______, KC_TILD, KC_GRV,  KC_PLUS, KC_EQL,  KC_PIPE, KC_BSLS, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 },
 
+/* MOUSE
+ * ,-----------------------------------------------------------------------------------.
+ * |      |      | ACC-2| ACC-1| ACC-0|      |      | SW-L |  M-U | SW-R |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      | MB-3 | MB-2 | MB-1 |      |      |  M-L |  M-D |  M-R |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      | SW-D | SW-U |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_MOUSE] = {
+  {XXXXXXX, XXXXXXX, KC_ACL2, KC_ACL1, KC_ACL0, XXXXXXX, XXXXXXX, KC_WH_L, KC_MS_U, KC_WH_R, XXXXXXX, XXXXXXX},
+  {XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, XXXXXXX},
+  {_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_D, KC_WH_U, XXXXXXX, XXXXXXX, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+},
+
 /* FUNC
  * ,-----------------------------------------------------------------------------------.
- * | F12  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  | F10  | F11  |
- * |-----------------------------------------------------------------------------------.
- * |      | Play | Prev | Next | BL+  |      |      |      |      |      |      |      |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |      | Mute | Vol- | Vol+ | BL-  |      |      |      |      |      |      |      |
+ * | Reset|  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | Vol+ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |  F11 |  F12 |  F13 |  F14 |  F15 |  F16 |  F17 |  F18 |  F19 |  F20 | Vol- |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |      |      |      |      |      |      |      |      |      |      |      |Reset |
+ * |      |  F21 |  F22 |  F23 |  F24 |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      | Prev | Mute | Play | Next |      |      |      |      |
  * `-----------------------------------------------------------------------------------'
  */
 [_FUNC] = {
-  {KC_F12,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11 },
-  {_______, KC_MPLY, KC_MPRV, KC_MNXT, KC_PAUS, _______, _______, _______, _______, _______, _______, _______},
-  {_______, KC_MUTE, KC_VOLD, KC_VOLU, KC_SLCK, _______, _______, _______, _______, _______, _______, _______},
-  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET  }
+  {RESET,   KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  VOLUP  },
+  {XXXXXXX, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20,  VOLDN  },
+  {_______, KC_F21,  KC_F22,  KC_F23,  KC_F24,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______},
+  {_______, _______, _______, _______, KC_MPRV, KC_MUTE, KC_MPLY, KC_MNXT, _______, _______, _______, _______}
 }
 
 };
@@ -108,20 +134,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
     case MOVE:
       if (record->event.pressed) {
         layer_on(_MOVE);
-        update_tri_layer(_MOVE, _SYMB, _FUNC);
+        update_tri_layer(_MOVE, _SYMB, _MOUSE);
       } else {
         layer_off(_MOVE);
-        update_tri_layer(_MOVE, _SYMB, _FUNC);
+        update_tri_layer(_MOVE, _SYMB, _MOUSE);
       }
       return false;
       break;
     case SYMB:
       if (record->event.pressed) {
         layer_on(_SYMB);
-        update_tri_layer(_MOVE, _SYMB, _FUNC);
+        update_tri_layer(_MOVE, _SYMB, _MOUSE);
       } else {
         layer_off(_SYMB);
-        update_tri_layer(_MOVE, _SYMB, _FUNC);
+        update_tri_layer(_MOVE, _SYMB, _MOUSE);
       }
       return false;
       break;
@@ -133,6 +159,94 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
       }
       return false;
       break;
+    case CMDLEFT:
+      if (record->event.pressed) {
+        register_code(KC_LGUI);
+        register_code(KC_LEFT);
+      } else {
+        unregister_code(KC_LEFT);
+        unregister_code(KC_LGUI);
+      }
+      return false;
+      break;
+    case CMDRGHT:
+      if (record->event.pressed) {
+        register_code(KC_LGUI);
+        register_code(KC_RGHT);
+      } else {
+        unregister_code(KC_RGHT);
+        unregister_code(KC_LGUI);
+      }
+      return false;
+      break;
+    case BELOW:
+      if (record->event.pressed) {
+        register_code(KC_LGUI);
+        register_code(KC_RGHT);
+        unregister_code(KC_RGHT);
+        unregister_code(KC_LGUI);
+        register_code(KC_ENT);
+        unregister_code(KC_ENT);
+      }
+      return false;
+      break;
+    case ABOVE:
+      if (record->event.pressed) {
+        register_code(KC_LGUI);
+        register_code(KC_LEFT);
+        unregister_code(KC_LEFT);
+        unregister_code(KC_LGUI);
+        register_code(KC_ENT);
+        unregister_code(KC_ENT);
+        register_code(KC_UP);
+        unregister_code(KC_UP);
+      }
+      return false;
+      break;
+    case DASH:
+      if (record->event.pressed) {
+        register_code(KC_LALT);
+        register_code(KC_MINS);
+      } else {
+        unregister_code(KC_MINS);
+        unregister_code(KC_LALT);
+      }
+      return false;
+      break;
+    case GBP:
+      if (record->event.pressed) {
+        register_code(KC_LALT);
+        register_code(KC_3);
+      } else {
+        unregister_code(KC_3);
+        unregister_code(KC_LALT);
+      }
+      return false;
+      break;
+    case VOLUP:
+      if (record->event.pressed) {
+        register_code(KC_LALT);
+        register_code(KC_LSFT);
+        register_code(KC_VOLU);
+      } else {
+        unregister_code(KC_VOLU);
+        unregister_code(KC_LSFT);
+        unregister_code(KC_LALT);
+      }
+      return false;
+      break;
+    case VOLDN:
+      if (record->event.pressed) {
+        register_code(KC_LALT);
+        register_code(KC_LSFT);
+        register_code(KC_VOLD);
+      } else {
+        unregister_code(KC_VOLD);
+        unregister_code(KC_LSFT);
+        unregister_code(KC_LALT);
+      }
+      return false;
+      break;
   }
   return true;
 }
index 030def7f7738381ee616d957389ca796d41e84b1..b5997cd5ae62d49c7784b00b2dbf9be82414ba85 100644 (file)
@@ -1,48 +1,71 @@
 # callum’s planck layout
 
-This is a layout for the grid planck, built with a few ideals in mind. These ideals are just my opinion mind! The great thing about *qmk* is that we can all afford to have different opinions about what makes a good layout:
+This is a layout for the grid planck, built with a few ideals in mind:
 
-- Minimal response times should be maintained. i.e. keys that react differently depending on whether they are tapped or held, keys that react differently if they are double tapped, etc. should be avoided --- since they inevitably send their keycode later than a normal key, interrupting the immediate feedback from the screen. Therefore we restrict ourselves to chording.
+- Minimal response times should be maintained. Keys that react differently depending on whether they are tapped or held, keys that react differently if they are double tapped, etc. should be avoided – they inevitably send their keycode later than a normal key – interrupting the immediate feedback from the screen. Therefore we restrict ourselves to chording as our only means of getting more than one symbol out of a single physical key.
 - The hands should never need to leave the home position. The usual culprit for this is the arrow cluster, so the arrow cluster should be as close to home as possible.
-- There should be two of every modifier (one on each side), since otherwise certain long key combinations become hard to make.
-- Backspace should be in the “capslock position” as God intended.
-- The keyboard should be usable without any firmware changes on any operating system. In my case that means it should work on *Windows* and *Linux* without any software modifications, while I can change the behaviour slightly on *macOS* in software since that’s my home OS. The images reflect the intended use on *macOS* **after** minor software tweaks; which will be noted.
-
-We have four layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow cluster etc, a `SYMB` layer, with numbers and symbols; and a `FUNC` layer, with function keys and media keys.
-
-## The `BASE` layer
-![](http://i.imgur.com/aEXOlWl.png)
-
-This is the default layer; in [colemak](https://colemak.com). `esc` and `del` are conspicuously absent but are especially easy to reach from either of the other main layers (see below). The `backspace` location is standard colemak. The `caps` key is still on the `BASE` layer but only because I  don’t really use the bottom corners so there’s nothing else I would rather put there. Having `enter` on a thumb means I can still have `quote` immediately to the right of `O`, something that would have annoyed me endlessly otherwise. `minus` is in the upper right because I had an extra space and it’s probably my next most used key that didn’t yet have a home.
-
-The `MOVE` and `SYMB` layers are reached by holding down the `move` and `symb` keys respectively. The `FUNC` layer is reached by holding down both the `move` and `symb` keys simultaneosly, *or* by holding down the `fn` key. The intended use is that whenever both hands are on the keyboard, the former method is used, and the latter is only used when, for example, reaching over to the keyboard with one hand to access the media controls. 
-
-The `ctrl`, `alt`, `cmd` cluster is asymmetric around the centre so that at least one of each of the modifiers can be reached with the thumbs. The intended use is to always hit the left `cmd` and the right `ctrl`, unless an awkward key combination dictates otherwise.
-
-In firmware `ctrl` and `cmd`/`GUI` are swapped with respect to the image above --- I swap them to the illustrated location when using *macOS* and leave them be for *Windows* and *Linux*. (so that `cmd-z,x,c,v,...` becomes `ctrl-z,x,c,v,...` saving me some confusion)
-
-## The `MOVE` layer
-![](http://i.imgur.com/KXRSuHT.png)
-
-This is fairly self explanatory. I almost exclusively use the right hand cluster so that movement is a one handed affair, but the left hand cluster is there if it’s needed.
-
-On *macOS* I recommend using [Karabiner](https://pqrs.org/osx/karabiner/) and ticking *Use PC Style Home/End #2* and *Use PC Style PageUp/PageDown* so that `home` and `end` jump you to the beginning and end of the line respectively and so that `pg up` and `pg dn` move the cursor instead of just scrolling.
-
-None of the modifiers are overwritten so that `shift-alt-arrows` etc work as expected.
-
-## The `SYMB` layer
-![](http://i.imgur.com/thh1ne2.png)
-
-The symbol layer has all the numbers and their usual corresponding symbols in the first two rows, with the symbols on the home row since I use them more frequently than the numbers. The third row contains all the remaining symbols, arranged roughly so that the most used symbols are accessible with the strongest fingers.
-
-`esc` and `del` are repeated here since I wanted to be able to reach either, one handed, with either hand.
-
-Again none of the modifiers are overwritten so that shortcuts involving numbers or symbols work as expected.
-
-## The `FUNC` layer
-![](http://i.imgur.com/skxRZiH.png)
-
-The only thing of note here is that `bl+` and `bl-` are short for *backlight up* and *backlight down* respectively, and in firmware are actually `KC_PAUS` and `KC_SLCK` respectively, since *macOS* interprets these as the backlight keys.
-
-## Other changes from the default
-I have LEDs and sound disabled, simply because I have no need of them.
\ No newline at end of file
+- There should be two of every modifier (one on each side), otherwise certain long key combinations become hard to make.
+
+We have five layers. A `BASE` layer, in colemak; a `MOVE` layer, with an arrow cluster and other movement keys; a `SYMB` layer, with numbers and symbols; a `FUNC` layer, with function keys and media keys; and a `MOUSE` layer, with mouse emulation.
+
+```
+/* BASE
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  |  -   |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Bksp |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  | Shift|
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Func | Ctrl |  Alt |  Cmd | Symb | Enter| Space| Move |  Cmd |  Alt | Ctrl | Func |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+/* MOVE
+ * ,-----------------------------------------------------------------------------------.
+ * |  Esc |      | Cmd-L|  Up  | Cmd-R|      |      | Cmd-L|  Up  | Cmd-R|      |  Esc |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |  Del |      | Left | Down | Right|      |      | Left | Down | Right|      |  Del |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      | Pg Up| Pg Dn| Above|      | Pg Dn| Pg Up|      | Caps |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      | Below|      |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+/* SYMB
+ * ,-----------------------------------------------------------------------------------.
+ * |  Esc |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |   –  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |  Del |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   £  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |   ~  |   `  |   +  |   =  |   |  |   \  |   [  |   ]  |   {  |   }  |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+/* MOUSE
+ * ,-----------------------------------------------------------------------------------.
+ * |      |      | ACC-2| ACC-1| ACC-0|      |      | SW-L |  M-U | SW-R |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      | MB-3 | MB-2 | MB-1 |      |      |  M-L |  M-D |  M-R |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      | SW-D | SW-U |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+/* FUNC
+ * ,-----------------------------------------------------------------------------------.
+ * | Reset|  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | Vol+ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |  F11 |  F12 |  F13 |  F14 |  F15 |  F16 |  F17 |  F18 |  F19 |  F20 | Vol- |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |  F21 |  F22 |  F23 |  F24 |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      | Prev | Mute | Play | Next |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+```
index 2d3df59bd2f6af51644937fdc44235881e702a29..1e04ba61d7a52c58f52a78851df20f63a7ea5f83 100644 (file)
@@ -3,13 +3,19 @@
 
 #include "../../config.h"
 
+#define LEADER_TIMEOUT 300
+#define BACKLIGHT_BREATHING
+
 /* cbbrowne user configuration */
 
 #define randadd 53
 #define randmul 181
 #define randmod 167
 
-#endif
+/* Filler to make layering a bit clearer *
+ * borrowed from basic keymap            */
 
+#define _______ KC_TRNS
 
+#endif
 
index 70eaefb7beacc446bf341605da644e2345e3cd6c..7f1601af75d0cc256935b3d11c2987e21be70ce2 100644 (file)
@@ -1,6 +1,6 @@
 #include "planck.h"
 #ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
+#include "backlight.h"
 #endif
 #include "config.h"
 #include "quantum.h"
 */
 
 enum layers {
-  _QW = 0,  /* Qwerty mapping */
-  _LW, /* Lower layer, where top line has symbols !@#$%^&*() */
-  _RS, /* Raised layer, where top line has digits 1234567890 */
-  _KP, /* Key pad */
+  _QWERTY = 0,  /* Qwerty mapping */
+  _LOWER, /* Lower layer, where top line has symbols !@#$%^&*() */
+  _RAISE, /* Raised layer, where top line has digits 1234567890 */
+  _KEYPAD, /* Key pad */
+  _ADJUST, /* Special Adjust layer coming via tri-placement */
 };
 
 enum macro_id {
@@ -76,38 +77,63 @@ enum macro_id {
   M_USERNAME,
   M_RANDDIGIT,
   M_RANDLETTER,
-  M_VERSION
+  M_VERSION,
+  MACRO_UPPER,
+  MACRO_LOWER,
 };
 
+#define M_LOWER M(MACRO_LOWER)
+#define M_UPPER M(MACRO_UPPER)
+#define ROT_LED M(M_LED)   /* Rotate LED */
+#define QWERTY DF(_QWERTY)   /* Switch to QWERTY layout */
+#define KEYPAD DF(_KEYPAD)   /* Switch to keypad */
+#define USERNAME M(M_USERNAME) /* shortcut for username */
+#define RANDDIG M(M_RANDDIGIT)
+#define RANDALP M(M_RANDLETTER)
+#define CTLENTER MT(MOD_RCTL, KC_ENT)
+#define SHIFTQUOTE MT(MOD_RSFT, KC_QUOT)
+#define ALTRIGHT MT(MOD_LALT, KC_RGHT)
+#define MVERSION M(M_VERSION)
+
+
 /* Note that Planck has dimensions 4 rows x 12 columns */
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[_QW] = { /* Qwerty */
+[_QWERTY] = { /* Qwerty */
   {KC_ESC,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
-  {KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_ENT},
-  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_QUOT },
-  {KC_TAB,  M(M_LED), KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, CTLENTER},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, SHIFTQUOTE },
+  {KC_TAB,  KC_LALT, ROT_LED, KC_LGUI, M_LOWER, KC_SPC,  KC_SPC,  M_UPPER, KC_LEFT, KC_DOWN, KC_UP,   ALTRIGHT}
+  /* Note that KC_SPC is recorded TWICE, so that either matrix position can activate it */
 },
-[_RS] = { /* RAISE */
+[_RAISE] = { /* RAISE */
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_KP), DF(_KP), RESET,   KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  QWERTY,  KEYPAD,  KEYPAD,  RESET,   _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
-[_LW] = { /* LOWER */
+[_LOWER] = { /* LOWER */
   {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_KP), DF(_KP), RESET,   KC_TRNS},
-  {KC_TRNS, DF(_KP), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  QWERTY,  KEYPAD,  KEYPAD, RESET,   _______},
+  {_______, KEYPAD, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+    },
+[_KEYPAD] = { /* Key Pad */
+  {KC_ESC,  USERNAME,    MVERSION,   KC_F10,   KC_F11,  KC_F12,   KC_PGUP, KC_KP_ENTER, KC_7, KC_8, KC_9, KC_BSPC},
+  {KC_LCTL, RANDDIG,   KC_F5,   KC_F6,    KC_F7,   KC_F8,    KC_PGDN, KC_KP_MINUS, KC_4, KC_5, KC_6, KC_PIPE},
+  {KC_LSFT, RANDALP,   KC_F1,   KC_F2,    KC_F3,   KC_F4,    KC_DEL,  KC_KP_PLUS,  KC_1, KC_2,  KC_3, KC_ENTER},
+  {KC_TAB,  KC_LALT, ROT_LED, KC_LGUI,  M_LOWER,  KC_SPC,    KC_SPC,  QWERTY,   KC_LEFT, KC_DOWN, KC_UP,  KC_RIGHT}
 },
-[_KP] = { /* Key Pad */
-  {KC_ESC,  M(M_USERNAME),    M(M_VERSION),   KC_F10,   KC_F11,  KC_F12,   KC_PGUP, KC_KP_ENTER, KC_7, KC_8, KC_9, KC_BSPC},
-  {KC_LCTL, M(M_RANDDIGIT),   KC_F5,   KC_F6,    KC_F7,   KC_F8,    KC_PGDN, KC_KP_MINUS, KC_4, KC_5, KC_6, KC_PIPE},
-  {KC_LSFT, M(M_RANDLETTER),  KC_F1,   KC_F2,    KC_F3,   KC_F4,    KC_DEL,  KC_KP_PLUS,  KC_1, KC_2,  KC_3, KC_ENTER},
-  {BL_STEP, M(M_LED), KC_LALT, KC_LGUI, KC_NO, KC_SPC,  KC_SPC,  DF(_QW),   KC_LEFT, KC_DOWN, KC_UP,  KC_RIGHT}
-}
+
+[_ADJUST] = { /* Adjustments - gonna shift the wild tools in here */
+  {ROT_LED,USERNAME,MVERSION, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+  {_______, RANDDIG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+  {_______, RANDALP, _______, _______, _______,   RESET,   RESET, _______, _______, _______, _______, _______ },
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }
+}  
 };
 
+/* What is fn_actions actually used for??? */
 const uint16_t PROGMEM fn_actions[] = {
 };
 
@@ -169,6 +195,39 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
       unregister_code (KC_A + rval);
     }
     break;
+  case MACRO_UPPER:
+    if (record->event.pressed)
+      {
+       layer_on(_RAISE);
+#ifdef BACKLIGHT_ENABLE
+       breathing_speed_set(2);
+       breathing_pulse();
+#endif
+       update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+    else
+      {
+       layer_off(_RAISE);
+       update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+    break;
+  case MACRO_LOWER:
+    if (record->event.pressed)
+      {
+       layer_on(_LOWER);
+#ifdef BACKLIGHT_ENABLE
+       breathing_speed_set(2);
+       breathing_pulse();
+#endif
+       update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+    else
+      {
+       layer_off(_LOWER);
+       update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+    break;
+    
   }
   return MACRO_NONE;
 };
index c676dd2c1c54fc1b745d2246c0a93792bed337b4..184142e0c1babb5fd632b22e50161018a7bbc9e0 100644 (file)
@@ -7,16 +7,10 @@ Christopher Browne
 This was originally based on the default keyboard map, but I have been
 doing sundry experimentation:
 
-1. Experiments
+1. Useful Experiments
 ----------------------------------------
 
- * To figure things out about the toolset
- * I'm an Emacs guy, so will be needing a fair bit of tuning
  * It made sense to mess around some with keyboard maps.
-   - I tried added Workman alongside Dvorak and Colemak
-     - Boy, oh boy, these don't help!!!
-     - I have done 30 years of learning of Emacs key mappings, and
-       these alternative keyboards massively mess me up
    - I added a keypad, originally based on keymaps/numpad.c, but
      mighty substantially revised, as that one seems to be rotated 90
      degrees from usual conventions for number pads
@@ -30,6 +24,26 @@ doing sundry experimentation:
    - Key [2][2] aka "a" uses a random number generator to select a digit 0-9 at random
    - Key [3][2] aka "z" uses a random number generator to select a letter a-z at random
    - Key [1][3] aka "e" spits out the keymap version number
+  * Trying out sgoodwin's "hold Enter down to get Shift"
+    - Liking this Quite Well Enough...
+    - Applied this to both Shift and Quote
+    - It seems likely that Alt should get a right-hand-side, akin to this...
+    - Alt needs to move, and get a RHS
+      - Hence ALTRIGHT, and shifted ROT_LED over
+      - Emacs likes this!!!  :-)
+    - I'm suspicious that I'll want to shift ROT_LED another location over,
+      so some modifier can replace the OS/KC_LGUI key
+  * I have added an alternate ADJUST layer that is activated via update_tri_layer()
+    - e.g. - LOWER+RAISE simultaneously
+    - This seems entirely more useful for handling my "special keys"
+      like the random numbers, user name, and such, than the keypad layer
+  * The _ADJUST layer provides a good place to have RESET
+    - But this isn't strictly enough; I want RESET somewhat accessible from
+      main layer lest an error hide that layer
+    - I never use the OS/KC_LGUI key (that's Command on MacOS, Windows
+      Key on Windows), so that's a good place to have it as a chord of
+      some sort
+        
 
 2. Some code structure ideas
 ---------------------------------------------------
@@ -48,8 +62,8 @@ doing sundry experimentation:
    only need to fit 4 symbols onto each line, rather than 12.
 
    I used enums to manage layer IDs and macro IDs so that I don't need
-   to care (beyond "start at 0", and arguably that's not needed) about
-   their values.
+   to care (beyond "start at 0", and arguably even that's not needed)
+   about their values.
 
 3. Things I did not like about the default mapping
 ---------------------------------------------------------
@@ -62,3 +76,38 @@ doing sundry experimentation:
      and shift ESC off the first column so KC_LCTL and KC_LALT can
      be on the first column.
    * I needed to swap ' and ENTER
+
+4. Unuseful experiments
+---------------------------------------------------------
+
+I have tried some things out that didn't turn out particularly well.
+I'll note some of these for posterity, hopefully helpful in not doing
+unwise things again...
+
+   * I tried added Workman alongside Dvorak and Colemak
+     - Boy, oh boy, these don't help!!!
+     - I have done 30 years of learning of Emacs key mappings, and
+       these alternative keyboards massively mess me up
+
+   * Space Cadet Shift; switching L_SHIFT to KC_LSP0, so that when I
+     just hit SHIFT, I get a left parens.  In principle, this is great
+     for Lisping.
+     - Unfortunately, there are times when mouse interfaces use SHIFT
+       to allow selecting multiple items, and this really interferes
+        with that
+
+5. TODO
+---------------------------------------------------------
+
+  * I use tmux quite a lot; the mollat keymap seems to have some
+    interesting helpers.  It might be interesting to add a "tmux
+    layer," or to have a few keys in a layer oriented towards that
+  * The mollat tmux layer also suggests some thoughts about Emacs
+    helpers.
+  * I do not presently have anything that handles X11 screen
+    switching, as with Control-Alt-various
+  * I ought to probably look into KC_LEAD, to have some key combos
+    that do not need to be concurrent
+  * The jeebak keymap seems to have some neat ideas:
+    - Number layer which is aggressive about having numbers in several places
+    - Touch layer seems interesting
diff --git a/keyboards/planck/keymaps/impossible/Makefile b/keyboards/planck/keymaps/impossible/Makefile
new file mode 100644 (file)
index 0000000..581e08c
--- /dev/null
@@ -0,0 +1,25 @@
+
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = yes           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/planck/keymaps/impossible/keymap.c b/keyboards/planck/keymaps/impossible/keymap.c
new file mode 100644 (file)
index 0000000..503976f
--- /dev/null
@@ -0,0 +1,242 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+
+#define _WORKMAN 0
+#define _FN 1
+#define _QWERTY 2
+#define _QW_FN 3
+#define _PLOVER 4
+#define _ADJ 5
+
+enum planck_keycodes {
+  WORKMAN = SAFE_RANGE,
+  QWERTY,
+  PLOVER
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Workman Alpha-numeric
+ * ,-----------------------------------------------------------------------------------------------.
+ * |   Q   |   D   |   R   |   W   |   B   |   F   |   U   |   P   |   J   |   7   |   8   |   9   |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |   A   |   S   |   H   |   T   |   G   |   N   |   E   |   O   |   I   |   4   |   5   |   6   |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |   Z   |   X   |   M   |   C   |   V   |   L   |   Y   |   K   |   Up  |   1   |   2   |   3   |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |Alt/Tab|Gui/Esc|   ,   |CTL/Bsp| Fn/Ent|SFT/SPC|   .   |  Left |  Down | Right |   0   |Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_WORKMAN] = {
+  {KC_Q,          KC_D,          KC_R,    KC_W,           KC_B,            KC_F,          KC_U,   KC_P,    KC_J,    KC_KP_7, KC_KP_8, KC_KP_9},
+  {KC_A,          KC_S,          KC_H,    KC_T,           KC_G,            KC_N,          KC_E,   KC_O,    KC_I,    KC_KP_4, KC_KP_5, KC_KP_6},
+  {KC_Z,          KC_X,          KC_M,    KC_C,           KC_V,            KC_L,          KC_Y,   KC_K,    KC_UP,   KC_KP_1, KC_KP_2, KC_KP_3},
+  {ALT_T(KC_TAB), GUI_T(KC_ESC), KC_COMM, CTL_T(KC_BSPC), LT(_FN, KC_ENT), SFT_T(KC_SPC), KC_DOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_KP_0, LT(_ADJ, KC_ENT)}
+},
+
+/* FN-key held (Workman)
+ * ,-----------------------------------------------------------------------------------------------.
+ * |   !   |   @   |   #   |   $   |   %   |   ^   |   &   |   *   |  F12  |   F7  |   F8  |   F9  |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |  Tab  |   [   |   ]   |   -   |  Del  |   '   |   (   |   )   |  F11  |   F4  |   F5  |   F6  |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |  Menu |       |       |   =   |   \   |   /   |       |       |  PgUp |   F1  |   F2  |   F3  |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |Alt/Tab|  Gui  |   ~   |CTL/Bsp| Fn/Ent|SFT/Spc|   ;   |  Home |  PgDn |  End  |  F10  |Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_FN] = {
+  {KC_EXLM, KC_AT,       KC_HASH,     KC_DLR,   KC_PERC,   KC_CIRC, KC_AMPR,   KC_ASTR, KC_F12,  KC_F7,  KC_F8,  KC_F9},
+  {KC_TAB,  KC_LBRACKET, KC_RBRACKET, KC_MINUS, KC_DELETE, KC_QUOT, KC_LPRN,   KC_RPRN, KC_F11,  KC_F4,  KC_F5,  KC_F6},
+  {KC_MENU, _______,     _______,     KC_EQUAL, KC_BSLS,   KC_SLSH, XXXXXXX,   XXXXXXX, KC_PGUP, KC_F1,  KC_F2,  KC_F3},
+  {_______, KC_LGUI,     KC_GRAVE,    _______,  _______,   _______, KC_SCOLON, KC_HOME, KC_PGDN, KC_END, KC_F10, _______}
+},
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------------------.
+ * |Gui/Esc|   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   |   0   | Bksp  |
+ * |-------+-------+-------+-------+-------+---------------+-------+-------+-------+-------+-------|
+ * | Ctrl  |   Q   |   W   |   E   |   R   |   T   |   Y   |   U   |   I   |   O   |   P   |   /   |
+ * |-------+-------+-------+-------+-------+---------------+-------+-------+-------+-------+-------|
+ * | Shift |   A   |   S   |   D   |   F   |   G   |   H   |   J   |   K   |   L   |   ;   |   "   |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |Alt/Tab|   Z   |   X   |   C   |   V   | Fn/SPC|   B   |   N   |   M   |   ,   |   .   |Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_QWERTY] = {
+  {GUI_T(KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5,               KC_6, KC_7, KC_8, KC_9,    KC_0,    KC_BSPC},
+  {KC_LCTL,       KC_Q, KC_W, KC_E, KC_R, KC_T,               KC_Y, KC_U, KC_I, KC_O,    KC_P,    KC_ENT},
+  {KC_LSFT,       KC_A, KC_S, KC_D, KC_F, KC_G,               KC_H, KC_J, KC_K, KC_L,    KC_SCLN, KC_QUOT},
+  {ALT_T(KC_TAB), KC_Z, KC_X, KC_C, KC_V, LT(_QW_FN, KC_SPC), KC_B, KC_N, KC_M, KC_COMM, KC_DOT,  LT(_ADJ, KC_ENT)},
+},
+
+/* FN-key held (Qwerty)
+ * ,-----------------------------------------------------------------------------------------------.
+ * |  Gui  |   F1  |   F2  |   F3  |   F4  |   F5  |   F6  |   F7  |   F8  |   F9  |  F10  |  F11  |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |  Ctrl |   ~   |   [   |  PgUp |   ]   |       |       |   -   |   Up  |   =   |       |  F12  |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * | Shift |  Tab  |  Home |  PgDn |  End  |  Del  |       |  Left |  Down | Right |       |       |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |Alt/Tab|       |       |       |       | Fn/Spc|       |       |       |       |  Menu |Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_QW_FN] = {
+  {KC_LGUI, KC_F1,    KC_F2,   KC_F3,   KC_F4,   KC_F5,     KC_F6,   KC_F7,   KC_F8,   KC_F9,    KC_F10,  KC_F11},
+  {_______, KC_GRAVE, KC_LBRC, KC_PGUP, KC_RBRC, XXXXXXX,   XXXXXXX, KC_MINS, KC_UP,   KC_EQUAL, XXXXXXX, KC_F12},
+  {_______, KC_TAB,   KC_HOME, KC_PGDN, KC_END,  KC_DELETE, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX},
+  {_______, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, _______,   XXXXXXX, _______, _______, _______,  KC_MENU, _______}
+},
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------------------.
+ * |   S   |   T   |   P   |   H   |   *   |   F   |   P   |   L   |   T   |   D   |       |       |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |   S   |   K   |   W   |   R   |   *   |   R   |   B   |   G   |   S   |   Z   |       |       |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |   #   |   #   |   #   |   #   |       |   #   |   #   |   #   |   #   |   #   |       |       |
+ * |-------+-------+-------+-------+-------+---------------+-------+-------+-------+-------+-------|
+ * |       |       |   A   |   O   |       |   E   |   U   |       |       |       |       |Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_PLOVER] = {
+  {KC_Q,    KC_W,    KC_E, KC_R, KC_T,    KC_U, KC_I, KC_O,    KC_P,    KC_LBRC, XXXXXXX, XXXXXXX},
+  {KC_A,    KC_S,    KC_D, KC_F, KC_G,    KC_J, KC_K, KC_L,    KC_SCLN, KC_QUOT, XXXXXXX, XXXXXXX},
+  {KC_1,    KC_1,    KC_1, KC_1, XXXXXXX, KC_1, KC_1, KC_1,    KC_1,    KC_1,    XXXXXXX, XXXXXXX},
+  {XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LT(_ADJ, KC_ENT)}
+},
+
+/* Adjust
+ * ,-----------------------------------------------------------------------------------------------.
+ * |       |       |       |       |       |       |       |       | Insert| PrtSc | Pause | RESET |
+ * |-------+-------+-------+-------+-------+---------------+-------+-------+-------+-------+-------|
+ * |       |       |       |       |       |       |       | CapLk |Voice +| Audio |MIDIoff|       |
+ * |-------+-------+-------+-------+-------+-------|-------+-------+-------+-------+-------+-------|
+ * |       |       |       |       |       |       |       | ScrLk |Voice -| Music |MIDI on|       |
+ * |-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------|
+ * |       |       |       |       |       |       |       | Numlk |Workman| Qwerty| Plover|Adj/Ent|
+ * `-----------------------------------------------------------------------------------------------'
+ */
+
+[_ADJ] = {
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_INS,  KC_PSCR, KC_PAUSE, RESET},
+  {_______, _______, _______, _______, _______, _______, _______, KC_CLCK, MUV_IN,  AU_TOG,  MI_OFF,   _______},
+  {_______, _______, _______, _______, _______, _______, _______, KC_SLCK, MUV_DE,  MU_TOG,  MI_ON,    _______},
+  {_______, _______, _______, _______, _______, _______, _______, KC_NLCK, WORKMAN, QWERTY,  PLOVER,   _______}
+}
+
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2]    = SONG(STARTUP_SOUND);
+float tone_goodbye[][2]    = SONG(GOODBYE_SOUND);
+
+float tone_workman[][2]    = SONG(QWERTY_SOUND);
+float tone_qwerty[][2]     = SONG(COLEMAK_SOUND);
+float tone_plover[][2]     = SONG(PLOVER_SOUND);
+
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case WORKMAN:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_workman, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_WORKMAN);
+      }
+      return false;
+      break;
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case PLOVER:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_plover, false, 0);
+        #endif
+        if (!eeconfig_is_enabled()) {
+          eeconfig_init();
+        }
+        keymap_config.raw = eeconfig_read_keymap();
+        keymap_config.nkro = 1;
+        eeconfig_update_keymap(keymap_config.raw);
+        persistant_default_layer_set(1UL<<_PLOVER);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+void matrix_init_user(void) {
+    #ifdef AUDIO_ENABLE
+        startup_user();
+    #endif
+}
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+    _delay_ms(20); // gets rid of tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
+
+void music_on_user(void)
+{
+    music_scale_user();
+}
+
+void music_scale_user(void)
+{
+    PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
diff --git a/keyboards/planck/keymaps/impossible/readme.md b/keyboards/planck/keymaps/impossible/readme.md
new file mode 100644 (file)
index 0000000..02c7191
--- /dev/null
@@ -0,0 +1,73 @@
+# The Impossible Layout
+
+The Impossible Layout is named such because it manages to fit in both a numpad and an inverted-T arrow cluster into the same layer as the alpha keys.
+
+## Main layout
+
+The Impossible Layout places the middle column of the alphas onto where the punctuation keys were, moving he most used punctuation to be accessed by the thumbs. Because removing the middle columns fits with the Workman layout's philosopy, Workman is used as the basis for the layout. This means the layout should be very easy to learn for Workman users, and reasonable for Colemak users. Other space gains are made by combining keys that are only ever chorded with other non symbol keys (with function-layer alternatives where needed).
+
+### Alpha-numeric layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|   Q   |   D   |   R   |   W   |   B   |   F   |   U   |   P   |   J   |   7   |   8   |   9   |
+|   A   |   S   |   H   |   T   |   G   |   N   |   E   |   O   |   I   |   4   |   5   |   6   |
+|   Z   |   X   |   M   |   C   |   V   |   L   |   Y   |   K   |   Up  |   1   |   2   |   3   |
+|Alt/Tab|Gui/Esc|   ,   |CTL/Bsp| Fn/Ent|SFT/SPC|   .   |  Left |  Down | Right |   0   |Adj/Ent|
+
+### Function layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|   !   |   @   |   #   |   $   |   %   |   ^   |   &   |   *   |  F12  |   F7  |   F8  |   F9  |
+|  Tab  |   [   |   ]   |   -   |  Del  |   '   |   (   |   )   |  F11  |   F4  |   F5  |   F6  |
+|  Menu |       |       |   =   |   \   |   /   |       |       |  PgUp |   F1  |   F2  |   F3  |
+|Alt/Tab|  Gui  |   ~   |CTL/Bsp| Fn/Ent|SFT/Spc|   ;   |  Home |  PgDn |  End  |  F10  |Adj/Ent|
+
+## Qwerty
+
+The Qwerty layer, mostly intended for gaming use, makes use of the doubled chorded/non-symbolic keys to obtain use of the entire alpha-numeric typing area.
+
+### Qwerty layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|Gui/Esc|   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   |   0   | Bksp  |
+| Ctrl  |   Q   |   W   |   E   |   R   |   T   |   Y   |   U   |   I   |   O   |   P   |   /   |
+| Shift |   A   |   S   |   D   |   F   |   G   |   H   |   J   |   K   |   L   |   ;   |   "   |
+|Alt/Tab|   Z   |   X   |   C   |   V   | Fn/SPC|   B   |   N   |   M   |   ,   |   .   |Adj/Ent|
+
+### Qwerty Fn Layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|  Gui  |   F1  |   F2  |   F3  |   F4  |   F5  |   F6  |   F7  |   F8  |   F9  |  F10  |  F11  |
+|  Ctrl |   ~   |   [   |  PgUp |   ]   |       |       |   -   |   Up  |   =   |       |  F12  |
+| Shift |  Tab  |  Home |  PgDn |  End  |  Del  |       |  Left |  Down | Right |       |       |
+|Alt/Tab|       |       |       |       | Fn/Spc|       |       |       |       |  Menu |Adj/Ent|
+
+## Stenography
+
+The Steno/Plover layer moves the number row below the regular keys, providing a much more comfortable placement for the thumb keys. Using this layout will require a slightly different dictionary to account for different keys being adjacent to the number row.
+
+### Steno Layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|   S   |   T   |   P   |   H   |   *   |   F   |   P   |   L   |   T   |   D   |       |       |
+|   S   |   K   |   W   |   R   |   *   |   R   |   B   |   G   |   S   |   Z   |       |       |
+|   #   |   #   |   #   |   #   |       |   #   |   #   |   #   |   #   |   #   |       |       |
+|       |       |   A   |   O   |       |   E   |   U   |       |       |       |       |Adj/Ent|
+
+## Adjustments and Options
+
+In order to switch between layouts and change other keyboard settings, an adjustment layer is accessible from the same position over any layout.
+
+### Adjustment Layer
+
+|       |       |       |       |       |       |       |       |       |       |       |       |
+|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
+|       |       |       |       |       |       |       |       | Insert| PrtSc | Pause | RESET |
+|       |       |       |       |       |       |       | CapLk |Voice +| Audio |MIDIoff|       |
+|       |       |       |       |       |       |       | ScrLk |Voice -| Music |MIDI on|       |
+|       |       |       |       |       |       |       | Numlk |Workman| Qwerty| Plover|Adj/Ent|
diff --git a/keyboards/planck/keymaps/jhenahan/Makefile b/keyboards/planck/keymaps/jhenahan/Makefile
new file mode 100644 (file)
index 0000000..de01ad2
--- /dev/null
@@ -0,0 +1,25 @@
+
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = yes           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
diff --git a/keyboards/planck/keymaps/jhenahan/config.h b/keyboards/planck/keymaps/jhenahan/config.h
new file mode 100644 (file)
index 0000000..cd3adc4
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+#define FORCE_NKRO
+#define WORKMAN_SOUND COLEMAK_SOUND
+
+#endif
diff --git a/keyboards/planck/keymaps/jhenahan/keymap.c b/keyboards/planck/keymaps/jhenahan/keymap.c
new file mode 100644 (file)
index 0000000..2bda4b6
--- /dev/null
@@ -0,0 +1,314 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _WORKMAN 0
+#define _DEAD 1
+#define _QWERTY 2
+#define _LOWER 3
+#define _RAISE 4
+#define _PLOVER 5
+#define _ADJUST 16
+
+enum planck_keycodes {
+  WORKMAN = SAFE_RANGE,
+  DEAD,
+  QWERTY,
+  LOWER,
+  RAISE,
+  PLOVER,
+  EXT_PLV,
+  TOG_PLV
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+
+/* Workman
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   D  |   R  |   W  |   B  |   J  |   F  |   U  |   P  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   H  |   T  |   G  |   Y  |   N  |   E  |   O  |   I  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   M  |   C  |   V  |   K  |   L  | Dead |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | RAlt | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_WORKMAN] = {
+  {KC_TAB,              KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_SCLN, KC_BSPC},
+  {MT(MOD_LCTL,KC_ESC), KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    KC_QUOT},
+  {KC_LSFT,             KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    DEAD,    KC_DOT,  KC_SLSH, KC_ENT},
+  {KC_LCTL,             KC_RALT, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Workman Dead Layer
+ * ,-----------------------------------------------------------------------------------.
+ * |      |   %  |   &  |   ?  |   +  |   @  |   $  |   _  |   [  |   ]  |   !  |      |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |   /  |   (  |   =  |   0  |   {  |   }  |   1  |   *  |   )  |   -  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |   6  |   7  |   8  |   9  |   |  |   \  |   2  |   3  |   4  |   5  |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |   <  |   ~  |   `  |      ,      |   #  |   ^  |   >  |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DEAD] = {
+  {XXXXXXX,  KC_PERC, KC_AMPR, KC_QUES, KC_PLUS, KC_AT,   KC_DLR,  KC_UNDS, KC_LBRC, KC_RBRC,  KC_EXLM, XXXXXXX},
+  {XXXXXXX,  KC_SLSH, KC_LPRN, KC_EQL,  KC_0,    KC_LCBR, KC_RCBR, KC_1,    KC_ASTR, KC_RPRN,  KC_MINS, XXXXXXX},
+  {XXXXXXX,  KC_6,    KC_7,    KC_8,    KC_9,    KC_PIPE, KC_BSLS, KC_2,    KC_3,    KC_4,     KC_5,    XXXXXXX},
+  {XXXXXXX,  XXXXXXX, KC_LT,   KC_TILD, KC_GRV,  KC_COMM, KC_COMM, KC_HASH, KC_CIRC, KC_GT,    XXXXXXX, XXXXXXX}
+},
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | RAlt | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
+  {KC_LCTL, KC_RALT, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      | Vol+ |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Prev | Next | Vol- | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR,    KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS), _______, KC_VOLU, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV,    KC_MNXT, KC_VOLD, KC_MPLY}
+},
+
+/* Raise - KWM Interaction
+ * ,-----------------------------------------------------------------------------------.
+ * |Restrt|      |TgSplt|Flotng|Parent|FlScrn|InsMrk| InsW | InsS | InsN | InsE |      |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      | Mark |Rotate|Prefix| Term | BSP  |SwpMrk|SwapW |SwapS |SwapN |SwapE |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |MarkW |MarkS |MarkN |MarkE |Monocl|Float |FocusW|FocusS|FocusN|FocusE|      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = {
+  {LCAG(KC_Q), XXXXXXX,    LCAG(KC_S),       LCAG(KC_W),   LCAG(KC_D), LCAG(KC_F),        LCTL(S(KC_X)),    LCTL(S(KC_H)),    LCTL(S(KC_J)),     LCTL(S(KC_K)),    LCTL(S(KC_L)),    XXXXXXX},
+  {XXXXXXX,    LCAG(KC_M), LGUI(LCTL(KC_R)), LCAG(KC_DOT), LCAG(KC_T), LGUI(LCTL(KC_A)),  LCTL(LALT(KC_M)), LCTL(LALT(KC_H)), LCTL(LALT(KC_J)),  LCTL(LALT(KC_K)), LCTL(LALT(KC_L)), XXXXXXX},
+  {_______,    LCAG(KC_H), LCAG(KC_J),       LCAG(KC_K),   LCAG(KC_L), LGUI(LCTL(KC_S)),  LGUI(LCTL(KC_D)), LGUI(LALT(KC_H)), LGUI(LALT(KC_J)),  LGUI(LALT(KC_K)), LGUI(LALT(KC_L)), _______},
+  {_______,    _______,    _______,          _______,      _______,    _______,           _______,          _______,          _______,           _______,          _______,          _______}
+},
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------.
+ * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_PLOVER] = {
+  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
+  {XXXXXXX, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_SCLN, KC_BSPC},
+  {TOG_PLV, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    KC_QUOT},
+  {EXT_PLV, XXXXXXX, XXXXXXX, KC_M,    KC_C,    XXXXXXX, XXXXXXX, KC_L,    KC_COMM, XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Workmn|Plover|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  WORKMAN, PLOVER,  _______, _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2]    = SONG(STARTUP_SOUND);
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_workman[][2]    = SONG(WORKMAN_SOUND);
+float tone_plover[][2]     = SONG(PLOVER_SOUND);
+float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+
+float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case WORKMAN:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_workman, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_WORKMAN);
+      }
+      return false;
+      break;
+    case DEAD:
+      if (record->event.pressed) {
+        layer_on(_DEAD);
+        set_oneshot_layer(_DEAD, ONESHOT_START);
+        clear_oneshot_layer_state(ONESHOT_PRESSED);
+      }
+      return false;
+      break;
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_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 PLOVER:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          stop_all_notes();
+          PLAY_NOTE_ARRAY(tone_plover, false, 0);
+        #endif
+        layer_off(_RAISE);
+        layer_off(_LOWER);
+        layer_off(_ADJUST);
+        layer_on(_PLOVER);
+        if (!eeconfig_is_enabled()) {
+            eeconfig_init();
+        }
+        keymap_config.raw = eeconfig_read_keymap();
+        keymap_config.nkro = 1;
+        eeconfig_update_keymap(keymap_config.raw);
+      }
+      return false;
+      break;
+    case EXT_PLV:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+        #endif
+        layer_off(_PLOVER);
+      }
+      return false;
+      break;
+  case TOG_PLV:
+    if (record->event.pressed) {
+      register_code(KC_R);
+      register_code(KC_W);
+      register_code(KC_T);
+      register_code(KC_C);
+      register_code(KC_P);
+      register_code(KC_O);
+      clear_keyboard();
+    }
+    return false;
+    break;
+  }
+  return true;
+}
+
+void matrix_init_user(void) {
+    #ifdef AUDIO_ENABLE
+        startup_user();
+    #endif
+}
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+    _delay_ms(20); // gets rid of tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
+
+void music_on_user(void)
+{
+    music_scale_user();
+}
+
+void music_scale_user(void)
+{
+    PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
diff --git a/keyboards/planck/keymaps/jhenahan/readme.md b/keyboards/planck/keymaps/jhenahan/readme.md
new file mode 100644 (file)
index 0000000..a80506f
--- /dev/null
@@ -0,0 +1,41 @@
+# jhenahan's layout
+
+## Layout
+
+The base layer is based on the
+[Workman Dead](https://github.com/ojbucao/Workman/tree/master/mac) layout. The
+primary interaction layer is a slightly modified Workman layout with a 'dead'
+key on the third row under the middle finger. The dead key activates a layer of
+special characters.
+
+## [Layers](http://www.keyboard-layout-editor.com/#/gists/2b875f7d5d76fe4408c0a5b3bd76ddae)
+### Function Layer
+
+This is very slightly modified from the default, mainly just to rearrange the media keys.
+
+### [KWM](https://github.com/koekeishiya/kwm) Interaction Layer
+
+`kwm` is a tiling window manager for OS X. The keys defined in my keymap
+correspond to the settings I use in
+[my `kwmrc` file](https://github.com/jhenahan/dotfiles/blob/master/kwm/kwmrc).
+
+### QWERTY
+
+Just in case.
+
+### [Plover](http://www.openstenoproject.org/plover/)
+
+This layout functions exactly as a Workman layout unless you're running the Plover
+application. Includes a key for toggling Plover while it's running.
+
+Add this in the appropriate section of your `plover.cfg` to allow this altered layout:
+
+``` ini
+[System: English Stenotype]
+keymap[keyboard] = [["#", ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "="]], ["S-", ["q", "a"]], ["T-", ["d"]], ["K-", ["s"]], ["P-", ["r"]], ["W-", ["h"]], ["H-", ["w"]], ["R-", ["t"]], ["A-", ["m"]], ["O-", ["c"]], ["*", ["y", "g", "j", "b"]], ["-E", ["l"]], ["-U", [","]], ["-F", ["f"]], ["-R", ["n"]], ["-P", ["u"]], ["-B", ["e"]], ["-L", ["p"]], ["-G", ["o"]], ["-T", [";"]], ["-S", ["i"]], ["-D", ["BackSpace"]], ["-Z", ["'"]], ["no-op", ["\\", "]", "x", ".", "/"]], ["arpeggiate", ["space"]]]
+```
+
+### Adjust Layer
+
+This layer is only slightly modified from the default to remove Dvorak and
+Colemak and replace them with Workman.
index 0b2f060de409b8c1e27f6a6e9cf127bcbb6df43f..b2ff961fa5e218ef18cdfa3be565eef2f2e367d1 100644 (file)
@@ -1,12 +1,12 @@
 
 # Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
+#   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = no  # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)
 EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)
-CONSOLE_ENABLE   = no  # Console for debug(+400)
+CONSOLE_ENABLE   = yes # Console for debug(+400)
 COMMAND_ENABLE   = yes # Commands for debug and configuration
 NKRO_ENABLE      = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
index c857a3e89dbea44c7b4ed80fd26becd75da09ac6..1004c8b99f54f8a2f2683dcee9ddfbcbe041b7c8 100644 (file)
@@ -59,13 +59,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
 )
 
-/* ws2812 RGB LED */
-#define RGB_DI_PIN D1
-#define RGBLIGHT_TIMER
-#define RGBLED_NUM 28     // Number of LEDs
-#define RGBLIGHT_HUE_STEP 10
-#define RGBLIGHT_SAT_STEP 17
-#define RGBLIGHT_VAL_STEP 17
+#define BACKLIGHT_PIN B7
+#define BACKLIGHT_BREATHING
 
 /*
  * Feature disable options
@@ -73,10 +68,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /* disable debug print */
-//#define NO_DEBUG
+#ifndef NO_DEBUG
+#  define NO_DEBUG
+#endif
 
 /* disable print */
-//#define NO_PRINT
+// #ifndef NO_PRINT
+// #  define NO_PRINT
+// #endif
+
+/* Only print user print statements */
+#define USER_PRINT
+
 
 /* disable action features */
 //#define NO_ACTION_LAYER
index 0bb7f0def2386044acf32f60cf2a041d13fe66ce..6ad95832d24ae27f07070159a73c400a18ba822e 100644 (file)
@@ -2,48 +2,59 @@
 #include "action_layer.h"
 #include "eeconfig.h"
 #include "led.h"
+#include "mousekey.h"
 
 #ifdef AUDIO_ENABLE
     #include "audio.h"
     #include "song_list.h"
 #endif
 
-#define LAYER_QWERTY                     0
-#define LAYER_COLEMAK                    1
-#define LAYER_DVORAK                     2
-#define LAYER_UPPER                      3
-#define LAYER_LOWER                      4
-#define LAYER_FUNCTION                   5
-#define LAYER_MOUSE                      6
-#define LAYER_ADJUST                     7
-
-#define MACRO_QWERTY                     0
-#define MACRO_COLEMAK                    1
-#define MACRO_DVORAK                     2
-#define MACRO_UPPER                      3
-#define MACRO_LOWER                      4
-#define MACRO_FUNCTION                   5
-#define MACRO_MOUSE                      6
-#define MACRO_TIMBRE_1                   7
-#define MACRO_TIMBRE_2                   8
-#define MACRO_TIMBRE_3                   9
-#define MACRO_TIMBRE_4                  10
-#define MACRO_TEMPO_U                   11
-#define MACRO_TEMPO_D                   12
-#define MACRO_TONE_DEFAULT              13
-#define MACRO_MUSIC_TOGGLE              14
-#define MACRO_AUDIO_TOGGLE              16
-#define MACRO_INC_VOICE                 18
-#define MACRO_DEC_VOICE                 19
-#define MACRO_BACKLIGHT                 20
-#define MACRO_BREATH_TOGGLE             21
-#define MACRO_BREATH_SPEED_INC          23
-#define MACRO_BREATH_SPEED_DEC          24
-#define MACRO_BREATH_DEFAULT            25
+enum keyboard_layers {
+  LAYER_QWERTY = 0,
+  LAYER_UPPER,
+  LAYER_LOWER,
+  LAYER_FUNCTION,
+  LAYER_MOUSE,
+  LAYER_ADJUST,
+};
+enum keyboard_macros {
+  MACRO_QWERTY = 0,
+  MACRO_UPPER,
+  MACRO_LOWER,
+  MACRO_FUNCTION,
+  MACRO_MOUSE,
+  MACRO_TIMBRE_1,
+  MACRO_TIMBRE_2,
+  MACRO_TIMBRE_3,
+  MACRO_TIMBRE_4,
+  MACRO_TEMPO_U,
+  MACRO_TEMPO_D,
+  MACRO_TONE_DEFAULT,
+  MACRO_MUSIC_TOGGLE,
+  MACRO_AUDIO_TOGGLE,
+  MACRO_INC_VOICE,
+  MACRO_DEC_VOICE,
+  MACRO_BACKLIGHT,
+  MACRO_BREATH_TOGGLE,
+  MACRO_BREATH_SPEED_INC,
+  MACRO_BREATH_SPEED_DEC,
+  MACRO_BREATH_DEFAULT,
+  MACRO_MOUSE_MOVE_UL,
+  MACRO_MOUSE_MOVE_UR,
+  MACRO_MOUSE_MOVE_DL,
+  MACRO_MOUSE_MOVE_DR,
+  MACRO_HELP_1,
+  MACRO_HELP_2,
+  MACRO_HELP_3,
+  MACRO_HELP_4,
+  MACRO_HELP_5,
+  MACRO_HELP_6,
+  MACRO_HELP_7,
+  MACRO_HELP_8,
+  MACRO_HELP_9,
+};
 
 #define M_QWRTY             M(MACRO_QWERTY)
-#define M_COLMK             M(MACRO_COLEMAK)
-#define M_DVORK             M(MACRO_DVORAK)
 #define M_UPPER             M(MACRO_UPPER)
 #define M_LOWER             M(MACRO_LOWER)
 #define M_FUNCT             M(MACRO_FUNCTION)
 #define M_BSPDU             M(MACRO_BREATH_SPEED_INC)
 #define M_BSPDD             M(MACRO_BREATH_SPEED_DEC)
 #define M_BDFLT             M(MACRO_BREATH_DEFAULT)
+#define M_MS_UL             M(MACRO_MOUSE_MOVE_UL)
+#define M_MS_UR             M(MACRO_MOUSE_MOVE_UR)
+#define M_MS_DL             M(MACRO_MOUSE_MOVE_DL)
+#define M_MS_DR             M(MACRO_MOUSE_MOVE_DR)
+#define M_HELP1             M(MACRO_HELP_1)
+#define M_HELP2             M(MACRO_HELP_2)
+#define M_HELP3             M(MACRO_HELP_3)
+#define M_HELP4             M(MACRO_HELP_4)
+#define M_HELP5             M(MACRO_HELP_5)
+#define M_HELP6             M(MACRO_HELP_6)
+#define M_HELP7             M(MACRO_HELP_7)
+#define M_HELP8             M(MACRO_HELP_8)
+#define M_HELP9             M(MACRO_HELP_9)
 
 
 #define VC_UP               M(MACRO_INC_VOICE)
 #define SC_ACLS             LALT(KC_F4)
 #define SC_CCLS             LCTL(KC_F4)
 
+#define TG_NKRO             MAGIC_TOGGLE_NKRO
 #define OS_SHFT             KC_FN0
 
 #define _______             KC_TRNS
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
-/* QWERTY
- * .-----------------------------------------------------------------------------------------------------------.
- * | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | ESC    | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | UP     | ENTER  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  | SPACE  | LOWER  | SHIFT  | LEFT   | DOWN   | RIGHT  |
- * '-----------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_QWERTY]       = {  // QWERTY
-  { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC  },
-  { KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT  },
-  { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_UP,   KC_ENT   },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_LEFT, KC_DOWN, KC_RGHT  },
- },
-
-/* COLEMAK
- * .-----------------------------------------------------------------------------------------------------------.
- * | TAB    | Q      | W      | F      | P      | G      | J      | L      | U      | Y      | ;      | ESC    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | BACKSP | A      | R      | S      | T      | D      | H      | N      | E      | I      | O      | '      |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LSHIFT | Z      | X      | C      | V      | B      | K      | M      | ,      | .      | UP     | ENTER  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  | SPACE  | LOWER  | SHIFT  | LEFT   | DOWN   | RIGHT  |
- * '-----------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_COLEMAK]      = { // COLEMAK
-  { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_ESC   },
-  { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT  },
-  { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_UP,   KC_ENT   },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_LEFT, KC_DOWN, KC_RGHT  },
- },
-
-/* DVORAK
- * .-----------------------------------------------------------------------------------------------------------.
- * | TAB    | '      | ,      | .      | P      | Y      | F      | G      | C      | R      | L      | BACKSP |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | ESC    | A      | O      | E      | U      | I      | D      | H      | T      | N      | S      | /      |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LSHIFT | ;      | Q      | J      | K      | X      | B      | M      | W      | V      | Z      | ENTER  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  | SPACE  | LOWER  | UP     | DOWN   | LEFT   | RIGHT  |
- * '-----------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_DVORAK]       = { // DVORAK
-  { KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC  },
-  { KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH  },
-  { KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT   },
-  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, KC_UP,   KC_DOWN, KC_LEFT, KC_RGHT  },
- },
-
-/* UPPER
- * .-----------------------------------------------------------------------------------------------------------.
- * | PRINT  | F1     | F2     | F3     | F4     | NUM LK | /      | 7      | 8      | 9      | -      | DEL    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | CAP LK | F5     | F6     | F7     | F8     | SCR LK | *      | 4      | 5      | 6      | +      | INS    |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * |        | F9     | F10    | F11    | F12    | PAUSE  |        | 1      | 2      | 3      | ENTER  | HOME   |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * |        |        |        |        |        | 0      | 0      |        | RALT   | .      | ENTER  | END    |
- * '-----------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_UPPER]        = { // UPPER
-  { KC_PSCR, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_DEL   },
-  { KC_CAPS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_SLCK, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_INS   },
-  { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_PAUS, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, KC_HOME  },
-  { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, KC_END   },
- },
-
-/* LOWER
- * .-----------------------------------------------------------------------------------------------------------.
- * |        | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      | PG UP  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * |        | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      | PG DN  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * |        | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | HOME   |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
- * |        |        |        |        |        |        |        |        |        |        |        | END    |
- * '-----------------------------------------------------------------------------------------------------------'
- */
-
- [LAYER_LOWER]        = { // LOWER
-  { _______, KC_DLR,  KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT,   KC_PGUP  },
-  { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT,  KC_GRV,  KC_PGDN  },
-  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL,  KC_LT,   KC_GT,   KC_QUES, KC_HOME  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END   },
- },
-
-
-/* FUNCTION
- * .-----------------------------------------------------------------------------------------------------------.
- * | NUM LK | F13    | F14    | F15    | F16    | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | PAUSE  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | CAP LK | F17    | F18    | F19    | F20    | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | PRINT  |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | SCR LK | F21    | F22    | F23    | F24    | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MUTE   |
- * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | PLAY   | PLAY   | LOWER  | VOL UP | VOL DN | NEXT   | PREV   |
- * '-----------------------------------------------------------------------------------------------------------'
- */
- [LAYER_FUNCTION]     = { // FUNCTION
-  { KC_NLCK, KC_F13,  KC_F14,  KC_F15,  KC_F16,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS  },
-  { KC_CAPS, KC_F17,  KC_F18,  KC_F19,  KC_F20,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSCR  },
-  { KC_SLCK, KC_F21,  KC_F22,  KC_F23,  KC_F24,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE  },
-  { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, KC_VOLU, KC_VOLD, KC_MPRV, KC_MNXT  },
- },
-
-#ifdef MOUSEKEY_ENABLE
-
- [LAYER_MOUSE]        = { // MOUSE
-  { KC_ESC,  KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC   },
-  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
-  { _______, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_U, KC_WH_D  },
-  { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_MS_U, KC_MS_D, KC_MS_L, KC_MS_R  },
- },
-
-#endif
-
- [LAYER_ADJUST]       = { // ADJUST
-  { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, MU_TOG,  AU_TOG   },
-  { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______  },
-  { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, MUV_IN,  _______  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MUV_DE,  _______  },
- },
-
-/*
- [LAYER_EMPTY]        = {
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  },
-  { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,  },
-  { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______,  },
- },
+/* LAYER = LAYER_QWERTY
+  .-----------------------------------------------------------------------------------------------------------.
+  | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | BACKSP |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ESC    | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | UP     | ENTER  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | LCTRL  | LWIN   | FN     | LALT   | UPPER  | SPACE  | SPACE  | LOWER  | OSHIFT | LEFT   | DOWN   | RIGHT  |
+  '-----------------------------------------------------------------------------------------------------------'
 */
+[LAYER_QWERTY] = {
+  { KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_BSPC },
+  { KC_ESC , KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_QUOT },
+  { KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_N   , KC_M   , KC_COMM, KC_DOT , KC_UP  , KC_ENT  },
+  { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC , KC_SPC , M_LOWER, OS_SHFT, KC_LEFT, KC_DOWN, KC_RGHT }
+},
+/* LAYER = LAYER_UPPER
+  .-----------------------------------------------------------------------------------------------------------.
+  | PRINT  | F1     | F2     | F3     | F4     | NUM LK | KP /   | KP 7   | KP 8   | KP 9   | KP -   | DEL    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | PAUSE  | F5     | F6     | F7     | F8     | SCR LK | KP *   | KP 4   | KP 5   | KP 6   | KP +   | INS    |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | F9     | F10    | F11    | F12    | PAUSE  | KP 0   | KP 1   | KP 2   | KP 3   | KP ENT | HOME   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | UPPER  | KP 0   | KP 0   | ______ | RALT   | KP .   | KP ENT | END    |
+  '-----------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_UPPER] = {
+  { KC_PSCR, KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_DEL  },
+  { KC_PAUS, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_SLCK, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_INS  },
+  { _______, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_PAUS, KC_KP_0, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, KC_HOME },
+  { _______, _______, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, KC_END  }
+},
+/* LAYER = LAYER_LOWER
+  .-----------------------------------------------------------------------------------------------------------.
+  | ______ | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      | PG UP  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      | PG DN  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | HOME   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | ______ | ______ | ______ | LOWER  | ______ | ______ | ______ | END    |
+  '-----------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_LOWER] = {
+  { _______, KC_DLR , KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT  , KC_PGUP },
+  { _______, KC_CIRC, KC_ASTR, KC_PLUS, KC_MINS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT , KC_GRV , KC_PGDN },
+  { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL , KC_LT  , KC_GT  , KC_QUES, KC_HOME },
+  { _______, _______, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, KC_END  }
+},
+/* LAYER = LAYER_FUNCTION
+  .-----------------------------------------------------------------------------------------------------------.
+  | XXXXXX | F13    | F14    | F15    | F16    | NUM LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | F17    | F18    | F19    | F20    | SCR LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | F21    | F22    | F23    | F24    | CAP LK | XXXXXX | XXXXXX | XXXXXX | XXXXXX | VOL UP | MUTE   |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | FN     | ______ | ______ | PLAY   | PLAY   | ______ | ______ | PREV   | VOL DN | NEXT   |
+  '-----------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_FUNCTION] = {
+  { XXXXXXX, KC_F13 , KC_F14 , KC_F15 , KC_F16 , KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , KC_SLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { _______, KC_F21 , KC_F22 , KC_F23 , KC_F24 , KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE },
+  { _______, _______, M_FUNCT, _______, _______, KC_MPLY, KC_MPLY, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT }
+},
+/* LAYER = LAYER_MOUSE
+  .-----------------------------------------------------------------------------------------------------------.
+  | ESC    | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS UL  | MS U   | MS UR  | MS WHL | MS WHR |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | MS BT5 | MS BT4 | MS BT3 | MS BT2 | XXXXXX | XXXXXX | MS L   | XXXXXX | MS R   | XXXXXX | MS WHU |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | MS DL  | MS D   | MS DR  | MS U   | MS WHD |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | ______ | ______ | ______ | ______ | ______ | MS BT1 | MS BT1 | ______ | ______ | MS L   | MS D   | MS R   |
+  '-----------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_MOUSE] = {
+  { KC_ESC , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_UL, KC_MS_U, M_MS_UR, KC_WH_L, KC_WH_R },
+  { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, KC_MS_L, XXXXXXX, KC_MS_R, XXXXXXX, KC_WH_U },
+  { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_MS_DL, KC_MS_D, M_MS_DR, KC_MS_U, KC_WH_D },
+  { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R }
+},
+/* LAYER = LAYER_ADJUST
+  .-----------------------------------------------------------------------------------------------------------.
+  | XXXXXX | HELP 1 | HELP 2 | HELP 3 | HELP 4 | HELP 5 | HELP 6 | HELP 7 | HELP 8 | HELP 9 | MUSIC  | AUDIO  |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | BRTOG  | BRSPD+ | BRSPD- | BRDFLT | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | QWERTY | XXXXXX | XXXXXX | BACKLT | RESET  | XXXXXX | MOUSE  | XXXXXX | XXXXXX | VOICE+ | XXXXXX |
+  |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | UPPER  | XXXXXX | XXXXXX | LOWER  | XXXXXX | TEMPO- | VOICE- | TEMPO+ |
+  '-----------------------------------------------------------------------------------------------------------'
+*/
+[LAYER_ADJUST] = {
+  { XXXXXXX, M_HELP1, M_HELP2, M_HELP3, M_HELP4, M_HELP5, M_HELP6, M_HELP7, M_HELP8, M_HELP9, MU_TOG , AU_TOG  },
+  { XXXXXXX, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX },
+  { XXXXXXX, M_QWRTY, XXXXXXX, XXXXXXX, M_BACKL, RESET  , XXXXXXX, M_MOUSE, XXXXXXX, XXXXXXX, MUV_IN , XXXXXXX },
+  { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, TMPO_DN, MUV_DE , TMPO_UP }
+},
 
 };
 
@@ -234,10 +221,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 float tone_my_startup[][2] = SONG(ODE_TO_JOY);
 float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
 
-float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
-float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
-float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
-
 float tone_audio_on[][2]   = SONG(CLOSE_ENCOUNTERS_5_NOTE);
 float tone_music_on[][2]   = SONG(DOE_A_DEER);
 float tone_caps_on[][2]    = SONG(CAPS_LOCK_ON_SOUND);
@@ -257,7 +240,7 @@ void persistant_default_layer_set(uint16_t default_layer)
 }
 
 const uint16_t PROGMEM fn_actions[] = {
-    [0] = ACTION_MODS_ONESHOT(MOD_LSFT),
+    [0] = ACTION_MODS_ONESHOT(MOD_RSFT),
 };
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
@@ -267,46 +250,101 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
     switch(id)
     {
 
-        case MACRO_QWERTY:
+        case MACRO_HELP_1:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_QWERTY);
-                               #ifdef AUDIO_ENABLE
-                       PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                               uprintf("1");
             }
             break;
 
-        case MACRO_COLEMAK:
+        case MACRO_HELP_2:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_COLEMAK);
-                               #ifdef AUDIO_ENABLE
-                       PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                               uprintf("2");
             }
             break;
 
-        case MACRO_DVORAK:
+        case MACRO_HELP_3:
             if (record->event.pressed)
             {
-                persistant_default_layer_set(1UL<<LAYER_DVORAK);
-                               #ifdef AUDIO_ENABLE
-                   PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
-                               #endif /* AUDIO_ENABLE */
+                               uprintf("3");
             }
             break;
 
-        case MACRO_LOWER:
+        case MACRO_HELP_4:
             if (record->event.pressed)
             {
-                layer_on(LAYER_LOWER);
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+                               uprintf("4");
             }
-            else
+            break;
+
+        case MACRO_HELP_5:
+            if (record->event.pressed)
             {
-                layer_off(LAYER_LOWER);
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+                               uprintf("5");
+            }
+            break;
+
+        case MACRO_HELP_6:
+            if (record->event.pressed)
+            {
+                               uprintf("6");
+            }
+            break;
+
+        case MACRO_HELP_7:
+            if (record->event.pressed)
+            {
+                               uprintf("7");
+            }
+            break;
+
+        case MACRO_HELP_8:
+            if (record->event.pressed)
+            {
+                               uprintf("8");
+            }
+            break;
+
+        case MACRO_HELP_9:
+            if (record->event.pressed)
+            {
+                               uprintf("9");
+            }
+            break;
+
+        case MACRO_BREATH_TOGGLE:
+            if (record->event.pressed)
+            {
+                breathing_toggle();
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_INC:
+            if (record->event.pressed)
+            {
+                breathing_speed_inc(1);
+            }
+            break;
+
+        case MACRO_BREATH_SPEED_DEC:
+            if (record->event.pressed)
+            {
+                breathing_speed_dec(1);
+            }
+            break;
+
+        case MACRO_BREATH_DEFAULT:
+            if (record->event.pressed)
+            {
+                breathing_defaults();
+            }
+            break;
+
+        case MACRO_QWERTY:
+            if (record->event.pressed)
+            {
+                persistant_default_layer_set(1UL<<LAYER_QWERTY);
             }
             break;
 
@@ -314,6 +352,8 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             if (record->event.pressed)
             {
                 layer_on(LAYER_UPPER);
+                breathing_speed_set(2);
+                breathing_pulse();
                 update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
             }
             else
@@ -323,13 +363,32 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             }
             break;
 
+        case MACRO_LOWER:
+            if (record->event.pressed)
+            {
+                layer_on(LAYER_LOWER);
+                breathing_speed_set(2);
+                breathing_pulse();
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+            }
+            else
+            {
+                layer_off(LAYER_LOWER);
+                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+            }
+            break;
+
         case MACRO_FUNCTION:
             if (record->event.pressed)
             {
+                breathing_speed_set(3);
+                breathing_enable();
                 layer_on(LAYER_FUNCTION);
             }
             else
             {
+                breathing_speed_set(1);
+                breathing_self_disable();
                 layer_off(LAYER_FUNCTION);
             }
             break;
@@ -352,6 +411,58 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             }
             break;
 
+        case MACRO_MOUSE_MOVE_UL:
+            if (record->event.pressed)
+            {
+              mousekey_on(KC_MS_UP);
+              mousekey_on(KC_MS_LEFT);
+            }
+            else
+            {
+              mousekey_off(KC_MS_UP);
+              mousekey_off(KC_MS_LEFT);
+            }
+            break;
+
+        case MACRO_MOUSE_MOVE_UR:
+            if (record->event.pressed)
+            {
+              mousekey_on(KC_MS_UP);
+              mousekey_on(KC_MS_RIGHT);
+            }
+            else
+            {
+              mousekey_off(KC_MS_UP);
+              mousekey_off(KC_MS_RIGHT);
+            }
+            break;
+
+        case MACRO_MOUSE_MOVE_DL:
+            if (record->event.pressed)
+            {
+              mousekey_on(KC_MS_DOWN);
+              mousekey_on(KC_MS_LEFT);
+            }
+            else
+            {
+              mousekey_off(KC_MS_DOWN);
+              mousekey_off(KC_MS_LEFT);
+            }
+            break;
+
+        case MACRO_MOUSE_MOVE_DR:
+            if (record->event.pressed)
+            {
+              mousekey_on(KC_MS_DOWN);
+              mousekey_on(KC_MS_RIGHT);
+            }
+            else
+            {
+              mousekey_off(KC_MS_DOWN);
+              mousekey_off(KC_MS_RIGHT);
+            }
+            break;
+
 #endif /* MOUSEKEY_ENABLE */
 
 #ifdef AUDIO_ENABLE
diff --git a/keyboards/planck/keymaps/sgoodwin/Makefile b/keyboards/planck/keymaps/sgoodwin/Makefile
new file mode 100644 (file)
index 0000000..581e08c
--- /dev/null
@@ -0,0 +1,25 @@
+
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = yes           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/planck/keymaps/sgoodwin/keymap.c b/keyboards/planck/keymaps/sgoodwin/keymap.c
new file mode 100644 (file)
index 0000000..4d5d3d7
--- /dev/null
@@ -0,0 +1,233 @@
+// This is sgoodwin's layout file for the Quantum project.
+// It doesn't have Plover or Dvorak layers because he doesn't use that.
+// It Also doesn't allow for swapping alt with CMD because that only happens in error.
+
+#include "planck.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 1
+#define _COLEMAK 0
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 16
+
+enum planck_keycodes {
+  COLEMAK = SAFE_RANGE,
+  QWERTY,
+  LOWER,
+  RAISE,
+  BACKLIT,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |SHEnt |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Hyper| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, MT(MOD_RSFT, KC_ENT) },
+  {ALL_T(KC_NO),  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |SHEnt |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Hyper| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = {
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
+  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, MT(MOD_RSFT, KC_ENT) },
+  {ALL_T(KC_NO),  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
+  {BACKLIT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = {
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______},
+  {BACKLIT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Aud on|Audoff|      |      |Qwerty|Colemk|      |      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AU_ON,   AU_OFF,  _______, _______, QWERTY,  COLEMAK, _______, _______, _______},
+  {_______, MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2]    = SONG(STARTUP_SOUND);
+float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
+float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
+float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
+
+float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        #ifdef AUDIO_ENABLE
+          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+        #endif
+        persistant_default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case BACKLIT:
+      if (record->event.pressed) {
+        register_code(KC_RSFT);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+void matrix_init_user(void) {
+    #ifdef AUDIO_ENABLE
+        startup_user();
+    #endif
+}
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+    _delay_ms(20); // gets rid of tick
+    PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+    _delay_ms(150);
+    stop_all_notes();
+}
+
+void music_on_user(void)
+{
+    music_scale_user();
+}
+
+void music_scale_user(void)
+{
+    PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
diff --git a/keyboards/planck/keymaps/sgoodwin/readme.md b/keyboards/planck/keymaps/sgoodwin/readme.md
new file mode 100644 (file)
index 0000000..dfa88f3
--- /dev/null
@@ -0,0 +1,10 @@
+# sgoodwin's Planck Layout
+
+Includes:
+
+1. No Dvorak or Plover
+2. No alt-swapping
+3. Right enter is shift when held down, enter when tapped.
+4. Bottom left corner in normal layers is Hyper and not brightness control.
+5. Brightness is instead in the bottom corner on raise/lower.
+
diff --git a/keyboards/planck/keymaps/tong92/Makefile b/keyboards/planck/keymaps/tong92/Makefile
new file mode 100644 (file)
index 0000000..e6608e7
--- /dev/null
@@ -0,0 +1,62 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+#                Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+#               (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+#            have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+#             have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+#               (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+#                (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+#              with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+#                   bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+# Build Options
+#   change to "no" to disable the options, or define them in the makefile.mk in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE  = no # Audio control and System control(+450)
+CONSOLE_ENABLE   = no  # Console for debug(+400)
+COMMAND_ENABLE   = yes # Commands for debug and configuration
+NKRO_ENABLE      = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+MIDI_ENABLE      = no  # MIDI controls
+AUDIO_ENABLE     = no # Audio output on port C6
+UNICODE_ENABLE   = no  # Unicode
+BLUETOOTH_ENABLE = no  # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE  = no  # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/planck/keymaps/tong92/keymap.c b/keyboards/planck/keymaps/tong92/keymap.c
new file mode 100644 (file)
index 0000000..2be28fb
--- /dev/null
@@ -0,0 +1,146 @@
+//Author: tong92 <tong92power@gmail.com>
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+  #include "backlight.h"
+#endif
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+#define LOWER M(1)
+#define RAISE M(2)
+#define GO_DEFT M(99)
+#
+
+//MIT Layout
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* 0: Qwerty layer (Default)
+* ,-----------------------------------------------------------------------.
+* |Tab  | q   | w   | e   | r   | t   | y   | u   | i   | o   | p   | BS  |
+* |-----------------------------------------------------------------------|
+* |Ctrl | a   | s   | d   | f   | g   | h   | j   | k   | l   | ;   |enter|
+* |-----------------------------------------------------------------------|
+* |Shift| z   | x   | c   | v   | b   | n   | m   |  ,  |  .  |  /  |Shift|
+* |-----------------------------------------------------------------------|
+* | Fn  |Ctrl | Win | Alt |Lower|   Space   |Upper|  '  |  [  |  ]  | Alt |
+* `-----------------------------------------------------------------------'
+*/
+[0] ={
+{KC_TAB, KC_Q,   KC_W,   KC_E,   KC_R, KC_T,  KC_Y,  KC_U, KC_I,   KC_O,   KC_P,   KC_BSPC},
+{KC_LCTL,KC_A,   KC_S,   KC_D,   KC_F, KC_G,  KC_H,  KC_J, KC_K,   KC_L,   KC_SCLN,KC_ENT },
+{KC_LSFT,KC_Z,   KC_X,   KC_C,   KC_V, KC_B,  KC_N,  KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT},
+{MO(4),  KC_RCTL,KC_LGUI,KC_LALT,LOWER,KC_SPC,KC_SPC,RAISE,KC_QUOT,KC_LBRC,KC_RBRC,KC_RALT}
+},
+/* 1: Lower layer
+* ,-----------------------------------------------------------------------.
+* |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  | BS  |
+* |-----------------------------------------------------------------------|
+* |     | F1  | F2  | F3  | F4  | F5  | F6  |  -  |  +  |  [  |  ]  |  \  |
+* |-----------------------------------------------------------------------|
+* |     | F7  | F8  | F9  | F10 | F11 | F12 |     | HOME| PgUp|  UP | PgDo|
+* |-----------------------------------------------------------------------|
+* |     |     |     |     |     |   SPACE   |mouse| END | LEFT| DOWN|RIGHT|
+* `-----------------------------------------------------------------------'
+*/
+[1] ={
+{KC_GRV, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,  KC_6,  KC_7,   KC_8,   KC_9,   KC_0,   KC_BSPC },
+{_______,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5, KC_F6, KC_MINS,KC_PLUS,KC_LBRC,KC_RBRC,KC_BSLS },
+{_______,KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11,KC_F12,_______,KC_HOME,KC_PGUP,KC_UP  ,KC_PGDN },
+{XXXXXXX,_______,_______,_______,_______,KC_SPC,KC_SPC,_______,KC_END, KC_LEFT,KC_DOWN,KC_RIGHT}
+},
+/* 2: Upper layer
+* ,-----------------------------------------------------------------------.
+* |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  | BS  |
+* |-----------------------------------------------------------------------|
+* |     | F1  | F2  | F3  | F4  | F5  | F6  |  _  |  =  |  {  |  }  |  |  |
+* |-----------------------------------------------------------------------|
+* |     | F7  | F8  | F9  | F10 | F11 | F12 |     | HOME| PgUp|  UP | PgDo|
+* |-----------------------------------------------------------------------|
+* |     |     |     |     |mouse|   SPACE   |     | END | LEFT| DOWN|RIGHT|
+* `-----------------------------------------------------------------------'
+*/
+[2] ={
+{KC_TILD,KC_EXLM,KC_AT,  KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSPC },
+{_______,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_UNDS,KC_EQL, KC_LCBR,KC_RCBR,KC_PIPE },
+{_______,KC_F7,  KC_F8,  KC_F9,  KC_F10, KC_F11, KC_F12, _______,KC_HOME,KC_PGUP,KC_UP  ,KC_PGDN },
+{XXXXXXX,_______,_______,_______,_______,KC_SPC, KC_SPC, _______,KC_END, KC_LEFT,KC_DOWN,KC_RIGHT}
+},
+/* 4: fn layer (Window shortcuts)
+* ,-----------------------------------------------------------------------.
+* | ESC |WinOf|WinUp|     |     |Sh+Ca|     | PgUp| UP  | PgDo|PrtSc| DEL |
+* |-----------------------------------------------------------------------|
+* |     |WinLe|WinDo|WinRi|     |Al+Ca|CapsL| LEFT| DOWN|RIGHT|     |     |
+* |-----------------------------------------------------------------------|
+* |     |WinLW|WinRW|     |     |Ct+Ca|ScroL| HOME|     | END |     |     |
+* |-----------------------------------------------------------------------|
+* |     |DeskL|DeskR|DeskX|Task | ChangeLang|     |     |     |     | LED |
+* `-----------------------------------------------------------------------'
+*/
+[4] ={
+{KC_ESC ,LALT(KC_F4)        ,LGUI(KC_UP)         ,XXXXXXX          ,XXXXXXX    ,S(KC_CAPS)   ,XXXXXXX,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_DELT},
+{_______,LGUI(KC_LEFT)      ,LGUI(KC_DOWN)       ,LGUI(KC_RIGHT)   ,XXXXXXX    ,LALT(KC_CAPS),KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,XXXXXXX,XXXXXXX},
+{_______,LGUI(LSFT(KC_LEFT)),LGUI(LSFT(KC_RIGHT)),XXXXXXX          ,XXXXXXX    ,LCTL(KC_CAPS),KC_SLCK,KC_HOME,XXXXXXX,KC_END,XXXXXXX,XXXXXXX},
+{KC_TRNS,LGUI(LCTL(KC_LEFT)),LGUI(LCTL(KC_RIGHT)),LGUI(LCTL(KC_F4)),LCTL(LALT(KC_DELT)),LGUI(KC_SPC),LGUI(KC_SPC),XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,M(0)}
+},
+/* 10: mouse layer
+* ,-----------------------------------------------------------------------.
+* |     |     |     |Mo_Up|     |     |     |M_WhL|M_WhU|M_WhR|     |RESET|
+* |-----------------------------------------------------------------------|
+* |     |     |Mo_Le|Mo_Do|Mo_Ri|     |     |M_Bt1|M_WhD|M_Bt2|     |     |
+* |-----------------------------------------------------------------------|
+* |     |     |     |     |     |     |     |M_AC0|M_AC1|M_AC2|     |     |
+* |-----------------------------------------------------------------------|
+* |     |     |     |     |     |  GO_DEFT  |     |     |     |     |     |
+* `-----------------------------------------------------------------------'
+*/
+[10] ={
+{XXXXXXX,XXXXXXX,XXXXXXX,KC_MS_U,XXXXXXX,XXXXXXX,XXXXXXX,KC_WH_L,KC_WH_U,KC_WH_R,XXXXXXX,RESET},
+{XXXXXXX,XXXXXXX,KC_MS_L,KC_MS_D,KC_MS_R,XXXXXXX,XXXXXXX,KC_BTN1,KC_WH_D,KC_BTN2,XXXXXXX,XXXXXXX},
+{XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,KC_ACL0,KC_ACL1,KC_ACL2,XXXXXXX,XXXXXXX},
+{XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,GO_DEFT,GO_DEFT,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX}
+}
+
+}; 
+//Layout END
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+      switch(id) {
+        case 0:
+            if (record->event.pressed) {
+                #ifdef BACKLIGHT_ENABLE
+                    backlight_step();
+                #endif
+            }
+        break;
+        case 1:
+          if (record->event.pressed) {
+            layer_on(1);
+            update_tri_layer(1, 2, 10);
+          } else {
+            layer_off(1);
+            update_tri_layer(1, 2, 10);
+          }
+          break;
+        case 2:
+          if (record->event.pressed) {
+            layer_on(2);
+            update_tri_layer(1, 2, 10);
+          } else {
+            layer_off(2);
+            update_tri_layer(1, 2, 10);
+          }
+          break;
+        case 99:
+            if (record->event.pressed) {
+                layer_off(10);
+                layer_off(1);
+                layer_off(2);
+                layer_on(0);
+                update_tri_layer(0 ,1 ,2);
+            }
+        break;
+      }
+    return MACRO_NONE;
+};
\ No newline at end of file
diff --git a/keyboards/planck/keymaps/tong92/readme.md b/keyboards/planck/keymaps/tong92/readme.md
new file mode 100644 (file)
index 0000000..328d005
--- /dev/null
@@ -0,0 +1,66 @@
+# The Tong92 Layout
+- MIT Layout
+- my keymap for WIndow User
+- Lower && Upper Hold -> Mouse Layer
+- Mouse Layer : space -> Default Layer
+- No Audio
+
+## 1. Default Layer - Qwerty 
+
+    ,-----------------------------------------------------------------------.
+    |Tab  | q   | w   | e   | r   | t   | y   | u   | i   | o   | p   | BS  |
+    |-----------------------------------------------------------------------|
+    |Ctrl | a   | s   | d   | f   | g   | h   | j   | k   | l   | ;   |enter|
+    |-----------------------------------------------------------------------|
+    |Shift| z   | x   | c   | v   | b   | n   | m   |  ,  |  .  |  /  |Shift|
+    |-----------------------------------------------------------------------|
+    | Fn  |Ctrl | Win | Alt |Lower|   Space   |Upper|  '  |  [  |  ]  | Alt |
+    `-----------------------------------------------------------------------'
+
+## 2. Lower Layer
+
+    ,-----------------------------------------------------------------------.
+    |  `  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  0  | BS  |
+    |-----------------------------------------------------------------------|
+    |     | F1  | F2  | F3  | F4  | F5  | F6  |  -  |  +  |  [  |  ]  |  \  |
+    |-----------------------------------------------------------------------|
+    |     | F7  | F8  | F9  | F10 | F11 | F12 |     | HOME| PgUp|  UP | PgDo|
+    |-----------------------------------------------------------------------|
+    |     |     |     |     |     |   SPACE   |mouse| END | LEFT| DOWN|RIGHT|
+    `-----------------------------------------------------------------------'
+
+## 3. Upper Layer
+
+    ,-----------------------------------------------------------------------.
+    |  ~  |  !  |  @  |  #  |  $  |  %  |  ^  |  &  |  *  |  (  |  )  | BS  |
+    |-----------------------------------------------------------------------|
+    |     | F1  | F2  | F3  | F4  | F5  | F6  |  _  |  =  |  {  |  }  |  |  |
+    |-----------------------------------------------------------------------|
+    |     | F7  | F8  | F9  | F10 | F11 | F12 |     | HOME| PgUp|  UP | PgDo|
+    |-----------------------------------------------------------------------|
+    |     |     |     |     |mouse|   SPACE   |     | END | LEFT| DOWN|RIGHT|
+    `-----------------------------------------------------------------------'
+
+## 4. Fn Layer -  Window Shortcuts
+
+    ,-----------------------------------------------------------------------.
+    | ESC |WinOf|WinUp|     |     |Sh+Ca|     | PgUp| UP  | PgDo|PrtSc| DEL |
+    |-----------------------------------------------------------------------|
+    |     |WinLe|WinDo|WinRi|     |Al+Ca|CapsL| LEFT| DOWN|RIGHT|     |     |
+    |-----------------------------------------------------------------------|
+    |     |WinLW|WinRW|     |     |Ct+Ca|ScroL| HOME|     | END |     |     |
+    |-----------------------------------------------------------------------|
+    |     |DeskL|DeskR|DeskX|Task | ChangeLang|     |     |     |     | LED |
+    `-----------------------------------------------------------------------'
+
+## 5. Mouse Layer
+
+    ,-----------------------------------------------------------------------.
+    |     |     |     |Mo_Up|     |     |     |M_WhL|M_WhU|M_WhR|     |RESET|
+    |-----------------------------------------------------------------------|
+    |     |     |Mo_Le|Mo_Do|Mo_Ri|     |     |M_Bt1|M_WhD|M_Bt2|     |     |
+    |-----------------------------------------------------------------------|
+    |     |     |     |     |     |     |     |M_AC0|M_AC1|M_AC2|     |     |
+    |-----------------------------------------------------------------------|
+    |     |     |     |     |     |GO_DEFAULT |     |     |     |     |     |
+    `-----------------------------------------------------------------------'
\ No newline at end of file
index f89fdeb931a9da1f8fa02def16d41fa2de94b908..4b24a690e04d2d8f3632b89a1264decc5a114511 100644 (file)
@@ -13,15 +13,17 @@ Download or clone the whole firmware and navigate to the keyboards/planck folder
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
+
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
 
 ### Notable forks (which some of the keymap files are from)
index 3ed1445e434f081285ea25e3b0c6cdde98b9e62c..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,5 +1,3 @@
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/planck/rev3/rules.mk b/keyboards/planck/rev3/rules.mk
new file mode 100644 (file)
index 0000000..3ed1445
--- /dev/null
@@ -0,0 +1,5 @@
+AUDIO_ENABLE ?= no           # Audio output on port C6
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
\ No newline at end of file
index ed09f85a4d49fb5ac4a2a1113f033255e2e6cab6..191c6bb664de85727cd5fb1c36ab6f14ab207d96 100644 (file)
@@ -1,5 +1,3 @@
-AUDIO_ENABLE ?= yes           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../../Makefile
 endif
\ No newline at end of file
diff --git a/keyboards/planck/rev4/rules.mk b/keyboards/planck/rev4/rules.mk
new file mode 100644 (file)
index 0000000..ed09f85
--- /dev/null
@@ -0,0 +1,5 @@
+AUDIO_ENABLE ?= yes           # Audio output on port C6
+
+ifndef QUANTUM_DIR
+       include ../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk
new file mode 100644 (file)
index 0000000..25db53a
--- /dev/null
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
\ No newline at end of file
index 08e9205cbf1f30a6223dd98f0f40f094288556d8..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,73 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-# Build Options
-#   change to "no" to disable the options, or define them in the Makefile in 
-#   the appropriate keymap folder that will get included automatically
-#
-BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= no         # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no            # MIDI controls
-AUDIO_ENABLE ?= no           # Audio output on port C6
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
 endif
\ No newline at end of file
index f0be255a0952ce08610358115d70cf428d276184..10763ee97a406bf61082ca80ce70f342c552c4b4 100644 (file)
@@ -13,13 +13,15 @@ Download or clone the whole firmware and navigate to the keyboards/preonic folde
 Depending on which keymap you would like to use, you will have to compile slightly differently.
 
 ### Default
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap, create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+
 ```
-$ make KEYMAP=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
+
 Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/preonic/rules.mk b/keyboards/preonic/rules.mk
new file mode 100644 (file)
index 0000000..d0f3a3a
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE ?= no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= no         # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+NKRO_ENABLE ?= no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no            # MIDI controls
+AUDIO_ENABLE ?= no           # Audio output on port C6
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE ?= no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
\ No newline at end of file
index 4f1796219193343ae0b863fd5d1cffccd28f5c2e..81a23c7e557326e86879f418783035fecc9d64f1 100644 (file)
@@ -9,38 +9,47 @@ These keyboards are manufactured by the maintainers of QMK.
 
 What makes OLKB keyboards shine is a combo of lean aesthetics, compact size, and killer tactile feel. These are available through [olkb.com](http://olkb.com) as well as through [Massdrop](http://massdrop.com) from time to time, as easy to assemble kits.
 
-* [Planck](/keyboards/planck/) - A 40% DIY powerhouse of customizability and modification capability. It's a lean, mean, typing machine.
-* [Preonic](/keyboards/preonic/) - Like the Planck, but bigger. 50%.
-* [Atomic](/keyboards/atomic/) - Imagine the size of the Planck. Now imagine the size of the Preonic. Now imagine _bigger_. That is the Atomic. A 60% keyboard.
+* [Planck](/keyboards/planck/) &mdash; A 40% DIY powerhouse of customizability and modification capability. It's a lean, mean, typing machine.
+* [Preonic](/keyboards/preonic/) &mdash; Like the Planck, but bigger. 50%.
+* [Atomic](/keyboards/atomic/) &mdash; Imagine the size of the Planck. Now imagine the size of the Preonic. Now imagine _bigger_. That is the Atomic. A 60% keyboard.
 
 ### ErgoDox EZ - Erez Zukerman
 
 Made in Taiwan using advanced robotic manufacturing, the ErgoDox EZ is a fully-assembled, premium ergonomic keyboard. Its split design allows you to place both halves shoulder width, and its custom-made wrist rests and tilt/tent kit make for incredibly comfortable typing. Available on [ergodox-ez.com](https://ergodox-ez.com).
 
-* [ErgoDox EZ](/keyboards/ergodox/) - Our one and only product. Yes, it's that awesome. Comes with either printed or blank keycaps, and 7 different keyswitch types.
+* [ErgoDox EZ](/keyboards/ergodox/) &mdash; Our one and only product. Yes, it's that awesome. Comes with either printed or blank keycaps, and 7 different keyswitch types.
 
 ### Clueboard - Zach White
 
 Designed and built in Felton, CA, Clueboards keyboard emphasize quality and locally sourced components, available on [clueboard.co](http://clueboard.co)
 
-* [Clueboard](/keyboards/clueboard/) - The 66% custom keyboard.
-* [Cluepad](/keyboards/cluepad/) - A mechanical numpad with QMK superpowers.
+* [Clueboard](/keyboards/clueboard/) &mdash; The 66% custom keyboard.
+* [Cluecard](/keyboards/cluecard/) &mdash; A small board to help you hack on QMK.
+* [Cluepad](/keyboards/cluepad/) &mdash; A mechanical numpad with QMK superpowers.
 
 
 ## Community-supported QMK Keyboards
 
 These keyboards are part of the QMK repository, but their manufacturers are not official maintainers of the repository.
 
-* [alps64](/keyboards/alps64/) &mdash; A 60% keyboard for Alps keyswitches.
-* [arrow_pad](/keyboards/arrow_pad) &mdash; A custom creation by IBNobody.
-* [atreus](/keyboards/atreus) &mdash; Made by Technomancy.
-* [bantam44](/keyboards/bantam44) &mdash; It is a 44-key 40% staggered keyboard.
-* [gh60](/keyboards/gh60) &mdash; A 60% Geekhack community-driven project.
-* [hhkb](/keyboards/hhkb) &mdash; The Happy Hacking keyboard can be hacked with a custom controller to run QMK.
-* [jd45](/keyboards/jd45) &mdash; Another Geekhack community project, designed by jdcarpe.
-* [kc60](/keyboards/kc60) &mdash; A programmable Chinese-made keyboard, lost in the mists of time.
-* [kitten_paw](/keyboards/kitten_paw) &mdash; A replacement controller (2016 revision) for the Filco Majestouch by [Bathroom Epiphanies](https://github.com/BathroomEpiphanies)
-* [phantom](/keyboards/phantom) &mdash; A tenkeyless kit by Teel, also from Geekhack.
-* [retro_refit](/keyboards/retro_refit) &mdash; Another creation by IBNobody.
-* [satan](/keyboards/satan) &mdash; A GH60 variant.
-* [sixkeyboard](/keyboards/sixkeyboard) &mdash; A 6-key keyboard made by TechKeys.
+* [Alps64](/keyboards/alps64) &mdash; A 60% keyboard for Alps keyswitches.
+* [AMJ60](/keyboards/amj60) &mdash; DIY/Assembled compact 60% keyboard.
+* [Arrow Pad](/keyboards/arrow_pad) &mdash; A custom creation by IBNobody.
+* [Atreus](/keyboards/atreus) &mdash; Made by Technomancy.
+* [Bantam44](/keyboards/bantam44) &mdash; It is a 44-key 40% staggered keyboard.
+* [Ergodox Infinity](/keyboards/ergodox) - Ergonomic Split Keyboard by Input Club.
+* [GH60](/keyboards/gh60) &mdash; A 60% Geekhack community-driven project.
+* [Happy Hacking Keyboard](/keyboards/hhkb) &mdash; The Happy Hacking keyboard can be hacked with a custom controller to run QMK.
+* [Infinity 60%](/keyboards/infinity60) - &mdash; Compact community keyboard by Input Club.
+* [JD45](/keyboards/jd45) &mdash; Another Geekhack community project, designed by jdcarpe.
+* [KC60](/keyboards/kc60) &mdash; A programmable Chinese-made keyboard, lost in the mists of time.
+* [Kinesis Advantage](/keyboards/kinesis) &mdash; Contoured ergonomic keyboard by Kinesis Computer Ergonomics.
+* [The Kitten Paw](/keyboards/kitten_paw) &mdash; A replacement controller (2016 revision) for the Filco Majestouch by [Bathroom Epiphanies](https://github.com/BathroomEpiphanies).
+* [Lets Split](/keyboards/lets_split) - Split ortholinear 40% keyboard.
+* [Phantom](/keyboards/phantom) &mdash; A tenkeyless kit by Teel, also from Geekhack.
+* [Retro Refit](/keyboards/retro_refit) &mdash; Another creation by IBNobody.
+* [S60-x](/keyboards/s60-x) &mdash; DIY compact keyboard designed by VinnyCordeiro for Sentraq.
+* [Satan](/keyboards/satan) &mdash; A GH60 variant.
+* [SixKeyBoard](/keyboards/sixkeyboard) &mdash; A 6-key keyboard made by TechKeys.
+* [TheVan 44](/keyboars/tv44) &mdash; A 44-key staggered keybard by Evangs.
+* [Vision Division](/keyboards/vision_division) &mdash; Full Size / Split Linear Keyboard by IBNobody.
diff --git a/keyboards/retro_refit/Makefile b/keyboards/retro_refit/Makefile
deleted file mode 100644 (file)
index 2dd8cc5..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= yes                # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes         # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes         # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes          # Console for debug(+400)
-COMMAND_ENABLE ?= yes          # Commands for debug and configuration
-KEYBOARD_LOCK_ENABLE ?= yes    # Allow locking of keyboard via magic key
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE ?= yes      # Breathing sleep LED during USB suspend
-NKRO_ENABLE ?= yes                     # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality
-# MIDI_ENABLE ?= YES                   # MIDI controls
-# UNICODE_ENABLE ?= YES                # Unicode
-# BLUETOOTH_ENABLE ?= yes      # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-ifndef QUANTUM_DIR
-       include ../../Makefile
-endif
-
diff --git a/keyboards/retro_refit/config.h b/keyboards/retro_refit/config.h
deleted file mode 100644 (file)
index f2194e5..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x6060
-#define DEVICE_VER      0x0001
-#define MANUFACTURER    Nobody
-#define PRODUCT         retro_refit
-#define DESCRIPTION     Retro Refit
-
-/* key matrix size */
-#define MATRIX_ROWS 11
-#define MATRIX_COLS 8
-
-// See note in retro_refit.h for an explanation of how this matrix is wired up
-#define MATRIX_ROW_PINS { D4, D7, B4, B5, B6, F7, F6, F5, F4, F1, F0 }
-#define MATRIX_COL_PINS { B0, B1, B2, B3, D2, D3, C7, D5 }
-#define UNUSED_PINS
-
-/* COL2ROW or ROW2COL */
-#define DIODE_DIRECTION COL2ROW
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* number of backlight levels */
-#define BACKLIGHT_LEVELS 0
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCING_DELAY 5
-
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
-#define LOCKING_SUPPORT_ENABLE
-/* Locking resynchronize hack */
-#define LOCKING_RESYNC_ENABLE
-
-
-/* Force NKRO Mode - If forced on, must be disabled via magic key (default = LShift+RShift+N) */
-#define FORCE_NKRO
-
-/*
- * Magic key options
- * These options allow the magic key functionality to be changed. This is useful
- * if your keyboard/keypad is missing keys and you want magic key support.
- */
-
-/* key combination for magic key command */
-#define IS_COMMAND() ( \
-    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
-)
-
-/* control how magic key switches layers */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS  true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS  true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
-
-/* remap magic keys */
-//#define MAGIC_KEY_HELP1          H
-//#define MAGIC_KEY_HELP2          SLASH
-//#define MAGIC_KEY_DEBUG          D
-//#define MAGIC_KEY_DEBUG_MATRIX   X
-//#define MAGIC_KEY_DEBUG_KBD      K
-//#define MAGIC_KEY_DEBUG_MOUSE    M
-//#define MAGIC_KEY_VERSION        V
-//#define MAGIC_KEY_STATUS         S
-//#define MAGIC_KEY_CONSOLE        C
-//#define MAGIC_KEY_LAYER0_ALT1    ESC
-//#define MAGIC_KEY_LAYER0_ALT2    GRAVE
-//#define MAGIC_KEY_LAYER0         0
-//#define MAGIC_KEY_LAYER1         1
-//#define MAGIC_KEY_LAYER2         2
-//#define MAGIC_KEY_LAYER3         3
-//#define MAGIC_KEY_LAYER4         4
-//#define MAGIC_KEY_LAYER5         5
-//#define MAGIC_KEY_LAYER6         6
-//#define MAGIC_KEY_LAYER7         7
-//#define MAGIC_KEY_LAYER8         8
-//#define MAGIC_KEY_LAYER9         9
-//#define MAGIC_KEY_BOOTLOADER     PAUSE
-#define MAGIC_KEY_LOCK             BSLS
-//#define MAGIC_KEY_EEPROM         E
-//#define MAGIC_KEY_NKRO           N
-//#define MAGIC_KEY_SLEEP_LED      Z
-
-/*
- * Feature disable options
- *  These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
-
-#endif
diff --git a/keyboards/retro_refit/keymaps/default/keymap.c b/keyboards/retro_refit/keymaps/default/keymap.c
deleted file mode 100644 (file)
index 405402d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
-// this is the style you want to emulate.
-
-#include "retro_refit.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] =
-       KEYMAP( ESC,    F1,   F2,   F3,   F4,   F5,   F6,   F7,   F8,  F9,  F10, NLCK, SLCK, PSCR, PAUS, \
-                       GRV,     1,    2,    3,    4,    5,    6,    7,    8,   9,    0, MINS,  EQL, BSPC, HOME, \
-                       TAB,     Q,    W,    E,    R,    T,    Y,    U,    I,   O,    P, LBRC, RBRC,       PGUP, \
-                       BSLS,    A,    S,    D,    F,    G,    H,    J,    K,   L, SCLN, QUOT,        ENT, PGDN, \
-                       LSFT,          Z,    X,    C,    V,    B,    N,    M, COMM, DOT, SLSH, RSFT,   UP,  END, \
-                       LCTL, LGUI, LALT,        SPC,                               INS,  DEL, LEFT, DOWN, RGHT),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-  // MACRODOWN only works in this function
-      switch(id) {
-        case 0:
-          if (record->event.pressed) {
-            register_code(KC_RSFT);
-          } else {
-            unregister_code(KC_RSFT);
-          }
-        break;
-      }
-    return MACRO_NONE;
-};
diff --git a/keyboards/retro_refit/readme.md b/keyboards/retro_refit/readme.md
deleted file mode 100644 (file)
index b01a1a9..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-retro_refit keyboard firmware
-======================
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme.md](/readme.md).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/retro_refit folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. 
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
-```
-$ make KEYMAP=[default|jack|<name>]
-```
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
\ No newline at end of file
diff --git a/keyboards/retro_refit/retro_refit.c b/keyboards/retro_refit/retro_refit.c
deleted file mode 100644 (file)
index 3d610eb..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#include "retro_refit.h"
-#include "led.h"
-
-void matrix_init_kb(void) {
-    // put your keyboard start-up code here
-    // runs once when the firmware starts up
-
-    // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
-    DDRD |= (1<<6);
-    PORTD |= (1<<6);
-
-    matrix_init_user();
-};
-
-void led_set_kb(uint8_t usb_led) {
-    // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
-    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
-        // output low
-        DDRD |= (1<<0);
-        PORTD &= ~(1<<0);
-    } else {
-        // Hi-Z
-        DDRD &= ~(1<<0);
-        PORTD &= ~(1<<0);
-    }
-    if (usb_led & (1<<USB_LED_NUM_LOCK)) {
-        // output low
-        DDRD |= (1<<1);
-        PORTD &= ~(1<<1);
-    } else {
-        // Hi-Z
-        DDRD &= ~(1<<1);
-        PORTD &= ~(1<<1);
-    }
-    if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
-        // output low
-        DDRC |= (1<<6);
-        PORTC &= ~(1<<6);
-    } else {
-        // Hi-Z
-        DDRC &= ~(1<<6);
-        PORTC &= ~(1<<6);
-    }
-
-    led_set_user(usb_led);
-};
\ No newline at end of file
diff --git a/keyboards/retro_refit/retro_refit.h b/keyboards/retro_refit/retro_refit.h
deleted file mode 100644 (file)
index 109acdc..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef RETRO_REFIT_H
-#define RETRO_REFIT_H
-
-#include "quantum.h"
-
-// This macro is an example of using a non-standard row-column matrix. The 
-// keyboard in question had 11 rows and 8 columns, but the rows were not all 
-// horizontal, and the columns were not all vertical. For example, row 2 
-// contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and
-// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", 
-// "Left Alt", "Up Arrow", and "Down Arrow".
-//
-// The macro makes programming the keys easier and in a more straight-forward
-// manner because it realigns the keys into a 6x15 sensible keyboard layout 
-// instead of the obtuse 11x8 matrix.
-
-#define KEYMAP( \
-       K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
-       K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
-       K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45,      K97, \
-       K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30,      K44, K87, \
-       K26,      K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
-       K10, K06, K25,                K07,                K86, K85, K95, K90, K93  \
-) { \
-{      KC_##K00,       KC_##K01,       KC_##K02,       KC_##K03,       KC_##K04,       KC_##K05,       KC_##K06,       KC_##K07,       }, \
-{      KC_##K10,       KC_##K11,       KC_##K12,       KC_##K13,       KC_##K14,       KC_##K15,       KC_##K16,       KC_##K17,       }, \
-{      KC_##K20,       KC_##K21,       KC_##K22,       KC_##K23,       KC_##K24,       KC_##K25,       KC_##K26,       KC_##K27,       }, \
-{      KC_##K30,       KC_##K31,       KC_##K32,       KC_##K33,       KC_##K34,       KC_##K35,       KC_##K36,       KC_##K37,       }, \
-{      KC_##K40,       KC_##K41,       KC_##K42,       KC_##K43,       KC_##K44,       KC_##K45,       KC_##K46,       KC_##K47,       }, \
-{      KC_##K50,       KC_##K51,       KC_##K52,       KC_##K53,       KC_##K54,       KC_##K55,       KC_##K56,       KC_##K57,       }, \
-{      KC_##K60,       KC_##K61,       KC_##K62,       KC_##K63,       KC_##K64,       KC_##K65,       KC_##K66,       KC_##K67,       }, \
-{      KC_##K70,       KC_##K71,       KC_##K72,       KC_##K73,       KC_##K74,       KC_##K75,       KC_##K76,       KC_##K77,       }, \
-{      KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_NO,          KC_##K85,       KC_##K86,       KC_##K87,       }, \
-{      KC_##K90,       KC_##K91,       KC_NO,          KC_##K93,       KC_##K94,       KC_##K95,       KC_NO,          KC_##K97,       }, \
-{      KC_##KA0,       KC_##KA1,       KC_##KA2,       KC_##KA3,       KC_##KA4,       KC_##KA5,       KC_##KA6,       KC_##KA7,       } \
-}
-
-#endif
\ No newline at end of file
index 8b51d4609f8edb457ae5a1fbcf1dae69b444bf60..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,75 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
index 099d5869914f0c4c65ac9587006d29df0a06e2d4..94ce829223b4305a4f54c2cfa005a41310c8b10a 100644 (file)
@@ -42,9 +42,9 @@ The recommended programs for flashing your keyboard are [Atmel FLIP](http://www.
 
 ## Building the firmware
 
-To build firmware binary hex file with a certain keymap just run `make` with the `keymap` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
-    $ make keymap=[custom|poker|poker_set|poker_bit|plain|hasu|spacefn|hhkb|<name>]
+    $ make [custom|poker|poker_set|poker_bit|plain|hasu|spacefn|hhkb|<name>]
 
 For a more detailed explanation of the build process and the environment setup, see the ["Getting Started" section](/readme.md#getting-started).
 
diff --git a/keyboards/s60-x/rules.mk b/keyboards/s60-x/rules.mk
new file mode 100644 (file)
index 0000000..7ec9393
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
\ No newline at end of file
index a0879fc9c9bf358ec13eba7b384a7b5ad28698e2..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,70 +1,3 @@
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes  # Console for debug(+400)
-COMMAND_ENABLE ?= yes    # Commands for debug and configuration
-NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-RGBLIGHT_ENABLE ?= yes   # Enable keyboard underlight functionality (+4870)
-BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality (+1150)
-MIDI_ENABLE ?= no              # MIDI controls
-AUDIO_ENABLE ?= no
-UNICODE_ENABLE ?= no           # Unicode
-BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
+endif
\ No newline at end of file
diff --git a/keyboards/satan/rules.mk b/keyboards/satan/rules.mk
new file mode 100644 (file)
index 0000000..1102584
--- /dev/null
@@ -0,0 +1,66 @@
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+RGBLIGHT_ENABLE ?= yes   # Enable keyboard underlight functionality (+4870)
+BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality (+1150)
+MIDI_ENABLE ?= no              # MIDI controls
+AUDIO_ENABLE ?= no
+UNICODE_ENABLE ?= no           # Unicode
+BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
index 6f273064a7aadf589b93ede1caec4b825d5ed5eb..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,75 +1,3 @@
-
-
-SRC = matrix.c
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega16u2
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE ?= no         # Virtual DIP switch configuration(+1000)
-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
-SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
-NKRO_ENABLE ?= no                      # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality
-MIDI_ENABLE ?= no                      # MIDI controls
-AUDIO_ENABLE ?= no
-UNICODE_ENABLE ?= no           # Unicode
-BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
-CUSTOM_MATRIX = yes
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
+endif
\ No newline at end of file
diff --git a/keyboards/sixkeyboard/rules.mk b/keyboards/sixkeyboard/rules.mk
new file mode 100644 (file)
index 0000000..2c99985
--- /dev/null
@@ -0,0 +1,70 @@
+
+
+SRC = matrix.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega16u2
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no         # Virtual DIP switch configuration(+1000)
+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
+SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
+NKRO_ENABLE ?= no                      # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality
+MIDI_ENABLE ?= no                      # MIDI controls
+AUDIO_ENABLE ?= no
+UNICODE_ENABLE ?= no           # Unicode
+BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
+CUSTOM_MATRIX = yes
\ No newline at end of file
diff --git a/keyboards/tada68/Makefile b/keyboards/tada68/Makefile
new file mode 100644 (file)
index 0000000..4e2a6f0
--- /dev/null
@@ -0,0 +1,3 @@
+ifndef MAKEFILE_INCLUDED
+       include ../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/tada68/config.h b/keyboards/tada68/config.h
new file mode 100644 (file)
index 0000000..5d87579
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID       0xFEED
+#define PRODUCT_ID      0x6060
+#define DEVICE_VER      0x0003
+#define MANUFACTURER    TADA
+#define PRODUCT         TADA68
+#define DESCRIPTION     QMK keyboard firmware for TADA68 with WS2812 support
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+// ROWS: Top to bottom, COLS: Left to right
+
+#define MATRIX_ROW_PINS {D0,D1,F6,F7,D5}
+#define MATRIX_COL_PINS {F0,F1,E6,C7,C6,B7,D4,B1,B0,B5,B4,D7,D6,B3,F4}
+#define UNUSED_PINS
+
+#define BACKLIGHT_PIN B6
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* Backlight configuration
+ */
+#define BACKLIGHT_LEVELS 4
+
+/* Underlight configuration
+ */
+
+/*#define RGB_DI_PIN E2
+#define RGBLIGHT_TIMER
+#define RGBLED_NUM 2     // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17*/
+//Disabled while I figure out a suitable pin for RGB support.
+//I've tried F5, D2, D3, and E2 but it's possible the end of my
+//strand is bad. New LEDs on order.
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#endif
diff --git a/keyboards/tada68/keymaps/default/Makefile b/keyboards/tada68/keymaps/default/Makefile
new file mode 100644 (file)
index 0000000..2a7ff27
--- /dev/null
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
diff --git a/keyboards/tada68/keymaps/default/keymap.c b/keyboards/tada68/keymaps/default/keymap.c
new file mode 100644 (file)
index 0000000..da57c03
--- /dev/null
@@ -0,0 +1,98 @@
+#include "tada68.h"
+
+
+// Used for SHIFT_ESC
+#define MODS_CTRL_MASK  (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _BL 0
+#define _FL 1
+
+#define _______ KC_TRNS
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  /* Keymap _BL: (Base Layer) Default Layer
+   * ,----------------------------------------------------------------.
+   * |Esc | 1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backsp |~ ` |
+   * |----------------------------------------------------------------|
+   * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \  |Del |
+   * |----------------------------------------------------------------|
+   * |CAPS   |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return |PgUp|
+   * |----------------------------------------------------------------|
+   * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift | Up|PgDn|
+   * |----------------------------------------------------------------|
+   * |Ctrl|Win |Alt |        Space          |Alt| FN|Ctrl|Lef|Dow|Rig |
+   * `----------------------------------------------------------------'
+   */
+[_BL] = KEYMAP_ANSI(
+  KC_ESC,    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS, KC_EQL, KC_BSPC,KC_GRV, \
+  KC_TAB,  KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC, KC_RBRC,KC_BSLS,KC_DEL, \
+  KC_CAPS, KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT,         KC_ENT,KC_PGUP,  \
+  KC_LSFT,         KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, KC_SLSH,   KC_RSFT,KC_UP,KC_PGDN, \
+  KC_LCTL, KC_LGUI,KC_LALT,                KC_SPC,                        KC_RALT,MO(_FL),KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT),
+
+  /* Keymap _FL: Function Layer
+   * ,----------------------------------------------------------------.
+   * |   |   |   |   |   |   |   |   |   |   |   |   |   |  RESET|    |
+   * |----------------------------------------------------------------|
+   * |     |   |   |   |   |   |   |   |   |   |   |BL-|BL+|BL   |    |
+   * |----------------------------------------------------------------|
+   * |      |   |   |   |   |   |   |       |   |   |   |        |    |
+   * |----------------------------------------------------------------|
+   * |        | F1|F2 | F3|F4 | F5| F6| F7| F8|   |   |      |   |    |
+   * |----------------------------------------------------------------|
+   * |    |    |    |                       |   |   |    |   |   |    |
+   * `----------------------------------------------------------------'
+   */
+[_FL] = KEYMAP_ANSI(
+  #ifdef RGBLIGHT_ENABLE
+  _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______,  \
+  _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \
+  _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,_______, \
+  _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,_______, \
+  _______,_______,_______,                 _______,               _______,_______,_______,_______,_______, _______),
+  #else
+  _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______,  \
+  _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \
+  _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,        _______,_______, \
+  _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \
+  _______,_______,_______,                 _______,               _______,_______,_______,_______,_______, _______),
+  #endif
+};
+
+/*enum function_id {
+    //SHIFT_ESC,
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+  //[0]  = ACTION_FUNCTION(SHIFT_ESC),
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
+  static uint8_t shift_esc_shift_mask;
+  switch (id) {
+    case SHIFT_ESC:
+      shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
+      if (record->event.pressed) {
+        if (shift_esc_shift_mask) {
+          add_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          add_key(KC_ESC);
+          send_keyboard_report();
+        }
+      } else {
+        if (shift_esc_shift_mask) {
+          del_key(KC_GRV);
+          send_keyboard_report();
+        } else {
+          del_key(KC_ESC);
+          send_keyboard_report();
+        }
+      }
+      break;
+  }
+}*/
diff --git a/keyboards/tada68/keymaps/default/readme.md b/keyboards/tada68/keymaps/default/readme.md
new file mode 100644 (file)
index 0000000..36760d6
--- /dev/null
@@ -0,0 +1 @@
+# default TADA68 layout
diff --git a/keyboards/tada68/readme.md b/keyboards/tada68/readme.md
new file mode 100644 (file)
index 0000000..552fdea
--- /dev/null
@@ -0,0 +1,4 @@
+TADA68 keyboard firmware
+======================
+
+TODO: to be updated.
diff --git a/keyboards/tada68/rules.mk b/keyboards/tada68/rules.mk
new file mode 100644 (file)
index 0000000..d8ec423
--- /dev/null
@@ -0,0 +1,66 @@
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   comment out to disable the options.
+#
+BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= no  # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes  # Console for debug(+400)
+COMMAND_ENABLE ?= yes    # Commands for debug and configuration
+NKRO_ENABLE ?= yes             # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+RGBLIGHT_ENABLE ?= no   # Enable keyboard underlight functionality (+4870)
+BACKLIGHT_ENABLE ?= yes  # Enable keyboard backlight functionality (+1150)
+MIDI_ENABLE ?= no              # MIDI controls
+AUDIO_ENABLE ?= no
+UNICODE_ENABLE ?= no           # Unicode
+BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
diff --git a/keyboards/tada68/tada68.c b/keyboards/tada68/tada68.c
new file mode 100644 (file)
index 0000000..24f8904
--- /dev/null
@@ -0,0 +1,30 @@
+#include "tada68.h"
+#include "led.h"
+
+void matrix_init_kb(void) {
+       // put your keyboard start-up code here
+       // runs once when the firmware starts up
+       matrix_init_user();
+       led_init_ports();
+};
+
+void matrix_scan_kb(void) {
+       // put your looping keyboard code here
+       // runs every cycle (a lot)
+       matrix_scan_user();
+};
+
+void led_init_ports(void) {
+    // * Set our LED pins as output
+    DDRB |= (1<<2);
+}
+
+void led_set_kb(uint8_t usb_led) {
+       if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+        // Turn capslock on
+        PORTB &= ~(1<<2);
+    } else {
+        // Turn capslock off
+        PORTB |= (1<<2);
+    }
+}
diff --git a/keyboards/tada68/tada68.h b/keyboards/tada68/tada68.h
new file mode 100644 (file)
index 0000000..d0e027a
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef TADA68_H
+#define TADA68_H
+
+#include "quantum.h"
+
+// readability
+#define XXX KC_NO
+
+/* TADA68 ANSI layout
+   * ,----------------------------------------------------------------.
+   * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d    | 0e |
+   * |----------------------------------------------------------------|
+   * | 10  | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c|  1d | 1e |
+   * |----------------------------------------------------------------|
+   * | 20    | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d    | 2e |
+   * |----------------------------------------------------------------|
+   * | 30     | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b|    3c| 3d| 3e |
+   * |----------------------------------------------------------------|
+   * | 40 | 41 | 42 |        45             | 49| 4a|  4b| 4c| 4d| 4e |
+   * `----------------------------------------------------------------'
+ */
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+
+#define KEYMAP_ANSI( \
+    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
+       k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
+       k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b,      k2d, k2e, \
+       k30,      k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+       k40, k41, k42,           k45,                k49, k4a, k4b, k4c, k4d, k4e  \
+) \
+{ \
+       {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e}, \
+       {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e}, \
+       {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d, k2e}, \
+       {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e}, \
+       {k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, k49, k4a, k4b, k4c, k4d, k4e}  \
+}
+
+void matrix_init_user(void);
+void matrix_scan_user(void);
+
+#endif
index 45ca1278074c490f71e9f2cbbe54a6f0cd267caa..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,75 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= yes           # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
diff --git a/keyboards/tv44/keymaps/jeebak/Makefile b/keyboards/tv44/keymaps/jeebak/Makefile
new file mode 100644 (file)
index 0000000..f4671a9
--- /dev/null
@@ -0,0 +1,21 @@
+# Build Options
+#   change to "no" to disable the options, or define them in the Makefile in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = no         # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+
+ifndef QUANTUM_DIR
+       include ../../../../Makefile
+endif
\ No newline at end of file
diff --git a/keyboards/tv44/keymaps/jeebak/config.h b/keyboards/tv44/keymaps/jeebak/config.h
new file mode 100644 (file)
index 0000000..a59ef2b
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+/**
+ *TV44 keymap definition macro
+ */
+#define KEYMAP_TV44( \
+    K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, \
+    K13, K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, \
+    K25, K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, \
+    K37,   K38,   K39,     K40,     K41,     K42,   K43,   K44  \
+) { \
+    { K01,   K02,   K03,   K04,   K05,   K06,   K07,   K08,   K09,   K10,   K11,   K12, }, \
+    { K13,   K14,   K15,   K16,   K17,   K18,   K19,   K20,   K21,   K22,   K23,   K24, }, \
+    { K25,   K26,   K27,   K28,   K29,   K30,   K31,   K32,   K33,   K34,   K35,   K36, }, \
+    { K37,   K38,   K39,   K40, KC_NO, KC_NO,  KC_NO,  K41,   K42,   K43, KC_NO,   K44  }  \
+}
+
+#endif
diff --git a/keyboards/tv44/keymaps/jeebak/keymap.c b/keyboards/tv44/keymaps/jeebak/keymap.c
new file mode 100644 (file)
index 0000000..1bb1015
--- /dev/null
@@ -0,0 +1,425 @@
+#include "tv44.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _PLOVER 5
+#define _TOUCHCURSOR 6
+#define _MOUSECURSOR 7
+#define _ADJUST 16
+
+// Keycodes
+enum planck_keycodes {
+  QWERTY = SAFE_RANGE,
+  COLEMAK,
+  DVORAK,
+  PLOVER,
+  LOWER,
+  RAISE,
+  BACKLIT,
+  EXT_PLV
+};
+
+enum macro_keycodes {
+  KC_ALT_TAB,
+  KC_CMD_TAB,
+  KC_CTL_TAB,
+  KC_CMD_SLSH,
+  KC_AG_FIND,
+  KC_AG_AGAIN,
+  KC_AG_UNDO,
+  KC_AG_CUT,
+  KC_AG_COPY,
+  KC_AG_PASTE,
+  KC_AG_DESK_L,
+  KC_AG_DESK_R,
+  KC_AG_TAB_C,
+  KC_AG_TAB_N,
+  KC_AG_TAB_R,
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+// Custom macros
+#define CTL_ESC     CTL_T(KC_ESC)               // Tap for Esc, hold for Ctrl
+#define SFT_ENT     SFT_T(KC_ENT)               // Tap for Enter, hold for Shift
+#define HPR_TAB     ALL_T(KC_TAB)               // Tap for Tab, hold for Hyper
+#define GUI_SEM     GUI_T(KC_SCLN)              // Tap for Semicolon, hold for GUI
+#define ALT_QUO     ALT_T(KC_QUOT)              // Tap for Quote, hold for Alt
+// Requires KC_TRNS/_______ for the trigger key in the destination layer
+#define LT_TC       LT(_TOUCHCURSOR, KC_SPC)    // L-ayer T-ap T-ouch C-ursor
+#define LT_MC(kc)   LT(_MOUSECURSOR, kc)        // L-ayer T-ap M-ouse C-ursor
+#define ALT_TAB     M(KC_ALT_TAB)               // Macro for Alt-Tab
+#define CMD_TAB     M(KC_CMD_TAB)               // Macro for Cmd-Tab
+#define CTL_TAB     M(KC_CTL_TAB)               // Macro for Ctl-Tab
+#define CMD_SLSH    M(KC_CMD_SLSH)              // Macro for Cmd-Slash (personal shortcut to toggle iTerm2 visibility)
+#define AG_FIND     M(KC_AG_FIND)               // Macros for Cmd-[x] vs Ctrl-[x] based on current AG_NORM or AG_SWAP settings
+#define AG_AGAIN    M(KC_AG_AGAIN)
+#define AG_UNDO     M(KC_AG_UNDO)
+#define AG_CUT      M(KC_AG_CUT)
+#define AG_COPY     M(KC_AG_COPY)
+#define AG_PASTE    M(KC_AG_PASTE)
+#define AG_D_L      M(KC_AG_DESK_L)             // For Virtual Desktop Switching: Left, and
+#define AG_D_R      M(KC_AG_DESK_R)             //                                Right
+#define AG_T_C      M(KC_AG_TAB_C)              // For Chrome, etc. Tab Close,
+#define AG_T_N      M(KC_AG_TAB_N)              //                  Tab New, and
+#define AG_T_R      M(KC_AG_TAB_R)              //                  Tab Reopen Closed
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ *
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |Hyper/Tab|   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  |   Bksp      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * | Ctrl/Esc |   A  |   S  | MC/D |   F  |   G  |   H  |   J  |   K  |   L  |GUI/; |   Alt/"    |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |   Shift   |   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |  Sft/Ent  |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |   Alt   |   GUI   |  Lower  |    TC/Space    |   TC/Space     |  Raise  |   Vol+  |  Play   |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_QWERTY] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    HPR_TAB,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    CTL_ESC ,   KC_A, KC_S,LT_MC(KC_D),    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L, GUI_SEM,    ALT_QUO     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    KC_LSFT  ,   KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,    SFT_ENT    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    KC_LALT   ,   KC_LGUI     ,   LOWER ,      LT_TC     ,      LT_TC      ,  RAISE  ,     KC_VOLU     ,    KC_MPLY   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Colemak
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |Hyper/Tab|   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  |   Bksp      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * | Ctrl/Esc |   A  |   R  | MC/S |   T  |   D  |   H  |   N  |   E  |   I  |   O  |    "       |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * | Shift     |   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |  Sft/Ent  |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |   Alt   |   GUI   |  Lower  |    TC/Space    |   TC/Space     |  Raise  |   Vol+  |  Play   |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_COLEMAK] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    HPR_TAB,   KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y, KC_SCLN,    KC_BSPC      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    CTL_ESC ,   KC_A, KC_R,LT_MC(KC_S),    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    KC_LSFT  ,   KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,    SFT_ENT    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    KC_LALT   ,   KC_LGUI     ,   LOWER ,      LT_TC     ,      LT_TC      ,  RAISE  ,     KC_VOLU     ,    KC_MPLY   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Dvorak
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |Hyper/Tab|   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  |   Bksp      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * | Ctrl/Esc |   A  |   O  | MC/E |   U  |   I  |   D  |   H  |   T  |   N  |   S  |    /       |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * | Shift     |   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |  Sft/Ent  |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |   Alt   |   GUI   |  Lower  |    TC/Space    |   TC/Space     |  Raise  |   Vol+  |  Play   |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_DVORAK] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    HPR_TAB,KC_QUOT, KC_COMM,  KC_DOT,    KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    CTL_ESC ,   KC_A,    KC_O,LT_MC(KC_E), KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    KC_LSFT  , KC_SCLN,   KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    SFT_ENT    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    KC_LALT   ,   KC_LGUI     ,   LOWER ,      LT_TC     ,      LT_TC      ,  RAISE  ,     KC_VOLU     ,    KC_MPLY   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Lower
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |   ~     |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   Bksp      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |   [      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |   "|"      |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |   ]       |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |   -  |   =  |   [  |   ]  |    \      |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |  Brite  |         |         |                |                |         |   Vol-  |   Mute  |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_LOWER] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    KC_TILD,KC_EXLM,   KC_AT, KC_HASH,  KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,    KC_BSPC      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    KC_LBRC ,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR,    KC_PIPE     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    KC_RBRC  ,  KC_F7,   KC_F8,   KC_F9,  KC_F10,  KC_F11,  KC_F12, KC_MINS,  KC_EQL, KC_LBRC, KC_RBRC,    KC_BSLS    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    BACKLIT   ,    _______    , _______ ,     _______    ,     _______     , _______ ,     KC_VOLD     ,    KC_MUTE   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Raise
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |   0     |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |   Bksp      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |   $      |   4  |   5  |   6  |   .  |   +  |   .  |   4  |   5  |   6  |   *  |   "|"      |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |   =       |   7  |   8  |   9  |   0  |   -  |   .  |   1  |   2  |   3  |   /  |    \      |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |  Brite  |         |         |                |                |         |   Vol-  |   Mute  |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_RAISE] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    KC_0   ,   KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    KC_DLR  ,   KC_4,    KC_5,    KC_6,  KC_DOT, KC_PLUS,  KC_DOT,    KC_4,    KC_5,    KC_6, KC_ASTR,    KC_PIPE     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    KC_EQL   ,   KC_7,    KC_8,    KC_9,    KC_0, KC_MINS,  KC_DOT,    KC_1,    KC_2,    KC_3, KC_SLSH,    KC_BSLS    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    BACKLIT   ,    _______    , _______ ,     _______    ,     _______     , _______ ,     KC_VOLD     ,    KC_MUTE   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* TouchCursor layer (http://martin-stone.github.io/touchcursor/) plus personal customizations
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * | AltTab  |CmdTab|CtlTab| GUI  |Shift |  ~   |Insert| Home |  Up  | End  | Bksp |             |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |          | Alt  |Space |Tab_C | Find |Again | PgUp | Left | Down |Right |Desk_L|  Desk_R    |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |           | Undo | Cut  | Copy |Paste |  `   | PgDn | Del  |Tab_N |Tab_R |iTerm2|           |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |         |         |         |                |                |         |         |         |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ *
+ * The KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_FIND, and KC_AGAIN keycodes don't
+ * seem to work on Mac. Presumably they'll work under Windows.
+ */
+
+[_TOUCHCURSOR] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    ALT_TAB,CMD_TAB, CTL_TAB, KC_LGUI, KC_LSFT, KC_TILD,  KC_INS, KC_HOME,   KC_UP,  KC_END, KC_BSPC,    _______      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    _______ ,KC_LALT,  KC_SPC,  AG_T_C, AG_FIND,AG_AGAIN, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT,  AG_D_L,    AG_D_R      ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    _______  ,AG_UNDO,  AG_CUT, AG_COPY,AG_PASTE,  KC_GRV, KC_PGDN,  KC_DEL,  AG_T_N,  AG_T_R,CMD_SLSH,    _______    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    _______   ,    _______    , _______ ,     _______    ,     _______     , _______ ,     _______     ,    _______   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Mouse Layer
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |         |      |ACCL0 |      |      |      |      |WHL_L |  Up  |WHL_R | BTN2 |             |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |          |ACCL2 | BTN2 |      | BTN1 |ACCL1 |WHL_Up| Left | Down |Right | BTN4 |   BTN5     |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |           |      |      |      | BTN3 |      |WHL_Dn| BTN1 |      |      | BTN3 |           |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |         |         |         |                |                |         |         |         |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+
+[_MOUSECURSOR] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    _______,_______, KC_ACL0, _______, _______, _______, _______, KC_WH_L, KC_MS_U, KC_WH_R, KC_BTN2,    _______      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    _______ ,KC_ACL2, KC_BTN2, _______, KC_BTN1, KC_ACL1, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN4,    KC_BTN5     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    _______  ,_______, _______, _______, KC_BTN3, _______, KC_WH_D, KC_BTN1, _______, _______, KC_BTN3,    _______    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    _______   ,    _______    , _______ ,     _______    ,     _______     , _______ ,     _______     ,    _______   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Plover layer (http://opensteno.org)
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |      #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |     #       |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |         |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |     D       |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * | TogOut    |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |    Z      |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * | Exit    |    A    |    O    |                |                |    E    |    U    |         |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+
+[_PLOVER] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    KC_1   ,   KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,     KC_1        ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    XXXXXXX ,   KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    XXXXXXX  ,   KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN,    KC_QUOT    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    EXT_PLV   ,     KC_C      ,   KC_V  ,     XXXXXXX    ,     XXXXXXX     ,   KC_N  ,      KC_M       ,    XXXXXXX   ),
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+
+/* Adjust (Lower + Raise)
+ * ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+ * |         |      |      |      |      |      |      |      |      |      |      |    Del      |
+ * |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+ * |          |      |      |      |      |AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|            |
+ * |----------`------`------`------`------`------`------`------`------`------`------`------------|
+ * |           |      |      |      |      |     |       |      |      |      |      |           |
+ * |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+ * |         |         |         |                |                |         |         |  Reset  |
+ *  `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+ */
+[_ADJUST] = KEYMAP_TV44(
+/*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/
+    _______,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,     KC_DEL      ,
+/*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/
+    _______ ,_______, _______, _______, _______, AG_NORM, AG_SWAP,  QWERTY, COLEMAK,  DVORAK,  PLOVER,    _______     ,
+/*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/
+    _______  ,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,    _______    ,
+/*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/
+    _______   ,    _______    , _______ ,     _______    ,     _______     , _______ ,     _______     ,    RESET     )
+/*`-----------+---------------+---------+-------^^^------+-------^^^-------+---------+-----------------+--------------'*/
+};
+
+void persistant_default_layer_set(uint16_t default_layer) {
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+  switch (keycode) {
+    case QWERTY:
+      if (record->event.pressed) {
+        default_layer_set(1UL<<_QWERTY);
+      }
+      return false;
+      break;
+    case COLEMAK:
+      if (record->event.pressed) {
+        default_layer_set(1UL<<_COLEMAK);
+      }
+      return false;
+      break;
+    case DVORAK:
+      if (record->event.pressed) {
+        default_layer_set(1UL<<_DVORAK);
+      }
+      return false;
+      break;
+    case LOWER:
+      if (record->event.pressed) {
+        layer_on(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_LOWER);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case RAISE:
+      if (record->event.pressed) {
+        layer_on(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      } else {
+        layer_off(_RAISE);
+        update_tri_layer(_LOWER, _RAISE, _ADJUST);
+      }
+      return false;
+      break;
+    case BACKLIT:
+      if (record->event.pressed) {
+        register_code(KC_RSFT);
+        #ifdef BACKLIGHT_ENABLE
+          backlight_step();
+        #endif
+      } else {
+        unregister_code(KC_RSFT);
+      }
+      return false;
+      break;
+    case PLOVER:
+      if (record->event.pressed) {
+        layer_off(_RAISE);
+        layer_off(_LOWER);
+        layer_off(_ADJUST);
+        layer_on(_PLOVER);
+        if (!eeconfig_is_enabled()) {
+            eeconfig_init();
+        }
+        keymap_config.raw = eeconfig_read_keymap();
+        keymap_config.nkro = 1;
+        eeconfig_update_keymap(keymap_config.raw);
+      }
+      return false;
+      break;
+    case EXT_PLV:
+      if (record->event.pressed) {
+        layer_off(_PLOVER);
+      }
+      return false;
+      break;
+  }
+  return true;
+}
+
+/*
+ * Macro definition
+ */
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+    if (!eeconfig_is_enabled()) {
+      eeconfig_init();
+    }
+
+    bool use_cmd = true;    // Use, for example, Cmd-Tab, Cmd-C, Cmd-V, etc.
+    // Compare to MAGIC_SWAP_ALT_GUI and MAGIC_UNSWAP_ALT_GUI configs, set in:
+    // quantum/quantum.c
+    if(keymap_config.swap_lalt_lgui == 1 && keymap_config.swap_ralt_rgui == 1) {
+      use_cmd = false;      // ... or, Alt-Tab, Ctrl-C, Ctrl-V, etc.
+    }
+
+    switch (id) {
+      case KC_ALT_TAB:
+        if(use_cmd) { return (record->event.pressed ? MACRO( D(LALT),  D(TAB), END ) : MACRO( U(TAB), END )); }
+        else        { return (record->event.pressed ? MACRO( D(LGUI),  D(TAB), END ) : MACRO( U(TAB), END )); }
+      case KC_CMD_TAB:
+        if(use_cmd) { return (record->event.pressed ? MACRO( D(LGUI),  D(TAB), END ) : MACRO( U(TAB), END )); }
+        else        { return (record->event.pressed ? MACRO( D(LALT),  D(TAB), END ) : MACRO( U(TAB), END )); }
+
+      case KC_CTL_TAB:
+        return (record->event.pressed ? MACRO( D(LCTRL), D(TAB), END ) : MACRO( U(TAB), END ));
+      case KC_CMD_SLSH:
+        return (record->event.pressed ? MACRO( D(LGUI),  D(SLSH),END ) : MACRO( U(SLSH),END ));
+
+      case KC_AG_FIND:
+        return use_cmd ? MACRODOWN( D(LGUI), T(F), END ) : MACRODOWN( D(LCTRL), T(F), END );
+      case KC_AG_AGAIN:
+        return use_cmd ? MACRODOWN( D(LGUI), T(G), END ) : MACRODOWN( D(LCTRL), T(G), END );
+      case KC_AG_UNDO:
+        return use_cmd ? MACRODOWN( D(LGUI), T(Z), END ) : MACRODOWN( D(LCTRL), T(Z), END );
+      case KC_AG_CUT:
+        return use_cmd ? MACRODOWN( D(LGUI), T(X), END ) : MACRODOWN( D(LCTRL), T(X), END );
+      case KC_AG_COPY:
+        return use_cmd ? MACRODOWN( D(LGUI), T(C), END ) : MACRODOWN( D(LCTRL), T(C), END );
+      case KC_AG_PASTE:
+        return use_cmd ? MACRODOWN( D(LGUI), T(V), END ) : MACRODOWN( D(LCTRL), T(V), END );
+
+      case KC_AG_DESK_L:
+        return use_cmd ? MACRODOWN( D(LGUI), D(LCTRL), T(SCLN), END ) : MACRODOWN( D(LALT), D(LCTRL), T(SCLN), END );
+      case KC_AG_DESK_R:
+        return use_cmd ? MACRODOWN( D(LGUI), D(LCTRL), T(QUOT), END ) : MACRODOWN( D(LALT), D(LCTRL), T(QUOT), END );
+
+      case KC_AG_TAB_C:
+        return use_cmd ? MACRODOWN( D(LGUI),            T(W), END ) : MACRODOWN( D(LCTRL),            T(W), END );
+      case KC_AG_TAB_N:
+        return use_cmd ? MACRODOWN( D(LGUI),            T(T), END ) : MACRODOWN( D(LCTRL),            T(T), END );
+      case KC_AG_TAB_R:
+        return use_cmd ? MACRODOWN( D(LGUI), D(LSHIFT), T(T), END ) : MACRODOWN( D(LCTRL), D(LSHIFT), T(T), END );
+    }
+
+    return MACRO_NONE;
+}
diff --git a/keyboards/tv44/keymaps/jeebak/readme.md b/keyboards/tv44/keymaps/jeebak/readme.md
new file mode 100644 (file)
index 0000000..43d2095
--- /dev/null
@@ -0,0 +1,129 @@
+jeebak's TV44 layout
+=======================
+NOTE: This is a port of jeebak's planck layout, for tv44.
+
+This WIP keymap attempts to minimize fingers straying away from the home row.
+To aid in this endeavor, when additional modifyer keys to switch layers are
+needed, they will be mapped to home row keys. The `keymap.c` file will contain
+the exact changes. The diagrams in this README shows the highlights of the
+changes from the default mappings.
+
+I also decided to change all calls to `persistant_default_layer_set()` to
+`default_layer_set()` since this is my personal perference.
+
+## Macros
+```
+#define ALT_TAB     M(KC_ALT_TAB)
+```
+
+## Base Layers (Qwerty/Colemak/Dvorak)
+These base layers are mostly the same as the default mappings. The interesting
+changes are shown below.
+
+- The `Ctrl/Esc`, will emit an `Escape` when tapped, and act as a `Control` key when held,
+- `GUI/;` as `;` and `GUI`,
+- `Alt/"` as `"` and `Alt`,
+- `Sft/Ent` as `Enter` and `Shift`, and
+- `Hyper/Tab` as `Tab` and `Hyper`
+
+A `TODO` item is to see if it can also act as a `CapsLock` when double-tapped.
+The arrow keys, which have been moved to the
+[TouchCursor](http://martin-stone.github.io/touchcursor/) layer, have been
+replaced with the Media keys as shown. The `MC/kc` key activates the
+`MouseCursor` layer when held, and emits the corresponding `kc` for its layer,
+when tapped.
+```
+  ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+  |Hyper/Tab|   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  |   Bksp      |
+  |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+  | Ctrl/Esc |   A  |   S  | MC/D |   F  |   G  |   H  |   J  |   K  |   L  |GUI/; |   Alt/"    |
+  |----------`------`------`------`------`------`------`------`------`------`------`------------|
+  |   Shift   |   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |  Sft/Ent  |
+  |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+  |   Alt   |   GUI   |  Lower  |    TC/Space    |   TC/Space     |  Raise  |   Vol+  |  Play   |
+   `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+```
+
+## Lower Layer (Symbols and Function Keys)
+The symbols and functions keys are essentially the same as the default mapping.
+The most notable changes are that the symbol keys from the `RAISE` layer have
+been moved here. The remaining Media keys replace those that are now on the
+base layers. The `BACKLIT` key has also been moved here.
+```
+  ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+  |   ~     |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |   Bksp      |
+  |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+  |   [      |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |   "|"      |
+  |----------`------`------`------`------`------`------`------`------`------`------`------------|
+  |   ]       |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |   -  |   =  |   [  |   ]  |    \      |
+  |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+  |  Brite  |         |         |                |                |         |   Vol-  |   Mute  |
+   `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+```
+
+## Raise Layer (Numbers and Arithmetic Operators)
+All of the numbers and arithmetic operators are available on this layer. Some
+keys are duplicated for the convenience of their positions. The `0` and `$`
+keys at the far left are for quick access to beginning and end of line in vim.
+```
+  ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+  |   0     |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  |   Bksp      |
+  |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+  |   $      |   4  |   5  |   6  |   .  |   +  |   .  |   4  |   5  |   6  |   *  |   "|"      |
+  |----------`------`------`------`------`------`------`------`------`------`------`------------|
+  |   =       |   7  |   8  |   9  |   0  |   -  |   .  |   1  |   2  |   3  |   /  |    \      |
+  |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+  |  Brite  |         |         |                |                |         |   Vol-  |   Mute  |
+   `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+```
+
+## TouchCursor layer plus personal customizations
+[TouchCursor](http://martin-stone.github.io/touchcursor/) uses the `Space` key
+as the modifier, with the `IJKL` home row keys representing the inverted-T of
+the arrow keys. All of the default TouchCursor keymappings for the right hand
+are represented below. My personalizations include all of the keys shown for
+the left hand. Having the `Alt` and `Shift` keys (as well as the `Control` key
+from the base layers) readily accessible from the home row allows quick word
+jumps and highlighting when used in conjunction with the arrow keys. The
+`Alt-Tab` macro is not only useful under Windows, but also under Mac when used
+with alternative switchers like [HyperSwitch](https://bahoom.com/hyperswitch).
+The `Cmd-Tab` and `Ctrl-Tab` sequences are duplicated for easy access while in
+this layer. The `KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_FIND,` and `KC_AGAIN`
+keycodes do not seem to work. There are macros in place that'll "automatically"
+choose the correct version (`Cmd-Tab` vs. `Alt-Tab`, `Cmd-C` vs. `Ctrl-C`,
+etc.) depending on which layout you've currently selected (`AG_NORM` or
+`AG_SWAP`) in the `_ADJUST` layer. The `Desk_L` and `Desk_R` macros are what I
+use to switch between Virtual Desktops Left/Right. The `Tab_C`, `Tab_N` and
+`Tab_R` are for "Close Tab," "New Tab" and "Reopen Closed Tab" for apps such as
+Google Chrome.
+```
+  ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+  | AltTab  |CmdTab|CtlTab| GUI  |Shift |  ~   |Insert| Home |  Up  | End  | Bksp |             |
+  |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+  |          | Alt  |Space |Tab_C | Find |Again | PgUp | Left | Down |Right |Desk_L|  Desk_R    |
+  |----------`------`------`------`------`------`------`------`------`------`------`------------|
+  |           | Undo | Cut  | Copy |Paste |  `   | PgDn | Del  |Tab_N |Tab_R |iTerm2|           |
+  |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+  |         |         |         |                |                |         |         |         |
+   `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+```
+
+## Mouse Layer
+The Mouse layer, closely mimics the layout/behaviour of the TouchCursor layer.
+The `D` key (on QWERTY) is used to activate this layer. All 16 keycodes for the
+mouse from the `doc/keycode.txt` file are represented, and logically located,
+IMHO. The left and right click buttons are duplicated; on the right hand side,
+for a quick click here and there, and again on the left hand side for when the
+buttons need to be held for dragging things or highlighting text, thus allowing
+the right hand to be free to use the up/down/left/right actions.
+```
+  ,---------+------+------+------+------+------+------+------+------+------+------+-------------.
+  |         |      |ACCL0 |      |      |      |      |WHL_L |  Up  |WHL_R | BTN2 |             |
+  |---------`------`------`------`------`------`------`------`------`------`------`-------------|
+  |          |ACCL2 | BTN2 |      | BTN1 |ACCL1 |WHL_Up| Left | Down |Right | BTN4 |   BTN5     |
+  |----------`------`------`------`------`------`------`------`------`------`------`------------|
+  |           |      |      |      | BTN3 |      |WHL_Dn| BTN1 |      |      | BTN3 |           |
+  |-----------`------`------`------`------`-----'-------`------`------`------`------`-----------|
+  |         |         |         |                |                |         |         |         |
+   `--------+---------+---------+------^^^-------+-----^^^--------+---------+---------+---------'
+```
index e3b557fe2de8becaea37aad83a0b97e408f2afd4..4f691a4ca0ec1635b7826a2a09fae26e7f417aac 100644 (file)
@@ -13,16 +13,16 @@ Depending on which keymap you would like to use, you will have to compile slight
 
 ### Default
 
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
 ```
-$ make keymap=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 
 Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
\ No newline at end of file
diff --git a/keyboards/tv44/rules.mk b/keyboards/tv44/rules.mk
new file mode 100644 (file)
index 0000000..dbba6ba
--- /dev/null
@@ -0,0 +1,69 @@
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= yes           # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
index 4f3130c483250fcfd07969e49a3fa5ec4af2b3ba..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,76 +1,3 @@
-
-
-# MCU name
-MCU = at90usb1286
-# MCU = at90usb1287
-# MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=1024
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= yes           # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
index f50378ffa8ffbc21608c6acfa4ead83c3077d6aa..1f8466a5460fc3d16c898548c53cd45d48f1f049 100644 (file)
@@ -26,10 +26,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* COL2ROW or ROW2COL */
 #define DIODE_DIRECTION ROW2COL
 
-// #define BACKLIGHT_PIN B7
-// #define BACKLIGHT_BREATHING
-// #define BACKLIGHT_LEVELS 3
-
+#define BACKLIGHT_PIN B7
+#define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 3
 
 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 #define DEBOUNCING_DELAY 5
@@ -124,10 +123,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 /* disable debug print */
-//#define NO_DEBUG
+// #ifndef NO_DEBUG
+// #  define NO_DEBUG
+// #endif
 
 /* disable print */
-//#define NO_PRINT
+// #ifndef NO_PRINT
+// #  define NO_PRINT
+// #endif
+
+/* Only print user print statements */
+// #define USER_PRINT
+
 
 /* disable action features */
 //#define NO_ACTION_LAYER
index ecbe7e1ab223a31fc05c55b87ef8f2f45c7372e5..5a930e85edbd78d2d833ae59d1078340cd25f300 100644 (file)
@@ -2,19 +2,19 @@
 #   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = yes        # Console for debug(+400)
-COMMAND_ENABLE = yes        # Commands for debug and configuration
-NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
-MIDI_ENABLE = no            # MIDI controls
-AUDIO_ENABLE = yes          # Audio output on port C6
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+BOOTMAGIC_ENABLE   = yes  # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE    = yes  # Mouse keys(+4700)
+EXTRAKEY_ENABLE    = yes  # Audio control and System control(+450)
+CONSOLE_ENABLE     = yes  # Console for debug(+400)
+COMMAND_ENABLE     = yes  # Commands for debug and configuration
+NKRO_ENABLE        = yes  # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE   = yes  # Enable keyboard backlight functionality
+MIDI_ENABLE        = no   # MIDI controls
+AUDIO_ENABLE       = yes  # Audio output on port C6
+UNICODE_ENABLE     = no   # Unicode
+BLUETOOTH_ENABLE   = no   # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE    = no   # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+SLEEP_LED_ENABLE   = no   # Breathing sleep LED during USB suspend
 
 ifndef QUANTUM_DIR
        include ../../../../Makefile
index 16740fb15b4c61d926a7bc49606daf20d8a7fa15..efd43f41b4e7523c27f96a0212300acf77ceb038 100644 (file)
@@ -4,25 +4,44 @@
 #include "../../config.h"
 #include "matrix_types.h"
 
-
 /* USB Device descriptor parameter */
 #define VENDOR_ID       0xFEED
-#define PRODUCT_ID      GET_PID(NUMERIC_NORMAL, HOMING_MAX_TEENSY)
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    IBNobody
 #define PRODUCT         Vision Division
 #define DESCRIPTION     Full / Split Keyboard
 
-
-#define MATRIX_ROWS 6
+#define MATRIX_ROWS     6
 #define MATRIX_ROW_PINS { C2, C3, F4, F5, F6, F7 }
 
-#define MATRIX_COLS GET_MATRIX_COLS(NUMERIC_NORMAL, HOMING_MAX_TEENSY)
-#define MATRIX_COL_PINS GET_MATRIX_COL_PINS(NUMERIC_NORMAL, HOMING_MAX_TEENSY)
+// !!! MAKE SURE THAT THE LEFT/RIGHT PCB DEFINES MATCH ON ALL OF THESE COLUMNS
 
-#define UNUSED_PINS
+//                                               **LEFT**                 **RIGHT**
+#define PRODUCT_ID      GET_PID(                 NUMERIC_NORMAL,          NUMERIC_MAX_TEENSY)
+#define MATRIX_COLS     GET_MATRIX_COLS(         NUMERIC_NORMAL,          NUMERIC_MAX_TEENSY)
+#define MATRIX_COL_PINS GET_MATRIX_COL_PINS(     NUMERIC_NORMAL,          NUMERIC_MAX_TEENSY)
 
-/*#define KEYMAP( \
+#define KEYMAP(MATRIX_LAYER, \
+      k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A,               k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C, \
+      k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A,               k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C, \
+      k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A,               k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C, \
+      k401, k402, k403, k404,       k405, k406, k407, k408, k409, k40A,               k411, k412, k413, k414, k415, k416, k417, k418,       k419, k41A, k41B, k41C, \
+      k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A,               k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C, \
+      k601, k602, k603, k604,       k605, k606, k607, k608, k609, k60A,               k611, k612, k613, k614, k615, k616, k617, k618,       k619, k61A, k61B, k61C  \
+) \
+KEYMAP_MASTER(MATRIX_LAYER,                      NUMERIC_NORMAL,          NUMERIC_MAX_TEENSY, \
+      k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, KC_NO, KC_NO, k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C, \
+      k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, KC_NO, KC_NO, k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C, \
+      k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, KC_NO, KC_NO, k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C, \
+      k401, k402, k403, k404,       k405, k406, k407, k408, k409, k40A, KC_NO, KC_NO, k411, k412, k413, k414, k415, k416, k417, k418,       k419, k41A, k41B, k41C, \
+      k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, KC_NO, KC_NO, k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C, \
+      k601, k602, k603, k604,       k605, k606, k607, k608, k609, k60A, KC_NO, KC_NO, k611, k612, k613, k614, k615, k616, k617, k618,       k619, k61A, k61B, k61C  \
+)
+
+// Example Keymap Macros
+
+/*
+#define KEYMAP(MATRIX_LAYER, \
       k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C, \
       k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C, \
       k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C, \
       k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C, \
       k601, k602, k603, k604,       k605, k606, k607, k608, k609, k60A, k60B, k60C, k611, k612, k613, k614, k615, k616, k617, k618,       k619, k61A, k61B, k61C  \
 ) \
-KEYMAP_MASTER(NUMERIC_MAX_TEENSY, NUMERIC_MAX, \
+KEYMAP_MASTER(MATRIX_LAYER,                      NUMERIC_MAX_TEENSY,      NUMERIC_MAX, \
       k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C, \
       k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C, \
       k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C, \
       k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C, \
       k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C, \
       k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, k60B, k60C, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, k61C  \
-)*/
+)
+*/
 
-#define KEYMAP( \
+/*
+#define KEYMAP(MATRIX_LAYER, \
       k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, \
       k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, \
       k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, \
@@ -47,7 +68,7 @@ KEYMAP_MASTER(NUMERIC_MAX_TEENSY, NUMERIC_MAX, \
       k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, \
       k601, k602, k603, k604,       k605, k606, k607, k608, k609, k60A, k611, k612, k613, k614, k615, k616, k617, k618,       k619, k61A, k61B  \
 ) \
-KEYMAP_MASTER(NUMERIC_NORMAL, HOMING_MAX_TEENSY, \
+KEYMAP_MASTER(MATRIX_LAYER,                      NUMERIC_NORMAL,          HOMING_MAX_TEENSY, \
       k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, KC_NO, KC_NO, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, KC_NO, \
       k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, KC_NO, KC_NO, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, KC_NO, \
       k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, KC_NO, KC_NO, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, KC_NO, \
@@ -55,5 +76,6 @@ KEYMAP_MASTER(NUMERIC_NORMAL, HOMING_MAX_TEENSY, \
       k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, KC_NO, KC_NO, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, KC_NO, \
       k601, k602, k603, k604, k605, k606, k607, k608, k609, k60A, KC_NO, KC_NO, k611, k612, k613, k614, k615, k616, k617, k618, k619, k61A, k61B, KC_NO  \
 )
+*/
 
 #endif
\ No newline at end of file
index b8cef9c759ba3a2bac1a10aaa73621cec0d0854a..64118abdcee50c5206662005791e7b12c9f47167 100644 (file)
@@ -8,46 +8,70 @@
     #include "song_list.h"
 #endif
 
-#define LAYER_QWERTY                     0
-#define LAYER_COLEMAK                    1
-#define LAYER_DVORAK                     2
-#define LAYER_UPPER                      3
-#define LAYER_LOWER                      4
-#define LAYER_FUNCTION                   5
-#define LAYER_MOUSE                      6
-#define LAYER_ADJUST                     7
-
-#define MACRO_QWERTY                     0
-#define MACRO_COLEMAK                    1
-#define MACRO_DVORAK                     2
-#define MACRO_UPPER                      3
-#define MACRO_LOWER                      4
-#define MACRO_FUNCTION                   5
-#define MACRO_MOUSE                      6
-#define MACRO_TIMBRE_1                   7
-#define MACRO_TIMBRE_2                   8
-#define MACRO_TIMBRE_3                   9
-#define MACRO_TIMBRE_4                  10
-#define MACRO_TEMPO_U                   11
-#define MACRO_TEMPO_D                   12
-#define MACRO_TONE_DEFAULT              13
-#define MACRO_MUSIC_TOGGLE              14
-#define MACRO_AUDIO_TOGGLE              16
-#define MACRO_INC_VOICE                 18
-#define MACRO_DEC_VOICE                 19
-#define MACRO_BACKLIGHT                 20
-#define MACRO_BREATH_TOGGLE             21
-#define MACRO_BREATH_SPEED_INC          23
-#define MACRO_BREATH_SPEED_DEC          24
-#define MACRO_BREATH_DEFAULT            25
+enum keyboard_layers {
+  LAYER_QWERTY = 0,
+  LAYER_UPPER,
+  LAYER_LOWER,
+  LAYER_FUNCTION,
+  LAYER_MOUSE,
+  LAYER_ADJUST,
+};
+enum keyboard_macros {
+  MACRO_QWERTY = 0,
+  MACRO_UPPER,
+  MACRO_LOWER,
+  MACRO_FUNCTION,
+  MACRO_MOUSE,
+  MACRO_TIMBRE_1,
+  MACRO_TIMBRE_2,
+  MACRO_TIMBRE_3,
+  MACRO_TIMBRE_4,
+  MACRO_TEMPO_U,
+  MACRO_TEMPO_D,
+  MACRO_TONE_DEFAULT,
+  MACRO_MUSIC_TOGGLE,
+  MACRO_AUDIO_TOGGLE,
+  MACRO_INC_VOICE,
+  MACRO_DEC_VOICE,
+  MACRO_BACKLIGHT,
+  MACRO_BREATH_TOGGLE,
+  MACRO_BREATH_SPEED_INC,
+  MACRO_BREATH_SPEED_DEC,
+  MACRO_BREATH_DEFAULT,
+  MACRO_MOUSE_MOVE_UL,
+  MACRO_MOUSE_MOVE_UR,
+  MACRO_MOUSE_MOVE_DL,
+  MACRO_MOUSE_MOVE_DR,
+  MACRO_HELP,
+  MACRO_HELP_1,
+  MACRO_HELP_2,
+  MACRO_HELP_3,
+  MACRO_HELP_4,
+  MACRO_HELP_5,
+  MACRO_HELP_6,
+  MACRO_HELP_7,
+  MACRO_HELP_8,
+  MACRO_HELP_9,
+  MACRO_HELP_0,
+  MACRO_GENERAL_1,
+  MACRO_GENERAL_2,
+  MACRO_GENERAL_3,
+  MACRO_GENERAL_4,
+  MACRO_GENERAL_5,
+  MACRO_CURSOR_UL,
+  MACRO_CURSOR_UR,
+  MACRO_CURSOR_DL,
+  MACRO_CURSOR_DR,
+  MACRO_MUTE_APP,
+  MACRO_COPY_CUT,
+};
 
 #define M_QWRTY             M(MACRO_QWERTY)
-#define M_COLMK             M(MACRO_COLEMAK)
-#define M_DVORK             M(MACRO_DVORAK)
 #define M_UPPER             M(MACRO_UPPER)
 #define M_LOWER             M(MACRO_LOWER)
 #define M_FUNCT             M(MACRO_FUNCTION)
 #define M_MOUSE             M(MACRO_MOUSE)
+
 #define TIMBR_1             M(MACRO_TIMBRE_1)
 #define TIMBR_2             M(MACRO_TIMBRE_2)
 #define TIMBR_3             M(MACRO_TIMBRE_3)
 #define TMPO_UP             M(MACRO_TEMPO_U)
 #define TMPO_DN             M(MACRO_TEMPO_D)
 #define TMPO_DF             M(MACRO_TONE_DEFAULT)
+
+#define VC_UP               M(MACRO_INC_VOICE)
+#define VC_DOWN             M(MACRO_DEC_VOICE)
+
 #define M_BACKL             M(MACRO_BACKLIGHT)
 #define M_BRTOG             M(MACRO_BREATH_TOGGLE)
 #define M_BSPDU             M(MACRO_BREATH_SPEED_INC)
 #define M_BSPDD             M(MACRO_BREATH_SPEED_DEC)
 #define M_BDFLT             M(MACRO_BREATH_DEFAULT)
 
+#define M_MS_UL             M(MACRO_MOUSE_MOVE_UL)
+#define M_MS_UR             M(MACRO_MOUSE_MOVE_UR)
+#define M_MS_DL             M(MACRO_MOUSE_MOVE_DL)
+#define M_MS_DR             M(MACRO_MOUSE_MOVE_DR)
 
-#define VC_UP               M(MACRO_INC_VOICE)
-#define VC_DOWN             M(MACRO_DEC_VOICE)
+#define M_HELP              M(MACRO_HELP)
+#define M_HELP1             M(MACRO_HELP_1)
+#define M_HELP2             M(MACRO_HELP_2)
+#define M_HELP3             M(MACRO_HELP_3)
+#define M_HELP4             M(MACRO_HELP_4)
+#define M_HELP5             M(MACRO_HELP_5)
+#define M_HELP6             M(MACRO_HELP_6)
+#define M_HELP7             M(MACRO_HELP_7)
+#define M_HELP8             M(MACRO_HELP_8)
+#define M_HELP9             M(MACRO_HELP_9)
+#define M_HELP0             M(MACRO_HELP_0)
+
+#define M_M1                M(MACRO_GENERAL_1)
+#define M_M2                M(MACRO_GENERAL_2)
+#define M_M3                M(MACRO_GENERAL_3)
+#define M_M4                M(MACRO_GENERAL_4)
+#define M_M5                M(MACRO_GENERAL_5)
+
+#define M_UL                M(MACRO_CURSOR_UL)
+#define M_UR                M(MACRO_CURSOR_UR)
+#define M_DL                M(MACRO_CURSOR_DL)
+#define M_DR                M(MACRO_CURSOR_DR)
+
+#define M_MUTEA             M(MACRO_MUTE_APP)
+
+#define M_CP_CT             M(MACRO_COPY_CUT)
 
 
 #define SC_UNDO             LCTL(KC_Z)
 #define SC_ACLS             LALT(KC_F4)
 #define SC_CCLS             LCTL(KC_F4)
 
+#define TG_NKRO             MAGIC_TOGGLE_NKRO
 #define OS_SHFT             KC_FN0
 
 #define _______             KC_TRNS
 #define ________________    _______, _______
 #define XXXXXXXXXXXXXXXX    XXXXXXX, XXXXXXX
 
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-
-KEYMAP( \
-      KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX,       KC_F1,   KC_F2,   KC_F3,   KC_F4,   XXXXXXX, KC_F5,   KC_F6,   KC_F7,   KC_F8,   XXXXXXX, KC_F9,   KC_F10,  KC_F11,  KC_F12,        KC_PSCR, KC_SLCK, KC_PAUS, \
-      KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,       KC_ESC,  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_EQL,  KC_BSPC,       KC_INS,  KC_HOME, KC_PGUP, \
-      KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS,       KC_TAB,  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_MINS, KC_BSLS,       KC_DEL,  KC_END,  KC_PGDN, \
-      KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS,       KC_CAPS, KC_BSPC, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,        XXXXXXX, XXXXXXX, XXXXXXX, \
-      KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT,       KC_LSFT, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT,       XXXXXXX, KC_UP,   XXXXXXX, \
-      KC_KP_0, KC_KP_0, KC_PDOT, KC_PENT,       KC_LCTL, KC_LCTL, XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, KC_SPC,  KC_SPC,  XXXXXXX, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_RCTL,       KC_LEFT, KC_DOWN, KC_RGHT  \
-)
-
-
-//  [LAYER_QWERTY]       = { // QWERTY
-//   { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },
-//   { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
-//   { KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
-//   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-//   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
-//  },
-
-
-// /* Numeric Max / Homing Normal - Traditional
-//  * .-----------------------------------.       .-----------------------------------.        .-----------------_-----------------.        .-----------------------------------.       .--------------------------.
-//  * |        |        |        |        |       |        |        |        |        |        |        |        |        |        |        |        |        |        |        |       |        |        |        |
-//  * '-----------------------------------'       '-----------------------------------'        '-----------------------------------'        '-----------------------------------'       '--------------------------'
-//  * .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .--------------------------.
-//  * |        |        |        |        |       | ESC    | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      |        |       |        |        |        |
-//  * |--------+--------+--------+--------|       | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------+--------+--------|
-//  * |        |        |        |        |       | TAB    | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      |        |       |        |        |        |
-//  * |--------+--------+--------+        |   o   | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       '--------+--------+--------'
-//  * |        |        |        |        |   o   | CAPS   | CAPS   | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      |        |
-//  * |--------+--------+--------+--------|   o   | -------+ -------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---+--------|                .--------.
-//  * |        |        |        |        |       | LSHIFT | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | XXXXXX |        |                |        |
-//  * |--------+--------+--------+        |       | -------+ -------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+--------+--------|       .--------+--------+--------.
-//  * |                 |        |        |       | LCTRL  | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  |        |       |        |        |        |
-//  * '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '--------------------------'
-//  */
-
-
-// /* QWERTY
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | XXXXXX . BACKSP |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | [      | ]      | \      | DEL    |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * | CAPS   | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | XXXXXX . ENTER  | PG UP  |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_QWERTY]       = { // QWERTY
-//   { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },
-//   { KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
-//   { KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
-//   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-//   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
-//  },
-
-//  /* COLEMAK
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | -      | =      | XXXXXX . BACKSP |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * | TAB    | Q      | W      | F      | P      | G      | J      | L      | U      | Y      | ;      | [      | ]      | \      | DEL    |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * | BACKSP | A      | R      | S      | T      | D      | H      | N      | E      | I      | O      | '      | XXXXXX . ENTER  | PG UP  |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * | LSHIFT | Z      | X      | C      | V      | B      | K      | M      | ,      | .      | /      | XXXXXX . RSHIFT | UP     | PG DN  |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_COLEMAK]      = { // COLEMAK
-//   { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC  },
-//   { KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL   },
-//   { KC_BSPC, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, KC_ENT,  KC_ENT,  KC_PGUP  },
-//   { KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-//   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
-// },
-
-// /* DVORAK
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * | ESC    | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | [      | ]      | XXXXXX . BACKSP |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * | TAB    | '      | ,      | .      | P      | Y      | F      | G      | C      | R      | L      | /      | =      | \      | DEL    |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * | CAPS   | A      | O      | E      | U      | I      | D      | H      | T      | N      | S      | -      | XXXXXX . ENTER  | PG UP  |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * | LSHIFT | ;      | Q      | J      | K      | X      | B      | M      | W      | V      | Z      | XXXXXX . RSHIFT | UP     | PG DN  |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * | LCTRL  | LWIN   | FN     | LALT   | UPPER  | XXXXXX . SPACE  | LOWER  | SHIFT  | RALT   | APP    | RCTRL  | LEFT   | DOWN   | RIGHT  |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_DVORAK]       = { // DVORAK
-//   { KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC  },
-//   { KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_SLSH, KC_EQL,  KC_BSLS, KC_DEL   },
-//   { KC_CAPS, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_MINS, KC_ENT,  KC_ENT,  KC_PGUP  },
-//   { KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_RSFT, KC_RSFT, KC_UP,   KC_PGDN  },
-//   { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_UPPER, KC_SPC,  KC_SPC,  M_LOWER, OS_SHFT, KC_RALT, KC_APP,  KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT  },
-//  },
-
-// /* UPPER
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * | PRINT  | BR TOG | BR SP+ | BR SP- | BR RST | XXXXXX | XXXXXX | NUM LK | /      | *      |        | NUM LK | SCR LK | XXXXXX . PAUSE  |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * |        | F1     | F2     | F3     | F4     |        |        | 7      | 8      | 9      | -      |        |        |        | INS    |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * | CAP LK | F5     | F6     | F7     | F8     |        |        | 4      | 5      | 6      | +      |        | XXXXXX .        | HOME   |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * |        | F9     | F10    | F11    | F12    |        |        | 1      | 2      | 3      | ENTER  | XXXXXX .        |        | END    |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * |        |        |        |        |        | 0               |        | RALT   | .      | ENTER  |        |        |        |        |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_UPPER]        = { // UPPER
-//   { KC_PSCR, M_BRTOG, M_BSPDU, M_BSPDD, M_BDFLT, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, KC_SLCK, KC_PAUS, KC_PAUS  },
-//   { _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______, _______, KC_INS   },
-//   { KC_CAPS, KC_F5,   KC_F6,   KC_F7,   KC_F8,   XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, ________________, KC_HOME  },
-//   { _______, KC_F9,   KC_F10,  KC_F11,  KC_F12,  XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, ________________, _______, KC_END   },
-//   { _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, _______, _______, _______, _______  },
-//  },
-
-// /* LOWER
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * |        | F1     | F2     | F3     | F4     | F5     | F6     | F7     | F8     | F9     | F10    | F11    | F12    | XXXXXX . BACKSP |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * |        | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      |        |        |        | INS    |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * |        | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      |        | XXXXXX .        | HOME   |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * |        | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | XXXXXX .        |        | END    |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * |        |        |        |        |        |                 |        |        |        |        |        |        |        |        |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_LOWER]        = { // LOWER
-//   { _______, 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_DLR,  KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT,   _______, _______, _______, KC_INS   },
-//   { _______, KC_CIRC, KC_ASTR, KC_PPLS, KC_PMNS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT,  KC_GRV,  _______, ________________, KC_HOME  },
-//   { _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL,  KC_LT,   KC_GT,   KC_QUES, ________________, _______, KC_END   },
-//   { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
-//  },
-
-// /* FUNCTION
-//  * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
-//  * | NUM LK |        |        |        |        |        |        |        |        |        |        |        |        | XXXXXX .        |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
-//  * | SCR LK | F13    | F14    | F15    | F16    |        |        |        |        |        |        |        |        |        |        |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
-//  * | CAP LK | F17    | F18    | F19    | F20    |        |        |        |        |        |        |        | XXXXXX .        |        |
-//  * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
-//  * |        | F21    | F22    | F23    | F24    |        |        |        |        |        |        | XXXXXX .        | VOL UP | MUTE   |
-//  * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
-//  * |        |        |        |        |        | PLAY/PAUSE      |        |        |        |        |        | PTRACK | VOL DN | NTRACK |
-//  * '--------------------------------------------------------------------------------------------------------------------------------------'
-//  */
-
-//  [LAYER_FUNCTION]     = { // FUNCTION
-//   { KC_NLCK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },
-//   { KC_SLCK, KC_F13,  KC_F14,  KC_F15,  KC_F16,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
-//   { KC_CAPS, KC_F17,  KC_F18,  KC_F19,  KC_F20,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, XXXXXXX  },
-//   { _______, KC_F21,  KC_F22,  KC_F23,  KC_F24,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_VOLU, KC_MUTE  },
-//   { _______, _______, _______, _______, _______, KC_MPLY, KC_MPLY, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT  },
-//  },
-
-// #ifdef MOUSEKEY_ENABLE
-
-//  [LAYER_MOUSE]        = { // MOUSE
-//   { _______, KC_ACL0, KC_ACL1, KC_ACL2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX  },
-//   { XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  },
-//   { XXXXXXX, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXXXXXXXXXXX, KC_WH_U  },
-//   { _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ________________, KC_MS_U, KC_WH_D  },
-//   { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R  },
-//  },
-
-// #endif
-
-//  [LAYER_ADJUST]       = { // ADJUST
-//   { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, _______, _______, MU_TOG,  AU_TOG,  ________________  },
-//   { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
-//   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
-//   { _______, _______, _______, _______, M_BACKL, RESET,   _______, M_MOUSE, _______, _______, _______, ________________, MUV_IN,  _______  },
-//   { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, MUV_DE,  _______  },
-//  },
-
-
-// /*
-//  [LAYER_EMPTY]        = { // LAYER
-//   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________  },
-//   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______  },
-//   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______  },
-//   { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, _______  },
-//   { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______  },
-//  },
-// */
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] =
+{
+/* LAYER = LAYER_QWERTY
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | FN     | PRINT  | SCR LK | PAUSE  |       | F1     | F2     | F3     | F4     | XXXXXX | F5     | F6     | F7     | F8     | XXXXXX | F9     | F10    | F11    | F12    |       | VOL DN | MUTE   | VOL UP | BACKLT |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | M1     | INS    | HOME   | PG UP  |       | ESC    | `      | 1      | 2      | 3      | 4      | 5      | 6      | 7      | 8      | 9      | 0      | =      | BACKSP |       | NUM LK | KP /   | KP *   | KP -   |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | M2     | DEL    | END    | PG DN  |       | TAB    | TAB    | Q      | W      | E      | R      | T      | Y      | U      | I      | O      | P      | -      | \      |       | KP 7   | KP 8   | KP 9   | KP +   |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | M3     | UL     | UP     | UR     |       | CAP LK | BACKSP | A      | S      | D      | F      | G      | H      | J      | K      | L      | ;      | '      | ENTER  |   o   | KP 4   | KP 5   | KP 6   | KP +   |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | M4     | LEFT   | CP/CT  | RIGHT  |       | LSHIFT | LSHIFT | Z      | X      | C      | V      | B      | N      | M      | ,      | .      | /      | RSHIFT | RSHIFT |       | KP 1   | KP 2   | KP 3   | KP Ent |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | M5     | DL     | DOWN   | DR     |       | LCTRL  | XXXXXX | XXXXXX | LWIN   | LALT   | LOWER  | SPACE  . SPACE  | UPPER  | OSHIFT | RALT   | APP    | XXXXXX | RCTRL  |       | KP 0   | KP ,   | KP .   | KP Ent |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+*/
+KEYMAP(LAYER_QWERTY, \
+    M_HELP , KC_PSCR, KC_SLCK, KC_PAUS,         KC_F1  , KC_F2  , KC_F3  , KC_F4  , XXXXXXX, KC_F5  , KC_F6  , KC_F7  , KC_F8  , XXXXXXX, KC_F9  , KC_F10 , KC_F11 , KC_F12 ,         KC_VOLD, KC_MUTE, KC_VOLU, M_BACKL, \
+    M_M1   , KC_INS , KC_HOME, KC_PGUP,         KC_ESC , KC_GRV , KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , KC_EQL , KC_BSPC,         KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
+    M_M2   , KC_DEL , KC_END , KC_PGDN,         KC_TAB , KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_MINS, KC_BSLS,         KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, \
+    M_M3   , M_UL   , KC_UP  , M_UR   ,         KC_CAPS, KC_BSPC, KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_QUOT, KC_ENT ,         KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, \
+    M_M4   , KC_LEFT, M_CP_CT, KC_RGHT,         KC_LSFT, KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT, KC_RSFT,         KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, \
+    M_M5   , M_DL   , KC_DOWN, M_DR   ,         KC_LCTL, XXXXXXX, XXXXXXX, KC_LGUI, KC_LALT, M_LOWER, KC_SPC , KC_SPC , M_UPPER, OS_SHFT, KC_RALT, KC_APP , XXXXXXX, KC_RCTL,         KC_KP_0, KC_PCMM, KC_PDOT, KC_PENT  \
+),
+/* LAYER = LAYER_LOWER
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | ______ | ______ | ______ | ______ |       | F13    | F14    | F15    | F16    | XXXXXX | F17    | F18    | F19    | F20    | XXXXXX | F21    | F22    | F23    | F24    |       | ______ | MUTE A | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | $      | {      | [      | (      | %      | #      | )      | ]      | }      | @      | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | ^      | *      | +      | -      | /      | \      | _      | '      | "      | `      | ______ | ______ |   o   | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | |      | &      | !      | ~      | ;      | :      | =      | <      | >      | ?      | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | XXXXXX | XXXXXX | ______ | ______ | ______ | ______ . ______ | LOWER  | ______ | ______ | ______ | XXXXXX | ______ |       | ______ | ______ | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+*/
+KEYMAP(LAYER_LOWER, \
+    _______, _______, _______, _______,         KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 ,         _______, M_MUTEA, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_DLR , KC_LCBR, KC_LBRC, KC_LPRN, KC_PERC, KC_HASH, KC_RPRN, KC_RBRC, KC_RCBR, KC_AT  , _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_CIRC, KC_ASTR, KC_PLUS, KC_MINS, KC_SLSH, KC_BSLS, KC_UNDS, KC_QUOT, KC_DQT , KC_GRV , _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_PIPE, KC_AMPR, KC_EXLM, KC_TILD, KC_SCLN, KC_COLN, KC_EQL , KC_LT  , KC_GT  , KC_QUES, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, M_LOWER, _______, _______, _______, XXXXXXX, _______,         _______, _______, _______, _______  \
+),
+/* LAYER = LAYER_UPPER
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | ______ | ______ | ______ | ______ |       | F13    | F14    | F15    | F16    | XXXXXX | F17    | F18    | F19    | F20    | XXXXXX | F21    | F22    | F23    | F24    |       | ______ | MUTE A | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | F1     | F2     | F3     | F4     | NUM LK | KP /   | KP 7   | KP 8   | KP 9   | KP -   | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | F5     | F6     | F7     | F8     | CAP LK | KP *   | KP 4   | KP 5   | KP 6   | KP +   | ______ | ______ |   o   | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | F9     | F10    | F11    | F12    | SCR LK | KP 0   | KP 1   | KP 2   | KP 3   | KP Ent | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | ______ | ______ | ______ | ______ |       | ______ | XXXXXX | XXXXXX | ______ | ______ | UPPER  | KP 0   . KP 0   | ______ | RALT   | KP .   | KP Ent | XXXXXX | ______ |       | ______ | ______ | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+*/
+KEYMAP(LAYER_UPPER, \
+    _______, _______, _______, _______,         KC_F13 , KC_F14 , KC_F15 , KC_F16 , XXXXXXX, KC_F17 , KC_F18 , KC_F19 , KC_F20 , XXXXXXX, KC_F21 , KC_F22 , KC_F23 , KC_F24 ,         _______, M_MUTEA, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_NLCK, KC_PSLS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_CAPS, KC_PAST, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, _______, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_SLCK, KC_KP_0, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, _______, _______,         _______, _______, _______, _______, \
+    _______, _______, _______, _______,         _______, XXXXXXX, XXXXXXX, _______, _______, M_UPPER, KC_KP_0, KC_KP_0, _______, KC_RALT, KC_PDOT, KC_PENT, XXXXXXX, _______,         _______, _______, _______, _______  \
+),
+/* LAYER = LAYER_MOUSE
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | MS BT1 | MS AC0 | MS WHU | MS AC2 |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | MS BT2 | MS WHL | MS WHD | MS WHU |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | MS BT3 | MS UL  | MS U   | MS UR  |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |   o   | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | MS BT4 | MS L   | MS BT1 | MS R   |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | MS BT5 | MS DL  | MS D   | MS DR  |       | ______ | ______ | ______ | ______ | ______ | ______ | ______ . ______ | ______ | ______ | ______ | ______ | ______ | ______ |       | ______ | ______ | ______ | ______ |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+*/
+KEYMAP(LAYER_MOUSE, \
+    _______, _______, _______, _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    KC_BTN1, KC_ACL0, KC_WH_U, KC_ACL2,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    KC_BTN2, KC_WH_L, KC_WH_D, KC_WH_U,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    KC_BTN3, M_MS_UL, KC_MS_U, M_MS_UR,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    KC_BTN4, KC_MS_L, KC_BTN1, KC_MS_R,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______, \
+    KC_BTN5, M_MS_DL, KC_MS_D, M_MS_DR,         _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,         _______, _______, _______, _______  \
+),
+/* LAYER = LAYER_ADJUST
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | HELP 1 | HELP 2 | HELP 3 | HELP 4 | XXXXXX | HELP 5 | HELP 6 | HELP 7 | HELP 8 | XXXXXX | HELP 9 | HELP 0 | XXXXXX | XXXXXX |       | VOICE- | AUDIO  | VOICE+ | MUSIC  |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+  .-----------------------------------.       .-----------------------------------------------------------------------------------------------------------------------------.       .-----------------------------------.
+  | 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 |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |   o   | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|   o   |--------|--------|--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | RESET  | XXXXXX | MOUSE  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  |--------+--------+--------+--------|       |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|       |--------|--------|--------+--------|
+  | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX | UPPER  | XXXXXX . XXXXXX | LOWER  | XXXXXX | XXXXXX | XXXXXX | XXXXXX | XXXXXX |       | XXXXXX | XXXXXX | XXXXXX | XXXXXX |
+  '-----------------------------------'       '-----------------------------------------------------------------------------------------------------------------------------'       '-----------------------------------'
+*/
+KEYMAP(LAYER_ADJUST, \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         M_HELP1, M_HELP2, M_HELP3, M_HELP4, XXXXXXX, M_HELP5, M_HELP6, M_HELP7, M_HELP8, XXXXXXX, M_HELP9, M_HELP0, XXXXXXX, XXXXXXX,         MUV_DE , AU_TOG , MUV_IN , MU_TOG , \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET  , XXXXXXX, M_MOUSE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+    XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, M_UPPER, XXXXXXX, XXXXXXX, M_LOWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX  \
+),
 
 };
 
@@ -313,303 +290,290 @@ float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
 
 void persistant_default_layer_set(uint16_t default_layer)
 {
-    eeconfig_update_default_layer(default_layer);
-    default_layer_set(default_layer);
+  eeconfig_update_default_layer(default_layer);
+  default_layer_set(default_layer);
 }
 
 const uint16_t PROGMEM fn_actions[] = {
-    [0] = ACTION_MODS_ONESHOT(MOD_LSFT),
+  [0] = ACTION_MODS_ONESHOT(MOD_LSFT),
 };
 
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
 
-    // MACRODOWN only works in this function
-    switch(id)
+  // MACRODOWN only works in this function
+  switch(id)
+  {
+
+    case MACRO_HELP_1:
+      if (record->event.pressed)
+      {
+        uprint("H1");
+      }
+      break;
+
+    case MACRO_HELP_2:
+      if (record->event.pressed)
+      {
+        uprint("H2");
+      }
+      break;
+
+    case MACRO_HELP_3:
+      if (record->event.pressed)
+      {
+        uprint("H3");
+      }
+      break;
+
+    case MACRO_HELP_4:
+      if (record->event.pressed)
+      {
+        uprint("H4");
+      }
+      break;
+
+   case MACRO_HELP_5:
+     if (record->event.pressed)
+     {
+       uprint("H5");
+     }
+     break;
+
+   case MACRO_HELP_6:
+     if (record->event.pressed)
+     {
+       uprint("H6");
+     }
+     break;
+
+   case MACRO_HELP_7:
+      if (record->event.pressed)
+      {
+        uprint("H7");
+      }
+      break;
+
+  case MACRO_HELP_8:
+    if (record->event.pressed)
+    {
+      uprint("H8");
+    }
+    break;
+
+  case MACRO_HELP_9:
+    if (record->event.pressed)
+    {
+      uprint("H9");
+    }
+    break;
+
+  case MACRO_BREATH_TOGGLE:
+    if (record->event.pressed)
+    {
+      breathing_toggle();
+    }
+    break;
+
+  case MACRO_BREATH_SPEED_INC:
+    if (record->event.pressed)
+    {
+      breathing_speed_inc(1);
+    }
+    break;
+
+  case MACRO_BREATH_SPEED_DEC:
+    if (record->event.pressed)
+    {
+      breathing_speed_dec(1);
+    }
+    break;
+
+  case MACRO_BREATH_DEFAULT:
+    if (record->event.pressed)
+    {
+      breathing_defaults();
+    }
+    break;
+
+  case MACRO_QWERTY:
+    if (record->event.pressed)
+    {
+      persistant_default_layer_set(1UL<<LAYER_QWERTY);
+    }
+    break;
+
+  case MACRO_UPPER:
+    if (record->event.pressed)
     {
+      layer_on(LAYER_UPPER);
+      breathing_speed_set(2);
+      breathing_pulse();
+      update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+    }
+    else
+    {
+      layer_off(LAYER_UPPER);
+      update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+    }
+    break;
+
+  case MACRO_LOWER:
+    if (record->event.pressed)
+    {
+      layer_on(LAYER_LOWER);
+      breathing_speed_set(2);
+      breathing_pulse();
+      update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+    }
+    else
+    {
+      layer_off(LAYER_LOWER);
+      update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
+    }
+    break;
 
-        // case MACRO_BREATH_TOGGLE:
-        //     if (record->event.pressed)
-        //     {
-        //         breathing_toggle();
-        //     }
-        //     break;
-
-        // case MACRO_BREATH_SPEED_INC:
-        //     if (record->event.pressed)
-        //     {
-        //         breathing_speed_inc(1);
-        //     }
-        //     break;
-
-        // case MACRO_BREATH_SPEED_DEC:
-        //     if (record->event.pressed)
-        //     {
-        //         breathing_speed_dec(1);
-        //     }
-        //     break;
-
-        // case MACRO_BREATH_DEFAULT:
-        //     if (record->event.pressed)
-        //     {
-        //         breathing_defaults();
-        //     }
-        //     break;
-
-        case MACRO_QWERTY:
-            if (record->event.pressed)
-            {
-                persistant_default_layer_set(1UL<<LAYER_QWERTY);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
-            }
-            break;
-
-        case MACRO_COLEMAK:
-            if (record->event.pressed)
-            {
-                persistant_default_layer_set(1UL<<LAYER_COLEMAK);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
-            }
-            break;
-
-        case MACRO_DVORAK:
-            if (record->event.pressed)
-            {
-                persistant_default_layer_set(1UL<<LAYER_DVORAK);
-                #ifdef AUDIO_ENABLE
-                    PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
-                #endif /* AUDIO_ENABLE */
-            }
-            break;
-
-        case MACRO_UPPER:
-            if (record->event.pressed)
-            {
-                layer_on(LAYER_UPPER);
-                // breathing_speed_set(2);
-                // breathing_pulse();
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
-            }
-            else
-            {
-                layer_off(LAYER_UPPER);
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
-            }
-            break;
-
-        case MACRO_LOWER:
-            if (record->event.pressed)
-            {
-                layer_on(LAYER_LOWER);
-                // breathing_speed_set(2);
-                // breathing_pulse();
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
-            }
-            else
-            {
-                layer_off(LAYER_LOWER);
-                update_tri_layer(LAYER_LOWER, LAYER_UPPER, LAYER_ADJUST);
-            }
-            break;
-
-        case MACRO_FUNCTION:
-            if (record->event.pressed)
-            {
-                // breathing_speed_set(3);
-                // breathing_enable();
-                layer_on(LAYER_FUNCTION);
-            }
-            else
-            {
-                // breathing_speed_set(1);
-                // breathing_self_disable();
-                layer_off(LAYER_FUNCTION);
-            }
-            break;
+  case MACRO_FUNCTION:
+    if (record->event.pressed)
+    {
+      breathing_speed_set(3);
+      breathing_enable();
+      layer_on(LAYER_FUNCTION);
+    }
+    else
+    {
+      breathing_speed_set(1);
+      breathing_self_disable();
+      layer_off(LAYER_FUNCTION);
+    }
+    break;
 
 #ifdef MOUSEKEY_ENABLE
 
-        case MACRO_MOUSE:
-            if (record->event.pressed)
-            {
-                layer_invert(LAYER_MOUSE);
-            }
-            break;
+  case MACRO_MOUSE:
+    if (record->event.pressed)
+    {
+      layer_invert(LAYER_MOUSE);
+    }
+    break;
 
 #endif /* MOUSEKEY_ENABLE */
 
 #ifdef AUDIO_ENABLE
 
-        case MACRO_TIMBRE_1:
-            if (record->event.pressed) set_timbre(TIMBRE_12);
-            break;
-
-        case MACRO_TIMBRE_2:
-            if (record->event.pressed) set_timbre(TIMBRE_25);
-            break;
-
-        case MACRO_TIMBRE_3:
-            if (record->event.pressed) set_timbre(TIMBRE_50);
-            break;
-
-        case MACRO_TIMBRE_4:
-            if (record->event.pressed) set_timbre(TIMBRE_75);
-            break;
-
-        case MACRO_TEMPO_U:
-            if (record->event.pressed) increase_tempo(10);
-            break;
-
-        case MACRO_TEMPO_D:
-            if (record->event.pressed) decrease_tempo(10);
-            break;
-
-        case MACRO_TONE_DEFAULT:
-            if (record->event.pressed)
-            {
-                set_timbre(TIMBRE_DEFAULT);
-                set_tempo(TEMPO_DEFAULT);
-            }
-            break;
-
-/*
-        case MACRO_AUDIO_TOGGLE:
-            if (record->event.pressed)
-            {
-                    if (is_audio_on())
-                    {
-                        audio_off();
-                    }
-                    else
-                    {
-                        audio_on();
-                        PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
-                    }
-            }
-            break;
-
-        case MACRO_MUSIC_TOGGLE:
-            if (record->event.pressed)
-            {
-                    if (IS_LAYER_ON(LAYER_MUSIC))
-                    {
-                        layer_off(LAYER_MUSIC);
-                        stop_all_notes();
-                    }
-                    else
-                    {
-                    PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
-                    layer_on(LAYER_MUSIC);
-                    }
-            }
-            break;
-        case MACRO_INC_VOICE:
-            if (record->event.pressed)
-            {
-                #ifdef AUDIO_ENABLE
-                    voice_iterate();
-                    PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
-                #endif
-            }
-            break;
-
-        case MACRO_DEC_VOICE:
-            if (record->event.pressed)
-            {
-                #ifdef AUDIO_ENABLE
-                    voice_deiterate();
-                    PLAY_NOTE_ARRAY(music_scale, false, STACCATO);
-                #endif
-            }
-            break;
-*/
+  case MACRO_TIMBRE_1:
+    if (record->event.pressed) set_timbre(TIMBRE_12);
+    break;
+
+  case MACRO_TIMBRE_2:
+    if (record->event.pressed) set_timbre(TIMBRE_25);
+    break;
+
+  case MACRO_TIMBRE_3:
+    if (record->event.pressed) set_timbre(TIMBRE_50);
+    break;
+
+  case MACRO_TIMBRE_4:
+    if (record->event.pressed) set_timbre(TIMBRE_75);
+    break;
+
+  case MACRO_TEMPO_U:
+    if (record->event.pressed) increase_tempo(10);
+    break;
+
+  case MACRO_TEMPO_D:
+    if (record->event.pressed) decrease_tempo(10);
+    break;
+
+  case MACRO_TONE_DEFAULT:
+    if (record->event.pressed)
+    {
+      set_timbre(TIMBRE_DEFAULT);
+      set_tempo(TEMPO_DEFAULT);
+    }
+    break;
 
 #endif /* AUDIO_ENABLE */
 
 #ifdef BACKLIGHT_ENABLE
-        case MACRO_BACKLIGHT:
-            if (record->event.pressed)
-            {
-                backlight_step();
-            }
-#endif
+  case MACRO_BACKLIGHT:
+    if (record->event.pressed)
+    {
+      backlight_step();
+    }
+  break;
+#endif /* BACKLIGHT_ENABLE */
 
-        default:
-            break;
+  default:
+    break;
 
-    }
-    return MACRO_NONE;
+}
+return MACRO_NONE;
 };
 
-
 #ifdef AUDIO_ENABLE
 
 void matrix_init_user(void)
 {
-    set_voice(default_voice);
-    startup_user();
-    println("Matrix Init");
+  set_voice(default_voice);
+  startup_user();
+  println("Matrix Init");
 }
 
 void led_set_user(uint8_t usb_led)
 {
-    static uint8_t old_usb_led = 0;
+  static uint8_t old_usb_led = 0;
 
-    _delay_ms(10); // gets rid of tick
+  _delay_ms(10); // gets rid of tick
 
-    if (!is_playing_notes())
+  if (!is_playing_notes())
+  {
+    if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+    {
+      // If CAPS LK LED is turning on...
+      PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
+    }
+    else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+    {
+      // If CAPS LK LED is turning off...
+      PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
+    }
+    else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
+    {
+      // If NUM LK LED is turning on...
+      PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
+    }
+    else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
     {
-        if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-        {
-                // If CAPS LK LED is turning on...
-                PLAY_NOTE_ARRAY(tone_caps_on,  false, LEGATO);
-        }
-        else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
-        {
-                // If CAPS LK LED is turning off...
-                PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
-        }
-        else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
-        {
-                // If NUM LK LED is turning on...
-                PLAY_NOTE_ARRAY(tone_numlk_on,  false, LEGATO);
-        }
-        else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
-        {
-                // If NUM LED is turning off...
-                PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
-        }
-        else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
-        {
-                // If SCROLL LK LED is turning on...
-                PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
-        }
-        else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
-        {
-                // If SCROLL LED is turning off...
-                PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
-        }
+      // If NUM LED is turning off...
+      PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
     }
+    else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+    {
+      // If SCROLL LK LED is turning on...
+      PLAY_NOTE_ARRAY(tone_scroll_on,  false, LEGATO);
+    }
+    else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+    {
+      // If SCROLL LED is turning off...
+      PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
+    }
+  }
 
-    old_usb_led = usb_led;
+  old_usb_led = usb_led;
 }
 
-
 void startup_user()
 {
-    _delay_ms(10); // gets rid of tick
-    PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
+  _delay_ms(10); // gets rid of tick
+  PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
 }
 
 void shutdown_user()
 {
-    PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
-    _delay_ms(2000);
-    stop_all_notes();
+  PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
+  _delay_ms(2000);
+  stop_all_notes();
 }
 
 void audio_on_user(void)
index d40b2079a63c41122a6d1252a7d903e4929d66ce..893e5272a3d6bf174e1789fc122f4ea3d19d4815 100644 (file)
 
 // Changable Row Macro
 
-#define KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, \
+#define _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, \
   k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C \
 ) \
-KEYMAP_ROW_LEFT_ ## LEFT_TYPE(k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C), KEYMAP_ROW_RIGHT_ ## RIGHT_TYPE(k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C)
+KEYMAP_ROW_LEFT_ ## _LEFT_TYPE(   k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C ), \
+KEYMAP_ROW_RIGHT_ ## _RIGHT_TYPE( k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C )
 
 // Changable Master Macro
 
-#define KEYMAP_MASTER(LEFT_TYPE, RIGHT_TYPE, \
-      k001, k002, k003, k004,       k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018,       k019, k01A, k01B, k01C, \
-      k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C, \
-      k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C, \
-      k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C, \
-      k401, k402, k403, k404,       k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418,       k419, k41A, k41B, k41C, \
-      k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C  \
+#define KEYMAP_MASTER(_MATRIX_LAYER, _LEFT_TYPE, _RIGHT_TYPE, \
+                                            k001, k002, k003, k004,       k005, k006, k007, k008, k009, k00A, k00B, k00C,       k011, k012, k013, k014, k015, k016, k017, k018,       k019, k01A, k01B, k01C, \
+                                            k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, k10B, k10C,       k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C, \
+                                            k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, k20B, k20C,       k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C, \
+                                            k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, k30B, k30C,       k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C, \
+                                            k401, k402, k403, k404,       k405, k406, k407, k408, k409, k40A, k40B, k40C,       k411, k412, k413, k414, k415, k416, k417, k418,       k419, k41A, k41B, k41C, \
+                                            k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, k50B, k50C,       k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C  \
 ) \
-{ \
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k001, k002, k003, k004, k005, k006, k007, k008, k009, k00A, k00B, k00C, k011, k012, k013, k014, k015, k016, k017, k018, k019, k01A, k01B, k01C ) },\
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k101, k102, k103, k104, k105, k106, k107, k108, k109, k10A, k10B, k10C, k111, k112, k113, k114, k115, k116, k117, k118, k119, k11A, k11B, k11C ) },\
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k201, k202, k203, k204, k205, k206, k207, k208, k209, k20A, k20B, k20C, k211, k212, k213, k214, k215, k216, k217, k218, k219, k21A, k21B, k21C ) },\
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k301, k302, k303, k304, k305, k306, k307, k308, k309, k30A, k30B, k30C, k311, k312, k313, k314, k315, k316, k317, k318, k319, k31A, k31B, k31C ) },\
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k401, k402, k403, k404, k405, k406, k407, k408, k409, k40A, k40B, k40C, k411, k412, k413, k414, k415, k416, k417, k418, k419, k41A, k41B, k41C ) },\
-    { KEYMAP_ROW(LEFT_TYPE, RIGHT_TYPE, k501, k502, k503, k504, k505, k506, k507, k508, k509, k50A, k50B, k50C, k511, k512, k513, k514, k515, k516, k517, k518, k519, k51A, k51B, k51C ) },\
+[_MATRIX_LAYER] = { \
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k001, k002, k003, k004,       k005, k006, k007, k008, k009, k00A, k00B, k00C,       k011, k012, k013, k014, k015, k016, k017, k018,       k019, k01A, k01B, k01C ) },\
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k101, k102, k103, k104,       k105, k106, k107, k108, k109, k10A, k10B, k10C,       k111, k112, k113, k114, k115, k116, k117, k118,       k119, k11A, k11B, k11C ) },\
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k201, k202, k203, k204,       k205, k206, k207, k208, k209, k20A, k20B, k20C,       k211, k212, k213, k214, k215, k216, k217, k218,       k219, k21A, k21B, k21C ) },\
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k301, k302, k303, k304,       k305, k306, k307, k308, k309, k30A, k30B, k30C,       k311, k312, k313, k314, k315, k316, k317, k318,       k319, k31A, k31B, k31C ) },\
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k401, k402, k403, k404,       k405, k406, k407, k408, k409, k40A, k40B, k40C,       k411, k412, k413, k414, k415, k416, k417, k418,       k419, k41A, k41B, k41C ) },\
+    { _KEYMAP_ROW( _LEFT_TYPE, _RIGHT_TYPE, k501, k502, k503, k504,       k505, k506, k507, k508, k509, k50A, k50B, k50C,       k511, k512, k513, k514, k515, k516, k517, k518,       k519, k51A, k51B, k51C ) },\
 }
 
 
index 0a637fd06836e19b2986e2a197f70217fea5c48f..de200d7c5b03d4d7728c4f00e0ea8c9464bf12d4 100644 (file)
@@ -1,6 +1,12 @@
 vision_division keyboard firmware
 ======================
 
+## Keyboard Info
+
+[See this thread.](https://geekhack.org/index.php?topic=83692.msg2227856#msg2227856)
+
+Vision/Division is a full size or split keyboard that can be customized due to its pcb.
+
 ## Quantum MK Firmware
 
 For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
diff --git a/keyboards/vision_division/rules.mk b/keyboards/vision_division/rules.mk
new file mode 100644 (file)
index 0000000..6990960
--- /dev/null
@@ -0,0 +1,70 @@
+
+
+# MCU name
+MCU = at90usb1286
+# MCU = at90usb1287
+# MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=1024
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= yes           # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= yes      # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
\ No newline at end of file
index eb9336fa33166f48e0f48024211cf0586c74c9fc..a0e0f449c440ac315408d83c9d435d5951773f44 100644 (file)
@@ -24,5 +24,45 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
 void led_set_kb(uint8_t usb_led) {
        // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
 
+  if (usb_led & (1 << USB_LED_CAPS_LOCK))
+  {
+    // HI
+    DDRD  |= (1<<4);
+    PORTD |= (1<<4);
+  }
+  else
+  {
+    // Hi-Z
+    DDRD  &= ~(1<<4);
+    PORTD &= ~(1<<4);
+  }
+
+  if (usb_led & (1 << USB_LED_NUM_LOCK))
+  {
+    // HI
+    DDRD  |= (1<<5);
+    PORTD |= (1<<5);
+  }
+  else
+  {
+    // Hi-Z
+    DDRD  &= ~(1<<5);
+    PORTD &= ~(1<<5);
+  }
+
+  if (usb_led & (1 << USB_LED_SCROLL_LOCK))
+  {
+    // HI
+    DDRD  |= (1<<6);
+    PORTD |= (1<<6);
+  }
+  else
+  {
+    // Hi-Z
+    DDRD  &= ~(1<<6);
+    PORTD &= ~(1<<6);
+  }
+
        led_set_user(usb_led);
 }
+
diff --git a/lib/googletest b/lib/googletest
new file mode 160000 (submodule)
index 0000000..ec44c6c
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit ec44c6c1675c25b9827aacd08c02433cccde7780
diff --git a/message.mk b/message.mk
new file mode 100644 (file)
index 0000000..fa051fd
--- /dev/null
@@ -0,0 +1,79 @@
+COLOR ?= true
+
+ifeq ($(COLOR),true)
+       NO_COLOR=\033[0m
+       OK_COLOR=\033[32;01m
+       ERROR_COLOR=\033[31;01m
+       WARN_COLOR=\033[33;01m
+       BLUE=\033[0;34m
+       BOLD=\033[1m
+endif
+
+ifneq ($(shell awk --version 2>/dev/null),)
+       AWK=awk
+else
+       AWK=cat && test
+endif
+
+ON_ERROR ?= exit 1
+
+OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
+ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
+WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
+
+TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }'
+TAB_LOG_PLAIN = printf "$$LOG\n"
+AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
+AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
+PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR)
+PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG)
+PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && $(ON_ERROR)
+PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN)
+PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS)
+BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi;
+MAKE_MSG_FORMAT = $(AWK) '{ printf "%-118s", $$0;}'
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_ERRORS = $(ERROR_COLOR)Make finished with errors\n$(NO_COLOR)
+MSG_BEGIN = -------- begin --------
+MSG_END = --------  end  --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_BIN = Creating binary load file for Flash:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling:
+MSG_COMPILING_CPP = Compiling:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+MSG_CREATING_LIBRARY = Creating library:
+MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \
+       Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\
+       git submodule sync --recursive\n\
+       git submodule update --init --recursive$(NO_COLOR)\n\n\
+       You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\
+       or if you have modified the ChibiOS libraries yourself. \n\n
+MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR)
+
+define GENERATE_MSG_MAKE_KB
+    MSG_MAKE_KB_ACTUAL := Making $$(KB_SP) with keymap $(BOLD)$$(CURRENT_KM)$(NO_COLOR)
+    ifneq ($$(MAKE_TARGET),)
+        MSG_MAKE_KB_ACTUAL += and target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
+    endif
+endef
+MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL)
+define GENERATE_MSG_MAKE_TEST
+    MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_NAME)$(NO_COLOR)
+    ifneq ($$(MAKE_TARGET),)
+        MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
+    endif
+endef
+MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL)
+MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR)
index 6216eefc9015acfc886526c2d23c262ace69d628..c15b0d32f870d8928d84b82877e12c86b0659a68 100644 (file)
@@ -1,6 +1,9 @@
 #include "eeconfig.h"
 #include "keycode.h"
 
+#ifndef KEYCODE_CONFIG_H
+#define KEYCODE_CONFIG_H
+
 uint16_t keycode_config(uint16_t keycode);
 
 /* NOTE: Not portable. Bit field order depends on implementation */
@@ -19,3 +22,5 @@ typedef union {
 } keymap_config_t;
 
 extern keymap_config_t keymap_config;
+
+#endif /* KEYCODE_CONFIG_H */
index f2d94d75c3d13da4c04ea9d563256b9de4b9319f..98ddfd0c533e4bda998e879e271fb1f41e141999 100644 (file)
@@ -111,6 +111,7 @@ enum quantum_keycodes {
     MAGIC_UNSWAP_BACKSLASH_BACKSPACE,
     MAGIC_UNHOST_NKRO,
     MAGIC_UNSWAP_ALT_GUI,
+    MAGIC_TOGGLE_NKRO,
 
     // Leader key
 #ifndef DISABLE_LEADER
diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h
new file mode 100644 (file)
index 0000000..0bc20c7
--- /dev/null
@@ -0,0 +1,255 @@
+#ifndef KEYMAP_CANADIAN_MULTILINGUAG_H
+#define KEYMAP_CANADIAN_MULTILINGUAG_H
+
+#include "keymap.h"
+
+// Alt gr
+#ifndef ALTGR
+#define ALTGR(kc)   RALT(kc)
+#endif
+#ifndef ALGR
+#define ALGR(kc)    ALTGR(kc)
+#endif
+
+#define CSA_ALTGR   KC_RALT
+#define CSA_ALGR    CSA_ALTGR
+
+#ifndef GR2A
+#define GR2A(kc)    RCTL(kc)
+#endif
+
+// Normal characters
+// First row
+#define CSA_SLASH   KC_GRV      // /
+#define CSA_SLSH    CSA_SLASH
+
+// Second row
+#define CSA_DEAD_CIRCUMFLEX     KC_LBRACKET         // dead ^
+#define CSA_DCRC                CSA_DEAD_CIRCUMFLEX
+#define CSA_C_CEDILLA           KC_RBRACKET         // Ç
+#define CSA_CCED                CSA_C_CEDILLA
+
+// Third row
+#define CSA_E_GRAVE     KC_QUOT     // è
+#define CSA_EGRV        CSA_E_GRAVE
+#define CSA_A_GRAVE     KC_BSLASH   // à
+#define CSA_AGRV        CSA_A_GRAVE
+
+// Fourth row
+#define CSA_U_GRAVE     KC_NONUS_BSLASH     // ù
+#define CSA_UGRV        CSA_U_GRAVE
+#define CSA_E_ACUTE     KC_SLSH             // é
+#define CSA_ECUT        CSA_E_ACUTE
+
+// Shifted characters
+// First row
+#define CSA_BACKSLASH   LSFT(CSA_SLASH) /* \ */
+#define CSA_BSLS        CSA_BACKSLASH
+#define CSA_QUESTION    LSFT(KC_6)      // ?
+#define CSA_QEST        CSA_QUESTION
+
+// Second row
+#define CSA_DEAD_TREMA  LSFT(CSA_DEAD_CIRCUMFLEX)    // dead trema/umlaut/diaresis for ä ë ï ö ü
+#define CSA_DTRM        CSA_DEAD_TREMA
+
+// Third row
+// all same as US-QWERTY, or capitalised character of the non-shifted key
+
+// Fourth row
+#define CSA_APOSTROPHE      LSFT(KC_COMMA)  // '
+#define CSA_APOS            CSA_APOSTROPHE
+#define CSA_DOUBLE_QUOTE    LSFT(KC_DOT)    // "
+#define CSA_DQOT            CSA_DOUBLE_QUOTE
+
+// Alt Gr-ed characters
+// First row
+#define CSA_PIPE                ALTGR(CSA_SLASH)        // |
+#define CSA_CURRENCY            ALTGR(KC_4)             // ¤
+#define CSA_CURR                CSA_CURRENCY
+#define CSA_LEFT_CURLY_BRACE    ALTGR(KC_7)             // {
+#define CSA_LCBR                CSA_LEFT_CURLY_BRACE
+#define CSA_RIGHT_CURLY_BRACE   ALTGR(KC_8)             // }
+#define CSA_RCBR                CSA_RIGHT_CURLY_BRACE
+#define CSA_LBRACKET            ALTGR(KC_9)             // [
+#define CSA_LBRC                CSA_LBRACKET
+#define CSA_RBRACKET            ALTGR(KC_0)             // ]
+#define CSA_RBRC                CSA_RBRACKET
+#define CSA_NEGATION            ALTGR(KC_EQUAL)         // ¬
+#define CSA_NEGT                CSA_NEGATION
+
+// Second row
+// euro symbol not available on Linux? (X.org)
+#define CSA_EURO        ALTGR(KC_E)                 // €
+#define CSA_DEAD_GRAVE  ALTGR(CSA_DEAD_CIRCUMFLEX)
+#define CSA_DGRV        CSA_DEAD_GRAVE              // dead `
+#define CSA_DEAD_TILDE  ALTGR(CSA_C_CEDILLA)        // ~
+#define CSA_DTLD        CSA_DEAD_TILDE
+
+// Third row
+#define CSA_DEGREE  ALTGR(KC_SCOLON)    // °
+#define CSA_DEGR    CSA_DEGREE
+
+// Fourth row
+#define CSA_LEFT_GUILLEMET      ALTGR(KC_Z)         // «
+#define CSA_LGIL                CSA_LEFT_GUILLEMET
+#define CSA_RIGHT_GUILLEMET     ALTGR(KC_X)         // »
+#define CSA_RGIL                CSA_RIGHT_GUILLEMET
+#define CSA_LESS                ALTGR(KC_COMMA)     // <
+#define CSA_GREATER             ALTGR(KC_DOT)       // >
+#define CSA_GRTR                CSA_GREATER
+
+// Space bar
+#define CSA_NON_BREAKING_SPACE  ALTGR(KC_SPACE)
+#define CSA_NBSP                CSA_NON_BREAKING_SPACE
+
+// GR2A-ed characters
+// First row
+#define CSA_SUPERSCRIPT_ONE     GR2A(KC_1)  // ¹
+#define CSA_SUP1                CSA_SUPERSCRIPT_ONE
+#define CSA_SUPERSCRIPT_TWO     GR2A(KC_2)  // ²
+#define CSA_SUP2                CSA_SUPERSCRIPT_TWO
+#define CSA_SUPERSCRIPT_THREE   GR2A(KC_3)  // ³
+#define CSA_SUP3                CSA_SUPERSCRIPT_THREE
+#define CSA_ONE_QUARTER         GR2A(KC_4)  // ¼
+#define CSA_1QRT                CSA_ONE_QUARTER
+#define CSA_ONE_HALF            GR2A(KC_5)  // ½
+#define CSA_1HLF                CSA_ONE_HALF
+#define CSA_THREE_QUARTERS      GR2A(KC_6)  // ¾
+#define CSA_3QRT                CSA_THREE_QUARTERS
+// nothing on 7-0 and -
+#define CSA_DEAD_CEDILLA        GR2A(KC_EQUAL)  // dead ¸
+#define CSA_DCED                CSA_DEAD_CEDILLA
+
+// Second row
+#define CSA_OMEGA           GR2A(KC_Q)  // ω
+#define CSA_OMEG            CSA_OMEGA
+#define CSA_L_STROKE        GR2A(KC_W)  // ł
+#define CSA_LSTK            CSA_L_STROKE
+#define CSA_OE_LIGATURE     GR2A(KC_E)  // œ
+#define CSA_OE              CSA_OE_LIGATURE
+#define CSA_PARAGRAPH       GR2A(KC_R)  // ¶
+#define CSA_PARG            CSA_PARAGRAPH
+#define CSA_T_STROKE        GR2A(KC_T)  // ŧ
+#define CSA_LEFT_ARROW      GR2A(KC_Y)  // ←
+#define CSA_LARW            CSA_LEFT_ARROW
+#define CSA_DOWN_ARROW      GR2A(KC_U)  // ↓
+#define CSA_DARW            CSA_DOWN_ARROW
+#define CSA_RIGHT_ARROW     GR2A(KC_I)  // →
+#define CSA_RARW            CSA_RIGHT_ARROW
+#define CSA_O_STROKE        GR2A(KC_O)  // ø
+#define CSA_OSTK            CSA_O_STROKE
+#define CSA_THORN           GR2A(KC_P)  // þ
+#define CSA_THRN            CSA_THORN
+// nothing on ^
+#define CSA_TILDE           GR2A(CSA_C_CEDILLA)  // dead ~
+#define CSA_TILD            CSA_TILDE
+
+// Third row
+#define CSA_AE_LIGATURE     GR2A(KC_A)      // æ
+#define CSA_AE              CSA_AE_LIGATURE
+#define CSA_SHARP_S         GR2A(KC_S)      // ß
+#define CSA_SRPS            CSA_SHARP_S
+#define CSA_ETH             GR2A(KC_D)      // ð
+// nothing on F
+#define CSA_ENG             GR2A(KC_G)      // ŋ
+#define CSA_H_SRTOKE        GR2A(KC_H)      // ħ
+#define CSA_HSTK            CSA_H_SRTOKE
+#define CSA_IJ_LIGATURE     GR2A(KC_J)      // ij
+#define CSA_IJ              CSA_IJ_LIGATURE
+#define CSA_KRA             GR2A(KC_K)      // ĸ
+#define CSA_L_FLOWN_DOT     GR2A(KC_L)      // ŀ
+#define CSA_LFLD            CSA_L_FLOWN_DOT
+#define CSA_DEAD_ACUTE      GR2A(KC_SCLN)   // dead acute accent
+#define CSA_DACT            CSA_DEAD_ACUTE
+// nothing on È & À
+
+// Fourth row
+#define CSA_CENT                GR2A(KC_C)  // ¢
+#define CSA_LEFT_DOUBLE_QUOTE   GR2A(KC_V)  // “
+#define CSA_LDQT                CSA_LEFT_DOUBLE_QUOTE
+#define CSA_RIGHT_DOUBLE_QUOTE  GR2A(KC_B)  // ”
+#define CSA_RDQT                CSA_RIGHT_DOUBLE_QUOTE
+#define CSA_N_APOSTROPHE        GR2A(KC_N)  // ʼn (deprecated unicode codepoint)
+#define CSA_NAPO                CSA_N_APOSTROPHE
+#define CSA_MU                  GR2A(KC_M)  // μ
+#define CSA_HORIZONTAL_BAR      GR2A(KC_COMMA)  // ―
+#define CSA_HZBR                CSA_HORIZONTAL_BAR
+#define CSA_DEAD_DOT_ABOVE      GR2A(KC_DOT)    // dead ˙
+#define CSA_DDTA                CSA_DEAD_DOT_ABOVE
+
+// GR2A-shifted characters (different from capitalised GR2A-ed characters)
+// First row
+#define CSA_SOFT_HYPHEN         GR2A(LSFT(CSA_SLASH))   // soft-hyphen, appears as a hyphen in wrapped word
+#define CSA_SHYP                CSA_SOFT_HYPHEN
+#define CSA_INVERTED_EXCLAIM    GR2A(KC_EXCLAIM)    // ¡
+#define CSA_IXLM                CSA_INVERTED_EXCLAIM
+// nothing on 2
+#define CSA_POUND               GR2A(LSFT(KC_3))    // £
+#define CSA_GBP                 CSA_POUND_SIGN
+// already on ALTGR(KC_E)
+#define CSA_EURO_BIS            GR2A(LSFT(KC_4))    // €
+#define CSA_EURB                CSA_EURO_BIS
+#define CSA_THREE_EIGHTHS       GR2A(LSFT(KC_5))    // ⅜
+#define CSA_3ON8                CSA_THREE_EIGHTHS
+#define CSA_FIVE_EIGHTHS        GR2A(LSFT(KC_6))    // ⅝
+#define CSA_5ON8                CSA_FIVE_EIGHTHS
+#define CSA_SEVEN_EIGHTHS       GR2A(LSFT(KC_7))    // ⅞
+#define CSA_7ON8                CSA_SEVEN_EIGHTHS
+#define CSA_TRADEMARK           GR2A(LSFT(KC_8))    // ™
+#define CSA_TM                  CSA_TRADEMARK
+#define CSA_PLUS_MINUS          GR2A(LSFT(KC_9))    // ±
+#define CSA_PSMS                CSA_PLUS_MINUS
+// nothing on 0
+#define CSA_INVERTED_QUESTION   GR2A(LSFT(KC_MINUS))    // ¿
+#define CSA_IQST                CSA_INVERTED_QUESTION
+#define CSA_DEAD_OGONEK         GR2A(LSFT(KC_EQUAL))    // dead ˛
+#define CSA_DOGO                CSA_DEAD_OGONEK
+
+// Second row
+#define CSA_REGISTERED_TRADEMARK    GR2A(LSFT(KC_R))        // ®
+#define CSA_RTM                     CSA_REGISTERED_TRADEMARK
+#define CSA_YEN                     GR2A(LSFT(KC_Y))        // ¥
+#define CSA_YUAN                    CSA_YEN
+#define CSA_UP_ARROW                LSFT(CSA_DOWN_ARROW)    // ↑
+#define CSA_DOTLESS_I               GR2A(LSFT(KC_I))        // ı
+#define CSA_DLSI                    CSA_DOTLESS_I
+#define CSA_DEAD_RING               GR2A(LSFT(CSA_DCRC))    // dead °
+#define CSA_DRNG                    CSA_DEAD_RING
+#define CSA_DEAD_MACRON             GR2A(LSFT(CSA_C_CEDILLA))   // dead ¯
+#define CSA_DMCR                    CSA_DEAD_MACRON
+
+// Third row
+#define CSA_SECTION                 GR2A(LSFT(KC_S))        // §
+#define CSA_SECT                    CSA_SECTION
+#define CSA_ORDINAL_INDICATOR_A     GR2A(LSFT(KC_F))        // ª
+#define CSA_ORDA                    CSA_ORDINAL_INDICATOR_A
+#define CSA_DEAD_DOUBLE_ACUTE       LSFT(CSA_DEAD_ACUTE)    // ˝
+#define CSA_DDCT                    CSA_DEAD_DOUBLE_ACUTE
+#define CSA_DEAD_CARON              GR2A(LSFT(CSA_E_GRAVE)) // dead ˇ
+#define CSA_DCAR                    CSA_DEAD_CARON
+#define CSA_DEAD_BREVE              GR2A(LSFT(CSA_A_GRAVE)) // dead ˘
+#define CSA_DBRV                    CSA_DEAD_BREVE
+
+// Fourth row
+#define CSA_BROKEN_PIPE         GR2A(LSFT(CSA_U_GRAVE)) // ¦
+#define CSA_BPIP                CSA_BROKEN_PIPE
+#define CSA_COPYRIGHT           GR2A(LSFT(KC_C))        // ©
+#define CSA_CPRT                CSA_COPYRIGHT
+#define CSA_LEFT_QUOTE          GR2A(LSFT(KC_V))        // ‘
+#define CSA_LQOT                CSA_LEFT_QUOTE
+#define CSA_RIGHT_QUOTE         GR2A(LSFT(KC_B))        // ’
+#define CSA_RQOT                CSA_RIGHT_QUOTE
+#define CSA_EIGHTH_NOTE         GR2A(LSFT(KC_N))        // ♪
+#define CSA_8NOT                CSA_EIGHTH_NOTE
+#define CSA_ORDINAL_INDICATOR_O GR2A(LSFT(KC_M))        // º
+#define CSA_ORDO                CSA_ORDINAL_INDICATOR_O
+#define CSA_TIMES               GR2A(LSFT(KC_COMMA))    // ×
+#define CSA_TIMS                CSA_TIMES
+#define CSA_OBELUS              GR2A(LSFT(KC_DOT))      // ÷
+#define CSA_OBEL                CSA_OBELUS
+// more conventional name of the symbol
+#define CSA_DIVISION_SIGN       CSA_OBELUS
+#define CSA_DVSN                CSA_DIVISION_SIGN
+// TODO GR2A(LSFT(CSA_E_ACUTE))
+
+#endif
index 17f20597744b120e655d8bc307e167894c493cfd..a0feed850df09dd4e01b7b701d81b2862799a1cc 100644 (file)
 #define DV_LCBR        LSFT(DV_LBRC)
 #define DV_RCBR        LSFT(DV_RBRC)
 
+#define DV_DQUO        LSFT(DV_QUOT)
+#define DV_LABK        LSFT(DV_COMM)
+#define DV_RABK        LSFT(DV_DOT)
+
 #define DV_QUES        LSFT(DV_SLSH)
 #define DV_PLUS        LSFT(DV_EQL)
 #define DV_PIPE        LSFT(DV_BSLS)
index 8784e64f36770b84e4191998ce83e1a998eec53f..577dad43acabd89f4934d1c9bfbd7941ad7b4b9d 100644 (file)
@@ -7,7 +7,9 @@ int midi_offset = 7;
 bool process_midi(uint16_t keycode, keyrecord_t *record) {
     if (keycode == MI_ON && record->event.pressed) {
       midi_activated = true;
+#ifdef AUDIO_ENABLE
       music_scale_user();
+#endif
       return false;
     }
 
@@ -63,4 +65,4 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) {
         return false;
     }
   return true;
-}
\ No newline at end of file
+}
index 07de3ecb8fa4b4f0666ed5bfd08fd664ddca2685..6ae362c4c2f32487040ae5041afeccf16aa4cf39 100644 (file)
@@ -65,11 +65,12 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
       highest_td = idx;
     action = &tap_dance_actions[idx];
 
-    action->state.keycode = keycode;
     action->state.pressed = record->event.pressed;
     if (record->event.pressed) {
+      action->state.keycode = keycode;
       action->state.count++;
       action->state.timer = timer_read();
+      process_tap_dance_action_on_each_tap (action);
 
       if (last_td && last_td != keycode) {
         qk_tap_dance_action_t *paction = &tap_dance_actions[last_td - QK_TAP_DANCE];
@@ -77,8 +78,9 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
         process_tap_dance_action_on_dance_finished (paction);
         reset_tap_dance (&paction->state);
       }
+
+      last_td = keycode;
     }
-    last_td = keycode;
 
     break;
 
index d7b857bdc64c8c5bff2f16dfc3c7d4ee8b55be1b..f753cbba665fd316dff284d8a0318a363505af79 100644 (file)
@@ -39,15 +39,17 @@ typedef struct
 
 #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \
     .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \
-    .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 })  \
+    .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }),  \
   }
 
 #define ACTION_TAP_DANCE_FN(user_fn) {  \
-    .fn = { NULL, user_fn, NULL } \
+    .fn = { NULL, user_fn, NULL }, \
+    .user_data = NULL, \
   }
 
-#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset) { \
-    .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset } \
+#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset) { \
+    .fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset }, \
+    .user_data = NULL, \
   }
 
 extern qk_tap_dance_action_t tap_dance_actions[];
index 06c1694f2e7b1753f714998a6a8ae758df610263..a5d7dca21eeb2fe145ba34c717dc0b98a341642e 100644 (file)
@@ -18,6 +18,10 @@ void set_unicode_input_mode(uint8_t os_target)
   input_mode = os_target;
 }
 
+uint8_t get_unicode_input_mode(void) {
+  return input_mode;
+}
+
 __attribute__((weak))
 void unicode_input_start (void) {
   switch(input_mode) {
index 02ce3dd7e05c4dadef3443536872419c5fc4f214..27f8072ee66256fb6c8807b543b9b41716864904 100644 (file)
@@ -13,6 +13,7 @@
 #endif
 
 void set_unicode_input_mode(uint8_t os_target);
+uint8_t get_unicode_input_mode(void);
 void unicode_input_start(void);
 void unicode_input_finish(void);
 void register_hex(uint16_t hex);
index e3a20f43e01cf6bf345caa79354054f0c1431212..a16bd5443c5fc941bc4c9371a6b960ddffd62f10 100644 (file)
@@ -199,7 +199,7 @@ bool process_record_quantum(keyrecord_t *record) {
          return false;
       break;
        #endif
-    case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI:
+    case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
       if (record->event.pressed) {
         // MAGIC actions (BOOTMAGIC without the boot)
         if (!eeconfig_is_enabled()) {
@@ -207,48 +207,73 @@ bool process_record_quantum(keyrecord_t *record) {
         }
         /* keymap config */
         keymap_config.raw = eeconfig_read_keymap();
-        if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
-            keymap_config.swap_control_capslock = 1;
-        } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
-            keymap_config.capslock_to_control = 1;
-        } else if (keycode == MAGIC_SWAP_LALT_LGUI) {
-            keymap_config.swap_lalt_lgui = 1;
-        } else if (keycode == MAGIC_SWAP_RALT_RGUI) {
-            keymap_config.swap_ralt_rgui = 1;
-        } else if (keycode == MAGIC_NO_GUI) {
-            keymap_config.no_gui = 1;
-        } else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
-            keymap_config.swap_grave_esc = 1;
-        } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
-            keymap_config.swap_backslash_backspace = 1;
-        } else if (keycode == MAGIC_HOST_NKRO) {
-            keymap_config.nkro = 1;
-        } else if (keycode == MAGIC_SWAP_ALT_GUI) {
-            keymap_config.swap_lalt_lgui = 1;
-            keymap_config.swap_ralt_rgui = 1;
-        }
-        /* UNs */
-        else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
-            keymap_config.swap_control_capslock = 0;
-        } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
-            keymap_config.capslock_to_control = 0;
-        } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
-            keymap_config.swap_lalt_lgui = 0;
-        } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
-            keymap_config.swap_ralt_rgui = 0;
-        } else if (keycode == MAGIC_UNNO_GUI) {
-            keymap_config.no_gui = 0;
-        } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
-            keymap_config.swap_grave_esc = 0;
-        } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
-            keymap_config.swap_backslash_backspace = 0;
-        } else if (keycode == MAGIC_UNHOST_NKRO) {
-            keymap_config.nkro = 0;
-        } else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
-            keymap_config.swap_lalt_lgui = 0;
-            keymap_config.swap_ralt_rgui = 0;
+        switch (keycode)
+        {
+          case MAGIC_SWAP_CONTROL_CAPSLOCK:
+            keymap_config.swap_control_capslock = true;
+            break;
+          case MAGIC_CAPSLOCK_TO_CONTROL:
+            keymap_config.capslock_to_control = true;
+            break;
+          case MAGIC_SWAP_LALT_LGUI:
+            keymap_config.swap_lalt_lgui = true;
+            break;
+          case MAGIC_SWAP_RALT_RGUI:
+            keymap_config.swap_ralt_rgui = true;
+            break;
+          case MAGIC_NO_GUI:
+            keymap_config.no_gui = true;
+            break;
+          case MAGIC_SWAP_GRAVE_ESC:
+            keymap_config.swap_grave_esc = true;
+            break;
+          case MAGIC_SWAP_BACKSLASH_BACKSPACE:
+            keymap_config.swap_backslash_backspace = true;
+            break;
+          case MAGIC_HOST_NKRO:
+            keymap_config.nkro = true;
+            break;
+          case MAGIC_SWAP_ALT_GUI:
+            keymap_config.swap_lalt_lgui = true;
+            keymap_config.swap_ralt_rgui = true;
+            break;
+          case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
+            keymap_config.swap_control_capslock = false;
+            break;
+          case MAGIC_UNCAPSLOCK_TO_CONTROL:
+            keymap_config.capslock_to_control = false;
+            break;
+          case MAGIC_UNSWAP_LALT_LGUI:
+            keymap_config.swap_lalt_lgui = false;
+            break;
+          case MAGIC_UNSWAP_RALT_RGUI:
+            keymap_config.swap_ralt_rgui = false;
+            break;
+          case MAGIC_UNNO_GUI:
+            keymap_config.no_gui = false;
+            break;
+          case MAGIC_UNSWAP_GRAVE_ESC:
+            keymap_config.swap_grave_esc = false;
+            break;
+          case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
+            keymap_config.swap_backslash_backspace = false;
+            break;
+          case MAGIC_UNHOST_NKRO:
+            keymap_config.nkro = false;
+            break;
+          case MAGIC_UNSWAP_ALT_GUI:
+            keymap_config.swap_lalt_lgui = false;
+            keymap_config.swap_ralt_rgui = false;
+            break;
+          case MAGIC_TOGGLE_NKRO:
+            keymap_config.nkro = !keymap_config.nkro;
+            break;
+          default:
+            break;
         }
         eeconfig_update_keymap(keymap_config.raw);
+        clear_keyboard(); // clear to prevent stuck keys
+
         return false;
       }
       break;
@@ -271,7 +296,7 @@ bool process_record_quantum(keyrecord_t *record) {
         unregister_mods(MOD_BIT(KC_LSFT));
       }
       return false;
-      break;
+      // break;
     }
 
     case KC_RSPC: {
@@ -293,7 +318,7 @@ bool process_record_quantum(keyrecord_t *record) {
         unregister_mods(MOD_BIT(KC_RSFT));
       }
       return false;
-      break;
+      // break;
     }
     default: {
       shift_interrupted[0] = true;
index fb4c45a8dc04a87549844e52cfa6adbec55ecc87..2c87d64c29c14b395e600ec528ccbdf1891c8d7f 100644 (file)
@@ -31,9 +31,6 @@ SOFTWARE.
 // https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
 // http://www.stuartcheshire.org/papers/COBSforToN.pdf
 
-#define MAX_FRAME_SIZE 1024
-#define NUM_LINKS 2
-
 typedef struct byte_stuffer_state {
     uint16_t next_zero;
     uint16_t data_pos;
index 2cc88beb42a1144584fe0f568684ab6cc8bca6f9..97e8968564a4e9e77f09f6ba85ae67d7f1d55387 100644 (file)
@@ -27,6 +27,9 @@ SOFTWARE.
 
 #include <stdint.h>
 
+#define MAX_FRAME_SIZE 1024
+#define NUM_LINKS 2
+
 void init_byte_stuffer(void);
 void byte_stuffer_recv_byte(uint8_t link, uint8_t data);
 void byte_stuffer_send_frame(uint8_t link, uint8_t* data, uint16_t size);
index f418d11ceb68af37034670b953f80d8dcbb33768..ff795fe20176df00e21b94d8bbe2b3f398d5f623 100644 (file)
@@ -31,6 +31,10 @@ SOFTWARE.
 static remote_object_t* remote_objects[MAX_REMOTE_OBJECTS];
 static uint32_t num_remote_objects = 0;
 
+void reinitialize_serial_link_transport(void) {
+    num_remote_objects = 0;
+}
+
 void add_remote_objects(remote_object_t** _remote_objects, uint32_t _num_remote_objects) {
     unsigned int i;
     for(i=0;i<_num_remote_objects;i++) {
index 9a052d880956c0d6fe54896d90276f2b06603407..2c5d890b219aa02bd15845922c57d82e604fa53f 100644 (file)
@@ -82,7 +82,7 @@ typedef struct { \
         remote_object_t* obj = (remote_object_t*)&remote_object_##name; \
         uint8_t* start = obj->buffer + LOCAL_OBJECT_SIZE(obj->object_size);\
         triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \
-        return triple_buffer_read_internal(obj->object_size, tb); \
+        return (type*)triple_buffer_read_internal(obj->object_size, tb); \
     }
 
 #define MASTER_TO_SINGLE_SLAVE_OBJECT(name, type) \
@@ -112,7 +112,7 @@ typedef struct { \
         remote_object_t* obj = (remote_object_t*)&remote_object_##name; \
         uint8_t* start = obj->buffer + NUM_SLAVES * LOCAL_OBJECT_SIZE(obj->object_size);\
         triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \
-        return triple_buffer_read_internal(obj->object_size, tb); \
+        return (type*)triple_buffer_read_internal(obj->object_size, tb); \
     }
 
 #define SLAVE_TO_MASTER_OBJECT(name, type) \
@@ -139,12 +139,13 @@ typedef struct { \
         uint8_t* start = obj->buffer + LOCAL_OBJECT_SIZE(obj->object_size);\
         start+=slave * REMOTE_OBJECT_SIZE(obj->object_size); \
         triple_buffer_object_t* tb = (triple_buffer_object_t*)start; \
-        return triple_buffer_read_internal(obj->object_size, tb); \
+        return (type*)triple_buffer_read_internal(obj->object_size, tb); \
     }
 
 #define REMOTE_OBJECT(name) (remote_object_t*)&remote_object_##name
 
 void add_remote_objects(remote_object_t** remote_objects, uint32_t num_remote_objects);
+void reinitialize_serial_link_transport(void);
 void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size);
 void update_transport(void);
 
diff --git a/quantum/serial_link/tests/byte_stuffer_tests.c b/quantum/serial_link/tests/byte_stuffer_tests.c
deleted file mode 100644 (file)
index 64b170e..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2016 Fred Sundvik
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <cgreen/cgreen.h>
-#include <cgreen/mocks.h>
-#include "serial_link/protocol/byte_stuffer.h"
-#include "serial_link/protocol/byte_stuffer.c"
-#include "serial_link/protocol/frame_validator.h"
-#include "serial_link/protocol/physical.h"
-
-static uint8_t sent_data[MAX_FRAME_SIZE*2];
-static uint16_t sent_data_size;
-
-Describe(ByteStuffer);
-BeforeEach(ByteStuffer) {
-    init_byte_stuffer();
-    sent_data_size = 0;
-}
-AfterEach(ByteStuffer) {}
-
-void validator_recv_frame(uint8_t link, uint8_t* data, uint16_t size) {
-    mock(data, size);
-}
-
-void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
-    memcpy(sent_data + sent_data_size, data, size);
-    sent_data_size += size;
-}
-
-Ensure(ByteStuffer, receives_no_frame_for_a_single_zero_byte) {
-    never_expect(validator_recv_frame);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_no_frame_for_a_single_FF_byte) {
-    never_expect(validator_recv_frame);
-    byte_stuffer_recv_byte(0, 0xFF);
-}
-
-Ensure(ByteStuffer, receives_no_frame_for_a_single_random_byte) {
-    never_expect(validator_recv_frame);
-    byte_stuffer_recv_byte(0, 0x4A);
-}
-
-Ensure(ByteStuffer, receives_no_frame_for_a_zero_length_frame) {
-    never_expect(validator_recv_frame);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_single_byte_valid_frame) {
-    uint8_t expected[] = {0x37};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(1)),
-        when(data, is_equal_to_contents_of(expected, 1))
-    );
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 0x37);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_three_bytes_valid_frame) {
-    uint8_t expected[] = {0x37, 0x99, 0xFF};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(3)),
-        when(data, is_equal_to_contents_of(expected, 3))
-    );
-    byte_stuffer_recv_byte(0, 4);
-    byte_stuffer_recv_byte(0, 0x37);
-    byte_stuffer_recv_byte(0, 0x99);
-    byte_stuffer_recv_byte(0, 0xFF);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_single_zero_valid_frame) {
-    uint8_t expected[] = {0};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(1)),
-        when(data, is_equal_to_contents_of(expected, 1))
-    );
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_valid_frame_with_zeroes) {
-    uint8_t expected[] = {5, 0, 3, 0};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(expected, 4))
-    );
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 5);
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 3);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_two_valid_frames) {
-    uint8_t expected1[] = {5, 0};
-    uint8_t expected2[] = {3};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(2)),
-        when(data, is_equal_to_contents_of(expected1, 2))
-    );
-    expect(validator_recv_frame,
-        when(size, is_equal_to(1)),
-        when(data, is_equal_to_contents_of(expected2, 1))
-    );
-    byte_stuffer_recv_byte(1, 2);
-    byte_stuffer_recv_byte(1, 5);
-    byte_stuffer_recv_byte(1, 1);
-    byte_stuffer_recv_byte(1, 0);
-    byte_stuffer_recv_byte(1, 2);
-    byte_stuffer_recv_byte(1, 3);
-    byte_stuffer_recv_byte(1, 0);
-}
-
-Ensure(ByteStuffer, receives_valid_frame_after_unexpected_zero) {
-    uint8_t expected[] = {5, 7};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(2)),
-        when(data, is_equal_to_contents_of(expected, 2))
-    );
-    byte_stuffer_recv_byte(1, 3);
-    byte_stuffer_recv_byte(1, 1);
-    byte_stuffer_recv_byte(1, 0);
-    byte_stuffer_recv_byte(1, 3);
-    byte_stuffer_recv_byte(1, 5);
-    byte_stuffer_recv_byte(1, 7);
-    byte_stuffer_recv_byte(1, 0);
-}
-
-Ensure(ByteStuffer, receives_valid_frame_after_unexpected_non_zero) {
-    uint8_t expected[] = {5, 7};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(2)),
-        when(data, is_equal_to_contents_of(expected, 2))
-    );
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 9);
-    byte_stuffer_recv_byte(0, 4); // This should have been zero
-    byte_stuffer_recv_byte(0, 0);
-    byte_stuffer_recv_byte(0, 3);
-    byte_stuffer_recv_byte(0, 5);
-    byte_stuffer_recv_byte(0, 7);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_and_then_end_of_frame) {
-    uint8_t expected[254];
-    int i;
-    for (i=0;i<254;i++) {
-        expected[i] = i + 1;
-    }
-    expect(validator_recv_frame,
-        when(size, is_equal_to(254)),
-        when(data, is_equal_to_contents_of(expected, 254))
-    );
-    byte_stuffer_recv_byte(0, 0xFF);
-    for (i=0;i<254;i++) {
-        byte_stuffer_recv_byte(0, i+1);
-    }
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_non_zero) {
-    uint8_t expected[255];
-    int i;
-    for (i=0;i<254;i++) {
-        expected[i] = i + 1;
-    }
-    expected[254] = 7;
-    expect(validator_recv_frame,
-        when(size, is_equal_to(255)),
-        when(data, is_equal_to_contents_of(expected, 255))
-    );
-    byte_stuffer_recv_byte(0, 0xFF);
-    for (i=0;i<254;i++) {
-        byte_stuffer_recv_byte(0, i+1);
-    }
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 7);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_zero) {
-    uint8_t expected[255];
-    int i;
-    for (i=0;i<254;i++) {
-        expected[i] = i + 1;
-    }
-    expected[254] = 0;
-    expect(validator_recv_frame,
-        when(size, is_equal_to(255)),
-        when(data, is_equal_to_contents_of(expected, 255))
-    );
-    byte_stuffer_recv_byte(0, 0xFF);
-    for (i=0;i<254;i++) {
-        byte_stuffer_recv_byte(0, i+1);
-    }
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_two_long_frames_and_some_more) {
-    uint8_t expected[515];
-    int i;
-    int j;
-    for (j=0;j<2;j++) {
-        for (i=0;i<254;i++) {
-            expected[i+254*j] = i + 1;
-        }
-    }
-    for (i=0;i<7;i++) {
-        expected[254*2+i] = i + 1;
-    }
-    expect(validator_recv_frame,
-        when(size, is_equal_to(515)),
-        when(data, is_equal_to_contents_of(expected, 510))
-    );
-    byte_stuffer_recv_byte(0, 0xFF);
-    for (i=0;i<254;i++) {
-        byte_stuffer_recv_byte(0, i+1);
-    }
-    byte_stuffer_recv_byte(0, 0xFF);
-    for (i=0;i<254;i++) {
-        byte_stuffer_recv_byte(0, i+1);
-    }
-    byte_stuffer_recv_byte(0, 8);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 3);
-    byte_stuffer_recv_byte(0, 4);
-    byte_stuffer_recv_byte(0, 5);
-    byte_stuffer_recv_byte(0, 6);
-    byte_stuffer_recv_byte(0, 7);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, receives_an_all_zeros_frame_that_is_maximum_size) {
-    uint8_t expected[MAX_FRAME_SIZE] = {};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(MAX_FRAME_SIZE)),
-        when(data, is_equal_to_contents_of(expected, MAX_FRAME_SIZE))
-    );
-    int i;
-    byte_stuffer_recv_byte(0, 1);
-    for(i=0;i<MAX_FRAME_SIZE;i++) {
-       byte_stuffer_recv_byte(0, 1);
-    }
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, doesnt_recv_a_frame_thats_too_long_all_zeroes) {
-    uint8_t expected[1] = {0};
-    never_expect(validator_recv_frame);
-    int i;
-    byte_stuffer_recv_byte(0, 1);
-    for(i=0;i<MAX_FRAME_SIZE;i++) {
-       byte_stuffer_recv_byte(0, 1);
-    }
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
-    uint8_t expected[1] = {1};
-    expect(validator_recv_frame,
-        when(size, is_equal_to(1)),
-        when(data, is_equal_to_contents_of(expected, 1))
-    );
-    int i;
-    byte_stuffer_recv_byte(0, 1);
-    for(i=0;i<MAX_FRAME_SIZE;i++) {
-       byte_stuffer_recv_byte(0, 1);
-    }
-    byte_stuffer_recv_byte(0, 2);
-    byte_stuffer_recv_byte(0, 1);
-    byte_stuffer_recv_byte(0, 0);
-}
-
-Ensure(ByteStuffer, does_nothing_when_sending_zero_size_frame) {
-    assert_that(sent_data_size, is_equal_to(0));
-    byte_stuffer_send_frame(0, NULL, 0);
-}
-
-Ensure(ByteStuffer, send_one_byte_frame) {
-    uint8_t data[] = {5};
-    byte_stuffer_send_frame(1, data, 1);
-    uint8_t expected[] = {2, 5, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_two_byte_frame) {
-    uint8_t data[] = {5, 0x77};
-    byte_stuffer_send_frame(0, data, 2);
-    uint8_t expected[] = {3, 5, 0x77, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_one_byte_frame_with_zero) {
-    uint8_t data[] = {0};
-    byte_stuffer_send_frame(0, data, 1);
-    uint8_t expected[] = {1, 1, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_two_byte_frame_starting_with_zero) {
-    uint8_t data[] = {0, 9};
-    byte_stuffer_send_frame(1, data, 2);
-    uint8_t expected[] = {1, 2, 9, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_two_byte_frame_starting_with_non_zero) {
-    uint8_t data[] = {9, 0};
-    byte_stuffer_send_frame(1, data, 2);
-    uint8_t expected[] = {2, 9, 1, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_three_byte_frame_zero_in_the_middle) {
-    uint8_t data[] = {9, 0, 0x68};
-    byte_stuffer_send_frame(0, data, 3);
-    uint8_t expected[] = {2, 9, 2, 0x68, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_three_byte_frame_data_in_the_middle) {
-    uint8_t data[] = {0, 0x55, 0};
-    byte_stuffer_send_frame(0, data, 3);
-    uint8_t expected[] = {1, 2, 0x55, 1, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_three_byte_frame_with_all_zeroes) {
-    uint8_t data[] = {0, 0, 0};
-    byte_stuffer_send_frame(0, data, 3);
-    uint8_t expected[] = {1, 1, 1, 1, 0};
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_frame_with_254_non_zeroes) {
-    uint8_t data[254];
-    int i;
-    for(i=0;i<254;i++) {
-        data[i] = i + 1;
-    }
-    byte_stuffer_send_frame(0, data, 254);
-    uint8_t expected[256];
-    expected[0] = 0xFF;
-    for(i=1;i<255;i++) {
-        expected[i] = i;
-    }
-    expected[255] = 0;
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_frame_with_255_non_zeroes) {
-    uint8_t data[255];
-    int i;
-    for(i=0;i<255;i++) {
-        data[i] = i + 1;
-    }
-    byte_stuffer_send_frame(0, data, 255);
-    uint8_t expected[258];
-    expected[0] = 0xFF;
-    for(i=1;i<255;i++) {
-        expected[i] = i;
-    }
-    expected[255] = 2;
-    expected[256] = 255;
-    expected[257] = 0;
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_frame_with_254_non_zeroes_followed_by_zero) {
-    uint8_t data[255];
-    int i;
-    for(i=0;i<254;i++) {
-        data[i] = i + 1;
-    }
-    data[255] = 0;
-    byte_stuffer_send_frame(0, data, 255);
-    uint8_t expected[258];
-    expected[0] = 0xFF;
-    for(i=1;i<255;i++) {
-        expected[i] = i;
-    }
-    expected[255] = 1;
-    expected[256] = 1;
-    expected[257] = 0;
-    assert_that(sent_data_size, is_equal_to(sizeof(expected)));
-    assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
-}
-
-Ensure(ByteStuffer, sends_and_receives_full_roundtrip_small_packet) {
-    uint8_t original_data[] = { 1, 2, 3};
-    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
-    expect(validator_recv_frame,
-        when(size, is_equal_to(sizeof(original_data))),
-        when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
-    );
-    int i;
-    for(i=0;i<sent_data_size;i++) {
-       byte_stuffer_recv_byte(1, sent_data[i]);
-    }
-}
-
-Ensure(ByteStuffer, sends_and_receives_full_roundtrip_small_packet_with_zeros) {
-    uint8_t original_data[] = { 1, 0, 3, 0, 0, 9};
-    byte_stuffer_send_frame(1, original_data, sizeof(original_data));
-    expect(validator_recv_frame,
-        when(size, is_equal_to(sizeof(original_data))),
-        when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
-    );
-    int i;
-    for(i=0;i<sent_data_size;i++) {
-       byte_stuffer_recv_byte(0, sent_data[i]);
-    }
-}
-
-Ensure(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes) {
-    uint8_t original_data[254];
-    int i;
-    for(i=0;i<254;i++) {
-        original_data[i] = i + 1;
-    }
-    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
-    expect(validator_recv_frame,
-        when(size, is_equal_to(sizeof(original_data))),
-        when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
-    );
-    for(i=0;i<sent_data_size;i++) {
-       byte_stuffer_recv_byte(1, sent_data[i]);
-    }
-}
-
-Ensure(ByteStuffer, sends_and_receives_full_roundtrip_256_bytes) {
-    uint8_t original_data[256];
-    int i;
-    for(i=0;i<254;i++) {
-        original_data[i] = i + 1;
-    }
-    original_data[254] = 22;
-    original_data[255] = 23;
-    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
-    expect(validator_recv_frame,
-        when(size, is_equal_to(sizeof(original_data))),
-        when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
-    );
-    for(i=0;i<sent_data_size;i++) {
-       byte_stuffer_recv_byte(1, sent_data[i]);
-    }
-}
-
-Ensure(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes_and_then_zero) {
-    uint8_t original_data[255];
-    int i;
-    for(i=0;i<254;i++) {
-        original_data[i] = i + 1;
-    }
-    original_data[254] = 0;
-    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
-    expect(validator_recv_frame,
-        when(size, is_equal_to(sizeof(original_data))),
-        when(data, is_equal_to_contents_of(original_data, sizeof(original_data)))
-    );
-    for(i=0;i<sent_data_size;i++) {
-       byte_stuffer_recv_byte(1, sent_data[i]);
-    }
-}
diff --git a/quantum/serial_link/tests/byte_stuffer_tests.cpp b/quantum/serial_link/tests/byte_stuffer_tests.cpp
new file mode 100644 (file)
index 0000000..ff49d72
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include <vector>
+#include <algorithm>
+extern "C" {
+#include "serial_link/protocol/byte_stuffer.h"
+#include "serial_link/protocol/frame_validator.h"
+#include "serial_link/protocol/physical.h"
+}
+
+using testing::_;
+using testing::ElementsAreArray;
+using testing::Args;
+
+class ByteStuffer : public ::testing::Test{
+public:
+    ByteStuffer() {
+        Instance = this;
+        init_byte_stuffer();
+    }
+
+    ~ByteStuffer() {
+        Instance = nullptr;
+    }
+
+    MOCK_METHOD3(validator_recv_frame, void (uint8_t link, uint8_t* data, uint16_t size));
+
+    void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
+        std::copy(data, data + size, std::back_inserter(sent_data));
+    }
+    std::vector<uint8_t> sent_data;
+
+    static ByteStuffer* Instance;
+};
+
+ByteStuffer* ByteStuffer::Instance = nullptr;
+
+extern "C" {
+    void validator_recv_frame(uint8_t link, uint8_t* data, uint16_t size) {
+        ByteStuffer::Instance->validator_recv_frame(link, data, size);
+    }
+
+    void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
+        ByteStuffer::Instance->send_data(link, data, size);
+    }
+}
+
+TEST_F(ByteStuffer, receives_no_frame_for_a_single_zero_byte) {
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .Times(0);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_no_frame_for_a_single_FF_byte) {
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .Times(0);
+    byte_stuffer_recv_byte(0, 0xFF);
+}
+
+TEST_F(ByteStuffer, receives_no_frame_for_a_single_random_byte) {
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .Times(0);
+    byte_stuffer_recv_byte(0, 0x4A);
+}
+
+TEST_F(ByteStuffer, receives_no_frame_for_a_zero_length_frame) {
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .Times(0);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_single_byte_valid_frame) {
+    uint8_t expected[] = {0x37};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 0x37);
+    byte_stuffer_recv_byte(0, 0);
+}
+TEST_F(ByteStuffer, receives_three_bytes_valid_frame) {
+    uint8_t expected[] = {0x37, 0x99, 0xFF};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 4);
+    byte_stuffer_recv_byte(0, 0x37);
+    byte_stuffer_recv_byte(0, 0x99);
+    byte_stuffer_recv_byte(0, 0xFF);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_single_zero_valid_frame) {
+    uint8_t expected[] = {0};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_valid_frame_with_zeroes) {
+    uint8_t expected[] = {5, 0, 3, 0};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 5);
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 3);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+
+TEST_F(ByteStuffer, receives_two_valid_frames) {
+    uint8_t expected1[] = {5, 0};
+    uint8_t expected2[] = {3};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected1)));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected2)));
+    byte_stuffer_recv_byte(1, 2);
+    byte_stuffer_recv_byte(1, 5);
+    byte_stuffer_recv_byte(1, 1);
+    byte_stuffer_recv_byte(1, 0);
+    byte_stuffer_recv_byte(1, 2);
+    byte_stuffer_recv_byte(1, 3);
+    byte_stuffer_recv_byte(1, 0);
+}
+
+TEST_F(ByteStuffer, receives_valid_frame_after_unexpected_zero) {
+    uint8_t expected[] = {5, 7};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(1, 3);
+    byte_stuffer_recv_byte(1, 1);
+    byte_stuffer_recv_byte(1, 0);
+    byte_stuffer_recv_byte(1, 3);
+    byte_stuffer_recv_byte(1, 5);
+    byte_stuffer_recv_byte(1, 7);
+    byte_stuffer_recv_byte(1, 0);
+}
+
+TEST_F(ByteStuffer, receives_valid_frame_after_unexpected_non_zero) {
+    uint8_t expected[] = {5, 7};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 9);
+    byte_stuffer_recv_byte(0, 4); // This should have been zero
+    byte_stuffer_recv_byte(0, 0);
+    byte_stuffer_recv_byte(0, 3);
+    byte_stuffer_recv_byte(0, 5);
+    byte_stuffer_recv_byte(0, 7);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_and_then_end_of_frame) {
+    uint8_t expected[254];
+    int i;
+    for (i=0;i<254;i++) {
+        expected[i] = i + 1;
+    }
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 0xFF);
+    for (i=0;i<254;i++) {
+        byte_stuffer_recv_byte(0, i+1);
+    }
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_non_zero) {
+    uint8_t expected[255];
+    int i;
+    for (i=0;i<254;i++) {
+        expected[i] = i + 1;
+    }
+    expected[254] = 7;
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 0xFF);
+    for (i=0;i<254;i++) {
+        byte_stuffer_recv_byte(0, i+1);
+    }
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 7);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_zero) {
+    uint8_t expected[255];
+    int i;
+    for (i=0;i<254;i++) {
+        expected[i] = i + 1;
+    }
+    expected[254] = 0;
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 0xFF);
+    for (i=0;i<254;i++) {
+        byte_stuffer_recv_byte(0, i+1);
+    }
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_two_long_frames_and_some_more) {
+    uint8_t expected[515];
+    int i;
+    int j;
+    for (j=0;j<2;j++) {
+        for (i=0;i<254;i++) {
+            expected[i+254*j] = i + 1;
+        }
+    }
+    for (i=0;i<7;i++) {
+        expected[254*2+i] = i + 1;
+    }
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    byte_stuffer_recv_byte(0, 0xFF);
+    for (i=0;i<254;i++) {
+        byte_stuffer_recv_byte(0, i+1);
+    }
+    byte_stuffer_recv_byte(0, 0xFF);
+    for (i=0;i<254;i++) {
+        byte_stuffer_recv_byte(0, i+1);
+    }
+    byte_stuffer_recv_byte(0, 8);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 3);
+    byte_stuffer_recv_byte(0, 4);
+    byte_stuffer_recv_byte(0, 5);
+    byte_stuffer_recv_byte(0, 6);
+    byte_stuffer_recv_byte(0, 7);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, receives_an_all_zeros_frame_that_is_maximum_size) {
+    uint8_t expected[MAX_FRAME_SIZE] = {};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    int i;
+    byte_stuffer_recv_byte(0, 1);
+    for(i=0;i<MAX_FRAME_SIZE;i++) {
+       byte_stuffer_recv_byte(0, 1);
+    }
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, doesnt_recv_a_frame_thats_too_long_all_zeroes) {
+    uint8_t expected[1] = {0};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .Times(0);
+    int i;
+    byte_stuffer_recv_byte(0, 1);
+    for(i=0;i<MAX_FRAME_SIZE;i++) {
+       byte_stuffer_recv_byte(0, 1);
+    }
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
+    uint8_t expected[1] = {1};
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    int i;
+    byte_stuffer_recv_byte(0, 1);
+    for(i=0;i<MAX_FRAME_SIZE;i++) {
+       byte_stuffer_recv_byte(0, 1);
+    }
+    byte_stuffer_recv_byte(0, 2);
+    byte_stuffer_recv_byte(0, 1);
+    byte_stuffer_recv_byte(0, 0);
+}
+
+TEST_F(ByteStuffer, does_nothing_when_sending_zero_size_frame) {
+    EXPECT_EQ(sent_data.size(), 0);
+    byte_stuffer_send_frame(0, NULL, 0);
+}
+
+TEST_F(ByteStuffer, send_one_byte_frame) {
+    uint8_t data[] = {5};
+    byte_stuffer_send_frame(1, data, 1);
+    uint8_t expected[] = {2, 5, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_two_byte_frame) {
+    uint8_t data[] = {5, 0x77};
+    byte_stuffer_send_frame(0, data, 2);
+    uint8_t expected[] = {3, 5, 0x77, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_one_byte_frame_with_zero) {
+    uint8_t data[] = {0};
+    byte_stuffer_send_frame(0, data, 1);
+    uint8_t expected[] = {1, 1, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_two_byte_frame_starting_with_zero) {
+    uint8_t data[] = {0, 9};
+    byte_stuffer_send_frame(1, data, 2);
+    uint8_t expected[] = {1, 2, 9, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_two_byte_frame_starting_with_non_zero) {
+    uint8_t data[] = {9, 0};
+    byte_stuffer_send_frame(1, data, 2);
+    uint8_t expected[] = {2, 9, 1, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_three_byte_frame_zero_in_the_middle) {
+    uint8_t data[] = {9, 0, 0x68};
+    byte_stuffer_send_frame(0, data, 3);
+    uint8_t expected[] = {2, 9, 2, 0x68, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_three_byte_frame_data_in_the_middle) {
+    uint8_t data[] = {0, 0x55, 0};
+    byte_stuffer_send_frame(0, data, 3);
+    uint8_t expected[] = {1, 2, 0x55, 1, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_three_byte_frame_with_all_zeroes) {
+    uint8_t data[] = {0, 0, 0};
+    byte_stuffer_send_frame(0, data, 3);
+    uint8_t expected[] = {1, 1, 1, 1, 0};
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_frame_with_254_non_zeroes) {
+    uint8_t data[254];
+    int i;
+    for(i=0;i<254;i++) {
+        data[i] = i + 1;
+    }
+    byte_stuffer_send_frame(0, data, 254);
+    uint8_t expected[256];
+    expected[0] = 0xFF;
+    for(i=1;i<255;i++) {
+        expected[i] = i;
+    }
+    expected[255] = 0;
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_frame_with_255_non_zeroes) {
+    uint8_t data[255];
+    int i;
+    for(i=0;i<255;i++) {
+        data[i] = i + 1;
+    }
+    byte_stuffer_send_frame(0, data, 255);
+    uint8_t expected[258];
+    expected[0] = 0xFF;
+    for(i=1;i<255;i++) {
+        expected[i] = i;
+    }
+    expected[255] = 2;
+    expected[256] = 255;
+    expected[257] = 0;
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_frame_with_254_non_zeroes_followed_by_zero) {
+    uint8_t data[255];
+    int i;
+    for(i=0;i<254;i++) {
+        data[i] = i + 1;
+    }
+    data[254] = 0;
+    byte_stuffer_send_frame(0, data, 255);
+    uint8_t expected[258];
+    expected[0] = 0xFF;
+    for(i=1;i<255;i++) {
+        expected[i] = i;
+    }
+    expected[255] = 1;
+    expected[256] = 1;
+    expected[257] = 0;
+    EXPECT_THAT(sent_data, ElementsAreArray(expected));
+}
+
+TEST_F(ByteStuffer, sends_and_receives_full_roundtrip_small_packet) {
+    uint8_t original_data[] = { 1, 2, 3};
+    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(original_data)));
+    int i;
+    for(auto& d : sent_data) {
+       byte_stuffer_recv_byte(1, d);
+    }
+}
+
+TEST_F(ByteStuffer, sends_and_receives_full_roundtrip_small_packet_with_zeros) {
+    uint8_t original_data[] = { 1, 0, 3, 0, 0, 9};
+    byte_stuffer_send_frame(1, original_data, sizeof(original_data));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(original_data)));
+    int i;
+    for(auto& d : sent_data) {
+       byte_stuffer_recv_byte(1, d);
+    }
+}
+
+TEST_F(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes) {
+    uint8_t original_data[254];
+    int i;
+    for(i=0;i<254;i++) {
+        original_data[i] = i + 1;
+    }
+    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(original_data)));
+    for(auto& d : sent_data) {
+       byte_stuffer_recv_byte(1, d);
+    }
+}
+
+TEST_F(ByteStuffer, sends_and_receives_full_roundtrip_256_bytes) {
+    uint8_t original_data[256];
+    int i;
+    for(i=0;i<254;i++) {
+        original_data[i] = i + 1;
+    }
+    original_data[254] = 22;
+    original_data[255] = 23;
+    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(original_data)));
+    for(auto& d : sent_data) {
+       byte_stuffer_recv_byte(1, d);
+    }
+}
+
+TEST_F(ByteStuffer, sends_and_receives_full_roundtrip_254_bytes_and_then_zero) {
+    uint8_t original_data[255];
+    int i;
+    for(i=0;i<254;i++) {
+        original_data[i] = i + 1;
+    }
+    original_data[254] = 0;
+    byte_stuffer_send_frame(0, original_data, sizeof(original_data));
+    EXPECT_CALL(*this, validator_recv_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(original_data)));
+    for(auto& d : sent_data) {
+       byte_stuffer_recv_byte(1, d);
+    }
+}
diff --git a/quantum/serial_link/tests/frame_router_tests.c b/quantum/serial_link/tests/frame_router_tests.c
deleted file mode 100644 (file)
index 6c806fa..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2016 Fred Sundvik
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <cgreen/cgreen.h>
-#include <cgreen/mocks.h>
-#include "serial_link/protocol/byte_stuffer.c"
-#include "serial_link/protocol/frame_validator.c"
-#include "serial_link/protocol/frame_router.c"
-#include "serial_link/protocol/transport.h"
-
-static uint8_t received_data[256];
-static uint16_t received_data_size;
-
-typedef struct {
-    uint8_t sent_data[256];
-    uint16_t sent_data_size;
-} receive_buffer_t;
-
-typedef struct {
-    receive_buffer_t send_buffers[2];
-} router_buffer_t;
-
-router_buffer_t router_buffers[8];
-
-router_buffer_t* current_router_buffer;
-
-
-Describe(FrameRouter);
-BeforeEach(FrameRouter) {
-    init_byte_stuffer();
-    memset(router_buffers, 0, sizeof(router_buffers));
-    current_router_buffer = 0;
-}
-AfterEach(FrameRouter) {}
-
-typedef struct {
-    uint32_t data;
-    uint8_t extra[16];
-} frame_buffer_t;
-
-
-void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
-    receive_buffer_t* buffer = &current_router_buffer->send_buffers[link];
-    memcpy(buffer->sent_data + buffer->sent_data_size, data, size);
-    buffer->sent_data_size += size;
-}
-
-static void receive_data(uint8_t link, uint8_t* data, uint16_t size) {
-    int i;
-    for(i=0;i<size;i++) {
-        byte_stuffer_recv_byte(link, data[i]);
-    }
-}
-
-static void activate_router(uint8_t num) {
-    current_router_buffer = router_buffers + num;
-    router_set_master(num==0);
-}
-
-static void simulate_transport(uint8_t from, uint8_t to) {
-   activate_router(to);
-   if (from > to) {
-       receive_data(DOWN_LINK,
-               router_buffers[from].send_buffers[UP_LINK].sent_data,
-               router_buffers[from].send_buffers[UP_LINK].sent_data_size);
-   }
-   else if(to > from) {
-       receive_data(UP_LINK,
-               router_buffers[from].send_buffers[DOWN_LINK].sent_data,
-               router_buffers[from].send_buffers[DOWN_LINK].sent_data_size);
-   }
-}
-
-void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size) {
-    mock(from, data, size);
-}
-
-
-Ensure(FrameRouter, master_broadcast_is_received_by_everyone) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(0);
-    router_send_frame(0xFF, (uint8_t*)&data, 4);
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(0)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(0, 1);
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(0)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(1, 2);
-    assert_that(router_buffers[2].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[2].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, master_send_is_received_by_targets) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(0);
-    router_send_frame((1 << 1) | (1 << 2), (uint8_t*)&data, 4);
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-
-    simulate_transport(0, 1);
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(0)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(1, 2);
-    assert_that(router_buffers[2].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[2].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(0)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(2, 3);
-    assert_that(router_buffers[3].send_buffers[DOWN_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[3].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, first_link_sends_to_master) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(1);
-    router_send_frame(0, (uint8_t*)&data, 4);
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(1)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(1, 0);
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, second_link_sends_to_master) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(2);
-    router_send_frame(0, (uint8_t*)&data, 4);
-    assert_that(router_buffers[2].send_buffers[UP_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[2].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-
-    simulate_transport(2, 1);
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-
-    expect(transport_recv_frame,
-        when(from, is_equal_to(2)),
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(&data.data, 4))
-    );
-    simulate_transport(1, 0);
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, master_sends_to_master_does_nothing) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(0);
-    router_send_frame(0, (uint8_t*)&data, 4);
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, link_sends_to_other_link_does_nothing) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(1);
-    router_send_frame(2, (uint8_t*)&data, 4);
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-}
-
-Ensure(FrameRouter, master_receives_on_uplink_does_nothing) {
-    frame_buffer_t data;
-    data.data = 0xAB7055BB;
-    activate_router(1);
-    router_send_frame(0, (uint8_t*)&data, 4);
-    assert_that(router_buffers[1].send_buffers[UP_LINK].sent_data_size, is_greater_than(0));
-    assert_that(router_buffers[1].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-
-    never_expect(transport_recv_frame);
-    activate_router(0);
-    receive_data(UP_LINK,
-        router_buffers[1].send_buffers[UP_LINK].sent_data,
-        router_buffers[1].send_buffers[UP_LINK].sent_data_size);
-    assert_that(router_buffers[0].send_buffers[UP_LINK].sent_data_size, is_equal_to(0));
-    assert_that(router_buffers[0].send_buffers[DOWN_LINK].sent_data_size, is_equal_to(0));
-}
diff --git a/quantum/serial_link/tests/frame_router_tests.cpp b/quantum/serial_link/tests/frame_router_tests.cpp
new file mode 100644 (file)
index 0000000..2bd5bf8
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+#include <array>
+extern "C" {
+    #include "serial_link/protocol/transport.h"
+    #include "serial_link/protocol/byte_stuffer.h"
+    #include "serial_link/protocol/frame_router.h"
+}
+
+using testing::_;
+using testing::ElementsAreArray;
+using testing::Args;
+
+class FrameRouter : public testing::Test {
+public:
+    FrameRouter() :
+        current_router_buffer(nullptr)
+    {
+        Instance = this;
+        init_byte_stuffer();
+    }
+
+    ~FrameRouter() {
+        Instance = nullptr;
+    }
+
+    void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
+        auto& buffer = current_router_buffer->send_buffers[link];
+        std::copy(data, data + size, std::back_inserter(buffer));
+    }
+
+    void receive_data(uint8_t link, uint8_t* data, uint16_t size) {
+        int i;
+        for(i=0;i<size;i++) {
+            byte_stuffer_recv_byte(link, data[i]);
+        }
+    }
+
+    void activate_router(uint8_t num) {
+        current_router_buffer = router_buffers + num;
+        router_set_master(num==0);
+    }
+
+    void simulate_transport(uint8_t from, uint8_t to) {
+       activate_router(to);
+       if (from > to) {
+           receive_data(DOWN_LINK,
+                   router_buffers[from].send_buffers[UP_LINK].data(),
+                   router_buffers[from].send_buffers[UP_LINK].size());
+       }
+       else if(to > from) {
+           receive_data(UP_LINK,
+                   router_buffers[from].send_buffers[DOWN_LINK].data(),
+                   router_buffers[from].send_buffers[DOWN_LINK].size());
+       }
+    }
+
+    MOCK_METHOD3(transport_recv_frame, void (uint8_t from, uint8_t* data, uint16_t size));
+
+    std::vector<uint8_t> received_data;
+
+    struct router_buffer {
+        std::vector<uint8_t> send_buffers[2];
+    };
+
+    router_buffer router_buffers[8];
+    router_buffer* current_router_buffer;
+
+    static FrameRouter* Instance;
+};
+
+FrameRouter* FrameRouter::Instance = nullptr;
+
+
+typedef struct {
+    std::array<uint8_t, 4> data;
+    uint8_t extra[16];
+} frame_buffer_t;
+
+
+extern "C" {
+    void send_data(uint8_t link, const uint8_t* data, uint16_t size) {
+        FrameRouter::Instance->send_data(link, data, size);
+    }
+
+
+    void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size) {
+        FrameRouter::Instance->transport_recv_frame(from, data, size);
+    }
+}
+
+TEST_F(FrameRouter, master_broadcast_is_received_by_everyone) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(0);
+    router_send_frame(0xFF, (uint8_t*)&data, 4);
+    EXPECT_GT(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+    EXPECT_CALL(*this, transport_recv_frame(0, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(0, 1);
+    EXPECT_GT(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(0, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(1, 2);
+    EXPECT_GT(router_buffers[2].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[2].send_buffers[UP_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, master_send_is_received_by_targets) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(0);
+    router_send_frame((1 << 1) | (1 << 2), (uint8_t*)&data, 4);
+    EXPECT_GT(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+
+    simulate_transport(0, 1);
+    EXPECT_GT(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(0, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(1, 2);
+    EXPECT_GT(router_buffers[2].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[2].send_buffers[UP_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(0, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(2, 3);
+    EXPECT_GT(router_buffers[3].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[3].send_buffers[UP_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, first_link_sends_to_master) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(1);
+    router_send_frame(0, (uint8_t*)&data, 4);
+    EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(1, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(1, 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, second_link_sends_to_master) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(2);
+    router_send_frame(0, (uint8_t*)&data, 4);
+    EXPECT_GT(router_buffers[2].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[2].send_buffers[DOWN_LINK].size(), 0);
+
+    simulate_transport(2, 1);
+    EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(2, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data.data)));
+    simulate_transport(1, 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, master_sends_to_master_does_nothing) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(0);
+    router_send_frame(0, (uint8_t*)&data, 4);
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, link_sends_to_other_link_does_nothing) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(1);
+    router_send_frame(2, (uint8_t*)&data, 4);
+    EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+}
+
+TEST_F(FrameRouter, master_receives_on_uplink_does_nothing) {
+    frame_buffer_t data;
+    data.data = {0xAB, 0x70, 0x55, 0xBB};
+    activate_router(1);
+    router_send_frame(0, (uint8_t*)&data, 4);
+    EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0);
+
+    EXPECT_CALL(*this, transport_recv_frame(_, _, _))
+        .Times(0);
+    activate_router(0);
+    receive_data(UP_LINK,
+        router_buffers[1].send_buffers[UP_LINK].data(),
+        router_buffers[1].send_buffers[UP_LINK].size());
+    EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0);
+    EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0);
+}
diff --git a/quantum/serial_link/tests/frame_validator_tests.c b/quantum/serial_link/tests/frame_validator_tests.c
deleted file mode 100644 (file)
index d20947e..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2016 Fred Sundvik
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <cgreen/cgreen.h>
-#include <cgreen/mocks.h>
-#include "serial_link/protocol/frame_validator.c"
-
-void route_incoming_frame(uint8_t link, uint8_t* data, uint16_t size) {
-    mock(data, size);
-}
-
-void byte_stuffer_send_frame(uint8_t link, uint8_t* data, uint16_t size) {
-    mock(data, size);
-}
-
-Describe(FrameValidator);
-BeforeEach(FrameValidator) {}
-AfterEach(FrameValidator) {}
-
-Ensure(FrameValidator, doesnt_validate_frames_under_5_bytes) {
-    never_expect(route_incoming_frame);
-    uint8_t data[] = {1, 2};
-    validator_recv_frame(0, 0, 1);
-    validator_recv_frame(0, data, 2);
-    validator_recv_frame(0, data, 3);
-    validator_recv_frame(0, data, 4);
-}
-
-Ensure(FrameValidator, validates_one_byte_frame_with_correct_crc) {
-    uint8_t data[] = {0x44, 0x04, 0x6A, 0xB3, 0xA3};
-    expect(route_incoming_frame,
-        when(size, is_equal_to(1)),
-        when(data, is_equal_to_contents_of(data, 1))
-    );
-    validator_recv_frame(0, data, 5);
-}
-
-Ensure(FrameValidator, does_not_validate_one_byte_frame_with_incorrect_crc) {
-    uint8_t data[] = {0x44, 0, 0, 0, 0};
-    never_expect(route_incoming_frame);
-    validator_recv_frame(1, data, 5);
-}
-
-Ensure(FrameValidator, validates_four_byte_frame_with_correct_crc) {
-    uint8_t data[] = {0x44, 0x10, 0xFF, 0x00, 0x74, 0x4E, 0x30, 0xBA};
-    expect(route_incoming_frame,
-        when(size, is_equal_to(4)),
-        when(data, is_equal_to_contents_of(data, 4))
-    );
-    validator_recv_frame(1, data, 8);
-}
-
-Ensure(FrameValidator, validates_five_byte_frame_with_correct_crc) {
-    uint8_t data[] = {1, 2, 3, 4, 5, 0xF4, 0x99, 0x0B, 0x47};
-    expect(route_incoming_frame,
-        when(size, is_equal_to(5)),
-        when(data, is_equal_to_contents_of(data, 5))
-    );
-    validator_recv_frame(0, data, 9);
-}
-
-Ensure(FrameValidator, sends_one_byte_with_correct_crc) {
-    uint8_t original[] = {0x44, 0, 0, 0, 0};
-    uint8_t expected[] = {0x44, 0x04, 0x6A, 0xB3, 0xA3};
-    expect(byte_stuffer_send_frame,
-        when(size, is_equal_to(sizeof(expected))),
-        when(data, is_equal_to_contents_of(expected, sizeof(expected)))
-    );
-    validator_send_frame(0, original, 1);
-}
-
-Ensure(FrameValidator, sends_five_bytes_with_correct_crc) {
-    uint8_t original[] = {1, 2, 3, 4, 5, 0, 0, 0, 0};
-    uint8_t expected[] = {1, 2, 3, 4, 5, 0xF4, 0x99, 0x0B, 0x47};
-    expect(byte_stuffer_send_frame,
-        when(size, is_equal_to(sizeof(expected))),
-        when(data, is_equal_to_contents_of(expected, sizeof(expected)))
-    );
-    validator_send_frame(0, original, 5);
-}
diff --git a/quantum/serial_link/tests/frame_validator_tests.cpp b/quantum/serial_link/tests/frame_validator_tests.cpp
new file mode 100644 (file)
index 0000000..9223af8
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+extern "C" {
+#include "serial_link/protocol/frame_validator.h"
+}
+
+using testing::_;
+using testing::ElementsAreArray;
+using testing::Args;
+
+class FrameValidator : public testing::Test {
+public:
+    FrameValidator() {
+        Instance = this;
+    }
+
+    ~FrameValidator() {
+        Instance = nullptr;
+    }
+
+    MOCK_METHOD3(route_incoming_frame, void (uint8_t link, uint8_t* data, uint16_t size));
+    MOCK_METHOD3(byte_stuffer_send_frame, void (uint8_t link, uint8_t* data, uint16_t size));
+
+    static FrameValidator* Instance;
+};
+
+FrameValidator* FrameValidator::Instance = nullptr;
+
+extern "C" {
+void route_incoming_frame(uint8_t link, uint8_t* data, uint16_t size) {
+    FrameValidator::Instance->route_incoming_frame(link, data, size);
+}
+
+void byte_stuffer_send_frame(uint8_t link, uint8_t* data, uint16_t size) {
+    FrameValidator::Instance->byte_stuffer_send_frame(link, data, size);
+}
+}
+
+TEST_F(FrameValidator, doesnt_validate_frames_under_5_bytes) {
+    EXPECT_CALL(*this, route_incoming_frame(_, _, _))
+        .Times(0);
+    uint8_t data[] = {1, 2};
+    validator_recv_frame(0, 0, 1);
+    validator_recv_frame(0, data, 2);
+    validator_recv_frame(0, data, 3);
+    validator_recv_frame(0, data, 4);
+}
+
+TEST_F(FrameValidator, validates_one_byte_frame_with_correct_crc) {
+    uint8_t data[] = {0x44, 0x04, 0x6A, 0xB3, 0xA3};
+    EXPECT_CALL(*this, route_incoming_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data, 1)));
+    validator_recv_frame(0, data, 5);
+}
+
+TEST_F(FrameValidator, does_not_validate_one_byte_frame_with_incorrect_crc) {
+    uint8_t data[] = {0x44, 0, 0, 0, 0};
+    EXPECT_CALL(*this, route_incoming_frame(_, _, _))
+        .Times(0);
+    validator_recv_frame(1, data, 5);
+}
+
+TEST_F(FrameValidator, validates_four_byte_frame_with_correct_crc) {
+    uint8_t data[] = {0x44, 0x10, 0xFF, 0x00, 0x74, 0x4E, 0x30, 0xBA};
+    EXPECT_CALL(*this, route_incoming_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data, 4)));
+    validator_recv_frame(1, data, 8);
+}
+
+TEST_F(FrameValidator, validates_five_byte_frame_with_correct_crc) {
+    uint8_t data[] = {1, 2, 3, 4, 5, 0xF4, 0x99, 0x0B, 0x47};
+    EXPECT_CALL(*this, route_incoming_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(data, 5)));
+    validator_recv_frame(0, data, 9);
+}
+
+TEST_F(FrameValidator, sends_one_byte_with_correct_crc) {
+    uint8_t original[] = {0x44, 0, 0, 0, 0};
+    uint8_t expected[] = {0x44, 0x04, 0x6A, 0xB3, 0xA3};
+    EXPECT_CALL(*this, byte_stuffer_send_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    validator_send_frame(0, original, 1);
+}
+
+TEST_F(FrameValidator, sends_five_bytes_with_correct_crc) {
+    uint8_t original[] = {1, 2, 3, 4, 5, 0, 0, 0, 0};
+    uint8_t expected[] = {1, 2, 3, 4, 5, 0xF4, 0x99, 0x0B, 0x47};
+    EXPECT_CALL(*this, byte_stuffer_send_frame(_, _, _))
+        .With(Args<1, 2>(ElementsAreArray(expected)));
+    validator_send_frame(0, original, 5);
+}
diff --git a/quantum/serial_link/tests/rules.mk b/quantum/serial_link/tests/rules.mk
new file mode 100644 (file)
index 0000000..b81515b
--- /dev/null
@@ -0,0 +1,22 @@
+serial_link_byte_stuffer_SRC :=\
+       $(SERIAL_PATH)/tests/byte_stuffer_tests.cpp \
+       $(SERIAL_PATH)/protocol/byte_stuffer.c
+
+serial_link_frame_validator_SRC := \
+       $(SERIAL_PATH)/tests/frame_validator_tests.cpp \
+       $(SERIAL_PATH)/protocol/frame_validator.c 
+
+serial_link_frame_router_SRC := \
+       $(SERIAL_PATH)/tests/frame_router_tests.cpp \
+       $(SERIAL_PATH)/protocol/byte_stuffer.c \
+       $(SERIAL_PATH)/protocol/frame_validator.c \
+       $(SERIAL_PATH)/protocol/frame_router.c
+
+serial_link_triple_buffered_object_SRC := \
+       $(SERIAL_PATH)/tests/triple_buffered_object_tests.cpp \
+       $(SERIAL_PATH)/protocol/triple_buffered_object.c 
+
+serial_link_transport_SRC := \
+       $(SERIAL_PATH)/tests/transport_tests.cpp \
+       $(SERIAL_PATH)/protocol/transport.c \
+       $(SERIAL_PATH)/protocol/triple_buffered_object.c 
diff --git a/quantum/serial_link/tests/testlist.mk b/quantum/serial_link/tests/testlist.mk
new file mode 100644 (file)
index 0000000..a80e888
--- /dev/null
@@ -0,0 +1,6 @@
+TEST_LIST +=\
+       serial_link_byte_stuffer\
+       serial_link_frame_validator\
+       serial_link_frame_router\
+       serial_link_triple_buffered_object\
+       serial_link_transport
\ No newline at end of file
diff --git a/quantum/serial_link/tests/transport_tests.c b/quantum/serial_link/tests/transport_tests.c
deleted file mode 100644 (file)
index 358e1b9..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2016 Fred Sundvik
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <cgreen/cgreen.h>
-#include <cgreen/mocks.h>
-#include "serial_link/protocol/transport.c"
-#include "serial_link/protocol/triple_buffered_object.c"
-
-void signal_data_written(void) {
-    mock();
-}
-
-static uint8_t sent_data[2048];
-static uint16_t sent_data_size;
-
-void router_send_frame(uint8_t destination, uint8_t* data, uint16_t size) {
-    mock(destination);
-    memcpy(sent_data + sent_data_size, data, size);
-    sent_data_size += size;
-}
-
-typedef struct {
-    uint32_t test;
-} test_object1_t;
-
-typedef struct {
-    uint32_t test1;
-    uint32_t test2;
-} test_object2_t;
-
-MASTER_TO_ALL_SLAVES_OBJECT(master_to_slave, test_object1_t);
-MASTER_TO_SINGLE_SLAVE_OBJECT(master_to_single_slave, test_object1_t);
-SLAVE_TO_MASTER_OBJECT(slave_to_master, test_object1_t);
-
-static remote_object_t* test_remote_objects[] = {
-    REMOTE_OBJECT(master_to_slave),
-    REMOTE_OBJECT(master_to_single_slave),
-    REMOTE_OBJECT(slave_to_master),
-};
-
-Describe(Transport);
-BeforeEach(Transport) {
-    add_remote_objects(test_remote_objects, sizeof(test_remote_objects) / sizeof(remote_object_t*));
-    sent_data_size = 0;
-}
-AfterEach(Transport) {}
-
-Ensure(Transport, write_to_local_signals_an_event) {
-    begin_write_master_to_slave();
-    expect(signal_data_written);
-    end_write_master_to_slave();
-    begin_write_slave_to_master();
-    expect(signal_data_written);
-    end_write_slave_to_master();
-    begin_write_master_to_single_slave(1);
-    expect(signal_data_written);
-    end_write_master_to_single_slave(1);
-}
-
-Ensure(Transport, writes_from_master_to_all_slaves) {
-    update_transport();
-    test_object1_t* obj = begin_write_master_to_slave();
-    obj->test = 5;
-    expect(signal_data_written);
-    end_write_master_to_slave();
-    expect(router_send_frame,
-            when(destination, is_equal_to(0xFF)));
-    update_transport();
-    transport_recv_frame(0, sent_data, sent_data_size);
-    test_object1_t* obj2 = read_master_to_slave();
-    assert_that(obj2, is_not_equal_to(NULL));
-    assert_that(obj2->test, is_equal_to(5));
-}
-
-Ensure(Transport, writes_from_slave_to_master) {
-    update_transport();
-    test_object1_t* obj = begin_write_slave_to_master();
-    obj->test = 7;
-    expect(signal_data_written);
-    end_write_slave_to_master();
-    expect(router_send_frame,
-            when(destination, is_equal_to(0)));
-    update_transport();
-    transport_recv_frame(3, sent_data, sent_data_size);
-    test_object1_t* obj2 = read_slave_to_master(2);
-    assert_that(read_slave_to_master(0), is_equal_to(NULL));
-    assert_that(obj2, is_not_equal_to(NULL));
-    assert_that(obj2->test, is_equal_to(7));
-}
-
-Ensure(Transport, writes_from_master_to_single_slave) {
-    update_transport();
-    test_object1_t* obj = begin_write_master_to_single_slave(3);
-    obj->test = 7;
-    expect(signal_data_written);
-    end_write_master_to_single_slave(3);
-    expect(router_send_frame,
-            when(destination, is_equal_to(4)));
-    update_transport();
-    transport_recv_frame(0, sent_data, sent_data_size);
-    test_object1_t* obj2 = read_master_to_single_slave();
-    assert_that(obj2, is_not_equal_to(NULL));
-    assert_that(obj2->test, is_equal_to(7));
-}
-
-Ensure(Transport, ignores_object_with_invalid_id) {
-    update_transport();
-    test_object1_t* obj = begin_write_master_to_single_slave(3);
-    obj->test = 7;
-    expect(signal_data_written);
-    end_write_master_to_single_slave(3);
-    expect(router_send_frame,
-            when(destination, is_equal_to(4)));
-    update_transport();
-    sent_data[sent_data_size - 1] = 44;
-    transport_recv_frame(0, sent_data, sent_data_size);
-    test_object1_t* obj2 = read_master_to_single_slave();
-    assert_that(obj2, is_equal_to(NULL));
-}
-
-Ensure(Transport, ignores_object_with_size_too_small) {
-    update_transport();
-    test_object1_t* obj = begin_write_master_to_slave();
-    obj->test = 7;
-    expect(signal_data_written);
-    end_write_master_to_slave();
-    expect(router_send_frame);
-    update_transport();
-    sent_data[sent_data_size - 2] = 0;
-    transport_recv_frame(0, sent_data, sent_data_size - 1);
-    test_object1_t* obj2 = read_master_to_slave();
-    assert_that(obj2, is_equal_to(NULL));
-}
-
-Ensure(Transport, ignores_object_with_size_too_big) {
-    update_transport();
-    test_object1_t* obj = begin_write_master_to_slave();
-    obj->test = 7;
-    expect(signal_data_written);
-    end_write_master_to_slave();
-    expect(router_send_frame);
-    update_transport();
-    sent_data[sent_data_size + 21] = 0;
-    transport_recv_frame(0, sent_data, sent_data_size + 22);
-    test_object1_t* obj2 = read_master_to_slave();
-    assert_that(obj2, is_equal_to(NULL));
-}
diff --git a/quantum/serial_link/tests/transport_tests.cpp b/quantum/serial_link/tests/transport_tests.cpp
new file mode 100644 (file)
index 0000000..21b7b16
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+
+using testing::_;
+using testing::ElementsAreArray;
+using testing::Args;
+
+extern "C" {
+#include "serial_link/protocol/transport.h"
+}
+
+struct test_object1 {
+    uint32_t test;
+};
+
+struct test_object2 {
+    uint32_t test1;
+    uint32_t test2;
+};
+
+MASTER_TO_ALL_SLAVES_OBJECT(master_to_slave, test_object1);
+MASTER_TO_SINGLE_SLAVE_OBJECT(master_to_single_slave, test_object1);
+SLAVE_TO_MASTER_OBJECT(slave_to_master, test_object1);
+
+static remote_object_t* test_remote_objects[] = {
+    REMOTE_OBJECT(master_to_slave),
+    REMOTE_OBJECT(master_to_single_slave),
+    REMOTE_OBJECT(slave_to_master),
+};
+
+class Transport : public testing::Test {
+public:
+    Transport() {
+        Instance = this;
+        add_remote_objects(test_remote_objects, sizeof(test_remote_objects) / sizeof(remote_object_t*));
+    }
+
+    ~Transport() {
+        Instance = nullptr;
+        reinitialize_serial_link_transport();
+    }
+
+    MOCK_METHOD0(signal_data_written, void ());
+    MOCK_METHOD1(router_send_frame, void (uint8_t destination));
+
+    void router_send_frame(uint8_t destination, uint8_t* data, uint16_t size) {
+        router_send_frame(destination);
+        std::copy(data, data + size, std::back_inserter(sent_data));
+    }
+
+    static Transport* Instance;
+
+    std::vector<uint8_t> sent_data;
+};
+
+Transport* Transport::Instance = nullptr;
+
+extern "C" {
+void signal_data_written(void) {
+    Transport::Instance->signal_data_written();
+}
+
+void router_send_frame(uint8_t destination, uint8_t* data, uint16_t size) {
+    Transport::Instance->router_send_frame(destination, data, size);
+}
+}
+
+TEST_F(Transport, write_to_local_signals_an_event) {
+    begin_write_master_to_slave();
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_slave();
+    begin_write_slave_to_master();
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_slave_to_master();
+    begin_write_master_to_single_slave(1);
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_single_slave(1);
+}
+
+TEST_F(Transport, writes_from_master_to_all_slaves) {
+    update_transport();
+    test_object1* obj = begin_write_master_to_slave();
+    obj->test = 5;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_slave();
+    EXPECT_CALL(*this, router_send_frame(0xFF));
+    update_transport();
+    transport_recv_frame(0, sent_data.data(), sent_data.size());
+    test_object1* obj2 = read_master_to_slave();
+    EXPECT_NE(obj2, nullptr);
+    EXPECT_EQ(obj2->test, 5);
+}
+
+TEST_F(Transport, writes_from_slave_to_master) {
+    update_transport();
+    test_object1* obj = begin_write_slave_to_master();
+    obj->test = 7;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_slave_to_master();
+    EXPECT_CALL(*this, router_send_frame(0));
+    update_transport();
+    transport_recv_frame(3, sent_data.data(), sent_data.size());
+    test_object1* obj2 = read_slave_to_master(2);
+    EXPECT_EQ(read_slave_to_master(0), nullptr);
+    EXPECT_NE(obj2, nullptr);
+    EXPECT_EQ(obj2->test, 7);
+}
+
+TEST_F(Transport, writes_from_master_to_single_slave) {
+    update_transport();
+    test_object1* obj = begin_write_master_to_single_slave(3);
+    obj->test = 7;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_single_slave(3);
+    EXPECT_CALL(*this, router_send_frame(4));
+    update_transport();
+    transport_recv_frame(0, sent_data.data(), sent_data.size());
+    test_object1* obj2 = read_master_to_single_slave();
+    EXPECT_NE(obj2, nullptr);
+    EXPECT_EQ(obj2->test, 7);
+}
+
+TEST_F(Transport, ignores_object_with_invalid_id) {
+    update_transport();
+    test_object1* obj = begin_write_master_to_single_slave(3);
+    obj->test = 7;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_single_slave(3);
+    EXPECT_CALL(*this, router_send_frame(4));
+    update_transport();
+    sent_data[sent_data.size() - 1] = 44;
+    transport_recv_frame(0, sent_data.data(), sent_data.size());
+    test_object1* obj2 = read_master_to_single_slave();
+    EXPECT_EQ(obj2, nullptr);
+}
+
+TEST_F(Transport, ignores_object_with_size_too_small) {
+    update_transport();
+    test_object1* obj = begin_write_master_to_slave();
+    obj->test = 7;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_slave();
+    EXPECT_CALL(*this, router_send_frame(_));
+    update_transport();
+    sent_data[sent_data.size() - 2] = 0;
+    transport_recv_frame(0, sent_data.data(), sent_data.size() - 1);
+    test_object1* obj2 = read_master_to_slave();
+    EXPECT_EQ(obj2, nullptr);
+}
+
+TEST_F(Transport, ignores_object_with_size_too_big) {
+    update_transport();
+    test_object1* obj = begin_write_master_to_slave();
+    obj->test = 7;
+    EXPECT_CALL(*this, signal_data_written());
+    end_write_master_to_slave();
+    EXPECT_CALL(*this, router_send_frame(_));
+    update_transport();
+    sent_data.resize(sent_data.size() + 22);
+    sent_data[sent_data.size() - 1] = 0;
+    transport_recv_frame(0, sent_data.data(), sent_data.size());
+    test_object1* obj2 = read_master_to_slave();
+    EXPECT_EQ(obj2, nullptr);
+}
diff --git a/quantum/serial_link/tests/triple_buffered_object_tests.c b/quantum/serial_link/tests/triple_buffered_object_tests.c
deleted file mode 100644 (file)
index 6f7c82b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-The MIT License (MIT)
-
-Copyright (c) 2016 Fred Sundvik
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-*/
-
-#include <cgreen/cgreen.h>
-#include "serial_link/protocol/triple_buffered_object.c"
-
-typedef struct {
-    uint8_t state;
-    uint32_t buffer[3];
-}test_object_t;
-
-test_object_t test_object;
-
-Describe(TripleBufferedObject);
-BeforeEach(TripleBufferedObject) {
-    triple_buffer_init((triple_buffer_object_t*)&test_object);
-}
-AfterEach(TripleBufferedObject) {}
-
-
-Ensure(TripleBufferedObject, writes_and_reads_object) {
-    *triple_buffer_begin_write(&test_object) = 0x3456ABCC;
-    triple_buffer_end_write(&test_object);
-    assert_that(*triple_buffer_read(&test_object), is_equal_to(0x3456ABCC));
-}
-
-Ensure(TripleBufferedObject, does_not_read_empty) {
-    assert_that(triple_buffer_read(&test_object), is_equal_to(NULL));
-}
-
-Ensure(TripleBufferedObject, writes_twice_and_reads_object) {
-    *triple_buffer_begin_write(&test_object) = 0x3456ABCC;
-    triple_buffer_end_write(&test_object);
-    *triple_buffer_begin_write(&test_object) = 0x44778899;
-    triple_buffer_end_write(&test_object);
-    assert_that(*triple_buffer_read(&test_object), is_equal_to(0x44778899));
-}
-
-Ensure(TripleBufferedObject, performs_another_write_in_the_middle_of_read) {
-    *triple_buffer_begin_write(&test_object) = 1;
-    triple_buffer_end_write(&test_object);
-    uint32_t* read = triple_buffer_read(&test_object);
-    *triple_buffer_begin_write(&test_object) = 2;
-    triple_buffer_end_write(&test_object);
-    assert_that(*read, is_equal_to(1));
-    assert_that(*triple_buffer_read(&test_object), is_equal_to(2));
-    assert_that(triple_buffer_read(&test_object), is_equal_to(NULL));
-}
-
-Ensure(TripleBufferedObject, performs_two_writes_in_the_middle_of_read) {
-    *triple_buffer_begin_write(&test_object) = 1;
-    triple_buffer_end_write(&test_object);
-    uint32_t* read = triple_buffer_read(&test_object);
-    *triple_buffer_begin_write(&test_object) = 2;
-    triple_buffer_end_write(&test_object);
-    *triple_buffer_begin_write(&test_object) = 3;
-    triple_buffer_end_write(&test_object);
-    assert_that(*read, is_equal_to(1));
-    assert_that(*triple_buffer_read(&test_object), is_equal_to(3));
-    assert_that(triple_buffer_read(&test_object), is_equal_to(NULL));
-}
diff --git a/quantum/serial_link/tests/triple_buffered_object_tests.cpp b/quantum/serial_link/tests/triple_buffered_object_tests.cpp
new file mode 100644 (file)
index 0000000..7724bbe
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include "gtest/gtest.h"
+extern "C" {
+#include "serial_link/protocol/triple_buffered_object.h"
+}
+
+struct test_object{
+    uint8_t state;
+    uint32_t buffer[3];
+};
+
+test_object test_object;
+
+class TripleBufferedObject : public testing::Test {
+public:
+    TripleBufferedObject() {
+        triple_buffer_init((triple_buffer_object_t*)&test_object);
+    }
+};
+
+TEST_F(TripleBufferedObject, writes_and_reads_object) {
+    *triple_buffer_begin_write(&test_object) = 0x3456ABCC;
+    triple_buffer_end_write(&test_object);
+    EXPECT_EQ(*triple_buffer_read(&test_object), 0x3456ABCC);
+}
+
+TEST_F(TripleBufferedObject, does_not_read_empty) {
+    EXPECT_EQ(triple_buffer_read(&test_object), nullptr);
+}
+
+TEST_F(TripleBufferedObject, writes_twice_and_reads_object) {
+    *triple_buffer_begin_write(&test_object) = 0x3456ABCC;
+    triple_buffer_end_write(&test_object);
+    *triple_buffer_begin_write(&test_object) = 0x44778899;
+    triple_buffer_end_write(&test_object);
+    EXPECT_EQ(*triple_buffer_read(&test_object), 0x44778899);
+}
+
+TEST_F(TripleBufferedObject, performs_another_write_in_the_middle_of_read) {
+    *triple_buffer_begin_write(&test_object) = 1;
+    triple_buffer_end_write(&test_object);
+    uint32_t* read = triple_buffer_read(&test_object);
+    *triple_buffer_begin_write(&test_object) = 2;
+    triple_buffer_end_write(&test_object);
+    EXPECT_EQ(*read, 1);
+    EXPECT_EQ(*triple_buffer_read(&test_object), 2);
+    EXPECT_EQ(triple_buffer_read(&test_object), nullptr);
+}
+
+TEST_F(TripleBufferedObject, performs_two_writes_in_the_middle_of_read) {
+    *triple_buffer_begin_write(&test_object) = 1;
+    triple_buffer_end_write(&test_object);
+    uint32_t* read = triple_buffer_read(&test_object);
+    *triple_buffer_begin_write(&test_object) = 2;
+    triple_buffer_end_write(&test_object);
+    *triple_buffer_begin_write(&test_object) = 3;
+    triple_buffer_end_write(&test_object);
+    EXPECT_EQ(*read, 1);
+    EXPECT_EQ(*triple_buffer_read(&test_object), 3);
+    EXPECT_EQ(triple_buffer_read(&test_object), nullptr);
+}
index 3f6d133c9b39a73c68f72aa9783d43a7e17a8388..4e2a6f00fd8ea2e3d2f25fa611a2cba9d6d98783 100644 (file)
@@ -1,75 +1,3 @@
-
-
-# MCU name
-#MCU = at90usb1287
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section Size in *bytes*
-#   Teensy halfKay   512
-#   Teensy++ halfKay 1024
-#   Atmel DFU loader 4096
-#   LUFA bootloader  4096
-#   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=512
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
-EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
-CONSOLE_ENABLE ?= yes        # Console for debug(+400)
-COMMAND_ENABLE ?= yes        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE ?= no            # USB Nkey Rollover
-BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE ?= no            # MIDI controls
-UNICODE_ENABLE ?= no         # Unicode
-BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE ?= no           # Audio output on port C6
-
-ifndef QUANTUM_DIR
+ifndef MAKEFILE_INCLUDED
        include ../../Makefile
-endif
-
-
+endif
\ No newline at end of file
index b2fb4dd98d2891932f2b15cdda88fc0b99bb78aa..b16f4cd76836b0da7be976173eebee329bb4fe35 100644 (file)
@@ -3,7 +3,7 @@
 
 ## Quantum MK Firmware
 
-For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
+For the full Quantum feature list, see [the parent readme](/).
 
 ## Building
 
@@ -13,16 +13,16 @@ Depending on which keymap you would like to use, you will have to compile slight
 
 ### Default
 
-To build with the default keymap, simply run `make`.
+To build with the default keymap, simply run `make default`.
 
 ### Other Keymaps
 
 Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
 
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
+To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
 
 ```
-$ make keymap=[default|jack|<name>]
+$ make [default|jack|<name>]
 ```
 
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
\ No newline at end of file
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/quantum/template/rules.mk b/quantum/template/rules.mk
new file mode 100644 (file)
index 0000000..5589814
--- /dev/null
@@ -0,0 +1,67 @@
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+#     This will define a symbol, F_CPU, in all source code files equal to the
+#     processor frequency in Hz. You can then use this symbol in your source code to
+#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+#     automatically to create a 32-bit value in your source code.
+#
+#     This will be an integer division of F_USB below, as it is sourced by
+#     F_USB after it has run through any CPU prescalers. Note that this value
+#     does not *change* the processor frequency - it should merely be updated to
+#     reflect the processor speed set externally so that the code can use accurate
+#     software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+#     This will define a symbol, F_USB, in all source code files equal to the
+#     input clock frequency (before any prescaling is performed) in Hz. This value may
+#     differ from F_CPU if prescaling is used on the latter, and is required as the
+#     raw input clock is fed directly to the PLL sections of the AVR for high speed
+#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+#     at the end, this will be done automatically to create a 32-bit value in your
+#     source code.
+#
+#     If no clock division is performed on the input clock inside the AVR (via the
+#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+#   Teensy halfKay   512
+#   Teensy++ halfKay 1024
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+#   USBaspLoader     2048
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE ?= no      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE ?= yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE ?= yes       # Audio control and System control(+450)
+CONSOLE_ENABLE ?= yes        # Console for debug(+400)
+COMMAND_ENABLE ?= yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE ?= no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE ?= no            # USB Nkey Rollover
+BACKLIGHT_ENABLE ?= no       # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE ?= no            # MIDI controls
+UNICODE_ENABLE ?= no         # Unicode
+BLUETOOTH_ENABLE ?= no       # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE ?= no           # Audio output on port C6
index b1808b6d13a9f851ff35617c0c0f5c2b2d5153fe..a7320202b24314727807b8ef3ebbd19308c2e354 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -54,11 +54,11 @@ Here are the steps
 1. Install the Windows 10 subsystem for Linux, following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/).
 2. If you have previously cloned the repository using the normal Git bash, you will need to clean up the line endings. If you have cloned it after 20th of August 2016, you are likely fine. To clean up the line endings do the following
    1. Make sure that you have no changes you haven't committed by running `git status`, if you do commit them first
-   2. From within the Git bash run ´git rm --cached -r .`
+   2. From within the Git bash run `git rm --cached -r .`
    3. Followed by `git reset --hard`
 3. Start the "Bash On Ubuntu On Windows" from the start menu
-4. With the bash open, navigate to your git checkout. The harddisk can be accessed from `/mnt` for example `/mnt/c` for the `c:\` drive.
-5. Run `sudo util/install_dependencies.sh`. 
+4. With the bash open, navigate to your Git checkout. The harddisk can be accessed from `/mnt` for example `/mnt/c` for the `c:\` drive.
+5. Run `sudo util/install_dependencies.sh`.
 6. After a while the installation will finish, and you are good to go
 
 **Note** From time to time, the dependencies might change, so just run `install_dependencies.sh` again if things are not working.
@@ -69,11 +69,14 @@ Here are the steps
 ### Windows (Vista and later)
 1. If you have ever installed WinAVR, uninstall it.
 2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**.
-3. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
-4. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
-5. Double-click on the 1-setup-path-win batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
-6. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
-7. Future build commands should be run from the MHV AVR Shell, which sets up an environment compatible with colorful build output. The standard Command Prompt will also work, but add `COLOR=false` to the end of all make commands when using it.
+3. If you are going to flash Infinity based keyboards you will need to install dfu-util, refer to the instructions by [Input Club](https://github.com/kiibohd/controller/wiki/Loading-DFU-Firmware).
+4. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
+5. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
+6. Open the `\util` folder.
+7. Double-click on the `1-setup-path-win` batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
+8. Right-click on the `2-setup-environment-win` batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
+
+If you have trouble and want to ask for help, it is useful to generate a *Win_Check_Output.txt* file by running `Win_Check.bat` in the `\util` folder.
 
 ### Mac
 If you're using [homebrew,](http://brew.sh/) you can use the following commands:
@@ -90,9 +93,13 @@ You can also try these instructions:
 2. Install the Command Line Tools from `Xcode->Preferences->Downloads`.
 3. Install [DFU-Programmer][dfu-prog].
 
+If you are going to flash Infinity based keyboards you will also need dfu-util
+
+    brew install dfu-util
+
 ### Linux
 
-To ensure you are always up to date, you can just run `sudo utils/install_dependencies.sh`. That should always install all the dependencies needed. 
+To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed.
 
 You can also install things manually, but this documentation might not be always up to date with all requirements.
 
@@ -153,47 +160,107 @@ In every keymap folder, the following files are recommended:
 * `config.h` - the options to configure your keymap
 * `keymap.c` - all of your keymap code, required
 * `Makefile` - the features of QMK that are enabled, required to run `make` in your keymap folder
-* `readme.md` - a description of your keymap, how others might use it, and explanations of features 
+* `readme.md` - a description of your keymap, how others might use it, and explanations of features
 
 ## The `make` command
 
-The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys). You can run `make` from the root (`/`), your keyboard folder (`/keyboards/<keyboard>/`), or your keymap folder (`/keyboards/<keyboard>/keymaps/<keymap>/`) if you have a `Makefile` there (see the example [here](/doc/keymap_makefile_example.mk)).
+The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys).
+
+**NOTE:** To abort a make command press `Ctrl-c`
+
+The following instruction refers to these folders.
+
+* The `root` (`/`) folder is the qmk_firmware folder, in which are `doc`, `keyboard`, `quantum`, etc.
+* The `keyboard` folder is any keyboard project's folder, like `/keyboards/planck`.
+* The `keymap` folder is any keymap's folder, like `/keyboards/planck/keymaps/default`.
+* The `subproject` folder is the subproject folder of a keyboard, like `/keyboards/ergodox/ez`
+
+### Simple instructions for building and uploading a keyboard
+
+**Most keyboards have more specific instructions in the keyboard specific readme.md file, so please check that first**
+
+If the `keymap` folder contains a file name `Makefile`
+
+1. Change the directory to the `keymap` folder
+2. Run `make <subproject>-<programmer>`
+
+Otherwise, if there's no `Makefile` in the `keymap` folder
+
+1. Enter the `keyboard` folder
+2. Run `make <subproject>-<keymap>-<programmer>`
+
+In the above commands, replace:
+
+* `<keymap>` with the name of your keymap
+* `<subproject>` with the name of the subproject (revision or sub-model of your keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`.
+  * If the keyboard doesn't have a subproject, or if you are happy with the default (defined in `rules.mk` file of the `keyboard` folder), you can leave it out. But remember to also remove the dash (`-`) from the command.
+* `<programmer>` The programmer to use. Most keyboards use `dfu`, but some use `teensy`. Infinity keyboards use `dfu-util`. Check the readme file in the keyboard folder to find out which programmer to use.
+  * If you  don't add `-<programmer` to the command line, the firmware will be still be compiled into a hex file, but the upload will be skipped.
+
+**NOTE:** Some operating systems will refuse to program unless you run the make command as root for example `sudo make dfu`
+
+### More detailed make instruction
+
+The full syntax of the `make` command is the following, but parts of the command can be left out if you run it from other directories than the `root` (as you might already have noticed by reading the simple instructions).
+
+`<keyboard>-<subproject>-<keymap>-<target>`, where:
 
-By default, this will generate a `<keyboard>_<keymap>.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests.
+* `<keyboard>` is the name of the keyboard, for example `planck`
+  * Use `allkb` to compile all keyboards
+* `<subproject>` is the name of the subproject (revision or sub-model of the keyboard). For example, for Ergodox it can be `ez` or `infinity`, and for Planck `rev3` or `rev4`.
+  * If the keyboard doesn't have any subprojects, it can be left out
+  * To compile the default subproject, you can leave it out, or specify `defaultsp`
+  * Use `allsp` to compile all subprojects
+* `<keymap>` is the name of the keymap, for example `algernon`
+  * Use `allkm` to compile all keymaps
+* `<target>` will be explained in more detail below.
 
-Below are some definitions that will be useful:
+**Note:** When you leave some parts of the command out, you should also remove the dash (`-`).
 
-* The "root" (`/`) folder is the qmk_firmware folder, in which are `doc`, `keyboard`, `quantum`, etc.
-* The "keyboard" folder is any keyboard project's folder, like `/keyboards/planck`.
-* The "keymap" folder is any keymap's folder, like `/keyboards/planck/keymaps/default`.
+As mentioned above, there are some shortcuts, when you are in a:
 
-Below is a list of the useful `make` commands in QMK:
+* `keyboard` folder, the command will automatically fill the `<keyboard>` part. So you only need to type `<subproject>-<keymap>-<target>`
+* `subproject` folder, it will fill in both `<keyboard>` and `<subproject>`
+* `keymap` folder, then `<keyboard>` and `<keymap>` will be filled in. If you need to specify the `<subproject>` use the following syntax `<subproject>-<target>`
+  * Note in order to support this shortcut, the keymap needs its own Makefile (see the example [here](/doc/keymap_makefile_example.mk))
+* `keymap` folder of a `subproject`, then everything except the `<target>` will be filled in
 
-* `make` - builds your keyboard and keymap depending on which folder you're in. This defaults to the "default" layout (unless in a keymap folder), and Planck keyboard in the root folder
-  * `make keyboard=<keyboard>` - specifies the keyboard (only to be used in root)
-  * `make keymap=<keymap>` - specifies the keymap (only to be used in root and keyboard folder - not needed when in keymap folder)
-* `make clean` - cleans the `.build` folder, ensuring that everything is re-built
-* `make dfu` - (requires dfu-programmer) builds and flashes the keymap to your keyboard once placed in reset/dfu mode (button or press `KC_RESET`). This does not work for Teensy-based keyboards like the ErgoDox EZ.
-  * `keyboard=` and `keymap=` are compatible with this
-* `make all-keyboards` - builds all keymaps for all keyboards and outputs status of each (use in root)
-* `make all-keyboards-default` - builds all default keymaps for all keyboards and outputs status of each (use in root)
-* `make all-keymaps [keyboard=<keyboard>]` - builds all of the keymaps for whatever keyboard folder you're in, or specified by `<keyboard>`
-* `make all-keyboards-*`, `make all-keyboards-default-*` and `make all-keymaps-* [keyboard=<keyboard>]` - like the normal "make-all-*" commands, but the last string aftter the `-` (for example clean) is passed to the keyboard make command.
-Other, less useful functionality:
+The `<target>` means the following
+* If no target is given, then it's the same as `all` below
+* `all` compiles the keyboard and generates a `<keyboard>_<keymap>.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests.
+* `dfu`, `teensy` or `dfu-util`, compile and upload the firmware to the keyboard. If the compilation fails, then nothing will be uploaded. The programmer to use depends on the keyboard. For most keyboards it's `dfu`, but for Infinity keyboards you should use `dfu-util`, and `teensy` for standard Teensys. To find out which command you should use for your keyboard, check the keyboard specific readme. **Note** that some operating systems needs root access for these commands to work, so in that case you need to run for example `sudo make dfu`.
+* `clean`, cleans the build output folders to make sure that everything is built from scratch. Run this before normal compilation if you have some unexplainable problems.
+
+Some other targets are supported but, but not important enough to be documented here. Check the source code of the make files for more information.
+
+You can also add extra options at the end of the make command line, after the target
 
 * `make COLOR=false` - turns off color output
 * `make SILENT=true` - turns off output besides errors/warnings
-* `make VERBOSE=true` - outputs all of the avr-gcc stuff (not interesting)
+* `make VERBOSE=true` - outputs all of the gcc stuff (not interesting, unless you need to debug)
+
+The make command itself also has some additional options, type `make --help` for more information. The most useful is probably `-jx`, which specifies that you want to compile using more than one CPU, the `x` represents the number of CPUs that you want to use. Setting that can greatly reduce the compile times, especially if you are compiling many keyboards/keymaps. I usually set it to one less than the number of CPUs that I have, so that I have some left for doing other things while it's compiling. Note that not all operating systems and make versions supports that option.
+
+Here are some examples commands
+
+* `make allkb-allsp-allkm` builds everything (all keyboards, all subprojects, all keymaps). Running just `make` from the `root` will also run this.
+* `make` from within a `keyboard` directory, is the same as `make keyboard-allsp-allkm`, which compiles all subprojects and keymaps of the keyboard. **NOTE** that this behaviour has changed. Previously it compiled just the default keymap.
+* `make ergodox-infinity-algernon-clean` will clean the build output of the Ergodox Infinity keyboard. This example uses the full syntax and can be run from any folder with a `Makefile`
+* `make dfu COLOR=false` from within a keymap folder, builds and uploads the keymap, but without color output.
 
 ## The `Makefile`
 
-There are 3 different `make` and `Makefile` locations:
+There are 5 different `make` and `Makefile` locations:
 
 * root (`/`)
 * keyboard (`/keyboards/<keyboard>/`)
 * keymap (`/keyboards/<keyboard>/keymaps/<keymap>/`)
+* subproject (`/keyboards/<keyboard>/<subproject>`)
+* subproject keymap (`/keyboards/<keyboard>/<subproject>/keymaps/<keymap>`)
 
-The root contains the code used to automatically figure out which keymap or keymaps to compile based on your current directory and commandline arguments. It's considered stable, and shouldn't be modified. The keyboard one will contain the MCU set-up and default settings for your keyboard, and shouldn't be modified unless you are the producer of that keyboard. The keymap Makefile can be modified by users, and is optional. It is included automatically if it exists. You can see an example [here](/doc/keymap_makefile_example.mk) - the last few lines are the most important. The settings you set here will override any defaults set in the keyboard Makefile. **It is required if you want to run `make` in the keymap folder.**
+The root contains the code used to automatically figure out which keymap or keymaps to compile based on your current directory and commandline arguments. It's considered stable, and shouldn't be modified. The keyboard one will contain the MCU set-up and default settings for your keyboard, and shouldn't be modified unless you are the producer of that keyboard. The keymap Makefile can be modified by users, and is optional. It is included automatically if it exists. You can see an example [here](/doc/keymap_makefile_example.mk) - the last few lines are the most important. The settings you set here will override any defaults set in the keyboard Makefile. **The file is required if you want to run `make` in the keymap folder.**
+
+For keyboards and subprojects, the make files are split in two parts `Makefile` and `rules.mk`. All settings can be found in the `rules.mk` file, while the `Makefile` is just there for support and including the root `Makefile`. Keymaps contain just one `Makefile` for simplicity.
 
 ### Makefile options
 
@@ -213,11 +280,23 @@ This allows you to use the system and audio control key codes.
 
 `CONSOLE_ENABLE`
 
-This allows you to print messages that can be read using [`hid_listen`](https://www.pjrc.com/teensy/hid_listen.html). Add this to your `Makefile`, and set it to `yes`. Then put `println`, `printf`, etc. in your keymap or anywhere in the `qmk` source. Finally, open `hid_listen` and enjoy looking at your printed messages.
+This allows you to print messages that can be read using [`hid_listen`](https://www.pjrc.com/teensy/hid_listen.html). 
+
+By default, all debug (*dprint*) print (*print*, *xprintf*), and user print (*uprint*) messages will be enabled. This will eat up a significant portion of the flash and may make the keyboard .hex file too big to program. 
+
+To disable debug messages (*dprint*) and reduce the .hex file size, include `#define NO_DEBUG` in your `config.h` file.
+
+To disable print messages (*print*, *xprintf*) and user print messages (*uprint*) and reduce the .hex file size, include `#define NO_PRINT` in your `config.h` file.
+
+To disable print messages (*print*, *xprintf*) and **KEEP** user print messages (*uprint*), include `#define USER_PRINT` in your `config.h` file.
+
+To see the text, open `hid_listen` and enjoy looking at your printed messages.
+
+**NOTE:** Do not include *uprint* messages in anything other than your keymap code. It must not be used within the QMK system framework. Otherwise, you will bloat other people's .hex files. 
 
 `COMMAND_ENABLE`
 
-TODO
+This enables magic commands, typically fired with the default magic key combo `LSHIFT+RSHIFT+KEY`. Magic commands include turning on debugging messages (`MAGIC+D`) or temporarily toggling NKRO (`MAGIC+N`).
 
 `SLEEP_LED_ENABLE`
 
@@ -225,7 +304,7 @@ Enables your LED to breath while your computer is sleeping. Timer1 is being used
 
 `NKRO_ENABLE`
 
-This allows for n-key rollover (default is 6) to be enabled. It is off by default, but can be forced by adding `#define FORCE_NKRO` to your config.h.
+This allows the keyboard to tell the host OS that up to 248 keys are held down at once (default without NKRO is 6). NKRO is off by default, even if `NKRO_ENABLE` is set. NKRO can be forced by adding `#define FORCE_NKRO` to your config.h or by binding `MAGIC_TOGGLE_NKRO` to a key and then hitting the key.
 
 `BACKLIGHT_ENABLE`
 
@@ -368,7 +447,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
 
 Steve Losh [described](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) the Space Cadet Shift quite well. Essentially, you hit the left Shift on its own, and you get an opening parenthesis; hit the right Shift on its own, and you get the closing one. When hit with other keys, the Shift key keeps working as it always does. Yes, it's as cool as it sounds.
 
-To use it, use `KC_LSPO` (Left Shift, Parens Open) for your left Shift on your keymap, and `KC_RSPC` (Right Shift, Parens Close) for your right Shift. 
+To use it, use `KC_LSPO` (Left Shift, Parens Open) for your left Shift on your keymap, and `KC_RSPC` (Right Shift, Parens Close) for your right Shift.
 
 It's defaulted to work on US keyboards, but if your layout uses different keys for parenthesis, you can define those in your `config.h` like this:
 
@@ -447,7 +526,7 @@ This array specifies what actions shall be taken when a tap-dance key is in acti
 
 * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
 * `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
-* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
+* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
 
 The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
 
@@ -465,11 +544,11 @@ For the sake of flexibility, tap-dance actions can be either a pair of keycodes,
 
 ### Examples
 
-Here's a simple example for a single definition: 
+Here's a simple example for a single definition:
 
 1. In your `makefile`, add `TAP_DANCE_ENABLE = yes`
 2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200`
-3. In your `keymap.c` file, define the variables and definitions, then add to your keymap: 
+3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
 
 ```c
 //Tap Dance Declarations
@@ -485,10 +564,10 @@ qk_tap_dance_action_t tap_dance_actions[] = {
 };
 
 //In Layer declaration, add tap dance item in place of a key code
-TD(TD_ESC_CAPS) 
+TD(TD_ESC_CAPS)
 ```
 
-Here's a more complex example involving custom actions: 
+Here's a more complex example involving custom actions:
 
 ```c
 enum {
@@ -763,11 +842,11 @@ To enable them, first add a new element to the `planck_keycodes` enum -- `DYNAMI
 Afterwards create a new layer called `_DYN`:
 
     #define _DYN 6    /* almost any other free number should be ok */
-    
+
 Below these two modifications include the `dynamic_macro.h` header:
 
     #include "dynamic_macro.h"`
-    
+
 Then define the `_DYN` layer with the following keys: `DYN_REC_START1`, `DYN_MACRO_PLAY1`,`DYN_REC_START2` and `DYN_MACRO_PLAY2`. It may also contain other keys, it doesn't matter apart from the fact that you won't be able to record these keys in the dynamic macros.
 
     [_DYN]= {
@@ -776,7 +855,7 @@ Then define the `_DYN` layer with the following keys: `DYN_REC_START1`, `DYN_MAC
         {_______,  _______,        _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______},
         {_______,  _______,        _______,         _______, _______, _______, _______, _______, _______, _______, _______, _______}
     },
-    
+
 Add the following code to the very beginning of your `process_record_user()` function:
 
     if (!process_record_dynamic_macro(keycode, record)) {
@@ -812,6 +891,66 @@ In `quantum/keymap_extras/`, you'll see various language files - these work the
 
 You can currently send 4 hex digits with your OS-specific modifier key (RALT for OSX with the "Unicode Hex Input" layout) - this is currently limited to supporting one OS at a time, and requires a recompile for switching. 8 digit hex codes are being worked on. The keycode function is `UC(n)`, where *n* is a 4 digit hexidecimal. Enable from the Makefile.
 
+## Backlight Breathing
+
+In order to enable backlight breathing, the following line must be added to your config.h file.
+
+    #define BACKLIGHT_BREATHING
+
+The following function calls are used to control the breathing effect.
+
+* ```breathing_enable()``` - Enable the free-running breathing effect.
+* ```breathing_disable()``` - Disable the free-running breathing effect immediately.
+* ```breathing_self_disable()``` - Disable the free-running breathing effect after the current effect ends.
+* ```breathing_toggle()``` - Toggle the free-running breathing effect.
+* ```breathing_defaults()``` - Reset the speed and brightness settings of the breathing effect.
+
+The following function calls are used to control the maximum brightness of the breathing effect.
+
+* ```breathing_intensity_set(value)``` - Set the brightness of the breathing effect when it is at its max value.
+* ```breathing_intensity_default()``` - Reset the brightness of the breathing effect to the default value based on the current backlight intensity.
+
+The following function calls are used to control the cycling speed of the breathing effect.
+
+* ```breathing_speed_set(value)``` - Set the speed of the breathing effect - how fast it cycles.
+* ```breathing_speed_inc(value)``` - Increase the speed of the breathing effect by a fixed value.
+* ```breathing_speed_dec(value)``` - Decrease the speed of the breathing effect by a fixed value.
+* ```breathing_speed_default()``` - Reset the speed of the breathing effect to the default value.
+
+The following example shows how to enable the backlight breathing effect when the FUNCTION layer macro button is pressed:
+
+    case MACRO_FUNCTION:
+        if (record->event.pressed)
+        {
+            breathing_speed_set(3);
+            breathing_enable();
+            layer_on(LAYER_FUNCTION);
+        }
+        else
+        {
+            breathing_speed_set(1);
+            breathing_self_disable();
+            layer_off(LAYER_FUNCTION);
+        }
+        break;
+
+The following example shows how to pulse the backlight on-off-on when the RAISED layer macro button is pressed:
+
+    case MACRO_RAISED:
+      if (record->event.pressed)
+      {
+        layer_on(LAYER_RAISED);
+        breathing_speed_set(2);
+        breathing_pulse();
+        update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
+      }
+      else
+      {
+        layer_off(LAYER_RAISED);
+        update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
+      }
+      break;
+
 ## Other firmware shortcut keycodes
 
 * `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`)
@@ -978,7 +1117,7 @@ For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring
 In order to use the underglow timer functions, you need to have `#define RGBLIGHT_TIMER` in your `config.h`, and have audio disabled (`AUDIO_ENABLE = no` in your Makefile).
 
 Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the `F4` pin by default:
-    
+
     #define RGB_DI_PIN F4     // The pin your RGB strip is wired to
     #define RGBLIGHT_TIMER    // Require for fancier stuff (not compatible with audio)
     #define RGBLED_NUM 14     // Number of LEDs
@@ -1025,15 +1164,15 @@ If your keyboard is running an Atmega chip (atmega32u4 and others), it's pretty
 
 The `USB Device descriptor parameter` block contains parameters are used to uniquely identify your keyboard, but they don't really matter to the machine.
 
-Your `MATRIX_ROWS` and `MATRIX_COLS` are the numbers of rows and cols in your keyboard matrix - this may be different than the number of actual rows and columns on your keyboard. There are some tricks you can pull to increase the number of keys in a given matrix, but most keyboards are pretty straight-forward. 
+Your `MATRIX_ROWS` and `MATRIX_COLS` are the numbers of rows and cols in your keyboard matrix - this may be different than the number of actual rows and columns on your keyboard. There are some tricks you can pull to increase the number of keys in a given matrix, but most keyboards are pretty straight-forward.
 
 The `MATRIX_ROW_PINS` and `MATRIX_COL_PINS` are the pins your MCU uses on each row/column. Your schematic (if you have one) will have this information on it, and the values will vary depending on your setup. This is one of the most important things to double-check in getting your keyboard setup correctly.
 
 For the `DIODE_DIRECTION`, most hand-wiring guides will instruct you to wire the diodes in the `COL2ROW` position, but it's possible that they are in the other - people coming from EasyAVR often use `ROW2COL`. Nothing will function if this is incorrect.
 
-`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to. Currently only B5, B6, and B7 are supported. 
+`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to. Currently only B5, B6, and B7 are supported.
 
-`BACKLIGHT_BREATHING` is a fancier backlight feature, and uses one of the timers.
+`BACKLIGHT_BREATHING` is a fancier backlight feature that adds breathing/pulsing/fading effects to the backlight. It uses the same timer as the normal backlight. These breathing effects must be called by code in your keymap.
 
 `BACKLIGHT_LEVELS` is how many levels exist for your backlight - max is 15, and they are computed automatically from this number.
 
@@ -1077,3 +1216,53 @@ Here is where you can (optionally) define your `KEYMAP` function to remap your m
 ```
 
 Each of the `kxx` variables needs to be unique, and usually follows the format `k<row><col>`. You can place `KC_NO` where your dead keys are in your matrix.
+
+# Unit Testing
+
+If you are new to unit testing, then you can find many good resources on internet. However most of it is scattered around in small pieces here and there, and there's also many different opinions, so I won't give any recommendations.
+
+Instead I recommend these two books, explaining two different styles of Unit Testing in detail.
+
+* "Test Driven Development: By Example: Kent Beck"
+* "Growing Object-Oriented Software, Guided By Tests: Steve Freeman, Nat Pryce"
+
+If you prefer videos there are Uncle Bob's [Clean Coders Videos](https://cleancoders.com/), which unfortunately cost quite a bit, especially if you want to watch many of them. But James Shore has a free [Let's Play](http://www.jamesshore.com/Blog/Lets-Play) video series.
+
+## Google Test and Google Mock
+It's possible to Unit Test your code using [Google Test](https://github.com/google/googletest). The Google Test framework also includes another component for writing testing mocks and stubs, called "Google Mock". For information how to write the actual tests, please refer to the documentation on that site.
+
+## Use of C++
+
+Note that Google Test and therefore any test has to be written in C++, even if the rest of the QMK codebases is written in C. This should hopefully not be a problem even if you don't know any C++, since there's quite clear documentation and examples of the required C++ features, and you can write the rest of the test code almost as you would write normal C. Note that some compiler errors which you might get can look quite scary, but just read carefully what it says, and you should be ok.
+
+One thing to remember, is that you have to append `extern "C"` around all of your C file includes.
+
+## Adding tests for new or existing features
+
+If you want to unit test some feature, then take a look at the existing serial_link tests, in the `quantum/serial_link/tests folder`, and follow the steps below to create a similar structure.
+
+1. If it doesn't already exist, add a test subfolder to the folder containing the feature.
+2. Create a `testlist.mk` and a `rules.mk` file in that folder.
+3. Include those files from the root folder `testlist.mk`and `build_test.mk` respectively.
+4. Add a new name for your testgroup to the `testlist.mk` file. Each group defined there will be a separate executable. And that's how you can support mocking out different parts. Note that it's worth adding some common prefix, just like it's done for the serial_link tests. The reason for that is that the make command allows substring filtering, so this way you can easily run a subset of the tests.
+5. Define the source files and required options in the `rules.mk` file.
+   * `_SRC` for source files
+   * `_DEFS` for additional defines
+   * `_INC` for additional include folders
+6. Write the tests in a new cpp file inside the test folder you created. That file has to be one of the files included from the `rules.mk` file.
+
+Note how there's several different tests, each mocking out a separate part. Also note that each of them only compiles the very minimum that's needed for the tests. It's recommend that you try to do the same. For a relevant video check out [Matt Hargett "Advanced Unit Testing in C & C++](https://www.youtube.com/watch?v=Wmy6g-aVgZI)
+
+## Running the tests
+
+To run all the tests in the codebase, type `make test`. You can also run test matching a substring by typing `make test-matchingsubstring` Note that the tests are always compiled with the native compiler of your platform, so they are also run like any other program on your computer.
+
+## Debugging the tests
+
+If there are problems with the tests, you can find the executable in the `./build/test` folder. You should be able to run those with GDB or a similar debugger.
+
+## Full Integration tests
+
+It's not yet possible to do a full integration test, where you would compile the whole firmware and define a keymap that you are going to test. However there are plans for doing that, because writing tests that way would probably be easier, at least for people that are not used to unit testing.
+
+In that model you would emulate the input, and expect a certain output from the emulated keyboard.
diff --git a/testlist.mk b/testlist.mk
new file mode 100644 (file)
index 0000000..1884d6d
--- /dev/null
@@ -0,0 +1,13 @@
+include $(ROOT_DIR)/quantum/serial_link/tests/testlist.mk
+
+define VALIDATE_TEST_LIST
+    ifneq ($1,)
+        ifeq ($$(findstring -,$1),-)
+            $$(error Test names can't contain '-', but '$1' does)
+        else
+            $$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
+        endif
+    endif
+endef
+
+$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))
\ No newline at end of file
index cb67ac6f25ba311815b8c005c9388c6903d583d8..062a712bd106d5c5b3d4e601a59c938a3aee6e79 100644 (file)
@@ -89,9 +89,9 @@ CHIBISRC = $(STARTUPSRC) \
           $(STARTUPASM) \
           $(PORTASM) \
           $(OSALASM)         
-          
-SRC += $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
 
+CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
+          
 EXTRAINCDIRS += $(CHIBIOS)/os/license \
          $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
          $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
@@ -143,14 +143,6 @@ MCUFLAGS = -mcpu=$(MCU)
 
 DEBUG = gdb
 
-# Define ASM defines here
-# bootloader definitions may be used in the startup .s file
-ifneq ("$(wildcard $(KEYBOARD_PATH)/bootloader_defs.h)","")
-    OPT_DEFS += -include $(KEYBOARD_PATH)/bootloader_defs.h
-else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","")
-    OPT_DEFS += -include $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h
-endif
-
 # List any extra directories to look for libraries here.
 EXTRALIBDIRS = $(RULESPATH)/ld
 
index 429c57143535b29d36c354bd2ce8c50466610e66..f826a7b540b87da494a7d18fa74629523b813ecb 100644 (file)
@@ -5,7 +5,7 @@ else ifeq ($(PLATFORM),CHIBIOS)
        PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios
 endif
 
-SRC += $(COMMON_DIR)/host.c \
+TMK_COMMON_SRC +=      $(COMMON_DIR)/host.c \
        $(COMMON_DIR)/keyboard.c \
        $(COMMON_DIR)/action.c \
        $(COMMON_DIR)/action_tapping.c \
@@ -21,101 +21,89 @@ SRC +=     $(COMMON_DIR)/host.c \
        $(PLATFORM_COMMON_DIR)/bootloader.c \
 
 ifeq ($(PLATFORM),AVR)
-       SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
+       TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
 endif 
 
 ifeq ($(PLATFORM),CHIBIOS)
-       SRC += $(PLATFORM_COMMON_DIR)/printf.c
-       SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
+       TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
+       TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
 endif
 
 
 
 # Option modules
 ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes)
-    OPT_DEFS += -DBOOTMAGIC_ENABLE
-    SRC += $(COMMON_DIR)/bootmagic.c
+    TMK_COMMON_DEFS += -DBOOTMAGIC_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic.c
 else
-    OPT_DEFS += -DMAGIC_ENABLE
-    SRC += $(COMMON_DIR)/magic.c
+    TMK_COMMON_DEFS += -DMAGIC_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/magic.c
 endif
 
 ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/mousekey.c
-    OPT_DEFS += -DMOUSEKEY_ENABLE
-    OPT_DEFS += -DMOUSE_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c
+    TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE
+    TMK_COMMON_DEFS += -DMOUSE_ENABLE
 endif
 
 ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
-    OPT_DEFS += -DEXTRAKEY_ENABLE
+    TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE
 endif
 
 ifeq ($(strip $(CONSOLE_ENABLE)), yes)
-    OPT_DEFS += -DCONSOLE_ENABLE
+    TMK_COMMON_DEFS += -DCONSOLE_ENABLE
 else
-    OPT_DEFS += -DNO_PRINT
-    OPT_DEFS += -DNO_DEBUG
+    TMK_COMMON_DEFS += -DNO_PRINT
+    TMK_COMMON_DEFS += -DNO_DEBUG
 endif
 
 ifeq ($(strip $(COMMAND_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/command.c
-    OPT_DEFS += -DCOMMAND_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/command.c
+    TMK_COMMON_DEFS += -DCOMMAND_ENABLE
 endif
 
 ifeq ($(strip $(NKRO_ENABLE)), yes)
-    OPT_DEFS += -DNKRO_ENABLE
+    TMK_COMMON_DEFS += -DNKRO_ENABLE
 endif
 
 ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
-    OPT_DEFS += -DUSB_6KRO_ENABLE
+    TMK_COMMON_DEFS += -DUSB_6KRO_ENABLE
 endif
 
 ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
-    SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
-    OPT_DEFS += -DSLEEP_LED_ENABLE
-    OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
+    TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
+    TMK_COMMON_DEFS += -DSLEEP_LED_ENABLE
+    TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
 endif
 
 ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/backlight.c
-    OPT_DEFS += -DBACKLIGHT_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/backlight.c
+    TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE
 endif
 
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
-    OPT_DEFS += -DBLUETOOTH_ENABLE
+    TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
 endif
 
 ifeq ($(strip $(ONEHAND_ENABLE)), yes)
-    OPT_DEFS += -DONEHAND_ENABLE
+    TMK_COMMON_DEFS += -DONEHAND_ENABLE
 endif
 
 ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
-    OPT_DEFS += -DKEYMAP_SECTION_ENABLE
+    TMK_COMMON_DEFS += -DKEYMAP_SECTION_ENABLE
 
     ifeq ($(strip $(MCU)),atmega32u2)
-       EXTRALDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr35.x
+       TMK_COMMON_LDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr35.x
     else ifeq ($(strip $(MCU)),atmega32u4)
-       EXTRALDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr5.x
+       TMK_COMMON_LDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr5.x
     else
-       EXTRALDFLAGS = $(error no ldscript for keymap section)
+       TMK_COMMON_LDFLAGS = $(error no ldscript for keymap section)
     endif
 endif
 
-ifeq ($(MASTER),right) 
-       OPT_DEFS += -DMASTER_IS_ON_RIGHT
-else 
-       ifneq ($(MASTER),left)
-$(error MASTER does not have a valid value(left/right))
-       endif
-endif
-
-
-# Version string
-OPT_DEFS += -DVERSION=$(GIT_VERSION)
-
 # Bootloader address
 ifdef STM32_BOOTLOADER_ADDRESS
-    OPT_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
+    TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
 endif
 
 # Search Path
index 08ef22eb970bc28f08244cb041b359063581cb19..d485b46c77cf83f81967d9af2060cd0f42fd3a66 100644 (file)
@@ -155,9 +155,10 @@ void process_action(keyrecord_t *record, action_t action)
                                                                 action.key.mods<<4;
                 if (event.pressed) {
                     if (mods) {
-                        if (IS_MOD(action.key.code)) {
+                        if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
                             // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless.
-                            // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT)
+                            // This also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT).
+                            // Same applies for some keys like KC_MEH which are declared as MEH(KC_NO).
                             add_mods(mods);
                         } else {
                             add_weak_mods(mods);
@@ -168,7 +169,7 @@ void process_action(keyrecord_t *record, action_t action)
                 } else {
                     unregister_code(action.key.code);
                     if (mods) {
-                        if (IS_MOD(action.key.code)) {
+                        if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
                             del_mods(mods);
                         } else {
                             del_weak_mods(mods);
index 61ff202befa510b9d08f3604f7fad50c607c11b7..cb4b2526484e59fc31191ca10286176533e30585 100644 (file)
@@ -20,6 +20,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "action_util.h"
 #include "action_layer.h"
 #include "timer.h"
+#include "keycode_config.h"
+
+extern keymap_config_t keymap_config;
+
 
 static inline void add_key_byte(uint8_t code);
 static inline void del_key_byte(uint8_t code);
@@ -139,7 +143,7 @@ void send_keyboard_report(void) {
 void add_key(uint8_t key)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         add_key_bit(key);
         return;
     }
@@ -150,7 +154,7 @@ void add_key(uint8_t key)
 void del_key(uint8_t key)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         del_key_bit(key);
         return;
     }
@@ -231,7 +235,7 @@ uint8_t has_anymod(void)
 uint8_t get_first_key(void)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         uint8_t i = 0;
         for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
             ;
index fb9bf2d1c3328a2a441820bef7b377a58f168bed..ad547b9853c9cbed234c225d49214c831782761b 100644 (file)
@@ -38,7 +38,7 @@
  *          |               |                        |               |
  *          =               =                        =               =
  *          |               | 32KB-4KB               |               | 128KB-8KB
- * 0x6000   +---------------+               0x1FC00  +---------------+
+ * 0x7000   +---------------+               0x1E000  +---------------+
  *          |  Bootloader   | 4KB                    |  Bootloader   | 8KB
  * 0x7FFF   +---------------+               0x1FFFF  +---------------+
  *
@@ -64,8 +64,8 @@
 #define BOOTLOADER_START    (FLASH_SIZE - BOOTLOADER_SIZE)
 
 
-/* 
- * Entering the Bootloader via Software 
+/*
+ * Entering the Bootloader via Software
  * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
  */
 #define BOOTLOADER_RESET_KEY 0xB007B007
@@ -137,7 +137,7 @@ void bootloader_jump_after_watchdog_reset(void)
 #if 0
 /* Jumping To The Bootloader
  * http://www.pjrc.com/teensy/jump_to_bootloader.html
- * 
+ *
  * This method doen't work when using LUFA. idk why.
  * - needs to initialize more regisers or interrupt setting?
  */
index 0cec70ce224f4317af446d1cacaeb6d13de2ad9c..06434b98d9378949fc271b7bc86bfb570a76218e 100644 (file)
-;---------------------------------------------------------------------------;\r
-; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011\r
-;---------------------------------------------------------------------------;\r
-\r
-                               // Base size is 152 bytes\r
-#define        CR_CRLF         0       // Convert \n to \r\n (+10 bytes)\r
-#define USE_XPRINTF    1       // Enable xprintf function (+194 bytes)\r
-#define USE_XSPRINTF   0       // Add xsprintf function (+78 bytes)\r
-#define USE_XFPRINTF   0       // Add xfprintf function (+54 bytes)\r
-#define USE_XATOI      0       // Enable xatoi function (+182 bytes)\r
-\r
-\r
-#if FLASHEND > 0x1FFFF\r
-#error xitoa module does not support 256K devices\r
-#endif\r
-\r
-.nolist\r
-#include <avr/io.h>    // Include device specific definitions.\r
-.list\r
-\r
-#ifdef SPM_PAGESIZE    // Recent devices have "lpm Rd,Z+" and "movw".\r
-.macro _LPMI   reg\r
-       lpm     \reg, Z+\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       movw    \dl, \sl\r
-.endm\r
-#else                  // Earlier devices do not have "lpm Rd,Z+" nor "movw".\r
-.macro _LPMI   reg\r
-       lpm\r
-       mov     \reg, r0\r
-       adiw    ZL, 1\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       mov     \dl, \sl\r
-       mov     \dh, \sh\r
-.endm\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Stub function to forward to user output function\r
-;\r
-;Prototype: void xputc (char chr       // a character to be output\r
-;                      );\r
-;Size: 12/12 words\r
-\r
-.section .bss\r
-.global xfunc_out      ; xfunc_out must be initialized before using this module.\r
-xfunc_out:     .ds.w   1\r
-.section .text\r
-\r
-\r
-.func xputc\r
-.global xputc\r
-xputc:\r
-#if CR_CRLF\r
-       cpi     r24, 10         ;LF --> CRLF\r
-       brne    1f              ;\r
-       ldi     r24, 13         ;\r
-       rcall   1f              ;\r
-       ldi     r24, 10         ;/\r
-1:\r
-#endif\r
-       push    ZH\r
-       push    ZL\r
-       lds     ZL, xfunc_out+0 ;Pointer to the registered output function.\r
-       lds     ZH, xfunc_out+1 ;/\r
-       sbiw    ZL, 0           ;Skip if null\r
-       breq    2f              ;/\r
-       icall\r
-2:     pop     ZL\r
-       pop     ZH\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Direct ROM string output\r
-;\r
-;Prototype: void xputs (const char *str_p // rom string to be output\r
-;                      );\r
-\r
-.func xputs\r
-.global xputs\r
-xputs:\r
-       _MOVW   ZH,ZL, r25,r24  ; Z = pointer to rom string\r
-1:     _LPMI   r24\r
-       cpi     r24, 0\r
-       breq    2f\r
-       rcall   xputc\r
-       rjmp    1b\r
-2:     ret\r
-.endfunc\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Extended direct numeral string output (32bit version)\r
-;\r
-;Prototype: void xitoa (long value,    // value to be output\r
-;                       char radix,    // radix\r
-;                       char width);   // minimum width\r
-;\r
-\r
-.func xitoa\r
-.global xitoa\r
-xitoa:\r
-                               ;r25:r22 = value, r20 = base, r18 = digits\r
-       clr     r31             ;r31 = stack level\r
-       ldi     r30, ' '        ;r30 = sign\r
-       ldi     r19, ' '        ;r19 = filler\r
-       sbrs    r20, 7          ;When base indicates signd format and the value\r
-       rjmp    0f              ;is minus, add a '-'.\r
-       neg     r20             ;\r
-       sbrs    r25, 7          ;\r
-       rjmp    0f              ;\r
-       ldi     r30, '-'        ;\r
-       com     r22             ;\r
-       com     r23             ;\r
-       com     r24             ;\r
-       com     r25             ;\r
-       adc     r22, r1         ;\r
-       adc     r23, r1         ;\r
-       adc     r24, r1         ;\r
-       adc     r25, r1         ;/\r
-0:     sbrs    r18, 7          ;When digits indicates zero filled,\r
-       rjmp    1f              ;filler is '0'.\r
-       neg     r18             ;\r
-       ldi     r19, '0'        ;/\r
-                               ;----- string conversion loop\r
-1:     ldi     r21, 32         ;r26 = r25:r22 % r20\r
-       clr     r26             ;r25:r22 /= r20\r
-2:     lsl     r22             ;\r
-       rol     r23             ;\r
-       rol     r24             ;\r
-       rol     r25             ;\r
-       rol     r26             ;\r
-       cp      r26, r20        ;\r
-       brcs    3f              ;\r
-       sub     r26, r20        ;\r
-       inc     r22             ;\r
-3:     dec     r21             ;\r
-       brne    2b              ;/\r
-       cpi     r26, 10         ;r26 is a numeral digit '0'-'F'\r
-       brcs    4f              ;\r
-       subi    r26, -7         ;\r
-4:     subi    r26, -'0'       ;/\r
-       push    r26             ;Stack it\r
-       inc     r31             ;/\r
-       cp      r22, r1         ;Repeat until r25:r22 gets zero\r
-       cpc     r23, r1         ;\r
-       cpc     r24, r1         ;\r
-       cpc     r25, r1         ;\r
-       brne    1b              ;/\r
-\r
-       cpi     r30, '-'        ;Minus sign if needed\r
-       brne    5f              ;\r
-       push    r30             ;\r
-       inc     r31             ;/\r
-5:     cp      r31, r18        ;Filler\r
-       brcc    6f              ;\r
-       push    r19             ;\r
-       inc     r31             ;\r
-       rjmp    5b              ;/\r
-\r
-6:     pop     r24             ;Flush stacked digits and exit\r
-       rcall   xputc           ;\r
-       dec     r31             ;\r
-       brne    6b              ;/\r
-\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Formatted string output (16/32bit version)\r
-;\r
-;Prototype:\r
-; void __xprintf (const char *format_p, ...);\r
-; void __xsprintf(char*, const char *format_p, ...);\r
-; void __xfprintf(void(*func)(char), const char *format_p, ...);\r
-;\r
-\r
-#if USE_XPRINTF\r
-\r
-.func xvprintf\r
-xvprintf:\r
-       ld      ZL, Y+          ;Z = pointer to format string\r
-       ld      ZH, Y+          ;/\r
-\r
-0:     _LPMI   r24             ;Get a format char\r
-       cpi     r24, 0          ;End of format string?\r
-       breq    90f             ;/\r
-       cpi     r24, '%'        ;Is format?\r
-       breq    20f             ;/\r
-1:     rcall   xputc           ;Put a normal character\r
-       rjmp    0b              ;/\r
-90:    ret\r
-\r
-20:    ldi     r18, 0          ;r18: digits\r
-       clt                     ;T: filler\r
-       _LPMI   r21             ;Get flags\r
-       cpi     r21, '%'        ;Is a %?\r
-       breq    1b              ;/\r
-       cpi     r21, '0'        ;Zero filled?\r
-       brne    23f             ;\r
-       set                     ;/\r
-22:    _LPMI   r21             ;Get width\r
-23:    cpi     r21, '9'+1      ;\r
-       brcc    24f             ;\r
-       subi    r21, '0'        ;\r
-       brcs    90b             ;\r
-       lsl     r18             ;\r
-       mov     r0, r18         ;\r
-       lsl     r18             ;\r
-       lsl     r18             ;\r
-       add     r18, r0         ;\r
-       add     r18, r21        ;\r
-       rjmp    22b             ;/\r
-\r
-24:    brtc    25f             ;get value (low word)\r
-       neg     r18             ;\r
-25:    ld      r24, Y+         ;\r
-       ld      r25, Y+         ;/\r
-       cpi     r21, 'c'        ;Is type character?\r
-       breq    1b              ;/\r
-       cpi     r21, 's'        ;Is type RAM string?\r
-       breq    50f             ;/\r
-       cpi     r21, 'S'        ;Is type ROM string?\r
-       breq    60f             ;/\r
-       _MOVW   r23,r22,r25,r24 ;r25:r22 = value\r
-       clr     r24             ;\r
-       clr     r25             ;\r
-       clt                     ;/\r
-       cpi     r21, 'l'        ;Is long int?\r
-       brne    26f             ;\r
-       ld      r24, Y+         ;get value (high word)\r
-       ld      r25, Y+         ;\r
-       set                     ;\r
-       _LPMI   r21             ;/\r
-26:    cpi     r21, 'd'        ;Is type signed decimal?\r
-       brne    27f             ;/\r
-       ldi     r20, -10        ;\r
-       brts    40f             ;\r
-       sbrs    r23, 7          ;\r
-       rjmp    40f             ;\r
-       ldi     r24, -1         ;\r
-       ldi     r25, -1         ;\r
-       rjmp    40f             ;/\r
-27:    cpi     r21, 'u'        ;Is type unsigned decimal?\r
-       ldi     r20, 10         ;\r
-       breq    40f             ;/\r
-       cpi     r21, 'X'        ;Is type hexdecimal?\r
-       ldi     r20, 16         ;\r
-       breq    40f             ;/\r
-       cpi     r21, 'b'        ;Is type binary?\r
-       ldi     r20, 2          ;\r
-       breq    40f             ;/\r
-       ret                     ;abort\r
-40:    push    ZH              ;Output the value\r
-       push    ZL              ;\r
-       rcall   xitoa           ;\r
-42:    pop     ZL              ;\r
-       pop     ZH              ;\r
-       rjmp    0b              ;/\r
-\r
-50:    push    ZH              ;Put a string on the RAM\r
-       push    ZL\r
-       _MOVW   ZH,ZL, r25,r24\r
-51:    ld      r24, Z+\r
-       cpi     r24, 0\r
-       breq    42b\r
-       rcall   xputc\r
-       rjmp    51b\r
-\r
-60:    push    ZH              ;Put a string on the ROM\r
-       push    ZL\r
-       rcall   xputs\r
-       rjmp    42b\r
-.endfunc\r
-\r
-\r
-.func __xprintf\r
-.global __xprintf\r
-__xprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       rcall   xvprintf\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-\r
-\r
-#if USE_XSPRINTF\r
-\r
-.func __xsprintf\r
-putram:\r
-       _MOVW   ZH,ZL, r15,r14\r
-       st      Z+, r24\r
-       _MOVW   r15,r14, ZH,ZL\r
-       ret\r
-.global __xsprintf\r
-__xsprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       lds     ZL, xfunc_out+0 ;Save registered output function\r
-       lds     ZH, xfunc_out+1 ;\r
-       push    ZL              ;\r
-       push    ZH              ;/\r
-       ldi     ZL, lo8(pm(putram));Set local output function\r
-       ldi     ZH, hi8(pm(putram));\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       push    r15             ;Initialize pointer to string buffer\r
-       push    r14             ;\r
-       ld      r14, Y+         ;\r
-       ld      r15, Y+         ;/\r
-       rcall   xvprintf\r
-       _MOVW   ZH,ZL, r15,r14  ;Terminate string\r
-       st      Z, r1           ;\r
-       pop     r14             ;\r
-       pop     r15             ;/\r
-       pop     ZH              ;Restore registered output function\r
-       pop     ZL              ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-\r
-#if USE_XFPRINTF\r
-.func __xfprintf\r
-.global __xfprintf\r
-__xfprintf:\r
-       push    YH\r
-       push    YL\r
-       in      YL, _SFR_IO_ADDR(SPL)\r
-#ifdef SPH\r
-       in      YH, _SFR_IO_ADDR(SPH)\r
-#else\r
-       clr     YH\r
-#endif\r
-       adiw    YL, 5           ;Y = pointer to arguments\r
-       lds     ZL, xfunc_out+0 ;Save registered output function\r
-       lds     ZH, xfunc_out+1 ;\r
-       push    ZL              ;\r
-       push    ZH              ;/\r
-       ld      ZL, Y+          ;Set output function\r
-       ld      ZH, Y+          ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       rcall   xvprintf\r
-       pop     ZH              ;Restore registered output function\r
-       pop     ZL              ;\r
-       sts     xfunc_out+0, ZL ;\r
-       sts     xfunc_out+1, ZH ;/\r
-       pop     YL\r
-       pop     YH\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------\r
-; Extended numeral string input\r
-;\r
-;Prototype:\r
-; char xatoi (           /* 1: Successful, 0: Failed */\r
-;      const char **str, /* pointer to pointer to source string */\r
-;      long *res         /* result */\r
-; );\r
-;\r
-\r
-\r
-#if USE_XATOI\r
-.func xatoi\r
-.global xatoi\r
-xatoi:\r
-       _MOVW   r1, r0, r23, r22\r
-       _MOVW   XH, XL, r25, r24\r
-       ld      ZL, X+\r
-       ld      ZH, X+\r
-       clr     r18             ;r21:r18 = 0;\r
-       clr     r19             ;\r
-       clr     r20             ;\r
-       clr     r21             ;/\r
-       clt                     ;T = 0;\r
-\r
-       ldi     r25, 10         ;r25 = 10;\r
-       rjmp    41f             ;/\r
-40:    adiw    ZL, 1           ;Z++;\r
-41:    ld      r22, Z          ;r22 = *Z;\r
-       cpi     r22, ' '        ;if(r22 == ' ') continue\r
-       breq    40b             ;/\r
-       brcs    70f             ;if(r22 < ' ') error;\r
-       cpi     r22, '-'        ;if(r22 == '-') {\r
-       brne    42f             ; T = 1;\r
-       set                     ; continue;\r
-       rjmp    40b             ;}\r
-42:    cpi     r22, '9'+1      ;if(r22 > '9') error;\r
-       brcc    70f             ;/\r
-       cpi     r22, '0'        ;if(r22 < '0') error;\r
-       brcs    70f             ;/\r
-       brne    51f             ;if(r22 > '0') cv_start;\r
-       ldi     r25, 8          ;r25 = 8;\r
-       adiw    ZL, 1           ;r22 = *(++Z);\r
-       ld      r22, Z          ;/\r
-       cpi     r22, ' '+1      ;if(r22 <= ' ') exit;\r
-       brcs    80f             ;/\r
-       cpi     r22, 'b'        ;if(r22 == 'b') {\r
-       brne    43f             ; r25 = 2;\r
-       ldi     r25, 2          ; cv_start;\r
-       rjmp    50f             ;}\r
-43:    cpi     r22, 'x'        ;if(r22 != 'x') error;\r
-       brne    51f             ;/\r
-       ldi     r25, 16         ;r25 = 16;\r
-\r
-50:    adiw    ZL, 1           ;Z++;\r
-       ld      r22, Z          ;r22 = *Z;\r
-51:    cpi     r22, ' '+1      ;if(r22 <= ' ') break;\r
-       brcs    80f             ;/\r
-       cpi     r22, 'a'        ;if(r22 >= 'a') r22 =- 0x20;\r
-       brcs    52f             ;\r
-       subi    r22, 0x20       ;/\r
-52:    subi    r22, '0'        ;if((r22 -= '0') < 0) error;\r
-       brcs    70f             ;/\r
-       cpi     r22, 10         ;if(r22 >= 10) {\r
-       brcs    53f             ; r22 -= 7;\r
-       subi    r22, 7          ; if(r22 < 10) \r
-       cpi     r22, 10         ;\r
-       brcs    70f             ;}\r
-53:    cp      r22, r25        ;if(r22 >= r25) error;\r
-       brcc    70f             ;/\r
-60:    ldi     r24, 33         ;r21:r18 *= r25;\r
-       sub     r23, r23        ;\r
-61:    brcc    62f             ;\r
-       add     r23, r25        ;\r
-62:    lsr     r23             ;\r
-       ror     r21             ;\r
-       ror     r20             ;\r
-       ror     r19             ;\r
-       ror     r18             ;\r
-       dec     r24             ;\r
-       brne    61b             ;/\r
-       add     r18, r22        ;r21:r18 += r22;\r
-       adc     r19, r24        ;\r
-       adc     r20, r24        ;\r
-       adc     r21, r24        ;/\r
-       rjmp    50b             ;repeat\r
-\r
-70:    ldi     r24, 0\r
-       rjmp    81f\r
-80:    ldi     r24, 1\r
-81:    brtc    82f\r
-       clr     r22\r
-       com     r18\r
-       com     r19\r
-       com     r20\r
-       com     r21\r
-       adc     r18, r22\r
-       adc     r19, r22\r
-       adc     r20, r22\r
-       adc     r21, r22\r
-82:    st      -X, ZH\r
-       st      -X, ZL\r
-       _MOVW   XH, XL, r1, r0\r
-       st      X+, r18\r
-       st      X+, r19\r
-       st      X+, r20\r
-       st      X+, r21\r
-       clr     r1\r
-       ret\r
-.endfunc\r
-#endif\r
-\r
-\r
+;---------------------------------------------------------------------------;
+; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011
+;---------------------------------------------------------------------------;
+
+                               // Base size is 152 bytes
+#define        CR_CRLF         0       // Convert \n to \r\n (+10 bytes)
+#define USE_XPRINTF    1       // Enable xprintf function (+194 bytes)
+#define USE_XSPRINTF   0       // Add xsprintf function (+78 bytes)
+#define USE_XFPRINTF   0       // Add xfprintf function (+54 bytes)
+#define USE_XATOI      0       // Enable xatoi function (+182 bytes)
+
+
+#if FLASHEND > 0x1FFFF
+#error xitoa module does not support 256K devices
+#endif
+
+.nolist
+#include <avr/io.h>    // Include device specific definitions.
+.list
+
+#ifdef SPM_PAGESIZE    // Recent devices have "lpm Rd,Z+" and "movw".
+.macro _LPMI   reg
+       lpm     \reg, Z+
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       movw    \dl, \sl
+.endm
+#else                  // Earlier devices do not have "lpm Rd,Z+" nor "movw".
+.macro _LPMI   reg
+       lpm
+       mov     \reg, r0
+       adiw    ZL, 1
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       mov     \dl, \sl
+       mov     \dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------
+; Stub function to forward to user output function
+;
+;Prototype: void xputc (char chr       // a character to be output
+;                      );
+;Size: 12/12 words
+
+.section .bss
+.global xfunc_out      ; xfunc_out must be initialized before using this module.
+xfunc_out:     .ds.w   1
+.section .text
+
+
+.func xputc
+.global xputc
+xputc:
+#if CR_CRLF
+       cpi     r24, 10         ;LF --> CRLF
+       brne    1f              ;
+       ldi     r24, 13         ;
+       rcall   1f              ;
+       ldi     r24, 10         ;/
+1:
+#endif
+       push    ZH
+       push    ZL
+       lds     ZL, xfunc_out+0 ;Pointer to the registered output function.
+       lds     ZH, xfunc_out+1 ;/
+       sbiw    ZL, 0           ;Skip if null
+       breq    2f              ;/
+       icall
+2:     pop     ZL
+       pop     ZH
+       ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------
+; Direct ROM string output
+;
+;Prototype: void xputs (const char *str_p // rom string to be output
+;                      );
+
+.func xputs
+.global xputs
+xputs:
+       _MOVW   ZH,ZL, r25,r24  ; Z = pointer to rom string
+1:     _LPMI   r24
+       cpi     r24, 0
+       breq    2f
+       rcall   xputc
+       rjmp    1b
+2:     ret
+.endfunc
+
+
+;---------------------------------------------------------------------------
+; Extended direct numeral string output (32bit version)
+;
+;Prototype: void xitoa (long value,    // value to be output
+;                       char radix,    // radix
+;                       char width);   // minimum width
+;
+
+.func xitoa
+.global xitoa
+xitoa:
+                               ;r25:r22 = value, r20 = base, r18 = digits
+       clr     r31             ;r31 = stack level
+       ldi     r30, ' '        ;r30 = sign
+       ldi     r19, ' '        ;r19 = filler
+       sbrs    r20, 7          ;When base indicates signd format and the value
+       rjmp    0f              ;is minus, add a '-'.
+       neg     r20             ;
+       sbrs    r25, 7          ;
+       rjmp    0f              ;
+       ldi     r30, '-'        ;
+       com     r22             ;
+       com     r23             ;
+       com     r24             ;
+       com     r25             ;
+       adc     r22, r1         ;
+       adc     r23, r1         ;
+       adc     r24, r1         ;
+       adc     r25, r1         ;/
+0:     sbrs    r18, 7          ;When digits indicates zero filled,
+       rjmp    1f              ;filler is '0'.
+       neg     r18             ;
+       ldi     r19, '0'        ;/
+                               ;----- string conversion loop
+1:     ldi     r21, 32         ;r26 = r25:r22 % r20
+       clr     r26             ;r25:r22 /= r20
+2:     lsl     r22             ;
+       rol     r23             ;
+       rol     r24             ;
+       rol     r25             ;
+       rol     r26             ;
+       cp      r26, r20        ;
+       brcs    3f              ;
+       sub     r26, r20        ;
+       inc     r22             ;
+3:     dec     r21             ;
+       brne    2b              ;/
+       cpi     r26, 10         ;r26 is a numeral digit '0'-'F'
+       brcs    4f              ;
+       subi    r26, -7         ;
+4:     subi    r26, -'0'       ;/
+       push    r26             ;Stack it
+       inc     r31             ;/
+       cp      r22, r1         ;Repeat until r25:r22 gets zero
+       cpc     r23, r1         ;
+       cpc     r24, r1         ;
+       cpc     r25, r1         ;
+       brne    1b              ;/
+
+       cpi     r30, '-'        ;Minus sign if needed
+       brne    5f              ;
+       push    r30             ;
+       inc     r31             ;/
+5:     cp      r31, r18        ;Filler
+       brcc    6f              ;
+       push    r19             ;
+       inc     r31             ;
+       rjmp    5b              ;/
+
+6:     pop     r24             ;Flush stacked digits and exit
+       rcall   xputc           ;
+       dec     r31             ;
+       brne    6b              ;/
+
+       ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Formatted string output (16/32bit version)
+;
+;Prototype:
+; void __xprintf (const char *format_p, ...);
+; void __xsprintf(char*, const char *format_p, ...);
+; void __xfprintf(void(*func)(char), const char *format_p, ...);
+;
+
+#if USE_XPRINTF
+
+.func xvprintf
+xvprintf:
+       ld      ZL, Y+          ;Z = pointer to format string
+       ld      ZH, Y+          ;/
+
+0:     _LPMI   r24             ;Get a format char
+       cpi     r24, 0          ;End of format string?
+       breq    90f             ;/
+       cpi     r24, '%'        ;Is format?
+       breq    20f             ;/
+1:     rcall   xputc           ;Put a normal character
+       rjmp    0b              ;/
+90:    ret
+
+20:    ldi     r18, 0          ;r18: digits
+       clt                     ;T: filler
+       _LPMI   r21             ;Get flags
+       cpi     r21, '%'        ;Is a %?
+       breq    1b              ;/
+       cpi     r21, '0'        ;Zero filled?
+       brne    23f             ;
+       set                     ;/
+22:    _LPMI   r21             ;Get width
+23:    cpi     r21, '9'+1      ;
+       brcc    24f             ;
+       subi    r21, '0'        ;
+       brcs    90b             ;
+       lsl     r18             ;
+       mov     r0, r18         ;
+       lsl     r18             ;
+       lsl     r18             ;
+       add     r18, r0         ;
+       add     r18, r21        ;
+       rjmp    22b             ;/
+
+24:    brtc    25f             ;get value (low word)
+       neg     r18             ;
+25:    ld      r24, Y+         ;
+       ld      r25, Y+         ;/
+       cpi     r21, 'c'        ;Is type character?
+       breq    1b              ;/
+       cpi     r21, 's'        ;Is type RAM string?
+       breq    50f             ;/
+       cpi     r21, 'S'        ;Is type ROM string?
+       breq    60f             ;/
+       _MOVW   r23,r22,r25,r24 ;r25:r22 = value
+       clr     r24             ;
+       clr     r25             ;
+       clt                     ;/
+       cpi     r21, 'l'        ;Is long int?
+       brne    26f             ;
+       ld      r24, Y+         ;get value (high word)
+       ld      r25, Y+         ;
+       set                     ;
+       _LPMI   r21             ;/
+26:    cpi     r21, 'd'        ;Is type signed decimal?
+       brne    27f             ;/
+       ldi     r20, -10        ;
+       brts    40f             ;
+       sbrs    r23, 7          ;
+       rjmp    40f             ;
+       ldi     r24, -1         ;
+       ldi     r25, -1         ;
+       rjmp    40f             ;/
+27:    cpi     r21, 'u'        ;Is type unsigned decimal?
+       ldi     r20, 10         ;
+       breq    40f             ;/
+       cpi     r21, 'X'        ;Is type hexdecimal?
+       ldi     r20, 16         ;
+       breq    40f             ;/
+       cpi     r21, 'b'        ;Is type binary?
+       ldi     r20, 2          ;
+       breq    40f             ;/
+       ret                     ;abort
+40:    push    ZH              ;Output the value
+       push    ZL              ;
+       rcall   xitoa           ;
+42:    pop     ZL              ;
+       pop     ZH              ;
+       rjmp    0b              ;/
+
+50:    push    ZH              ;Put a string on the RAM
+       push    ZL
+       _MOVW   ZH,ZL, r25,r24
+51:    ld      r24, Z+
+       cpi     r24, 0
+       breq    42b
+       rcall   xputc
+       rjmp    51b
+
+60:    push    ZH              ;Put a string on the ROM
+       push    ZL
+       rcall   xputs
+       rjmp    42b
+.endfunc
+
+
+.func __xprintf
+.global __xprintf
+__xprintf:
+       push    YH
+       push    YL
+       in      YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+       in      YH, _SFR_IO_ADDR(SPH)
+#else
+       clr     YH
+#endif
+       adiw    YL, 5           ;Y = pointer to arguments
+       rcall   xvprintf
+       pop     YL
+       pop     YH
+       ret
+.endfunc
+
+
+#if USE_XSPRINTF
+
+.func __xsprintf
+putram:
+       _MOVW   ZH,ZL, r15,r14
+       st      Z+, r24
+       _MOVW   r15,r14, ZH,ZL
+       ret
+.global __xsprintf
+__xsprintf:
+       push    YH
+       push    YL
+       in      YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+       in      YH, _SFR_IO_ADDR(SPH)
+#else
+       clr     YH
+#endif
+       adiw    YL, 5           ;Y = pointer to arguments
+       lds     ZL, xfunc_out+0 ;Save registered output function
+       lds     ZH, xfunc_out+1 ;
+       push    ZL              ;
+       push    ZH              ;/
+       ldi     ZL, lo8(pm(putram));Set local output function
+       ldi     ZH, hi8(pm(putram));
+       sts     xfunc_out+0, ZL ;
+       sts     xfunc_out+1, ZH ;/
+       push    r15             ;Initialize pointer to string buffer
+       push    r14             ;
+       ld      r14, Y+         ;
+       ld      r15, Y+         ;/
+       rcall   xvprintf
+       _MOVW   ZH,ZL, r15,r14  ;Terminate string
+       st      Z, r1           ;
+       pop     r14             ;
+       pop     r15             ;/
+       pop     ZH              ;Restore registered output function
+       pop     ZL              ;
+       sts     xfunc_out+0, ZL ;
+       sts     xfunc_out+1, ZH ;/
+       pop     YL
+       pop     YH
+       ret
+.endfunc
+#endif
+
+
+#if USE_XFPRINTF
+.func __xfprintf
+.global __xfprintf
+__xfprintf:
+       push    YH
+       push    YL
+       in      YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+       in      YH, _SFR_IO_ADDR(SPH)
+#else
+       clr     YH
+#endif
+       adiw    YL, 5           ;Y = pointer to arguments
+       lds     ZL, xfunc_out+0 ;Save registered output function
+       lds     ZH, xfunc_out+1 ;
+       push    ZL              ;
+       push    ZH              ;/
+       ld      ZL, Y+          ;Set output function
+       ld      ZH, Y+          ;
+       sts     xfunc_out+0, ZL ;
+       sts     xfunc_out+1, ZH ;/
+       rcall   xvprintf
+       pop     ZH              ;Restore registered output function
+       pop     ZL              ;
+       sts     xfunc_out+0, ZL ;
+       sts     xfunc_out+1, ZH ;/
+       pop     YL
+       pop     YH
+       ret
+.endfunc
+#endif
+
+#endif
+
+
+
+;---------------------------------------------------------------------------
+; Extended numeral string input
+;
+;Prototype:
+; char xatoi (           /* 1: Successful, 0: Failed */
+;      const char **str, /* pointer to pointer to source string */
+;      long *res         /* result */
+; );
+;
+
+
+#if USE_XATOI
+.func xatoi
+.global xatoi
+xatoi:
+       _MOVW   r1, r0, r23, r22
+       _MOVW   XH, XL, r25, r24
+       ld      ZL, X+
+       ld      ZH, X+
+       clr     r18             ;r21:r18 = 0;
+       clr     r19             ;
+       clr     r20             ;
+       clr     r21             ;/
+       clt                     ;T = 0;
+
+       ldi     r25, 10         ;r25 = 10;
+       rjmp    41f             ;/
+40:    adiw    ZL, 1           ;Z++;
+41:    ld      r22, Z          ;r22 = *Z;
+       cpi     r22, ' '        ;if(r22 == ' ') continue
+       breq    40b             ;/
+       brcs    70f             ;if(r22 < ' ') error;
+       cpi     r22, '-'        ;if(r22 == '-') {
+       brne    42f             ; T = 1;
+       set                     ; continue;
+       rjmp    40b             ;}
+42:    cpi     r22, '9'+1      ;if(r22 > '9') error;
+       brcc    70f             ;/
+       cpi     r22, '0'        ;if(r22 < '0') error;
+       brcs    70f             ;/
+       brne    51f             ;if(r22 > '0') cv_start;
+       ldi     r25, 8          ;r25 = 8;
+       adiw    ZL, 1           ;r22 = *(++Z);
+       ld      r22, Z          ;/
+       cpi     r22, ' '+1      ;if(r22 <= ' ') exit;
+       brcs    80f             ;/
+       cpi     r22, 'b'        ;if(r22 == 'b') {
+       brne    43f             ; r25 = 2;
+       ldi     r25, 2          ; cv_start;
+       rjmp    50f             ;}
+43:    cpi     r22, 'x'        ;if(r22 != 'x') error;
+       brne    51f             ;/
+       ldi     r25, 16         ;r25 = 16;
+
+50:    adiw    ZL, 1           ;Z++;
+       ld      r22, Z          ;r22 = *Z;
+51:    cpi     r22, ' '+1      ;if(r22 <= ' ') break;
+       brcs    80f             ;/
+       cpi     r22, 'a'        ;if(r22 >= 'a') r22 =- 0x20;
+       brcs    52f             ;
+       subi    r22, 0x20       ;/
+52:    subi    r22, '0'        ;if((r22 -= '0') < 0) error;
+       brcs    70f             ;/
+       cpi     r22, 10         ;if(r22 >= 10) {
+       brcs    53f             ; r22 -= 7;
+       subi    r22, 7          ; if(r22 < 10) 
+       cpi     r22, 10         ;
+       brcs    70f             ;}
+53:    cp      r22, r25        ;if(r22 >= r25) error;
+       brcc    70f             ;/
+60:    ldi     r24, 33         ;r21:r18 *= r25;
+       sub     r23, r23        ;
+61:    brcc    62f             ;
+       add     r23, r25        ;
+62:    lsr     r23             ;
+       ror     r21             ;
+       ror     r20             ;
+       ror     r19             ;
+       ror     r18             ;
+       dec     r24             ;
+       brne    61b             ;/
+       add     r18, r22        ;r21:r18 += r22;
+       adc     r19, r24        ;
+       adc     r20, r24        ;
+       adc     r21, r24        ;/
+       rjmp    50b             ;repeat
+
+70:    ldi     r24, 0
+       rjmp    81f
+80:    ldi     r24, 1
+81:    brtc    82f
+       clr     r22
+       com     r18
+       com     r19
+       com     r20
+       com     r21
+       adc     r18, r22
+       adc     r19, r22
+       adc     r20, r22
+       adc     r21, r22
+82:    st      -X, ZH
+       st      -X, ZL
+       _MOVW   XH, XL, r1, r0
+       st      X+, r18
+       st      X+, r19
+       st      X+, r20
+       st      X+, r21
+       clr     r1
+       ret
+.endfunc
+#endif
+
+
index 59c6f253123957e4aa7527c0bdc5b47d392563ef..08d9f93a0c1cc9a1c671ea456d3e9dd7bf6b1ac1 100644 (file)
-/*---------------------------------------------------------------------------\r
-   Extended itoa, puts and printf                    (C)ChaN, 2011\r
------------------------------------------------------------------------------*/\r
-\r
-#ifndef XPRINTF_H\r
-#define XPRINTF_H\r
-\r
-#include <inttypes.h>\r
-#include <avr/pgmspace.h>\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-\r
-extern void (*xfunc_out)(uint8_t);\r
-#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)\r
-\r
-/* This is a pointer to user defined output function. It must be initialized\r
-   before using this modle.\r
-*/\r
-\r
-void xputc(char chr);\r
-\r
-/* This is a stub function to forward outputs to user defined output function.\r
-   All outputs from this module are output via this function.\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-void xputs(const char *string_p);\r
-\r
-/*  The string placed in the ROM is forwarded to xputc() directly.\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-void xitoa(long value, char radix, char width);\r
-\r
-/* Extended itoa().\r
-\r
-      value  radix  width   output\r
-        100     10      6   "   100"\r
-        100     10     -6   "000100"\r
-        100     10      0   "100"\r
- 4294967295     10      0   "4294967295"\r
- 4294967295    -10      0   "-1"\r
-     655360     16     -8   "000A0000"\r
-       1024     16      0   "400"\r
-       0x55      2     -8   "01010101"\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)\r
-#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)\r
-#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)\r
-\r
-void __xprintf(const char *format_p, ...);     /* Send formatted string to the registered device */\r
-void __xsprintf(char*, const char *format_p, ...);     /* Put formatted string to the memory */\r
-void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */\r
-\r
-/* Format string is placed in the ROM. The format flags is similar to printf().\r
-\r
-   %[flag][width][size]type\r
-\r
-   flag\r
-     A '0' means filled with '0' when output is shorter than width.\r
-     ' ' is used in default. This is effective only numeral type.\r
-   width\r
-     Minimum width in decimal number. This is effective only numeral type.\r
-     Default width is zero.\r
-   size\r
-     A 'l' means the argument is long(32bit). Default is short(16bit).\r
-     This is effective only numeral type.\r
-   type\r
-     'c' : Character, argument is the value\r
-     's' : String placed on the RAM, argument is the pointer\r
-     'S' : String placed on the ROM, argument is the pointer\r
-     'd' : Signed decimal, argument is the value\r
-     'u' : Unsigned decimal, argument is the value\r
-     'X' : Hexdecimal, argument is the value\r
-     'b' : Binary, argument is the value\r
-     '%' : '%'\r
-\r
-*/\r
-\r
-\r
-/*-----------------------------------------------------------------------------*/\r
-char xatoi(char **str, long *ret);\r
-\r
-/* Get value of the numeral string. \r
-\r
-  str\r
-    Pointer to pointer to source string\r
-\r
-    "0b11001010" binary\r
-    "0377" octal\r
-    "0xff800" hexdecimal\r
-    "1250000" decimal\r
-    "-25000" decimal\r
-\r
-  ret\r
-    Pointer to return value\r
-*/\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif\r
-\r
+/*---------------------------------------------------------------------------
+   Extended itoa, puts and printf                    (C)ChaN, 2011
+-----------------------------------------------------------------------------*/
+
+#ifndef XPRINTF_H
+#define XPRINTF_H
+
+#include <inttypes.h>
+#include <avr/pgmspace.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void (*xfunc_out)(uint8_t);
+#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)
+
+/* This is a pointer to user defined output function. It must be initialized
+   before using this modle.
+*/
+
+void xputc(char chr);
+
+/* This is a stub function to forward outputs to user defined output function.
+   All outputs from this module are output via this function.
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+void xputs(const char *string_p);
+
+/*  The string placed in the ROM is forwarded to xputc() directly.
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+void xitoa(long value, char radix, char width);
+
+/* Extended itoa().
+
+      value  radix  width   output
+        100     10      6   "   100"
+        100     10     -6   "000100"
+        100     10      0   "100"
+ 4294967295     10      0   "4294967295"
+ 4294967295    -10      0   "-1"
+     655360     16     -8   "000A0000"
+       1024     16      0   "400"
+       0x55      2     -8   "01010101"
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)
+#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)
+#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)
+
+void __xprintf(const char *format_p, ...);     /* Send formatted string to the registered device */
+// void __xsprintf(char*, const char *format_p, ...);  /* Put formatted string to the memory */
+// void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */
+
+/* Format string is placed in the ROM. The format flags is similar to printf().
+
+   %[flag][width][size]type
+
+   flag
+     A '0' means filled with '0' when output is shorter than width.
+     ' ' is used in default. This is effective only numeral type.
+   width
+     Minimum width in decimal number. This is effective only numeral type.
+     Default width is zero.
+   size
+     A 'l' means the argument is long(32bit). Default is short(16bit).
+     This is effective only numeral type.
+   type
+     'c' : Character, argument is the value
+     's' : String placed on the RAM, argument is the pointer
+     'S' : String placed on the ROM, argument is the pointer
+     'd' : Signed decimal, argument is the value
+     'u' : Unsigned decimal, argument is the value
+     'X' : Hexdecimal, argument is the value
+     'b' : Binary, argument is the value
+     '%' : '%'
+
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+char xatoi(char **str, long *ret);
+
+/* Get value of the numeral string.
+
+  str
+    Pointer to pointer to source string
+
+    "0b11001010" binary
+    "0377" octal
+    "0xff800" hexdecimal
+    "1250000" decimal
+    "-25000" decimal
+
+  ret
+    Pointer to return value
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
index 6730a2a4aab44372c0357e3ff9e85c6846fb6cfa..2c6bcbae56fccafae40a627ce0e47ceb4fcce37c 100644 (file)
@@ -83,10 +83,6 @@ void bootmagic(void)
     }
     eeconfig_update_keymap(keymap_config.raw);
 
-#ifdef NKRO_ENABLE
-    keyboard_nkro = keymap_config.nkro;
-#endif
-
     /* default layer */
     uint8_t default_layer = 0;
     if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); }
index 084c9fe1555fac3b5d44d8a12c7f72da1d37865c..f3e1bf6234ec9e77868fb5f56aa91d72627db6b5 100644 (file)
@@ -34,6 +34,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "command.h"
 #include "backlight.h"
 #include "quantum.h"
+#include "version.h"
 
 #ifdef MOUSEKEY_ENABLE
 #include "mousekey.h"
@@ -180,7 +181,7 @@ static void print_version(void)
     print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") "
           "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") "
           "VER: " STR(DEVICE_VER) "\n");
-    print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n");
+    print("BUILD: " STR(QMK_VERSION) " (" __TIME__ " " __DATE__ ")\n");
 
     /* build options */
     print("OPTIONS:"
@@ -237,7 +238,7 @@ static void print_status(void)
     print_val_hex8(keyboard_protocol);
     print_val_hex8(keyboard_idle);
 #ifdef NKRO_ENABLE
-    print_val_hex8(keyboard_nkro);
+    print_val_hex8(keymap_config.nkro);
 #endif
     print_val_hex32(timer_read32());
 
@@ -260,7 +261,10 @@ static void print_status(void)
 #ifdef BOOTMAGIC_ENABLE
 static void print_eeconfig(void)
 {
-#ifndef NO_PRINT
+
+// Print these variables if NO_PRINT or USER_PRINT are not defined.
+#if !defined(NO_PRINT) && !defined(USER_PRINT)
+
     print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
 
     debug_config_t dc;
@@ -380,9 +384,6 @@ static bool command_common(uint8_t code)
                 debug_mouse    = true;
             } else {
                 print("\ndebug: off\n");
-                debug_matrix   = false;
-                debug_keyboard = false;
-                debug_mouse    = false;
             }
             break;
 
@@ -434,8 +435,8 @@ static bool command_common(uint8_t code)
                // NKRO toggle
         case MAGIC_KC(MAGIC_KEY_NKRO):
             clear_keyboard(); // clear to prevent stuck keys
-            keyboard_nkro = !keyboard_nkro;
-            if (keyboard_nkro) {
+            keymap_config.nkro = !keymap_config.nkro;
+            if (keymap_config.nkro) {
                 print("NKRO: on\n");
             } else {
                 print("NKRO: off\n");
@@ -570,7 +571,8 @@ static uint8_t mousekey_param = 0;
 
 static void mousekey_param_print(void)
 {
-#ifndef NO_PRINT
+// Print these variables if NO_PRINT or USER_PRINT are not defined.
+#if !defined(NO_PRINT) && !defined(USER_PRINT)
     print("\n\t- Values -\n");
     print("1: delay(*10ms): "); pdec(mk_delay); print("\n");
     print("2: interval(ms): "); pdec(mk_interval); print("\n");
index 11a05c2ddd74bba6f1af7db8e6550939f463a44b..e12b6221656f53173e13e3a4f2a14465b863470b 100644 (file)
@@ -22,11 +22,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "util.h"
 #include "debug.h"
 
-
-#ifdef NKRO_ENABLE
-bool keyboard_nkro = true;
-#endif
-
 static host_driver_t *driver;
 static uint16_t last_system_report = 0;
 static uint16_t last_consumer_report = 0;
index 9814b10d2d0855b9aeea6d6e4cdcd31794051bcf..aeabba7107133090dcc1699044e45d7d5335272d 100644 (file)
@@ -28,10 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 extern "C" {
 #endif
 
-#ifdef NKRO_ENABLE
-extern bool keyboard_nkro;
-#endif
-
 extern uint8_t keyboard_idle;
 extern uint8_t keyboard_protocol;
 
index c46a701b3bfd1dae174b2915e4ce60b3b9eedca4..371d93f3e59b755130b5afdb7fc8428e879d8bf9 100644 (file)
@@ -57,6 +57,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #   include "visualizer/visualizer.h"
 #endif
 
+
+
 #ifdef MATRIX_HAS_GHOST
 static bool has_ghost_in_row(uint8_t row)
 {
@@ -106,7 +108,7 @@ void keyboard_init(void) {
     rgblight_init();
 #endif
 #if defined(NKRO_ENABLE) && defined(FORCE_NKRO)
-       keyboard_nkro = true;
+    keymap_config.nkro = 1;
 #endif
 }
 
index 194e4cc0266cd67317a3a02367c1a392f5718570..49617a3d103f0d7f0dd30bd787445dd3ae3dab9f 100644 (file)
@@ -27,10 +27,6 @@ void magic(void)
     /* keymap config */
     keymap_config.raw = eeconfig_read_keymap();
 
-#ifdef NKRO_ENABLE
-    keyboard_nkro = keymap_config.nkro;
-#endif
-
     uint8_t default_layer = 0;
     default_layer = eeconfig_read_default_layer();
     default_layer_set((uint32_t)default_layer);
index 3647ece7513318feec06e7656db39734bfdc1181..b1aac2c99d1e2e1248c6b1f4285e9ffa39a9d14a 100644 (file)
@@ -7,7 +7,7 @@
 #define STRING_STACK_LIMIT    120
 
 //TODO
-int xprintf(const char* format, ...) { return 0; }
+int __xprintf(const char* format, ...) { return 0; }
 
 #if 0
 /* mbed Serial */
index 26bc529e5be547b7b0f09ddcca67ab1ffe252976..1e7a48c06dbe8c638dc4dd3456ef0bb3f40e601f 100644 (file)
@@ -7,7 +7,7 @@
 extern "C" {
 #endif
 
-int xprintf(const char *format, ...);
+int __xprintf(const char *format, ...);
 
 #ifdef __cplusplus
 }
index a1352527fce5a9f9a472669efe39f60dbf454f11..8836c0fc7cb38652ec94d1ab3979bf6c0142815a 100644 (file)
 
 #ifndef NO_PRINT
 
+#if defined(__AVR__) /* __AVR__ */
 
-#if defined(__AVR__)
+#  include "avr/xprintf.h"
 
-#include "avr/xprintf.h"
-#define print(s)    xputs(PSTR(s))
-#define println(s)  xputs(PSTR(s "\r\n"))
+#  ifdef USER_PRINT /* USER_PRINT */
 
-#ifdef __cplusplus
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    undef xprintf
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprint(s)          xputs(PSTR(s))
+#    define uprintln(s)        xputs(PSTR(s "\r\n"))
+#    define uprintf(fmt, ...)  __xprintf(PSTR(fmt), ##__VA_ARGS__)
+
+#  else /* NORMAL PRINT */
+
+// Create user & normal print defines
+#    define print(s)           xputs(PSTR(s))
+#    define println(s)         xputs(PSTR(s "\r\n"))
+#    define uprint(s)          print(s)
+#    define uprintln(s)        println(s)
+#    define uprintf(fmt, ...)  xprintf(fmt, ...)
+
+#  endif /* USER_PRINT / NORMAL PRINT */
+
+#  ifdef __cplusplus
 extern "C"
-#endif
+#  endif
+
 /* function pointer of sendchar to be used by print utility */
 void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 
-#elif defined(PROTOCOL_CHIBIOS) /* __AVR__ */
+#elif defined(PROTOCOL_CHIBIOS) /* PROTOCOL_CHIBIOS */
+
+#  include "chibios/printf.h"
+
+#  ifdef USER_PRINT /* USER_PRINT */
+
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprint(s)    printf(s)
+#    define uprintln(s)  printf(s "\r\n")
+#    define uprintf      printf
+
+#  else /* NORMAL PRINT */
+
+// Create user & normal print defines
+#    define print(s)     printf(s)
+#    define println(s)   printf(s "\r\n")
+#    define xprintf      printf
+#    define uprint(s)    printf(s)
+#    define uprintln(s)  printf(s "\r\n")
+#    define uprintf      printf
 
-#include "chibios/printf.h"
+#  endif /* USER_PRINT / NORMAL PRINT */
 
-#define print(s)    printf(s)
-#define println(s)  printf(s "\r\n")
-#define xprintf  printf
+#elif defined(__arm__) /* __arm__ */
 
-#elif defined(__arm__) /* __AVR__ */
+#  include "mbed/xprintf.h"
 
-#include "mbed/xprintf.h"
+#  ifdef USER_PRINT /* USER_PRINT */
 
-#define print(s)    xprintf(s)
-#define println(s)  xprintf(s "\r\n")
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprintf(fmt, ...)  __xprintf(fmt, ...)
+#    define uprint(s)          xprintf(s)
+#    define uprintln(s)        xprintf(s "\r\n")
+
+#  else /* NORMAL PRINT */
+
+// Create user & normal print defines
+#    define xprintf(fmt, ...)  __xprintf(fmt, ...)
+#    define print(s)           xprintf(s)
+#    define println(s)         xprintf(s "\r\n")
+#    define uprint(s)          print(s)
+#    define uprintln(s)        println(s)
+#    define uprintf(fmt, ...)  xprintf(fmt, ...)
+
+#  endif /* USER_PRINT / NORMAL PRINT */
 
 /* TODO: to select output destinations: UART/USBSerial */
-#define print_set_sendchar(func)
+#  define print_set_sendchar(func)
+
+#endif /* __AVR__ / PROTOCOL_CHIBIOS / __arm__ */
+
+// User print disables the normal print messages in the body of QMK/TMK code and
+// is meant as a lightweight alternative to NOPRINT. Use it when you only want to do
+// a spot of debugging but lack flash resources for allowing all of the codebase to
+// print (and store their wasteful strings).
+//
+// !!! DO NOT USE USER PRINT CALLS IN THE BODY OF QMK/TMK !!!
+//
+#ifdef USER_PRINT
 
-#endif /* __AVR__ */
+// Disable normal print
+#define print_dec(data)
+#define print_decs(data)
+#define print_hex4(data)
+#define print_hex8(data)
+#define print_hex16(data)
+#define print_hex32(data)
+#define print_bin4(data)
+#define print_bin8(data)
+#define print_bin16(data)
+#define print_bin32(data)
+#define print_bin_reverse8(data)
+#define print_bin_reverse16(data)
+#define print_bin_reverse32(data)
+#define print_val_dec(v)
+#define print_val_decs(v)
+#define print_val_hex8(v)
+#define print_val_hex16(v)
+#define print_val_hex32(v)
+#define print_val_bin8(v)
+#define print_val_bin16(v)
+#define print_val_bin32(v)
+#define print_val_bin_reverse8(v)
+#define print_val_bin_reverse16(v)
+#define print_val_bin_reverse32(v)
 
+#else /* NORMAL_PRINT */
 
+//Enable normal print
 /* decimal */
 #define print_dec(i)                xprintf("%u", i)
 #define print_decs(i)               xprintf("%d", i)
@@ -99,6 +199,39 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 #define print_val_bin_reverse16(v)  xprintf(#v ": %016b\n", bitrev16(v))
 #define print_val_bin_reverse32(v)  xprintf(#v ": %032lb\n", bitrev32(v))
 
+#endif /* USER_PRINT / NORMAL_PRINT */
+
+// User Print
+
+/* decimal */
+#define uprint_dec(i)               uprintf("%u", i)
+#define uprint_decs(i)              uprintf("%d", i)
+/* hex */
+#define uprint_hex4(i)              uprintf("%X", i)
+#define uprint_hex8(i)              uprintf("%02X", i)
+#define uprint_hex16(i)             uprintf("%04X", i)
+#define uprint_hex32(i)             uprintf("%08lX", i)
+/* binary */
+#define uprint_bin4(i)              uprintf("%04b", i)
+#define uprint_bin8(i)              uprintf("%08b", i)
+#define uprint_bin16(i)             uprintf("%016b", i)
+#define uprint_bin32(i)             uprintf("%032lb", i)
+#define uprint_bin_reverse8(i)      uprintf("%08b", bitrev(i))
+#define uprint_bin_reverse16(i)     uprintf("%016b", bitrev16(i))
+#define uprint_bin_reverse32(i)     uprintf("%032lb", bitrev32(i))
+/* print value utility */
+#define uprint_val_dec(v)           uprintf(#v ": %u\n", v)
+#define uprint_val_decs(v)          uprintf(#v ": %d\n", v)
+#define uprint_val_hex8(v)          uprintf(#v ": %X\n", v)
+#define uprint_val_hex16(v)         uprintf(#v ": %02X\n", v)
+#define uprint_val_hex32(v)         uprintf(#v ": %04lX\n", v)
+#define uprint_val_bin8(v)          uprintf(#v ": %08b\n", v)
+#define uprint_val_bin16(v)         uprintf(#v ": %016b\n", v)
+#define uprint_val_bin32(v)         uprintf(#v ": %032lb\n", v)
+#define uprint_val_bin_reverse8(v)  uprintf(#v ": %08b\n", bitrev(v))
+#define uprint_val_bin_reverse16(v) uprintf(#v ": %016b\n", bitrev16(v))
+#define uprint_val_bin_reverse32(v) uprintf(#v ": %032lb\n", bitrev32(v))
+
 #else   /* NO_PRINT */
 
 #define xprintf(fmt, ...)
@@ -143,5 +276,4 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 #define pbin_reverse(data)      print_bin_reverse8(data)
 #define pbin_reverse16(data)    print_bin_reverse16(data)
 
-
 #endif
diff --git a/tmk_core/native.mk b/tmk_core/native.mk
new file mode 100644 (file)
index 0000000..50232ee
--- /dev/null
@@ -0,0 +1,24 @@
+CC = gcc
+OBJCOPY = 
+OBJDUMP = 
+SIZE = 
+AR = 
+NM = 
+HEX = 
+EEP = 
+BIN =
+
+
+COMPILEFLAGS += -funsigned-char
+COMPILEFLAGS += -funsigned-bitfields
+COMPILEFLAGS += -ffunction-sections
+COMPILEFLAGS += -fdata-sections
+COMPILEFLAGS += -fshort-enums
+
+CFLAGS += $(COMPILEFLAGS)
+CFLAGS += -fno-inline-small-functions
+CFLAGS += -fno-strict-aliasing
+
+CPPFLAGS += $(COMPILEFLAGS)
+CPPFLAGS += -fno-exceptions
+CPPFLAGS += -std=gnu++11
\ No newline at end of file
index e2c9d9bf1415ad0fe9d946fb1d5116744938aa2f..d0c72c46c7c6fc6f85f3827901e8361a8400e589 100644 (file)
 #include "led.h"
 #endif
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 /* ---------------------------------------------------------
  *       Global interface variables and declarations
  * ---------------------------------------------------------
@@ -39,9 +45,6 @@ uint16_t keyboard_led_stats __attribute__((aligned(2))) = 0;
 volatile uint16_t keyboard_idle_count = 0;
 static virtual_timer_t keyboard_idle_timer;
 static void keyboard_idle_timer_cb(void *arg);
-#ifdef NKRO_ENABLE
-extern bool keyboard_nkro;
-#endif /* NKRO_ENABLE */
 
 report_keyboard_t keyboard_report_sent = {{0}};
 #ifdef MOUSE_ENABLE
@@ -943,8 +946,8 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         if((usbp->setup[4] == KBD_INTERFACE) && (usbp->setup[5] == 0)) {   /* wIndex */
           keyboard_protocol = ((usbp->setup[2]) != 0x00);   /* LSB(wValue) */
 #ifdef NKRO_ENABLE
-          keyboard_nkro = !!keyboard_protocol;
-          if(!keyboard_nkro && keyboard_idle) {
+          keymap_config.nkro = !!keyboard_protocol;
+          if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
           if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -962,7 +965,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         keyboard_idle = usbp->setup[3];     /* MSB(wValue) */
         /* arm the timer */
 #ifdef NKRO_ENABLE
-        if(!keyboard_nkro && keyboard_idle) {
+        if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
         if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1089,7 +1092,7 @@ static void keyboard_idle_timer_cb(void *arg) {
   }
 
 #ifdef NKRO_ENABLE
-  if(!keyboard_nkro && keyboard_idle) {
+  if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
   if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1122,7 +1125,7 @@ void send_keyboard(report_keyboard_t *report) {
   osalSysUnlock();
 
 #ifdef NKRO_ENABLE
-  if(keyboard_nkro) {  /* NKRO protocol */
+  if(keymap_config.nkro) {  /* NKRO protocol */
     /* need to wait until the previous packet has made it through */
     /* can rewrite this using the synchronous API, then would wait
      * until *after* the packet has been transmitted. I think
index 1b029096384df159b37019b2eeb0e40b237f7eb0..a873515e1041a6130a1ea9717b0b2e8830bf98e1 100644 (file)
-;---------------------------------------------------------------------------;\r
-; Software implemented UART module                                          ;\r
-; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;\r
-;---------------------------------------------------------------------------;\r
-; Bit rate settings:\r
-;\r
-;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz\r
-;   2.4kbps   138     -     -     -     -      -      -      -      -\r
-;   4.8kbps    68   138     -     -     -      -      -      -      -\r
-;   9.6kbps    33    68   138   208     -      -      -      -      -\r
-;  19.2kbps     -    33    68   102   138    173    208      -      -\r
-;  38.4kbps     -     -    33    50    68     85    102    138    172\r
-;  57.6kbps     -     -    21    33    44     56     68     91    114\r
-; 115.2kbps     -     -     -     -    21     27     33     44     56\r
-\r
-.nolist\r
-#include <avr/io.h>\r
-.list\r
-\r
-#define        BPS     102     /* Bit delay. (see above table) */\r
-#define        BIDIR   0       /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */\r
-\r
-#define        OUT_1           sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */\r
-#define        OUT_0           cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */\r
-#define        SKIP_IN_1       sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 1 */\r
-#define        SKIP_IN_0       sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 0 */\r
-\r
-\r
-\r
-#ifdef SPM_PAGESIZE\r
-.macro _LPMI   reg\r
-       lpm     \reg, Z+\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       movw    \dl, \sl\r
-.endm\r
-#else\r
-.macro _LPMI   reg\r
-       lpm\r
-       mov     \reg, r0\r
-       adiw    ZL, 1\r
-.endm\r
-.macro _MOVW   dh,dl, sh,sl\r
-       mov     \dl, \sl\r
-       mov     \dh, \sh\r
-.endm\r
-#endif\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Transmit a byte in serial format of N81\r
-;\r
-;Prototype: void xmit (uint8_t data);\r
-;Size: 16 words\r
-\r
-.global xmit\r
-.func xmit\r
-xmit:\r
-#if BIDIR\r
-       ldi     r23, BPS-1      ;Pre-idle time for bidirectional data line\r
-5:     dec     r23             ;\r
-       brne    5b              ;/\r
-#endif\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       com     r24             ;C = start bit\r
-       ldi     r25, 10         ;Bit counter\r
-       cli                     ;Start critical section\r
-\r
-1:     ldi     r23, BPS-1      ;----- Bit transferring loop \r
-2:     dec     r23             ;Wait for a bit time\r
-       brne    2b              ;/\r
-       brcs    3f              ;MISO = bit to be sent\r
-       OUT_1                   ;\r
-3:     brcc    4f              ;\r
-       OUT_0                   ;/\r
-4:     lsr     r24             ;Get next bit into C\r
-       dec     r25             ;All bits sent?\r
-       brne    1b              ;  no, coutinue\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
-\r
-\r
-\r
-;---------------------------------------------------------------------------;\r
-; Receive a byte\r
-;\r
-;Prototype: uint8_t rcvr (void);\r
-;Size: 19 words\r
-\r
-.global rcvr\r
-.func rcvr\r
-rcvr:\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       ldi     r24, 0x80       ;Receiving shift reg\r
-       cli                     ;Start critical section\r
-\r
-1:     SKIP_IN_1               ;Wait for idle\r
-       rjmp    1b\r
-2:     SKIP_IN_0               ;Wait for start bit\r
-       rjmp    2b\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-3:     dec     r25\r
-       brne    3b\r
-\r
-4:     ldi     r25, BPS        ;----- Bit receiving loop\r
-5:     dec     r25             ;Wait for a bit time\r
-       brne    5b              ;/\r
-       lsr     r24             ;Next bit\r
-       SKIP_IN_0               ;Get a data bit into r24.7\r
-       ori     r24, 0x80\r
-       brcc    4b              ;All bits received?  no, continue\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
-\r
-\r
-; Not wait for start bit. This should be called after detecting start bit.\r
-.global recv\r
-.func recv\r
-recv:\r
-       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags\r
-\r
-       ldi     r24, 0x80       ;Receiving shift reg\r
-       cli                     ;Start critical section\r
-\r
-;1:    SKIP_IN_1               ;Wait for idle\r
-;      rjmp    1b\r
-;2:    SKIP_IN_0               ;Wait for start bit\r
-;      rjmp    2b\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-3:     dec     r25\r
-       brne    3b\r
-\r
-4:     ldi     r25, BPS        ;----- Bit receiving loop\r
-5:     dec     r25             ;Wait for a bit time\r
-       brne    5b              ;/\r
-       lsr     r24             ;Next bit\r
-       SKIP_IN_0               ;Get a data bit into r24.7\r
-       ori     r24, 0x80\r
-       brcc    4b              ;All bits received?  no, continue\r
-\r
-       ldi     r25, BPS/2      ;Wait for half bit time\r
-6:     dec     r25\r
-       brne    6b\r
-7:     SKIP_IN_1               ;Wait for stop bit\r
-       rjmp    7b\r
-\r
-       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section\r
-       ret\r
-.endfunc\r
+;---------------------------------------------------------------------------;
+; Software implemented UART module                                          ;
+; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;
+;---------------------------------------------------------------------------;
+; Bit rate settings:
+;
+;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz
+;   2.4kbps   138     -     -     -     -      -      -      -      -
+;   4.8kbps    68   138     -     -     -      -      -      -      -
+;   9.6kbps    33    68   138   208     -      -      -      -      -
+;  19.2kbps     -    33    68   102   138    173    208      -      -
+;  38.4kbps     -     -    33    50    68     85    102    138    172
+;  57.6kbps     -     -    21    33    44     56     68     91    114
+; 115.2kbps     -     -     -     -    21     27     33     44     56
+
+.nolist
+#include <avr/io.h>
+.list
+
+#define        BPS     102     /* Bit delay. (see above table) */
+#define        BIDIR   0       /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */
+
+#define        OUT_1           sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */
+#define        OUT_0           cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */
+#define        SKIP_IN_1       sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 1 */
+#define        SKIP_IN_0       sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT   /* Skip if 0 */
+
+
+
+#ifdef SPM_PAGESIZE
+.macro _LPMI   reg
+       lpm     \reg, Z+
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       movw    \dl, \sl
+.endm
+#else
+.macro _LPMI   reg
+       lpm
+       mov     \reg, r0
+       adiw    ZL, 1
+.endm
+.macro _MOVW   dh,dl, sh,sl
+       mov     \dl, \sl
+       mov     \dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------;
+; Transmit a byte in serial format of N81
+;
+;Prototype: void xmit (uint8_t data);
+;Size: 16 words
+
+.global xmit
+.func xmit
+xmit:
+#if BIDIR
+       ldi     r23, BPS-1      ;Pre-idle time for bidirectional data line
+5:     dec     r23             ;
+       brne    5b              ;/
+#endif
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       com     r24             ;C = start bit
+       ldi     r25, 10         ;Bit counter
+       cli                     ;Start critical section
+
+1:     ldi     r23, BPS-1      ;----- Bit transferring loop 
+2:     dec     r23             ;Wait for a bit time
+       brne    2b              ;/
+       brcs    3f              ;MISO = bit to be sent
+       OUT_1                   ;
+3:     brcc    4f              ;
+       OUT_0                   ;/
+4:     lsr     r24             ;Get next bit into C
+       dec     r25             ;All bits sent?
+       brne    1b              ;  no, coutinue
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Receive a byte
+;
+;Prototype: uint8_t rcvr (void);
+;Size: 19 words
+
+.global rcvr
+.func rcvr
+rcvr:
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       ldi     r24, 0x80       ;Receiving shift reg
+       cli                     ;Start critical section
+
+1:     SKIP_IN_1               ;Wait for idle
+       rjmp    1b
+2:     SKIP_IN_0               ;Wait for start bit
+       rjmp    2b
+       ldi     r25, BPS/2      ;Wait for half bit time
+3:     dec     r25
+       brne    3b
+
+4:     ldi     r25, BPS        ;----- Bit receiving loop
+5:     dec     r25             ;Wait for a bit time
+       brne    5b              ;/
+       lsr     r24             ;Next bit
+       SKIP_IN_0               ;Get a data bit into r24.7
+       ori     r24, 0x80
+       brcc    4b              ;All bits received?  no, continue
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc
+
+
+; Not wait for start bit. This should be called after detecting start bit.
+.global recv
+.func recv
+recv:
+       in      r0, _SFR_IO_ADDR(SREG)  ;Save flags
+
+       ldi     r24, 0x80       ;Receiving shift reg
+       cli                     ;Start critical section
+
+;1:    SKIP_IN_1               ;Wait for idle
+;      rjmp    1b
+;2:    SKIP_IN_0               ;Wait for start bit
+;      rjmp    2b
+       ldi     r25, BPS/2      ;Wait for half bit time
+3:     dec     r25
+       brne    3b
+
+4:     ldi     r25, BPS        ;----- Bit receiving loop
+5:     dec     r25             ;Wait for a bit time
+       brne    5b              ;/
+       lsr     r24             ;Next bit
+       SKIP_IN_0               ;Get a data bit into r24.7
+       ori     r24, 0x80
+       brcc    4b              ;All bits received?  no, continue
+
+       ldi     r25, BPS/2      ;Wait for half bit time
+6:     dec     r25
+       brne    6b
+7:     SKIP_IN_1               ;Wait for stop bit
+       rjmp    7b
+
+       out     _SFR_IO_ADDR(SREG), r0  ;End of critical section
+       ret
+.endfunc
index 72725b998f0a27a7e90163a72f257e19e724b75a..7d92be069299159b563959b0c9b676a71febd8bf 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef SUART\r
-#define SUART\r
-\r
-void xmit(uint8_t);\r
-uint8_t rcvr(void);\r
-uint8_t recv(void);\r
-\r
-#endif /* SUART */\r
+#ifndef SUART
+#define SUART
+
+void xmit(uint8_t);
+uint8_t rcvr(void);
+uint8_t recv(void);
+
+#endif /* SUART */
index 99058f0331d260b7f7409294b90bbbc735f3ef7a..12395bf69649606da53e5202877fd306a6aeb896 100644 (file)
-/* This is from http://www.mtcnet.net/~henryvm/wdt/ */\r
-#ifndef _AVR_WD_H_\r
-#define _AVR_WD_H_\r
-\r
-#include <avr/io.h>\r
-\r
-/*\r
-Copyright (c) 2009, Curt Van Maanen\r
-\r
-Permission to use, copy, modify, and/or distribute this software for any\r
-purpose with or without fee is hereby granted, provided that the above\r
-copyright notice and this permission notice appear in all copies.\r
-\r
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r
-\r
-\r
-include usage-\r
-    #include "wd.h"             //if in same directory as project\r
-    #include <avr/wd.h>         //if wd.h is in avr directory\r
-\r
-set watchdog modes and prescale\r
-\r
-usage-\r
-    WD_SET(mode,[timeout]);     //prescale always set\r
-\r
-modes-\r
-    WD_OFF                      disabled\r
-    WD_RST                      normal reset mode\r
-    WD_IRQ                      interrupt only mode (if supported)\r
-    WD_RST_IRQ                  interrupt+reset mode (if supported)\r
-\r
-timeout-\r
-    WDTO_15MS                   default if no timeout provided\r
-    WDTO_30MS\r
-    WDTO_60MS\r
-    WDTO_120MS\r
-    WDTO_250MS\r
-    WDTO_500MS\r
-    WDTO_1S\r
-    WDTO_2S\r
-    WDTO_4S                     (if supported)\r
-    WDTO_8S                     (if supported)\r
-\r
-examples-\r
-    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout\r
-    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)\r
-    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)\r
-    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout\r
-    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout\r
-\r
-\r
-for enhanced watchdogs, if the watchdog is not being used WDRF should be\r
-cleared on every power up or reset, along with disabling the watchdog-\r
-    WD_DISABLE();               //clear WDRF, then turn off watchdog\r
-\r
-*/\r
-\r
-//reset registers to the same name (MCUCSR)\r
-#if !defined(MCUCSR)\r
-#define MCUCSR                  MCUSR\r
-#endif\r
-\r
-//watchdog registers to the same name (WDTCSR)\r
-#if !defined(WDTCSR)\r
-#define WDTCSR                  WDTCR\r
-#endif\r
-\r
-//if enhanced watchdog, define irq values, create disable macro\r
-#if defined(WDIF)\r
-#define WD_IRQ                  0xC0\r
-#define WD_RST_IRQ              0xC8\r
-#define WD_DISABLE()            do{                       \\r
-                                    MCUCSR &= ~(1<<WDRF); \\r
-                                    WD_SET(WD_OFF);       \\r
-                                }while(0)\r
-#endif\r
-\r
-//all watchdogs\r
-#define WD_RST                  8\r
-#define WD_OFF                  0\r
-\r
-//prescale values\r
-#define WDTO_15MS               0\r
-#define WDTO_30MS               1\r
-#define WDTO_60MS               2\r
-#define WDTO_120MS              3\r
-#define WDTO_250MS              4\r
-#define WDTO_500MS              5\r
-#define WDTO_1S                 6\r
-#define WDTO_2S                 7\r
-\r
-//prescale values for avrs with WDP3\r
-#if defined(WDP3)\r
-#define WDTO_4S                 0x20\r
-#define WDTO_8S                 0x21\r
-#endif\r
-\r
-//watchdog reset\r
-#define WDR()                   __asm__ __volatile__("wdr")\r
-\r
-//avr reset using watchdog\r
-#define WD_AVR_RESET()          do{                              \\r
-                                    __asm__ __volatile__("cli"); \\r
-                                    WD_SET_UNSAFE(WD_RST);       \\r
-                                    while(1);                    \\r
-                                }while(0)\r
-\r
-/*set the watchdog-\r
-1. save SREG\r
-2. turn off irq's\r
-3. reset watchdog timer\r
-4. enable watchdog change\r
-5. write watchdog value\r
-6. restore SREG (restoring irq status)\r
-*/\r
-#define WD_SET(val,...)                                 \\r
-    __asm__ __volatile__(                               \\r
-        "in __tmp_reg__,__SREG__"           "\n\t"      \\r
-        "cli"                               "\n\t"      \\r
-        "wdr"                               "\n\t"      \\r
-        "sts %[wdreg],%[wden]"              "\n\t"      \\r
-        "sts %[wdreg],%[wdval]"             "\n\t"      \\r
-        "out __SREG__,__tmp_reg__"          "\n\t"      \\r
-        :                                               \\r
-        : [wdreg] "M" (&WDTCSR),                        \\r
-          [wden]  "r" ((uint8_t)(0x18)),                \\r
-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \\r
-        : "r0"                                          \\r
-)\r
-\r
-/*set the watchdog when I bit in SREG known to be clear-\r
-1. reset watchdog timer\r
-2. enable watchdog change\r
-5. write watchdog value\r
-*/\r
-#define WD_SET_UNSAFE(val,...)                          \\r
-    __asm__ __volatile__(                               \\r
-        "wdr"                               "\n\t"      \\r
-        "sts %[wdreg],%[wden]"              "\n\t"      \\r
-        "sts %[wdreg],%[wdval]"             "\n\t"      \\r
-        :                                               \\r
-        : [wdreg] "M" (&WDTCSR),                        \\r
-          [wden]  "r" ((uint8_t)(0x18)),                \\r
-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \\r
-)\r
-\r
-\r
-//for compatibility with avr/wdt.h\r
-#define wdt_enable(val) WD_SET(WD_RST,val)\r
-#define wdt_disable()   WD_SET(WD_OFF)\r
-\r
-\r
-#endif /* _AVR_WD_H_ */\r
+/* This is from http://www.mtcnet.net/~henryvm/wdt/ */
+#ifndef _AVR_WD_H_
+#define _AVR_WD_H_
+
+#include <avr/io.h>
+
+/*
+Copyright (c) 2009, Curt Van Maanen
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+include usage-
+    #include "wd.h"             //if in same directory as project
+    #include <avr/wd.h>         //if wd.h is in avr directory
+
+set watchdog modes and prescale
+
+usage-
+    WD_SET(mode,[timeout]);     //prescale always set
+
+modes-
+    WD_OFF                      disabled
+    WD_RST                      normal reset mode
+    WD_IRQ                      interrupt only mode (if supported)
+    WD_RST_IRQ                  interrupt+reset mode (if supported)
+
+timeout-
+    WDTO_15MS                   default if no timeout provided
+    WDTO_30MS
+    WDTO_60MS
+    WDTO_120MS
+    WDTO_250MS
+    WDTO_500MS
+    WDTO_1S
+    WDTO_2S
+    WDTO_4S                     (if supported)
+    WDTO_8S                     (if supported)
+
+examples-
+    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout
+    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)
+    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)
+    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout
+    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout
+
+
+for enhanced watchdogs, if the watchdog is not being used WDRF should be
+cleared on every power up or reset, along with disabling the watchdog-
+    WD_DISABLE();               //clear WDRF, then turn off watchdog
+
+*/
+
+//reset registers to the same name (MCUCSR)
+#if !defined(MCUCSR)
+#define MCUCSR                  MCUSR
+#endif
+
+//watchdog registers to the same name (WDTCSR)
+#if !defined(WDTCSR)
+#define WDTCSR                  WDTCR
+#endif
+
+//if enhanced watchdog, define irq values, create disable macro
+#if defined(WDIF)
+#define WD_IRQ                  0xC0
+#define WD_RST_IRQ              0xC8
+#define WD_DISABLE()            do{                       \
+                                    MCUCSR &= ~(1<<WDRF); \
+                                    WD_SET(WD_OFF);       \
+                                }while(0)
+#endif
+
+//all watchdogs
+#define WD_RST                  8
+#define WD_OFF                  0
+
+//prescale values
+#define WDTO_15MS               0
+#define WDTO_30MS               1
+#define WDTO_60MS               2
+#define WDTO_120MS              3
+#define WDTO_250MS              4
+#define WDTO_500MS              5
+#define WDTO_1S                 6
+#define WDTO_2S                 7
+
+//prescale values for avrs with WDP3
+#if defined(WDP3)
+#define WDTO_4S                 0x20
+#define WDTO_8S                 0x21
+#endif
+
+//watchdog reset
+#define WDR()                   __asm__ __volatile__("wdr")
+
+//avr reset using watchdog
+#define WD_AVR_RESET()          do{                              \
+                                    __asm__ __volatile__("cli"); \
+                                    WD_SET_UNSAFE(WD_RST);       \
+                                    while(1);                    \
+                                }while(0)
+
+/*set the watchdog-
+1. save SREG
+2. turn off irq's
+3. reset watchdog timer
+4. enable watchdog change
+5. write watchdog value
+6. restore SREG (restoring irq status)
+*/
+#define WD_SET(val,...)                                 \
+    __asm__ __volatile__(                               \
+        "in __tmp_reg__,__SREG__"           "\n\t"      \
+        "cli"                               "\n\t"      \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        "out __SREG__,__tmp_reg__"          "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+        : "r0"                                          \
+)
+
+/*set the watchdog when I bit in SREG known to be clear-
+1. reset watchdog timer
+2. enable watchdog change
+5. write watchdog value
+*/
+#define WD_SET_UNSAFE(val,...)                          \
+    __asm__ __volatile__(                               \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+)
+
+
+//for compatibility with avr/wdt.h
+#define wdt_enable(val) WD_SET(WD_RST,val)
+#define wdt_disable()   WD_SET(WD_OFF)
+
+
+#endif /* _AVR_WD_H_ */
index 72f3ff04c7448e57def3eeedf88ead79f1f02376..02e7063c66cf4c1e91a99d71efe30dbd9064fae1 100644 (file)
-<asf xmlversion="1.0">\r
-       <project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">\r
-               <require idref="lufa.bootloaders.cdc"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">\r
-               <require idref="lufa.bootloaders.cdc"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb647"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">\r
-               <require idref="lufa.bootloaders.cdc"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega32u4"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">\r
-               <require idref="lufa.bootloaders.cdc"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega16u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">\r
-               <require idref="lufa.bootloaders.cdc"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega8u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">\r
-               <info type="description" value="summary">\r
-               CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="Bootloaders"/>\r
-                       <keyword value="USB Device"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="include-path" value="."/>\r
-               <build type="c-source" value="BootloaderCDC.c"/>\r
-               <build type="header-file" value="BootloaderCDC.h"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-               <build type="c-source" value="BootloaderAPI.c"/>\r
-               <build type="header-file" value="BootloaderAPI.h"/>\r
-               <build type="asm-source" value="BootloaderAPITable.S"/>\r
-\r
-               <build type="module-config" subtype="path" value="Config"/>\r
-               <build type="header-file" value="Config/LUFAConfig.h"/>\r
-               <build type="header-file" value="Config/AppConfig.h"/>\r
-\r
-               <build type="distribute" subtype="user-file" value="doxyfile"/>\r
-               <build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>\r
-               <build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-               <require idref="lufa.drivers.board.leds"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">
+               <require idref="lufa.bootloaders.cdc"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">
+               <require idref="lufa.bootloaders.cdc"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb647"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">
+               <require idref="lufa.bootloaders.cdc"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega32u4"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">
+               <require idref="lufa.bootloaders.cdc"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega16u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">
+               <require idref="lufa.bootloaders.cdc"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega8u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">
+               <info type="description" value="summary">
+               CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="Bootloaders"/>
+                       <keyword value="USB Device"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="include-path" value="."/>
+               <build type="c-source" value="BootloaderCDC.c"/>
+               <build type="header-file" value="BootloaderCDC.h"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="Descriptors.h"/>
+               <build type="c-source" value="BootloaderAPI.c"/>
+               <build type="header-file" value="BootloaderAPI.h"/>
+               <build type="asm-source" value="BootloaderAPITable.S"/>
+
+               <build type="module-config" subtype="path" value="Config"/>
+               <build type="header-file" value="Config/LUFAConfig.h"/>
+               <build type="header-file" value="Config/AppConfig.h"/>
+
+               <build type="distribute" subtype="user-file" value="doxyfile"/>
+               <build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>
+               <build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+               <require idref="lufa.drivers.board.leds"/>
+       </module>
+</asf>
index 6f3312b764dc3ec2dca5c375828ab29be52a2a9d..f56aba69f5bae8bb3f0a918997bcb99387a5f245 100644 (file)
-<asf xmlversion="1.0">\r
-       <project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">\r
-               <require idref="lufa.bootloaders.dfu"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">\r
-               <require idref="lufa.bootloaders.dfu"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb647"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">\r
-               <require idref="lufa.bootloaders.dfu"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega32u4"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">\r
-               <require idref="lufa.bootloaders.dfu"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega16u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">\r
-               <require idref="lufa.bootloaders.dfu"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega8u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">\r
-               <info type="description" value="summary">\r
-               DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="Bootloaders"/>\r
-                       <keyword value="USB Device"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="include-path" value="."/>\r
-               <build type="c-source" value="BootloaderDFU.c"/>\r
-               <build type="header-file" value="BootloaderDFU.h"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-               <build type="c-source" value="BootloaderAPI.c"/>\r
-               <build type="header-file" value="BootloaderAPI.h"/>\r
-               <build type="asm-source" value="BootloaderAPITable.S"/>\r
-\r
-               <build type="module-config" subtype="path" value="Config"/>\r
-               <build type="header-file" value="Config/LUFAConfig.h"/>\r
-               <build type="header-file" value="Config/AppConfig.h"/>\r
-\r
-               <build type="distribute" subtype="user-file" value="doxyfile"/>\r
-               <build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-               <require idref="lufa.drivers.board.leds"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">
+               <require idref="lufa.bootloaders.dfu"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">
+               <require idref="lufa.bootloaders.dfu"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb647"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">
+               <require idref="lufa.bootloaders.dfu"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega32u4"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">
+               <require idref="lufa.bootloaders.dfu"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega16u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">
+               <require idref="lufa.bootloaders.dfu"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega8u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">
+               <info type="description" value="summary">
+               DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="Bootloaders"/>
+                       <keyword value="USB Device"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="include-path" value="."/>
+               <build type="c-source" value="BootloaderDFU.c"/>
+               <build type="header-file" value="BootloaderDFU.h"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="Descriptors.h"/>
+               <build type="c-source" value="BootloaderAPI.c"/>
+               <build type="header-file" value="BootloaderAPI.h"/>
+               <build type="asm-source" value="BootloaderAPITable.S"/>
+
+               <build type="module-config" subtype="path" value="Config"/>
+               <build type="header-file" value="Config/LUFAConfig.h"/>
+               <build type="header-file" value="Config/AppConfig.h"/>
+
+               <build type="distribute" subtype="user-file" value="doxyfile"/>
+               <build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+               <require idref="lufa.drivers.board.leds"/>
+       </module>
+</asf>
index 9394b13530b1a95d233890973a1aaee1df816318..c67b9419edf8719169952510c24ce13bbb789475 100644 (file)
-<asf xmlversion="1.0">\r
-       <project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">\r
-               <require idref="lufa.bootloaders.hid"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>\r
-       </project>\r
-\r
-       <project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">\r
-               <require idref="lufa.bootloaders.hid"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb647"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>\r
-       </project>\r
-\r
-       <project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">\r
-               <require idref="lufa.bootloaders.hid"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega32u4"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>\r
-       </project>\r
-\r
-       <project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">\r
-               <require idref="lufa.bootloaders.hid"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega16u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x3800"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>\r
-       </project>\r
-\r
-       <project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">\r
-               <require idref="lufa.bootloaders.hid"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega8u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1800"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">\r
-               <info type="description" value="summary">\r
-               HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="Bootloaders"/>\r
-                       <keyword value="USB Device"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="include-path" value="."/>\r
-               <build type="c-source" value="BootloaderHID.c"/>\r
-               <build type="header-file" value="BootloaderHID.h"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-\r
-               <build type="module-config" subtype="path" value="Config"/>\r
-               <build type="header-file" value="Config/LUFAConfig.h"/>\r
-\r
-               <build type="distribute" subtype="user-file" value="doxyfile"/>\r
-               <build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>\r
-               <build type="distribute" subtype="directory" value="HostLoaderApp"/>\r
-               <build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-               <require idref="lufa.drivers.board.leds"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">
+               <require idref="lufa.bootloaders.hid"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+       </project>
+
+       <project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">
+               <require idref="lufa.bootloaders.hid"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb647"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+       </project>
+
+       <project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">
+               <require idref="lufa.bootloaders.hid"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega32u4"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+       </project>
+
+       <project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">
+               <require idref="lufa.bootloaders.hid"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega16u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x3800"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>
+       </project>
+
+       <project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">
+               <require idref="lufa.bootloaders.hid"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega8u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1800"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>
+       </project>
+
+       <module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">
+               <info type="description" value="summary">
+               HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="Bootloaders"/>
+                       <keyword value="USB Device"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="include-path" value="."/>
+               <build type="c-source" value="BootloaderHID.c"/>
+               <build type="header-file" value="BootloaderHID.h"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="Descriptors.h"/>
+
+               <build type="module-config" subtype="path" value="Config"/>
+               <build type="header-file" value="Config/LUFAConfig.h"/>
+
+               <build type="distribute" subtype="user-file" value="doxyfile"/>
+               <build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>
+               <build type="distribute" subtype="directory" value="HostLoaderApp"/>
+               <build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+               <require idref="lufa.drivers.board.leds"/>
+       </module>
+</asf>
index 6844d4b01c808537d3be8215fcc08c5b7e13cca7..91fc949666a63881b403e9f67028b2602765a3f3 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2014.\r
-\r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this\r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in\r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
-  software without specific, written prior permission.\r
-\r
-  The author disclaims all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-#if AUX_BOOT_SECTION_SIZE > 0\r
-#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).\r
-\r
-; Trampoline to jump over the AUX bootloader section to the start of the bootloader,\r
-; on devices where an AUX bootloader section is used.\r
-.section .boot_aux_trampoline, "ax"\r
-.global Boot_AUX_Trampoline\r
-Boot_AUX_Trampoline:\r
-       jmp BOOT_START_ADDR\r
-#endif\r
-\r
-; Trampolines to actual API implementations if the target address is outside the\r
-; range of a rjmp instruction (can happen with large bootloader sections)\r
-.section .apitable_trampolines, "ax"\r
-.global BootloaderAPI_Trampolines\r
-BootloaderAPI_Trampolines:\r
-\r
-       BootloaderAPI_ErasePage_Trampoline:\r
-               jmp BootloaderAPI_ErasePage\r
-       BootloaderAPI_WritePage_Trampoline:\r
-               jmp BootloaderAPI_WritePage\r
-       BootloaderAPI_FillWord_Trampoline:\r
-               jmp BootloaderAPI_FillWord\r
-       BootloaderAPI_ReadSignature_Trampoline:\r
-               jmp BootloaderAPI_ReadSignature\r
-       BootloaderAPI_ReadFuse_Trampoline:\r
-               jmp BootloaderAPI_ReadFuse\r
-       BootloaderAPI_ReadLock_Trampoline:\r
-               jmp BootloaderAPI_ReadLock\r
-       BootloaderAPI_WriteLock_Trampoline:\r
-               jmp BootloaderAPI_WriteLock\r
-       BootloaderAPI_UNUSED1:\r
-               ret\r
-       BootloaderAPI_UNUSED2:\r
-               ret\r
-       BootloaderAPI_UNUSED3:\r
-               ret\r
-       BootloaderAPI_UNUSED4:\r
-               ret\r
-       BootloaderAPI_UNUSED5:\r
-               ret\r
-\r
-\r
-\r
-; API function jump table\r
-.section .apitable_jumptable, "ax"\r
-.global BootloaderAPI_JumpTable\r
-BootloaderAPI_JumpTable:\r
-\r
-       rjmp BootloaderAPI_ErasePage_Trampoline\r
-       rjmp BootloaderAPI_WritePage_Trampoline\r
-       rjmp BootloaderAPI_FillWord_Trampoline\r
-       rjmp BootloaderAPI_ReadSignature_Trampoline\r
-       rjmp BootloaderAPI_ReadFuse_Trampoline\r
-       rjmp BootloaderAPI_ReadLock_Trampoline\r
-       rjmp BootloaderAPI_WriteLock_Trampoline\r
-       rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1\r
-       rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2\r
-       rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3\r
-       rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4\r
-       rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5\r
-\r
-\r
-\r
-; Bootloader table signatures and information\r
-.section .apitable_signatures, "ax"\r
-.global BootloaderAPI_Signatures\r
-BootloaderAPI_Signatures:\r
-\r
-       .long BOOT_START_ADDR ; Start address of the bootloader\r
-       .word 0xDF30 ; Signature for the MS class bootloader, V1\r
-       .word 0xDCFB ; Signature for a LUFA class bootloader\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if AUX_BOOT_SECTION_SIZE > 0
+#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).
+
+; Trampoline to jump over the AUX bootloader section to the start of the bootloader,
+; on devices where an AUX bootloader section is used.
+.section .boot_aux_trampoline, "ax"
+.global Boot_AUX_Trampoline
+Boot_AUX_Trampoline:
+       jmp BOOT_START_ADDR
+#endif
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+       BootloaderAPI_ErasePage_Trampoline:
+               jmp BootloaderAPI_ErasePage
+       BootloaderAPI_WritePage_Trampoline:
+               jmp BootloaderAPI_WritePage
+       BootloaderAPI_FillWord_Trampoline:
+               jmp BootloaderAPI_FillWord
+       BootloaderAPI_ReadSignature_Trampoline:
+               jmp BootloaderAPI_ReadSignature
+       BootloaderAPI_ReadFuse_Trampoline:
+               jmp BootloaderAPI_ReadFuse
+       BootloaderAPI_ReadLock_Trampoline:
+               jmp BootloaderAPI_ReadLock
+       BootloaderAPI_WriteLock_Trampoline:
+               jmp BootloaderAPI_WriteLock
+       BootloaderAPI_UNUSED1:
+               ret
+       BootloaderAPI_UNUSED2:
+               ret
+       BootloaderAPI_UNUSED3:
+               ret
+       BootloaderAPI_UNUSED4:
+               ret
+       BootloaderAPI_UNUSED5:
+               ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+       rjmp BootloaderAPI_ErasePage_Trampoline
+       rjmp BootloaderAPI_WritePage_Trampoline
+       rjmp BootloaderAPI_FillWord_Trampoline
+       rjmp BootloaderAPI_ReadSignature_Trampoline
+       rjmp BootloaderAPI_ReadFuse_Trampoline
+       rjmp BootloaderAPI_ReadLock_Trampoline
+       rjmp BootloaderAPI_WriteLock_Trampoline
+       rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+       rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+       rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+       rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+       rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+       .long BOOT_START_ADDR ; Start address of the bootloader
+       .word 0xDF30 ; Signature for the MS class bootloader, V1
+       .word 0xDCFB ; Signature for a LUFA class bootloader
index f1d550d1eba5432c3f096d8457451d0d09e1a8ef..700ffa26ffb707968e62b0ea5dd25028649f347d 100644 (file)
-<asf xmlversion="1.0">\r
-       <project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">\r
-               <require idref="lufa.bootloaders.mass_storage"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1E000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>\r
-\r
-               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">\r
-               <require idref="lufa.bootloaders.mass_storage"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb647"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0xE000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>\r
-\r
-               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">\r
-               <require idref="lufa.bootloaders.mass_storage"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega32u4"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>\r
-\r
-               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">\r
-               <require idref="lufa.bootloaders.mass_storage"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega16u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>\r
-\r
-               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">\r
-               <info type="description" value="summary">\r
-               Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="Bootloaders"/>\r
-                       <keyword value="USB Device"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="include-path" value="."/>\r
-               <build type="c-source" value="BootloaderMassStorage.c"/>\r
-               <build type="header-file" value="BootloaderMassStorage.h"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-               <build type="c-source" value="BootloaderAPI.c"/>\r
-               <build type="header-file" value="BootloaderAPI.h"/>\r
-               <build type="asm-source" value="BootloaderAPITable.S"/>\r
-\r
-               <build type="module-config" subtype="path" value="Config"/>\r
-               <build type="header-file" value="Config/LUFAConfig.h"/>\r
-               <build type="header-file" value="Config/AppConfig.h"/>\r
-\r
-               <build type="include-path" value="Lib"/>\r
-               <build type="header-file" value="Lib/VirtualFAT.h"/>\r
-               <build type="c-source" value="Lib/VirtualFAT.c"/>\r
-               <build type="header-file" value="Lib/SCSI.h"/>\r
-               <build type="c-source" value="Lib/SCSI.c"/>\r
-\r
-               <build type="distribute" subtype="user-file" value="doxyfile"/>\r
-               <build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-               <require idref="lufa.drivers.board.leds"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">
+               <require idref="lufa.bootloaders.mass_storage"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1E000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>
+
+               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">
+               <require idref="lufa.bootloaders.mass_storage"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb647"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0xE000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>
+
+               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">
+               <require idref="lufa.bootloaders.mass_storage"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega32u4"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>
+               <build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">
+               <require idref="lufa.bootloaders.mass_storage"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega16u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+               <build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>
+               <build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">
+               <info type="description" value="summary">
+               Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="Bootloaders"/>
+                       <keyword value="USB Device"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="include-path" value="."/>
+               <build type="c-source" value="BootloaderMassStorage.c"/>
+               <build type="header-file" value="BootloaderMassStorage.h"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="Descriptors.h"/>
+               <build type="c-source" value="BootloaderAPI.c"/>
+               <build type="header-file" value="BootloaderAPI.h"/>
+               <build type="asm-source" value="BootloaderAPITable.S"/>
+
+               <build type="module-config" subtype="path" value="Config"/>
+               <build type="header-file" value="Config/LUFAConfig.h"/>
+               <build type="header-file" value="Config/AppConfig.h"/>
+
+               <build type="include-path" value="Lib"/>
+               <build type="header-file" value="Lib/VirtualFAT.h"/>
+               <build type="c-source" value="Lib/VirtualFAT.c"/>
+               <build type="header-file" value="Lib/SCSI.h"/>
+               <build type="c-source" value="Lib/SCSI.c"/>
+
+               <build type="distribute" subtype="user-file" value="doxyfile"/>
+               <build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+               <require idref="lufa.drivers.board.leds"/>
+       </module>
+</asf>
index 91bb4038e8ee67c85013af866e5c13d2b945f9ab..a0edb2c4f5032c293c35defd4665588624a9123e 100644 (file)
@@ -1,68 +1,68 @@
-#\r
-#             LUFA Library\r
-#     Copyright (C) Dean Camera, 2014.\r
-#\r
-#  dean [at] fourwalledcubicle [dot] com\r
-#           www.lufa-lib.org\r
-#\r
-# --------------------------------------\r
-#         LUFA Project Makefile.\r
-# --------------------------------------\r
-\r
-# Run "make help" for target help.\r
-\r
-MCU          = at90usb1287\r
-ARCH         = AVR8\r
-BOARD        = USBKEY\r
-F_CPU        = 8000000\r
-F_USB        = $(F_CPU)\r
-OPTIMIZATION = s\r
-TARGET       = BootloaderMassStorage\r
-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)\r
-LUFA_PATH    = ../../LUFA\r
-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)\r
-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)\r
-\r
-# Flash size and bootloader section sizes of the target, in KB. These must\r
-# match the target's total FLASH size and the bootloader size set in the\r
-# device's fuses.\r
-FLASH_SIZE_KB         = 128\r
-BOOT_SECTION_SIZE_KB  = 8\r
-\r
-# Bootloader address calculation formulas\r
-# Do not modify these macros, but rather modify the dependent values above.\r
-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )\r
-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )\r
-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )\r
-\r
-# Bootloader linker section flags for relocating the API table sections to\r
-# known FLASH addresses - these should not normally be user-edited.\r
-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))\r
-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)\r
-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)\r
-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)\r
-\r
-# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the\r
-# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum\r
-# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.\r
-ifeq ($(BOOT_SECTION_SIZE_KB),8)\r
-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0\r
-else\r
-  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))\r
-\r
-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'\r
-  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))\r
-  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)\r
-endif\r
-\r
-# Default target\r
-all:\r
-\r
-# Include LUFA build script makefiles\r
-include $(LUFA_PATH)/Build/lufa_core.mk\r
-include $(LUFA_PATH)/Build/lufa_sources.mk\r
-include $(LUFA_PATH)/Build/lufa_build.mk\r
-include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
-include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
-include $(LUFA_PATH)/Build/lufa_avrdude.mk\r
-include $(LUFA_PATH)/Build/lufa_atprogram.mk\r
+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderMassStorage
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the
+# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum
+# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.
+ifeq ($(BOOT_SECTION_SIZE_KB),8)
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0
+else
+  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))
+
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'
+  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))
+  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)
+endif
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
index ec499b74e5a8c39932aecfffda535bf0a1f43b7c..88c51da8257c93f2313014145f1f69a1ac9235ce 100644 (file)
@@ -1,91 +1,91 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2014.\r
-\r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this\r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in\r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
-  software without specific, written prior permission.\r
-\r
-  The author disclaims all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-; Trampolines to actual API implementations if the target address is outside the\r
-; range of a rjmp instruction (can happen with large bootloader sections)\r
-.section .apitable_trampolines, "ax"\r
-.global BootloaderAPI_Trampolines\r
-BootloaderAPI_Trampolines:\r
-\r
-       BootloaderAPI_ErasePage_Trampoline:\r
-               jmp BootloaderAPI_ErasePage\r
-       BootloaderAPI_WritePage_Trampoline:\r
-               jmp BootloaderAPI_WritePage\r
-       BootloaderAPI_FillWord_Trampoline:\r
-               jmp BootloaderAPI_FillWord\r
-       BootloaderAPI_ReadSignature_Trampoline:\r
-               jmp BootloaderAPI_ReadSignature\r
-       BootloaderAPI_ReadFuse_Trampoline:\r
-               jmp BootloaderAPI_ReadFuse\r
-       BootloaderAPI_ReadLock_Trampoline:\r
-               jmp BootloaderAPI_ReadLock\r
-       BootloaderAPI_WriteLock_Trampoline:\r
-               jmp BootloaderAPI_WriteLock\r
-       BootloaderAPI_UNUSED1:\r
-               ret\r
-       BootloaderAPI_UNUSED2:\r
-               ret\r
-       BootloaderAPI_UNUSED3:\r
-               ret\r
-       BootloaderAPI_UNUSED4:\r
-               ret\r
-       BootloaderAPI_UNUSED5:\r
-               ret\r
-\r
-\r
-\r
-; API function jump table\r
-.section .apitable_jumptable, "ax"\r
-.global BootloaderAPI_JumpTable\r
-BootloaderAPI_JumpTable:\r
-\r
-       rjmp BootloaderAPI_ErasePage_Trampoline\r
-       rjmp BootloaderAPI_WritePage_Trampoline\r
-       rjmp BootloaderAPI_FillWord_Trampoline\r
-       rjmp BootloaderAPI_ReadSignature_Trampoline\r
-       rjmp BootloaderAPI_ReadFuse_Trampoline\r
-       rjmp BootloaderAPI_ReadLock_Trampoline\r
-       rjmp BootloaderAPI_WriteLock_Trampoline\r
-       rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1\r
-       rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2\r
-       rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3\r
-       rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4\r
-       rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5\r
-\r
-\r
-\r
-; Bootloader table signatures and information\r
-.section .apitable_signatures, "ax"\r
-.global BootloaderAPI_Signatures\r
-BootloaderAPI_Signatures:\r
-\r
-       .long BOOT_START_ADDR ; Start address of the bootloader\r
-       .word 0xDF20 ; Signature for the Printer class bootloader\r
-       .word 0xDCFB ; Signature for a LUFA class bootloader\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+       BootloaderAPI_ErasePage_Trampoline:
+               jmp BootloaderAPI_ErasePage
+       BootloaderAPI_WritePage_Trampoline:
+               jmp BootloaderAPI_WritePage
+       BootloaderAPI_FillWord_Trampoline:
+               jmp BootloaderAPI_FillWord
+       BootloaderAPI_ReadSignature_Trampoline:
+               jmp BootloaderAPI_ReadSignature
+       BootloaderAPI_ReadFuse_Trampoline:
+               jmp BootloaderAPI_ReadFuse
+       BootloaderAPI_ReadLock_Trampoline:
+               jmp BootloaderAPI_ReadLock
+       BootloaderAPI_WriteLock_Trampoline:
+               jmp BootloaderAPI_WriteLock
+       BootloaderAPI_UNUSED1:
+               ret
+       BootloaderAPI_UNUSED2:
+               ret
+       BootloaderAPI_UNUSED3:
+               ret
+       BootloaderAPI_UNUSED4:
+               ret
+       BootloaderAPI_UNUSED5:
+               ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+       rjmp BootloaderAPI_ErasePage_Trampoline
+       rjmp BootloaderAPI_WritePage_Trampoline
+       rjmp BootloaderAPI_FillWord_Trampoline
+       rjmp BootloaderAPI_ReadSignature_Trampoline
+       rjmp BootloaderAPI_ReadFuse_Trampoline
+       rjmp BootloaderAPI_ReadLock_Trampoline
+       rjmp BootloaderAPI_WriteLock_Trampoline
+       rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+       rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+       rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+       rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+       rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+       .long BOOT_START_ADDR ; Start address of the bootloader
+       .word 0xDF20 ; Signature for the Printer class bootloader
+       .word 0xDCFB ; Signature for a LUFA class bootloader
index 86a56911ede5f058aeadf47ffd6cffd46949bc1e..b5c0c6b3a5d86acefabb383143a568d1d594771f 100644 (file)
-<asf xmlversion="1.0">\r
-       <project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">\r
-               <require idref="lufa.bootloaders.printer"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">\r
-               <require idref="lufa.bootloaders.printer"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="at90usb647"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">\r
-               <require idref="lufa.bootloaders.printer"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega32u4"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">\r
-               <require idref="lufa.bootloaders.printer"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega16u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">\r
-               <require idref="lufa.bootloaders.printer"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8"/>\r
-\r
-               <device-support value="atmega8u2"/>\r
-               <config name="lufa.drivers.board.name" value="none"/>\r
-\r
-               <config name="config.compiler.optimization.level" value="size"/>\r
-\r
-               <build type="define" name="F_CPU" value="16000000UL"/>\r
-               <build type="define" name="F_USB" value="16000000UL"/>\r
-\r
-               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>\r
-\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>\r
-               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>\r
-               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">\r
-               <info type="description" value="summary">\r
-               Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="Bootloaders"/>\r
-                       <keyword value="USB Device"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="include-path" value="."/>\r
-               <build type="c-source" value="BootloaderPrinter.c"/>\r
-               <build type="header-file" value="BootloaderPrinter.h"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-               <build type="c-source" value="BootloaderAPI.c"/>\r
-               <build type="header-file" value="BootloaderAPI.h"/>\r
-               <build type="asm-source" value="BootloaderAPITable.S"/>\r
-\r
-               <build type="module-config" subtype="path" value="Config"/>\r
-               <build type="header-file" value="Config/LUFAConfig.h"/>\r
-\r
-               <build type="distribute" subtype="user-file" value="doxyfile"/>\r
-               <build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-               <require idref="lufa.drivers.board.leds"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">
+               <require idref="lufa.bootloaders.printer"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">
+               <require idref="lufa.bootloaders.printer"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="at90usb647"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">
+               <require idref="lufa.bootloaders.printer"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega32u4"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">
+               <require idref="lufa.bootloaders.printer"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega16u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">
+               <require idref="lufa.bootloaders.printer"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8"/>
+
+               <device-support value="atmega8u2"/>
+               <config name="lufa.drivers.board.name" value="none"/>
+
+               <config name="config.compiler.optimization.level" value="size"/>
+
+               <build type="define" name="F_CPU" value="16000000UL"/>
+               <build type="define" name="F_USB" value="16000000UL"/>
+
+               <build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+               <build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+               <build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+       </project>
+
+       <module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">
+               <info type="description" value="summary">
+               Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="Bootloaders"/>
+                       <keyword value="USB Device"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="include-path" value="."/>
+               <build type="c-source" value="BootloaderPrinter.c"/>
+               <build type="header-file" value="BootloaderPrinter.h"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="Descriptors.h"/>
+               <build type="c-source" value="BootloaderAPI.c"/>
+               <build type="header-file" value="BootloaderAPI.h"/>
+               <build type="asm-source" value="BootloaderAPITable.S"/>
+
+               <build type="module-config" subtype="path" value="Config"/>
+               <build type="header-file" value="Config/LUFAConfig.h"/>
+
+               <build type="distribute" subtype="user-file" value="doxyfile"/>
+               <build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+               <require idref="lufa.drivers.board.leds"/>
+       </module>
+</asf>
index 0716c3bbe8804b56336604b7bcdabf0dca949dbf..0db035de3b84db98c243eecd4287f28ed2e02331 100644 (file)
@@ -1,55 +1,55 @@
-#\r
-#             LUFA Library\r
-#     Copyright (C) Dean Camera, 2014.\r
-#\r
-#  dean [at] fourwalledcubicle [dot] com\r
-#           www.lufa-lib.org\r
-#\r
-# --------------------------------------\r
-#         LUFA Project Makefile.\r
-# --------------------------------------\r
-\r
-# Run "make help" for target help.\r
-\r
-MCU          = at90usb1287\r
-ARCH         = AVR8\r
-BOARD        = USBKEY\r
-F_CPU        = 8000000\r
-F_USB        = $(F_CPU)\r
-OPTIMIZATION = s\r
-TARGET       = BootloaderPrinter\r
-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)\r
-LUFA_PATH    = ../../LUFA\r
-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)\r
-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)\r
-\r
-# Flash size and bootloader section sizes of the target, in KB. These must\r
-# match the target's total FLASH size and the bootloader size set in the\r
-# device's fuses.\r
-FLASH_SIZE_KB         = 128\r
-BOOT_SECTION_SIZE_KB  = 8\r
-\r
-# Bootloader address calculation formulas\r
-# Do not modify these macros, but rather modify the dependent values above.\r
-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )\r
-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )\r
-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )\r
-\r
-# Bootloader linker section flags for relocating the API table sections to\r
-# known FLASH addresses - these should not normally be user-edited.\r
-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))\r
-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)\r
-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)\r
-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)\r
-\r
-# Default target\r
-all:\r
-\r
-# Include LUFA build script makefiles\r
-include $(LUFA_PATH)/Build/lufa_core.mk\r
-include $(LUFA_PATH)/Build/lufa_sources.mk\r
-include $(LUFA_PATH)/Build/lufa_build.mk\r
-include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
-include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
-include $(LUFA_PATH)/Build/lufa_avrdude.mk\r
-include $(LUFA_PATH)/Build/lufa_atprogram.mk\r
+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderPrinter
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
index 9fd188c936fc1b343758c44181fff9252a920d01..e839ba6b1d985775d5dd1e3cafec5bd41d7a7568 100644 (file)
@@ -1,42 +1,42 @@
-#\r
-#             LUFA Library\r
-#     Copyright (C) Dean Camera, 2014.\r
-#\r
-#  dean [at] fourwalledcubicle [dot] com\r
-#           www.lufa-lib.org\r
-#\r
-# --------------------------------------\r
-#         LUFA Project Makefile.\r
-# --------------------------------------\r
-\r
-# Run "make help" for target help.\r
-\r
-MCU          = at90usb1287\r
-ARCH         = AVR8\r
-F_CPU        = 1000000\r
-F_USB        = $(F_CPU)\r
-OPTIMIZATION = s\r
-TARGET       = HID_EEPROM_Loader\r
-SRC          = $(TARGET).c\r
-LUFA_PATH    = ../../../LUFA\r
-CC_FLAGS     =\r
-LD_FLAGS     =\r
-OBJECT_FILES = InputEEData.o\r
-\r
-# Default target\r
-all:\r
-\r
-# Determine the AVR sub-architecture of the build main application object file\r
-FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)\r
-\r
-# Create a linkable object file with the input binary EEPROM data stored in the FLASH section\r
-InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)\r
-       @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"\r
-       avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@\r
-\r
-# Include LUFA build script makefiles\r
-include $(LUFA_PATH)/Build/lufa_core.mk\r
-include $(LUFA_PATH)/Build/lufa_build.mk\r
-include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
-include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
-include $(LUFA_PATH)/Build/lufa_hid.mk\r
+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+F_CPU        = 1000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = HID_EEPROM_Loader
+SRC          = $(TARGET).c
+LUFA_PATH    = ../../../LUFA
+CC_FLAGS     =
+LD_FLAGS     =
+OBJECT_FILES = InputEEData.o
+
+# Default target
+all:
+
+# Determine the AVR sub-architecture of the build main application object file
+FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)
+
+# Create a linkable object file with the input binary EEPROM data stored in the FLASH section
+InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)
+       @echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"
+       avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_hid.mk
index fd65db283facc5ec6899ccf5e5bf84e3e2c84627..e952714e16b39088ae6137587dba7d882172e815 100644 (file)
@@ -1,55 +1,55 @@
-<asf xmlversion="1.0">\r
-       <project caption="USB Device Template" id="lufa.templates.device.project.avr8">\r
-               <require idref="lufa.templates.device"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8_template"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="usbkey"/>\r
-\r
-               <build type="define" name="F_CPU" value="8000000UL"/>\r
-               <build type="define" name="F_USB" value="8000000UL"/>\r
-       </project>\r
-\r
-       <project caption="USB Device Template" id="lufa.templates.device.project.xmega">\r
-               <require idref="lufa.templates.device"/>\r
-               <require idref="lufa.boards.dummy.xmega"/>\r
-               <generator value="as5_8_template"/>\r
-\r
-               <device-support value="atxmega256a3bu"/>\r
-               <config name="lufa.drivers.board.name" value="a3bu_xplained"/>\r
-\r
-               <build type="define" name="F_CPU" value="32000000UL"/>\r
-               <build type="define" name="F_USB" value="48000000UL"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.templates.device" caption="USB Device Template">\r
-               <info type="description" value="summary">\r
-               Template for a LUFA USB device mode application.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="USB Device"/>\r
-                       <keyword value="Template Projects"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="c-source" value="DeviceApplication.c"/>\r
-               <build type="c-source" value="Descriptors.c"/>\r
-               <build type="header-file" value="DeviceApplication.h"/>\r
-               <build type="header-file" value="Descriptors.h"/>\r
-\r
-               <build type="module-config" subtype="path" value=".."/>\r
-               <build type="header-file" value="../LUFAConfig.h"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="USB Device Template" id="lufa.templates.device.project.avr8">
+               <require idref="lufa.templates.device"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8_template"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="usbkey"/>
+
+               <build type="define" name="F_CPU" value="8000000UL"/>
+               <build type="define" name="F_USB" value="8000000UL"/>
+       </project>
+
+       <project caption="USB Device Template" id="lufa.templates.device.project.xmega">
+               <require idref="lufa.templates.device"/>
+               <require idref="lufa.boards.dummy.xmega"/>
+               <generator value="as5_8_template"/>
+
+               <device-support value="atxmega256a3bu"/>
+               <config name="lufa.drivers.board.name" value="a3bu_xplained"/>
+
+               <build type="define" name="F_CPU" value="32000000UL"/>
+               <build type="define" name="F_USB" value="48000000UL"/>
+       </project>
+
+       <module type="application" id="lufa.templates.device" caption="USB Device Template">
+               <info type="description" value="summary">
+               Template for a LUFA USB device mode application.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="USB Device"/>
+                       <keyword value="Template Projects"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="c-source" value="DeviceApplication.c"/>
+               <build type="c-source" value="Descriptors.c"/>
+               <build type="header-file" value="DeviceApplication.h"/>
+               <build type="header-file" value="Descriptors.h"/>
+
+               <build type="module-config" subtype="path" value=".."/>
+               <build type="header-file" value="../LUFAConfig.h"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+       </module>
+</asf>
index c1996ec7114aed39ec3e1627966d2044fb2c9569..c3860c056d3e4450bbf04901b222bd4f5905f168 100644 (file)
@@ -1,41 +1,41 @@
-<asf xmlversion="1.0">\r
-       <project caption="USB Host Template" id="lufa.templates.host.project">\r
-               <require idref="lufa.templates.host"/>\r
-               <require idref="lufa.boards.dummy.avr8"/>\r
-               <generator value="as5_8_template"/>\r
-\r
-               <device-support value="at90usb1287"/>\r
-               <config name="lufa.drivers.board.name" value="usbkey"/>\r
-\r
-               <build type="define" name="F_CPU" value="8000000UL"/>\r
-               <build type="define" name="F_USB" value="8000000UL"/>\r
-       </project>\r
-\r
-       <module type="application" id="lufa.templates.host" caption="USB Host Template">\r
-               <info type="description" value="summary">\r
-               Template for a LUFA USB host mode application.\r
-               </info>\r
-\r
-               <info type="gui-flag" value="move-to-root"/>\r
-\r
-               <info type="keyword" value="Technology">\r
-                       <keyword value="USB Host"/>\r
-                       <keyword value="Template Projects"/>\r
-               </info>\r
-\r
-               <device-support-alias value="lufa_avr8"/>\r
-               <device-support-alias value="lufa_xmega"/>\r
-               <device-support-alias value="lufa_uc3"/>\r
-\r
-               <build type="c-source" value="HostApplication.c"/>\r
-               <build type="header-file" value="HostApplication.h"/>\r
-\r
-               <build type="module-config" subtype="path" value=".."/>\r
-               <build type="header-file" value="../LUFAConfig.h"/>\r
-\r
-               <require idref="lufa.common"/>\r
-               <require idref="lufa.platform"/>\r
-               <require idref="lufa.drivers.usb"/>\r
-               <require idref="lufa.drivers.board"/>\r
-       </module>\r
-</asf>\r
+<asf xmlversion="1.0">
+       <project caption="USB Host Template" id="lufa.templates.host.project">
+               <require idref="lufa.templates.host"/>
+               <require idref="lufa.boards.dummy.avr8"/>
+               <generator value="as5_8_template"/>
+
+               <device-support value="at90usb1287"/>
+               <config name="lufa.drivers.board.name" value="usbkey"/>
+
+               <build type="define" name="F_CPU" value="8000000UL"/>
+               <build type="define" name="F_USB" value="8000000UL"/>
+       </project>
+
+       <module type="application" id="lufa.templates.host" caption="USB Host Template">
+               <info type="description" value="summary">
+               Template for a LUFA USB host mode application.
+               </info>
+
+               <info type="gui-flag" value="move-to-root"/>
+
+               <info type="keyword" value="Technology">
+                       <keyword value="USB Host"/>
+                       <keyword value="Template Projects"/>
+               </info>
+
+               <device-support-alias value="lufa_avr8"/>
+               <device-support-alias value="lufa_xmega"/>
+               <device-support-alias value="lufa_uc3"/>
+
+               <build type="c-source" value="HostApplication.c"/>
+               <build type="header-file" value="HostApplication.h"/>
+
+               <build type="module-config" subtype="path" value=".."/>
+               <build type="header-file" value="../LUFAConfig.h"/>
+
+               <require idref="lufa.common"/>
+               <require idref="lufa.platform"/>
+               <require idref="lufa.drivers.usb"/>
+               <require idref="lufa.drivers.board"/>
+       </module>
+</asf>
index 7ddfa1be3f8879c82af354b1d878072a81f7bc6f..0ae1dd678f3d5c852f7a6d635e70db70fc36213c 100644 (file)
-/** \file\r
- *\r
- *  This file contains special DoxyGen information for the generation of the main page and other special\r
- *  documentation pages. It is not a project source file.\r
- */\r
-\r
-/** \page Page_BuildSystem The LUFA Build System\r
- *\r
- *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System\r
- *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which\r
- *  can be referenced in a LUFA powered project, to minimize the amount of code required in an\r
- *  application makefile. The system is written in GNU Make, and each module is independent of\r
- *  one-another.\r
- *\r
- *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA\r
- *  build system, see \ref Sec_CompilingApps_Prerequisites.\r
- *\r
- *  To use a LUFA build system module, simply add an include to your project makefile. All user projects\r
- *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_core.mk\r
- *  \endcode\r
- *\r
- *  Once included in your project makefile, the associated build module targets will be added to your\r
- *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>\r
- *  from the command line, substituting in the appropriate target name.\r
- *\r
- *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.\r
- *\r
- *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>\r
- *  be supplied in the project makefile for the module to work, and one or more optional parameters which\r
- *  may be defined and which will assume a sensible default if not.\r
- *\r
- *  \section SSec_BuildSystem_Modules Available Modules\r
- *\r
- *  The following modules are included in this LUFA release:\r
- *\r
- *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming\r
- *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming\r
- *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking\r
- *  \li \subpage Page_BuildModule_CORE - Core Build System Functions\r
- *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis\r
- *  \li \subpage Page_BuildModule_DFU - Device Programming\r
- *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation\r
- *  \li \subpage Page_BuildModule_HID - Device Programming\r
- *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables\r
- *\r
- *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.\r
- */\r
-\r
- /** \page Page_BuildModule_BUILD The BUILD build module\r
- *\r
- *  The BUILD LUFA build system module, providing targets for the compilation,\r
- *  assembling and linking of an application from source code into binary files\r
- *  suitable for programming into a target device, using the GCC compiler.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_build.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_BUILD_Requirements Requirements\r
- *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your\r
- *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio\r
- *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.\r
- *\r
- *  \section SSec_BuildModule_BUILD_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>size</tt></td>\r
- *    <td>Display size of the compiled application FLASH and SRAM segments.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>symbol-sizes</tt></td>\r
- *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>lib</tt></td>\r
- *    <td>Build and archive all source files into a library A binary file.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>all</tt></td>\r
- *    <td>Build and link the application into ELF debug and HEX binary files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>elf</tt></td>\r
- *    <td>Build and link the application into an ELF debug file.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>bin</tt></td>\r
- *    <td>Build and link the application and produce a BIN binary file.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>hex</tt></td>\r
- *    <td>Build and link the application and produce HEX and EEP binary files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>lss</tt></td>\r
- *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>clean</tt></td>\r
- *    <td>Remove all intermediary files and binary output files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>mostlyclean</tt></td>\r
- *    <td>Remove all intermediary files but preserve any binary output files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>\r
- *    <td>Create an assembly listing of a given input C/C++ source file.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>TARGET</tt></td>\r
- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>ARCH</tt></td>\r
- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>MCU</tt></td>\r
- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>SRC</tt></td>\r
- *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>F_USB</tt></td>\r
- *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_PATH</tt></td>\r
- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>BOARD</tt></td>\r
- *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>OPTIMIZATION</tt></td>\r
- *    <td>Optimization level to use when compiling source files (see GCC manual).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>C_STANDARD</tt></td>\r
- *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPP_STANDARD</tt></td>\r
- *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>DEBUG_FORMAT</tt></td>\r
- *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>DEBUG_LEVEL</tt></td>\r
- *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>F_CPU</tt></td>\r
- *    <td>Speed of the processor CPU clock, in Hz.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>C_FLAGS</tt></td>\r
- *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPP_FLAGS</tt></td>\r
- *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>ASM_FLAGS</tt></td>\r
- *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CC_FLAGS</tt></td>\r
- *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>COMPILER_PATH</tt></td>\r
- *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LD_FLAGS</tt></td>\r
- *    <td>Flags to pass to the linker, after the automatically generated flags.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LINKER_RELAXATIONS</tt></td>\r
- *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size\r
- *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.\r
- *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you\r
- *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>OBJDIR</tt></td>\r
- *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.\r
- *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>OBJECT_FILES</tt></td>\r
- *    <td>List of additional object files that should be linked into the resulting binary.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
-/** \page Page_BuildModule_CORE The CORE build module\r
- *\r
- *  The core LUFA build system module, providing common build system help and information targets.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_core.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_CORE_Requirements Requirements\r
- *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>\r
- *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).\r
- *\r
- *  \section SSec_BuildModule_CORE_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>help</tt></td>\r
- *    <td>Display build system help and configuration information.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_targets</tt></td>\r
- *    <td>List all available build targets from the build system.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_modules</tt></td>\r
- *    <td>List all available build modules from the build system.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_mandatory</tt></td>\r
- *    <td>List all mandatory parameters required by the included modules.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_optional</tt></td>\r
- *    <td>List all optional parameters required by the included modules.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_provided</tt></td>\r
- *    <td>List all variables provided by the included modules.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>list_macros</tt></td>\r
- *    <td>List all macros provided by the included modules.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
-/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module\r
- *\r
- *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an\r
- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_atprogram.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements\r
- *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>\r
- *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x\r
- *  inside the application install folder's "\atbackend" subdirectory.\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>atprogram</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>atprogram-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>MCU</tt></td>\r
- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>TARGET</tt></td>\r
- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>\r
- *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>ATPROGRAM_INTERFACE</tt></td>\r
- *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>ATPROGRAM_PORT</tt></td>\r
- *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
-/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module\r
- *\r
- *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an\r
- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_avrdude.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements\r
- *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>\r
- *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for\r
- *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's\r
- *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>avrdude</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>avrdude-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>MCU</tt></td>\r
- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>TARGET</tt></td>\r
- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>\r
- *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>AVRDUDE_PORT</tt></td>\r
- *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>AVRDUDE_FLAGS</tt></td>\r
- *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
- /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module\r
- *\r
- *  The CPPCHECK programming utility LUFA build system module, providing targets to statically\r
- *  analyze C and C++ source code for errors and performance/style issues.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements\r
- *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>\r
- *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page\r
- *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via\r
- *  the project's source code or through the package manager.\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>cppcheck</tt></td>\r
- *    <td>Statically analyze the project source code for issues.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>cppcheck-config</tt></td>\r
- *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>SRC</tt></td>\r
- *    <td>List of source files to statically analyze.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_INCLUDES</tt></td>\r
- *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_EXCLUDES</tt></td>\r
- *    <td>Paths or path fragments to exclude when analyzing.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>\r
- *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_ENABLE</tt></td>\r
- *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_SUPPRESS</tt></td>\r
- *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>\r
- *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_QUIET</tt></td>\r
- *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>CPPCHECK_FLAGS</tt></td>\r
- *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
- /** \page Page_BuildModule_DFU The DFU build module\r
- *\r
- *  The DFU programming utility LUFA build system module, providing targets to reprogram an\r
- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.\r
- *  This module requires a DFU class bootloader to be running in the target, compatible with\r
- *  the DFU bootloader protocol as published by Atmel.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_dfu.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_DFU_Requirements Requirements\r
- *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open\r
- *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be\r
- *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility\r
- *  can be installed via the project's source code or through the package manager.\r
- *\r
- *  \section SSec_BuildModule_DFU_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>dfu</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>dfu-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>flip</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>flip-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>MCU</tt></td>\r
- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>TARGET</tt></td>\r
- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
- /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module\r
- *\r
- *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate\r
- *  project HTML and other format documentation from a set of source files that include special\r
- *  Doxygen comments.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_doxygen.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements\r
- *  This module requires the <tt>doxygen</tt> utility from the Doxygen website\r
- *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix\r
- *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through\r
- *  the package manager.\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>doxygen</tt></td>\r
- *    <td>Generate project documentation.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>doxygen_create</tt></td>\r
- *    <td>Create a new Doxygen configuration file using the latest template.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>doxygen_upgrade</tt></td>\r
- *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>LUFA_PATH</tt></td>\r
- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>DOXYGEN_CONF</tt></td>\r
- *    <td>Name and path of the base Doxygen configuration file for the project.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>\r
- *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>\r
- *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
- /** \page Page_BuildModule_HID The HID build module\r
- *\r
- *  The HID programming utility LUFA build system module, providing targets to reprogram an\r
- *  Atmel processor's FLASH memory with a project's compiled binary output file. This module\r
- *  requires a HID class bootloader to be running in the target, using a protocol compatible\r
- *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_hid.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_HID_Requirements Requirements\r
- *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID\r
- *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC\r
- *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>\r
- *  variable.\r
- *\r
- *  \section SSec_BuildModule_HID_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>hid</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>hid-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and\r
- *        a temporary AVR application programmed into the target's FLASH.\r
- *        \note This will erase the currently loaded application in the target.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>teensy</tt></td>\r
- *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>teensy-ee</tt></td>\r
- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and\r
- *        a temporary AVR application programmed into the target's FLASH.\r
- *        \note This will erase the currently loaded application in the target.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>MCU</tt></td>\r
- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>TARGET</tt></td>\r
- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
- /** \page Page_BuildModule_SOURCES The SOURCES build module\r
- *\r
- *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files\r
- *  required to be build by a project for a given LUFA module. This module gives a way to reference\r
- *  LUFA source files symbolically, so that changes to the library structure do not break the library\r
- *  makefile.\r
- *\r
- *  To use this module in your application makefile, add the following code:\r
- *  \code\r
- *  include $(LUFA_PATH)/Build/lufa_sources.mk\r
- *  \endcode\r
- *\r
- *  \section SSec_BuildModule_SOURCES_Requirements Requirements\r
- *  None.\r
- *\r
- *  \section SSec_BuildModule_SOURCES_Targets Targets\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>LUFA_PATH</tt></td>\r
- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>ARCH</tt></td>\r
- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_USB</tt></td>\r
- *    <td>List of LUFA USB driver source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_USBCLASS</tt></td>\r
- *    <td>List of LUFA USB Class driver source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>\r
- *    <td>List of LUFA temperature sensor driver source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_SERIAL</tt></td>\r
- *    <td>List of LUFA Serial U(S)ART driver source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_TWI</tt></td>\r
- *    <td>List of LUFA TWI driver source files.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td><tt>LUFA_SRC_PLATFORM</tt></td>\r
- *    <td>List of LUFA architecture specific platform management source files.</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros\r
- *\r
- *  <table>\r
- *   <tr>\r
- *    <td><i>None</i></td>\r
- *   </tr>\r
- *  </table>\r
- */\r
-\r
-/** \page Page_BuildTroubleshooting Troubleshooting Information\r
- *\r
- *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these\r
- *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different\r
- *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.\r
- *\r
- *  <table>\r
- *    <tr>\r
- *    <th>Problem</th>\r
- *    <th>Resolution</th>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>\r
- *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>\r
- *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>\r
- *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>\r
- *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with\r
- *        GNU make or other variants of Make causing an infinitely recursive build.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>\r
- *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>\r
- *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA\r
- *        build system modules. Define the value in your project makefile and try again.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>\r
- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration\r
- *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>\r
- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").\r
- *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>\r
- *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not\r
- *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>\r
- *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.\r
- *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>\r
- *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or\r
- *        relative path given in the user project makefile is correct and try again.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>\r
- *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists\r
- *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration\r
- *        file.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>\r
- *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration\r
- *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or\r
- *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>\r
- *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or\r
- *        absolute path to the LUFA library core.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>\r
- *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be\r
- *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>\r
- *        parameter.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>\r
- *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This\r
- *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the\r
- *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>\r
- *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the\r
- *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>\r
- *   </tr>\r
- *   <tr>\r
- *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>\r
- *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA\r
- *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>\r
- *   </tr>\r
- *  </table>\r
- *\r
- *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.\r
- */\r
+/** \file
+ *
+ *  This file contains special DoxyGen information for the generation of the main page and other special
+ *  documentation pages. It is not a project source file.
+ */
+
+/** \page Page_BuildSystem The LUFA Build System
+ *
+ *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System
+ *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which
+ *  can be referenced in a LUFA powered project, to minimize the amount of code required in an
+ *  application makefile. The system is written in GNU Make, and each module is independent of
+ *  one-another.
+ *
+ *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA
+ *  build system, see \ref Sec_CompilingApps_Prerequisites.
+ *
+ *  To use a LUFA build system module, simply add an include to your project makefile. All user projects
+ *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  Once included in your project makefile, the associated build module targets will be added to your
+ *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>
+ *  from the command line, substituting in the appropriate target name.
+ *
+ *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.
+ *
+ *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>
+ *  be supplied in the project makefile for the module to work, and one or more optional parameters which
+ *  may be defined and which will assume a sensible default if not.
+ *
+ *  \section SSec_BuildSystem_Modules Available Modules
+ *
+ *  The following modules are included in this LUFA release:
+ *
+ *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming
+ *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming
+ *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking
+ *  \li \subpage Page_BuildModule_CORE - Core Build System Functions
+ *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis
+ *  \li \subpage Page_BuildModule_DFU - Device Programming
+ *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation
+ *  \li \subpage Page_BuildModule_HID - Device Programming
+ *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables
+ *
+ *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.
+ */
+
+ /** \page Page_BuildModule_BUILD The BUILD build module
+ *
+ *  The BUILD LUFA build system module, providing targets for the compilation,
+ *  assembling and linking of an application from source code into binary files
+ *  suitable for programming into a target device, using the GCC compiler.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_build.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_BUILD_Requirements Requirements
+ *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your
+ *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio
+ *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.
+ *
+ *  \section SSec_BuildModule_BUILD_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>size</tt></td>
+ *    <td>Display size of the compiled application FLASH and SRAM segments.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>symbol-sizes</tt></td>
+ *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lib</tt></td>
+ *    <td>Build and archive all source files into a library A binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>all</tt></td>
+ *    <td>Build and link the application into ELF debug and HEX binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>elf</tt></td>
+ *    <td>Build and link the application into an ELF debug file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>bin</tt></td>
+ *    <td>Build and link the application and produce a BIN binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hex</tt></td>
+ *    <td>Build and link the application and produce HEX and EEP binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lss</tt></td>
+ *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>clean</tt></td>
+ *    <td>Remove all intermediary files and binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>mostlyclean</tt></td>
+ *    <td>Remove all intermediary files but preserve any binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>
+ *    <td>Create an assembly listing of a given input C/C++ source file.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_USB</tt></td>
+ *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>BOARD</tt></td>
+ *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OPTIMIZATION</tt></td>
+ *    <td>Optimization level to use when compiling source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_STANDARD</tt></td>
+ *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_STANDARD</tt></td>
+ *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_FORMAT</tt></td>
+ *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_LEVEL</tt></td>
+ *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_CPU</tt></td>
+ *    <td>Speed of the processor CPU clock, in Hz.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_FLAGS</tt></td>
+ *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_FLAGS</tt></td>
+ *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ASM_FLAGS</tt></td>
+ *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CC_FLAGS</tt></td>
+ *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>COMPILER_PATH</tt></td>
+ *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LD_FLAGS</tt></td>
+ *    <td>Flags to pass to the linker, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LINKER_RELAXATIONS</tt></td>
+ *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size
+ *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.
+ *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you
+ *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJDIR</tt></td>
+ *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.
+ *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJECT_FILES</tt></td>
+ *    <td>List of additional object files that should be linked into the resulting binary.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_CORE The CORE build module
+ *
+ *  The core LUFA build system module, providing common build system help and information targets.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CORE_Requirements Requirements
+ *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>
+ *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).
+ *
+ *  \section SSec_BuildModule_CORE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>help</tt></td>
+ *    <td>Display build system help and configuration information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_targets</tt></td>
+ *    <td>List all available build targets from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_modules</tt></td>
+ *    <td>List all available build modules from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_mandatory</tt></td>
+ *    <td>List all mandatory parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_optional</tt></td>
+ *    <td>List all optional parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_provided</tt></td>
+ *    <td>List all variables provided by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_macros</tt></td>
+ *    <td>List all macros provided by the included modules.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module
+ *
+ *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_atprogram.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements
+ *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x
+ *  inside the application install folder's "\atbackend" subdirectory.
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>atprogram</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>atprogram-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>
+ *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_INTERFACE</tt></td>
+ *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module
+ *
+ *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_avrdude.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements
+ *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for
+ *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's
+ *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>avrdude</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>avrdude-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>
+ *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_FLAGS</tt></td>
+ *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module
+ *
+ *  The CPPCHECK programming utility LUFA build system module, providing targets to statically
+ *  analyze C and C++ source code for errors and performance/style issues.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements
+ *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page
+ *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via
+ *  the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>cppcheck</tt></td>
+ *    <td>Statically analyze the project source code for issues.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>cppcheck-config</tt></td>
+ *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of source files to statically analyze.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>CPPCHECK_INCLUDES</tt></td>
+ *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_EXCLUDES</tt></td>
+ *    <td>Paths or path fragments to exclude when analyzing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>
+ *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_ENABLE</tt></td>
+ *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_SUPPRESS</tt></td>
+ *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_QUIET</tt></td>
+ *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FLAGS</tt></td>
+ *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DFU The DFU build module
+ *
+ *  The DFU programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *  This module requires a DFU class bootloader to be running in the target, compatible with
+ *  the DFU bootloader protocol as published by Atmel.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_dfu.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DFU_Requirements Requirements
+ *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open
+ *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be
+ *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility
+ *  can be installed via the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_DFU_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>dfu</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>dfu-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module
+ *
+ *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate
+ *  project HTML and other format documentation from a set of source files that include special
+ *  Doxygen comments.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_doxygen.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements
+ *  This module requires the <tt>doxygen</tt> utility from the Doxygen website
+ *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix
+ *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through
+ *  the package manager.
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>doxygen</tt></td>
+ *    <td>Generate project documentation.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_create</tt></td>
+ *    <td>Create a new Doxygen configuration file using the latest template.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_upgrade</tt></td>
+ *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>DOXYGEN_CONF</tt></td>
+ *    <td>Name and path of the base Doxygen configuration file for the project.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>
+ *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_HID The HID build module
+ *
+ *  The HID programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor's FLASH memory with a project's compiled binary output file. This module
+ *  requires a HID class bootloader to be running in the target, using a protocol compatible
+ *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_hid.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_HID_Requirements Requirements
+ *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID
+ *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC
+ *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>
+ *  variable.
+ *
+ *  \section SSec_BuildModule_HID_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>hid</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hid-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_SOURCES The SOURCES build module
+ *
+ *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files
+ *  required to be build by a project for a given LUFA module. This module gives a way to reference
+ *  LUFA source files symbolically, so that changes to the library structure do not break the library
+ *  makefile.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_sources.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_SOURCES_Requirements Requirements
+ *  None.
+ *
+ *  \section SSec_BuildModule_SOURCES_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USB</tt></td>
+ *    <td>List of LUFA USB driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USBCLASS</tt></td>
+ *    <td>List of LUFA USB Class driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>
+ *    <td>List of LUFA temperature sensor driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_SERIAL</tt></td>
+ *    <td>List of LUFA Serial U(S)ART driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TWI</tt></td>
+ *    <td>List of LUFA TWI driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_PLATFORM</tt></td>
+ *    <td>List of LUFA architecture specific platform management source files.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildTroubleshooting Troubleshooting Information
+ *
+ *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these
+ *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different
+ *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.
+ *
+ *  <table>
+ *    <tr>
+ *    <th>Problem</th>
+ *    <th>Resolution</th>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>
+ *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>
+ *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with
+ *        GNU make or other variants of Make causing an infinitely recursive build.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>
+ *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA
+ *        build system modules. Define the value in your project makefile and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration
+ *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").
+ *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not
+ *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>
+ *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.
+ *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or
+ *        relative path given in the user project makefile is correct and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>
+ *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists
+ *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration
+ *        file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration
+ *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or
+ *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>
+ *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or
+ *        absolute path to the LUFA library core.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>
+ *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be
+ *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>
+ *        parameter.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>
+ *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This
+ *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the
+ *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the
+ *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA
+ *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.
+ */
index 316650a7b134f5e440b8370b07939a8160ee6f4d..c6c94e3618404db4e4ec887ede39a1b44972f319 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
  * This file is based on:
  *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
@@ -129,13 +129,13 @@ typedef struct
 #   define MOUSE_INTERFACE          (KEYBOARD_INTERFACE + 1)
 #else
 #   define MOUSE_INTERFACE          KEYBOARD_INTERFACE
-#endif 
+#endif
 
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_INTERFACE       (MOUSE_INTERFACE + 1)
 #else
 #   define EXTRAKEY_INTERFACE       MOUSE_INTERFACE
-#endif 
+#endif
 
 #ifdef CONSOLE_ENABLE
 #   define CONSOLE_INTERFACE        (EXTRAKEY_INTERFACE + 1)
@@ -171,7 +171,7 @@ typedef struct
 #define KEYBOARD_IN_EPNUM           1
 
 #ifdef MOUSE_ENABLE
-#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1) 
+#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1)
 #else
 #   define MOUSE_IN_EPNUM           KEYBOARD_IN_EPNUM
 #endif
@@ -179,7 +179,7 @@ typedef struct
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_IN_EPNUM        (MOUSE_IN_EPNUM + 1)
 #else
-#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM 
+#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM
 #endif
 
 #ifdef CONSOLE_ENABLE
@@ -226,7 +226,7 @@ typedef struct
 #define MOUSE_EPSIZE                8
 #define EXTRAKEY_EPSIZE             8
 #define CONSOLE_EPSIZE              32
-#define NKRO_EPSIZE                 16
+#define NKRO_EPSIZE                 32
 #define MIDI_STREAM_EPSIZE          64
 #define CDC_NOTIFICATION_EPSIZE     8
 #define CDC_EPSIZE                  16
index 9b201374a2518e24c9155f240fffc59134f07214..01c0e45b0b010a5ee3a68996fefd2e68e41b74a5 100644 (file)
 #include "descriptor.h"
 #include "lufa.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
+
 #ifdef AUDIO_ENABLE
     #include <audio.h>
 #endif
@@ -502,7 +509,7 @@ static void send_keyboard(report_keyboard_t *report)
 
     /* Select the Keyboard Report Endpoint */
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         /* Report protocol - NKRO */
         Endpoint_SelectEndpoint(NKRO_IN_EPNUM);
 
index 1e6ba8719a2a124ef687e63916bc30dd037df120..09efbe076268beb5b09ca941292049dd348a98c2 100644 (file)
@@ -1,17 +1,17 @@
 /* USB Keyboard Plus Debug Channel Example for Teensy USB Development Board
  * http://www.pjrc.com/teensy/usb_keyboard.html
  * Copyright (c) 2009 PJRC.COM, LLC
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 #include "action.h"
 #include "action_util.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 /**************************************************************************
  *
@@ -694,7 +700,7 @@ ISR(USB_GEN_vect)
                }
                 /* TODO: should keep IDLE rate on each keyboard interface */
 #ifdef NKRO_ENABLE
-               if (!keyboard_nkro && keyboard_idle && (++div4 & 3) == 0) {
+               if (!keymap_config.nkro && keyboard_idle && (++div4 & 3) == 0) {
 #else
                if (keyboard_idle && (++div4 & 3) == 0) {
 #endif
@@ -881,7 +887,7 @@ ISR(USB_COM_vect)
 #endif
                     if (bmRequestType == 0x00 && wValue == DEVICE_REMOTE_WAKEUP) {
                         if (bRequest == SET_FEATURE) {
-                            remote_wakeup = true;   
+                            remote_wakeup = true;
                         } else {
                             remote_wakeup = false;
                         }
@@ -932,7 +938,7 @@ ISR(USB_COM_vect)
                                if (bRequest == HID_SET_PROTOCOL) {
                                        keyboard_protocol = wValue;
 #ifdef NKRO_ENABLE
-                                        keyboard_nkro = !!keyboard_protocol;
+                                        keymap_config.nkro = !!keyboard_protocol;
 #endif
                                         clear_keyboard();
                                        //usb_wait_in_ready();
index 4b87b5d7b5b1644e199d8e56512138f570cdc339..05f4797340df3a63d81bb51d4fafa1fa936aeab1 100644 (file)
 #include "util.h"
 #include "host.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 // protocol setting from the host.  We use exactly the same report
 // either way, so this variable only stores the setting since we
@@ -56,7 +62,7 @@ int8_t usb_keyboard_send_report(report_keyboard_t *report)
     int8_t result = 0;
 
 #ifdef NKRO_ENABLE
-    if (keyboard_nkro)
+    if (keymap_config.nkro)
         result = send_report(report, KBD2_ENDPOINT, 0, KBD2_SIZE);
     else
 #endif
index f460d0ed44aaf7079b2ae47273fe9f36f09c8b43..5f135617c42fdee59d0e41ebeb61162570d004d9 100644 (file)
@@ -23,7 +23,7 @@ These features can be used in your keyboard.
 * Mouse key           - Mouse control with keyboard
 * System Control Key  - Power Down, Sleep, Wake Up and USB Remote Wake up
 * Media Control Key   - Volume Down/Up, Mute, Next/Prev track, Play, Stop and etc
-* USB NKRO            - 120 keys(+ 8 modifiers) simultaneously
+* USB NKRO            - 248 keys(+ 8 modifiers) simultaneously
 * PS/2 mouse support  - PS/2 mouse(TrackPoint) as composite device
 * Keyboard protocols  - PS/2, ADB, M0110, Sun and other old keyboard protocols
 * User Function       - Customizable function of key with writing code
index d2350f27c12c8f2619ba9ff3fd44bf3e9cd421bc..e4c8aecb2cfa5a89213c324d44d1476f6503c3fe 100644 (file)
@@ -21,10 +21,23 @@ VPATH_SRC := $(VPATH)
 vpath %.c $(VPATH_SRC)
 vpath %.h $(VPATH_SRC)
 vpath %.cpp $(VPATH_SRC)
+vpath %.cc $(VPATH_SRC)
 vpath %.hpp $(VPATH_SRC)
 vpath %.S $(VPATH_SRC)
 VPATH :=
 
+# Convert all SRC to OBJ
+define OBJ_FROM_SRC
+$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$($1_SRC)))))
+endef
+$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
+
+# Define a list of all objects
+OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
+
+MASTER_OUTPUT := $(firstword $(OUTPUTS))
+
+
 
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
@@ -34,50 +47,8 @@ FORMAT = ihex
 #     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
 OPT = s
 
-COLOR ?= true
-
-ifeq ($(COLOR),true)
-       NO_COLOR=\033[0m
-       OK_COLOR=\033[32;01m
-       ERROR_COLOR=\033[31;01m
-       WARN_COLOR=\033[33;01m
-       BLUE=\033[0;34m
-       BOLD=\033[1m
-endif
-
 AUTOGEN ?= false
 
-ifneq ($(shell awk --version 2>/dev/null),)
-       AWK=awk
-else
-       AWK=cat && test
-endif
-
-OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
-ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
-WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
-
-ifndef $(SILENT)
-       SILENT = false
-endif
-
-TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }'
-TAB_LOG_PLAIN = printf "$$LOG\n"
-AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
-AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
-PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1
-PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG)
-PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1
-PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN)
-PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS)
-BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi;
-
-# List any extra directories to look for include files here.
-#     Each directory must be seperated by a space.
-#     Use forward slashes for directory separators.
-#     For a directory that has spaces, enclose it in quotes.
-EXTRAINCDIRS += $(subst :, ,$(VPATH_SRC))
-
 
 # Compiler flag to set the C Standard level.
 #     c89   = "ANSI" C
@@ -88,17 +59,18 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS += $(OPT_DEFS)
+#CDEFS +=
 
 
 # Place -D or -U options here for ASM sources
-ADEFS += $(OPT_DEFS)
+#ADEFS +=
 
 
 # Place -D or -U options here for C++ sources
 #CPPDEFS += -D__STDC_LIMIT_MACROS
 #CPPDEFS += -D__STDC_CONSTANT_MACROS
-CPPDEFS += $(OPT_DEFS)
+#CPPDEFS +=
+
 
 
 
@@ -126,11 +98,7 @@ CFLAGS += -Wstrict-prototypes
 #CFLAGS += -Wunreachable-code
 #CFLAGS += -Wsign-compare
 CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 CFLAGS += $(CSTANDARD)
-ifdef CONFIG_H
-    CFLAGS += -include $(CONFIG_H)
-endif
 
 
 #---------------- Compiler Options C++ ----------------
@@ -153,12 +121,7 @@ CPPFLAGS += -Wundef
 #CPPFLAGS += -Wunreachable-code
 #CPPFLAGS += -Wsign-compare
 CPPFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
-CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 #CPPFLAGS += $(CSTANDARD)
-ifdef CONFIG_H
-    CPPFLAGS += -include $(CONFIG_H)
-endif
-
 
 #---------------- Assembler Options ----------------
 #  -Wa,...:   tell GCC to pass this to the assembler.
@@ -169,11 +132,8 @@ endif
 #             files -- see avr-libc docs [FIXME: not yet described there]
 #  -listing-cont-lines: Sets the maximum number of continuation lines of hex
 #       dump that will be displayed for a given single line of source input.
-ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
-ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-ifdef CONFIG_H
-    ASFLAGS += -include $(CONFIG_H)
-endif
+ASFLAGS += $(ADEFS) 
+ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
 
 #---------------- Library Options ----------------
 # Minimalistic printf version
@@ -201,6 +161,7 @@ SCANF_LIB =
 
 
 MATH_LIB = -lm
+CREATE_MAP ?= yes
 
 
 #---------------- Linker Options ----------------
@@ -211,7 +172,10 @@ MATH_LIB = -lm
 # Comennt out "--relax" option to avoid a error such:
 #      (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
 #
-LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
+
+ifeq ($(CREATE_MAP),yes)
+       LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
+endif
 #LDFLAGS += -Wl,--relax
 LDFLAGS += $(EXTMEMOPTS)
 LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
@@ -228,48 +192,6 @@ COPY = cp
 WINSHELL = cmd
 SECHO = $(SILENT) || echo
 
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = --------  end  --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_BIN = Creating binary load file for Flash:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling:
-MSG_COMPILING_CPP = Compiling:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_CREATING_LIBRARY = Creating library:
-MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \
-       Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\
-       git submodule sync --recursive\n\
-       git submodule update --init --recursive$(NO_COLOR)\n\n\
-       You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\
-       or if you have modified the ChibiOS libraries yourself. \n\n
-
-
-# Define all object files.
-OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC))))
-# The files in the lib folder are shared between all keymaps, so generate that folder name by removing
-# the keymap from the name
-KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR))
-# And fixup the object files to match
-LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v))
-NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ))
-LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ))
-OBJ := $(LIBOBJ) $(NONLIBOBJ)
-
-# Define all listing files.
-LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC))))
-
 
 # Compiler flags to generate dependency files.
 #GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
@@ -285,14 +207,6 @@ ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
 
 MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
 
-# Default target.
-all: build sizeafter
-
-# Change the build target to build a HEX file or a library.
-build: elf hex
-#build: elf hex eep lss sym
-#build: lib
-
 
 elf: $(BUILD_DIR)/$(TARGET).elf
 hex: $(BUILD_DIR)/$(TARGET).hex
@@ -302,15 +216,6 @@ sym: $(BUILD_DIR)/$(TARGET).sym
 LIBNAME=lib$(TARGET).a
 lib: $(LIBNAME)
 
-check_submodule:
-       git submodule status --recursive | \
-       while IFS= read -r x; do \
-               case "$$x" in \
-                       \ *) ;; \
-                       *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \
-               esac \
-       done
-
 # Display size of file.
 HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
 #ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
@@ -364,91 +269,87 @@ gccversion :
        $(eval CMD=$(BIN) $< $@ || exit 0)
        @$(BUILD_CMD)
 
-# Create library from object files.
-.SECONDARY : $(BUILD_DIR)/$(TARGET).a
-.PRECIOUS : $(OBJ)
-%.a: $(OBJ)
-       @$(SILENT) || printf "$(MSG_CREATING_LIBRARY) $@" | $(AWK_CMD)
-       $(eval CMD=$(AR) $@ $(OBJ) )
-       @$(BUILD_CMD)
-
-BEGIN = gccversion check_submodule sizebefore
+BEGIN = gccversion sizebefore
 
 # Link: create ELF output file from object files.
 .SECONDARY : $(BUILD_DIR)/$(TARGET).elf
 .PRECIOUS : $(OBJ)
 # Note the obj.txt depeendency is there to force linking if a source file is deleted
-%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN)
+%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
        @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
        $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS))
        @$(BUILD_CMD)
+       
 
 define GEN_OBJRULE
+$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
+ifdef $1_CONFIG
+$1_CONFIG_FLAGS += -include $$($1_CONFIG)
+endif
+$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
+$1_CPPFLAGS= $$(ALL_CPPFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
+$1_ASFLAGS= $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
+
 # Compile: create object files from C source files.
 $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
        @mkdir -p $$(@D)
        @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
-       $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+       $$(eval CMD := $$(CC) -c $$($1_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
        @$$(BUILD_CMD)
 
 # Compile: create object files from C++ source files.
 $1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN)
        @mkdir -p $$(@D)
        @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
-       $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
-       @$(BUILD_CMD)
+       $$(eval CMD=$$(CC) -c $$($1_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+       @$$(BUILD_CMD)
+
+$1/%.o : %.cc $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN)
+       @mkdir -p $$(@D)
+       @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
+       $$(eval CMD=$$(CC) -c $$($1_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+       @$$(BUILD_CMD)
 
 # Assemble: create object files from assembler source files.
 $1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
        @mkdir -p $$(@D)
        @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
-       $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@)
+       $$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
        @$$(BUILD_CMD)
 
 $1/force:
 
 $1/cflags.txt: $1/force
-       echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@
+       echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
 
 $1/cppflags.txt: $1/force
-       echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@
+       echo '$$($1_CPPFLAGS)' | cmp -s - $$@ || echo '$$($1_CPPFLAGS)' > $$@
 
 $1/asflags.txt: $1/force
-       echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@
-
-$1/ldflags.txt: $1/force
-       echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@
-
-$1/obj.txt: $1/force
-       echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@
+       echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
 
 $1/compiler.txt: $1/force
        $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
 endef
 
+.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
+$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
+       echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
+
+.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
+$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
+       echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
+
+
 # We have to use static rules for the .d files for some reason
 DEPS = $(patsubst %.o,%.d,$(OBJ))
 # Keep the .d files
 .PRECIOUS: $(DEPS)
 # Empty rule to force recompilation if the .d file is missing
 $(DEPS):
+       
 
-# Since the object files could be in two different folders, generate
-# separate rules for them, rather than having too generic rules
-$(eval $(call GEN_OBJRULE,$(OBJDIR)))
-$(eval $(call GEN_OBJRULE,$(KBOBJDIR)))
-
-# Compile: create assembler files from C source files.
-%.s : %.c | $(BEGIN)
-       @$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
-       $(eval CMD=$(CC) -S $(ALL_CFLAGS) $< -o $@)
-       @$(BUILD_CMD)
-
-# Compile: create assembler files from C++ source files.
-%.s : %.cpp | $(BEGIN)
-       @$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
-       $(eval CMD=$(CC) -S $(ALL_CPPFLAGS) $< -o $@)
-       @$(BUILD_CMD)
+$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
 
 # Create preprocessed source for use in sending a bug report.
 %.i : %.c | $(BEGIN)
@@ -456,71 +357,19 @@ $(eval $(call GEN_OBJRULE,$(KBOBJDIR)))
 
 # Target: clean project.
 clean:
-       $(REMOVE) -r $(OBJDIR) 2>/dev/null
-       $(REMOVE) -r $(KBOBJDIR) 2>/dev/null
+       $(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
        $(REMOVE) $(BUILD_DIR)/$(TARGET).*
 
 show_path:
        @echo VPATH=$(VPATH)
        @echo SRC=$(SRC)
-
-SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile)))
-SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.))
-SUBDIRS := $(sort $(SUBDIRS))
-# $(error $(SUBDIRS))
-all-keyboards-defaults-%:
-       @for x in $(SUBDIRS) ; do \
-               printf "Compiling with default: $$x" | $(AWK_CMD); \
-               LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-       done
-
-all-keyboards-defaults: all-keyboards-defaults-all
-
-KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%)
-all-keyboards-all: $(addsuffix -all,$(KEYBOARDS))
-all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS))
-all-keyboards: all-keyboards-all
-
-define make_keyboard
-$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1))
-$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD))))
-$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD))))
-$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.))))
-$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.))))
-@for x in $(KEYMAPS) ; do \
-       printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \
-       LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-done
-endef
-
-define make_keyboard_helper
-# Just remove the -all and so on from the first argument and pass it forward
-$(call make_keyboard,$(subst -$2,,$1),$2)
-endef
-
-/keyboards/%-all:
-       $(call make_keyboard_helper,$@,all)
-/keyboards/%-clean:
-       $(call make_keyboard_helper,$@,clean)
-/keyboards/%:
-       $(call make_keyboard_helper,$@,all)
-
-all-keymaps-%:
-       $(eval MAKECONFIG=$(call get_target,all-keymaps,$@))
-       $(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.))))
-       @for x in $(KEYMAPS) ; do \
-               printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \
-               LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-       done
-
-all-keymaps: all-keymaps-all
+       @echo OBJ=$(OBJ)
 
 # Create build directory
-$(shell mkdir $(BUILD_DIR) 2>/dev/null)
+$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
 
 # Create object files directory
-$(shell mkdir $(OBJDIR) 2>/dev/null)
-$(shell mkdir $(KBOBJDIR) 2>/dev/null)
+$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
 
 # Include the dependency files.
 -include $(patsubst %.o,%.d,$(OBJ))
@@ -528,8 +377,6 @@ $(shell mkdir $(KBOBJDIR) 2>/dev/null)
 
 # Listing of phony targets.
 .PHONY : all finish sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff check_submodule \
+build elf hex eep lss sym coff extcoff \
 clean clean_list debug gdb-config show_path \
-program teensy dfu flip dfu-ee flip-ee dfu-start \
-all-keyboards-defaults all-keyboards all-keymaps \
-all-keyboards-defaults-% all-keyboards-% all-keymaps-%
+program teensy dfu flip dfu-ee flip-ee dfu-start 
\ No newline at end of file
diff --git a/util/Win_Check.bat b/util/Win_Check.bat
new file mode 100644 (file)
index 0000000..3fdb656
--- /dev/null
@@ -0,0 +1,208 @@
+@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
+@echo OFF
+set BAT_VERSION=v1.0
+set REPORT_NAME=Win_Check_Output.txt
+
+:: -----------------------------------------------------------------------------
+
+cls
+
+echo QMK Windows Check Output %BAT_VERSION%
+echo QMK Windows Check Output %BAT_VERSION%.>%REPORT_NAME%
+
+:: -----------------------------------------------------------------------------
+
+set MINGW_BASE_DIR=C:\MinGW
+
+set KEYMAP=atomic-pvc
+set KEYMAP_CLEAN=atomic-pvc-clean
+
+:: -----------------------------------------------------------------------------
+
+if /I "%1" EQU VERBOSE (goto :Verbose_Make) else (goto :Normal_Make)
+
+:Normal_Make
+set MAKE_CMD_LEVEL_0=make -r -f Makefile COLOR=FALSE
+set MAKE_CMD_LEVEL_1=make -r -f ../Makefile COLOR=FALSE
+set MAKE_CMD_LEVEL_2=make -r -f ../../Makefile COLOR=FALSE
+goto :Start_Report
+
+:Verbose_Make
+echo Verbose Mode
+set MAKE_CMD_LEVEL_0=make -r -d -f Makefile COLOR=FALSE VERBOSE=TRUE
+set MAKE_CMD_LEVEL_1=make -r -d -f ../Makefile COLOR=FALSE VERBOSE=TRUE
+set MAKE_CMD_LEVEL_2=make -r -d -f ../../Makefile COLOR=FALSE VERBOSE=TRUE
+goto :Start_Report
+
+:Start_Report
+
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=CURRENT DIRECTORY & call :ReportHeader
+
+echo %CD%>>%REPORT_NAME% 2>&1
+
+echo.>>%REPORT_NAME% 2>&1
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=CURRENT PATHS & call :ReportHeader
+
+for %%A in ("%path:;=";"%") do (echo %%~A>>%REPORT_NAME% 2>&1)
+
+echo.>>%REPORT_NAME% 2>&1
+
+:: -----------------------------------------------------------------------------
+
+rem set HEADER=CURRENT ENVIRONMENTAL SETTINGS & call :ReportHeader
+
+rem set>>%REPORT_NAME% 2>&1
+rem echo.>>%REPORT_NAME% 2>&1
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=KEY EXECUTABLE LOCATIONS - GENERAL & call :ReportHeader
+
+set FILENAME=make.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU Make" & call :ReportVersion
+set FILENAME=git.exe & set VERSION_CMD=--version & set VERSION_FIND="git" & call :ReportVersion
+set FILENAME=cmp.exe & set VERSION_CMD=--version & set VERSION_FIND="cmp" & call :ReportVersion
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=EXECUTABLE LOCATIONS - AVR MCU COMPILERS & call :ReportHeader
+
+set FILENAME=avr-gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="avr" & call :ReportVersion
+set FILENAME=avr-objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
+set FILENAME=avr-objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
+set FILENAME=avr-size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
+set FILENAME=avr-ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
+set FILENAME=avr-nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=EXECUTABLE LOCATIONS - ARM MCU COMPILERS & call :ReportHeader
+
+set FILENAME=arm-none-eabi-gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="arm-none-eabi-gcc" & call :ReportVersion
+set FILENAME=arm-none-eabi-objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
+set FILENAME=arm-none-eabi-objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
+set FILENAME=arm-none-eabi-size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
+set FILENAME=arm-none-eabi-ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
+set FILENAME=arm-none-eabi-nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=EXECUTABLE LOCATIONS - NATIVE COMPILERS & call :ReportHeader
+
+set FILENAME=gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="gcc" & call :ReportVersion
+set FILENAME=objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
+set FILENAME=objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
+set FILENAME=size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
+set FILENAME=ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
+set FILENAME=nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=EXECUTABLE LOCATIONS - PROGRAMMERS & call :ReportHeader
+
+set FILENAME=dfu-programmer.exe & set VERSION_CMD=--version & set VERSION_FIND="dfu" & call :ReportVersion
+set FILENAME=batchisp.exe & set VERSION_CMD=-version & set VERSION_FIND="batchisp" & call :ReportVersion
+set FILENAME=dfu-util.exe & call :Report
+set FILENAME=teensy_loader_cli.exe & call :Report
+set FILENAME=hid_bootloader_cli.exe & call :Report
+set FILENAME=avrdude.exe & call :Report
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=EXECUTABLE LOCATIONS - OPTIONAL & call :ReportHeader
+set FILENAME=cppcheck.exe & call :Report
+set FILENAME=doxygen.exe & call :Report
+set FILENAME=gdb-config.exe & call :Report
+set FILENAME=wget.exe & call :Report
+set FILENAME=unzip.exe & call :Report
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=MINGW CHECK - OPTIONAL & call :ReportHeader
+if exist %MINGW_BASE_DIR% (echo Expected MinGW Base Dir = %MINGW_BASE_DIR%>>%REPORT_NAME% 2>&1) else (echo Expected MinGW Base Dir = %MINGW_BASE_DIR% - Not Found>>%REPORT_NAME% 2>&1)
+echo.>>%REPORT_NAME% 2>&1
+set FILENAME=mingw32-make.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU Make" & call :ReportVersion
+if exist %MINGW_BASE_DIR%\bin\make.exe (ECHO It is not recommended to have make.exe in mingw/bin.>>%REPORT_NAME% 2>&1 & echo.>>%REPORT_NAME% 2>&1)
+
+:: -----------------------------------------------------------------------------
+
+set HEADER=MAKE CHECK & call :ReportHeader
+if exist Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_0% & goto MakeFound)
+if exist ..\Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_1% & goto MakeFound)
+if exist ..\..\Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_2% & goto MakeFound)
+
+echo No Makfile Found.>>%REPORT_NAME% 2>&1
+echo.>>%REPORT_NAME% 2>&1
+echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
+
+goto :ContinueAfterMake
+
+:MakeFound
+call :RunMake
+
+:ContinueAfterMake
+goto :ExitBatch
+
+:ExitBatch
+       echo Done!
+       echo.
+       rem type %REPORT_NAME%
+       echo.
+       echo See %REPORT_NAME% for the report.
+       endlocal
+exit /b
+
+:: -----------------------------------------------------------------------------
+
+:RunMake
+
+       echo Makfile Found.>>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+       set HEADER=MAKE CLEAN & call :ReportHeader
+       echo Make Command = %MAKE_CMD% %KEYMAP_CLEAN%>>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+       %MAKE_CMD% %KEYMAP_CLEAN%>>%REPORT_NAME% 2>&1
+       set HEADER=MAKE & call :ReportHeader
+       echo Make Command = %MAKE_CMD% %KEYMAP%>>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+       %MAKE_CMD% %KEYMAP%>>%REPORT_NAME% 2>&1
+       echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+exit /b
+
+:ReportHeader
+       echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+       echo %HEADER%>>%REPORT_NAME% 2>&1
+       echo.>>%REPORT_NAME% 2>&1
+exit /b
+
+:Report
+       echo Filename = %FILENAME% >>%REPORT_NAME% 2>&1
+       <nul set /p output="Location = " >>%REPORT_NAME% 2>&1
+       where %FILENAME%  >>%REPORT_NAME% 2> NUL
+       if ERRORLEVEL 1 (echo Not Found >>%REPORT_NAME% 2>&1 & goto :EndReport)
+
+       :EndReport
+       echo.>>%REPORT_NAME% 2>&1
+       <nul set /p output="."
+exit /b
+
+:ReportVersion
+       echo Filename = %FILENAME% >>%REPORT_NAME% 2>&1
+       <nul set /p output="Location = " >>%REPORT_NAME% 2>&1
+       where %FILENAME%  >>%REPORT_NAME% 2> NUL
+       if ERRORLEVEL 1 (echo Not Found >>%REPORT_NAME% 2>&1 & goto :EndReportVersion)
+       <nul set /p output ="Version  = " >>%REPORT_NAME% 2>&1
+
+       (%FILENAME% %VERSION_CMD% | find %VERSION_FIND%) >>%REPORT_NAME% 2>&1
+
+       :EndReportVersion
+       echo.>>%REPORT_NAME% 2>&1
+       <nul set /p output="."
+exit /b
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 24564a2..936a865
@@ -20,7 +20,8 @@ if [[ -n "$(type -P pacman )" ]]; then
     arm-none-eabi-gcc \
     arm-none-eabi-binutils \
     arm-none-eabi-newlib \
-    git
+    git \
+    diffutils
 
 elif [[ -n "$(type -P apt-get)" ]]; then
   # Debian and derivatives
@@ -47,7 +48,8 @@ elif [[ -n "$(type -P apt-get)" ]]; then
     gcc-arm-none-eabi \
     binutils-arm-none-eabi \
     libnewlib-arm-none-eabi \
-    git
+    git \
+    diffutils
 
 elif [[ -n "$(type -P yum)" ]]; then
   # Fedora, CentOS or RHEL and derivatives
@@ -66,10 +68,10 @@ elif [[ -n "$(type -P yum)" ]]; then
     avr-libc \
     dfu-programmer \
     dfu-util \
-    gcc-arm-none-eabi \
-    binutils-arm-none-eabi \
-    libnewlib-arm-none-eabi \
-    git
+    arm-none-eabi-gcc-cs \
+    arm-none-eabi-newlib \
+    git \
+    diffutils
   # The listed eabi pacackes do unfortunately not exist for CentOS,
   # But at least in Fedora they do, so try to install them anyway
   # TODO: Build them from sources, if the installation fails
@@ -85,7 +87,8 @@ elif [[ -n "$(type -P zypper)" ]]; then
     patch \
     wget \
     dfu-programmer \
-    git
+    git \
+    diffutils
   # TODO: The avr and eabi tools are not available as default packages, so we need 
   # another way to install them
 
index b3535f449ef43dc769f1d500888c93e5165ab278..18d16e560c06379be5c9c9c21c5bec0f3cf9458a 100755 (executable)
@@ -20,6 +20,7 @@ sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/template.c > keyboards/$KEYBO
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/config.h > keyboards/$KEYBOARD/config.h
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/readme.md > keyboards/$KEYBOARD/readme.md
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/Makefile > keyboards/$KEYBOARD/Makefile
+sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/rules.mk > keyboards/$KEYBOARD/rules.mk
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/default/config.h > keyboards/$KEYBOARD/keymaps/default/config.h
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/default/keymap.c > keyboards/$KEYBOARD/keymaps/default/keymap.c
 sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/default/Makefile > keyboards/$KEYBOARD/keymaps/default/Makefile
index c2a994ef022c14baf4be08b4e9a72f9c0f6a8b17..f432976d038cccf26d5679ed1abb903dbfccc27f 100644 (file)
@@ -7,7 +7,7 @@ rev=$(git rev-parse --short HEAD)
 git config --global user.name "Travis CI"
 git config --global user.email "jack.humb+travis.ci@gmail.com"
 
-make all-keymaps keyboard=ergodox/ez AUTOGEN=true
+make ergodox-ez AUTOGEN=true
 
 find . -name ".build" | xargs rm -rf
 cd ..
@@ -24,4 +24,4 @@ cp ../qmk_firmware/readme.md qmk_readme.md
 
 git add -A
 git commit -m "generated from qmk_firmware/$TRAVIS_BRANCH@${rev}" 
-git push
\ No newline at end of file
+git push