Compare commits

...

183 Commits

Author SHA1 Message Date
Colin T.A. Gray
3e2fd64279 I found a typo! 2017-11-22 11:40:46 -05:00
Colin T.A. Gray
5b4b471a4f this number just looks wrong, should be 4096 not 4996 2017-11-22 11:40:46 -05:00
Maarten Dekkers
b8217eeff4 Add maartenwut's handwire build 2017-11-22 11:19:05 -05:00
Max
dcc363390f Added Daisy port (#2016)
* Add files via upload

* Update readme.md

* Update readme.md

* Update readme.md

* Add files via upload

* Delete config.h

* Delete rules.mk

* Add files via upload

* Update config.h

* revised config files

* revised readme

* Update readme.md

* Update readme.md
2017-11-22 10:52:42 -05:00
Jack Humbert
62eed0e4a3 Update config_options.md 2017-11-21 21:26:29 -05:00
Jack Humbert
c8bdc75e1d Update feature_layouts.md 2017-11-21 21:22:56 -05:00
Seebs
39d3d92364 Allow multiple process_record() calls per scan
This is particularly relevant for, e.g., the ergodox EZ and
other keyboards with slow scan rates. Without changing the API or
behavior of individual process_record() calls, we allow a
configuration flag to make multiple calls in a single scan.

This will probably have miniscule effects on non-steno users,
and it's not enabled by default for any keyboards. Added note
about it to ergodox README.

Signed-off-by: seebs <seebs@seebs.net>
2017-11-21 00:20:52 -05:00
Jack Humbert
b669d115c2 adds planck light keyboard 2017-11-20 23:37:38 -05:00
Gilbert Consellado
7ff96877d2 added SS_LSFT to featured macros 2017-11-20 12:25:42 -05:00
yellowmoneybank
c6cdd5422f Neo2Planck (#2032)
* Documentation

* Enabled Mouse-Keys in Makefile

* Layer 1 finished

* Small Bugfixes

* Updated documentation
2017-11-20 12:22:16 -05:00
d_r0ck
d6ca4e555a Added files 2017-11-20 12:21:31 -05:00
TerryMathews
d8aa018995 Kona_classic: ANSI arrows keymap with locking caps lock support 2017-11-20 12:21:04 -05:00
Marcus Young
08dab374da Add my layout 2017-11-20 12:20:40 -05:00
Drashna Jaelre
dbd33782f2 Update to drashna keymaps (#4)
* Minor updates to keymaps

* Minor updates to keymaps
2017-11-17 20:48:26 -05:00
Jack Humbert
1d703a476a update build script to not delete files 2017-11-17 14:09:27 -05:00
Jack Humbert
f5a9758cea Adds serial number string to USB descriptors (#1996)
* add serial number string to usb descriptors

* better name for serial number
2017-11-17 11:53:46 -05:00
Robert Llewellyn
f07e2cdd9d DZ60 own true HHKB layout after dz60.h fix (#2012) 2017-11-17 11:42:23 -05:00
Jack Humbert
f2c32b3ea4 Splits up ps2avrGB boards into their own folders (#2014)
* move underglow led count from parent to child

* Added pearl support

* Added personal keymap for pearl

* start splitting up ps2avrGB boards

* clean up ps2avrgb boards

* Move keycodes to their own section

* Clarify `KC_PWR` vs `KC_POWER`. Fixes #1994.

*  Cleaned uppersonal userspace and keymaps (#1998)

* Cleanup of keymaps

* Remove Tap Dance from Orthodox keymap

* Cleaned up userspace and keymaps

* Added sample (template)userspace files to my folder

* Document the Teensy hardware reset problem

* add mfluid keymap to atreus62

* Update hand_wire.md

Change "Resin" to "Rosin"

* Add keyboard: mt40 (#2001)

* add keyboard: chinese planck clone

* rename chinese_planck to mt40

* add image for the mt40 board

* lets_split: Fix matrix_init for ROW2COL

Signed-off-by: Marian Rusu <rusumarian91@gmail.com>

* Add Keymap for Whitefox Truefox layout

* Add keyboard: ACR60 (#1999)

* base acr60 keyboard folder created

* mitch acr60 keymap updates, documentation

* latest keymap updates

* slight modifications to layer switching

* Changes to Atreus and Ergodox EZ Dvorak 42key layout (#1997)

* importing 42 key dvorak layout

* added comment for build instructions

* adding atreus dvorak 42 key layout

* added readme

* add readme

* build instructions

* additional MEH shortcuts

* added shifted symbols on symbols layer

* working extra symbols on COMBINED layer

* bring atreus layout inline with the ergodox one

* add necessary macros

* working ls macro

* added more shell macros

* added screen rename / screen number macros

* add ctrl-a key in shell-nav to use screen more easily

* added shell screen layer

* assign screen switching macros to screen layer

* define all screen switching macros

* more screen-related shortcuts added on shell screen layer

* change shell nav bottom right row to match base layer (backspace / delete)

* remove some mappings on SHELL_NAV layer as they are now in the screen layer

* added more screen macros

* changes to COMBINED layer (pipe on the right) and modified shell nav

* moved pipe/backslash to then right

* documented SHELL_SCREEN layer

* put backspace/delete on SHELL_NAV layer

* add an explicit lisence file for github to pickup

* Updated keymaps to allow base layer alternation for QWERTY, Colemak & Dvorak (#1962)

* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.

* New Frosty Flake layout for QFR TKL

Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.

* README fix & keymap update for 3 keyboards

Fixed the markdown for the handwired/terminus_mini:default, Nyqyist:DivergeJM & frosty_flake:QFR_JM.

Added TAPPING_TERM =  150 to config.h for all keyboards

Switched LT(LOWER) and LAlt on the mod row for ortholinear boards.

* Update readme for QFR_JM to include make instructions

* Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware"

This reverts commit a45f264ada, reversing
changes made to 62349c3341.

* Revert "Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware""

This reverts commit eae54fb3be.

* Added QWERTY support to the QFR_JM

Implemented variable default base layer from the Planck default keymap.

* Update README to reflect QWERTY support

* Nyquist:DivergeJM - Update RESET location

Add a reset button to both hands, accessible when halves are disconnected.

* Typo fix

* Update DivergeJM

Switched master to Left hand,
Moved Reset key to a different location

* Added macros to send R pointer & dplyr pipe

Macros added as a string of keypresses, couldn't figure out how to get SEND_STRING to work.

* Added ADJUST -> QWERTY, DVORAK, COLEMAK

Re-implemented update_tri_layer fuctionality to reset base layer for Terminus_Mini & DivergeJM Nyquist keymaps to QWERTY, DVORAK or COLEMAK via the ADJUST layer.

Updated ReadMe files accordingly.

* Fix base layout diagram for Terminus_Mini

Remove split from diagram

* Changed the R operators to SEND_STRING, rather than keypress macros

* Added Dvorak to the QFR_JM keymap

* fixed duplicate row in Nyquist keymap

* Fix readme - LAlt location on mouse layer

* Set EE_HANDS to allow either Nyquist hand to work as master.

* Update R operator strings, clean up layering for terminus_mini, QFR_JM and DivergeJM

"<-" to " <- "
"%>%" to " %>% "

Also played around with the layering, removed unnecessary TAP_TOGGLE for LOWER and shuffled FUNCTION and MOUSE momentary actions to reflect layer order.

* Update bottom alpha row to output symbols on LOWER

This row now outputs the following (z -> /) when in the LOWER layer:
 <-
 %>%
{
[
`
|
]
}
.
/

* Updated readme files for QFR_JM, terminus_mini & DivergeJM

QFR_JM readme reflects correct LOWER bottom row symbol output,
terminus_mini & DivergeJM reflect correct command line make instructions.

* Add media keys to QFR_JM LOWER - Replicate QFR default functionality

* Fix issue with Mouse layering

Stuck on mouse layer because the wrong macro was assigned to the 'exit layer' key. Reassigned that key.

* Changed " <- " to "<- " for QFR_JM, terminus_mini & DivergeJM

* Add "KC_MAKE" to userspace example

* QMK DFU bootloader generation (#2009)

* adds :bootloader target

* update planck and preonic revisions

* remove references to .h files for planck

* update preonic keymap

* only add keyboard.h files that exist

* add production target

* hook things up with the new lufa variables

* update rules for planck/preonic

* back backlight key turn of status led when pressed

* add manufacturer/product strings to bootloader

* fix push script

* Added support for let's split kailh socket version (#2010)

* Added support for socket version of the let's split

* renamed files

* socket-version-works

* fix up lets_split keymaps

* fix up lets_split keymaps

* shrink preonic by a bit

* fix lets_split keyboards

* update travis script

* update travis script

* update version silencing
2017-11-17 11:40:34 -05:00
Jack Humbert
92d47a55d4 update chibios 2017-11-17 11:40:13 -05:00
Jack Humbert
41f3f01167 Update .gitmodules 2017-11-16 15:09:45 -05:00
Damien
a8c4af5a45 Updated dbroqua layout for HHKB keyboard (#1990)
* - Fixed DK60 version in config.h

* - Updated dk60 readme with new QMK rules

* - Fixed wording in readme

* Added dbroqua layout for DZ60

I've also updated dz60.h to add "true HHKD" keymap definition (6U
spacebar).

With the default HHKB definition r_alt was not mapped and when I pressed
r_menu it was r_alt.

Regards

* Updated dbroqua layout for HHKB keyboard

Added default configuration and alternate (swap gui/alt keys).

Save user choice in keyboard memory (like plank, thanks for this
feature!).
2017-11-16 14:49:19 -05:00
Balz Guenat
858c09f370 add example keymap 2017-11-16 09:39:00 -05:00
Balz Guenat
179d64d33c extend macro docs a bit 2017-11-16 09:39:00 -05:00
Jack Humbert
eac4bab342 update version silencing 2017-11-14 22:56:29 -05:00
Jack Humbert
a8466df62d update travis script 2017-11-14 22:31:34 -05:00
Jack Humbert
cb64a886e9 update travis script 2017-11-14 22:14:59 -05:00
Jack Humbert
dbabfb082c fix lets_split keyboards 2017-11-14 22:14:03 -05:00
Jack Humbert
607876187d shrink preonic by a bit 2017-11-14 21:23:26 -05:00
Jack Humbert
7f3539aa76 fix up lets_split keymaps 2017-11-14 17:55:18 -05:00
Jack Humbert
4ad0bbd672 fix up lets_split keymaps 2017-11-14 17:37:57 -05:00
Mikkel Jeppesen
85172f4f85 Added support for let's split kailh socket version (#2010)
* Added support for socket version of the let's split

* renamed files

* socket-version-works
2017-11-14 17:27:27 -05:00
Jack Humbert
b702c08825 fix push script 2017-11-14 16:47:34 -05:00
Jack Humbert
ec3e065f0d QMK DFU bootloader generation (#2009)
* adds :bootloader target

* update planck and preonic revisions

* remove references to .h files for planck

* update preonic keymap

* only add keyboard.h files that exist

* add production target

* hook things up with the new lufa variables

* update rules for planck/preonic

* back backlight key turn of status led when pressed

* add manufacturer/product strings to bootloader
2017-11-14 16:11:29 -05:00
drashna
3c15c48e6a Add "KC_MAKE" to userspace example 2017-11-14 11:02:00 -05:00
James Morgan
49d8f1c5ed Updated keymaps to allow base layer alternation for QWERTY, Colemak & Dvorak (#1962)
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.

* New Frosty Flake layout for QFR TKL

Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.

* README fix & keymap update for 3 keyboards

Fixed the markdown for the handwired/terminus_mini:default, Nyqyist:DivergeJM & frosty_flake:QFR_JM.

Added TAPPING_TERM =  150 to config.h for all keyboards

Switched LT(LOWER) and LAlt on the mod row for ortholinear boards.

* Update readme for QFR_JM to include make instructions

* Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware"

This reverts commit a45f264ada, reversing
changes made to 62349c3341.

* Revert "Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware""

This reverts commit eae54fb3be.

* Added QWERTY support to the QFR_JM

Implemented variable default base layer from the Planck default keymap.

* Update README to reflect QWERTY support

* Nyquist:DivergeJM - Update RESET location

Add a reset button to both hands, accessible when halves are disconnected.

* Typo fix

* Update DivergeJM

Switched master to Left hand,
Moved Reset key to a different location

* Added macros to send R pointer & dplyr pipe

Macros added as a string of keypresses, couldn't figure out how to get SEND_STRING to work.

* Added ADJUST -> QWERTY, DVORAK, COLEMAK

Re-implemented update_tri_layer fuctionality to reset base layer for Terminus_Mini & DivergeJM Nyquist keymaps to QWERTY, DVORAK or COLEMAK via the ADJUST layer.

Updated ReadMe files accordingly.

* Fix base layout diagram for Terminus_Mini

Remove split from diagram

* Changed the R operators to SEND_STRING, rather than keypress macros

* Added Dvorak to the QFR_JM keymap

* fixed duplicate row in Nyquist keymap

* Fix readme - LAlt location on mouse layer

* Set EE_HANDS to allow either Nyquist hand to work as master.

* Update R operator strings, clean up layering for terminus_mini, QFR_JM and DivergeJM

"<-" to " <- "
"%>%" to " %>% "

Also played around with the layering, removed unnecessary TAP_TOGGLE for LOWER and shuffled FUNCTION and MOUSE momentary actions to reflect layer order.

* Update bottom alpha row to output symbols on LOWER

This row now outputs the following (z -> /) when in the LOWER layer:
 <-
 %>%
{
[
`
|
]
}
.
/

* Updated readme files for QFR_JM, terminus_mini & DivergeJM

QFR_JM readme reflects correct LOWER bottom row symbol output,
terminus_mini & DivergeJM reflect correct command line make instructions.

* Add media keys to QFR_JM LOWER - Replicate QFR default functionality

* Fix issue with Mouse layering

Stuck on mouse layer because the wrong macro was assigned to the 'exit layer' key. Reassigned that key.

* Changed " <- " to "<- " for QFR_JM, terminus_mini & DivergeJM
2017-11-13 20:55:14 -05:00
Jack Humbert
5cdf47a79e add an explicit lisence file for github to pickup 2017-11-13 20:50:54 -05:00
Marian Rusu
3f1aab0c2e lets_split: Fix matrix_init for ROW2COL
Signed-off-by: Marian Rusu <rusumarian91@gmail.com>
2017-11-13 18:52:57 -05:00
Andy Holder
43edc83998 Add Keymap for Whitefox Truefox layout 2017-11-13 18:51:54 -05:00
lucwastiaux
dd60038eeb Changes to Atreus and Ergodox EZ Dvorak 42key layout (#1997)
* importing 42 key dvorak layout

* added comment for build instructions

* adding atreus dvorak 42 key layout

* added readme

* add readme

* build instructions

* additional MEH shortcuts

* added shifted symbols on symbols layer

* working extra symbols on COMBINED layer

* bring atreus layout inline with the ergodox one

* add necessary macros

* working ls macro

* added more shell macros

* added screen rename / screen number macros

* add ctrl-a key in shell-nav to use screen more easily

* added shell screen layer

* assign screen switching macros to screen layer

* define all screen switching macros

* more screen-related shortcuts added on shell screen layer

* change shell nav bottom right row to match base layer (backspace / delete)

* remove some mappings on SHELL_NAV layer as they are now in the screen layer

* added more screen macros

* changes to COMBINED layer (pipe on the right) and modified shell nav

* moved pipe/backslash to then right

* documented SHELL_SCREEN layer

* put backspace/delete on SHELL_NAV layer
2017-11-13 18:50:39 -05:00
Ryan Mitchell
716ff76f5b Add keyboard: ACR60 (#1999)
* base acr60 keyboard folder created

* mitch acr60 keymap updates, documentation

* latest keymap updates

* slight modifications to layer switching
2017-11-13 18:50:09 -05:00
Thomas Dehaeze
eef94b0b40 add mfluid keymap to atreus62 2017-11-13 18:49:23 -05:00
James
309a400b3e Update hand_wire.md
Change "Resin" to "Rosin"
2017-11-13 18:48:55 -05:00
Thomas Dehaeze
c2c3aa4f08 Add keyboard: mt40 (#2001)
* add keyboard: chinese planck clone

* rename chinese_planck to mt40

* add image for the mt40 board
2017-11-13 18:44:53 -05:00
Erin Call
392121b10e Document the Teensy hardware reset problem 2017-11-12 11:51:12 -05:00
drashna
0533362e82 Cleaned uppersonal userspace and keymaps (#1998)
* Cleanup of keymaps

* Remove Tap Dance from Orthodox keymap

* Cleaned up userspace and keymaps

* Added sample (template)userspace files to my folder
2017-11-10 22:58:53 -05:00
skullY
4df4fa7c26 Clarify KC_PWR vs KC_POWER. Fixes #1994. 2017-11-10 17:58:32 -05:00
skullY
66f13e4972 Move keycodes to their own section 2017-11-10 17:58:32 -05:00
Jack Humbert
bb11df6b7a update some docs 2017-11-09 16:19:13 -05:00
Zach Burchill
e236f1eba1 Fixed some grammar and typos on the docs (#1989)
* fixed grammar and references

* fixed typo
2017-11-09 16:18:31 -05:00
Erez Zukerman
847ade44fc Merge pull request #1988 from qmk/hf/disable_shine_leds_default
disables Shine LED layer indication for now
2017-11-09 08:31:12 -05:00
Erez Zukerman
7044dafe59 Merge pull request #1986 from ideasman42/code-friendly-qwerty
qwerty_code_friendly: Expose caps-lock & fix typo
2017-11-09 08:29:10 -05:00
Erez Zukerman
fd1a0d6753 disables Shine LED layer indication for now 2017-11-09 08:12:43 -05:00
Campbell Barton
c2c9d9b386 qwerty_code_friendly: Expose caps-lock & fix typo 2017-11-09 23:13:56 +11:00
Oscillope
05f15b789f More "oscillope" keymap fixes. (#1982)
* More keymap fixes. F-row on bottom layer wasn't fully setup, also switched raise/lower keys to use tap-toggle.

* Added PrScr, put Tab back on top layer.

* Fixed build breakage with default keymap (unneeded rgblight.h include)
2017-11-08 11:13:48 -05:00
Florian Beeres
7e2223f822 Improved README of yuuki and added RGB commands (#1983)
* Add yuuki keymap

Documentation is still a TODO and the keymap may not be final

* GRV on colon

* add KC_GRV to FN ESC

* more RGB modes

* Update README.md

Add image of layout and fix typo

* switch from jpg to png

For some reason the JPG had red outlines around the keys.

* remove whitespace

* add instruction to reset keyboard before flashing

* gh60 stytle layout

* moved the GH60 style layout to new folder

* add HOME and END

* Add heading

* moved ayanami to other branch
2017-11-08 11:13:06 -05:00
Balz Guenat
3b5381d689 restructure converters (#1825)
* restructure converters

each converter is its own keyboard and different hardware variants are different subprojects.

remove (seemingly) old method of loading layouts from main Makefile

* call led_set_kb() from overridden led_set()

* put converter back into one folder

* revert some structure changes to bring in line with #1784.

Also attempt to get the BLE thing more properly integrated.
Also also fix led_set() to call led_set_kb().
2017-11-08 11:11:44 -05:00
Campbell Barton
aee6785476 qwerty_code_friendly: configurable left thumb
Also add mouse-wheel keys.
2017-11-07 00:11:36 -05:00
drashna
363aa8aa2e Migrated most code from keymaps to userspace (#1980)
* Add woodpad

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add woodpad

* Add forced NKRO

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout

* Fixed Workman song

* update make command and added lit reset

* Fixed formatting to fall in line with official standards

* Minor tweaks

* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red

* Tweak reset code

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add forced NKRO

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout

* Fixed Workman song

* update make command and added lit reset

* Fixed formatting to fall in line with official standards

* Minor tweaks

* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red

* Tweak reset code

* Fix rebasing issues

* remove head files

* Fix "macro" issue

* Rename ez keymaps for userspace

* Revert "Rename ez keymaps for userspace"

This reverts commit c25425911852e41711a5f0273b5741adb16e5bd4.

* Renamed Ergodox EZ layouts so that all of my personal layouts are on the same name, in prep for using userspaces

* Fix ergodox code

* Remove "drashna-ez" keymap as it's no longer needed

* Migrate majority of code to Userspace
2017-11-07 00:11:08 -05:00
Fredric Silberberg
ef2961798c Small ergodox config fix and update. 2017-11-06 15:53:27 -05:00
drashna
3e861c2fd5 Update and move around drashna keymaps (#1976)
* Add woodpad

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add woodpad

* Add forced NKRO

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout

* Fixed Workman song

* update make command and added lit reset

* Fixed formatting to fall in line with official standards

* Minor tweaks

* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red

* Tweak reset code

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add forced NKRO

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout

* Fixed Workman song

* update make command and added lit reset

* Fixed formatting to fall in line with official standards

* Minor tweaks

* Removed Leader Keys from Ergodox EZ Keymap
Added KC_RESET that resets board and sets underglow to red

* Tweak reset code

* Fix rebasing issues

* remove head files

* Fix "macro" issue

* Rename ez keymaps for userspace

* Revert "Rename ez keymaps for userspace"

This reverts commit c25425911852e41711a5f0273b5741adb16e5bd4.

* Renamed Ergodox EZ layouts so that all of my personal layouts are on the same name, in prep for using userspaces

* Fix ergodox code

* Remove "drashna-ez" keymap as it's no longer needed
2017-11-06 13:32:48 -05:00
Takayuki Matsubara
f113f1927f make it easy to customize logo image 2017-11-06 12:10:17 -05:00
Takayuki Matsubara
27ee425892 add pgm_read_dword for Infinity ErgoDox
avoid the following error when `UNICODEMAP_ENABLE = yes`:

```
quantum/process_keycode/process_unicodemap.c:52:21: error: implicit declaration of function 'pgm_read_dword'
```
2017-11-06 12:09:54 -05:00
Fred Silberberg
89357b96d4 333fred layout update (#1971)
* Set up tap dance for layers on the lower button.

* Refactored code to share in the users directory between my two keyboard layouts.

* Small keyboard layout change.

* Updated documentation on oneshot usage in macros/tap dance.
2017-11-06 12:09:01 -05:00
J. Eric Mason
16843bc8c9 Pete's 40th XD64 Layout
Mac layout based on yuuki with some other changes, for Pete's 40th birthday keyboard
2017-11-06 12:08:01 -05:00
lucwastiaux
7854746704 Ergodox EZ and Atreus 42 key dvorak layout updates (#1964)
* importing 42 key dvorak layout

* added comment for build instructions

* adding atreus dvorak 42 key layout

* added readme

* add readme

* build instructions

* additional MEH shortcuts

* added shifted symbols on symbols layer

* working extra symbols on COMBINED layer

* bring atreus layout inline with the ergodox one

* add necessary macros

* working ls macro

* added more shell macros

* added screen rename / screen number macros

* add ctrl-a key in shell-nav to use screen more easily

* added shell screen layer

* assign screen switching macros to screen layer

* define all screen switching macros

* more screen-related shortcuts added on shell screen layer

* change shell nav bottom right row to match base layer (backspace / delete)

* remove some mappings on SHELL_NAV layer as they are now in the screen layer

* added more screen macros
2017-11-06 12:07:21 -05:00
Jeremy Cowgar
245b3376d6 Correct the rules.mk documentation for auto shift.
fixes #1965
2017-11-06 12:03:36 -05:00
drashna
2c703b1528 Fix RGBLIGHT startup color (#1975)
* Fix RGBLIGHT startup color

While it's awesome to see the layer indicating code in here (no really!), and the general rule is to not alter the default keymap/code....

The problem with the layer_state_set_kb call handling this, is that the code doesn't seem to be called at startup.  So the default layer color won't ever get set on startup.  It needs to be called in the init function to be properly set. 

I've played with this extensively, and if you check my keymaps, that is precisely why I have the setrgb/sethsv in the init function.

* Removed typo (pipe)
2017-11-06 11:43:38 -05:00
Erez Zukerman
90a6fea4e8 Merge pull request #1974 from qmk/f/ez_shine_layer_leds
Shine layer indication
2017-11-06 09:44:54 -05:00
Erez Zukerman
e45290a62e adds indication up to layer 7 2017-11-06 09:19:51 -05:00
Jack Humbert
1d3a19757c restore default mode/color if no 0 color 2017-11-06 09:15:30 -05:00
Jack Humbert
cf9f6bbd91 adds per-layer rgb color option to ez 2017-11-06 08:38:36 -05:00
Jack Humbert
41df0dc9a7 update gh60 info 2017-11-05 12:06:45 -05:00
Jack Humbert
30dc34d529 add gh60 info.json 2017-11-05 12:04:52 -05:00
Michael F. Lamb
e899cb8940 several improvements for mitosis:datagrok (#1960)
* mitosis/datagrok: reduce features from rules.mk

* mitosis/datagrok: make both layer keys neighbor shift

* mitosis/datagrok: (no-op) tweak some comments

* mitosis/datagrok: set baudrate to 250k

This requires a corresponding change to the mitosis wireless firmware:
https://github.com/reversebias/mitosis/pull/10

* mitosis/datagrok: move design description from code comment to a readme

* mitosis/datagrok: new layout, new shifted keys, efficient LED code

This is experimental, but compiles and seems to work correctly.

* mitosis/datagrok: whoops, move readme.md

* mitosis/datagrok: a minor layout improvement simplifies custom-shifted code

instead of [, .] [? !], using [, ?] [. !] greatly simplifies the code
needed to perform the shifted-key switching. (And keeps , and . on the
same keys that they are under qwerty.)

also: layout improvements for symbols

* mitosis/datagrok: make my code conform to QMK style guidelines

* mitosis/datagrok: TODO note for layout table in README

* mitosis/datagrok: remove led_set_user until i figure out other changes

need to see if the corresponding changes needed in the keyboard-level code
is okay.

* mitosis/datagrok: simpler layer indicator

* mitosis/datagrok: undo change to keyboard baud; make it in my layout dir.

* mitosis/datagrok: apply same punctuation hack to qwerty layer

* mitosis/datagrok: enable qwerty layer toggle

* mitosis/datagrok: update readme
2017-11-03 11:56:06 -04:00
M Rawash
80e489e122 Added hand-swap matrix to the mitosis 2017-11-03 11:55:37 -04:00
Jennifer
29d1abff07 have led default to off on start up 2017-11-03 11:55:07 -04:00
Jennifer
b546da0a19 make more generic, and properly handle inits 2017-11-03 11:55:07 -04:00
skullY
f357bd0ccc fix a typo 2017-11-02 17:36:15 -07:00
skullY
685d4c2f97 Do some cleanup for the API 2017-11-02 16:47:39 -07:00
skullY
535c2f60a9 use real greater than and less than chars 2017-11-02 16:27:17 -07:00
skullY
65eaab8a1a fix labels 2017-11-02 12:49:23 -07:00
skullY
18f3cd1123 add labels to the clueboard layout 2017-11-02 12:47:34 -07:00
skullY
e45ce2dcb3 Merge branch 'master' of github.com:qmk/qmk_firmware 2017-11-02 12:39:25 -07:00
skullY
137456e5b1 fix the clueboard layout json 2017-11-02 11:51:06 -07:00
Jack Humbert
ec59147507 fix 2u alignment in info.jsons 2017-11-02 12:28:15 -04:00
Jack Humbert
074b78700a update preonic, add info.json 2017-11-02 12:18:18 -04:00
skullY
432674781a Document info.json files 2017-11-02 01:31:02 -07:00
skullY
4e41beeaa6 Fix a typo 2017-11-02 01:30:51 -07:00
Jack Humbert
00733f4b87 update contributing guidelines 2017-11-01 21:42:05 -04:00
dkrieger
19753788c1 Add satan keymap: HHKB-alike based on dbroqua's, with mouse functionality (#1948)
* Add satan keymap: HHKB-alike based on dbroqua's, with mouse functionality and without LED functionality

* move mouse layer to DOUBLE_HOLD, add UTIL layer for TRIPLE_HOLD

- UTIL layer
    - currently has "RESET" key and nothing else.
    - functionality otherwise covered by bootmagic should go here

- small bugfix: dispatch of [QTY]_HOLD should be based on range tap count
  falls in, not exact count.
2017-11-01 21:29:23 -04:00
Pawnerd
54a8abd785 Added support for Knops Mini (3x2 macropad) keyboard. (#1953)
* Added support for Knops Mini (3x2 macropad) keyboard.

* Added better documentation, according to the QMK standards.

* Fixed typo.

* Changed names of files to comply with QMK standards.

* Ignored makefile in keymap.

* Removed makefiles and added my credentials in the copyrights.
2017-11-01 21:24:59 -04:00
Jack Humbert
d6ad9787a0 update template readme 2017-11-01 21:14:24 -04:00
Jack Humbert
e2e387f8f8 update qmk template 2017-11-01 21:10:05 -04:00
Jack Humbert
039cc8c932 ignore more makefiles 2017-11-01 20:59:44 -04:00
QMK Bot
004826e1b8 convert to unix line-endings [skip ci] 2017-11-02 00:51:41 +00:00
Jack Humbert
f445a7f971 adds .hex for teensy 2.0 using B0 as reset 2017-11-01 20:42:03 -04:00
Danny Nguyen
13e1388f2d Add nano switch pad 2017-11-01 20:02:52 -04:00
Jack Humbert
fe56fffe7d Adds .qmk file type as a target for QMK Toolbox (#1084)
* adds .qmk file type as a target

* adds info.json with vendor and product

* add files for qmk info script

* add layout file for planck

* ignore .qmk files

* more settings

* update rules for avr and chibios

* update .qmk generation for info.json and inheritence
2017-11-01 20:01:45 -04:00
Jack Humbert
d069a42c07 Update getting_started_github.md 2017-11-01 14:10:28 -04:00
Jack Humbert
029234f1f1 adds other layouts to rules.mk 2017-11-01 13:21:17 -04:00
Jack Humbert
ddf49e8b21 Merge branch 'master' of https://github.com/qmk/qmk_firmware 2017-11-01 12:22:31 -04:00
Jack Humbert
371922ad61 update layout macros for planck 2017-11-01 12:20:46 -04:00
skullY
f868a3bb86 Fix the json for clueboard 2017-11-01 09:19:40 -07:00
skullY
5329a80f6c fixup json 2017-11-01 09:04:45 -07:00
Arialdo Martini
32bb8f6b8a Improvements to documentation (#1919)
* Typo: Github => GitHub

* Typo: windows => Windows, docker => Docker, and some punctuations

* "QMK Introduction" links to the right file

* "Unix" rather than "UNIX", which is a trademark

* Directory name is "keyboards", not "keyboard"

* "handwired" is a subdirectory of "keyboards"

* Punctuation and minor fixes

* macOS rather than Mac

* Punctuation and other minor fixes

* Vagrant Guide links to an existing file

* Jun Wako referenced with his name rather than his nickname

* Saxon genitive 's outside the link
2017-11-01 11:21:54 -04:00
Jack Humbert
1683d3a559 adds info.json files to planck 2017-11-01 10:08:40 -04:00
drashna
b79a4cfeba Updated personal keymaps (#1945)
* Add woodpad

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Fix odd merge issue

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add forced NKRO

* Added Colemak and Dvorak layers to default orthodox keymap

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others

* Finishing up Viterbi keyboard layout, and NKRO tweaks to other layouts

* Made "make" keystroke universal

* Clean up and updates of drashna keymaps

* Add workman layer to planck

* Update to keymaps

* Fix accidental commit because I don't know how to git

* Fix makefile toggle code in ez keymap
Finish adding RGB code to orthodox

* missing underscore in init function declaration

* Updated RGB Underglow layer indication code due to discovery of the layer_state_set_kb function

* Remove unnecessary planck layout
2017-11-01 00:13:20 -07:00
skullY
44d9ad95b7 Add info.json files for clueboard 66 2017-11-01 00:03:35 -07:00
Danny Nguyen
fad967af4c Remove extra underscore from MASTER_RIGHT define 2017-11-01 01:19:06 -04:00
DangerousParts
20e18d15e3 Created Kona Classic config (#1791)
* Created Kona Classic config

* Fixed KonaClassic config

* Updated README

* Updated Readme to conform to format standards

* Added ANSI and ISO layout options

* Fixed images in Readme

* Added labels to images

* Added absolute links to images in Readme

* Image link updates again

* Fixed bottom row keys in some layouts

* Fixed Grave and Tilde

* Fixed Underglow in Kona Classic configs

* Renamed KonaClassic to kona_classic
2017-10-31 23:59:23 -04:00
Danny
83af62322c Add Levinson rev2 (#1939)
* Add levinson rev2 files

* Add hexwire keymap

* Remove redefinition of backlight defines
2017-10-31 23:58:38 -04:00
Rob Rogers
2d77f9cbb9 Fix pointing device feature 2017-10-31 20:59:55 -04:00
Danny Nguyen
c9a0436422 Add 6-ball macropad 2017-10-31 20:59:26 -04:00
GlenPickle
fca03e15b9 Chimera Ortho Readme (#1943)
* Added Chimera Ortho keymap

* added readme

* fixed hardware link
2017-10-31 20:58:46 -04:00
Erez Zukerman
bc98b0d9eb Merge pull request #1915 from dondelelcaro/ergodox_ez_left_leds
Ergodox ez left leds support
2017-10-31 11:33:09 -07:00
Jack Humbert
38261920a9 update hand wiring link 2017-10-31 13:38:57 -04:00
Danny Nguyen
f9881793e3 Add hexwire keymap for Eco 2017-10-31 12:27:49 -04:00
tsankuanglee
04b9b62bdc RETRO_TAPPING (#1922)
* add RETRO_TAP: tap anyway, even after TAP_TERM, if no interruption

* consistent variable name

* add option doc

* change name for consistency

* make RETRO_TAPPING default to off
2017-10-31 11:15:22 -04:00
Louis Orleans
b2bbbc2dfc layout(infinity ergodox): dudeofawesome's layout (#1932)
* 🎉 Building simple flasher

* 🎉 Flashing works

* 🎨 Cleaning up

* 🐛 Being more specific with board identity

* 🐛 Flashing correct keymap

* 🎉 Adding keymap

*  Updating keymap

* 🚨 RGB

*  Revert "🚨 RGB"

This reverts commit 9ceabfb267.

*  Improvements to flasher

*  Layout tweaks

* 💄 Messing around with LCD

* 💄 Enabling LCD backlight matching

* 🔧 Updating layout

* 🐛 Fixing console logging

* 🎨 Cleaning up indentation

* 🔧 Adding editorconfig

*  Adding game layer

* 💄 Changing numpad layout

* 🔥 redoing entire layout

It's now more similar to the Planck default layout

*  add workman and dvorak layouts

* 🐛 fix numpad

* 🐛 fix layer orders

* 🐛 fix layer toggling

* 🐛 fix tri-layer switching

* 🐛 fix LCD colors for adjustment layers

* 🔥 remove old flasher project

* 🔥 remove simple_visualizer

* 💄 update LCD colors

* 📝 fix layout comments

* 💄  swapping 2u buttons

* 🔥🔧 removing editorconfig

* 🚨 using 2 spaces

* 📝 add README

*  Revert "💄 Enabling LCD backlight matching"

This reverts commit 51577903df.

*  Revert "💄 Messing around with LCD"

This reverts commit fdd9acdae5.
2017-10-31 11:14:43 -04:00
Louis Orleans
6169cd52ba Add EditorConfig file (#1930)
* 🔧 add editorconfig

This makes supported editors automatically change their settings to match desired code styles

* 🔧 add extension recommendation for VSCode

This will cause VS Code to prompt the user to install the EditorConfig extension when they open the project.

If this is felt to be too opinionated, I can revert it.
2017-10-31 11:13:40 -04:00
drashna
101b998ac2 Fix Pointing Device code (#1934)
* Fix pointer device options

when the feature was added, the appropriate option definition wasn't created.  This needs to be added to function properly.

* Update common_features.mk

* missing underscore in init function declaration
2017-10-31 11:13:00 -04:00
Takayuki Matsubara
7b65b7e948 fix Logical Maximum to be recognized as 255 instead of -1
SEE ALSO: https://github.com/qmk/qmk_firmware/issues/312
2017-10-31 11:12:06 -04:00
Zach Burchill
4c1164c469 fixed two typos
I'm almost 100% sure "else if (state->count = 2) {" was a typo (it should have two ='s for a logical operator), and I'm *pretty* sure "if (state->interrupted || state->!pressed) return SINGLE_TAP;" has a typo. At least, it returns an error on my machine saying something about an unexpected '!'.  
I changed it to a slightly longer form (i.e., "state->pressed==0"), and that worked fine.
2017-10-31 00:40:27 -04:00
Gun Pinyo
e555e42aae add Thai layers for the GunP planck (#1910)
* Add a layout of planck named GunP, ready for pull request review.

* add Thai layers for the GunP planck
2017-10-31 00:39:33 -04:00
William Wilson
38da7795f4 Added Chimera Ortho keymap 2017-10-31 00:30:24 -04:00
Pentti Laitinen
8c10b60c5f Initial commit for nordic layout for ergodox infinity.
- Added nordic infinity ergodox layout
- Fixed typo in ergodox infinity readme.md
2017-10-31 00:29:51 -04:00
Nathan Sharfi
c8fca10f0d zweihander-osx: Remove app keys, etc.
- add right command keys
- add F16 on ;' for Siri
- remove command-Q (too easy to hit)
2017-10-31 00:28:56 -04:00
Louis Orleans
1f6002db3f layout(planck): dudeofawesome's layout with simultaneous RGB and audio support (#1929)
* layout(planck): new layout initial commit

* feat(planck): add workman layout

* fix(planck): switching to workman

* layout(planck): swapping mnext and mplay

* feat(planck): prep for RGB

* perf(planck): remove plover

saves 256 bytes of memory

* perf(planck): remove colemak

saves 128 bytes

* layout(planck): swapping enter and quote

* perf(planck): disable console

frees 1664 bytes

* feat(planck): RGB under-lighting

* refactor(planck): change RGB pin

Uses pin labeled PB2

* feat(planck): add RGB keycodes

* feat(planck): re-enable audio

* style(planck): fixing indentation

Because who indents like that?

* style(planck): clean up keycodes

* layout(planck): remove del

* feat(planck): add tap-space to layer keys

* docs(planck): specify pin on PCB for RGB

* bug(planck): reducing tap time

* Revert "bug(planck): reducing tap time"

This reverts commit 62606b2dc6.

* Revert "feat(planck): add tap-space to layer keys"

This reverts commit c74de5a4aa.

* perf(planck): remove backlit case

* feat(planck): swap enter and quote

* bug(planck): moving right shift

* doc(planck): update README

* chore(planck): remove makefile
2017-10-31 00:27:07 -04:00
James Morgan
07017871e5 README, keymap & config update to 3 keyboards (#1911)
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.

* New Frosty Flake layout for QFR TKL

Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.

* README fix & keymap update for 3 keyboards

Fixed the markdown for the handwired/terminus_mini:default, Nyqyist:DivergeJM & frosty_flake:QFR_JM.

Added TAPPING_TERM =  150 to config.h for all keyboards

Switched LT(LOWER) and LAlt on the mod row for ortholinear boards.

* Update readme for QFR_JM to include make instructions

* Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware"

This reverts commit a45f264ada, reversing
changes made to 62349c3341.

* Revert "Revert "Merge branch 'master' of https://github.com/mogranjm/qmk_firmware""

This reverts commit eae54fb3be.

* Added QWERTY support to the QFR_JM

Implemented variable default base layer from the Planck default keymap.

* Update README to reflect QWERTY support
2017-10-29 20:07:36 -04:00
Jody Foo
f4949fdd32 Fix for issue https://github.com/qmk/qmk_firmware/issues/1751 2017-10-29 20:05:54 -04:00
Shihpin Tseng
750f8ec94e Fix process_combo.c compile warning 2017-10-29 20:05:26 -04:00
Jeremy Cowgar
49c32021db Added missing RGB and Auto Shift in main feature list. Also standardized on period at the end of each feature list item. 2017-10-29 20:04:10 -04:00
Jeremy Cowgar
76d807fe7d Fix code example in auto shift docs 2017-10-29 20:04:10 -04:00
Jeremy Cowgar
bf1fedc05e Fixed various feature links 2017-10-29 20:04:10 -04:00
Maxr1998
5960d0349c Add grave key 2017-10-29 20:02:52 -04:00
Sebastian Kaim
0afaed8535 Extended the hint of the programmer to link to the relevant README part instead of giving a generic hint. 2017-10-29 19:59:16 -04:00
Sebastian Kaim
688343f218 Added a better description for the bootloader key 2017-10-29 19:59:16 -04:00
Jack Humbert
4d421ee31c adds flashing docs 2017-10-29 18:44:29 -04:00
Campbell Barton
91683d56fa ergodox qwerty_code_friendly: add macro keys (#1918)
Also add more configurable keys.
2017-10-29 15:34:02 -07:00
Pentti Laitinen
9ee207acac Added Iso(ish) layout for tada68. (#1924)
- Basic layout with one function layer.
- Added correct mapping for ISO layout into tada68.h.
- Readme for the keymap.
2017-10-29 15:22:07 -07:00
Don Armstrong
0bb457e573 document how to define LEFT_LEDS and how that hack is done 2017-10-27 13:46:51 -07:00
Don Armstrong
364aeeec53 implement ergodox_left_leds_update in ergodox_ez
Previously, this code was implemented in keymap.c, but I'm unaware of
someone with a different implementation of this particular hack. [If
someone has it, we can add another #ifdef in the future.]
2017-10-27 13:34:03 -07:00
Don Armstrong
2e3b99f7f1 update left led support 2017-10-27 13:24:30 -07:00
Don Armstrong
bcfba27101 add initial support for left leds on an ergodox ez 2017-10-27 13:24:30 -07:00
Ethan Madden
b45b223389 Small documentation and keymap tweaks for my minivan layout (#1891)
* Added personal minivan keymap

more consistent layer setup

documentation!

slide some things around

more doc jiggling

* Small layout and documentation tweaks

Small documentation updates

dropped Makefile that for some reason was still in my branch

* found and removed extra makefile
2017-10-25 13:01:47 -10:00
Sebastian Kaim
7b754e1a5a added bfake support as a subproject (#1903)
* added bfake support as a subproject

also moved existing bmini stuff to a subproject

fixed columns

minor keymap update

making this a subproject

remove old stuff

got subproject stuff figured out

* travis was upset because a board didn't have a default keymap
2017-10-25 13:01:02 -10:00
Manassarn Manoonchai
a3f53aeaa1 Add narze keymaps for Ergodox & Planck with SuperDuper mode implementation (#1883)
* Fork default planck keymap

* Esc -> CapsLock

* Swap Tilde & Grave in Lower & Raise

* Replace Blacklight key with Raise

* Add Hyper/Esc & Shift/Enter key

* Add super duper mode using S+D combo

* Change superduper mode sound

* Add more functionality to superduper mode

* Fork default

* Replace all left shift to shift/parensopen (space cadet)

* Super / Underscore

* Try superduper on z/slash held

* Use function/macro instead, LGUI_UNDS alone not working

*  Add mouse layer 🐭

* 🐛 Fix superduper

*  Fix GUI_UNDS

* 🐛 Fix registering underscore when releasing too fast

* 🐛 Fix Shift/( with LT z

*  Add superduper for colemak

*  Add Qwerty on software Colemak layout & make Superduper available on multile layouts

*  Enable/disable superduper mode & fix layer switching

* 🐛 Fix superduper not unregister mods

*  Update planck-like ergodox (wip)

* 🐛 Fix return before changing tap count & modify comments

*  Replace with planck code

* 📝 Update readme

*  Fix SuperDuper by using intermediate layers

* Remove LT from inner lower & raise for ease of use

* Change TG to LG

* Add options & disable audio

* 🔧 Enable ignore mod tap interrupt & shorting tapping term

* 📝 Update readme

* Remove including quantum makefile

* 📝 Update readme

* Rename Makefiles
2017-10-25 06:11:07 -10:00
Doug Krieger
6c4639bfac Add RESET to satan:dbroqua mapping 2017-10-25 02:40:15 -10:00
skullydazed
67cc5cebc0 Restructure the hardware and feature docs to make things easier to find (#1888)
* fix #1313 by documenting more config.h options

* Clean up and organize documentation
2017-10-24 20:34:28 -07:00
heartrobotninja
8892c50336 Moving LOCK and adding RUN. Fixing equal key to actually use equal keycode. 2017-10-24 17:07:09 -10:00
Dylan Khor
9128ed50c2 Add macro to sleep Windows 10 2017-10-24 17:04:12 -10:00
Sebastian Kaim
1f43495922 Added a new keycode for cycling through RBG modes which reverses directions when shift is hold.
This commit adds a new keycode `RGB_SMOD` which is the same as `RGB_MOD` (cycle through all modes),
but when it is used in combination with shift it will reverse the direction.
2017-10-24 17:02:20 -10:00
Gun Pinyo
21dfa29c28 Add a layout of planck named GunP, ready for pull request review. 2017-10-24 17:01:20 -10:00
Bernardo Farah
4c960ad7c4 Added berfarah's custom keyboard layout 2017-10-24 16:59:35 -10:00
ajp10304
a08287b0a0 Added ajp10304 Planck layout (#1887)
* Added ajp10304 Planck layout

* Removed Makefile from planck ajp10304 keymap
2017-10-23 08:28:52 -10:00
alex-paget
af83c6a4cb My layout to suit my needs 2017-10-23 08:28:13 -10:00
Damien
e54c8df453 DZ60 changes (#1890)
* - Fixed DK60 version in config.h

* - Updated dk60 readme with new QMK rules

* - Fixed wording in readme

* Added dbroqua layout for DZ60

I've also updated dz60.h to add "true HHKD" keymap definition (6U
spacebar).

With the default HHKB definition r_alt was not mapped and when I pressed
r_menu it was r_alt.

Regards
2017-10-23 08:27:37 -10:00
James
c2b8a47604 Some finishing touches on space_oddity (#1892)
* Add verbose comments, ASCII layout pictures, and re-word readme.md

* Fix omission of F(2) on the third layer.
2017-10-23 08:26:52 -10:00
Dylan Khor
07ec609fad Missing line break in NIU Mini readme (#1886)
* Missing line break

* More specific URL to the product
2017-10-22 14:53:00 -10:00
mogranjm
a66e75609e Added new TKL layout for the Frosty flake - Quickfire Rapid (#1854)
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.

* New Frosty Flake layout for QFR TKL

Added a TKL layout for the Frosty Flake with a navigation cluster on LOWER under the left hand and a similarly functioning MOUSE layer that includes mouse navigation functionality.
2017-10-21 18:32:35 -10:00
drashna
f3534f999f Updated keymaps (#1853)
* Add woodpad

* Cleanup

* Remove misc layouts for woodpad

* Move woodpad to handwired

* Updated RGB Underglow info

* Cleanup macros

* Fix odd merge issue

* Tweaked RGB lighting stuff

* Start to merge orthodox/ergodox keymaps (persistant layers)

* Add forced NKRO

* Added Colemak and Dvorak layers to default orthodox keymap

* Added default layer (qwerty/colemak/dvorak) detection to RGB Underglow

* Updated macros and added workman keymaps

* Fixed RGB lighting for Workman layout

* Add leader keys

* Remove force NKRO

* Add Viterbi one handed layout and minor tweaks to others
2017-10-21 18:27:54 -10:00
mondaufgrau
22564d8ee7 Added xd60 ISO keymap (#1865)
* Added xd60 ISO keymap

* renamed ISO to iso

* some cleaning

* added iso keymap

* some cleaning
2017-10-21 18:26:05 -10:00
Carlos Filoteo
736140439d Add links to EEPROM files 2017-10-21 18:24:42 -10:00
Daniel Gordon
725aa5b820 Update to Tap-Dance Docs for Fast Typists
* Quad function tap dance works as intended when typing fast
    * Example 4 in doc has been updated

Change-Id: If33406299e2eed49152c495da92f4977dfdc1e2f
2017-10-21 18:24:06 -10:00
Jack Humbert
06f196c589 Creates a userspace for keymaps (#1559)
* create a user space

* adds example

* document, add readme.md

* jackhumbert userspace, ergodox keymap
2017-10-21 11:44:11 -10:00
skullY
9bb259b660 Fix the naming for clueboard files 2017-10-21 13:51:18 -07:00
James
ab3dbd8daa Additional custom handwired layout - Space Oddity (#1868)
* Add existing file

* Add new keyboard layout - initial commit

* Revised readme.md

* Clarified readme.md, reorganized keymap.c, and added license text.

* Fixing last incomplete commit

* Just a little code cleanup to make things more readable.
2017-10-21 10:04:35 -10:00
Pittyolo
1954ad1fd8 Added my Let's Split layout (#1867)
* Add files via upload

* Add files via upload

* Add files via upload

* Add files via upload

* Update keymap.c

* Update keymap.c

* Update keymap.c

* Update keymap.c

* Add files via upload

* Add files via upload

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Add files via upload

* Adding my Let's Split layout

As in my Nyquist layout, ISO Hungrian friendly
2017-10-21 10:02:51 -10:00
James
3276c4c56a Minor punctuation and grammar edits. 2017-10-21 10:02:14 -10:00
Jason Rosenman
3a1ce56aed Added caps lock + key lock 2017-10-21 10:01:48 -10:00
Jason Rosenman
2f24ed1046 Turned off some unnecessary makefile rules 2017-10-21 10:01:48 -10:00
CarVac
50a4b3510b Revise carvac_dv keymap for easier alt-tab (#1871)
* Add carvac_dv keymap for mitosis

* Add mouse keys

* move backspace, etc, and fix tab

* remove commented-out functions in keymap

* Fix scroll buttons and add left/right scrolling

* Make num momentary, add comments, and clean up

* fix mouse scroll acceleration

* Add tab, remove bksp, move print screen

Having tab next to control and alt makes for much easier
alt-tabbing and ctrl-tabbing.

That displaced print screen, but I had never used the non-layer
backspace on the right hand, so I moved printscreen over there.
2017-10-21 10:01:09 -10:00
marcostrauss
57bf00f28f ErgoDone: VID/PID/NKRO (#1872)
* - Fancy default PID and option for corresponding VID.
- Information about official VID/PID.
- Correct manufacturer name.
- NKRO enabled by default.

* Resolved build error with `#ifndef FORCE_NKRO`.
2017-10-21 10:00:41 -10:00
heartrobotninja
b25338a809 heartrobotninja ergodox_ez and lets_split layouts (#1874) 2017-10-21 09:59:31 -10:00
Jason Milkins
78923cb884 Fix code backticks on Frequently Asked Build Questions docs 2017-10-21 09:58:48 -10:00
Jason Milkins
a860d9d628 Fix missing code backticks 2017-10-21 09:58:17 -10:00
Danny
b5464cf20a Add Iris keyboard (#1863)
* Clone Nyquist code to Iris and rename

* Set keymap and pins

* Work in progress Iris default keymap

* Add Iris rev2

* Update Iris files to new build system

* Add lewisridden keymap
2017-10-19 04:02:00 -10:00
Daniel Gordon
383e508bc5 Quad Function Tap Dance added to TD Doc
* Added section to example, detailing how to accomplish the
        'quad-function' tap dance.
    * Refactored TD documentation to clearly separate different complex
        examples

Change-Id: Ifc1495d1142849c771418fdabc458c04c48311e6
2017-10-18 17:14:12 -10:00
skullydazed
3f3fa07918 Reorganize clueboard into a single directory (#1855) 2017-10-17 18:05:21 -07:00
skullydazed
ad49db8cd2 Address #1689 by using a formula to define the breathing curve (#1692)
* Address #1689 by using a formula to define the breathing curve and exposing defines to control the shape of the curve.

* Tweak the behavior of breathing for clueboard
2017-10-17 16:47:49 -07:00
mogranjm
d3fe6a0588 Add terminus_mini keyboard and nyquist/DivergeJM layout (#1851)
* First commit of the Terminus_Mini firmware and the DivergeJM version of the Nyquist firmware

* Fix terminus_mini & nyquist/DivergeJM readme files

Previously an outdated copy of the default readme. Updated to match the  Nyquist/DivergeJM format (DivergeJM is a split 5x12 implementation of the terminus_mini layout)

* Update makefiles to rules.mk

Renamed both Makefiles to rules.mk, removed references to makefiles

* Updated rules.mk

Inadvertantly removed important code from the rules.mk in previous commit. This has been restored.

Also disabled Tap_Dance in both rules.mk files

* Moved terminus_mini to handwired

Realised that existing directory was not appropriate for the terminus_mini project, moved to handwired.
2017-10-17 06:42:27 -10:00
Max Rumpf
af4697cba5 Add Maxr1998's GH60 layout (#1849)
* Maxr1998's GH60 layout

* delete unused makefile

* Remove unneeded include
2017-10-16 16:43:40 -10:00
Kenneth Aloysius
b7bb923962 Add NIU Mini from KBDFans (#1847)
* Add NIU Mini keymap from Planck keymap

* Remove old keymap files

* Fix README, removed Planck references

* Add default layout, move Planck layout to separate folder

* Update README
2017-10-16 13:31:39 -10:00
690 changed files with 27784 additions and 3596 deletions

18
.editorconfig Normal file
View File

@@ -0,0 +1,18 @@
# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
# We recommend you to keep these unchanged
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
indent_size = 4

10
.gitignore vendored
View File

@@ -4,6 +4,7 @@
*.eep
*.elf
*.hex
*.qmk
!util/bootloader.hex
!quantum/tools/eeprom_reset.hex
*.log
@@ -21,12 +22,20 @@ build/
quantum/version.h
.idea/
CMakeLists.txt
cmake-build-debug
.DS_STORE
/util/wsl_downloaded
/util/win_downloaded
/keyboards/*/Makefile
/keyboards/*/*/Makefile
/keyboards/*/*/*/Makefile
/keyboards/*/*/*/*/Makefile
/keyboards/*/*/*/*/*/Makefile
/keyboards/*/keymaps/Makefile
/keyboards/*/*/keymaps/Makefile
/keyboards/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/*/keymaps/Makefile
# Eclipse/PyCharm/Other IDE Settings
.cproject
@@ -37,6 +46,7 @@ CMakeLists.txt
*.stackdump
util/Win_Check_Output.txt
# Let these ones be user specific, since we have so many different configurations
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/tasks.json
.vscode/last.sql

1
.gitmodules vendored
View File

@@ -4,6 +4,7 @@
[submodule "lib/chibios-contrib"]
path = lib/chibios-contrib
url = https://github.com/qmk/ChibiOS-Contrib
branch = k-type-fix
[submodule "lib/ugfx"]
path = lib/ugfx
url = https://github.com/qmk/uGFX

6
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,6 @@
// Suggested extensions
{
"recommendations": [
"EditorConfig.EditorConfig"
]
}

339
LICENSE Normal file
View File

@@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -19,10 +19,12 @@ endif
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
override SILENT := false
ifndef SUB_IS_SILENT
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
ifneq ($(QMK_VERSION),)
$(info QMK Firmware $(QMK_VERSION))
endif
endif
ON_ERROR := error_occurred=1
@@ -114,6 +116,14 @@ list-keyboards:
echo $(KEYBOARDS)
exit 0
define PRINT_KEYBOARD
$(info $(PRINTING_KEYBOARD))
endef
generate-keyboards-file:
$(foreach PRINTING_KEYBOARD,$(KEYBOARDS),$(eval $(call PRINT_KEYBOARD)))
exit 0
#Compatibility with the old make variables, anything you specify directly on the command line
# always overrides the detected folders
ifdef keyboard

View File

@@ -94,6 +94,23 @@ endif
OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE)
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
endif
# We can assume a ChibiOS target When MCU_FAMILY is defined , since it's not used for LUFA
ifdef MCU_FAMILY
PLATFORM=CHIBIOS
@@ -183,6 +200,10 @@ else
# this state should never be reached
endif
# User space stuff
USER_PATH := users/$(KEYMAP)
-include $(USER_PATH)/rules.mk
# Object files directory
# To put object files in current directory, use a dot (.), do NOT make
# this an empty or blank macro!
@@ -204,6 +225,7 @@ SRC += $(KEYBOARD_SRC) \
VPATH += $(KEYMAP_PATH)
VPATH += $(KEYBOARD_PATHS)
VPATH += $(COMMON_VPATH)
VPATH += $(USER_PATH)
include common_features.mk
include $(TMK_PATH)/protocol.mk
@@ -228,10 +250,12 @@ ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
include $(VISUALIZER_PATH)/visualizer.mk
endif
ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
$(KEYMAP_OUTPUT)_SRC := $(SRC)
$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) $(GFXDEFS) \
-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(KEYBOARD_FOLDER_1).h\" -DQMK_KEYBOARD_CONFIG_H=\"$(KEYBOARD_PATH_1)/config.h\" \
-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" -DQMK_KEYBOARD_CONFIG_H=\"$(KEYBOARD_PATH_1)/config.h\" \
-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
-DQMK_SUBPROJECT -DQMK_SUBPROJECT_H -DQMK_SUBPROJECT_CONFIG_H
$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)

View File

@@ -70,6 +70,8 @@ ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes)
endif
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
OPT_DEFS += -DMOUSE_ENABLE
SRC += $(QUANTUM_DIR)/pointing_device.c
endif

View File

@@ -3,6 +3,7 @@
* [Install Build Tools](getting_started_build_tools.md)
* Alternative: [Vagrant Guide](getting_started_vagrant_guide.md)
* [Build/Compile instructions](getting_started_make_guide.md)
* [Flashing instructions](flashing.md)
* [Contributing to QMK](contributing.md)
* [How to Use Github](getting_started_github.md)
@@ -12,56 +13,64 @@
* [Debugging/Troubleshooting QMK](faq_debug.md)
* [Keymap](faq_keymap.md)
* [Hardware](hardware.md)
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* [AVR Processors](hardware_avr.md)
* ARM Processors (TBD)
* [Drivers](hardware_drivers.md)
* [Features](features.md)
* [Layouts](feature_layouts.md)
* [Common Shortcuts](feature_common_shortcuts.md)
* [Advanced Keycodes](feature_advanced_keycodes.md)
* [Audio](feature_audio.md)
* [Auto Shift](feature_auto_shift.md)
* [Backlight](feature_backlight.md)
* [Bootmagic](feature_bootmagic.md)
* [Dynamic Macros](dynamic_macros.md)
* [Key Lock](key_lock.md)
* [Dynamic Macros](feature_dynamic_macros.md)
* [Key Lock](feature_key_lock.md)
* [Layouts](feature_layouts.md)
* [Leader Key](feature_leader_key.md)
* [Macros](macros.md)
* [Mouse keys](mouse_keys.md)
* [Macros](feature_macros.md)
* [Mouse keys](feature_mouse_keys.md)
* [Pointing Device](feature_pointing_device.md)
* [PS2 Mouse](feature_ps2_mouse.md)
* [Space Cadet](space_cadet_shift.md)
* [Tap Dance](tap_dance.md)
* [Audio](feature_audio.md)
* [Thermal Printer](feature_thermal_printer.md)
* [Stenography](stenography.md)
* [Unicode](unicode.md)
* [RGB Lighting](feature_rgblight.md)
* [Space Cadet](feature_space_cadet.md)
* [Stenography](feature_stenography.md)
* [Tap Dance](feature_tap_dance.md)
* [Terminal](feature_terminal.md)
* [Thermal Printer](feature_thermal_printer.md)
* [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md)
* [Keycodes](keycodes.md)
* [Backlight](feature_backlight.md#backlight-keycodes)
* [Basic](keycodes_basic.md)
* [Bluetooth](feature_bluetooth.md#bluetooth-keycodes)
* [Bootmagic](feature_bootmagic.md#bootmagic-keycodes)
* [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
* [Mod+Key](feature_advanced_keycodes.md#modifier-keys)
* [Mod Tap](feature_advanced_keycodes.md#mod-tap)
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys)
* [Quantum](quantum_keycodes.md)
* [RGB Light](feature_rgblight.md#rgblight-keycodes)
* [Shifted Keys](feature_advanced_keycodes.md#shifted-keycodes)
* [Stenography](feature_stenography.md#keycode-reference)
* [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* Reference
* [Glossary](glossary.md)
* [Keymap overview](keymap.md)
* [Keycodes](keycodes.md)
* [Basic](keycodes_basic.md)
* [Quantum](quantum_keycodes.md)
* [Backlight](feature_backlight.md#backlight-keycodes)
* [Bluetooth](feature_bluetooth.md#bluetooth-keycodes)
* [Bootmagic](feature_bootmagic.md#bootmagic-keycodes)
* [Layer Switching](feature_common_shortcuts.md#switching-and-toggling-layers)
* [Mod+Key](feature_common_shortcuts.md#modifier-keys)
* [Mod Tap](feature_common_shortcuts.md#mod-tap)
* [One Shot Keys](feature_common_shortcuts.md#one-shot-keys)
* [Shifted Keys](feature_common_shortcuts.md#shifted-keycodes)
* [Stenography](stenography.md#keycode-reference)
* [RGB Light](feature_rgblight.md#rgblight-keycodes)
* [Thermal Printer](feature_thermal_printer.md#thermal-printer-keycodes)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* [The `config.h` File](config_options.md)
* [Config Options](config_options.md)
* [Customizing Functionality](custom_quantum_functions.md)
* [Documentation Best Practices](documentation_best_practices.md)
* [Documentation Templates](documentation_templates.md)
* [Glossary](glossary.md)
* [Keymap overview](keymap.md)
* [Unit Testing](unit_testing.md)
* For Makers and Modders
* [Adding a keyboard to QMK](adding_a_keyboard_to_qmk.md)
* [Hand Wiring Guide](hand_wiring.md)
* [Hand Wiring Guide](hand_wire.md)
* [ISP flashing guide](isp_flashing_guide.md)
* [Modding your keyboard](modding_your_keyboard.md)
* [Porting your keyboard to QMK](porting_your_keyboard_to_qmk.md)
* For a Deeper Understanding
* [How Keyboards Work](how_keyboards_work.md)

View File

@@ -1,35 +0,0 @@
# Adding your keyboard to QMK
We welcome all keyboard projects into QMK, but ask that you try to stick to a couple guidelines that help us keep things organised and consistent.
## Naming your directory/project
All names should be lowercase alphanumeric, and separated by an underscore (`_`), but not begin with one. Your directory and your `.h` and `.c` files should have exactly the same name. All folders should follow the same format.
## `readme.md`
All projects need to have a `readme.md` file that explains what the keyboard is, who made it, where it is available, and links to move information (template coming).
## Image/Hardware files
In an effort to keep the repo size down, we're no longer accepting images of any format in the repo, with few exceptions. Hosting them elsewhere (imgur) and linking them in the readme.md is the preferred method.
Any sort of hardware file (plate, case, pcb) can't be stored in qmk_firmware, but we have the [qmk.fm repo](https://github.com/qmk/qmk.fm) where such files (as well as in-depth info) can be store, and viewed on [qmk.fm](http://qmk.fm). Downloadable files are stored in `/<keyboard>/` (name follows the same format as above) which are served at `http://qmk.fm/<keyboard>/`, and pages are generated from `/_pages/<keyboard>/` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` directory for an example.
## Non-production/handwired projects
We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder!
## Warnings as errors
When developing your keyboard, keep in mind that all warnings will be treated as errors - these small warnings can build-up and cause larger errors down the road (and keeping them is generally a bad practice).
## Licenses
If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, in this format:
Copyright 2017 Your Name <your@email.com>
## Technical details
If you're looking for more information on making your keyboard work with QMK, [check out this guide](porting_your_keyboard_to_qmk.md)!

View File

@@ -1,129 +1,217 @@
# The `config.h` file
# Configuring QMK
This is a c header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere (namely keymaps). This file can exist at a couple different levels:
QMK is nearly infinitely configurable. Wherever possible we err on the side of allowing users to customize their keyboard, even at the expense of code size. That level of flexibility makes for a daunting configuration experience, however.
There are two main types of configuration files in QMK- `config.h` and `rules.mk`. These files exist at various levels in QMK and all files of the same type are combined to build the final configuration. The levels, from lowest priority to highest priority, are:
* QMK Default
* Keyboard
* Folders (Up to 5 levels deep)
* Keymap
## QMK Default
Every available setting in QMK has a default. If that setting is not set at the Keyboard, Folder, or Keymap level this is the setting that will be used.
## Keyboard
```c
#ifndef CONFIG_H
#define CONFIG_H
This level contains config options that should apply to the whole keyboard. Some settings won't change in revisions, or most keymaps. Other settings are merely defaults for this keyboard and can be overridden by folders and/or keymaps.
#include "config_common.h"
## Folders
// config options
#endif
```
This file contains config options that should apply to the whole keyboard, and won't change in revisions, or most keymaps. The revision block here only applies to keyboards with revisions.
## Revisions
```c
#ifndef <revision>_CONFIG_H
#define <revision>_CONFIG_H
#include "config_common.h"
// config options
#endif
```
For keyboards that have revisions, this file contains config options that should apply to only that revisions, and won't change in most keymaps.
Some keyboards have folders and sub-folders to allow for different hardware configurations. Most keyboards only go 1 folder deep, but QMK supports structures up to 5 folders deep. Each folder can have its own `config.h` and `rules.mk` files that are incorporated into the final configuration.
## Keymap
```c
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
This level contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
#include "config_common.h"
# The `config.h` file
// config options
This is a C header file that is one of the first things included, and will persist over the whole project (if included). Lots of variables can be set here and accessed elsewhere. The `config.h` file shouldn't be including other `config.h` files, or anything besides this:
#endif
```
#include "config_common.h"
This file contains all of the options for that particular keymap. If you wish to override a previous declaration, you can use `#undef <variable>` to undefine it, where you can then redefine it without an error.
## `config.h` Options
# Config Options
### Hardware Options
* `#define VENDOR_ID 0x1234`
* defines your VID, and for most DIY projects, can be whatever you want
* `#define PRODUCT_ID 0x5678`
* defines your PID, and for most DIY projects, can be whatever you want
* `#define DEVICE_VER 0`
* defines the device version (often used for revisions)
* `#define MANUFACTURER Me`
* generally who/whatever brand produced the board
* `#define PRODUCT Board`
* the name of the keyboard
* `#define DESCRIPTION a keyboard`
* a short description of what the keyboard is
* `#define MATRIX_ROWS 5`
* the number of rows in your keyboard's matrix
* `#define MATRIX_COLS 15`
* the number of columns in your keyboard's matrix
* `#define MATRIX_ROW_PINS { D0, D5, B5, B6 }`
* pins of the rows, from top to bottom
* `#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }`
* pins of the columns, from left to right
* `#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 }`
* pins unused by the keyboard for reference
* `#define MATRIX_HAS_GHOST`
* define is matrix has ghost (unlikely)
* `#define DIODE_DIRECTION COL2ROW`
* COL2ROW or ROW2COL - how your matrix is configured. COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows.
* `#define AUDIO_VOICES`
* turns on the alternate audio voices (to cycle through)
* `#define C6_AUDIO`
* enables audio on pin C6
* `#define B5_AUDIO`
* enables audio on pin B5 (duophony is enable if both are enabled)
* `#define BACKLIGHT_PIN B7`
* pin of the backlight - B5, B6, B7 use PWM, others use softPWM
* `#define BACKLIGHT_LEVELS 3`
* number of levels your backlight will have (not including off)
* `#define DEBOUNCING_DELAY 5`
* the delay when reading the value of the pin (5 is default)
* `#define LOCKING_SUPPORT_ENABLE`
* mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
* `#define LOCKING_RESYNC_ENABLE`
* tries to keep switch state consistent with keyboard LED state
* `#define IS_COMMAND() ( keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) )`
* key combination that allows the use of magic commands (useful for debugging)
```c
#define VENDOR_ID 0x1234 // defines your VID, and for most DIY projects, can be whatever you want
#define PRODUCT_ID 0x5678 // defines your PID, and for most DIY projects, can be whatever you want
#define DEVICE_VER 0 // defines the device version (often used for revisions)
### Features That Can Be Disabled
#define MANUFACTURER Me // generally who/whatever brand produced the board
#define PRODUCT Board // the name of the keyboard
#define DESCRIPTION a keyboard // a short description of what the keyboard is
If you define these options you will disable the associated feature, which can save on code size.
#define MATRIX_ROWS 5 // the number of rows in your keyboard's matrix
#define MATRIX_COLS 15 // the number of columns in your keyboard's matrix
* `#define NO_DEBUG`
* disable debuging
* `#define NO_PRINT`
* disable printing/debugging using hid_listen
* `#define NO_ACTION_LAYER`
* disable layers
* `#define NO_ACTION_TAPPING`
* disable tap dance and other tapping features
* `#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
* `#define NO_ACTION_MACRO`
* disable all macro handling
* `#define NO_ACTION_FUNCTION`
* disable the action function (deprecated)
#define MATRIX_ROW_PINS { D0, D5, B5, B6 } // pins of the rows, from top to bottom
#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } // pins of the columns, from left to right
#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 } // pins unused by the keyboard for reference
#define MATRIX_HAS_GHOST // define is matrix has ghost (unlikely)
#define DIODE_DIRECTION COL2ROW // COL2ROW or ROW2COL - how your matrix is configured
// COL2ROW means the black mark on your diode is facing to the rows, and between the switch and the rows
### Features That Can Be Enabled
#define AUDIO_VOICES // turns on the alternate audio voices (to cycle through)
#define C6_AUDIO // enables audio on pin C6
#define B5_AUDIO // enables audio on pin B5 (duophony is enable if both are enabled)
If you define these options you will enable the associated feature, which may increase your code size.
#define BACKLIGHT_PIN B7 // pin of the backlight - B5, B6, B7 use PWM, others use softPWM
#define BACKLIGHT_LEVELS 3 // number of levels your backlight will have (not including off)
* `#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of eeprom setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define PREVENT_STUCK_MODIFIERS`
* when switching layers, this will release all mods
#define DEBOUNCING_DELAY 5 // the delay when reading the value of the pin (5 is default)
### Behaviors That Can Be Configured
#define LOCKING_SUPPORT_ENABLE // mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap
#define LOCKING_RESYNC_ENABLE // tries to keep switch state consistent with keyboard LED state
* `#define TAPPING_TERM 200`
* how long before a tap becomes a hold
* `#define RETRO_TAPPING`
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
* `#define TAPPING_TOGGLE 2`
* how many taps before triggering the toggle
* `#define PERMISSIVE_HOLD`
* makes tap and hold keys work better for fast typers who don't want tapping term set above 500
* `#define LEADER_TIMEOUT 300`
* how long before the leader key times out
* `#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out
* `#define ONESHOT_TAP_TOGGLE 2`
* how many taps before oneshot toggle is triggered
* `#define IGNORE_MOD_TAP_INTERRUPT`
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
* `#define QMK_KEYS_PER_SCAN 4`
* Allows sending more than one key per scan. By default, only one key event gets
sent via `process_record()` per scan. This has little impact on most typing, but
if you're doing a lot of chords, or your scan rate is slow to begin with, you can
have some delay in processing key events. Each press and release is a separate
event. For a keyboard with 1ms or so scan times, even a very fast typist isn't
going to produce the 500 keystrokes a second needed to actually get more than a
few ms of delay from this. But if you're doing chording on something with 3-4ms
scan times? You probably want this.
#define IS_COMMAND() ( \ // key combination that allows the use of magic commands (useful for debugging)
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
### RGB Light Configuration
// the following options can save on file size at the expense of that feature
#define NO_DEBUG // disable debuging (saves on file size)
#define NO_PRINT // disable printing (saves of file size)
#define NO_ACTION_LAYER // no layers
#define NO_ACTION_TAPPING // no tapping for layers/mods
#define NO_ACTION_ONESHOT // no oneshot for layers/mods
#define NO_ACTION_MACRO // no macros
#define NO_ACTION_FUNCTION // no functions
* `#define RGB_DI_PIN D7`
* pin the DI on the ws2812 is hooked-up to
* `#define RGBLIGHT_ANIMATIONS`
* run RGB animations
* `#define RGBLED_NUM 15`
* number of LEDs
* `#define RGBLIGHT_HUE_STEP 12`
* units to step when in/decreasing hue
* `#define RGBLIGHT_SAT_STEP 25`
* units to step when in/decresing saturation
* `#define RGBLIGHT_VAL_STEP 12`
* units to step when in/decreasing value (brightness)
* `#define RGBW_BB_TWI`
* bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
#define FORCE_NKRO // NKRO by default requires to be turned on, this forces it to be on always
### Mouse Key Options
#define PREVENT_STUCK_MODIFIERS // when switching layers, this will release all mods
* `#define MOUSEKEY_INTERVAL 20`
* `#define MOUSEKEY_DELAY 0`
* `#define MOUSEKEY_TIME_TO_MAX 60`
* `#define MOUSEKEY_MAX_SPEED 7`
* `#define MOUSEKEY_WHEEL_DELAY 0`
#define TAPPING_TERM 200 // how long before a tap becomes a hold
#define TAPPING_TOGGLE 2 // how many taps before triggering the toggle
# The `rules.mk` File
#define PERMISSIVE_HOLD // makes tap and hold keys work better for fast typers who don't want tapping term set above 500
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
#define LEADER_TIMEOUT 300 // how long before the leader key times out
## `rules.mk` options
#define ONESHOT_TIMEOUT 300 // how long before oneshot times out
#define ONESHOT_TAP_TOGGLE 2 // how many taps before oneshot toggle is triggered
### Build Options
#define IGNORE_MOD_TAP_INTERRUPT // makes it possible to do rolling combos (zx) with keys that convert to other keys on hold
* `DEFAULT_FOLDER`
* Used to specify a default folder when a keyboard has more than one sub-folder.
* `SRC`
* Used to add files to the compilation/linking list.
* `LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
// ws2812 options
#define RGB_DI_PIN D7 // pin the DI on the ws2812 is hooked-up to
#define RGBLIGHT_ANIMATIONS // run RGB animations
#define RGBLED_NUM 15 // number of LEDs
#define RGBLIGHT_HUE_STEP 12 // units to step when in/decreasing hue
#define RGBLIGHT_SAT_STEP 25 // units to step when in/decresing saturation
#define RGBLIGHT_VAL_STEP 12 // units to step when in/decreasing value (brightness)
### AVR MCU Options
* `MCU = atmega32u4`
* `F_CPU = 16000000`
* `ARCH = AVR8`
* `F_USB = $(F_CPU)`
* `OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT`
* `BOOTLOADER = atmel-dfu` with the following options:
* `atmel-dfu`
* `lufa-dfu`
* `qmk-dfu`
* `halfkay`
* `caterina`
* `bootloadHID`
#define RGBW_BB_TWI // bit-bangs twi to EZ RGBW LEDs (only required for Ergodox EZ)
### Feature Options
// mousekey options (self-describing)
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_TIME_TO_MAX 60
#define MOUSEKEY_MAX_SPEED 7
#define MOUSEKEY_WHEEL_DELAY 0
Use these to enable or disable building certain features. The more you have enabled the bigger your firmware will be, and you run the risk of building a firmware too large for your MCU.
```
* `BOOTMAGIC_ENABLE`
* Virtual DIP switch configuration(+1000)
* `MOUSEKEY_ENABLE`
* Mouse keys(+4700)
* `EXTRAKEY_ENABLE`
* Audio control and System control(+450)
* `CONSOLE_ENABLE`
* Console for debug(+400)
* `COMMAND_ENABLE`
* Commands for debug and configuration
* `NKRO_ENABLE`
* USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
* `AUDIO_ENABLE`
* Enable the audio subsystem.
* `RGBLIGHT_ENABLE`
* Enable keyboard underlight functionality
* `MIDI_ENABLE`
* MIDI controls
* `UNICODE_ENABLE`
* Unicode
* `BLUETOOTH_ENABLE`
* Enable Bluetooth with the Adafruit EZ-Key HID

View File

@@ -80,7 +80,7 @@ We have a few different types of changes in QMK, each requiring a different leve
* Make sure your code change actually compiles.
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return an error
* Keyboards: Make sure that `make keyboard:all` does not return any errors
* Core: Make sure that `make allkb` does not return any errors.
* Core: Make sure that `make all` does not return any errors.
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
```
@@ -104,6 +104,8 @@ Most first-time QMK contributors start with their personal keymaps. We try to ke
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* All Keymap PR's are squashed, so if you care about how your commits are squashed you should do it yourself
* Do not lump features in with keymap PR's. Submit the feature first and then a second PR for the keymap.
* Do not include `Makefile`s in your keymap folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Keyboards
@@ -114,6 +116,9 @@ We also ask that you follow these guidelines:
* Write a `readme.md` using [the template](https://docs.qmk.fm/documentation_templates.html#).
* Keep the number of commits reasonable or we will squash your PR
* Do not lump core features in with new keyboards. Submit the feature first and then submit a separate PR for the keyboard.
* Name `.c`/`.h` file after the immediate parent folder, eg `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* Do not include `Makefile`s in your keyboard folder (they're no longer used)
* Update copyrights in file headers (look for `REPLACE_WITH_YOUR_NAME `)
## Quantum/TMK Core
@@ -144,4 +149,4 @@ To maintain a clear vision of how things are laid out in QMK we try to plan out
# What does the Code of Conduct mean for me?
Our Code of Conduct means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.
Our [Code of Conduct](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) means that you are responsible for treating everyone on the project with respect and courtesy regardless of their identity. If you are the victim of any inappropriate behavior or comments as described in our Code of Conduct, we are here for you and will do the best to ensure that the abuser is reprimanded appropriately, per our code.

View File

@@ -62,7 +62,7 @@ https://github.com/tmk/tmk_keyboard/wiki/mbed-cortex-porting#compile-error-cstdd
https://developer.mbed.org/forum/mbed/topic/5205/
## 'clock_prescale_set' and 'clock_div_1' not available
## `clock_prescale_set` and `clock_div_1` not available
Your toolchain is too old to support the MCU. For example WinAVR 20100110 doesn't support ATMega32u2.
```

View File

@@ -159,6 +159,7 @@ byte Teensy(ATMega32u4) byte Teensy++(AT90SUB1286)
And see this discussion for further reference.
https://github.com/tmk/tmk_keyboard/issues/179
If you are using a TeensyUSB, there is a [known bug](https://github.com/qmk/qmk_firmware/issues/164) in which the hardware reset button prevents the RESET key from working. Unplugging the keyboard and plugging it back in should resolve the problem.
## Special Extra key doesn't work(System, Audio control keys)
You need to define `EXTRAKEY_ENABLE` in `rules.mk` to use them in QMK.

View File

@@ -10,7 +10,7 @@
## What Differences Are There Between QMK and TMK?
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert's](https://github.com/jackhumbert) fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
TMK was originally designed and implemented by [Jun Wako](https://github.com/tmk). QMK started as [Jack Humbert](https://github.com/jackhumbert)'s fork of TMK for the Planck. After a while Jack's fork had diverged quite a bit from TMK, and in 2015 Jack decided to rename his fork to QMK.
From a technical standpoint QMK builds upon TMK by adding several new features. Most notably QMK has expanded the number of available keycodes and uses these to implement advanced features like `S()`, `LCTL()`, and `MO()`. You can see a complete list of these keycodes in [Keycodes](keycodes.md).

View File

@@ -7,6 +7,17 @@ See [Keycodes](keycodes.md) for an index of keycodes available to you. These lin
Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
## What Are The Default Keycodes?
There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here:
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/9ce023dc6caadc0cf11c88c782350a8c -->
![Keyboard Layout Image](https://i.imgur.com/45m4mRf.png)
## The Menu Key Isn't Working
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
## `KC_SYSREQ` isn't working
Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.

View File

@@ -1,6 +1,8 @@
# Common Keymap Shortcuts
# Advanced Keycodes
Your keymap can include shortcuts to common operations, for example shifted keys. This page documents the functions that are available to you.
Your keymap can include keycodes that are more advanced than normal, for example shifted keys. This page documents the functions that are available to you.
### Assigning Custom Names
People often define custom names using `#define`. For example:
@@ -15,7 +17,7 @@ This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping i
Currently, the keycodes able to used with these functions are limited to the [Basic Keycodes](keycodes_basic.html), meaning you can't use keycodes like `KC_TILD`, or anything greater than 0xFF. For a full list of the keycodes able to be used see [Basic Keycodes](keycodes_basic.html).
## Switching and toggling layers
# Switching and toggling layers
These functions allow you to activate layers in various ways.
@@ -25,7 +27,7 @@ These functions allow you to activate layers in various ways.
* `TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed).
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, the layer becomes active, and then deactivates when you let go. And if you tap it, the layer simply becomes active (toggles on). It needs 5 taps by default, but you can set it by defining `TAPPING_TOGGLE`, for example, `#define TAPPING_TOGGLE 2` for just two taps.
## Working With Layers
# Working With Layers
Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
@@ -47,7 +49,9 @@ Once you have a good feel for how layers work and what you can do, you can get m
Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
## Modifier keys
Sometimes, you might want to switch between layers in a macro or as part of a tap dance routine. `layer_on` activates a layer, and `layer_off` deactivates it. More layer-related functions can be found in [action_layer.h](../tmk_core/common/action_layer.h).
# Modifier keys
These functions allow you to combine a mod with a keycode. When pressed the keydown for the mod will be sent first, and then *kc* will be sent. When released the keyup for *kc* will be sent and then the mod will be sent.
@@ -67,7 +71,7 @@ You can also chain these, like this:
LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
## Shifted Keycodes
# Shifted Keycodes
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols.
@@ -95,7 +99,7 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u
| KC_PIPE | &#x7C; |
| KC_COLN | : |
## Mod Tap
# Mod Tap
`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
@@ -125,7 +129,7 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
* `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
* `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
## One Shot Keys
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are releasd. This allows you to type keyboard combinations without pressing more than one key at a time.
@@ -143,6 +147,8 @@ You can control the behavior of one shot keys by defining these in `config.h`:
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes.
* `OSL(layer)` - momentary switch to *layer*.
Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](../tmk_core/common/action.c#L429).
## Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:

View File

@@ -42,7 +42,7 @@ Yes, unfortunately.
Add to your `rules.mk` in the keymap folder:
AUTO_SHIFT_ENABLE = YES
AUTO_SHIFT_ENABLE = yes
If no `rules.mk` exists, you can create one.
@@ -136,24 +136,22 @@ completely normal and with no intention of shifted keys.
#### An example run
'''
hello world. my name is john doe. i am a computer programmer playing with
keyboards right now.
hello world. my name is john doe. i am a computer programmer playing with
keyboards right now.
[PRESS KC_ASDN quite a few times]
[PRESS KC_ASDN quite a few times]
heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
KEYboArDS RiGHT NOw.
heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
KEYboArDS RiGHT NOw.
[PRESS KC_ASUP a few times]
[PRESS KC_ASUP a few times]
hello world. my name is john Doe. i am a computer programmer playing with
keyboarDs right now.
hello world. my name is john Doe. i am a computer programmer playing with
keyboarDs right now.
[PRESS KC_ASRP]
[PRESS KC_ASRP]
115
'''
115
The keyboard typed `115` which represents your current `AUTO_SHIFT_TIMEOUT`
value. You are now set! Practice on the *D* key a little bit that showed up

View File

@@ -1,6 +1,6 @@
# Dynamic macros: record and replay macros in runtime
QMK supports temporarily macros created on the fly. We call these Dynamic Macros. They are defined by the user from the keyboard and are lost when the keyboard is unplugged or otherwise rebooted.
QMK supports temporary macros created on the fly. We call these Dynamic Macros. They are defined by the user from the keyboard and are lost when the keyboard is unplugged or otherwise rebooted.
You can store one or two macros and they may have a combined total of 128 keypresses. You can increase this size at the cost of RAM.
@@ -22,7 +22,7 @@ enum planck_keycodes {
It must be the last element because `dynamic_macros.h` will add some more keycodes after it.
Below it include the `dynamic_macro.h` header:
Below it, include the `dynamic_macro.h` header:
```c
#include "dynamic_macro.h"`
@@ -58,6 +58,6 @@ For users of the earlier versions of dynamic macros: It is still possible to fin
}
```
If the LED's start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by setting the `DYNAMIC_MACRO_SIZE` preprocessor macro (default value: 128; please read the comments for it in the header).
For the details about the internals of the dynamic macros, please read the comments in the `dynamic_macro.h` header.

View File

@@ -55,10 +55,6 @@ Instead of using `#include "planck.h"`, you can use this line to include whateve
#include QMK_KEYBOARD_H
In your config.h, you can also use this variable to include the keyboard's `config.h`:
#include QMK_KEYBOARD_CONFIG_H
If you want to keep some keyboard-specific code, you can use these variables to escape it with an `#ifdef` statement:
* `KEYBOARD_<folder1>_<folder2>`
@@ -73,4 +69,4 @@ For example:
#endif
```
Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly.
Note that the names are lowercase and match the folder/file names for the keyboard/revision exactly.

View File

@@ -8,34 +8,78 @@ Macros allow you to send multiple keystrokes when pressing just one key. QMK has
## The new way: `SEND_STRING()` & `process_record_user`
Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string for you. All ascii that is easily translated to a keycode is supported (eg `\n\t`).
Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string (i.e. a sequence of characters) for you. All ASCII characters that are easily translated to a keycode are supported (e.g. `\n\t`).
For example:
Here is an example `keymap.c` for a two-key keyboard:
```c
enum custom_keycodes {
PRINT_TRUTH = SAFE_RANGE
MY_CUSTOM_MACRO = SAFE_RANGE
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
case PRINT_TRUTH:
SEND_STRING("QMK is the best thing ever!");
case MY_CUSTOM_MACRO:
SEND_STRING("QMK is the best thing ever!"); // this is our macro!
return false; break;
}
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{MY_CUSTOM_MACRO, KC_ESC}
}
};
```
### Tap/down/up
What happens here is this:
We first define a new custom keycode in the range not occupied by any other keycodes.
Then we use the `process_record_user` function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated.
If yes, we send the string `"QMK is the best thing ever!"` to the computer via the `SEND_STRING` macro (this is a C preprocessor macro, not to be confused with QMK macros).
We return `false` to indicate to the caller that the key press we just processed need not be processed any further.
Finally, we define the keymap so that the first button activates our macro and the second button is just an escape button.
You might want to add more than one macro.
You can do that by adding another keycode and adding another case to the switch statement, like so:
```c
enum custom_keycodes {
MY_CUSTOM_MACRO = SAFE_RANGE,
MY_OTHER_MACRO
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
case MY_CUSTOM_MACRO:
SEND_STRING("QMK is the best thing ever!");
return false; break;
case MY_OTHER_MACRO:
SEND_STRING(SS_LCTRL("ac")); // selects all and copies
return false; break;
}
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{MY_CUSTOM_MACRO, MY_OTHER_MACRO}
}
};
```
### TAP, DOWN and UP
You may want to use keys in your macros that you can't write down, such as `Ctrl` or `Home`.
You can send arbitary keycodes by wrapping them in:
* `SS_TAP()`
* `SS_DOWN()`
* `SS_UP()`
* `SS_TAP()` presses and releases a key.
* `SS_DOWN()` presses (but does not release) a key.
* `SS_UP()` releases a key.
For example:
@@ -52,12 +96,14 @@ There's also a couple of mod shortcuts you can use:
* `SS_LCTRL(string)`
* `SS_LGUI(string)`
* `SS_LALT(string)`
* `SS_LSFT(string)`
That can be used like this:
These press the respective modifier, send the supplied string and then release the modifier.
They can be used like this:
SEND_STRING(SS_LCTRL("a"));
Which would send LCTRL+a (LTRL down, a, LTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.
Which would send LCTRL+a (LCTRL down, a, LCTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.
### Alternative keymaps

View File

@@ -49,8 +49,10 @@ If you have `#define RGBLIGHT_ANIMATIONS` in your `config.h` you will have a num
| Option | Default Value | Description |
|--------|---------------|-------------|
| `RGBLIGHT_ANIMATIONS` | | `#define` this to enable animation modes. |
| `RGBLIGHT_EFFECT_SNAKE_LENGTH` | 4 | The number of LEDs to light up for the "snake" mode. |
| `RGBLIGHT_EFFECT_KNIGHT_LENGTH` | 3 | The number of LEDs to light up for the "knight" mode. |
| `RGBLIGHT_EFFECT_BREATHE_CENTER` | 1.85 | Used to calculate the curve for the breathing animation. Valid values 1.0-2.7. |
| `RGBLIGHT_EFFECT_BREATHE_MAX` | 255 | The maximum brightness for the breathing mode. Valid values 1-255. |
| `RGBLIGHT_EFFECT_SNAKE_LENGTH` | 4 | The number of LEDs to light up for the "snake" animation. |
| `RGBLIGHT_EFFECT_KNIGHT_LENGTH` | 3 | The number of LEDs to light up for the "knight" animation. |
| `RGBLIGHT_EFFECT_KNIGHT_OFFSET` | 0 | Start the knight animation this many LEDs from the start of the strip. |
| `RGBLIGHT_EFFECT_KNIGHT_LED_NUM` | RGBLED_NUM | The number of LEDs to have the "knight" animation travel. |
| `RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL` | 1000 | How long to wait between light changes for the "christmas" animation. Specified in ms. |
@@ -86,6 +88,7 @@ These control the RGB Lighting functionality.
|-----------|------------|-------------|
||`RGB_TOG`|toggle on/off|
||`RGB_MOD`|cycle through modes|
||`RGB_SMOD`|cycle through modes, use reverse direction when shift is hold|
||`RGB_HUI`|hue increase|
||`RGB_HUD`|hue decrease|
||`RGB_SAI`|saturation increase|

View File

@@ -63,20 +63,23 @@ qk_tap_dance_action_t tap_dance_actions[] = {
TD(TD_ESC_CAPS)
```
## Complex Example
## Complex Examples
Here's a more complex example involving custom actions:
This section details several complex tap dance examples.
All the enums used in the examples are declared like this:
```c
// Enums defined for all examples:
enum {
CT_SE = 0,
CT_CLN,
CT_EGG,
CT_FLSH,
X_TAP_DANCE
};
/* Have the above three on the keymap, TD(CT_SE), etc... */
```
### Example 1: Send `:` on single tap, `;` on double tap
```c
void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_RSFT);
@@ -95,6 +98,13 @@ void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
}
}
//All tap dance functions would go here. Only showing this one.
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
};
```
### Example 2: Send "Safety Dance!" after 100 taps
```c
void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 100) {
SEND_STRING ("Safety dance!");
@@ -102,6 +112,14 @@ void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
};
```
### Example 3: Turn LED lights on then off, one at a time
```c
// on each tap, light up one led, from right to left
// on the forth tap, turn them off from right to left
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
@@ -141,6 +159,7 @@ void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_3_off();
}
//All tap dances now put together. Example 3 is "CT_FLASH"
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
@@ -148,3 +167,84 @@ qk_tap_dance_action_t tap_dance_actions[] = {
,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
};
```
### Example 4: 'Quad Function Tap-Dance'
By [DanielGGordon](https://github.com/danielggordon)
Allow one key to have 4 (or more) functions, depending on number of presses, and if the key is held or tapped.
Below is a specific example:
* Tap = Send `x`
* Hold = Send `Control`
* Double Tap = Send `Escape`
* Double Tap and Hold = Send `Alt`
The following example can be easily expanded to more than 4 quite easily:
```c
//**************** Definitions needed for quad function to work *********************//
//Enums used to clearly convey the state of the tap dance
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5 //send SINGLE_TAP twice - NOT DOUBLE_TAP
// Add more enums here if you want for triple, quadruple, etc.
};
typedef struct {
bool is_press_action;
int state;
} tap;
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
//If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
if (state->interrupted || state->pressed==0) return SINGLE_TAP;
else return SINGLE_HOLD;
}
//If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
//with single tap. In example below, that means to send `xx` instead of `Escape`.
else if (state->count == 2) {
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
else return 6; //magic number. At some point this method will expand to work for more presses
}
//**************** Definitions needed for quad function to work *********************//
//instanalize an instance of 'tap' for the 'x' tap dance.
static tap xtap_state = {
.is_press_action = true,
.state = 0
};
void x_finished (qk_tap_dance_state_t *state, void *user_data) {
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP: register_code(KC_X); break;
case SINGLE_HOLD: register_code(KC_LCTRL); break;
case DOUBLE_TAP: register_code(KC_ESC); break;
case DOUBLE_HOLD: register_code(KC_LALT); break;
case DOUBLE_SINGLE_TAP: register_code(KC_X); unregister_code(KC_X); register_code(KC_X);
//Last case is for fast typing. Assuming your key is `f`:
//For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
//In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
}
}
void x_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (xtap_state.state) {
case SINGLE_TAP: unregister_code(KC_X); break;
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
case DOUBLE_TAP: unregister_code(KC_ESC); break;
case DOUBLE_HOLD: unregister_code(KC_LALT);
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
}
xtap_state.state = 0;
}
```
And then simply add this to your list of tap dance functions:
`[X_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset)`

87
docs/feature_userspace.md Normal file
View File

@@ -0,0 +1,87 @@
# Userspace: sharing code between keymaps
If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your github username, `<name>`) with the following structure:
* `/users/<name>/` (added to the path automatically)
* `readme.md`
* `rules.mk` (included automatically)
* `<name>.h` (optional)
* `<name>.c` (optional)
`<name>.c` will need to be added to the SRC in `rules.mk` like this:
SRC += <name>.c
Additional files may be added in the same way - it's recommended you have one named `<name>`.c/.h though.
All this only happens when you build a keymap named `<name>`, like this:
make planck:<name>
For example,
make planck:jack
Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`.
## Readme
Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
## Example
For a brief example, checkout `/users/_example/` , or for a more detailed examples check out [`template.h`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.h) and [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in `/users/drashna/` .
### Consolidated Macros
If you wanted to consoludate macros and other functions into your userspace for all of your keymaps, you can do that. The issue is that you then cannot call any function defined in your userspace, or it gets complicated. To better handle this, you can call the functions here and create new functions to use in individual keymaps.
First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlappind keycodes
Then add `#include <name.h>` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap.
Once you've done that, you'll want to set the keycode definitions that you need to the `<name>.h` file. For instance:
```
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
// Define all of
enum custom_keycodes {
KC_MAKE = SAFE_RANGE,
NEW_SAFE_RANGE //use "NEW_SAFE_RANGE" for keymap specific codes
};
#endif
```
Now you want to create the `<name>.c` file, and add this content to it:
```
#include "<name>.h"
#include "quantum.h"
#include "action.h"
#include "version.h"
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_MAKE:
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP);
SEND_STRING(SS_TAP(X_ENTER));
}
return false;
break;
}
return process_record_keymap(keycode, record);
}
```
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap">`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.

View File

@@ -1,105 +1,26 @@
# QMK Features
QMK has a staggering number of features for building your keyboard. It can take some time to understand all of them and determine which one will acheive your goal.
## Space Cadet Shift: The future, built in
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. Head on over to the [Space Cadet Shift](space_cadet_shift.md) page to read about it.
## The Leader key: A new kind of modifier
Most modifiers have to be held or toggled. But what if you had a key that indicated the start of a sequence? You could press that key and then rapidly press 1-3 more keys to trigger a macro, or enter a special layer, or anything else you might want to do. To learn more about it check out the [Leader Key](feature_leader_key.md) page.
## Tap Dance: A single key can do 3, 5, or 100 different things
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. Read more about it on the [Tap Dance](tap_dance.md) page.
## Temporarily setting the default layer
`DF(layer)` - sets default layer to _layer_. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
## Macro shortcuts: Send a whole string when pressing just one key
How would you like a single keypress to send a whole word, sentence, paragraph, or even document? Head on over to the [Macros](macros.md) page to read up on all aspects of Simple and Dynamic Macros.
## Additional keycode aliases for software-implemented layouts \(Colemak, Dvorak, etc\)
Everything is assuming you're in Qwerty \(in software\) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
```
#include <keymap_colemak.h>
```
If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
* `CM_*` for all of the Colemak-equivalent characters
* `DV_*` for all of the Dvorak-equivalent characters
These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features.
To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F`. Using `KC_F` under these same circumstances would result in `T`.
## 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;
```
* [Advanced Keycodes](feature_advanced_keycodes.md) - Change layers, type shifted keys, and more. Go beyond typing simple characters.
* [Audio](feature_audio.md) - Connect a speaker to your keyboard for audio feedback, midi support, and music mode.
* [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state.
* [Backlight](feature_backlight.md) - LED lighting support for your keyboard.
* [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys.
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
* [Key Lock](feature_key_lock.md) - Lock a key in the "down" state.
* [Layouts](feature_layouts.md) - Use one keymap with any keyboard that supports your layout.
* [Leader Key](feature_leader_key.md) - Tap the leader key followed by a sequence to trigger custom behavior.
* [Macros](feature_macros.md) - Send multiple key presses when pressing only one physical key.
* [Mouse keys](feature_mouse_keys.md) - Control your mouse pointer from your keyboard.
* [Pointing Device](feature_pointing_device.md) - Framework for connecting your custom pointing device to your keyboard.
* [PS2 Mouse](feature_ps2_mouse.md) - Driver for connecting a ps2 mouse directly to your keyboard.
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
* [Space Cadet](feature_space_cadet_shift.md) - Use your left/right shift keys to type parenthesis and brackets.
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
* [Tap Dance](feature_tap_dance.md) - Make a single key do as many things as you want.
* [Terminal](feature_terminal.md) - CLI interface to the internals of your keyboard.
* [Thermal Printer](feature_thermal_printer.md) - Connect a thermal printer to your keyboard to be able to toggle on a printed log of everything you type.
* [Unicode](feature_unicode.md) - Unicode input support.
* [Userspace](feature_userspace.md) - Share code between different keymaps and keyboards.

74
docs/flashing.md Normal file
View File

@@ -0,0 +1,74 @@
# Flashing Intrustructions
There are quite a few different types of bootloaders that keyboards use, and just about all of the use a different flashing method. Luckily, projects like the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) aim to be compatible with all the different types without having to think about it much, but this article will describe the different types of bootloaders, and available methods for flashing them.
## DFU
Atmel's DFU bootloader comes on all atmega32u4 chips by default, and is used by many keyboards that have their own ICs on their PCBs (Older OLKB boards, Clueboards). Some keyboards may also use LUFA's DFU bootloader (or QMK's fork) (Newer OLKB boards) that adds in additional features specific to that hardware.
These bootloaders are usually 4096 bytes for the atmega32u4 chip.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` in QMK (recommended commandline)
* [Atmel's Flip](http://www.atmel.com/tools/flip.aspx) (not recommended)
Flashing sequence:
1. Press the `RESET` keycode, or tap the RESET button (or short RST to GND).
2. Wait for the OS to detect the device
3. Erase the memory (may be done automatically)
4. Flash a .hex file
5. Reset the device into application mode (may be done automatically)
or:
make <keyboard>:<keymap>:dfu
## Caterina
Arduino boards and their clones use the [Caterina bootloader](https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/bootloaders/caterina) (any keyboard built with a Pro Micro, or clone), and uses the avr109 protocol to communicate through virtual serial. Bootloaders like [A-Star](https://www.pololu.com/docs/0J61/9) are based on Caterina.
This block of code allows for Caterina compatibility in QMK:
#define CATERINA_BOOTLOADER
These bootloaders are usually 4096 bytes for the atmega32u4 chip.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [avrdude](http://www.nongnu.org/avrdude/) with avr109 / `:avrdude` (recommended commandline)
* [AVRDUDESS](https://github.com/zkemble/AVRDUDESS)
Flashing sequence:
1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters)
2. Wait for the OS to detect the device
4. Flash a .hex file
5. Wait for the device to reset automatically
or
make <keyboard>:<keymap>:avrdude
## Halfkay
Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on all Teensys (namely the 2.0).
This bootloader is 512 bytes.
Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
* [Teensy Loader Command Line](https://www.pjrc.com/teensy/loader_cli.html) (recommended commandline)
Flashing sequence:
1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters)
2. Wait for the OS to detect the device
4. Flash a .hex file
5. Reset the device into application mode (may be done automatically)

View File

@@ -1,6 +1,6 @@
# Installing Build Tools
This page describes setting up the build environment for QMK. These instructions cover AVR processors (such as the atmega32u4.)
This page describes setting up the build environment for QMK. These instructions cover AVR processors (such as the atmega32u4).
<!-- FIXME: We should have ARM instructions somewhere. -->
@@ -44,7 +44,7 @@ By default, this will download compilers for both AVR and ARM. If you don't need
nix-shell --arg arm false
## Mac
## macOS
If you're using [homebrew,](http://brew.sh/) you can use the following commands:
brew tap osx-cross/avr
@@ -58,10 +58,10 @@ This is the recommended method. If you don't have homebrew, [install it!](http:/
## Windows with msys2 (recommended)
The best environment to use, for Windows Vista through any later version (tested on 7 and 10,) is [msys2](http://www.msys2.org).
The best environment to use, for Windows Vista through any later version (tested on 7 and 10), is [msys2](http://www.msys2.org).
* Install msys2 by downloading and following the instructions here: http://www.msys2.org
* Open the "MSYS2 MingGW 64-bit" shortcut
* Install msys2 by downloading it and following the instructions here: http://www.msys2.org
* Open the ``MSYS2 MingGW 64-bit`` shortcut
* Navigate to your qmk checkout. For example, if it's in the root of your c drive:
* `$ cd /c/qmk_firmware`
* Run `util/msys2_install.sh` and follow the prompts
@@ -80,7 +80,7 @@ If you already have cloned the repository on your Windows file system you can ig
You will need to clone the repository to your Windows file system using the normal Git for Windows and **not** the WSL Git. So if you haven't installed Git before, [download](https://git-scm.com/download/win) and install it. Then [set it up](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup), it's important that you setup the e-mail and user name, especially if you are planning to contribute.
Once Git is installed, open the Git bash command and change the directory to where you want to clone QMK, note that you have to use forward slashes, and that your c drive is accessed like this `/c/path/to/where/you/want/to/go`. Then run `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`, this will create a new folder `qmk_firmware` as a subfolder of the current one.
Once Git is installed, open the Git Bash command and change the directory to where you want to clone QMK; note that you have to use forward slashes, and that your c drive is accessed like this `/c/path/to/where/you/want/to/go`. Then run `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`, this will create a new folder `qmk_firmware` as a subfolder of the current one.
### Toolchain setup
The Toolchain setup is done through the Windows Subsystem for Linux, and the process is fully automated. If you want to do everything manually, there are no other instructions than the scripts themselves, but you can always open issues and ask for more information.
@@ -122,8 +122,11 @@ If this is a bit complex for you, Docker might be the turn-key solution you need
# defaults are ergodox/default
docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
```
# On windows docker seems to have issue with VOLUME tag in Dockerfile, and $('pwd') won't print a windows compliant path, use full path instead like this
On Windows Docker seems to have issues with the VOLUME tag in Dockerfile, and `$('pwd')` won't print a Windows compliant path; use full path instead, like this:
```bash
docker run -e keymap=default -e keyboard=ergobox_ez --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware
```
@@ -131,4 +134,4 @@ docker run -e keymap=default -e keyboard=ergobox_ez --rm -v D:/Users/Sacapuces/D
This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash.
## Vagrant
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](vagrant_guide.md).
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](getting_started_vagrant.md).

View File

@@ -52,7 +52,7 @@ To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
Your changes now exist on your fork on Github - if you go back there (https://github.com/<whoeveryouare>/qmk_firmware), you can create a "New Pull Request" by clicking this button:
Your changes now exist on your fork on Github - if you go back there (`https://github.com/<whoeveryouare>/qmk_firmware`), you can create a "New Pull Request" by clicking this button:
![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
@@ -60,4 +60,4 @@ Here you'll be able to see exactly what you've committed - if it all looks good,
![Create Pull Request](http://i.imgur.com/Ojydlaj.jpg)
After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :)
After submitting, we may talk to you about your changes, ask that you make changes, and eventually accept it! Thanks for contributing to QMK :)

View File

@@ -1,22 +1,22 @@
# Introduction
This page attempts to explain the basic information you need to know to work with the QMK project. It assumes that you are familiar with navigating a UNIX shell, but does not assume you are familiar with C or with compiling using make.
This page attempts to explain the basic information you need to know to work with the QMK project. It assumes that you are familiar with navigating a Unix shell, but does not assume you are familiar with C or with compiling using make.
## Basic QMK structure
QMK is a fork of @tmk's [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `handwired` and `keyboard` folders.
QMK is a fork of [Jun Wako](https://github.com/tmk)'s [tmk_keyboard](https://github.com/tmk/tmk_keyboard) project. The original TMK code, with modifications, can be found in the `tmk` folder. The QMK additions to the project may be found in the `quantum` folder. Keyboard projects may be found in the `handwired` and `keyboard` folders.
### Keyboard project structure
Within the `handwired` and `keyboard` folders is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard`. Within you'll find the following structure:
Within the folder `keyboards` and its subfolder `handwired` is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard`. Within it you'll find the following structure:
* `keymaps/`: Different keymaps that can be built
* `rules.mk`: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific `Makefile`.
* `rules.mk`: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific `Makefile`
* `config.h`: The file that sets the default compile time options. Do not edit this file directly, instead use a keymap specific `config.h`.
### Keymap structure
In every keymap folder, the following files may be found. Only `keymap.c` is required, if the rest of the files are not found the default options will be chosen.
In every keymap folder, the following files may be found. Only `keymap.c` is required, and if the rest of the files are not found the default options will be chosen.
* `config.h`: the options to configure your keymap
* `keymap.c`: all of your keymap code, required
@@ -30,13 +30,13 @@ There are 2 `config.h` locations:
* keyboard (`/keyboards/<keyboard>/config.h`)
* keymap (`/keyboards/<keyboard>/keymaps/<keymap>/config.h`)
If the keymap `config.h` exists that file is included by the build system and the keyboard `config.h` is not included. If you wish to override settings in your keymap's `config.h` you will need to include some glue code:
If the keymap `config.h` exists, that file is included by the build system and the keyboard `config.h` is not included. If you wish to override settings in your keymap's `config.h` you will need to include some glue code:
```
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
#include "config_common.h"
```
If you want to override a setting from the parent `config.h` file, you need to `#undef` and then `#define` the setting again, like this:

View File

@@ -131,7 +131,7 @@ This consumes about 5390 bytes.
`KEY_LOCK_ENABLE`
This enables [key lock](key_lock.md). This consumes an additional 260 bytes.
This enables [key lock](feature_key_lock.md). This consumes an additional 260 bytes.
## Customizing Makefile options on a per-keymap basis

View File

@@ -14,7 +14,7 @@ Other than having Vagrant and Virtualbox installed and possibly a restart of you
The "easy" way to flash the firmware is using a tool from your host OS:
* [QMK Flasher](https://github.com/qmk/qmk_flasher)
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox) (reccommened)
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)

View File

@@ -36,7 +36,7 @@ An alternative keyboard layout developed by Dr. August Dvorak in the 1930's. A s
## Dynamic Macro
A macro which has been recorded on the keyboard and which will be lost when the keyboard is unplugged or the computer rebooted.
* [Dynamic Macro Documentation](dynamic_macros.html)
* [Dynamic Macro Documentation](feature_dynamic_macros.md)
## Eclipse
An IDE that is popular with many C developers.
@@ -93,7 +93,7 @@ A wiring pattern of columns and rows that enables the MCU to detect keypresses w
## Macro
A feature that lets you send muiltple keypress events (hid reports) after having pressed only a single key.
* [Macro Documentation](macros.html)
* [Macro Documentation](feature_macros.md)
## MCU
Microcontrol Unit, the processor that powers your keyboard.
@@ -104,7 +104,7 @@ A key that is held down while typing another key to modify the action of that ke
## Mousekeys
A feature that lets you control your mouse cursor and click from your keyboard.
* [Mousekeys Documentation](mouse_keys.html)
* [Mousekeys Documentation](feature_mouse_keys.html)
## N-Key Rollover (NKRO)
A term that applies to keyboards that are capable of reporting any number of key-presses at once.
@@ -133,7 +133,7 @@ A 1 byte number that is sent as part of a HID report over USB that represents a
## Space Cadet Shift
A special set of shift keys which allow you to type various types of braces by tapping the left or right shift one or more times.
* [Space Cadet Shift Documentation](space_cadet_shift.html)
* [Space Cadet Shift Documentation](feature_space_cadet.html)
## Tap
Pressing and releasing a key. In some situations you will need to distinguish between a key down and a key up event, and Tap always refers to both at once.
@@ -141,7 +141,7 @@ Pressing and releasing a key. In some situations you will need to distinguish be
## Tap Dance
A feature that lets you assign muiltple keycodes to the same key based on how many times you press it.
* [Tap Dance Documentation](tap_dance.md)
* [Tap Dance Documentation](feature_tap_dance.md)
## Teensy
A low-cost AVR development board that is commonly used for hand-wired builds. A teensy is often chosen despite costing a few dollors more due to its halfkay bootloader, which makes flashing very simple.
@@ -152,7 +152,7 @@ A generic term for LEDs that light the underside of the board. These LED's typic
## Unicode
In the larger computer world Unicode is a set of encoding schemes for representing characters in any language. As it relates to QMK it means using various OS schemes to send unicode codepoints instead of scancodes.
* [Unicode Documentation](unicode.md)
* [Unicode Documentation](feature_unicode.md)
## Unit Testing
A framework for running automated tests against QMK. Unit testing helps us be confident that our changes do not break anything.

View File

@@ -6,7 +6,7 @@ Parts list:
* Keyboard plate (metal, plastic, cardboard, etc)
* Wire (strained for wiring to the Teensy, anything for the rows/columns)
* Soldering iron set at 600ºF or 315ºC (if temperature-controlled)
* Resin-cored solder (leaded or lead-free)
* Rosin-cored solder (leaded or lead-free)
* Adequate ventilation/a fan
* Tweezers (optional)
* Wire cutters/snippers

8
docs/hardware.md Normal file
View File

@@ -0,0 +1,8 @@
# Hardware
QMK runs on a variety of hardware. If your processor can be targetted by [LUFA](http://www.fourwalledcubicle.com/LUFA.php) or [ChibiOS](http://www.chibios.com) you can probably get QMK running on it. This section explores getting QMK running on, and communicating with, hardware of all kinds.
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* [AVR Processors](hardware_avr.md)
* ARM Processors (TBD)
* [Drivers](hardware_drivers.md)

157
docs/hardware_avr.md Normal file
View File

@@ -0,0 +1,157 @@
# Keyboards With AVR Processors
This page describes the support for for AVR processors in QMK. AVR processors include the atmega32u4, atmega32u2, at90usb1286, and other processors from Atmel Corporation. AVR processors are 8-bit MCU's that are designed to be easy to work with. The most common AVR processors in keyboards have on-board USB and plenty of GPIO for supporting large keyboard matrices. They are the most popular MCU for use in keyboards today.
If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_guidelines.md) to get a sense of how keyboards fit into QMK.
## Adding Your AVR Keyboard to QMK
QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started run the `util/new_project.sh` script:
```
$ util/new_project.sh my_awesome_keyboard
######################################################
# /keyboards/my_awesome_keyboard project created. To start
# working on things, cd into keyboards/my_awesome_keyboard
######################################################
```
This will create all the files needed to support your new keyboard, and populate the settings with default values. Now you just need to customize it for your keyboard.
## `readme.md`
This is where you'll describe your keyboard. Please follow the [Keyboard Readme Template](documentation_templates.md#keyboard-readmemd-template) when writing your `readme.md`. You're encouraged to place an image at the top of your `readme.md`, please use an external service such as [Imgur](http://imgur.com) to host the images.
## `<keyboard>.c`
This is where all the custom logic for your keyboard goes. Many keyboards do not need to put anything at all in here. You can learn more about writing custom logic in [Custom Quantum Functions](custom_quantum_functions.md).
## `<keyboard>.h`
This is the file you define your [Layout Macro(s)](feature_layouts.md) in. At minumum you should have a `#define LAYOUT` for your keyboard that looks something like this:
```
#define LAYOUT( \
k00, k01, k02, \
k10, k11 \
) { \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
}
```
The first half of the `LAYOUT` pre-processor macro defines the physical arrangement of keys. The second half of the macro defines the matrix the switches are connected to. This allows you to have a physical arrangement of keys that differs from the wiring matrix.
Each of the `k__` variables needs to be unique, and typically they follow the format `k<row><col>`.
The physical matrix (the second half) must have a number of rows equalling `MATRIX_ROWS`, and each row must have exactly `MATRIX_COLS` elements in it. If you do not have this many physical keys you can use `KC_NO` to fill in the blank spots.
## `config.h`
The `config.h` file is where you configure the hardware and feature set for your keyboard. There are a lot of options that can be placed in that file, too many to list there. For a complete overview of available options see the [Config Options](config_options.md) page.
### Hardware Configuration
At the top of the `config.h` you'll find USB related settings. These control how your keyboard appears to the Operating System. If you don't have a good reason to change you should leave the `VENDOR_ID` as `0xFEED`. For the `PRODUCT_ID` you should pick a number that is not yet in use.
Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately reflect your keyboard.
```
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT my_awesome_keyboard
#define DESCRIPTION A custom keyboard
```
{% hint style='info' %}
Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. On Linux these values will not be visible in `lsusb`, since Linux takes that information from the list published by the USB-IF.
{% endhint %}
### Keyboard Matrix Configuration
The next section of the `config.h` file deals with your keyboard's matrix. The first thing you should set is the matrix's size. This is usually, but not always, the same number of rows and columns as the physical key arrangement.
```
#define MATRIX_ROWS 2
#define MATRIX_COLS 3
```
Once you've defined the size of your matrix you need to define which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins:
```
#define MATRIX_ROW_PINS { D0, D5 }
#define MATRIX_COL_PINS { F1, F0, B0 }
#define UNUSED_PINS
```
The number of `MATRIX_ROW_PINS` entries must be the same as the number you assigned to `MATRIX_ROWS`, and likewise for `MATRIX_COL_PINS` and `MATRIX_COLS`. You do not have to specify `UNUSED_PINS`, but you can if you want to document what pins are open.
Finally, you can specify the direction your diodes point. This can be `COL2ROW`, `ROW2COL`, or `CUSTOM_MATRIX`.
```
#define DIODE_DIRECTION COL2ROW
```
### Backlight Configuration
By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are using one of those you can simply enable it here. For more details see the [Backlight Documentation](feature_backlight.md).
```
#define BACKLIGHT_PIN B7
#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
```
{% hint style='info' %}
You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details.
{% endhint %}
### Other Configuration Options
There are a lot of features that can be configured or tuned in `config.h`. You should see the [Config Options](config_options.md) page for more details.
## `rules.mk`
You use the `rules.mk` file to tell QMK what files to build and what features to enable. If you are building around an atmega32u4 you can largely leave these defaults alone. If you are using another MCU you may have to tweak some parameters.
### MCU Options
These options tell the build system what CPU to build for. Be very careful if you change any of these settings, you can render your keyboard inoperable.
```
MCU = atmega32u4
F_CPU = 16000000
ARCH = AVR8
F_USB = $(F_CPU)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
```
### Bootloader Size
The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. If you are using a teensy 2.0, or a device like the Ergodox EZ that uses the teensy bootloader you should set this to `512`. Most other bootloaders should be set to `4096`, but `1024` and `2048` are other possible values you may encounter.
#### Teensy 2.0 Bootloader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=512
```
#### Teensy 2.0++ Bootloader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=1024
```
#### Atmel DFU Loader Example
```
OPT_DEFS += -DBOOTLOADER_SIZE=4096
```
### Build Options
There are a number of features that can be turned on or off in `rules.mk`. See the [Config Options](config_options.md#feature-options) page for a detailed list and description.

27
docs/hardware_drivers.md Normal file
View File

@@ -0,0 +1,27 @@
# QMK Hardware Drivers
QMK is used on a lot of different hardware. While support for the most common MCU's and matrix configurations is built-in there are a number of drivers that can be added to a keyboard to support additional hardware. Examples include mice and other pointing devices, i/o expanders for split keyboards, bluetooth modules, and LCD, OLED, and TFT screens.
<!-- FIXME: This should talk about how drivers are integrated into QMK and how you can add your own driver.
# Driver System Overview
-->
# Available Drivers
## ProMicro (AVR only)
Support for addressing pins on the ProMicro by their Arduino name rather than their AVR name. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## SSD1306 (AVR only)
Support for SSD1306 based OLED displays. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## uGFX
You can make use of uGFX within QMK to drive character and graphic LCD's, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
## WS2812 (AVR only)
Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light](feature_rgblight.md) page.

View File

@@ -0,0 +1,137 @@
# QMK Keyboard Guidelines
We welcome all keyboard projects into QMK, but ask that you try to stick to a couple guidelines that help us keep things organised and consistent.
## Naming your keyboard/project
All names should be lowercase alphanumeric, and separated by an underscore (`_`), but not begin with one. Your directory and your `.h` and `.c` files should have exactly the same name. All folders should follow the same format.
## `readme.md`
All projects need to have a `readme.md` file that explains what the keyboard is, who made it, where it is available, and links to more information. Please follow the [published template](documentation_templates.md#keyboard-readmemd-template).
## Image/Hardware files
In an effort to keep the repo size down, we're no longer accepting images of any format in the repo, with few exceptions. Hosting them elsewhere (imgur) and linking them in the `readme.md` is the preferred method.
Any sort of hardware file (plate, case, pcb) can't be stored in qmk_firmware, but we have the [qmk.fm repo](https://github.com/qmk/qmk.fm) where such files (as well as in-depth info) can be stored and viewed on [qmk.fm](http://qmk.fm). Downloadable files are stored in `/<keyboard>/` (name follows the same format as above) which are served at `http://qmk.fm/<keyboard>/`, and pages are generated from `/_pages/<keyboard>/` which are served at the same location (.md files are generated into .html files through Jekyll). Check out the `lets_split` directory for an example.
## Keyboard Metadata
As QMK grows so does the ecosystem surrounding QMK. To make it easier for projects in that ecosystem to tie into QMK as we make changes we are developing a metadata system to expose information about keyboards in QMK.
You can create `info.json` files at every level under `qmk_firmware/keyboards/<name>` to specify this metadata. These files are combined, with more specific files overriding keys in less specific files. This means you do not need to duplicate your metadata information. For example, `qmk_firmware/keyboards/clueboard/info.json` specifies `manufacturer` and `maintainer`, while `qmk_firmware/keyboards/clueboard/66/info.json` specifies more specific information about Clueboard 66%.
### `info.json` Format
The `info.json` file is a JSON formatted dictionary with the following keys available to be set. You do not have to set all of them, merely the keys that apply to your keyboard.
* `keyboard_name`
* A free-form text string describing the keyboard.
* Example: `Clueboard 66%`
* `manufacturer`
* A free-form text string naming the manufacturer.
* Example: `Clueboard`
* `identifier`
* The Vendor, Product, and Revision ID's joined by a :
* Example: `c1ed:2370:0001`
* `url`
* A URL to the keyboard's product page, [QMK.fm/keyboards](https://qmk.fm/keyboards) page, or other page describing information about the keyboard.
* `processor`
* The MCU or CPU this keyboard uses.
* Example: `atmega32u4` or `stm32f303`
* `bootloader`
* What bootloader this keyboard uses. Available options:
* `atmel-dfu`
* `kiibohd-dfu-util`
* `lufa-dfu`
* `qmk-dfu`
* `stm32-dfu-util`
* (FIXME: This list is incomplete.)
* `maintainer`
* GitHub username of the maintainer, or `qmk` for community maintained boards
* `width`
* Width of the board in Key Units
* `height`
* Height of the board in Key Units
* `layouts`
* Physical Layout representations. See the next section for more detail.
#### Layout Format
Within our `info.json` file the `layouts` portion of the dictionary contains several nested dictionaries. The outer layer consists of QMK layout macros, for example `LAYOUT_ansi` or `LAYOUT_iso`. Within each layout macro are keys for `width`, `height`, and `key_count`, each of which should be self-explanatory.
* `width`
* Optional: The width of the layout in Key Units
* `height`
* Optional: The height of the layout in Key Units
* `key_count`
* **Required**: The number of keys in this layout
* `layout`
* A list of Key Dictionaries describing the physical layout. See the next section for more details.
#### Key Dictionary Format
Each Key Dictionary in a layout describes the physical properties of a key. If you are familiar with the Raw Code for <http://keyboard-layout-editor.com> you will find many of the concepts the same. We re-use the same key names and layout choices wherever possible, but unlike keyboard-layout-editor each key is stateless, inheriting no properties from the keys that came before it.
All key positions and rotations are specified in relation to the top-left corner of the keyboard, and the top-left corner of each key.
* `X`
* **Required**: The absolute position of the key in the horizontal axis, in Key Units.
* `Y`
* **Required**: The absolute position of the key in the vertical axis, in Key Units.
* `W`
* The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `H`
* The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `R`
* How many degrees clockwise to rotate the key.
* `RX`
* The absolute position of the point to rotate the key around in the horizontal axis. Default: `x`
* `RY`
* The absolute position of the point to rotate the key around in the vertical axis. Default: `y`
* `KS`
* Key Shape: define a polygon by providing a list of points, in Key Units.
* **Important**: These are relative to the top-left of the key, not absolute.
* Example ISO Enter: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
### How Is The Metadata Exposed?
This metadata is primarily used in two ways:
* To allow web-based configurators to dynamically generate UI
* To support the new `make keyboard:keymap:qmk` target, which bundles this metadata up with the firmware to allow QMK Toolbox to be smarter.
Configurator authors can see the [QMK Compiler](https://docs.compile.qmk.fm/api_docs.html) docs for more information on using the JSON API.
## Non-production/handwired projects
We're happy to accept any project that uses QMK, including prototypes and handwired ones, but we have a separate `/keyboards/handwired/` folder for them, so the main `/keyboards/` folder doesn't get overcrowded. If a prototype project becomes a production project at some point in the future, we'd be happy to move it to the main `/keyboards/` folder!
## Warnings as errors
When developing your keyboard, keep in mind that all warnings will be treated as errors - these small warnings can build-up and cause larger errors down the road (and keeping them is generally a bad practice).
## Copyright Blurb
If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, in this format:
Copyright 2017 Your Name <your@email.com>
If you are modifying someone else's code and have made only trivial changes you should leave their name in the copyright statement. If you have done significant work on the file you should add your name to theirs, like so:
Copyright 2017 Their Name <original_author@example.com> Your Name <you@example.com>
The year should be the first year the file is created. If work was done to that file in later years you can reflect that by appending the second year to the first, like so:
Copyright 2015-2017 Your Name <you@example.com>
## License
The core of QMK is licensed under the [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). If you are shipping binaries for AVR processors you may choose either [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or [GPLv3](https://www.gnu.org/licenses/gpl.html). If you are shipping binaries for ARM processors you must choose [GPL Version 3](https://www.gnu.org/licenses/gpl.html) to comply with the [ChibiOS](http://www.chibios.org) GPLv3 license.
If your keyboard makes use of the [uGFX](https://ugfx.io) features within QMK you must comply with the [uGFX License](https://ugfx.io/license.html), which requires a separate commercial license before selling a device containing uGFX.
## Technical details
If you're looking for more information on making your keyboard work with QMK, [check out the hardware section](hardware.md)!

View File

@@ -115,7 +115,7 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|`KC_DOWN`||DownArrow|
|`KC_UP`||UpArrow|
|`KC_APPLICATION`|`KC_APP`|Application|
|`KC_POWER`||Power|
|`KC_POWER`||Old power button scancode. MS has deprecated this in favor of `KC_SYSTEM_POWER`.|
|`KC_EXECUTE`||Execute|
|`KC_HELP`||Help|
|`KC_MENU`||Menu|
@@ -138,7 +138,7 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|`KC_CLEAR_AGAIN`||Clear/Again|
|`KC_CRSEL`||CrSel/Props|
|`KC_EXSEL`||ExSel|
|`KC_SYSTEM_POWER`|`KC_PWR`|System Power Down|
|`KC_SYSTEM_POWER`|`KC_PWR`|System Power Down. Recommended over `KC_POWER`.|
|`KC_SYSTEM_SLEEP`|`KC_SLEP`|System Sleep|
|`KC_SYSTEM_WAKE`|`KC_WAKE`|System Wake|
|`KC_MAIL`|`KC_MAIL`||
@@ -187,22 +187,22 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|`KC_KP_EQUAL_AS400`||Keypad Equal Sign|
|`KC_NO`||Ignore this key. (NOOP) |
|`KC_TRNS`||Make this key transparent to find the key on a lower layer.|
|[`KC_MS_UP`](mouse_keys.md)|`KC_MS_U`|Mouse Cursor Up|
|[`KC_MS_DOWN`](mouse_keys.md)|`KC_MS_D`|Mouse Cursor Down|
|[`KC_MS_LEFT`](mouse_keys.md)|`KC_MS_L`|Mouse Cursor Left|
|[`KC_MS_RIGHT`](mouse_keys.md)|`KC_MS_R`|Mouse Cursor Right|
|[`KC_MS_BTN1`](mouse_keys.md)|`KC_BTN1`|Mouse Button 1|
|[`KC_MS_BTN2`](mouse_keys.md)|`KC_BTN2`|Mouse Button 2|
|[`KC_MS_BTN3`](mouse_keys.md)|`KC_BTN3`|Mouse Button 3|
|[`KC_MS_BTN4`](mouse_keys.md)|`KC_BTN4`|Mouse Button 4|
|[`KC_MS_BTN5`](mouse_keys.md)|`KC_BTN5`|Mouse Button 5|
|[`KC_MS_WH_UP`](mouse_keys.md)|`KC_WH_U`|Mouse Wheel Up|
|[`KC_MS_WH_DOWN`](mouse_keys.md)|`KC_WH_D`|Mouse Wheel Down|
|[`KC_MS_WH_LEFT`](mouse_keys.md)|`KC_WH_L`|Mouse Wheel Left|
|[`KC_MS_WH_RIGHT`](mouse_keys.md)|`KC_WH_R`|Mouse Wheel Right|
|[`KC_MS_ACCEL0`](mouse_keys.md)|`KC_ACL0`|Mouse Acceleration 0|
|[`KC_MS_ACCEL1`](mouse_keys.md)|`KC_ACL1`|Mouse Acceleration 1|
|[`KC_MS_ACCEL2`](mouse_keys.md)|`KC_ACL2`|Mouse Acceleration 2|
|[`KC_MS_UP`](feature_mouse_keys.md)|`KC_MS_U`|Mouse Cursor Up|
|[`KC_MS_DOWN`](feature_mouse_keys.md)|`KC_MS_D`|Mouse Cursor Down|
|[`KC_MS_LEFT`](feature_mouse_keys.md)|`KC_MS_L`|Mouse Cursor Left|
|[`KC_MS_RIGHT`](feature_mouse_keys.md)|`KC_MS_R`|Mouse Cursor Right|
|[`KC_MS_BTN1`](feature_mouse_keys.md)|`KC_BTN1`|Mouse Button 1|
|[`KC_MS_BTN2`](feature_mouse_keys.md)|`KC_BTN2`|Mouse Button 2|
|[`KC_MS_BTN3`](feature_mouse_keys.md)|`KC_BTN3`|Mouse Button 3|
|[`KC_MS_BTN4`](feature_mouse_keys.md)|`KC_BTN4`|Mouse Button 4|
|[`KC_MS_BTN5`](feature_mouse_keys.md)|`KC_BTN5`|Mouse Button 5|
|[`KC_MS_WH_UP`](feature_mouse_keys.md)|`KC_WH_U`|Mouse Wheel Up|
|[`KC_MS_WH_DOWN`](feature_mouse_keys.md)|`KC_WH_D`|Mouse Wheel Down|
|[`KC_MS_WH_LEFT`](feature_mouse_keys.md)|`KC_WH_L`|Mouse Wheel Left|
|[`KC_MS_WH_RIGHT`](feature_mouse_keys.md)|`KC_WH_R`|Mouse Wheel Right|
|[`KC_MS_ACCEL0`](feature_mouse_keys.md)|`KC_ACL0`|Mouse Acceleration 0|
|[`KC_MS_ACCEL1`](feature_mouse_keys.md)|`KC_ACL1`|Mouse Acceleration 1|
|[`KC_MS_ACCEL2`](feature_mouse_keys.md)|`KC_ACL2`|Mouse Acceleration 2|
|[`RESET`](quantum_keycodes.md#qmk-keycodes)||Put the keyboard into DFU mode for flashing|
|[`DEBUG`](quantum_keycodes.md#qmk-keycodes)||Toggles debug mode|
|[`KC_GESC`](quantum_keycodes.md#qmk-keycodes)|`GRAVE_ESC`|Acts as escape when pressed normally but when pressed with Shift or GUI will send a `~`|
@@ -311,5 +311,5 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
|[`TT(layer)`](feature_common_shortcuts.md#switching-and-toggling-layers)||tap toggle? idk FIXME`|
|[`OSM(mod)`](quantum_keycodes.md#one-shot-keys)||hold mod for one keypress|
|[`OSL(layer)`](quantum_keycodes.md#one-shot-keys)||switch to layer for one keypress|
|[`UNICODE(n)`](unicode.md)|[`UC(n)`](unicode.md)|if `UNICODE_ENABLE`, this will send characters up to `0x7FFF`|
|[`X(n)`](unicode.md)||if `UNICODEMAP_ENABLE`, also sends unicode via a different method|
|[`UNICODE(n)`](feature_unicode.md)|[`UC(n)`](feature_unicode.md)|if `UNICODE_ENABLE`, this will send characters up to `0x7FFF`|
|[`X(n)`](feature_unicode.md)||if `UNICODEMAP_ENABLE`, also sends unicode via a different method|

View File

@@ -28,14 +28,12 @@ Respective layers can be validated simultaneously. Layers are indexed with 0 to
Sometimes, the action code stored in keymap may be referred as keycode in some documents due to the TMK history.
### Keymap layer status
Keymap layer has its state in two 32 bit parameters:
The state of the Keymap layer is determined by two 32 bit parameters:
* **`default_layer_state`** indicates a base keymap layer(0-31) which is always valid and to be referred.
* **`layer_state`** () has current on/off status of the layer on its each bit.
* **`default_layer_state`** indicates a base keymap layer (0-31) which is always valid and to be referred (the default layer).
* **`layer_state`** has current on/off status of each layer in its bits.
Keymap has its state in two parameter **`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit.
Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`.
To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty.
Keymap layer '0' is usually `default_layer`, wither other layers initially off after booting up the firmware, although this can configured differently in `config.h`. It is useful to change `default_layer` when you completely switch a key layout, for example, if you want to switch to Colemak instead of Qwerty.
Initial state of Keymap Change base layout
----------------------- ------------------
@@ -52,7 +50,7 @@ To change `default_layer` will be useful when you switch key layout completely,
`--- default_layer = 0 `--- default_layer = 1
layer_state = 0x00000001 layer_state = 0x00000002
On the other hand, you shall change `layer_state` to overlay base layer with some layers for feature such as navigation keys, function key(F1-F12), media keys or special actions.
On the other hand, you can change `layer_state` to overlay the base layer with other layers for features such as navigation keys, function keys (F1-F12), media keys, and/or special actions.
Overlay feature layer
--------------------- bit|status

View File

@@ -1,63 +0,0 @@
# Porting your keyboard to QMK
This page describes the technical details of porting an existing keyboard to QMK. If you're looking to add your keyboard to QMK, please [look through these guidelines](adding_a_keyboard_to_qmk.md)!
If your keyboard is running an Atmega chip (atmega32u4 and others), it's pretty easy to get things setup for compiling your own firmware to flash onto your board. There is a `/util/new_project.sh <keyboard>` script to help get you started - you can simply pass your keyboard's name into the script, and all of the necessary files will be created. The components of each are described below.
## `/keyboards/<keyboard>/config.h`
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.
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_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.
## `/keyboards/<keyboard>/rules.mk`
The values at the top likely won't need to be changed, since most boards use the `atmega32u4` chip. The `BOOTLOADER_SIZE` will need to be adjusted based on your MCU type. It's defaulted to the Teensy, since that's the most common controller. Below is quoted from the `Makefile`.
```
# 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
```
At the bottom of the file, you'll find lots of features to turn on and off - all of these options should be set with `?=` to allow for the keymap overrides. `?=` only assigns if the variable was previously undefined. For the full documenation of these features, see the [Makefile options](getting_started_make_guide.md#makefile-options).
## `/keyboards/<keyboard>/readme.md`
This is where you'll describe your keyboard - please write as much as you can about it! Talking about default functionality/features is useful here. Feel free to link to external pages/sites if necessary. Images can be included here as well, as long as they're hosted elsewhere (imgur).
## `/keyboards/<keyboard>/<keyboard>.c`
This is where all of the custom logic for your keyboard goes - you may not need to put anything in this file, since a lot of things are configured automatically. All of the `*_kb()` functions are defined here. If you modify them, remember to keep the calls to `*_user()`, or things in the keymaps might not work. You can read more about the functions [here](custom_quantum_functions.md).
## `/keyboards/<keyboard>/<keyboard>.h`
Here is where you can (optionally) define your `KEYMAP` function to remap your matrix into a more readable format. With ortholinear boards, this isn't always necessary, but it can help to accomodate the dead spots on your matrix, where there are keys that take up more than one space (2u, staggering, 6.25u, etc). The example shows the difference between the physical keys, and the matrix design:
```
#define KEYMAP( \
k00, k01, k02, \
k10, k11 \
) \
{ \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
}
```
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.

View File

@@ -16,7 +16,7 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are
|`KC_LSPO`|Left shift when held, open paranthesis when tapped|
|`KC_RSPC`|Right shift when held, close paranthesis when tapped|
|`KC_LEAD`|The [leader key](feature_leader_key.md)|
|`KC_LOCK`|The [lock key](key_lock.md)|
|`KC_LOCK`|The [lock key](feature_key_lock.md)|
|`FUNC(n)`/`F(n)`|Call `fn_action(n)` (deprecated)|
|`M(n)`|to call macro n|
|`MACROTAP(n)`|to macro-tap n idk FIXME|

View File

@@ -1,12 +1,44 @@
{
"redirects": [
{
"from": "adding_a_keyboard_to_qmk.html",
"to": "hardware_keyboard_guidelines.html"
},
{
"from": "build_environment_setup.html",
"to": "getting_started_build_tools.html"
},
{
"from": "dynamic_macros.html",
"to": "feature_dynamic_macros.html"
},
{
"from": "feature_common_shortcuts.html",
"to": "feature_advanced_keycodes.html"
},
{
"from": "key_lock.html",
"to": "feature_key_lock.html"
},
{
"from": "make_instructions.html",
"to": "getting_started_make_guide.html"
},
{
"from": "porting_your_keyboard_to_qmk.html",
"to": "hardware_avr.html"
},
{
"from": "space_cadet_shift.html",
"to": "feature_space_cadet.html"
},
{
"from": "tap_dance.html",
"to": "feature_tap_dance.html"
},
{
"from": "unicode.html",
"to": "feature_unicode.html"
}
]
}
}

5
keyboards/6ball/6ball.c Normal file
View File

@@ -0,0 +1,5 @@
#include "6ball.h"
void matrix_init_kb(void) {
matrix_init_user();
}

16
keyboards/6ball/6ball.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef SIXBALL_H
#define SIXBALL_H
#include "quantum.h"
#define KEYMAP( \
k01, k02, k03, \
k04, k05, k06 \
) \
{ \
{ k02, k03, k06, k05, k04, k01 } \
}
#define KC_KEYMAP(k01, k02, k03, k04, k05, k06) KEYMAP(KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06)
#endif

53
keyboards/6ball/config.h Normal file
View File

@@ -0,0 +1,53 @@
/*
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 0xCEEB
#define PRODUCT_ID 0x0007
#define DEVICE_VER 0x0001
#define MANUFACTURER That-Canadian
#define PRODUCT 6-Ball
#define DESCRIPTION 6-Ball Macropuck
/* key matrix size */
#define MATRIX_ROWS 1
#define MATRIX_COLS 6
/* pin-out */
#define MATRIX_ROW_PINS { F5 }
#define MATRIX_COL_PINS { F4, D4, B5, B6, B2, F6 }
#define UNUSED_PINS
/* ws2812 RGB LED */
#define RGB_DI_PIN F7
#define RGBLIGHT_TIMER
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 6 // Number of LEDs
#define ws2812_PORTREG PORTD
#define ws2812_DDRREG DDRD
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
#define TAPPING_TERM 200
#endif

View File

@@ -0,0 +1,28 @@
#include "6ball.h"
#define _MAIN 0
#define _FN 1
#define KC_ KC_TRNS
#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen
#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen
#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen
#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen
#define KC_X0 LT(_FN, KC_ESC)
#define KC_RTOG RGB_TOG
#define KC_RMOD RGB_MOD
#define KC_RHUI RGB_HUI
#define KC_RHUD RGB_HUD
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = KC_KEYMAP(
F , X0 ,LCTL,
R , D , M
),
[_FN] = KC_KEYMAP(
F , ,RHUI,
RTOG,RMOD,RHUD
)
};

14
keyboards/6ball/readme.md Normal file
View File

@@ -0,0 +1,14 @@
6-Ball
======
A circular 6-key macropad made by ThatCanadian.
Keyboard Maintainer: QMK Community
Hardware Supported: Pro Micro ATmega32U4
Hardware Availability: ThatCanadian
Make example for this keyboard (after setting up your build environment):
make 6ball:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

67
keyboards/6ball/rules.mk Normal file
View File

@@ -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 = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = yes # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

28
keyboards/acr60/acr60.c Normal file
View File

@@ -0,0 +1,28 @@
#include "acr60.h"
#include "led.h"
void matrix_init_kb(void) {
// Keyboard start-up code goes here
// Runs once when the firmware starts up
matrix_init_user();
led_init_ports();
};
void matrix_scan_kb(void) {
// Looping keyboard code goes here
// This runs every cycle (a lot)
matrix_scan_user();
};
void led_init_ports(void) {
// Set caps lock LED pin as output
DDRB |= (1 << 2);
// Default to off
PORTB |= (1 << 2);
}
void led_set_kb(uint8_t usb_led) {
// Code for caps lock LED as reported by the OS
// Set this per keymap, instead of globally
led_set_user(usb_led);
}

107
keyboards/acr60/acr60.h Normal file
View File

@@ -0,0 +1,107 @@
#ifndef ARC60_H
#define ARC60_H
#include "quantum.h"
#define KEYMAP( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
{ K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \
}
#define KEYMAP_HHKB( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
K401, K403, K406, K411, K413 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
{ KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, KC_NO, K413, KC_NO } \
}
#define KEYMAP_TRUE_HHKB( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
K401, K403, K406, K410, K411 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
{ KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, KC_NO, KC_NO } \
}
#define KEYMAP_2_SHIFTS( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
{ K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \
}
#define KEYMAP_DIRECTIONAL( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K312, K313, K314, \
K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, KC_NO, K312, K313, K314 }, \
{ K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \
}
/* Mitch's keymap, "MitchSplit":
* Standard 60% base, split right shift, 3-split space, standard modifier row.
* Split shift is 2.75u + 1.25u + 2.25u (total of 6.25u). Might not work with other orientations.
*/
/*
* ,-----------------------------------------------------------------------------------------.
* |K000 |K001 |K002 |K003 |K004 |K005 |K006 |K007 |K008 |K009 |K010 |K011 |K012 | K014 |
* |-----------------------------------------------------------------------------------------+
* | K100 |K102 |K103 |K104 |K105 |K106 |K107 |K108 |K109 |K110 |K111 |K112 |K113 | K114 |
* |-----------------------------------------------------------------------------------------+
* | K200 |K202 |K203 |K204 |K205 |K206 |K207 |K208 |K209 |K210 |K211 |K212 | K213 |
* |-----------------------------------------------------------------------------------------+
* | K300 |K302 |K303 |K304 |K305 |K306 |K307 |K308 |K309 |K310 |K311 | K313 |K314 |
* |-----------------------------------------------------------------------------------------+
* | K400 | K401 | K403 | K404 | K406 | K408 | K410 | K411 | K413 | K414 |
* `-----------------------------------------------------------------------------------------'
*/
#define MITCHSPLIT( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
{ K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \
}
#endif

54
keyboards/acr60/config.h Normal file
View File

@@ -0,0 +1,54 @@
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x2260
#define DEVICE_VER 0x0001
#define MANUFACTURER MechKeysCa
#define PRODUCT ACR60
#define DESCRIPTION ACR60 Keyboard
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
/* key matrix pins */
#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }
#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3, F4 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* number of backlight levels */
#define BACKLIGHT_PIN B6
#define BACKLIGHT_LEVELS 5
/* 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)) \
)
/* prevent stuck modifiers */
#define PREVENT_STUCK_MODIFIERS
#define RGB_DI_PIN E2
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 20
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif

View File

@@ -0,0 +1,69 @@
#include "acr60.h"
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Default keymap with standard 60% layout. Split space possible but entirely optional with this layout, as this
* layout covers all three split space keys as space keycodes. This also has alt right next to the space bar
* on both sides (Windows keyboard layout), no right-side system/GUI key, and momentary layer switching on
* the right modifiers into the 3rd (macro) and 2nd (function/sfx) layers, respectively. This also has the grave
* accent key set up on the 2nd layer, although on the first layer it includes grave key (tilde) when shift is held down,
* via the function actions code at the bottom.
*/
KEYMAP(
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_NO, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(2), KC_NO, MO(1), KC_RCTL),
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_TRNS, KC_DEL,
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
KEYMAP(
KC_TRNS, M(1), M(2), M(3), M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), M(12), KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
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;
}
}

View File

@@ -0,0 +1,204 @@
#include "acr60.h"
#define _DFT 0
#define _NGUI 1
#define _FN 2
#define _SFX 3
// Fillers to make layering more clear
#define ______ KC_TRNS
#define bbbbbb KC_NO
#define GUIOFF MAGIC_NO_GUI
#define GUION MAGIC_UNNO_GUI
#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
/* TODO: create handy quick-ref list here for easy grokking of the actual shortcuts in place */
/*
* This is Mitch's default ACR60 layout (also DZ60, on which the ACR60 is based). This is a
* Mac-oriented layout, as noted by the GUI keys immediately next to the space bar area of the
* lower modifier row. This uses the MITCHSPLIT keymap as defined in arc60.h, which uses a
* 3-split space bar and a split right shift. Otherwise it's a standard 60% layout (for now).
*
* For me, this is a great place to start getting used to a split key setup and still mostly
* sticking to a standard staggered 60% layout so my entire game isn't thrown off.
*
* Layers (0-based index because we're devs!):
*
* 0: Default QWERTY layer
* Note Fn and Alt keys on the right side of the spacebar, not sure if those are
* normal position but that's what I'm used to at this point. YMMV
*
* 1: Function Layer
* Function keys, Grave Key, Delete, Caps lock on the tab, media keys, and directional
* keys. Also you can hit the Alt key position to switch (and lock) into the 3rd layer
* if you really want to mess with your SFX for a bit.
*
* 2: Special Effects Layer
* RGB and backlight settings access. RGB cycle on "S" key position and if locked into
* the third layer you can hold shift to cycle backwards (see notes below). Bootloader
* access is on this layer. If layer locked, hit right Alt key to get back to layer 0.
*
* The keymap layer definitions below look pretty bad when soft-wrapped by your IDE / text editor.
* Be sure to disable wrapping to make things more readable with lines preserved.
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0
* ,-----------------------------------------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bksp |
* |-----------------------------------------------------------------------------------------+
* | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
* |-----------------------------------------------------------------------------------------+
* | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
* |-----------------------------------------------------------------------------------------+
* | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | FN |
* |-----------------------------------------------------------------------------------------+
* | LCtrl | LAlt | LGUI | Space | Space| Space | RGUI | Fn | RAlt | RCtrl |
* `-----------------------------------------------------------------------------------------'
*/
/* Qwerty gui/alt/space/alt/gui /
*
* Hit MO(_FN) and Alt in that order to lock into the _FN layer.
*/
[_DFT] = MITCHSPLIT( /* Basic QWERTY */
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
MO(_FN), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN), \
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(_FN), LT(_SFX, KC_RALT),KC_RCTL \
),
/* Gaming
* ,-----------------------------------------------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | |BLOCKED| | | |BLOCKED| | | |
* `-----------------------------------------------------------------------------------------'
*/
/* I disable the GUI / System key for gaming, as usually that's windows and I hit that at the most
* inopportune moments. And games don't use the windows key. I'd use the Bootmagic MAGIC_NO_GUI and
* MAGIC_UNNO_GUI keycodes, but that actually disables it and has it persist beyond disconnection
* of the board. That's less convenient (and more confusing) for me than this approach, which is
* basically just blocking the GUI keys when this layer is active and not letting them flow through
* to the default layer.
*/
/* Layer 2: "special effects": RGB lighting, backlighting, bootloader */
[_NGUI] = MITCHSPLIT(
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \
______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \
______, ______, bbbbbb, ______, ______, ______, bbbbbb, ______, ______, ______ \
),
/* Fn Layer / Layer 1
* ,-----------------------------------------------------------------------------------------.
* |KC_GRV| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del |
* |-----------------------------------------------------------------------------------------+
* | CAPS | | | | | |Home | Pgup| Up | PgDn| End | | | |
* |-----------------------------------------------------------------------------------------+
* | | Vol-| Vol+| Mute| | | | Left| Down|Right| | | |
* |-----------------------------------------------------------------------------------------+
* | |Prev |Play |Next | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | LrSfx | |
* `-----------------------------------------------------------------------------------------'
*/
/*
* Pok3r-style layer switching on M and "," keys (_DFT and _NGUI layers, respectively). Note that
* these don't enable/disable those layers (i.e. latching keys), they actually switch to that layer.
* To go to the _NGUI layer, Fn+comma, to go to _DFT from _NGUI, hit Fn+M.
*/
/* Layer 1: Functions, primary layer switching, media controls, directional */
[_FN] = MITCHSPLIT(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
KC_CAPS, bbbbbb, bbbbbb, bbbbbb, bbbbbb, bbbbbb, KC_HOME, KC_PGUP, KC_UP , KC_PGDOWN,KC_END, bbbbbb, bbbbbb, bbbbbb, \
______, KC_VOLD, KC_VOLU, KC_MUTE, bbbbbb, bbbbbb, bbbbbb, KC_LEFT, KC_DOWN, KC_RIGHT, bbbbbb, bbbbbb, ______, \
______, KC_MPRV, KC_MPLY, KC_MNXT, bbbbbb, bbbbbb, bbbbbb,TO(_DFT),TO(_NGUI), bbbbbb, bbbbbb, ______, ______, \
______, ______, ______, ______, ______, ______, ______, ______,TG(_SFX),______ \
),
/* Special Effects Layer / Layer 2
* ,-----------------------------------------------------------------------------------------.
* | |Plain|Brth |Rnbw |Swirl|Snake|Knght|Xmas |Grdnt| | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | BL |BLSTEP| BL- | BL+ | | | | | | | | |Bootldr |
* |-----------------------------------------------------------------------------------------+
* | | RGBT| RGBM| | | | | | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | |LrDflt | |
* `-----------------------------------------------------------------------------------------'
*/
/* Tap RAlt to get back to default layer (0).
*
* See https://docs.qmk.fm/feature_rgblight.html#rgblight-keycodes for details about
* RGB codes. Quick summary, though:
*
* RGB_MODE_PLAIN RGB_M_P Switch to the static no animation mode
* RGB_MODE_BREATHE RGB_M_B Switch to the breathing mode
* RGB_MODE_RAINBOW RGB_M_R Switch to the rainbow mode (cycles through colors)
* RGB_MODE_SWIRL RGB_M_SW Switch to the swirl mode (like an animated gradient)
* RGB_MODE_SNAKE RGB_M_SN Switch to the snake mode
* RGB_MODE_KNIGHT RGB_M_K Switch to the knight animation
* RGB_MODE_XMAS RGB_M_X Switch to the Christmas animation
* RGB_MODE_GRADIENT RGB_M_G Switch to the static gradient mode
*
* Note that there are more animation variations, usually timer-based variations, by using the
* "S" key to cycle through modes. Use one of the deciated keys to get to
* the general mode where you want it, then cycle through variations of that mode to get
* something specific more quickly.
*/
/* Layer 2: "special effects": RGB lighting, backlighting, bootloader */
[_SFX] = MITCHSPLIT(
______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G,______, ______, ______, ______, ______, \
______, BL_TOGG, BL_STEP, BL_DEC, BL_INC, ______, ______, ______, ______, ______, ______, ______, ______, RESET, \
______, RGB_TOG, RGB_MOD,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \
______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, ______, ______, ______, ______, ______, ______, \
______, ______, ______, ______, ______, ______, ______, ______,TO(_DFT),______ \
)
};
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;
}
}

15
keyboards/acr60/readme.md Normal file
View File

@@ -0,0 +1,15 @@
# ACR60
![acr60](https://cdn.shopify.com/s/files/1/1697/5323/products/20170522001035_1024x1024.jpg?v=1504725199)
A customizable 60% keyboard based on the DZ60.
Keyboard Maintainer: QMK Community
Hardware Supported: ACR60
Hardware Availability: [mechkeysca](https://mechkeys.ca/products/acr60)
Make example for this keyboard (after setting up your build environment):
make acr60:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

56
keyboards/acr60/rules.mk Normal file
View File

@@ -0,0 +1,56 @@
# 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*
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = yes

View File

@@ -30,24 +30,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
},
[KEYNAV] = {
{KC_ESC, MEH(KC_A), RCTL(KC_Z), RCTL(KC_S), MEH(KC_B), KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP, },
{MEH(KC_C), MEH(KC_D), RSFT(KC_TAB), KC_TAB, MEH(KC_E), KC_TRNS, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), },
{MEH(KC_F), MEH(KC_G), MEH(KC_H), MEH(KC_I), MEH(KC_J), KC_TRNS, KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_PGDOWN, },
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), }
{KC_ESC, MEH(KC_F9), RCTL(KC_Z), RCTL(KC_S), MEH(KC_F10), KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP, },
{MEH(KC_F11), MEH(KC_F12), RSFT(KC_TAB), KC_TAB, MEH(KC_A), KC_TRNS, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), },
{MEH(KC_B), MEH(KC_C), MEH(KC_D), MEH(KC_E), MEH(KC_F), KC_TRNS, KC_TRNS, RCTL(KC_C), RCTL(KC_X), RCTL(KC_V), KC_PGDOWN, },
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), }
},
[KEYSEL] = {
{KC_TRNS, KC_TRNS, RCTL(KC_Z), RCTL(KC_S), KC_TRNS, KC_TRNS, KC_TRNS, RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), },
{KC_TRNS, KC_TRNS, RSFT(KC_TAB), KC_TAB, KC_TRNS, KC_TRNS, RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), },
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RCTL(KC_C),RCTL(KC_X), RCTL(KC_V), RSFT(KC_PGDN), },
{RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), }
{MEH(KC_G), MEH(KC_H),MEH(KC_I), MEH(KC_J), MEH(KC_K), KC_TRNS, KC_TRNS, RSFT(KC_HOME), RSFT(KC_UP), RSFT(KC_END), RSFT(KC_PGUP), },
{MEH(KC_L), MEH(KC_M),MEH(KC_N), MEH(KC_O), MEH(KC_P), KC_TRNS, RSFT(RCTL(KC_LEFT)), RSFT(KC_LEFT), RSFT(KC_DOWN), RSFT(KC_RIGHT), RSFT(RCTL(KC_RIGHT)), },
{MEH(KC_Q), MEH(KC_R),MEH(KC_S), MEH(KC_T), MEH(KC_U), KC_TRNS, KC_TRNS, RCTL(KC_C),RCTL(KC_X), RCTL(KC_V), RSFT(KC_PGDN), },
{RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_DELETE, LCTL(KC_DELETE), }
},
[COMBINED] = {
{KC_ESC, KC_LABK, KC_RABK, KC_DQUO, KC_GRAVE, KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, },
{KC_LPRN, KC_RPRN, KC_LBRACKET, KC_RBRACKET, KC_UNDS, KC_TRNS, KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, },
{KC_LCBR, KC_RCBR, KC_BSLS, KC_PIPE, KC_TILD, KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_QUES, },
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_DOT, KC_TRNS, KC_TRNS, }
{KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TRNS, KC_PLUS, KC_7, KC_8, KC_9, KC_ASTR, },
{KC_LPRN, KC_RPRN, KC_LBRACKET, KC_RBRACKET, KC_UNDS, KC_TRNS, KC_MINS, KC_4, KC_5, KC_6, KC_SLSH, },
{KC_COLN, KC_DQUO, KC_LCBR, KC_RCBR, KC_AMPR, KC_TRNS, KC_EQUAL, KC_1, KC_2, KC_3, KC_QUES, },
{KC_TRNS, KC_TILD, KC_GRAVE, KC_CIRC, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_DOT, KC_PIPE, KC_BSLS, }
},
[MOUSE] = {

View File

@@ -0,0 +1,62 @@
#include "atreus62.h"
#include "action_layer.h"
#define OOOOOOO KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS },
{ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS },
{ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, _______, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT },
{ KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_RCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC },
{ KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(1), KC_BSPC, KC_ENT, KC_SPC, MO(2), KC_DEL, KC_EQL, KC_LBRC, KC_RBRC }
},
[1] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PSLS, _______ },
{ _______, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PAST, _______ },
{ _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PGUP },
{ _______, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PGDN },
{ _______, _______, _______, _______, OOOOOOO, _______, _______, _______, _______, _______, _______, _______, _______ }
},
[2] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______ },
{ _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______ },
{ _______, _______, KC_MPLY, KC_MRWD, KC_MFFD, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, OOOOOOO, _______, _______, _______, _______ }
},
[3] = {
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, _______, _______, _______, _______, KC_COPY, KC_PGUP, _______, _______, KC_PASTE, KC_DEL },
{ _______, _______, _______, KC_PGDN, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______ },
{ _______, _______, KC_CUT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
{ _______, _______, _______, OOOOOOO, _______, _______, _______, _______, _______, _______, _______, _______, _______ }
}
};
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;
};

View File

@@ -0,0 +1,16 @@
# Mfluid Keymap for the Atreus62
## Program
`make atreus62:mfluid:avrdude`
## Layers
[0-default](https://i.imgur.com/dpBdPn8.png)
[1-numpad](https://i.imgur.com/JMN8Fk9.png)
[2-multimedia](https://i.imgur.com/ZCSzKsZ.png)
[3-vim](https://i.imgur.com/J15xCqW.png)

45
keyboards/bfake/bfake.c Normal file
View File

@@ -0,0 +1,45 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 "bfake.h"
#include "rgblight.h"
#include <avr/pgmspace.h>
#include "action_layer.h"
#include "i2c.h"
#include "quantum.h"
extern rgblight_config_t rgblight_config;
void rgblight_set(void) {
if (!rgblight_config.enable) {
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
}
}
i2c_init();
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
}
__attribute__ ((weak))
void matrix_scan_user(void) {
rgblight_task();
}

40
keyboards/bfake/bfake.h Normal file
View File

@@ -0,0 +1,40 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 BFAKE_H
#define BFAKE_H
#include "quantum.h"
#define KEYMAP( \
K61, K71, K72, K73, K74, K64, K65, K75, K76, K77, K78, K68, K66, K10, K60,\
K11, K01, K02, K03, K04, K14, K15, K05, K06, K07, K08, K18, K16, K20, \
K12, K21, K22, K23, K24, K34, K35, K25, K26, K27, K28, K38, K40, \
K19, K13, K41, K42, K43, K44, K54, K55, K45, K46, K47, K58, K49, K50,\
K09, K00, K39, K30, K59, K69, K37, K29\
){ \
{ KC_NO, K01, K02, K03, K04, K05, K06, K07, K08, K09, K00}, \
{ KC_NO, K11, K12, K13, K14, K15, K16, KC_NO, K18, K19, K10}, \
{ KC_NO, K21, K22, K23, K24, K25, K26, K27, K28, K29, K20}, \
{ KC_NO, KC_NO, KC_NO, KC_NO, K34, K35, KC_NO, K37, K38, K39, K30}, \
{ KC_NO, K41, K42, K43, K44, K45, K46, K47, KC_NO, K49, K40}, \
{ KC_NO, KC_NO, KC_NO, KC_NO, K54, K55, KC_NO, KC_NO, K58, K59, K50}, \
{ KC_NO, K61, KC_NO, KC_NO, K64, K65, K66, KC_NO, K68, K69, K60}, \
{ KC_NO, K71, K72, K73, K74, K75, K76, K77, K78, KC_NO, KC_NO}, \
}
#endif

49
keyboards/bfake/config.h Normal file
View File

@@ -0,0 +1,49 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 BFAKE_CONFIG_H
#define BFAKE_CONFIG_H
#include "config_common.h"
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define MANUFACTURER NotActuallyWinkeyless
#define PRODUCT b.fake
#define RGBLED_NUM 16
#define MATRIX_ROWS 8
#define MATRIX_COLS 11
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6}
#define UNUSED_PINS
#define DIODE_DIRECTION COL2ROW
#define DEBOUNCING_DELAY 5
#define RGBLIGHT_ANIMATIONS
#define NO_UART 1
#define BOOTLOADHID_BOOTLOADER 1
/* key combination for command */
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
#endif

106
keyboards/bfake/i2c.c Normal file
View File

@@ -0,0 +1,106 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@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/>.
*/
// Please do not modify this file
#include <avr/io.h>
#include <util/twi.h>
#include "i2c.h"
void i2c_set_bitrate(uint16_t bitrate_khz) {
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
if (bitrate_div >= 16) {
bitrate_div = (bitrate_div - 16) / 2;
}
TWBR = bitrate_div;
}
void i2c_init(void) {
// set pull-up resistors on I2C bus pins
PORTC |= 0b11;
i2c_set_bitrate(400);
// enable TWI (two-wire interface)
TWCR |= (1 << TWEN);
// enable TWI interrupt and slave address ACK
TWCR |= (1 << TWIE);
TWCR |= (1 << TWEA);
}
uint8_t i2c_start(uint8_t address) {
// reset TWI control register
TWCR = 0;
// begin transmission and wait for it to end
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the start condition was successfully transmitted
if ((TWSR & 0xF8) != TW_START) {
return 1;
}
// transmit address and wait
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the device has acknowledged the READ / WRITE mode
uint8_t twst = TW_STATUS & 0xF8;
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
return 1;
}
return 0;
}
void i2c_stop(void) {
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
uint8_t i2c_write(uint8_t data) {
TWDR = data;
// transmit data and wait
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
return 1;
}
return 0;
}
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
if (i2c_start(address)) {
return 1;
}
for (uint16_t i = 0; i < length; i++) {
if (i2c_write(data[i])) {
return 1;
}
}
i2c_stop();
return 0;
}

27
keyboards/bfake/i2c.h Normal file
View File

@@ -0,0 +1,27 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@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/>.
*/
// Please do not modify this file
#ifndef __I2C_H__
#define __I2C_H__
void i2c_init(void);
void i2c_set_bitrate(uint16_t bitrate_khz);
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
#endif

View File

@@ -0,0 +1,43 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 "bfake.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP(
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL
),
[1] = 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_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_DEL,
MO(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGDN, KC_TRNS, KC_TRNS, MO(2),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
MO(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};

106
keyboards/bfake/matrix.c Normal file
View File

@@ -0,0 +1,106 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 <avr/io.h>
#include <util/delay.h>
#include "matrix.h"
#ifndef DEBOUNCE
#define DEBOUNCE 5
#endif
static uint8_t debouncing = DEBOUNCE;
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
void matrix_init(void) {
// all outputs for rows high
DDRB = 0xFF;
PORTB = 0xFF;
// all inputs for columns
DDRA = 0x00;
DDRC &= ~(0x111111<<2);
DDRD &= ~(1<<PIND7);
// all columns are pulled-up
PORTA = 0xFF;
PORTC |= (0b111111<<2);
PORTD |= (1<<PIND7);
// initialize matrix state: all keys off
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix[row] = 0x00;
matrix_debouncing[row] = 0x00;
}
}
void matrix_set_row_status(uint8_t row) {
DDRB = (1 << row);
PORTB = ~(1 << row);
}
uint8_t bit_reverse(uint8_t x) {
x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}
uint8_t matrix_scan(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix_set_row_status(row);
_delay_us(5);
matrix_row_t cols = (
// cols 0..7, PORTA 0 -> 7
(~PINA) & 0xFF
) | (
// cols 8..13, PORTC 7 -> 0
bit_reverse((~PINC) & 0xFF) << 8
) | (
// col 14, PORTD 7
((~PIND) & (1 << PIND7)) << 7
);
if (matrix_debouncing[row] != cols) {
matrix_debouncing[row] = cols;
debouncing = DEBOUNCE;
}
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
matrix_scan_user();
return 1;
}
inline matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}
void matrix_print(void) {
}

14
keyboards/bfake/readme.md Normal file
View File

@@ -0,0 +1,14 @@
B.fake
========
A 60% keyboard with RGB
Keyboard Maintainer: QMK Community
Hardware Supported: B.fake PCB
Hardware Availability: https://www.aliexpress.com/store/product/bface-60-RGB-underground-copy-pcb-from-china-gh60-pcb-Customize-keyboard-PCB/2230037_32731084597.html
Make example for this keyboard (after setting up your build environment):
make bfake:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

View File

@@ -1,4 +1,4 @@
# Copyright 2013 Jun Wako <wakojun@gmail.com>
# Copyright 2017 Luiz Ribeiro <luizribeiro@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
@@ -13,6 +13,33 @@
# 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 MAKEFILE_INCLUDED
include ../../Makefile
endif
# MCU name
MCU = atmega32a
PROTOCOL = VUSB
# unsupported features for now
NO_UART = yes
NO_SUSPEND_POWER_DOWN = yes
# processor frequency
F_CPU = 12000000
# build options
BOOTMAGIC_ENABLE = yes
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
CONSOLE_ENABLE = yes
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = no
RGBLIGHT_ENABLE = yes
RGBLIGHT_CUSTOM_DRIVER = yes
OPT_DEFS = -DDEBUG_LEVEL=0
OPT_DEFS += -DBOOTLOADER_SIZE=2048
# custom matrix setup
CUSTOM_MATRIX = yes
SRC = matrix.c i2c.c
# programming options
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex

396
keyboards/bfake/usbconfig.h Normal file
View File

@@ -0,0 +1,396 @@
/* Name: usbconfig.h
* Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
* Author: Christian Starkjohann
* Creation Date: 2005-04-01
* Tabsize: 4
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
* This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
*/
#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__
#include "config.h"
/*
General Description:
This file is an example configuration (with inline documentation) for the USB
driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
wire the lines to any other port, as long as D+ is also wired to INT0 (or any
other hardware interrupt, as long as it is the highest level interrupt, see
section at the end of this file).
*/
/* ---------------------------- Hardware Config ---------------------------- */
#define USB_CFG_IOPORTNAME D
/* This is the port where the USB bus is connected. When you configure it to
* "B", the registers PORTB, PINB and DDRB will be used.
*/
#define USB_CFG_DMINUS_BIT 3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This may be any bit in the port.
*/
#define USB_CFG_DPLUS_BIT 2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port. Please note that D+ must also be connected
* to interrupt pin INT0! [You can also use other interrupts, see section
* "Optional MCU Description" below, or you can connect D- to the interrupt, as
* it is required if you use the USB_COUNT_SOF feature. If you use D- for the
* interrupt, the USB interrupt will also be triggered at Start-Of-Frame
* markers every millisecond.]
*/
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
* 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
* require no crystal, they tolerate +/- 1% deviation from the nominal
* frequency. All other rates require a precision of 2000 ppm and thus a
* crystal!
* Since F_CPU should be defined to your actual clock rate anyway, you should
* not need to modify this setting.
*/
#define USB_CFG_CHECK_CRC 0
/* Define this to 1 if you want that the driver checks integrity of incoming
* data packets (CRC checks). CRC checks cost quite a bit of code size and are
* currently only available for 18 MHz crystal clock. You must choose
* USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
*/
/* ----------------------- Optional Hardware Config ------------------------ */
/* #define USB_CFG_PULLUP_IOPORTNAME D */
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
* V+, you can connect and disconnect the device from firmware by calling
* the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
* This constant defines the port on which the pullup resistor is connected.
*/
/* #define USB_CFG_PULLUP_BIT 4 */
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
* above) where the 1.5k pullup resistor is connected. See description
* above for details.
*/
/* --------------------------- Functional Range ---------------------------- */
#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
/* Define this to 1 if you want to compile a version with two endpoints: The
* default control endpoint 0 and an interrupt-in endpoint (any other endpoint
* number).
*/
#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
/* Define this to 1 if you want to compile a version with three endpoints: The
* default control endpoint 0, an interrupt-in endpoint 3 (or the number
* configured below) and a catch-all default interrupt-in endpoint as above.
* You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
*/
#define USB_CFG_EP3_NUMBER 3
/* If the so-called endpoint 3 is used, it can now be configured to any other
* endpoint number (except 0) with this macro. Default if undefined is 3.
*/
/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
/* The above macro defines the startup condition for data toggling on the
* interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
* Since the token is toggled BEFORE sending any data, the first packet is
* sent with the oposite value of this configuration!
*/
#define USB_CFG_IMPLEMENT_HALT 0
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
* for endpoint 1 (interrupt endpoint). Although you may not need this feature,
* it is required by the standard. We have made it a config option because it
* bloats the code considerably.
*/
#define USB_CFG_SUPPRESS_INTR_CODE 0
/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
* want to send any data over them. If this macro is defined to 1, functions
* usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
* you need the interrupt-in endpoints in order to comply to an interface
* (e.g. HID), but never want to send any data. This option saves a couple
* of bytes in flash memory and the transmit buffers in RAM.
*/
#define USB_CFG_INTR_POLL_INTERVAL 1
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
* interval. The value is in milliseconds and must not be less than 10 ms for
* low speed devices.
*/
#define USB_CFG_IS_SELF_POWERED 0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
* device is powered from the USB bus.
*/
#define USB_CFG_MAX_BUS_POWER 500
/* Set this variable to the maximum USB bus power consumption of your device.
* The value is in milliamperes. [It will be divided by two since USB
* communicates power requirements in units of 2 mA.]
*/
#define USB_CFG_IMPLEMENT_FN_WRITE 1
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
* transfers. Set it to 0 if you don't need it and want to save a couple of
* bytes.
*/
#define USB_CFG_IMPLEMENT_FN_READ 0
/* Set this to 1 if you need to send control replies which are generated
* "on the fly" when usbFunctionRead() is called. If you only want to send
* data from a static buffer, set it to 0 and return the data from
* usbFunctionSetup(). This saves a couple of bytes.
*/
#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
* You must implement the function usbFunctionWriteOut() which receives all
* interrupt/bulk data sent to any endpoint other than 0. The endpoint number
* can be found in 'usbRxToken'.
*/
#define USB_CFG_HAVE_FLOWCONTROL 0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
* of the macros usbDisableAllRequests() and usbEnableAllRequests() in
* usbdrv.h.
*/
#define USB_CFG_DRIVER_FLASH_PAGE 0
/* If the device has more than 64 kBytes of flash, define this to the 64 k page
* where the driver's constants (descriptors) are located. Or in other words:
* Define this to 1 for boot loaders on the ATMega128.
*/
#define USB_CFG_LONG_TRANSFERS 0
/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
* in a single control-in or control-out transfer. Note that the capability
* for long transfers increases the driver size.
*/
/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
/* This macro is a hook if you want to do unconventional things. If it is
* defined, it's inserted at the beginning of received message processing.
* If you eat the received message and don't want default processing to
* proceed, do a return after doing your things. One possible application
* (besides debugging) is to flash a status LED on each packet.
*/
/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
/* This macro is a hook if you need to know when an USB RESET occurs. It has
* one parameter which distinguishes between the start of RESET state and its
* end.
*/
/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
/* This macro (if defined) is executed when a USB SET_ADDRESS request was
* received.
*/
#define USB_COUNT_SOF 1
/* define this macro to 1 if you need the global variable "usbSofCount" which
* counts SOF packets. This feature requires that the hardware interrupt is
* connected to D- instead of D+.
*/
/* #ifdef __ASSEMBLER__
* macro myAssemblerMacro
* in YL, TCNT0
* sts timer0Snapshot, YL
* endm
* #endif
* #define USB_SOF_HOOK myAssemblerMacro
* This macro (if defined) is executed in the assembler module when a
* Start Of Frame condition is detected. It is recommended to define it to
* the name of an assembler macro which is defined here as well so that more
* than one assembler instruction can be used. The macro may use the register
* YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
* immediately after an SOF pulse may be lost and must be retried by the host.
* What can you do with this hook? Since the SOF signal occurs exactly every
* 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
* designs running on the internal RC oscillator.
* Please note that Start Of Frame detection works only if D- is wired to the
* interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
*/
#define USB_CFG_CHECK_DATA_TOGGLING 0
/* define this macro to 1 if you want to filter out duplicate data packets
* sent by the host. Duplicates occur only as a consequence of communication
* errors, when the host does not receive an ACK. Please note that you need to
* implement the filtering yourself in usbFunctionWriteOut() and
* usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
* for each control- and out-endpoint to check for duplicate packets.
*/
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
/* define this macro to 1 if you want the function usbMeasureFrameLength()
* compiled in. This function can be used to calibrate the AVR's RC oscillator.
*/
#define USB_USE_FAST_CRC 0
/* The assembler module has two implementations for the CRC algorithm. One is
* faster, the other is smaller. This CRC routine is only used for transmitted
* messages where timing is not critical. The faster routine needs 31 cycles
* per byte while the smaller one needs 61 to 69 cycles. The faster routine
* may be worth the 32 bytes bigger code size if you transmit lots of data and
* run the AVR close to its limit.
*/
/* -------------------------- Device Description --------------------------- */
#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
/* USB vendor ID for the device, low byte first. If you have registered your
* own Vendor ID, define it here. Otherwise you may use one of obdev's free
* shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
* *** IMPORTANT NOTE ***
* This template uses obdev's shared VID/PID pair for Vendor Class devices
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
* the implications!
*/
#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
/* This is the ID of the product, low byte first. It is interpreted in the
* scope of the vendor ID. If you have registered your own VID with usb.org
* or if you have licensed a PID from somebody else, define it here. Otherwise
* you may use one of obdev's free shared VID/PID pairs. See the file
* USB-IDs-for-free.txt for details!
* *** IMPORTANT NOTE ***
* This template uses obdev's shared VID/PID pair for Vendor Class devices
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
* the implications!
*/
#define USB_CFG_DEVICE_VERSION 0x00, 0x02
/* Version number of the device: Minor number first, then major number.
*/
#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
#define USB_CFG_VENDOR_NAME_LEN 13
/* These two values define the vendor name returned by the USB device. The name
* must be given as a list of characters under single quotes. The characters
* are interpreted as Unicode (UTF-16) entities.
* If you don't want a vendor name string, undefine these macros.
* ALWAYS define a vendor name containing your Internet domain name if you use
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
* details.
*/
#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
#define USB_CFG_DEVICE_NAME_LEN 8
/* Same as above for the device name. If you don't want a device name, undefine
* the macros. See the file USB-IDs-for-free.txt before you assign a name if
* you use a shared VID/PID.
*/
/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
/* Same as above for the serial number. If you don't want a serial number,
* undefine the macros.
* It may be useful to provide the serial number through other means than at
* compile time. See the section about descriptor properties below for how
* to fine tune control over USB descriptors such as the string descriptor
* for the serial number.
*/
#define USB_CFG_DEVICE_CLASS 0
#define USB_CFG_DEVICE_SUBCLASS 0
/* See USB specification if you want to conform to an existing device class.
* Class 0xff is "vendor specific".
*/
#define USB_CFG_INTERFACE_CLASS 3 /* HID */
#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
/* See USB specification if you want to conform to an existing device class or
* protocol. The following classes must be set at interface level:
* HID class is 3, no subclass and protocol required (but may be useful!)
* CDC class is 2, use subclass 2 and protocol 1 for ACM
*/
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
/* Define this to the length of the HID report descriptor, if you implement
* an HID device. Otherwise don't define it or define it to 0.
* If you use this define, you must add a PROGMEM character array named
* "usbHidReportDescriptor" to your code which contains the report descriptor.
* Don't forget to keep the array and this define in sync!
*/
/* #define USB_PUBLIC static */
/* Use the define above if you #include usbdrv.c instead of linking against it.
* This technique saves a couple of bytes in flash memory.
*/
/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
* provide our own. These can be provided as (1) fixed length static data in
* flash memory, (2) fixed length static data in RAM or (3) dynamically at
* runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
* information about this function.
* Descriptor handling is configured through the descriptor's properties. If
* no properties are defined or if they are 0, the default descriptor is used.
* Possible properties are:
* + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
* at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
* used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
* you want RAM pointers.
* + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
* in static memory is in RAM, not in flash memory.
* + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
* the driver must know the descriptor's length. The descriptor itself is
* found at the address of a well known identifier (see below).
* List of static descriptor names (must be declared PROGMEM if in flash):
* char usbDescriptorDevice[];
* char usbDescriptorConfiguration[];
* char usbDescriptorHidReport[];
* char usbDescriptorString0[];
* int usbDescriptorStringVendor[];
* int usbDescriptorStringDevice[];
* int usbDescriptorStringSerialNumber[];
* Other descriptors can't be provided statically, they must be provided
* dynamically at runtime.
*
* Descriptor properties are or-ed or added together, e.g.:
* #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
*
* The following descriptors are defined:
* USB_CFG_DESCR_PROPS_DEVICE
* USB_CFG_DESCR_PROPS_CONFIGURATION
* USB_CFG_DESCR_PROPS_STRINGS
* USB_CFG_DESCR_PROPS_STRING_0
* USB_CFG_DESCR_PROPS_STRING_VENDOR
* USB_CFG_DESCR_PROPS_STRING_PRODUCT
* USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
* USB_CFG_DESCR_PROPS_HID
* USB_CFG_DESCR_PROPS_HID_REPORT
* USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
*
* Note about string descriptors: String descriptors are not just strings, they
* are Unicode strings prefixed with a 2 byte header. Example:
* int serialNumberDescriptor[] = {
* USB_STRING_DESCRIPTOR_HEADER(6),
* 'S', 'e', 'r', 'i', 'a', 'l'
* };
*/
#define USB_CFG_DESCR_PROPS_DEVICE 0
#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
#define USB_CFG_DESCR_PROPS_STRINGS 0
#define USB_CFG_DESCR_PROPS_STRING_0 0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_HID 0
#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
#define USB_CFG_DESCR_PROPS_UNKNOWN 0
#define usbMsgPtr_t unsigned short
/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
* a scalar type here because gcc generates slightly shorter code for scalar
* arithmetics than for pointer arithmetics. Remove this define for backward
* type compatibility or define it to an 8 bit type if you use data in RAM only
* and all RAM is below 256 bytes (tiny memory model in IAR CC).
*/
/* ----------------------- Optional MCU Description ------------------------ */
/* The following configurations have working defaults in usbdrv.h. You
* usually don't need to set them explicitly. Only if you want to run
* the driver on a device which is not yet supported or with a compiler
* which is not fully supported (such as IAR C) or if you use a differnt
* interrupt than INT0, you may have to define some of these.
*/
/* #define USB_INTR_CFG MCUCR */
/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE GIMSK */
/* #define USB_INTR_ENABLE_BIT INT0 */
/* #define USB_INTR_PENDING GIFR */
/* #define USB_INTR_PENDING_BIT INTF0 */
/* #define USB_INTR_VECTOR INT0_vect */
/* Set INT1 for D- falling edge to count SOF */
/* #define USB_INTR_CFG EICRA */
#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE EIMSK */
#define USB_INTR_ENABLE_BIT INT1
/* #define USB_INTR_PENDING EIFR */
#define USB_INTR_PENDING_BIT INTF1
#define USB_INTR_VECTOR INT1_vect
#endif /* __usbconfig_h_included__ */

45
keyboards/bmini/bmini.c Normal file
View File

@@ -0,0 +1,45 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 "bmini.h"
#include "rgblight.h"
#include <avr/pgmspace.h>
#include "action_layer.h"
#include "i2c.h"
#include "quantum.h"
extern rgblight_config_t rgblight_config;
void rgblight_set(void) {
if (!rgblight_config.enable) {
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
}
}
i2c_init();
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM);
}
__attribute__ ((weak))
void matrix_scan_user(void) {
rgblight_task();
}

60
keyboards/bmini/bmini.h Normal file
View File

@@ -0,0 +1,60 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 BMINI_H
#define BMINI_H
#include "quantum.h"
#define KEYMAP( \
K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \
K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \
K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \
K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \
K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \
K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \
){ \
{ K00, K10, K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB0, KC0, KD0, KE0 }, \
{ K01, K11, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \
{ K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, KC_NO, KC_NO, KA2, KB2, KC_NO, KD2, KE2 }, \
{ K03, K13, K23, K33, K43, K53, KC_NO, KC_NO, KC_NO, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \
{ K04, K14, K24, K34, K44, K54, KC_NO, KC_NO, KC_NO, KC_NO, KA4, KB4, KC4, KC_NO, KE4 }, \
{ K05, KC_NO, K25, K35, K45, K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB5, KC5, KD5, KE5 }, \
{ K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \
{ K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \
}
#define KC_KEYMAP( \
K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \
K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \
K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \
K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \
K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \
K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \
) \
{ \
{ KC_##K00, KC_##K10, KC_##K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \
{ KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \
{ KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA2, KC_##KB2, KC_NO, KC_##KD2, KC_##KE2 }, \
{ KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \
{ KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \
{ KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \
{ KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \
{ KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \
}
#endif

42
keyboards/bmini/config.h Normal file
View File

@@ -0,0 +1,42 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 BMINI_CONFIG_H
#define BMINI_CONFIG_H
#include "config_common.h"
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define MANUFACTURER winkeyless.kr
#define PRODUCT B.mini
#define RGBLED_NUM 16
/* matrix size */
#define MATRIX_ROWS 8
#define MATRIX_COLS 15
#define RGBLIGHT_ANIMATIONS
#define NO_UART 1
#define BOOTLOADHID_BOOTLOADER 1
/* key combination for command */
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
#endif

106
keyboards/bmini/i2c.c Normal file
View File

@@ -0,0 +1,106 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@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/>.
*/
// Please do not modify this file
#include <avr/io.h>
#include <util/twi.h>
#include "i2c.h"
void i2c_set_bitrate(uint16_t bitrate_khz) {
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
if (bitrate_div >= 16) {
bitrate_div = (bitrate_div - 16) / 2;
}
TWBR = bitrate_div;
}
void i2c_init(void) {
// set pull-up resistors on I2C bus pins
PORTC |= 0b11;
i2c_set_bitrate(400);
// enable TWI (two-wire interface)
TWCR |= (1 << TWEN);
// enable TWI interrupt and slave address ACK
TWCR |= (1 << TWIE);
TWCR |= (1 << TWEA);
}
uint8_t i2c_start(uint8_t address) {
// reset TWI control register
TWCR = 0;
// begin transmission and wait for it to end
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the start condition was successfully transmitted
if ((TWSR & 0xF8) != TW_START) {
return 1;
}
// transmit address and wait
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the device has acknowledged the READ / WRITE mode
uint8_t twst = TW_STATUS & 0xF8;
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
return 1;
}
return 0;
}
void i2c_stop(void) {
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
uint8_t i2c_write(uint8_t data) {
TWDR = data;
// transmit data and wait
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
return 1;
}
return 0;
}
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
if (i2c_start(address)) {
return 1;
}
for (uint16_t i = 0; i < length; i++) {
if (i2c_write(data[i])) {
return 1;
}
}
i2c_stop();
return 0;
}

27
keyboards/bmini/i2c.h Normal file
View File

@@ -0,0 +1,27 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@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/>.
*/
// Please do not modify this file
#ifndef __I2C_H__
#define __I2C_H__
void i2c_init(void);
void i2c_set_bitrate(uint16_t bitrate_khz);
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
#endif

View File

@@ -15,16 +15,14 @@ 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 "ps2avrGB.h"
#include "action_layer.h"
#include "rgblight.h"
#include "bmini.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_HOME,KC_END,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_INS,
KC_FN0, 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,
MO(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, KC_PGUP,
KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL,KC_LALT,KC_LGUI, KC_SPC, KC_RGUI,KC_RALT,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT
),
@@ -37,7 +35,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_RGHT
),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_MOMENTARY(1),
};

106
keyboards/bmini/matrix.c Normal file
View File

@@ -0,0 +1,106 @@
/*
Copyright 2017 Luiz Ribeiro <luizribeiro@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 <avr/io.h>
#include <util/delay.h>
#include "matrix.h"
#ifndef DEBOUNCE
#define DEBOUNCE 5
#endif
static uint8_t debouncing = DEBOUNCE;
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
void matrix_init(void) {
// all outputs for rows high
DDRB = 0xFF;
PORTB = 0xFF;
// all inputs for columns
DDRA = 0x00;
DDRC &= ~(0x111111<<2);
DDRD &= ~(1<<PIND7);
// all columns are pulled-up
PORTA = 0xFF;
PORTC |= (0b111111<<2);
PORTD |= (1<<PIND7);
// initialize matrix state: all keys off
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix[row] = 0x00;
matrix_debouncing[row] = 0x00;
}
}
void matrix_set_row_status(uint8_t row) {
DDRB = (1 << row);
PORTB = ~(1 << row);
}
uint8_t bit_reverse(uint8_t x) {
x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}
uint8_t matrix_scan(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix_set_row_status(row);
_delay_us(5);
matrix_row_t cols = (
// cols 0..7, PORTA 0 -> 7
(~PINA) & 0xFF
) | (
// cols 8..13, PORTC 7 -> 0
bit_reverse((~PINC) & 0xFF) << 8
) | (
// col 14, PORTD 7
((~PIND) & (1 << PIND7)) << 7
);
if (matrix_debouncing[row] != cols) {
matrix_debouncing[row] = cols;
debouncing = DEBOUNCE;
}
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
matrix_scan_user();
return 1;
}
inline matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}
void matrix_print(void) {
}

14
keyboards/bmini/readme.md Normal file
View File

@@ -0,0 +1,14 @@
B.mini
========
A 75% keyboard with RGB
Keyboard Maintainer: QMK Community
Hardware Supported: B.mini PCB
Hardware Availability: http://winkeyless.kr/product/b-mini-x2-pcb/
Make example for this keyboard (after setting up your build environment):
make bmini:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

45
keyboards/bmini/rules.mk Normal file
View File

@@ -0,0 +1,45 @@
# Copyright 2017 Luiz Ribeiro <luizribeiro@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/>.
# MCU name
MCU = atmega32a
PROTOCOL = VUSB
# unsupported features for now
NO_UART = yes
NO_SUSPEND_POWER_DOWN = yes
# processor frequency
F_CPU = 12000000
# build options
BOOTMAGIC_ENABLE = yes
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
CONSOLE_ENABLE = yes
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = no
RGBLIGHT_ENABLE = yes
RGBLIGHT_CUSTOM_DRIVER = yes
OPT_DEFS = -DDEBUG_LEVEL=0
OPT_DEFS += -DBOOTLOADER_SIZE=2048
# custom matrix setup
CUSTOM_MATRIX = yes
SRC = matrix.c i2c.c
# programming options
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex

396
keyboards/bmini/usbconfig.h Normal file
View File

@@ -0,0 +1,396 @@
/* Name: usbconfig.h
* Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
* Author: Christian Starkjohann
* Creation Date: 2005-04-01
* Tabsize: 4
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
* This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
*/
#ifndef __usbconfig_h_included__
#define __usbconfig_h_included__
#include "config.h"
/*
General Description:
This file is an example configuration (with inline documentation) for the USB
driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
wire the lines to any other port, as long as D+ is also wired to INT0 (or any
other hardware interrupt, as long as it is the highest level interrupt, see
section at the end of this file).
*/
/* ---------------------------- Hardware Config ---------------------------- */
#define USB_CFG_IOPORTNAME D
/* This is the port where the USB bus is connected. When you configure it to
* "B", the registers PORTB, PINB and DDRB will be used.
*/
#define USB_CFG_DMINUS_BIT 3
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This may be any bit in the port.
*/
#define USB_CFG_DPLUS_BIT 2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port. Please note that D+ must also be connected
* to interrupt pin INT0! [You can also use other interrupts, see section
* "Optional MCU Description" below, or you can connect D- to the interrupt, as
* it is required if you use the USB_COUNT_SOF feature. If you use D- for the
* interrupt, the USB interrupt will also be triggered at Start-Of-Frame
* markers every millisecond.]
*/
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
* 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
* require no crystal, they tolerate +/- 1% deviation from the nominal
* frequency. All other rates require a precision of 2000 ppm and thus a
* crystal!
* Since F_CPU should be defined to your actual clock rate anyway, you should
* not need to modify this setting.
*/
#define USB_CFG_CHECK_CRC 0
/* Define this to 1 if you want that the driver checks integrity of incoming
* data packets (CRC checks). CRC checks cost quite a bit of code size and are
* currently only available for 18 MHz crystal clock. You must choose
* USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
*/
/* ----------------------- Optional Hardware Config ------------------------ */
/* #define USB_CFG_PULLUP_IOPORTNAME D */
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
* V+, you can connect and disconnect the device from firmware by calling
* the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
* This constant defines the port on which the pullup resistor is connected.
*/
/* #define USB_CFG_PULLUP_BIT 4 */
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
* above) where the 1.5k pullup resistor is connected. See description
* above for details.
*/
/* --------------------------- Functional Range ---------------------------- */
#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
/* Define this to 1 if you want to compile a version with two endpoints: The
* default control endpoint 0 and an interrupt-in endpoint (any other endpoint
* number).
*/
#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
/* Define this to 1 if you want to compile a version with three endpoints: The
* default control endpoint 0, an interrupt-in endpoint 3 (or the number
* configured below) and a catch-all default interrupt-in endpoint as above.
* You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
*/
#define USB_CFG_EP3_NUMBER 3
/* If the so-called endpoint 3 is used, it can now be configured to any other
* endpoint number (except 0) with this macro. Default if undefined is 3.
*/
/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
/* The above macro defines the startup condition for data toggling on the
* interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
* Since the token is toggled BEFORE sending any data, the first packet is
* sent with the oposite value of this configuration!
*/
#define USB_CFG_IMPLEMENT_HALT 0
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
* for endpoint 1 (interrupt endpoint). Although you may not need this feature,
* it is required by the standard. We have made it a config option because it
* bloats the code considerably.
*/
#define USB_CFG_SUPPRESS_INTR_CODE 0
/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
* want to send any data over them. If this macro is defined to 1, functions
* usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
* you need the interrupt-in endpoints in order to comply to an interface
* (e.g. HID), but never want to send any data. This option saves a couple
* of bytes in flash memory and the transmit buffers in RAM.
*/
#define USB_CFG_INTR_POLL_INTERVAL 1
/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
* interval. The value is in milliseconds and must not be less than 10 ms for
* low speed devices.
*/
#define USB_CFG_IS_SELF_POWERED 0
/* Define this to 1 if the device has its own power supply. Set it to 0 if the
* device is powered from the USB bus.
*/
#define USB_CFG_MAX_BUS_POWER 500
/* Set this variable to the maximum USB bus power consumption of your device.
* The value is in milliamperes. [It will be divided by two since USB
* communicates power requirements in units of 2 mA.]
*/
#define USB_CFG_IMPLEMENT_FN_WRITE 1
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
* transfers. Set it to 0 if you don't need it and want to save a couple of
* bytes.
*/
#define USB_CFG_IMPLEMENT_FN_READ 0
/* Set this to 1 if you need to send control replies which are generated
* "on the fly" when usbFunctionRead() is called. If you only want to send
* data from a static buffer, set it to 0 and return the data from
* usbFunctionSetup(). This saves a couple of bytes.
*/
#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
* You must implement the function usbFunctionWriteOut() which receives all
* interrupt/bulk data sent to any endpoint other than 0. The endpoint number
* can be found in 'usbRxToken'.
*/
#define USB_CFG_HAVE_FLOWCONTROL 0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
* of the macros usbDisableAllRequests() and usbEnableAllRequests() in
* usbdrv.h.
*/
#define USB_CFG_DRIVER_FLASH_PAGE 0
/* If the device has more than 64 kBytes of flash, define this to the 64 k page
* where the driver's constants (descriptors) are located. Or in other words:
* Define this to 1 for boot loaders on the ATMega128.
*/
#define USB_CFG_LONG_TRANSFERS 0
/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
* in a single control-in or control-out transfer. Note that the capability
* for long transfers increases the driver size.
*/
/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
/* This macro is a hook if you want to do unconventional things. If it is
* defined, it's inserted at the beginning of received message processing.
* If you eat the received message and don't want default processing to
* proceed, do a return after doing your things. One possible application
* (besides debugging) is to flash a status LED on each packet.
*/
/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
/* This macro is a hook if you need to know when an USB RESET occurs. It has
* one parameter which distinguishes between the start of RESET state and its
* end.
*/
/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
/* This macro (if defined) is executed when a USB SET_ADDRESS request was
* received.
*/
#define USB_COUNT_SOF 1
/* define this macro to 1 if you need the global variable "usbSofCount" which
* counts SOF packets. This feature requires that the hardware interrupt is
* connected to D- instead of D+.
*/
/* #ifdef __ASSEMBLER__
* macro myAssemblerMacro
* in YL, TCNT0
* sts timer0Snapshot, YL
* endm
* #endif
* #define USB_SOF_HOOK myAssemblerMacro
* This macro (if defined) is executed in the assembler module when a
* Start Of Frame condition is detected. It is recommended to define it to
* the name of an assembler macro which is defined here as well so that more
* than one assembler instruction can be used. The macro may use the register
* YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
* immediately after an SOF pulse may be lost and must be retried by the host.
* What can you do with this hook? Since the SOF signal occurs exactly every
* 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
* designs running on the internal RC oscillator.
* Please note that Start Of Frame detection works only if D- is wired to the
* interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
*/
#define USB_CFG_CHECK_DATA_TOGGLING 0
/* define this macro to 1 if you want to filter out duplicate data packets
* sent by the host. Duplicates occur only as a consequence of communication
* errors, when the host does not receive an ACK. Please note that you need to
* implement the filtering yourself in usbFunctionWriteOut() and
* usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
* for each control- and out-endpoint to check for duplicate packets.
*/
#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
/* define this macro to 1 if you want the function usbMeasureFrameLength()
* compiled in. This function can be used to calibrate the AVR's RC oscillator.
*/
#define USB_USE_FAST_CRC 0
/* The assembler module has two implementations for the CRC algorithm. One is
* faster, the other is smaller. This CRC routine is only used for transmitted
* messages where timing is not critical. The faster routine needs 31 cycles
* per byte while the smaller one needs 61 to 69 cycles. The faster routine
* may be worth the 32 bytes bigger code size if you transmit lots of data and
* run the AVR close to its limit.
*/
/* -------------------------- Device Description --------------------------- */
#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
/* USB vendor ID for the device, low byte first. If you have registered your
* own Vendor ID, define it here. Otherwise you may use one of obdev's free
* shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
* *** IMPORTANT NOTE ***
* This template uses obdev's shared VID/PID pair for Vendor Class devices
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
* the implications!
*/
#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
/* This is the ID of the product, low byte first. It is interpreted in the
* scope of the vendor ID. If you have registered your own VID with usb.org
* or if you have licensed a PID from somebody else, define it here. Otherwise
* you may use one of obdev's free shared VID/PID pairs. See the file
* USB-IDs-for-free.txt for details!
* *** IMPORTANT NOTE ***
* This template uses obdev's shared VID/PID pair for Vendor Class devices
* with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
* the implications!
*/
#define USB_CFG_DEVICE_VERSION 0x00, 0x02
/* Version number of the device: Minor number first, then major number.
*/
#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
#define USB_CFG_VENDOR_NAME_LEN 13
/* These two values define the vendor name returned by the USB device. The name
* must be given as a list of characters under single quotes. The characters
* are interpreted as Unicode (UTF-16) entities.
* If you don't want a vendor name string, undefine these macros.
* ALWAYS define a vendor name containing your Internet domain name if you use
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
* details.
*/
#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
#define USB_CFG_DEVICE_NAME_LEN 8
/* Same as above for the device name. If you don't want a device name, undefine
* the macros. See the file USB-IDs-for-free.txt before you assign a name if
* you use a shared VID/PID.
*/
/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
/* Same as above for the serial number. If you don't want a serial number,
* undefine the macros.
* It may be useful to provide the serial number through other means than at
* compile time. See the section about descriptor properties below for how
* to fine tune control over USB descriptors such as the string descriptor
* for the serial number.
*/
#define USB_CFG_DEVICE_CLASS 0
#define USB_CFG_DEVICE_SUBCLASS 0
/* See USB specification if you want to conform to an existing device class.
* Class 0xff is "vendor specific".
*/
#define USB_CFG_INTERFACE_CLASS 3 /* HID */
#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
/* See USB specification if you want to conform to an existing device class or
* protocol. The following classes must be set at interface level:
* HID class is 3, no subclass and protocol required (but may be useful!)
* CDC class is 2, use subclass 2 and protocol 1 for ACM
*/
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
/* Define this to the length of the HID report descriptor, if you implement
* an HID device. Otherwise don't define it or define it to 0.
* If you use this define, you must add a PROGMEM character array named
* "usbHidReportDescriptor" to your code which contains the report descriptor.
* Don't forget to keep the array and this define in sync!
*/
/* #define USB_PUBLIC static */
/* Use the define above if you #include usbdrv.c instead of linking against it.
* This technique saves a couple of bytes in flash memory.
*/
/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
* provide our own. These can be provided as (1) fixed length static data in
* flash memory, (2) fixed length static data in RAM or (3) dynamically at
* runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
* information about this function.
* Descriptor handling is configured through the descriptor's properties. If
* no properties are defined or if they are 0, the default descriptor is used.
* Possible properties are:
* + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
* at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
* used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
* you want RAM pointers.
* + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
* in static memory is in RAM, not in flash memory.
* + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
* the driver must know the descriptor's length. The descriptor itself is
* found at the address of a well known identifier (see below).
* List of static descriptor names (must be declared PROGMEM if in flash):
* char usbDescriptorDevice[];
* char usbDescriptorConfiguration[];
* char usbDescriptorHidReport[];
* char usbDescriptorString0[];
* int usbDescriptorStringVendor[];
* int usbDescriptorStringDevice[];
* int usbDescriptorStringSerialNumber[];
* Other descriptors can't be provided statically, they must be provided
* dynamically at runtime.
*
* Descriptor properties are or-ed or added together, e.g.:
* #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
*
* The following descriptors are defined:
* USB_CFG_DESCR_PROPS_DEVICE
* USB_CFG_DESCR_PROPS_CONFIGURATION
* USB_CFG_DESCR_PROPS_STRINGS
* USB_CFG_DESCR_PROPS_STRING_0
* USB_CFG_DESCR_PROPS_STRING_VENDOR
* USB_CFG_DESCR_PROPS_STRING_PRODUCT
* USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
* USB_CFG_DESCR_PROPS_HID
* USB_CFG_DESCR_PROPS_HID_REPORT
* USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
*
* Note about string descriptors: String descriptors are not just strings, they
* are Unicode strings prefixed with a 2 byte header. Example:
* int serialNumberDescriptor[] = {
* USB_STRING_DESCRIPTOR_HEADER(6),
* 'S', 'e', 'r', 'i', 'a', 'l'
* };
*/
#define USB_CFG_DESCR_PROPS_DEVICE 0
#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
#define USB_CFG_DESCR_PROPS_STRINGS 0
#define USB_CFG_DESCR_PROPS_STRING_0 0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_HID 0
#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
#define USB_CFG_DESCR_PROPS_UNKNOWN 0
#define usbMsgPtr_t unsigned short
/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
* a scalar type here because gcc generates slightly shorter code for scalar
* arithmetics than for pointer arithmetics. Remove this define for backward
* type compatibility or define it to an 8 bit type if you use data in RAM only
* and all RAM is below 256 bytes (tiny memory model in IAR CC).
*/
/* ----------------------- Optional MCU Description ------------------------ */
/* The following configurations have working defaults in usbdrv.h. You
* usually don't need to set them explicitly. Only if you want to run
* the driver on a device which is not yet supported or with a compiler
* which is not fully supported (such as IAR C) or if you use a differnt
* interrupt than INT0, you may have to define some of these.
*/
/* #define USB_INTR_CFG MCUCR */
/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE GIMSK */
/* #define USB_INTR_ENABLE_BIT INT0 */
/* #define USB_INTR_PENDING GIFR */
/* #define USB_INTR_PENDING_BIT INTF0 */
/* #define USB_INTR_VECTOR INT0_vect */
/* Set INT1 for D- falling edge to count SOF */
/* #define USB_INTR_CFG EICRA */
#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE EIMSK */
#define USB_INTR_ENABLE_BIT INT1
/* #define USB_INTR_PENDING EIFR */
#define USB_INTR_PENDING_BIT INTF1
#define USB_INTR_VECTOR INT1_vect
#endif /* __usbconfig_h_included__ */

View File

@@ -0,0 +1,31 @@
#include "chimera_ortho.h"
void uart_init(void) {
SERIAL_UART_INIT();
}
void led_init(void) {
DDRD |= (1<<1);
PORTD |= (1<<1);
DDRF |= (1<<4) | (1<<5);
PORTF |= (1<<4) | (1<<5);
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
uart_init();
led_init();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
void led_set_kb(uint8_t usb_led) {
}

View File

@@ -0,0 +1,66 @@
#ifndef CHIMERA_ORTHO_H
#define CHIMERA_ORTHO_H
#include "quantum.h"
#include "matrix.h"
#include "backlight.h"
#include <stddef.h>
#define red_led_off PORTF |= (1<<5)
#define red_led_on PORTF &= ~(1<<5)
#define blu_led_off PORTF |= (1<<4)
#define blu_led_on PORTF &= ~(1<<4)
#define grn_led_off PORTD |= (1<<1)
#define grn_led_on PORTD &= ~(1<<1)
#define set_led_off red_led_off; grn_led_off; blu_led_off
#define set_led_red red_led_on; grn_led_off; blu_led_off
#define set_led_blue red_led_off; grn_led_off; blu_led_on
#define set_led_green red_led_off; grn_led_on; blu_led_off
#define set_led_yellow red_led_on; grn_led_on; blu_led_off
#define set_led_magenta red_led_on; grn_led_off; blu_led_on
#define set_led_cyan red_led_off; grn_led_on; blu_led_on
#define set_led_white red_led_on; grn_led_on; blu_led_on
/*
#define LED_B 5
#define LED_R 6
#define LED_G 7
#define all_leds_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
#define red_led_on PORTF |= (1<<LED_R)
#define red_led_off PORTF &= ~(1<<LED_R)
#define grn_led_on PORTF |= (1<<LED_G)
#define grn_led_off PORTF &= ~(1<<LED_G)
#define blu_led_on PORTF |= (1<<LED_B)
#define blu_led_off PORTF &= ~(1<<LED_B)
#define set_led_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G)
#define set_led_red PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_G) | (1<<LED_R)
#define set_led_blue PORTF = PORTF & ~(1<<LED_G) & ~(1<<LED_R) | (1<<LED_B)
#define set_led_green PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_R) | (1<<LED_G)
#define set_led_yellow PORTF = PORTF & ~(1<<LED_B) | (1<<LED_R) | (1<<LED_G)
#define set_led_magenta PORTF = PORTF & ~(1<<LED_G) | (1<<LED_R) | (1<<LED_B)
#define set_led_cyan PORTF = PORTF & ~(1<<LED_R) | (1<<LED_B) | (1<<LED_G)
#define set_led_white PORTF |= (1<<LED_B) | (1<<LED_R) | (1<<LED_G)
*/
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13, \
k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, \
k28, k29, k31, k32, k33, k34, k35, k36, k37, k38, k41, k42, k43, k44,\
k45, k46, k47, k48 \
) \
{ \
{ KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k08, KC_##k09, KC_##k10, KC_##k11, KC_##k12 }, \
{ KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26 }, \
{ KC_##k29, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k37, KC_##k38, KC_##k41, KC_##k42, KC_##k43 }, \
{ KC_NO, KC_##k06, KC_##k20, KC_##k35, KC_##k46, KC_##k47, KC_##k36, KC_##k21, KC_##k07, KC_NO }, \
{ KC_NO, KC_##k28, KC_##k14, KC_##k00, KC_##k45, KC_##k48, KC_##k13, KC_##k27, KC_##k44, KC_NO }, \
}
#endif

View File

@@ -0,0 +1,87 @@
/*
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 unknown
#define PRODUCT Chimera Ortho
#define DESCRIPTION q.m.k. keyboard firmware for Chimera Ortho
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 10
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
//#define BACKLIGHT_LEVELS 3
#define ONESHOT_TIMEOUT 500
/* 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.
*/
#define PREVENT_STUCK_MODIFIERS
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
//UART settings for communication with the RF microcontroller
#define SERIAL_UART_BAUD 1000000
#define SERIAL_UART_DATA UDR1
#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
#define SERIAL_UART_INIT() do { \
/* baud rate */ \
UBRR1L = SERIAL_UART_UBRR; \
/* baud rate */ \
UBRR1H = SERIAL_UART_UBRR >> 8; \
/* enable TX and RX */ \
UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
/* 8-bit data */ \
UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
} while(0)
#endif

View File

@@ -0,0 +1,193 @@
// 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 "chimera_ortho.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
enum chimera_ortho_layers
{
_QWERTY,
_CAPS,
_NUMPAD,
_SYMBOLS,
_MACROS,
_NAV
};
#define KC_NMPD TG(_NUMPAD)
#define KC_SYMB TG(_SYMBOLS)
#define KC_SPFN LT(_NAV,KC_EQL)
#define KC_SCTL MT(MOD_LCTL, KC_LBRC)
#define KC_SCTR MT(MOD_LCTL, KC_RBRC)
#define KC_SPLT MT(MOD_LALT, KC_MINS)
#define KC_SPRT MT(MOD_LALT, KC_1)
#define KC_GBRC MT(MOD_RGUI, KC_8)
#define KC_GQOT MT(MOD_LGUI, KC_QUOT)
#define KC_MESC LT(_MACROS, KC_ESC)
#define KC_INCL M(0)
#define KC_PULL M(1)
#define KC_PUSH M(2)
#define KC_SCAP M(3)
#define KC_SCOF M(4)
#define KC_CAD LALT(LCTL(KC_DEL))
#define LONGPRESS_DELAY 150
//#define LAYER_TOGGLE_DELAY 300
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define KC_ KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
MESC, Q , W , E , R , T ,SCTL, SCTR, Y , U , I , O , P ,QUOT,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
TAB , A , S , D , F , G ,SPLT, SPRT, H , J , K , L ,SCLN,ENT ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
LSPO, Z , X , C , V , B ,SPFN, GBRC, N , M ,COMM,DOT ,SLSH,RSPC,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
NMPD,BSPC, SPC ,SYMB
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_CAPS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , , , , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , ,UNDS, , , , , ,COLN, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
SCOF, , , , , , , , , , , , ,SCOF,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_NUMPAD] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, ,COLN , , , , , , , 7 , 8 , 9 ,ASTR,MINS,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, ,DOT , , , , , , , 4 , 5 , 6 ,PLUS, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , , 1 , 2 , 3 ,SLSH, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , 0
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_SYMBOLS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
,EXLM, AT ,HASH,DLR ,PERC, , ,CIRC,AMPR,ASTR,LPRN,RPRN,BSLS,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, F1 , F2 , F3 , F4 , F5 , , ,TILD,COLN,UNDS,LCBR,RCBR, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, F6 , F7 , F8 , F9 ,F10 , , ,GRV ,SCLN,MINS,LBRC,RBRC, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
PIPE, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_NAV] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , , UP , ,PSCR, ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , ,LEFT,DOWN,RGHT, , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , , , , , , , ,PGUP,PGDN, , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
,DEL , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
),
[_MACROS] = KEYMAP(
//,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
, , , , , , , , , ,INCL, , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,CAD , , , , , , , , , , ,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
SCAP, , , , , , , , , ,PULL,PUSH, ,SCAP,
//|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
, , ,
// \------------------+----+----+---/ \---+----+----+-------------------/
)
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
/* include some kind of library or header */
case 0:
if (record->event.pressed) {
SEND_STRING("#include <>");
return MACRO( T(LEFT), END);
}
break;
case 1:
if (record->event.pressed) {
SEND_STRING("git pull");
return MACRO( T(ENT), END );
}
break;
case 2:
if (record->event.pressed){
SEND_STRING("git push");
return MACRO( T(ENT), END );
}
break;
case 3:
if (record->event.pressed){
layer_on(_CAPS);
register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK);
}
break;
case 4:
if (record->event.pressed){
layer_off(_CAPS);
register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK);
}
break;
}
return MACRO_NONE;
};
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
switch (layer) {
case _QWERTY:
set_led_green;
break;
case _CAPS:
set_led_white;
break;
case _NUMPAD:
set_led_blue;
break;
case _SYMBOLS:
set_led_red;
break;
case _NAV:
set_led_magenta;
break;
case _MACROS:
set_led_cyan;
break;
default:
set_led_green;
break;
}
};

View File

@@ -0,0 +1,164 @@
/*
Copyright 2012 Jun Wako
Copyright 2014 Jack Humbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#if defined(__AVR__)
#include <avr/io.h>
#endif
#include "wait.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "timer.h"
#if (MATRIX_COLS <= 8)
# define print_matrix_header() print("\nr/c 01234567\n")
# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
# define matrix_bitpop(i) bitpop(matrix[i])
# define ROW_SHIFTER ((uint8_t)1)
#elif (MATRIX_COLS <= 16)
# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
# define matrix_bitpop(i) bitpop16(matrix[i])
# define ROW_SHIFTER ((uint16_t)1)
#elif (MATRIX_COLS <= 32)
# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
# define matrix_bitpop(i) bitpop32(matrix[i])
# define ROW_SHIFTER ((uint32_t)1)
#endif
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
__attribute__ ((weak))
void matrix_init_quantum(void) {
matrix_init_kb();
}
__attribute__ ((weak))
void matrix_scan_quantum(void) {
matrix_scan_kb();
}
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
inline
uint8_t matrix_rows(void) {
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
void matrix_init(void) {
matrix_init_quantum();
}
uint8_t matrix_scan(void)
{
SERIAL_UART_INIT();
uint32_t timeout = 0;
//the s character requests the RF slave to send the matrix
SERIAL_UART_DATA = 's';
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
//there are 10 bytes corresponding to 10 columns, and an end byte
for (uint8_t i = 0; i < 11; i++) {
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
while(!SERIAL_UART_RXD_PRESENT){
timeout++;
if (timeout > 10000){
break;
}
}
uart_data[i] = SERIAL_UART_DATA;
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
if (uart_data[10] == 0xE0)
{
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
}
}
matrix_scan_quantum();
return 1;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print_matrix_header();
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
print_matrix_row(row);
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += matrix_bitpop(i);
}
return count;
}

View File

@@ -0,0 +1,19 @@
# Chimera Ortho
![Chimera Ortho](https://imgur.com/pbdNsoP.jpg)
A split wireless 40% ortholinear keyboard
Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle)
Hardware Supported: Chimera Ortho PCB, WaveShare core nRF51822
Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ortho/gerbers)
Make example for this keyboard (after setting up your build environment):
make chimera_ortho:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

View File

@@ -0,0 +1,78 @@
OPT_DEFS += -DCHIMERA_ORTHO_PROMICRO
OPT_DEFS += -DCATERINA_BOOTLOADER
CHIMERA_ORTHO_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
# # 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
# 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 # Remote matrix from the wireless bridge
# 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/ttyACM0

View File

@@ -1,4 +1,4 @@
#include "clueboard_17.h"
#include "17.h"
int pwm_level;

View File

@@ -1,4 +1,4 @@
#include "clueboard_17.h"
#include "17.h"
#include "backlight.h"

View File

@@ -1,15 +1,16 @@
# Cluepad
# Clueboard 17% (Formerly Cluepad)
![Cluepad](https://static1.squarespace.com/static/55c13bdee4b099be5dcb82eb/5842fbdce3df28eae5ec557e/5844fb2cb8a79bbdfd63bad1/1498501250178/IMGP3931.jpg?format=750w)
![Clueboard 17%](https://static1.squarespace.com/static/55c13bdee4b099be5dcb82eb/5842fbdce3df28eae5ec557e/5844fb2cb8a79bbdfd63bad1/1498501250178/IMGP3931.jpg?format=750w)
A basic 17 key numpad PCB.
* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
* Hardware Supported: Cluepad PCB 1.0
* Hardware Supported:
* Cluepad PCB 1.0
* Hardware Availability: [clueboard.co](https://clueboard.co/)
Make example for this keyboard (after setting up your build environment):
make clueboard_17:default
make clueboard/17:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.

View File

@@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "clueboard_60.h"
#include "60.h"
void matrix_init_kb(void) {

Some files were not shown because too many files have changed in this diff Show More