Compare commits

...

340 Commits

Author SHA1 Message Date
Casper Weiss Bang
13fff52f6b fixed problem with implicit declaration in quantum/rgblight.c (#8406)
* Update tmk_core/common/progmem.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/rgblight.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* fixed problem with implicit declaration in quantum/rgblight.c (#8381)

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-28 23:35:11 +00:00
stanrc85
7bf9d9dc0a [keymap] Add Alice keymap and to userspace files (#8571)
* convert my 60 keymap to alice

* add via to rules for alice

* remove split backspace and add backlight keycodes

* disable LTO for alice pcb

* keymap alignment formatting
2020-03-28 03:57:27 +00:00
Ryan
14079ce698 V-USB: Use structs for USB descriptors (#8572)
* V-USB: Use structs for USB descriptors

* Update usbconfigs

* cformat pass
2020-03-28 13:02:25 +11:00
Ryan
05d9a0ff03 Fix inverted backlight for XD60 (#8575) 2020-03-27 11:00:13 +00:00
MechMerlin
b9d0b1f064 [Keyboard] MountainBlocks MB17 (#8554)
* initial commit

* preliminary support for mb17 using the qmk default keymap

* add the VIA keymap

* add qmk configurator support

* code cleanups before submission

* Update keyboards/mountainblocks/mb17/rules.mk

* Update keyboards/mountainblocks/mb17/info.json

* remove file
2020-03-26 17:54:06 -07:00
Drashna Jaelre
ed80874f72 Fix IT_APOS backward compatibility define in keymap_italian.h (#8565)
* Fix IT_APOS backward compatibility define in keymap_italian.h

Found by ZSA.
2020-03-27 09:44:06 +11:00
Joel Challis
23e942ae4e Enable SLEEP_LED on ATmega32A (#8531)
* Port over some AVR backlight logic to SLEEP_LED

* Port over some AVR backlight logic to SLEEP_LED - add timer 3

* Port over some AVR backlight logic to SLEEP_LED - clang format

* Enable SLEEP_LED within vusb protocol
2020-03-26 18:21:33 +00:00
Jakub Darowski
c077300e19 [Keymap] BM16a stock layout (#8547)
* Stock layout

* Added the default readme

* Update keyboards/bm16a/keymaps/stock/keymap.c

Removed trailing backslashes from layouts

* Removed redundant files, renamed stock keymap and changed readme
2020-03-26 11:03:37 -07:00
fauxpark
11f12d386b Fix wrong python-pip package for MSYS setup instructions 2020-03-26 07:50:22 -07:00
Ryan
4d76d85d7b V-USB: Use manufacturer and product strings from config.h (#7797)
* V-USB: Use manufacturer and product strings from config.h

* Update board configs
2020-03-26 13:11:32 +00:00
Ryan
981ea87b05 Add Estonian keymap (#8527) 2020-03-26 16:51:07 +11:00
Ryan
65252ebf67 Add Croatian keymap (#8525)
* Add Croatian keymap

* Fix comment on HR_DIAE
2020-03-26 16:50:39 +11:00
Takeshi ISHII
5bd0a5a585 [Docs] added the description of the reading order of the config.h files. (#8545)
* added the description of the reading order of the config.h files.

* Update docs/hardware_keyboard_guidelines.md

* Update docs/hardware_keyboard_guidelines.md

* Added a description of post_config.h.

* sample bug fix

* sample update

* Update docs/hardware_keyboard_guidelines.md

* Update docs/hardware_keyboard_guidelines.md

* update docs/hardware_keyboard_guidelines.md

* Update docs/hardware_keyboard_guidelines.md
2020-03-25 21:13:16 -07:00
QMK Bot
9fbf17b90e format code according to conventions [skip ci] 2020-03-26 03:10:16 +00:00
foxx1337
96bfce7000 Add RawHID support to ATSAM (Massdrop boards) (#8530)
* Add support for RAW endpoint for arm_atsam

This the excellent work from helluvamatt/qmk_firmware in bb6eeb93b.

* Reformat arm_atsam RAW endpoint code

Co-authored-by: Matt Schneeberger <helluvamatt@gmail.com>
2020-03-26 02:34:57 +00:00
Álvaro A. Volpato
d68c4d8106 Add KeebsPCB pre-Alpha support (#8485)
* Add initial KeebsPCB support

* Update readme

* Update readme

* Correct readme typo

* Update keyboards/acheron/keebspcb/config.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Apply @noroadsleft suggestions from code review

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/acheron/keebspcb/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/acheron/keebspcb/keymaps/default/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: Gondolindrim <alvaro.augusto.volpato@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-26 02:22:08 +00:00
tominabox1
9fb988b6e8 Add _33 Keyboard folder (#8543)
* Add _33 Keyboard folder

* Correcting naming convetions and other code convetions

* Removed extra spaces

* fixed layout callbacks to new lower-case versions

* Remove tapping_term, fix RGB pin define. Added blank readme-to be updated.

* initial addition of the readme.md

* Update readme.md for hardware/pcb availability info

* Adding keymap readme

* Info.json added

* Incorporate Drashna's recommended changes
2020-03-26 01:53:40 +00:00
elmo-space
016d417253 add ansi with blocker layout and keymap for KBD67 rev2 PCB (#8538)
* add new layout for 65% with blocker and add matching keymap

the rev2 pcb gets used in the kbd67 which has a blocker between the left arrow key and the right ctrl key. this layout is missing so far even though it's probably the most used one for this board.

* add split backspace layout with blocker

* change keycode for backslash

* update rules.mk and add missing layouts in info.json

* Update keyboards/kbdfans/kbd67/rev2/rules.mk

Co-Authored-By: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-03-25 14:51:05 -07:00
2Moons-JP
de58b07659 Slice Keyboard (#8464)
* Adding Slice Keyboard

* Update keyboards/basekeys/slice/rev1/config.h

Co-Authored-By: Erovia <Erovia@users.noreply.github.com>

* Update config.h

* Update keyboards/basekeys/slice/slice.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/slice.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update and rename rev1.c to rev1_rgb.c

* Rename rev1.h to rev1_rgb.h

* Update keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/slice_font.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/slice_font.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/_font.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/_font.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* slice_font location

* Update config.h

* Delete slice_font.c

* Update config.h

* Update keyboards/basekeys/slice/rev1/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1_rgb/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/rev1_rgb/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/rev1_rgb/keymaps/2moons_rgb/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/rev1/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/rev1/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/keymaps/default_split_left_space/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/basekeys/slice/keymaps/default/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keymap.c

* oled rotation, config handedness

* OLED and LED functionality removed

* Update keyboards/basekeys/slice/keymaps/default/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update keyboards/basekeys/slice/keymaps/default/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update keyboards/basekeys/slice/keymaps/default/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update keymap.c

* Update keymap.c

* oled rotation, config handedness

* rev1 added EE_HANDS

* oled function name

* oled function name

* oled function name

* Update keyboards/basekeys/slice/rev1_rgb/rules.mk

Co-Authored-By: Joel Challis <git@zvecr.com>

* keymap changes

* Delete _font.c

* keymap changes, VID/PID

* Update keyboards/basekeys/slice/rev1/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/basekeys/slice/rev1_rgb/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* split_util.h used

Co-authored-by: Erovia <Erovia@users.noreply.github.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-03-25 10:25:10 +01:00
Joel Challis
6ceaae30f5 Run clang-format manually to fix recently changed files (#8552) 2020-03-25 14:39:53 +11:00
Drashna Jaelre
5075a1d9e4 [Docs] Update RGB Matrix docs with function refs (#8367)
* [Docs] Update RGB Matrix docs with function refs

* Fix up code samples

* suggestions by noroadsleft

* Fix small typo

Co-authored-by: James Young <xxiinophobia@yahoo.com>
2020-03-24 18:54:38 -07:00
くまお工房
3587e20e70 [Keyboard] Add kudox game rev2 (#8529)
* Add Kudox Game rev2.

* Add the keymap of Kudox Game a layer for regulating RGB.

* Modified rgblight_init when RGBLIGHT_ENABLE=no.

* Remove invalid codes.

* Modified *init* function right intention of framework.
2020-03-24 13:02:41 -07:00
shela
963bba1fc3 [Docs] Update Japanese translation of custom_quantum_functions.md (#8520) 2020-03-24 11:59:31 -07:00
shela
571a589cfa [Docs] Update Japanese translation of _summary.md (#8508)
* Update Japanese translation of _summary.md

* Update translation

* Update translation
2020-03-24 11:51:45 -07:00
shela
3c2d5599b9 [Docs] Update Japanese translation of README.md (#8507)
* Update Japanese translation of README.md

* Apply suggestions from code review

* Apply suggestions from code review

* Update translation

Co-authored-by: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
2020-03-24 01:05:08 -07:00
Hoàng Vương
3b05f25221 [Keymap] shadowprogr's personal keymap (#8497)
* Add personal keymap

* Add keymap readme.md

* Update keymap
2020-03-24 00:13:45 -07:00
shela
e05e671871 Update Japanese translation of flashing.md 2020-03-24 14:26:11 +09:00
shela
2d5b492550 Update Japanese translation of keymap.md 2020-03-24 14:24:19 +09:00
shela
ad8774d6fa Update Japanese translation of contributing.md 2020-03-24 14:19:25 +09:00
Ryan
297aad6ebd Set backlight and RGB pins for AVR onekeys (#8533)
* Set backlight and RGB pins for AVR onekeys

* Set pin for ADC as well

* Define ADC_PIN for F4 blackpills

* Use A0 for F4 ADCs

* Set ADC pins for F0 and F1
2020-03-24 03:32:23 +00:00
Olivier
8f69983c58 [Keymap] Minidox Bepo layout (#8515)
* [Keymap] Minidox Bepo layout

Todo :
Lower
Adjust
Update Lower E and Lower S on schema

* Added config.h

* Code review, update config.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: dolie <olivier.ghafari@pm.me>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-24 00:51:49 +00:00
horza21
b779078c60 [Keyboard] Add support for Southpaw Extended 65% (#8465)
* Add support for Southpaw Extended 65%

* Update keyboards/switchplate/southpaw_65/readme.md

* Update keyboards/switchplate/southpaw_65/readme.md

* Update keyboards/switchplate/southpaw_65/readme.md

* Update keyboards/switchplate/southpaw_65/southpaw_65.c

* Update keyboards/switchplate/southpaw_65/rules.mk

* Cleaned up keymaps
-Removed default2 keymap
-Removed default_iso2 keymap
-Rename default keymap directory to default_ansi to reflect correct keymap name

* Update readme.md for default_ansi keymap directory change

* Add layout_all for configurator and correct maximum number of keys supported in readme.md

* Update keyboards/switchplate/southpaw_65/info.json

Forgot to change name to LAYOUT_all

* Update keyboards/switchplate/southpaw_65/info.json

* Update keyboards/switchplate/southpaw_65/readme.md

* Update keyboards/switchplate/southpaw_65/rules.mk

* Add LAYOUT_all keymap

* Update keyboards/switchplate/southpaw_65/keymaps/default/keymap.c

* Update keyboards/switchplate/southpaw_65/info.json
2020-03-23 15:26:22 -07:00
Xelus22
b936048b0b [Keyboard] Snap96 Keyboard (#8416)
* snap96

* fix readme

* small fixes

* remove 4th layer

* moved via config to via folder

* remove suspend

* via  config.h

* kc_nubs

* remove kc_trns to define and remove layer 2

* remove merge conflicts

* remove define and add 3rd layer for VIA keymap

* fix comma

Co-authored-by: Xelus22 <preyas22@gmail.com>
2020-03-22 21:27:00 -07:00
spidey3
7e0dc5376f [Keymap] Add spidey3 keymap for 75_ansi, and a spidey3 userspace (#8470)
* First cut at Josh Diamond's KBD75 customizations.
Includes:
* My unique keymap with ChromeOS specific keys
* Use RGB underglow to indicate Caps Lock
* Some unicode bindings
* Some changes to make debugging easier

* Updated spidey3 to be applicable to all 75_ansi boards

* Sadly, ChromeOS doesn't pay attention to most consumer codes

* Add mac layer; fix flakeyness in CAPS_LOCK underglow.

* Make layers.json match the keymap (to the extent possible)

* Major cleanup; fix broken debug persistence

* Cleanup some whitespace issues

* Fix incorrect log message.

* Rework layer indication to user RGBLIGHT_LAYERS

* Update layouts/community/75_ansi/spidey3/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Rename users/spidey3/rgblight.c to layer_rgb.c per suggestion

* Refactor to use set_single_persistant_default_layer().

* Use dprint/f to make logging more elegant.

* Update users/spidey3/config.h

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update users/spidey3/config.h

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update layouts/community/75_ansi/spidey3/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update users/spidey3/spidey3.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update users/spidey3/layer_rgb.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update users/spidey3/init.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Changes from code review

Co-authored-by: Joshua Diamond <jdiamond@Deep-Thought.local>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-22 21:11:41 -07:00
Ryan
6d1af63842 Add Irish keymap (#8528) 2020-03-22 17:32:43 -07:00
Ryan
6c4a744a1b Add Czech keymap (#8526) 2020-03-22 17:31:19 -07:00
johannbl
f7722ef9ca [Keyboard] Added two new layouts for the cospad (#8502)
* creation

new numpad layout for 23 keys
creation of new keymap

* Update cospad.h

* Update info.json

* Update keymap.c

* Update keymap.c

Added a macro for the "00" key.

* added two new keymap. one for each new layout.

The new keymaps are based on the default keymap but focus on

* Update keyboards/cospad/cospad.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/cospad.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/numpad2/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/numpad2/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/numpad3/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keymap.c

layout name fix.

* Update keyboards/cospad/keymaps/johannbl/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/cospad/keymaps/johannbl/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Delete keymap.c

* Rename keyboards/cospad/keymaps/johannbl/numpad2/keymap.c to keyboards/cospad/keymaps/johannbl/split_plus_and_zero/keymap.c

* Rename keyboards/cospad/keymaps/johannbl/numpad3/keymap.c to keyboards/cospad/keymaps/johannbl/split_zero/keymap.c

* Rename keyboards/cospad/keymaps/johannbl/split_plus_and_zero/keymap.c to keyboards/cospad/keymaps/split_plus_and_zero/keymap.c

* Rename keyboards/cospad/keymaps/johannbl/split_zero/keymap.c to keyboards/cospad/keymaps/split_zero/keymap.c

* Update keyboards/cospad/keymaps/split_plus_and_zero/keymap.c

Co-Authored-By: Nick Brassel <nick@tzarc.org>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-03-22 17:28:11 -07:00
QMK Bot
76cb2b1160 format code according to conventions [skip ci] 2020-03-22 14:03:14 +00:00
Drashna Jaelre
5117dff6a2 Add Post Processing to process_record (#4892)
* Improve process_record system

Code based on @colinta's

* Rename and better handle functions

* Fix incorrect function call to process_record_user

* Add documentation for post_process_record

* Add both get_event_keycode and get_record_keycode functions

And add some comments about these functions

* Update code format

* Cleanup merge artifacts
2020-03-23 00:29:05 +11:00
Jeremy Bernhardt
e5d34fd084 Variable combo (#8120)
* keymap(gergo): colemak

* added flipped numbers

* add STENO_DISABLE_VIRTSER

* add STENO_DISABLE_VIRTSER

* Added GergoPlex and Faunchpad

* push retab

* push retab

* added variable option for combos

* removed accidental commit

* removed accidental commit

* More accidental deletions! (╯°□°)╯︵ ┻━┻

Co-authored-by: Damien Rajon <145502+pyrho@users.noreply.github.com>
2020-03-23 00:17:26 +11:00
brickbots
bfb2f8e0a8 Add Word Per Minute calculation feature (#8054)
* Add Word Per Minute calculation feature

* Fix copyright info

* Remove header from quantum.c, setup overloadable keycode inclusion for WPM, update docs

* Simplify logic for keycode filtering

* Adding link from summary to wpm_feature info

* Update docs/feature_wpm.md

Typo in function prototype example in docs

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Add WPM transport via i2c

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-23 00:06:16 +11:00
Joel Challis
d8f3c28a37 Align some ChibiOS build logic (#8461)
* Align some ChibiOS build logic

* infer more makefile logic

* Move bootloader logic to chibios file
2020-03-22 20:48:17 +11:00
Ryan
eef0cb2f90 Add US International keymap (#8493)
* Add US International keymap

* Add extra spacing to UK AltGr keycode comments
2020-03-22 20:45:27 +11:00
Ryan
63e4ad13c8 Add Icelandic keymap and sendstring LUT (#8494) 2020-03-22 20:16:24 +11:00
Ryan
f9e67338a4 Add Finnish keymap and sendstring LUT (#8495) 2020-03-22 19:52:54 +11:00
Joel Challis
5f9f62fb8c Reorder logic within common_features.mk (#8517)
* Reorder logic within common_features.mk

* Revert haptic logic

* Add back path to make tests happy

* Update common_features.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-22 19:34:23 +11:00
Ryan
147bc6ec43 Remove BOOTLOADER_SIZE stuff from template (#8516) 2020-03-22 08:50:37 +01:00
shela
bea62add55 [Docs] Trivial documentation fix (#8509)
* Trivial documentation fix

* fix

* fix

* fix translation
2020-03-22 13:53:58 +11:00
QMK Bot
d511e52c1f format code according to conventions [skip ci] 2020-03-21 23:44:27 +00:00
Joel Challis
789e199450 Add support for Bootmagic lite when using SPLIT_HAND_PIN (#8347)
* Add support for Bootmagic lite when using SPLIT_HAND_PIN

* Deduplicate bootmagic_lite logic from within via

* Revert location of defaults so that user overrides still work for now

* Tidy up code slightly
2020-03-21 23:10:39 +00:00
James Young
a747c1c3de FLX Lodestone: add ANSI and ISO layout data and keymaps (#8481)
* Lodestone: add ANSI and ISO layout data and keymaps

* rename layout macros

LAYOUT_ansi -> LAYOUT_65_ansi_blocker_split_bs
LAYOUT_iso -> LAYOUT_65_iso_blocker_split_bs

* use four-space indent on the new keymaps

* add 65_ansi_blocker and 65_iso_blocker layouts
2020-03-21 15:36:27 -07:00
James Young
a521fc2b6c [Docs] Fixes for feature_rgblight.md (#8514)
* remove extra comma that breaks the RGBLight Layers example

* linting

- use four spaces instead of tabs for indenting
- remove trailing spaces
2020-03-21 20:11:06 +00:00
James Young
8651eef298 Claw44 rev1 Configurator layout support (#8488) 2020-03-21 12:43:27 -07:00
Ryan
f4799481cd Fix formatting for report.h (#8512) 2020-03-22 06:19:01 +11:00
Wilba
675b153525 Fix build of Equinox (#8505)
* Remove rules.mk from equinox dir

* Add explicit rules.mk to rev0 and rev1 dirs
2020-03-21 10:34:23 -07:00
Drashna Jaelre
5df2424651 [Docs] Update layer documentation (#8371)
* [Docs] Update layer documentation

* Add layer_state_cmp functions

* Fix cut/copy/paste issue

* Add id tags

* Apply noroads corrections

* Move Layers section to separate document

* Fix ID tag for layers

* Use better name for summary/side bar

* Fix feature page linkage

As well as a small spell error close by

* Remove paper analogy for now
2020-03-21 10:17:02 -07:00
QMK Bot
f9c53ca71a format code according to conventions [skip ci] 2020-03-21 12:58:19 +00:00
Ryan
0d189582c1 Update newbs installation procedure for MSYS2 (#8423) 2020-03-21 19:00:44 +11:00
Takashi Shibusawa
c6b667623a [Keyboard] Palette1202 fix encoder rotate direction (#8489)
* revised hardware availability - URL

* fixed encoder rotate direction (reversed)
2020-03-20 23:22:08 -07:00
Joel Challis
d96380e654 Initial arm->chibios pass - simplify some platform logic (#8450) 2020-03-21 16:20:04 +11:00
Ryan
7e80686f1e Tidy up report.h (#8486)
* Tidy up report.h

* Add link to Review Request 41 for brightness controls
2020-03-21 16:19:15 +11:00
Ryan
e967471c4f Remove ACT_COMMAND (#8487)
* Remove ACT_COMMAND

* And from action_t as well
2020-03-21 16:17:43 +11:00
worldspawn00
eca3f9d935 fixing matrix layout (#8504) 2020-03-21 16:07:39 +11:00
Nick Snyder
44c62117ee Highlight .inc files as .c files (#8496) 2020-03-20 09:48:55 +01:00
Wilba
f235822fba Add VIA support to Leaf 60 (#8490) 2020-03-19 22:36:54 -07:00
Ryan
5d5ff807c6 Update JIS keymap and sendstring LUT (#8457) 2020-03-20 12:27:52 +11:00
Diego Song
1c7c5daad4 VIA Support for GH60 (#8442)
* VIA Support: GH60 Rev C and GH60 Satan

* Corrected GH60 VIA default keymap

* Corrected GH60 VIA default keymap pt 2

* Copied default keymap over via default keymap

* Satan GH60 default corrected for VIA

* Satan GH60 default corrected for VIA pt 2

* Satan GH60 LTO enable for size

* Transparent 4th dynamic layer for GH60 Via support

* Update keyboards/gh60/revc/info.json

* Update keyboards/gh60/satan/info.json

* Update keyboards/gh60/satan/info.json

* Removed deprecated JSON keys gh60/revc/info.json

* Removed inline comment next to VID for GH60 Satan
2020-03-19 16:33:13 -07:00
tw1t611
aeab11da88 Add tw1t611 ergodash keymap. (#8377)
* Add tw1t611 ergodash keymap.

* Fix keycodes. Change kc_rctl to kcb rsft.

* Change block to enum layers.

* Remove blackslahs.

* Remove last slash. Align row.

* Use new german keymap.

* Fix typo.

Co-authored-by: Daniel Schindler <client55@protonmail.com>
2020-03-19 14:08:36 +11:00
jotix
b53934805a Jotix (#8480)
* jotix ortho_4x12 layout

* jotix ortho_4x12 layout

* jotix ortho_4x12 layout

Co-authored-by: jotix <jotix@jotix-pc.localdomain>
2020-03-19 13:32:30 +11:00
Ryan
6bfbdc30ca Fix missing deprecated keycodes for keymap_swedish (#8483) 2020-03-19 02:13:05 +00:00
MechMerlin
02eb949479 VIA Support: PDXKBC Macropad (#8431)
* add via support for pdxkbc macropad

* add VIA support for the pdxkbc

* clean out some commented code

* remove unused files

* comment the vendor ID

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/pdxkbc/keymaps/via/keymap.c

Co-Authored-By: Joel Challis <git@zvecr.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2020-03-19 01:46:52 +00:00
Ryan
3a0f11eb27 Set MCU for some F103 boards (#8459) 2020-03-19 01:33:17 +00:00
James Young
c2013f0b7c Allow RGBLIGHT_ANIMATIONS to work on keebio/iris configurator builds (#8482)
* Allow RGBLIGHT_ANIMATIONS to work on keebio/iris configurator builds

* Also align rules.mk
2020-03-18 18:13:34 -07:00
TerryMathews
19d7cbc858 M0lly: refactor OLED support and qmk-dfu bootloader (#8475) 2020-03-19 01:13:12 +00:00
Ryan Miguel
73f903906e VIA support for projectkb/alice (#8474)
* Create rules.mk

Added rules.mk in keymaps/via

* Update rules.mk

Added new line at the end of the file

* Create via\keymap.c

Added keymap.c inside the via directory

* Update config.h in projectkb/alice

Defined VIA eeprom layout size to 2 bits to allow for 4 layout options
2020-03-19 01:10:28 +00:00
zvecr
d235612e48 Also align rules.mk 2020-03-19 00:57:02 +00:00
zvecr
6ad3328b83 Allow RGBLIGHT_ANIMATIONS to work on keebio/iris configurator builds 2020-03-19 00:43:20 +00:00
Flexerm
13d736d6ab [Keyboard] FLX Lodestone (#8451)
* Add Lodestone PCB

Working Firmware for Lodestone PCB tested on physical PCB prototypes.

* Update keyboards/flx/lodestone/lodestone.c

* Update keyboards/flx/lodestone/keymaps/default/config.h

* Update keyboards/flx/lodestone/rules.mk

* Update keyboards/flx/lodestone/readme.md

* Delete config.h

* Update keyboards/flx/lodestone/info.json

Suggested by noroadsleft

* Update keyboards/flx/lodestone/info.json

* Update keyboards/flx/lodestone/info.json

Changed maintainer name as suggested.

* Update keyboards/flx/lodestone/keymaps/default/readme.md

* Update keyboards/flx/lodestone/info.json

* Update keyboards/flx/lodestone/rules.mk

Changed Link_Time_Optimization to LTO didn't know this was a thing :)

* Update keyboards/flx/lodestone/keymaps/default/keymap.c

Removed 2 unessisary layers from the default map.

* Update keyboards/flx/lodestone/readme.md

* Update keyboards/flx/lodestone/info.json

* Changed from LAYOUT to LAYOUT_all

AS suggested by noroadsleft, changed 4 files to match, and re-testeed on my hardware to confirm working.

* Update keyboards/flx/lodestone/config.h

Cleaned up Manu, Product and Descriptor as suggested.

* Update keyboards/flx/lodestone/readme.md
2020-03-18 12:56:22 -07:00
QMK Bot
0b810bdff3 format code according to conventions [skip ci] 2020-03-18 19:12:13 +00:00
yohewi
3f19117124 [Keyboard] uranuma (#8343)
* uranuma

* Update keyboards/uranuma/keymaps/default/keymap.c

* Update keyboards/uranuma/rules.mk

* Update keyboards/uranuma/keymaps/default/keymap.c

* Update keyboards/uranuma/keymaps/default/keymap.c

* Update keyboards/uranuma/keymaps/default/keymap.c

* Update keyboards/uranuma/uranuma.h

* Update keyboards/uranuma/keymaps/default/keymap.c

* Update keyboards/uranuma/keymaps/default/keymap.c

* 20200316change
2020-03-18 12:09:53 -07:00
TerryMathews
fe3e5cba69 [Keyboard] Wheatfield Blocked65% (#8339)
* Initial support for Wheatfield Blocked65%

* Update keyboards/wheatfield/blocked65/blocked65.c

* Update keyboards/wheatfield/blocked65/blocked65.h

* Update keyboards/wheatfield/blocked65/blocked65.h

* Update keyboards/wheatfield/blocked65/info.json

* Update keyboards/wheatfield/blocked65/info.json

* Update keyboards/wheatfield/blocked65/keymaps/default/keymap.c

* Update keyboards/wheatfield/blocked65/keymaps/default/keymap.c

* Update keyboards/wheatfield/blocked65/readme.md

* Update keyboards/wheatfield/blocked65/readme.md

* Update keyboards/wheatfield/blocked65/rules.mk

* Update keyboards/wheatfield/blocked65/keymaps/default/keymap.c
2020-03-18 11:43:25 -07:00
Takeshi ISHII
6ba383cc5f [Docs] Japanese translation of docs/custom_matrix.md (#8463)
* add docs/ja/custom_matrix.md

* add original document TAG

* update ja/custom_matrix.md

* 「マトリクス」to 「マトリックス」

* docs/ja/custom_matrix.md:update section title

* update docs/ja/custom_matrix.md

* update docs/ja/custom_matrix.md
2020-03-18 11:37:59 -07:00
Derek
d44ca60cb0 [Keyboard] Splitreus62 (#8383)
* added splitreus62

* fixed rules.mk

* Update keymap.c

* Updated RGBLIGHT_ENABLE

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Updated NKRO

* added splitreus62

* fixed rules.mk

* Update keymap.c

* Updated RGBLIGHT_ENABLE

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Update readme.md

* Updated NKRO

* Update config.h

* Update keyboards/splitreus62/rules.mk

* Update keyboards/splitreus62/splitreus62.c

* Update keyboards/splitreus62/splitreus62.h

* Update keyboards/splitreus62/readme.md

* Update keyboards/splitreus62/rules.mk

* Update config.h

* Update keyboards/splitreus62/readme.md

* Update keyboards/splitreus62/rules.mk

* Update keyboards/splitreus62/splitreus62.h

* Update keyboards/splitreus62/keymaps/default/keymap.c

* Update keyboards/splitreus62/readme.md
2020-03-18 11:36:22 -07:00
Naoto Takai
42b0e95ae6 [Keymap] Update default keymap for Choco60 (#8453)
* Update default keymap for Choco60

* Update keyboards/choco60/keymaps/default/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-18 11:16:15 -07:00
Joel Challis
b6316c5024 [Keymap] I2C scanner (#8454)
* Add i2c scanner keymap

* Add bodge for chibios

* Fix readme title

* make chibios bodge a little cleaner

* fix typo in readme
2020-03-18 11:14:45 -07:00
Ryan
fc4ef6934d Update Programmer Dvorak keymap and add sendstring LUT (#8456)
* Update Programmer Dvorak keymap and add sendstring LUT

* Include quantum.h
2020-03-18 11:11:57 -07:00
Brandon Schlack
0dff26b550 [Keyboard] Add more community layout support to Polaris (#8468)
- Add 60_ansi, 60_ansi_split_bs_rshift layouts
2020-03-18 10:45:13 -07:00
Wilba
76d8558b1a VIA support for TKC1800 (#8178)
* VIA support for TKC1800

* Fixed VENDOR_ID
2020-03-18 10:28:13 -07:00
Erovia
8123dd2649 CLI: Hide json-keymap subcommand, as it's been deprecated. 2020-03-18 10:17:23 -07:00
Frederick Hirsch
1ec648932f [Keymap] Add the fsck layout for iris (#8473) 2020-03-18 09:48:00 -07:00
Alfred Maler
427f7b3a39 [Userspace] alfrdmalr: swap # and @ symbols (#8469) 2020-03-17 21:44:55 -07:00
Ryan
c670240503 Update UK keymap and sendstring LUT (#8458) 2020-03-17 17:09:12 -07:00
Jann-Niklas Zimmermann
59d6b0faab [Keymap] Corodiak's Kyria (#8444)
* Add kyria keymap

* Delete wrong readme.md

* Move layer keys

* Refine keymap

* Clean up

* Add comment

* Improve OS depending macros

* Update keymap overview

* Add review suggestions
2020-03-17 16:57:53 -07:00
Frei
6f55aa993a [docs] Note the need to flash both sides for rgb layers. (#8467)
Update feature_rgblight.md to note that for split dual-mcu boards, 
both sides must be flash to get the new value of the rgblight_layers.

https://github.com/qmk/qmk_firmware/pull/7768#issuecomment-600237611
2020-03-17 23:43:04 +00:00
Joel Challis
e34764502f Remove qmk archive generation (#8462) 2020-03-17 21:28:13 +00:00
Jon Roberts
8b0efc2124 [Keymap] New Massdrop ALT keymap for emptyflask (#8460)
amended to remove a couple of unnecessary lines,
thanks to @zvecr and @fauxpark
2020-03-17 21:01:54 +00:00
Umberto Baldi
2f936420dd [Keyboard] Add sick68 keyboard (#8400)
* add sick68 keyboard

* relocate to keyboards/handwired/sick68

* Apply suggestions from code review

* delete config.h because was emply

* Apply suggestions from code review
2020-03-17 13:51:47 -07:00
Erovia
6698af9c3d Fix Dimple VIA keymap (#8466) 2020-03-17 17:04:03 +01:00
Erovia
61da615308 Add VIA support for LazyDesigners Dimple. (#8447)
* Assign unique VID to LazyDesigners' boards

* Add VIA support for LazyDesigners Dimple

* Apply @fauxpark's suggestions

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-17 15:34:37 +01:00
QMK Bot
ece14278ef format code according to conventions [skip ci] 2020-03-17 01:02:01 +00:00
Joel Challis
567bfc97ac ARM - ADC cleanup (#8385)
* Update switch to array to allow custom values

* Add adc keymap

* update docs to reflect alignment of default 10 bit

* start conversion to USE_ADCVn

* samplerate is hella wrong...stub out for now

* basic f1 and f4 functionality

* Tidy up current changes

* Restore old pinToMux function

* Add back sample rate for supported platforms

* F0 compile fixes

* wordsmithery

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Remove reference to avr only function

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-17 00:29:52 +00:00
Ryan
7aff643031 Update Italian keymap and add sendstring LUT (#8438) 2020-03-16 14:32:48 +00:00
Ryan
7fe4097792 Update German keymap and sendstring LUT (#8437) 2020-03-16 14:31:48 +00:00
Ryan
652f4492d3 Update French keymap and sendstring LUT (#8436) 2020-03-16 14:30:57 +00:00
Ryan
910c466cfe Update Brazilian keymap and add sendstring LUT (#8435) 2020-03-16 14:30:17 +00:00
Joel Challis
19dbcf3814 Document 'make all:<name>' (#8439)
* Document 'make all:<name>'

* add cli docs

* Apply suggestions from code review

Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>

Co-authored-by: skullydazed <skullydazed@users.noreply.github.com>
2020-03-16 14:27:19 +00:00
QMK Bot
c89012566c format code according to conventions [skip ci] 2020-03-16 10:01:22 +00:00
Takeshi ISHII
9dfebb9d67 Remove unnecessary import of rgblight.h in tmk_core/protocol/*/*.c (#8432)
* Remove unnecessary import of rgblight.h in tmk_core/protocol/*/*.c

 * tmk_core/protocol/chibios/main.c
 * tmk_core/protocol/lufa/lufa.c

see #8380 for tmk_core/protocol/vusb/main.c.

* Remove '#include "rgblight.h"' from tmk_core/protocol/vusb/main.c.
2020-03-16 10:26:32 +01:00
coseyfannitutti
2a31fbf9a6 [Keyboard] Add the Romeo keyboard (#8434)
* Add Keyboard - Romeo

* Update rules.mk

* Update readme.md

* Update keyboards/coseyfannitutti/romeo/readme.md

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/coseyfannitutti/romeo/romeo.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/coseyfannitutti/romeo/keymaps/default/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/keymaps/default/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/readme.md

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/usbconfig.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/usbconfig.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/coseyfannitutti/romeo/usbconfig.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-15 21:46:48 -07:00
Yann Hodique
cce2420bb2 [Keymap] fix sigma keymaps build (#8427)
handle unicode input properly.
2020-03-15 21:42:10 -07:00
James Young
b272c035ba [Docs] Random Fixes (#8340)
* fix CLI section links in the Summary

* fix heading in Pointing Device doc

* fix headings in PS/2 Mouse Support doc

* add explicit section ids to I2C Master Driver doc

* reformat GPIO Controls table

Much like the I2C Master Driver doc, I found this a bit less than ideal to read. (The table was actually wider than the space available for it.)

Reformatted so each GPIO function is an H3 heading, followed by a paragraph and a table of each architecture's old-style function.

* migrate changes from I2C Master Driver doc to Japanese translation

* add explicit anchors to I2C Master Driver docs

* fix code block language markers

The language markers are case-sensitive; using the wrong case means the syntax highlighting doesn't work.

Good: ```c
Bad: ```C

* restore Japanese I2C Master Driver doc to current master

Can't update the internal tracking references accurately until the changes to the English doc are committed to master.

* add explicit anchors to edited files

* change ChibiOS/ARM to ARM/ChibiOS

Because ARM/ATSAM is also a thing that exists.

* fix code block language markers again

Used the wrong markers in a few spots. Also these are apparently always supposed to be lowercase.

* add section anchors to cli.md

* restore table formatting on GPIO Control doc

* remove changes to _summary.md
2020-03-15 20:29:11 -07:00
Ryan
5f1f370463 Update Belgian keymap and sendstring LUT (#8349) 2020-03-16 07:41:34 +11:00
Ryan
49a2fbea0c Update Slovenian keymap and add sendstring LUT (#8350) 2020-03-16 07:40:54 +11:00
Ryan
4b1430fd09 Update Norman keymap and sendstring LUT (#8404) 2020-03-16 07:38:05 +11:00
Ryan
f1c6fa3895 Update Plover keymap (#8405) 2020-03-16 07:37:32 +11:00
jotix
fe1a055391 [Keymap] Update ortho 4x12 jotix layout (#8425)
* ortho 4x12 jotix layout

* jotix ortho_4x12 layout
2020-03-15 17:16:30 +00:00
Ryan
c18b51e68e msys2_install.sh: wrap requirements.txt in quotes (#8424) 2020-03-15 17:15:42 +00:00
skullydazed
dc68418660 Fix some broken links in the docs (#8394)
* fix some broken links

* remove duplicate and confusing material from cli.md

* Switch brazil to the 2 letter country code

* Update docs/_langs.md

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-15 07:48:44 -07:00
brickbots
499d7c8ce6 [Docs] Update to I2C docs: Clarify address expectation and return values (#8413)
* Clarifying docs for i2c

* Fix typo

* Fix up punctuation

* Implementing great suggestions

* Update docs/i2c_driver.md

* Update docs/i2c_driver.md
2020-03-15 00:17:48 -07:00
QMK Bot
60b020acab format code according to conventions [skip ci] 2020-03-14 21:37:29 +00:00
brickbots
b5be96f8bb Adding OLED scroll setup functions (#8386)
* Adding scroll setup functions:

* Clarifying values stored in oled_scroll_speed
2020-03-14 21:04:34 +00:00
MechMerlin
7aa21cc287 VIA Support: Doro 67 (#8399)
* add via keymap for doro67

* have more sensible VID and PID

* apply the same VIA changes to the regular PCB

* Update keyboards/doro67/rgb/keymaps/via/keymap.c

* Update keyboards/doro67/regular/config.h

* fix some formatting

* add via support for multi doro67
2020-03-14 11:47:29 -07:00
Ryan
d597af9e1e Remove pro_micro.h (#8374)
* Remove pro_micro.h

* Include quantum.h
2020-03-14 15:31:15 +00:00
QMK Bot
03ed819717 format code according to conventions [skip ci] 2020-03-14 14:08:48 +00:00
Wilba
141535c9db Realign dynamic macros with recent SEND_STRING changes (#8407) 2020-03-14 13:35:12 +00:00
NeoTheFox
a92947fcdb added olkb_style layout for XD75 (#8409)
* added olkb_style layout for XD75

* removed unnecessary config.h

* cleaned up empty functions

* refactored fuction type for clarity

* renamed the layout
2020-03-14 13:32:26 +00:00
Takeshi ISHII
cde5237a88 fix two links on docs/other_eclipse.md (#8417) 2020-03-14 13:25:21 +00:00
Luís Oliveira
dc79792ab4 Add Portuguese keymap and sendstring lookup tables (#8390)
* Add Portuguese keymap and sendstring lookup tables

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update quantum/keymap_extras/keymap_portuguese.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-13 17:21:00 -07:00
Andy Jack
e6a9f700de Update link for Learn Plover google site (#8410) 2020-03-14 11:06:54 +11:00
Jonas Avellana
0fdd37ee19 [Keymap] ninjonas keymap updates (#8373)
* [keymap(ninjonas)] ninjonas keymap updates

* [refactor] switching encoder rotation logic. recent pull seems to have flipped encoder stuff

* [keymap(lily58)] added chrome change profile key on RAISE

Co-authored-by: Jonas Avellana <jonas.avellana@workday.com>
2020-03-13 16:56:21 -07:00
Ryan
40e8d60ecd Fix bootloader for Maypad (#8411) 2020-03-13 23:44:43 +00:00
skullydazed
f81b0e35a6 Add decorators for determining keyboard and keymap based on current directory (#8191)
* Use pathlib everywhere we can

* Improvements based on @erovia's feedback

* rework qmk compile and qmk flash to use pathlib

* style

* Remove the subcommand_name argument from find_keyboard_keymap()

* add experimental decorators

* Create decorators for finding keyboard and keymap based on current directory.

Decorators were inspired by @Erovia's brilliant work on the proof of concept.
2020-03-13 15:47:04 -07:00
QMK Bot
5e98eaaaff format code according to conventions [skip ci] 2020-03-13 18:44:56 +00:00
fredizzimo
9e8767917d Fix pressing two keys with the same keycode but different modifiers (#2710)
* Fix extra keyboard report during test_fixture teardown

* Add tests for pressing two keys with only different modifers

* Fix #1708

When two keys that use the same keycode, but different modifiers were
pressed at the same time, the second keypress wasn't registered. This is
fixed by forcing a key release when we detect a new press for the same
keycode.

* Fix the NKRO version of is_key_pressed

* Fix uninitalized loop variable

Co-authored-by: Jack Humbert <jack.humb@gmail.com>
2020-03-13 14:09:38 -04:00
QMK Bot
f89439ae09 format code according to conventions [skip ci] 2020-03-13 17:24:38 +00:00
francislan
3cd2a27ac0 Decouple mouse cursor and mouse wheel in accelerated mode (#6685)
* Decouples mouse cursor and mouse wheel movements in accelerated mode.

* Fixed comment indentation.

* Updated docs

Co-authored-by: Francis LAN <francislan@google.com>
2020-03-13 12:49:44 -04:00
Koichi Katano
28d94b7248 [Keyboard] Add Wallaby (#8398)
* Add wallaby

* Update readme.md

* Update keyboards/wallaby/keymaps/default/keymap.c

* Update keyboards/wallaby/rules.mk
2020-03-12 19:30:59 -07:00
nickolaij
abd8e75cb7 [Keyboard] Abacus Keyboard ReMerge (#8308)
* added abacus keyboard

* keymap updates

* Update keyboards/abacus/config.h

* Update keyboards/abacus/config.h

* Update keyboards/abacus/keymaps/default/keymap.c

* Update keyboards/abacus/keymaps/default/keymap.c

* Update keyboards/abacus/keymaps/default/keymap.c

* start cleaning up for merge

* cleaned for merge

* cleaned

* cleaned

* Update keyboards/abacus/abacus.h

* Update keyboards/abacus/keymaps/default/keymap.c

* Update keyboards/abacus/keymaps/default/readme.md

* Update keyboards/abacus/readme.md

* Update keyboards/abacus/readme.md

* Update keyboards/abacus/rules.mk

* Update keyboards/abacus/info.json

* Update keyboards/abacus/info.json

* Update keyboards/abacus/info.json

* Update keyboards/abacus/readme.md

* Update keyboards/abacus/info.json

* Update keyboards/abacus/rules.mk

* Update keyboards/abacus/rules.mk
2020-03-12 19:22:27 -07:00
James Young
9046107183 Restore getting_started_github.md doc 2020-03-12 17:24:07 -07:00
Ryan
2b63896466 Update Swedish keymap and add sendstring LUT (#8365) 2020-03-12 17:09:30 -07:00
Ryan
6734a39811 Update Spanish keymap and sendstring LUT (#8364) 2020-03-12 17:00:28 -07:00
skullY
799acb2802 use qmk.path.normpath to locate the output file. 2020-03-12 13:48:17 -07:00
TerryMathews
18bc525493 [Keyboard] Candybar update (#8335)
* Candybar: split lefty and righty into subprojects.

* Update readme.md

* Update readme.md

* Candybar: Moved STM32 library files into project root folder.

* Update keyboards/candybar/righty/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/candybar/righty/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/candybar/righty/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/candybar/righty/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/candybar/righty/righty.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Candybar: remove Boards directory so project uses one from drivers

* Update keyboards/candybar/righty/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update readme.md

* Update readme.md

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-12 19:52:59 +00:00
Christopher Janzen
4edb5a5e8c Add new keymap with split shift and split backspace for bananas… (#8395)
* Add new keymap with split right shift and split backspace for bananasplit PCB

* Remove unecessary config.h

* Remove unecessary line breaks

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Christopher Janzen <hello@christopherjanzen.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-13 06:14:03 +11:00
Joel Challis
3b5fd4cc51 Enable custom backlight driver for kmac (#8397) 2020-03-12 13:11:55 +01:00
Joel Challis
cd9a430d66 Force "blank" issue template to end of list (#8387)
* force ascii sort of issue templates to add blank to end of list
2020-03-12 01:27:33 -07:00
Nick Brassel
1b267d4840 Fix darkmode (#8393)
* Rearrange the custom CSS a bit.

* fix css name

* add missing quote

* Fix up dark mode rendering. (#8392)

* Fix up dark mode rendering.

* Update index.html

* Fix up code blocks

* Fix code in page toc

* Update docs/qmk_custom_dark.css

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: skullY <skullydazed@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-12 18:17:47 +11:00
Daniel Rodríguez Rivero
32d03eef90 Danielo515/redox (#8232)
* feat(build): added script for compiling with docker easily

* chore: bring my own build with docker to master

* chore: delete a file that does not make sense anymore

* feat: first redox for danielo

* chore: basic compatibility between redox and my space

* refactor: removed some old stuff

* feat: added go coding symbols

* feat: name control_k and alt_j

* chore: reduce combo term

* feat: improved first layer of redox

* feat: add configurations to the redox

* feat: make alt tab more portable

* feat: small improvements to redox layout

* feat: added leader

* refactor: move leader defs to my userspace config

* chore: movement modified

* feat: more predefined keys and a a new combo

* feat: redox alt tab functionality

* refactor: move alt_tab processing to a separate file

* refactor: early return

* refactor: move process record to a separate file

* format leader function

* chore: backspace on digits layer

* feat: add extra combo

* feat: added more combos

* implement guard proposed by @drashna

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* chore: include @drashna placeholder suggestion

Co-Authored-By: Drashna Jaelre <drashna@live.com>

Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-03-12 02:50:19 +00:00
Nick Brassel
f2f2afe13b Add support for STM32L0/L1 onboard EEPROM. (#8002)
* Add support for STM32L0/L1 onboard EEPROM.

* Update docs/eeprom_driver.md

Co-Authored-By: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-03-12 12:59:55 +11:00
Erkki Halinen
3a3ea03b6e [Keymap] Add Erkhal keymap to PRKL30 (#8355)
* Add Erkhal keymap

* Fix comment of layer

* Update keyboards/handwired/prkl30/keymaps/erkhal/readme.md
2020-03-11 16:06:47 -07:00
Takeshi ISHII
f3afc716cb fix keyboards/mxss/rgblight.h (#8388)
Since #7773 caused a build error for `mxss:default`, I made similar changes to 'keyboards/mxss/rgblight.h' as #7773 did to 'quantum/rgblight.h'.

**This commit does not change the build result.**

Testing script
```shell
 # build on versions earlier than PR #7773
 git checkout 0.8.24
 echo master > /tmp/master_md5.txt

 make mxss:default:clean
 make mxss:default
 md5 mxss_default.hex >> /tmp/master_md5.txt

 # build on this commit
 git checkout fix-keyboards-mxss-rgblight.h
 echo fix-keyboards-mxss-rgblight.h > /tmp/branch_md5.txt

 make mxss:default:clean
 make mxss:default
 md5 mxss_default.hex >> /tmp/branch_md5.txt

 diff -u /tmp/master_md5.txt /tmp/branch_md5.txt
```

Test result:
```
--- /tmp/master_md5.txt 2020-03-12 05:51:39.000000000 +0900
+++ /tmp/branch_md5.txt 2020-03-12 05:51:49.000000000 +0900
@@ -1,2 +1,2 @@
-master
+fix-keyboards-mxss-rgblight.h
MD5 (mxss_default.hex) = 3034b2504d0c7fc6bd8bf1dffb6b8486
```
2020-03-11 21:23:31 +00:00
Alexander Tulloh
e72562fe6f [Keyboard] Oddball keyboard (#8352)
* Initial commit of oddball keyboard

* Update oddball project url

* Update pointer functions to only run on master side

* Add unique product version

* Capitalise product name

* Convert oddball keymap layer flags to enum

* Remove commented keyboard boilerplate code

* Remove unused keymap config

* Fix incorrect layout in info.json

* Add markdown link text in readme
2020-03-11 00:56:05 -07:00
QMK Bot
2b66acf04a format code according to conventions [skip ci] 2020-03-11 05:11:02 +00:00
Drew Mills
5ac6fe1888 Add ADC support for STM32F3 and STM32F0 devices (#7681)
* Add ADC support for STM32F3 and STM32F0 devices

* Add section about configration options available to the ARM ADC implementation

* Fix STM32 typo
2020-03-11 15:38:39 +11:00
Zambumon
979ac0d8da Add VIA support to Tokyo60. (#8362)
* VIA_ENABLE Tokyo60 PCB

* Update config.h

* Apply suggestions from code review

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-11 00:44:20 +00:00
elmo-space
7a89b51018 fix kira80 matrix mapping and add more preset layouts (#8361)
* fix kira80 matrix mapping

* add more preset keymaps

* remove uselesss rgb mod keys
2020-03-10 15:10:14 -07:00
skullydazed
2a05d433c9 Rename qmk json-keymap to qmk json2c (#8372) 2020-03-10 13:51:19 -07:00
QMK Bot
1aa40dde46 format code according to conventions [skip ci] 2020-03-10 20:24:13 +00:00
Nathan Gray
2ffb08843b Feature: RGBLight layers (#7768)
* New feature: RGBLIGHT_LAYERS

This feature allows users to define multiple independent layers of lighting
that can be toggled on and off individually, making it easy to use your
RGB lighting to indicate things like active keyboard layer & modifier state.

* Demonstrate built in functions for layer state checking

Also link the video in the docs.

* Follow existing pattern for setting rgblight_status flags

* Eliminate rgblight_is_static_mode since it's not needed

Just check to see if the timer is enabled directly.
2020-03-10 12:50:01 -07:00
Wilba
2a8ccafe6e Refactor Equinox PCB revisions (#8266)
* Refactor Equinox PCB revisions

* typo
2020-03-10 11:34:19 -07:00
Alvin See
1757960b7b Replace tab indentation with spaces in is0 default keymap. (#8368) 2020-03-10 20:30:34 +11:00
Drashna Jaelre
668121bbf8 Fix layer debug calls (#8370) 2020-03-10 20:23:26 +11:00
Brett Mandler
483ab88489 [Keymap] Added HHKB Keymap and user config (#8119)
* Added my config

* Update my keymap

* Improve quality of brett.c

* Finish cleaning brett.c

* Remove QMK_FIRMWARE_H

* Update keyboards/hhkb/keymaps/brett/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-10 01:52:39 -07:00
Takeshi ISHII
dbbab40981 Refactor rgblight_reconfig.h (#7773)
* Moved contents of rgblight_reconfig.h to rgblight_post_config.h.

In #3582, rgblight_reconfig.h had to be newly created. Now, the build system of qmk_firmware has a post_cofig feature, so that what was done in rgblight_reconfig.h can now be realized in rgblight_post_config.h.

**This commit does not change the build result.**

Testing script
```shell
  # build on master
  git checkout master
  echo master > /tmp/master_md5.txt

  # RGBLIGHT_ENABLE = no
  make HELIX=verbose helix/rev2:default:clean
  make HELIX=verbose helix/rev2:default
  md5 helix_rev2_default.hex >> /tmp/master_md5.txt

  # RGBLIGHT_ENABLE = yes, with animations
  make HELIX=verbose helix/rev2/back:default:clean
  make HELIX=verbose helix/rev2/back:default
  md5 helix_rev2_back_default.hex >> /tmp/master_md5.txt

  # RGBLIGHT_ENABLE = yes, without animations
  make HELIX=verbose,no_ani helix/rev2/back:default:clean
  make HELIX=verbose,no_ani helix/rev2/back:default
  md5 helix_rev2_back_default.hex >> /tmp/master_md5.txt

  # build on refactor_rgblight_reconfig.h
  git checkout refactor_rgblight_reconfig.h
  echo refactor_rgblight_reconfig.h > /tmp/branch_md5.txt

  # RGBLIGHT_ENABLE = no
  make HELIX=verbose helix/rev2:default:clean
  make HELIX=verbose helix/rev2:default
  md5 helix_rev2_default.hex >> /tmp/branch_md5.txt

  # RGBLIGHT_ENABLE = yes, with animations
  make HELIX=verbose helix/rev2/back:default:clean
  make HELIX=verbose helix/rev2/back:default
  md5 helix_rev2_back_default.hex >> /tmp/branch_md5.txt

  # RGBLIGHT_ENABLE = yes, without animations
  make HELIX=verbose,no_ani helix/rev2/back:default:clean
  make HELIX=verbose,no_ani helix/rev2/back:default
  md5 helix_rev2_back_default.hex >> /tmp/branch_md5.txt

  diff -u /tmp/master_md5.txt /tmp/branch_md5.txt
```

Test result:
```
--- /tmp/master_md5.txt 2020-01-03 15:42:22.000000000 +0900
+++ /tmp/branch_md5.txt 2020-01-03 15:42:42.000000000 +0900
@@ -1,4 +1,4 @@
-master
+refactor_rgblight_reconfig.h
 MD5 (helix_rev2_default.hex) = f360032edd522448366d471d8f4f8181
 MD5 (helix_rev2_back_default.hex) = 0c663acc6cccc44476b3b969ad22a48f
 MD5 (helix_rev2_back_default.hex) = e66b1195ff6d38e6e22c975b8ae42fd3
```

* Expressions that are too long are difficult to read, so wrap them.

* Edit the expression again

* remove `defined(RGBLIGHT_ANIMATIONS)` in `tmk_core/common/*/suspend.c`, `tmk_core/protocol/*/main.c`

move contents of rgblight_reconfig.h to rgblight.h.

The following changes were made to rgblight.h.

```diff
+#ifdef RGBLIGHT_USE_TIMER
 void rgblight_task(void);

 void rgblight_timer_init(void);
 void rgblight_timer_enable(void);
 void rgblight_timer_disable(void);
 void rgblight_timer_toggle(void);
+#else
+#define rgblight_task()
+#define rgblight_timer_init()
+#define rgblight_timer_enable()
+#define rgblight_timer_disable()
+#define rgblight_timer_toggle()
+#endif
```

The following changes were made to tmk_core/common/avr/suspend.c, tmk_core/common/chibios/suspend.c, tmk_core/protocol/chibios/main.c, tmk_core/protocol/lufa/lufa.c, tmk_core/protocol/vusb/main.c.

```diff
-#    ifdef RGBLIGHT_ANIMATIONS
     rgblight_timer_enable();
-#    endif
```
```diff
-#if defined(RGBLIGHT_ANIMATIONS) && defined(RGBLIGHT_ENABLE)
+#if defined(RGBLIGHT_ENABLE)
         rgblight_task();
 #endif
```

* remove 'defined(RGBLIGHT_ANIMATIONS)' in tmk_core/common/keyboard.c

Co-authored-by: Joel Challis <git@zvecr.com>
2020-03-10 01:46:03 -07:00
Takashi Shibusawa
20a0fa9209 [Keyboard] Palette1202 (#7736)
* added Palette1202

* removed currently unused cords

* Update keyboards/palette1202/config.h

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Apply suggestions from code review

Co-Authored-By: Drashna Jaelre <drashna@live.com>
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update readme.md

removed unnecessary horizontal line from readme.md

* Update readme.md

Fixed style, make command example

* Removed spaces

* removed unused config.h

* fixed defines

* fixed send string on rotate encoder

* fixed layer numbers for OLED Display

* fixed to use existing function to set default layer

https://github.com/qmk/qmk_firmware/pull/7736#discussion_r366699616

* flipped rotary encoder directions

* Added layer for Clip studio on iOS

* Update keyboards/palette1202/rules.mk

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/palette1202/lib/oled_helper.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-10 01:38:37 -07:00
MakotoKurauchi
2d14d12c74 [Keyboard] Helix add split common option (#7718)
* is_master, has_usb() move to rev2.[hc]

* Do recent helix/rev2 changes to helix/pico as well.

helix/pico/matrix.c: remove 'is_master'
helix/pico/pico.c: add 'is_master'
helix/pico/pico.h: add 'has_usb()' macro
helix/pico/split_util.c: remove 'setup_handedness()' 'has_usb()', add 'is_helix_master()' etc

* add HELIX=scan option into {rev2/pico}/local_features.mk

Made DEBUG_MATRIX_SCAN_RATE easy to use.

* Changed rules.mk to link "helix/local_drivers/ssd1306.c" only when OLED_ENABLE = yes.

* Added option to use split_common for helix/rev2, helix/pico keyboard.

how to build:
 ### build helix/pico (HelixPico) with helix current codes
  $ make helix/pico:KEY_MAP
  $ make helix/pico/back:KEY_MAP

 ### build helix/rev2 (Helix or Helix beta) with helix current codes
  $ make helix:KEY_MAP
  $ make helix/rev2/back:KEY_MAP
  $ make helix/rev2/under:KEY_MAP
  $ make helix/rev2/oled:KEY_MAP
  $ make helix/rev2/oled/back:KEY_MAP
  $ make helix/rev2/oled/under:KEY_MAP

 ### build helix/pico (HelixPico) with split_common codes
  $ make helix/pico/sc:KEY_MAP
  $ make helix/pico/sc/back:KEY_MAP
  $ make helix/pico/sc/under:KEY_MAP

 ### build helix/rev2 (Helix) with split_common codes
  $ make helix/rev2/sc:KEY_MAP
  $ make helix/rev2/sc/back:KEY_MAP
  $ make helix/rev2/sc/under:KEY_MAP
  $ make helix/rev2/sc/oled:KEY_MAP
  $ make helix/rev2/sc/oledback:KEY_MAP
  $ make helix/rev2/sc/oledunder:KEY_MAP

* add matrix_slave_scan_user() to helix/rev2/rev2.c, helix/pico/pico.h

* Changed 'helix:xulkal' to always use split_common and removed ad hoc code.

Added the following line to 'helix/rev2/keymaps/xulkal/rules.mk':

        SPLIT_KEYBOARD = yes

Removed the following ad hoc code from 'users/xulkal/custom_oled.c':

        #if KEYBOARD_helix_rev2
        extern uint8_t is_master;
        bool is_keyboard_master(void) { return is_master; }
        #endif

* add '#define DIODE_DIRECTION COL2ROW' into helix/{rev2|pico}/config.h

This commit does not change the build result.

* update helix readme

* keyboards/helix/readme.md
* keyboards/helix/pico/keymaps/default/readme.md
* keyboards/helix/rev2/keymaps/default/readme.md

Co-authored-by: mtei <2170248+mtei@users.noreply.github.com>
2020-03-10 01:33:46 -07:00
marcoSchr
0ba352356d Enable bootmagic lite for CU80 (#8363) 2020-03-10 00:30:02 -07:00
Richard Baptist
a4fd5e2491 [Keymap] Update personal keymap (#8354) 2020-03-09 23:40:27 -07:00
Ryan
5e3951b361 Remove NO_UART defines from config.h for V-USB boards (#8351) 2020-03-09 19:58:25 +00:00
elmo-space
5e4fcfac1c [Keyboard] Add Kira 80 support (#8342)
* add kira 80 initial support

* Delete config.h

* Update keyboards/kira80/keymaps/default/keymap.c

* Update keyboards/kira80/readme.md

* Update keyboards/kira80/rules.mk

* Update keyboards/kira80/usbconfig.h

* Update keyboards/kira80/usbconfig.h

* Update keyboards/kira80/usbconfig.h

* Update keyboards/kira80/usbconfig.h

* update readme and fix wrong LED assignment (scrolllock instead of numlock)

* Update keyboards/kira80/rules.mk

* fix weird double commit

* exchange images in readme for smaller versions

* Update keyboards/kira80/readme.md

* Update keyboards/kira80/readme.md

* Update keyboards/kira80/readme.md

* Update keyboards/kira80/readme.md

* Apply suggestions from code review

* Apply suggestions from code review
2020-03-09 12:39:41 -07:00
Erkki Halinen
89ef9de98c [Keyboard] Add PRKL30 keyboard (#8319)
* Add PRKL30 default keymap

* Modify readmes, fix info.json url

* added layer pictures to readme.md

* edited layer pictures

* edited layer pictures

* edited layer pictures

* edited layout pictures

* edited layout pictures

* Modify default keymap

* Add arrows to Raise layer

* Add perkele macro and adjust symbols

* Add PRKL macro and modify keymap comments

* updated layout pictures

* edited layut pictures

* Add correct minus keycode

* Configure Feather config

* Update keyboards/handwired/prkl30/keymaps/default/keymap.c

* Update keyboards/handwired/prkl30/feather/rules.mk

* Update keyboards/handwired/prkl30/feather/config.h

* Update keyboards/handwired/prkl30/feather/config.h

* Update keyboards/handwired/prkl30/promicro/config.h

* Update keyboards/handwired/prkl30/promicro/rules.mk

* Update keyboards/handwired/prkl30/feather/config.h

* Update keyboards/handwired/prkl30/feather/config.h

* Update keyboards/handwired/prkl30/promicro/config.h

* Update keyboards/handwired/prkl30/feather/rules.mk

* Update keyboards/handwired/prkl30/keymaps/default/keymap.c

* Update keyboards/handwired/prkl30/info.json

* Update keyboards/handwired/prkl30/info.json

* Update keyboards/handwired/prkl30/keymaps/default/keymap.c

* Delete unused config

* Apply suggestions from code review

Commit code review changes

* Remove false comments from rules.mk

* Change layout to layout_all

* Apply suggestions from code review

Co-authored-by: Toni Johansson <toni.r.johansson@gmail.com>
2020-03-09 02:21:59 -07:00
Ryan
6c8d815f2e Update Dvorak, Colemak and Workman keycode aliases (#8217)
* Update Dvorak, Colemak and Workman keycode aliases

* Add missing shifted keycode aliases for Workman
2020-03-09 15:37:10 +11:00
Nick Brassel
2271da00bc Move splittest I2C (#8346) 2020-03-09 15:36:40 +11:00
Christian Gurholt
6e28ff24ba [Keymap] planck layout for kifinnsson (#8324)
* [Keymap] kifinnsson keymap for planck

Initial commit for kifinnsson keymap
* placeholder macros
* extend layer

* [Keymap] kifinnsson planck keymap updates

commented out placeholder SEND_STRING macros

* Update keyboards/planck/keymaps/kifinnsson/keymap.c

Remove extern keymap_config_t keymap_config;

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/planck/keymaps/kifinnsson/keymap.c

Changed KC_MENU to KC_APP

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Removing COLEMAK set_single_persistent_default_layer

as suggested

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* updated uinit32()_t to layer_state_t() for update_tri_layer_state

as suggested

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Removing COLEMAK keycode

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Removing COLEMAK keycode in _ADJUST layer

* Update keymap.c

added switch (keycode) back into process_record_user

Co-authored-by: Ki Finnsson <kifinnsson@wgu.edu>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-03-08 20:58:30 -07:00
moyi4681
d526117896 add via support for dztech 60 and 65 pcb (#8334)
* add via support for dztech 60 and 65 pcb

add via support for dztech 60 and 65 pcb

* Update dz60rgb.h

* Update dz60rgb.h

* Update dz60rgb_ansi.h

* Update dz60rgb_wkl.h

* Update dz65rgb.h

* Update dz60rgb.h

* Update dz60rgb_ansi.h

* Update dz60rgb_wkl.h

* Update dz65rgb.h

* Update keyboards/dztech/dz60rgb/dz60rgb.h

* Update keyboards/dztech/dz60rgb_wkl/dz60rgb_wkl.h

* Update keyboards/dztech/dz65rgb/dz65rgb.h

* Update keyboards/dztech/dz60rgb_ansi/dz60rgb_ansi.h

* Update dz60rgb_wkl.h

* Update keyboards/dztech/dz65rgb/keymaps/via/keymap.c

* Update keyboards/dztech/dz60rgb_wkl/keymaps/via/keymap.c
2020-03-08 19:16:48 -07:00
skullydazed
cf40c33c90 Add gcc version detection to qmk doctor (#8338) 2020-03-08 09:21:45 -07:00
Samuel Li
4b7a3b2265 [Keyboard] New Keyboard: handwired/jtallbean/split_65 (#8275)
* New keyboard: split_65

* Updated readme

* Update with requested changes

* Add writePinLow to prevent flickering

* Renamed LAYOUT to LAYOUT_all
2020-03-08 00:26:26 -08:00
Ryan
829906969c Update Norwegian keymap and add sendstring LUT (#8300) 2020-03-08 15:43:05 +11:00
yulei
e0d15e6182 fixed #8259 (#8333) 2020-03-07 13:19:06 +00:00
Joel Challis
3a303bd2ae Backlight - Carve out a better location for private driver functionality (#8329)
* rename backlight_soft to match rules.mk

* rename backlight_soft to match rules.mk - update common_features

* Carve out a better location for private driver backlight functionality
2020-03-07 12:09:49 +00:00
su8044
d7ba0ad684 [Keyboard] Handwired Skeeb Keyboard (#8161)
* adding Handwired Skeeb Keyboard

* Apply suggestions from fauxpark

* Apply more suggestions from fauxpark and small change to layout

* Apply more suggestions from noroadsleft and last tap dance
2020-03-07 01:53:05 -08:00
Wilba
c4d8e56928 Added VIA keymap for Ramaworks M10-A (#8255)
* Added VIA keymap for Ramaworks M10-A

* change vendor/product in base config.h

* #pragma once

* Uee LAYOUT() in keymaps
2020-03-07 01:38:08 -08:00
zvecr
5e1ce3988d Remove unused LED_BREATHING_TABLE 2020-03-06 22:29:01 -08:00
kymok
dd05007f3b [Docs] i2c_driver translation to Japanese (#8274)
* [WIP] i2c_driver translation to ja

* update docs/ja/i2c_driver.md

* update docs/ja/i2c_driver.md

* align table + remove comment

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* Update docs/ja/i2c_driver.md

* add original document commit hash

Co-Authored-By: shela <shelaf@users.noreply.github.com>
2020-03-06 18:27:15 -08:00
QMK Bot
2306c974e5 format code according to conventions [skip ci] 2020-03-07 01:24:47 +00:00
brickbots
833c5ae87a Buffer based OLED panning, write byte to buffer at arbitrary index (#8055)
* Add buffer based single line pan, arbitrary byte write to buffer

* Change dirty mask to inverse of OLED_BLOCK_TYPE for future proofing larger buffer sizes

* Updating docs to include new functions

* Updating to clarify scroll vs pan
2020-03-07 00:52:39 +00:00
swreinehr
57de9e65ef Super 16 Puzzle Game (#8306)
* 15/16 game with lights for the super 16

* Updated readme with style

* adding comments and initial style to keymap

trying to make the code look prettier, need to test by redownloading

* Final style revisions before pull request

* formatting changes, removed config.h

* modified rules.mk, works with changes in PR8314

* formatting

no number of spaces is enough for a newline, whoops

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/1upkeyboards/super16/keymaps/15game/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/1upkeyboards/super16/keymaps/15game/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/1upkeyboards/super16/keymaps/15game/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Sam Reinehr <swreinehr@mines.edu>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-07 00:15:44 +00:00
Chris Alves
6b6e47cbf1 DZ60 keyboard layout tuning and README update/fix (#8325)
* Added custom dz60 keymap

* Update readme.md

* Updated pictures in README.md

* README.md fixes

* Updated mouse layout/ added ` key

* Changed bkspc key to del in mod

* Changed picture

* Updated keymap

* Removed default dz60 config.h

* Updated Readme

* Added Devorak Keymap

* Re-added Default Config File

* Updated Flash Command

* Cleaned Up Custom Config File

* Added Lock Security Layer

* Updated Readme Picture

* Fixed Readme

* Re-added keyboard picture

* Added home and end button

* added insert, pgup, pgdn

* final commit before pull request

* fixing merge

* Added custom dz60 keymap

* adding lufa?

Co-authored-by: chrisae9 <chrisae9@penguin>
2020-03-07 00:11:41 +00:00
Anthony Leung
54b6bf5910 [Keyboard] Add VIA support for neuron (#8264)
* add VIA support for neuron

* update neuron vendor and product id

* update neuron product id

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-06 16:00:44 -08:00
James Young
73728e9bec [Docs] Fix links in Config Options doc 2020-03-06 13:10:17 -08:00
Mikkel Jeppesen
4f1a62ca1d [Keyboard] keebwerk. nano. slider support (#7914)
* Initial Keeb.werk nano.slider support

* fixed open ifdef

* Fixed layout macros

* Added LTO

* Enabled LTO and dissabled console

* Added basic slider example

* rate limited adc, and fixed send_string

* Made slider courser

* new-line after each slider print

* Switched slider example mirror the stock behavior using midi

* switched division to bit-shifting

* Apply suggestions from code review

* Update keyboards/keebwerk/nano_slider/keymaps/default/keymap.c

* Update keyboards/keebwerk/nano_slider/config.h

* Update keyboards/keebwerk/nano_slider/config.h

* Applied suggestions from code review

* Apply suggestions from code review

* Added fauxparks info.json

* Reverse midi value direction, move to QMKVID

* Update keyboards/keebwerk/nano_slider/config.h

* Update keyboards/keebwerk/nano_slider/config.h

* Update keyboards/keebwerk/nano_slider/keymaps/default/keymap.c

* Apply suggestions from code review

* Update keyboards/keebwerk/nano_slider/rules.mk

* Update keyboards/keebwerk/nano_slider/nano_slider.h

* Update keyboards/keebwerk/nano_slider/readme.md

* Defined backlight pin and settings
2020-03-06 11:00:17 -08:00
Shaun
4e826ba61f Correct typo in tap_hold.md (#8326)
Correct typo: "reasonal" to "reasonable"
2020-03-07 05:42:08 +11:00
Nick Brassel
b438c6f8ea Fix up Arm builds with nix-shell. (#8312) 2020-03-07 03:05:51 +11:00
QMK Bot
bad9468ce1 format code according to conventions [skip ci] 2020-03-06 13:28:11 +00:00
Ryan
9810756ee0 Fix typo in uart.c backport and add 32A "support" (#8219) 2020-03-06 23:55:15 +11:00
Joel Challis
918a85d342 Refactor more backlight to a common location (#8292)
* Refactor more backlight to a common location

* BACKLIGHT_PIN not defined for custom backlight

* align function names
2020-03-06 12:49:45 +00:00
Joel Challis
116c0e44a1 Remove stub backlight functions from clueboard/66/rev4 (#8303) 2020-03-06 12:12:20 +00:00
dr-BEat
3c0ef04390 [Keymap] Dichotomy keymap by beat (#8279)
* Added more led helpers

* Working keymap

* Added new mouse button an made lower layer toggleable

* Small improvement to process_record_user

* Removed extra layer buttons

* Added Numpad to apply layer

* Moved buttons and added toggle for raise button

* Added Menu,PrintScreen and Windowslock buttons, and left handmouse

* Fixed Scroll Buttons

* Turned TAPPING TOGGLE to 2

* Switched Del and Ctrl on left hand

* Added Home Button to Mouse layer

* Fixed led initialization to avoid red led on boot

* Updated formatting to follow guidelines

* Used enums instead of defines and used layer_state_t type

* Added license

* Moved TAPPING settings to keymap config

* Fixed small formatting issue in keymap.c

* Use GPIO Control instead of lowlevel ports
2020-03-06 00:47:52 -08:00
QMK Bot
fd7b52cc64 format code according to conventions [skip ci] 2020-03-06 02:15:29 +00:00
Joel Challis
d0d6fb27c4 Add f401 and f411 blackpill examples (#7930)
* Add f401 and f411 blackpill examples

* Add readme files

* Align dfu args with core

* Add support for RESET keycode

* move STM32_BOOTLOADER_ADDRESS to rules

* Update conf files to latest ChibiOS

* Update conf files to latest ChibiOS
2020-03-06 01:40:39 +00:00
Joel Challis
b368db9e02 Refactor fortitude60 to use split_common (#8113) 2020-03-06 01:39:54 +00:00
James Young
76189d9a28 link the 2020 Feb 29 Breaking Changes changelog from the summary 2020-03-05 16:00:10 -08:00
James Young
2939751eb3 keycodes.md: hard-code section link id attributes 2020-03-05 16:00:10 -08:00
James Young
772bacb770 keycodes.md: don't use section headings as links
It prevents the Table of Contents from parsing that heading.
2020-03-05 16:00:10 -08:00
skullY
961477c791 make sure all our redirects are in order 2020-03-05 16:00:10 -08:00
skullY
6956784ac1 Add more call to action items 2020-03-05 16:00:10 -08:00
skullY
54c58ea6de Add explicit id tags to externally linked headers 2020-03-05 16:00:10 -08:00
James Young
a95a314f78 refactor How a Matrix Works doc 2020-03-05 16:00:10 -08:00
James Young
bc31ebd0c4 Hand Wire guide tidying, part 2 2020-03-05 16:00:10 -08:00
James Young
fbf27e7444 Hand Wire guide tidying 2020-03-05 16:00:10 -08:00
James Young
8b5ca3d110 clean up Firmware Setup section in Hand Wire guide 2020-03-05 16:00:10 -08:00
James Young
06708b9dc8 remove collapsible section for Compiling; redirect to Building Firmware doc 2020-03-05 16:00:10 -08:00
James Young
772d5264d6 replace QMK Toolbox image in Hand Wire guide
Showing a current version of QMK Toolbox
2020-03-05 16:00:10 -08:00
James Young
994de86121 restructure Hand Wire Guide 2020-03-05 16:00:10 -08:00
James Young
906bdce6ce split Hand Wire Preamble to a separate doc 2020-03-05 16:00:10 -08:00
James Young
3bd65d2173 CSS updates: ul and pre elements 2020-03-05 16:00:10 -08:00
James Young
d5f34c4810 Polish Configurator section 2020-03-05 16:00:10 -08:00
skullY
503b52652c Adjust the H2 and H2 margins 2020-03-05 16:00:10 -08:00
skullY
b5030907eb reduce the line-height of the sidebar 2020-03-05 16:00:10 -08:00
skullY
8b0fdc82dc rearrange the sidebar a bit 2020-03-05 16:00:10 -08:00
skullY
8d8d61b3c5 limit the TOC to H1 and H2 2020-03-05 16:00:10 -08:00
skullY
f86fd0cd14 remove line drawing chars 2020-03-05 16:00:10 -08:00
skullY
12e43230c6 make custom_keycode_names.md a faq entry instead 2020-03-05 16:00:10 -08:00
skullY
55c5b82638 reduce space on h3s 2020-03-05 16:00:10 -08:00
skullY
9035c3497e break feature_advanced_keycodes.md up into multiple files 2020-03-05 16:00:10 -08:00
skullY
5d35098bfc improve our docsify setup 2020-03-05 16:00:10 -08:00
skullY
8249a288d7 fix numbering 2020-03-05 16:00:10 -08:00
skullY
45e218ceec overhaul the newbs guide 2020-03-05 16:00:10 -08:00
skullY
86f6405574 More sidebar organization 2020-03-05 16:00:10 -08:00
skullY
99850aabca Add API documentation 2020-03-05 16:00:10 -08:00
James Young
3c98854044 update flashing.md
- minor typo on intro paragraph (the -> them)
- remove note about :check-size target (`make` task now does this automatically)
- heading level for Caterina commands section
- typo regarding Halfkay (come -> comes)
2020-03-05 16:00:10 -08:00
James Young
7b1b53054f update newbs_building_firmware.md
Update the text sample for when the compile task completes.
2020-03-05 16:00:10 -08:00
skullY
a701c15d87 Rework the newbs guide around the qmk cli 2020-03-05 16:00:10 -08:00
skullY
1b7fa46f8e Add dark mode support 2020-03-05 16:00:10 -08:00
James Young
58fb57bfa7 _summary.md: move Auto Shift page to Software Features category 2020-03-05 16:00:10 -08:00
James Young
6af58fc25e clean up links to keycode references in newbs_building_firmware_configurator.md 2020-03-05 16:00:10 -08:00
James Young
e01763b8e5 clean up callouts in newbs_building_firmware_configurator.md 2020-03-05 16:00:10 -08:00
James Young
cdb5c074d3 remove some unnecessary external links
Also clean up some trailing whitespace.
2020-03-05 16:00:10 -08:00
skullY
3f1e47dbcd rework the index page 2020-03-05 16:00:10 -08:00
skullY
d1c0710dec remove unused docs 2020-03-05 16:00:10 -08:00
skullY
5b14456082 more wip 2020-03-05 16:00:10 -08:00
skullY
d1c18086d2 wip 2020-03-05 16:00:10 -08:00
James Young
4ef10a424a [Keyboard] add miller/gm-862 keyboard (#8230)
* add miller/gm-862 keyboard

* Update keyboards/miller/gm862/gm862.c

* Update keyboards/miller/gm862/gm862.h

* Update keyboards/miller/gm862/gm862.h

* Update keyboards/miller/gm862/readme.md

* Update keyboards/miller/gm862/readme.md

* Update keyboards/miller/gm862/readme.md

* Update keyboards/miller/gm862/readme.md

* Update config.h

* Update keyboards/miller/gm862/config.h

* Update keyboards/miller/gm862/readme.md
2020-03-05 13:51:43 -08:00
Ryan
23c31dd929 update lily58/rev1:yshrsmz (#8298)
* update lily58/rev1:yshrsmz

* use pre-shifted keycodes
2020-03-06 06:56:28 +11:00
James Young
921e18988f [Keyboard] CapsUnlocked CU80 (#8257)
* Initial commit for CU80

* Added iso and ansi to .json

* Update keyboards/cu80/config.h

Remove "Custom matrix"

* Update keyboards/cu80/config.h

* Update keyboards/cu80/config.h

* Update keyboards/cu80/config.h

* Update keyboards/cu80/cu80.h

* Update keyboards/cu80/rules.mk

* Update keyboards/cu80/keymaps/default/keymap.c

* Update keyboards/cu80/rules.mk

* Update keyboards/cu80/rules.mk

* Update keyboards/cu80/cu80.h

* Update keyboards/cu80/readme.md

* Update keyboards/cu80/keymaps/default/keymap.c

* Update keyboards/cu80/rules.mk

* Update keyboards/cu80/rules.mk

* Update keyboards/cu80/cu80.h

* Update keyboards/cu80/cu80.h

* Update keyboards/cu80/cu80.h

* Update keyboards/cu80/info.json

* Update keyboards/cu80/info.json

* Update keyboards/cu80/info.json

* Update keyboards/cu80/info.json

* Update keyboards/cu80/keymaps/default/keymap.c

* Update keyboards/cu80/rules.mk
2020-03-04 21:40:03 -08:00
Ryan
7e30d189e9 Update config.h - Fixed number of RGB LEDs (#8316)
There are 18 LEDs, not 16
2020-03-05 12:39:50 +11:00
James Young
8fd8454308 [Keymap] Add @cjuniet's keymap/layout/userspace (#8258)
* Add Colemak layout

* Add status bar for mods & locks with a custom font

* Swap DEL and TAB

* Fix media keys and add QMK Configurator layout

* Add dead grave accent on <leader>e
2020-03-04 17:19:26 -08:00
James Young
8e229f0db6 [Keymap] Wilba/Singav3 nk65 keymap updates (#8267)
* via configurator can't do AG_TOGG with any key - meh

* same issue - via can't do AG_TOGG

* oops - missed AG_TOGG on the NK65

* add media and mousekeys

* Update keyboards/nk65/keymaps/madhatter/keymap.c
2020-03-04 17:14:36 -08:00
James Young
95ce19f846 Add RGB lighting through one of the free pins (#8294) 2020-03-04 16:59:06 -08:00
James Young
9550ab3342 [Keymap] Adding the 4sStylZ xd75 (#8285)
* Adding the 4sStylZ xd75

* Update keyboards/xd75/keymaps/4sstylz/keycodes.h

* Apply suggestions from code review
2020-03-04 16:42:09 -08:00
Nick Brassel
607e2f6c31 YD60MQ refactor and Configurator layout support (#8313)
* refactor yd60mq.h

- four-space indent
- use K<row><col> base32hex notation
- rename LAYOUT to LAYOUT_all (with alias for backwards compatibility)

* refactor yd60mq.c to use led_update_kb()

* align rules.mk to AVR template

* refactor default keymap

Also correct positions for KC_NUHS and KC_NUBS.

* update readme

* add Configurator layout support

* initialize the Caps Lock LED pin properly
2020-03-05 07:26:25 +11:00
Joel Challis
2d1081c296 [Keyboard] Forget to ifdef Super16 led config (#8314) 2020-03-04 19:46:03 +00:00
Joel Challis
0275098bdd [Keyboard] Switch to RGB Matrix for Super16 (#8305) 2020-03-04 18:19:39 +00:00
Salicylic-acid3
0c9171a619 [Keymap] Keymap Update (#8309)
* Keymap Update

Some key codes have been updated.
naked64:salicylic
7skb:default

* Keymap Update

Some key codes have been updated.
KC_GRAVE to KC_GRV
7skb:default
2020-03-04 16:16:36 +00:00
MechMerlin
23eb9f4fe5 New Keyboard: SiddersKB Majbritt (Pronounced My Brit) (#8260)
* Initial commit of majbritt

* Add QMK and VIA support to majbritt

* Change vendor and product id

* Change name

* Change make path

* Move Majbritt into sidderskb directory

* Update keyboards/sidderskb/majbritt/majbritt.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>
Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/sidderskb/majbritt/keymaps/default/config.h
Co-Authored-By: Ryan <fauxpark@gmail.com>

* remove unused file
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-04 13:12:00 +01:00
MechMerlin
31662af342 [Keyboard] VIA Support: Tada68 (#8289)
* tada68 via files

* change vid and pid based on wilba's recommendaton
2020-03-04 01:22:47 -08:00
Ryan
8c3ff3f32c [Keyboard] LFK78 refactor (#7835)
* Change include guards to pragma once

* Clean up default keymaps

* Remove some magic numbers and use GPIO macros

* Clean up keyboard.[ch]

* Tidy up info.json and readme

* Align config.h with template

* Split up revision code into subfolders

* rev C-H has no audio, apparently

* Change revc_h to revc and document differences

* Turn off Audio on revb for now, for Travis' sake

* Split info.json into revision folders

* Clean up default keymaps some more
2020-03-03 14:10:39 -08:00
Ibnu Daru Aji
910d603c65 [Keymap] new userspace for ibnuda (#8221)
* to ease the maintenance for some boards ibnuda has.

* followed ridingqwerty's suggestion on 8821.

* folloing drashna's suggestion on qmk's 8221.

* following drashn's suggestion on qmk's 8211
2020-03-03 13:46:11 -08:00
Jason Thigpen
ad96e995af [Keymap] Add crd's equinox keymap (#8251) 2020-03-03 12:45:18 -08:00
Alfred Maler
ed6586e25b [Keymap] Feature/alfrdmalr/keymap update (#8174)
* WIP do not merge

* first pass at custom preonic layout

* add auto shift and reset via leader key

* Update readme

* update copyright notice

* formatting changes

* fix: use MO instead of process_record_user

* added backslash and moved grave position

* remove extraneous 'j' characer in NUMPAD template

* update template formatting

* remove process_record_user

* swap "!" with "@"

* fix readme formatting

* update readme layout image

* restore settings layer

* add windows minimize sequence

* fix: switch to correct seq function for three-key sequence

* fix: missing semicolon

* refactor: move keymap to userspace and generic 5x12 layout

* add numlock to numpad layer

* add readme

* update readme formatting

* remove unused wrappers from layout keymap

* update readme title to reflect new location

* remove alfrdmalr directory from preonic/keymaps

* add ortho 4x12 support

* add 'trilayer' settings and update keymap

* update SYMBOLS layer to SYMBOL

* remove minimize sequence

* clean up user config

* add brightness controls

* update settings ascii

* moved some symbols around to make vim/linux smoother
2020-03-03 10:13:42 -08:00
shela
acaecb4f94 Fix bootloader definition for namecard2x4 (#8301)
BOOTLOADER needs to be defined as caterina because namecard2x4 uses avrdude for flasher.
2020-03-03 15:00:34 +00:00
Ryan
53ac4d214f Update Hungarian keymap and add sendstring LUT (#8220) 2020-03-03 11:55:42 +11:00
Ryan
bff56aa46c Remove "ugly hack in usb_main.c" comments (#8296) 2020-03-02 23:56:46 +00:00
Danny
ce30cd2a01 Update encoder functions for Iris VIA keymap (#8295) 2020-03-02 23:55:57 +00:00
Ted M Lin
552f8d81b9 Reduce PROGMEM usage for sendstring LUT (#8109)
* Reduce PROGMEM usage for keycode map

Bit-pack the keycode bool array to gain back a small amount of flash space.
The trade-off is an increase in runtime instructions when running macros.

It does make the code a bit harder to read, as well as maintain.

For configs that use send_string() et al, it saves ~100 bytes.

* Switch to macro and common definition

Rewrite the array declarations so both the unpacked (original) and
packed LUT arrays can use the same value definitions. This is done by
defining a macro that "knows what to do".

This makes the code much easier to read and maintain.

* Fix macro typos and improve perf

Pack the bits in a more efficient order for extraction.
And also fix the copy/paste error in the macro...

* Switch fully to packed LUT

Some minor reformatting.
Compile tested all sendstring_xyz.h to make sure they were converted
properly. Also checked that an unconverted version would generate a
compile error.

* Apply whitespace suggestions from code review

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-03-03 10:43:18 +11:00
Drashna Jaelre
abd36de5ad [Docs] Update ISP Flashing guide (#8149)
* [Docs] Update ISP Flashing guide

* Apply suggestions from code review

AKA why you shouldn't write docs at 2am

Co-Authored-By: fauxpark <fauxpark@gmail.com>
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update workding for planck-qmk-dfu

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-03-01 22:29:26 -08:00
Dustin L. Howett
b72a1aa3fe Rewrite the Bathroom Epiphanies Frosty Flake matrix and LED handling (#8243)
* Keyboard: revamp frosty-flake leds

This commit transitions bpiphany/frosty_flake to led_update_{kb,user}
and rewrites the AVR bit twiddling logic to use the standard QMK GPIO
API.

* Keyboard: rewrite frosty_flake's matrix reader to be a lite custom matrix

This commit replaces frosty_flake's custom matrix and debounce logic
with a "lite" custom matrix. In addition to being somewhat clearer, this
allows a consumer of the flake board to choose their own debouncing
algorithm. The one closest to the implementation originally in use is
sym_g, but this opens us up to supporting eager_pk and eager_pr.

The original matrix code was 18 columns for 8 rows, but using a single
row read and unpacking the bits into individual columns. To simplify,
I've changed the key layout to be 8C 18R instead of 18C 8R: this lets us
use a single read directly into the matrix _and_ drop down to a uint8_t
instead of a uint32_t for matrix_row_t.

Since we're no longer implementing our own debouncing and row unpacking,
we save ~400 bytes on the final firmware image.

Fully tested against a CM Storm QFR hosting the flake -- this commit
message was written using the new matrix code.

Firmware Sizes (assuming stock configuration as of 42d6270f2)

Matrix+Debounce     Size (bytes)
---------------     ------------
original            17740
new + sym_g         17284
new + eager_pr      18106
new + eager_pk      18204

I expect that there are some scanning speed benefits as well.

* Keyboard: update frosty_flake's UNUSED_PINS

* Keyboard: Remove meaningless weak redefinitions from frosty

These are not necessary (and all of them already live somewhere in
Quantum).
2020-03-02 05:17:09 +00:00
Nick Brassel
78069d4826 Add onekey keymap for testing reset to bootloader. (#8288) 2020-03-01 22:36:17 +00:00
Andrew Kannan
c543ccf07c Get the direction right on the S75 encoder (#8287) 2020-03-01 21:30:01 +00:00
Joel Challis
88356c85c4 Prune out pure software pwm && custom driver && remove wrapping BACKLIGHT_PIN (#8041) 2020-03-01 20:22:13 +00:00
Andrew Kannan
3dc061ac78 Make a fix to savage65 and tmov2 for via (#8286) 2020-03-02 07:16:43 +11:00
QMK Bot
95124bf933 format code according to conventions [skip ci] 2020-03-01 19:20:09 +00:00
Joel Challis
e7fb873ee2 Short term fix for conflicting types for 'tfp_printf' (#8157) 2020-03-02 05:46:40 +11:00
Joel Challis
629950e51b Fix recent clang-format breaking quantum.c (#8282) 2020-03-01 17:55:43 +00:00
QMK Bot
1ec8a7205f format code according to conventions [skip ci] 2020-03-01 13:54:25 +00:00
Ryan
ce604e1629 Remove duplicate BRTG case (#8277) 2020-03-01 13:22:21 +00:00
Ryan
c9e3fa6f70 Clean up includes for glcdfont headers (#7745)
* Clean up includes for glcdfont headers

* Remove pragma once, most of these are not headers

* Missed these
2020-03-01 17:56:50 +11:00
James Young
f513a9193c Fix the Breaking Changes doc again
WHAT YEAR IS IT?!
2020-02-29 20:46:48 -08:00
s-show
21715210e2 [Docs] translated 'feature_tap_dance.md' to japanese. (#8137)
* complete translation.

* Update docs/ja/feature_tap_dance.md

Update the file based on the suggestions.

* Update docs/ja/feature_tap_dance.md

Update the file based on the suggestions.

* Apply suggestions from code review

Update the file based on the suggestions.

* Apply suggestions from code review

Update the file based on the suggestions (Part 2).

* Apply suggestions from code review

Update the file based on the suggestions (Part 3).

* Apply suggestions from code review

Update the file based on the suggestions (Part 3).

* Apply suggestions from code review

Update the file based on the suggestions (Part 4).

* Apply suggestions from code review

Update the file based on the suggestions (Part 5).
ご提案いただいた修正案は全て確認できました。
続いて、コメント行の調整、「打つ・叩く」の変更、その他の修正を行います。

* fixed typo.

* Update the file based on the suggestions (Part 6).

* Update the file based on the suggestions (Part 7).

* Fixed sentence.

* Update docs/ja/feature_tap_dance.md

Update the file based on the suggestions (Part 8).

* Update the file based on the suggestions (Part 9).

Co-Authored-By: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
Co-Authored-By: shela <shelaf@users.noreply.github.com>
2020-02-29 20:22:15 -08:00
Joel Challis
f74c769a19 PWM DMA based RGB Underglow for STM32 (#7928)
* Add pwm ws2812 driver

* Add docs for pwm ws2812 driver

* Update ws2812_pwm for ChibiOS 19

Co-Authored-By: Nick Brassel <nick@tzarc.org>

Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-03-01 13:05:56 +11:00
holtenc
bb47236490 Add VIA support to Prime_M. Clean up all files (#8247)
* Add VIA support for Prime_L

* Update keyboards/primekb/prime_l/v1/config.h

* Add prime_exl_plus keyboard

* Temporary removal of prime_exl_plus

* Add Prime_EXL Plus, including VIA support

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/rules.mk

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keymap.c

* correct spacing of keymaps and layout macro. move indicator logic from user space to keyboard space

* further corrections to keymaps and layout macro.

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update prime_exl_plus.c

* small edit to prime_exl_plus.c

* Add via support to Prime_M and clean things up

* Update rules.mk

* Update keyboards/primekb/prime_m/readme.md

* Update keyboards/primekb/prime_m/readme.md

* Update keyboards/primekb/prime_m/config.h
2020-02-29 17:42:50 -08:00
Nick Brassel
f5d1409c26 Track master branches for lib/chibios, lib/chibios-contrib, lib/ugfx. (#8273) 2020-03-01 11:51:38 +11:00
Nick Brassel
d0c3acbe3e Allow for ChibiOS 20.x (master), as well as enabling ChibiOS-Contrib HAL. (#8272) 2020-03-01 11:50:49 +11:00
Joel Challis
c775104b9f Use nano specs (#8270) 2020-03-01 11:49:16 +11:00
Joel Challis
8d9c800da0 Unconditionally enable ChibiOS syscalls (#8268)
* Enable syscalls all the time

* fix whitespace
2020-03-01 09:45:21 +11:00
James Young
cae91510dc Breaking Changes documentation fixes 2020-02-29 12:30:38 -08:00
James Young
26eef35f07 2020 February 29 Breaking Changes Update (#8064) 2020-02-29 11:59:30 -08:00
James Young
85041ff05b Update Breaking Changes checklist 2020-02-27 12:03:30 -08:00
James Young
7eab5ad60f Update Breaking Changes timeline
I've been working from one timeline while the docs said something different.
2020-02-27 11:17:23 -08:00
James Young
ae46e6ace9 Fix MCU rule for Wete (#8254)
Including the `xB` suffix prevents qmk_compiler (and thus QMK Configurator) from compiling firmware for the Wete.

Rolling this change back until we work out a long-term solution for the suffixes.
2020-02-27 20:40:31 +11:00
Nick Brassel
444fd3b1cc Add support for delays in send_string. (#8244) 2020-02-27 20:38:19 +11:00
Brandon Schlack
e18be69104 Add community layout support to KBD67 MKIIRGB v2 (#8249) 2020-02-27 13:19:34 +11:00
Mikkel Jeppesen
4667bc554e Fixed OS detection such that OSX doesn't take over the world (#8248) 2020-02-26 10:12:13 +01:00
holtenc
d52cd8886c [Keyboard] Add Prime_EXL Plus to handwired (#8238)
* Add VIA support for Prime_L

* Update keyboards/primekb/prime_l/v1/config.h

* Add prime_exl_plus keyboard

* Temporary removal of prime_exl_plus

* Add Prime_EXL Plus, including VIA support

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/readme.md

* Update keyboards/handwired/prime_exl_plus/rules.mk

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keyboards/handwired/prime_exl_plus/info.json

* Update keymap.c

* correct spacing of keymaps and layout macro. move indicator logic from user space to keyboard space

* further corrections to keymaps and layout macro.

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update keyboards/handwired/prime_exl_plus/prime_exl_plus.c

* Update prime_exl_plus.c

* small edit to prime_exl_plus.c
2020-02-25 13:21:59 -08:00
QMK Bot
61b71320f7 format code according to conventions [skip ci] 2020-02-25 18:57:18 +00:00
ridingqwerty
b949343b78 New feature: PERMISSIVE_HOLD_PER_KEY (#7994)
* Implement 'PERMISSIVE_HOLD_PER_KEY'

* Document 'PERMISSIVE_HOLD_PER_KEY'

Co-authored-by: GeorgeKoenig <35542036+GeorgeKoenig@users.noreply.github.com>
2020-02-25 13:25:52 -05:00
Joel Challis
f6111d49bb Split - Avoid race condition during matrix_init_quantum (#8235)
* Avoid race condition during matrix_init_quantum

* spelling is hard
2020-02-25 14:10:04 +00:00
Joel Challis
891d28a379 Acheron VIA support (#8204)
* Update acheron USB IDs

* Add shark via keymap

* Update austin via keymap

* Fix eeprom build error

* 3 layers fit
2020-02-25 11:28:07 +00:00
Ryan
bb8d4b4d23 send_unicode_string(): Add support for code points > 0xFFFF (#8236) 2020-02-25 12:54:51 +11:00
Ramon Imbao
93c5307fd6 [Keyboard] Add Wete (#8229)
* [Keyboard] Add Wete

* Fix width and height in Wete info.json

* Use default board files, core backlight, and disable RTC

* Disable I2C, SPI. Minor corrections

* Keymap typo update

* Add LAYOUT_all to info.json

* Remove extra spaces in README, delete matrix_*_kb functions

* Fix layout errors in wete.h, and some minor corrections

* Actually fix LAYOUT_all in info.json
2020-02-24 17:36:30 -08:00
Ryan
088b64ab3d Improvements to extrakey HID descriptors (#8156) 2020-02-25 12:18:11 +11:00
MechMerlin
ef8878fba5 Hineybush h87a lock indicators (#8237)
* move lighting code from VIA into the keyboard's .c file so that every keymap can access it

* after some serious conversations with default and wkl, they agreed to let me modify their keymaps. They weren't too happy
2020-02-24 12:04:40 -08:00
holtenc
f673c965ba Add VIA support for Prime_L (#8233)
* Add VIA support for Prime_L

* Update keyboards/primekb/prime_l/v1/config.h

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Add prime_exl_plus keyboard

* Temporary removal of prime_exl_plus

Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-02-24 14:19:27 +00:00
Josh Johnson
a2c0c1479c Hub16 - Bug removal + clean up code (#8227)
* bugfixes + cleaned up code

* typo

* Update keyboards/hub16/keymaps/no_mod/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-02-24 14:14:09 +00:00
ai03
20e1c8c571 [Keyboard] ai03 Equinox (#8224)
Re-attempt to add Equinox with newer Via changes

* Add nox

* Tweak based on previous pullrequests

* Add necessary descriptions

* Modernize Via config

* Modernize old files with massive blocks of unneeded options

* Fix missing bootmagic

* Update keyboards/ai03/equinox/equinox.h

* Update keyboards/ai03/equinox/keymaps/default/keymap.c

* Update keyboards/ai03/equinox/keymaps/via/keymap.c

* Update keyboards/ai03/equinox/keymaps/via/readme.md

* Update keyboards/ai03/equinox/readme.md

* Update keyboards/ai03/equinox/readme.md

* Update keyboards/ai03/equinox/readme.md

* Update keyboards/ai03/equinox/info.json

* Update keyboards/ai03/equinox/keymaps/default/keymap.c

* Update keyboards/ai03/equinox/keymaps/default/keymap.c

* Update keyboards/ai03/equinox/keymaps/proto_via/keymap.c

* Update keyboards/ai03/equinox/keymaps/proto_via/keymap.c

* Update keyboards/ai03/equinox/keymaps/proto_via/keymap.c

* Update keyboards/ai03/equinox/keymaps/proto_via/keymap.c

* Update keyboards/ai03/equinox/keymaps/via/keymap.c

* Update keyboards/ai03/equinox/keymaps/via/keymap.c

* Update keyboards/ai03/equinox/keymaps/via/keymap.c

* Fix indents

* Update keyboards/ai03/equinox/keymaps/proto_via/rules.mk

* Update keyboards/ai03/equinox/rules.mk
2020-02-23 21:18:14 -08:00
carlxia
40f7981395 [Keyboard] Add zfrontier/big_switch (#8205)
* add zfrontier/big_switch

* Update keyboards/zfrontier/big_switch/config.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/zfrontier/big_switch/config.h

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/zfrontier/big_switch/keymaps/longtap/keymap.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* add overriding keymap makefile

* Update keyboards/zfrontier/big_switch/keymaps/longtap/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update keyboards/zfrontier/big_switch/keymaps/default/keymap.c

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* remove redundant defines

* taplong no longer needed

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-02-24 14:04:26 +11:00
yiancar
156c9c4ec0 Gingham Update (#8225) 2020-02-24 11:25:18 +11:00
Ryan
371ff9dd6f A proper send_string() for the Unicode feature (#8155) 2020-02-24 10:27:25 +11:00
Nick Brassel
716c29881c Rollback PR #7967 in preference of fixing I2C start/stop properly, in a followup PR. (#8173) 2020-02-24 10:08:00 +11:00
Joel Challis
f76f9c7d2a Add mouse support to SEND_STRING (#8223)
* Add mouse support to SEND_STRING

* add short forms
2020-02-23 14:03:01 -08:00
Jez Cope
530c997638 Add link to "Useful functions" in macro docs (#7446)
* Add link to "Useful functions" in macro docs

Help people find additional features they can activate within a macro

* Update docs/feature_macros.md

Co-Authored-By: Drashna Jaelre <drashna@live.com>

Co-authored-by: skullydazed <skullydazed@users.noreply.github.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-02-23 12:50:11 -08:00
Akaash Suresh
b353028ea5 New functionality for cformat (#7893)
Fixing complexity

remove lambda

PR review fixes #1

Removing unneccesary string substitution

Handle -a and specified files

Complexity rewrite, use pathlib
2020-02-22 20:57:19 -08:00
yiancar
eb9c2429c6 Update main.c (#8198) 2020-02-22 10:10:41 -05:00
QMK Bot
1327208449 format code according to conventions [skip ci] 2020-02-22 03:41:27 +00:00
Nick Winans
d99404388f Fix QWIIC OLED for AVR (#7769)
* Fix QWIIC OLED for AVR

* Change missed width * width to width * height

* Fix typo in comment

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* Fix last incorrect uses of LCDWIDTH

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-02-22 14:11:25 +11:00
MechMerlin
3157f5f436 VIA Support: KBD75 rev1/rev2 (#8214)
* add a VIA keymap for kbd75

* rev2 is a completely different pcb allowing a NEW layout, setting this to have a different product id so users don't get confused when they're able to enable numpad layout on rev1 VIA

* Update keyboards/kbdfans/kbd75/rev1/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/kbdfans/kbd75/rev2/config.h

Co-Authored-By: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-02-21 18:21:02 +00:00
Andrew Kannan
8d11359886 Update TMOv2 for new key (#7759)
* Update TMOv2 for new keymap

* Update based on PR changes
2020-02-21 17:22:58 +00:00
Elisiano Petrini
a4af41cb13 Added custom keymap for preonic (#7548)
* Added custom keymap

* Update keyboards/preonic/keymaps/elisiano/keymap.c

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* Address PR comments and added CTL_T(KC_ESC) on other layouts as well

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-02-21 11:16:39 -05:00
Ryan
032fbf3f24 Add Danish keymap and sendstring LUT (#8218) 2020-02-21 14:40:28 +01:00
QMK Bot
a7d859dab8 format code according to conventions [skip ci] 2020-02-21 11:04:05 +00:00
Drashna Jaelre
1751c3cc25 uart.c fix from TMK (#7628)
* uart.c fix from TMK

Backport from tmk/tmk_keyboard@c41e48a0ab

* Avoid deadlock when uart.c is usind in ISR

Backport from tmk/tmk_keyboard@55443fabb7
2020-02-21 21:32:30 +11:00
Andrew Kannan
67ee050a0e S75 Encoder Fixes (#7758)
* S75 Encoder Fixes

* Flip encoder pins vs using setting
2020-02-21 21:25:17 +11:00
Ryan
562482c234 Add Turkish keymap aliases and sendstring LUT (#7676)
* Add Turkish keymap aliases and sendstring LUT

* Split into F and Q layouts
2020-02-21 18:21:38 +11:00
Ryan
66d7fc34b2 Add Arm Teensys to mcu_selection.mk (#8026)
* Add Arm Teensys to mcu_selection.mk

* Roll back halfkeyboard keymap changes

* Remove extra newline
2020-02-21 17:12:15 +11:00
swanmatch
81423cc817 [New keyboard]silverbullet44 (#7950)
* make silverbullet44

* comment edit

* venderID

* Fix parentheses in macros, and in general clean up quantum.h (#5021)

* Fix up GPIO macros

* Fix up send string macros

`string` arguments must not be parenthesized

* Fix up miscellaneous macros

* Make indentation uniform (4 spaces)

* Make #ifdef vs #if defined usage consistent

* Reorder standard includes

* Revert indentation changes as per review comments

* Revert #if defined(__AVR__) → #ifdef __AVR__ change

* Change 2 space indent to 4 spaces on a couple of lines

* Replace include guard with #pragma once

* alt+tab

* copy from master:silverbullet44

* adjust for pull request

* clang-format

* create info.json

* Delete new_project.sh

* Update keyboards/silverbullet44/keymaps/default/config.h

Co-Authored-By: Max Rumpf <max.rumpf1998@gmail.com>

* Update keyboards/silverbullet44/silverbullet44.c

Co-Authored-By: Max Rumpf <max.rumpf1998@gmail.com>

* Update keyboards/silverbullet44/silverbullet44.h

Co-Authored-By: Max Rumpf <max.rumpf1998@gmail.com>

* Apply suggestions from Maxr1998

* format default keymap

* Apply suggestions from Maxr1998 (#2)

* Apply suggestions from fauxpark

* fix readme.md

* Apply suggestion from Maxr1998. (custom_keycode to MO(_ADJUST))

* I became a tricky! Hahaha!!

* Add original keymap made by FKML

* deleated at config.h

* Changed Copyright

* Delete
// Defines the keycodes used by our macros in process_record_user
//enum custom_keycodes {
//  QMKBEST = SAFE_RANGE,
//  QMKURL
//};

* Delete bool alt_pressed = false;

* Delete ADJUST

* Delete /

* Delete void matrix_scan_user(void) {

}

void led_set_user(uint8_t usb_led) {

}

* Change Copyright's year.

* Delete adjust

* Delete adjust

* Delete adjust

* 列挙型に変更

* Enclose  keymap with ```.

* Delete
#define _______ KC_TRNS
#define XXXXXXX KC_NO

* Fix indentation.

* Delete some rows.

* Aligned columns of ''readme.md''.

* I got god's keymap...hahaha:)

* Update keyboards/silverbullet44/readme.md

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* Update keyboards/silverbullet44/rules.mk

Co-Authored-By: fauxpark <fauxpark@gmail.com>

Co-authored-by: Konstantin Đorđević <vomindoraan@gmail.com>
Co-authored-by: Max Rumpf <max.rumpf1998@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-02-21 16:59:36 +11:00
Joel Challis
7707724dc4 Allow 30us matrix delay to be keyboard/user overridable (#8216)
* Allow 30us matrix delay to be configurable via define

* Move wait logic to matrix_common

* Move wait logic to matrix_common - fix wait includes
2020-02-21 14:49:33 +11:00
holtenc
42d6270f28 Merge /prime_l and /prime_l_v2 (#8194)
* correct indicator light states.

function of indicator lights was inverted. these changes correct that.

* flesh out keymaps pre production

* Enable extrakey in rules

* Prime_BLE initial commit

* Initial commit for Prime_L V2

* Update info.json

correct key spacing.

* update copyright

* Update readme.md

* Inital commit

* updates before PR into QMK master

* Drop Prime_EXL Plus from PR. Make requested changes to Prime_L V2

* Rename keyboards/primekb/Prime_l_v2/config.h to keyboards/primekb/prime_l_v2/config.h

* Rename keyboards/primekb/prime_l_v2/config.h to keyboards/primekb/Prime_l_v2/config.h

* remove directory Prime_l_v2

* re-submit with proper folder name.

* Restructure /primekb directory to merge /prime_l and /prime_l_v2

* made changes requested by QMK reviewers

* Update keyboards/primekb/prime_l/v1/readme.md

* Update keyboards/primekb/prime_l/v1/readme.md

* Update keyboards/primekb/prime_l/v1/readme.md
2020-02-19 11:12:11 -08:00
buzzlighter1
19c9141473 [Keymap] Keymap for XD75 with 7U spacebar EN-RU gamers (#8184)
* Create readme.md

* Create keymap.c

* Create config.h

* Create rules.mk

* Create layers.json

* Update keyboards/xd75/keymaps/buzzlighter1/keymap.c

* Update keyboards/xd75/keymaps/buzzlighter1/keymap.c

* Delete layers.json
2020-02-19 11:08:21 -08:00
asymy
c4dce3b5a7 Add VIA support for kbd8x mk2 (#8168)
* added via keymap for kbd8x mkii

* adding via to kbd8x mk2

* modified via kbd8x mk2 keymap

* enable LTO kbd8x mk2 via keymap

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* removed backticks kbd8x mk2 via keymap

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-02-20 00:50:25 +11:00
Jonathan Rascher
443bd98041 Move Grave/Tilde and some lesser used keys on my ergo boards (#8200)
* Move Grave/Tilde keys to more convenient places

* Move Ins/Del and some other keys around

* Update KLE images
2020-02-20 00:45:13 +11:00
Blake C. Lewis
419002a63b [Keyboard] KC60SE cleanup (#8171)
* coding style cleanup, enable/disable misconfigured/broken features

* add SCLN missing, compile with backlight PWM  warning

* edit json

* new info.json from KLE

* new info.json from KLE using QMK converter

* changes notes

* notes in pull request

* missing line in comments

* line wrap

* Update keyboards/kc60se/config.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/keymaps/default/keymap.c

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/kc60se.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/rules.mk

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* comment back in rules.mk

* add  2 iso layouts and keymaps, 1 ansi kemap, compiled and tested

* keymaps and info

* Delete keymap.c

not ready, I need to get a few iso characters corrected

* Delete keymap.c

not ready, need to get a few iso character define correctly

* Update info.json

Bspc to Backspace

* no unicode

* gui_on and gui_off in readme

* Update keyboards/kc60se/rules.mk

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* remove is_command

* Update keyboards/kc60se/config.h

remove comment

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* Update keyboards/kc60se/config.h

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* Update keyboards/kc60se/readme.md

Co-Authored-By: fauxpark <fauxpark@gmail.com>

* remove \\ in keymaps

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/kc60se.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/kc60se.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/kc60se.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/kc60se.h

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/kc60se/info.json

Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>

* set led pin b2 to output mode in matrix_init_kb(), toggle it in led_update_kb()

* Update config.h

I had commented  FORCE_NKRO out.. WHy did it com back?

Co-authored-by: Check your git settings! <chris@chris-laptop>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-02-19 01:12:52 -08:00
Mikkel Jeppesen
1566f0a997 Made windows driver installation accept y as All to allow CI (#8189)
* Made windows driver installation accept y as all to allow CI

* Fix some formatting

* Made None default
2020-02-18 12:05:20 -08:00
gtips
8225b172b9 Change the image photo of /keyboards/reviung41/readme.md (#8195)
* Update readme.md

Change the image photo of readme.md.
2020-02-17 20:34:23 -08:00
Jumail Mundekkat
0f500eb336 MxSS RGB Handler Touchup (#8105)
* Minor fix to improve front LED brightness config

* Updated rgblight.c
2020-02-18 14:05:22 +11:00
James Young
675ac4ac4a Centromere Configurator layout support and readme update (#8190)
* Add Configurator layout data

* update readme
2020-02-18 13:04:43 +11:00
Wilba
79d5903b6c dynamic keymap sanity check (#8181) 2020-02-17 17:54:13 -08:00
Joel Challis
a2081171de [keyboard] Austin (#8176)
* Add austin keyboard

* Update to use spi ws2812 driver

* remove rgb
2020-02-18 00:54:15 +00:00
skullydazed
c66930445f Use pathlib everywhere we can (#7872)
* Use pathlib everywhere we can

* Update lib/python/qmk/path.py

Co-Authored-By: Erovia <Erovia@users.noreply.github.com>

* Update lib/python/qmk/path.py

Co-Authored-By: Erovia <Erovia@users.noreply.github.com>

* Improvements based on @erovia's feedback

* rework qmk compile and qmk flash to use pathlib

* style

* Remove the subcommand_name argument from find_keyboard_keymap()

Co-authored-by: Erovia <Erovia@users.noreply.github.com>
2020-02-17 11:42:11 -08:00
shela
58724f8dcb [Docs] Update Japanese translation of cli.md (#8188) 2020-02-17 11:10:16 -08:00
Mike Tsao
e7e38fe80e Conform Gherkin defaults to original TMK keymap (#8186)
* Conform defaults to original TMK keymap

* fix swapped PGUP/PGDN (thanks noroadsleft)

* Another typo
2020-02-17 11:08:13 -08:00
1605 changed files with 80605 additions and 23226 deletions

3
.gitignore vendored
View File

@@ -70,3 +70,6 @@ id_rsa_*
# python things
__pycache__
# prerequisites for updating ChibiOS
/util/fmpp*

4
.gitmodules vendored
View File

@@ -1,13 +1,15 @@
[submodule "lib/chibios"]
path = lib/chibios
url = https://github.com/qmk/ChibiOS
branch = master
[submodule "lib/chibios-contrib"]
path = lib/chibios-contrib
url = https://github.com/qmk/ChibiOS-Contrib
branch = k-type-fix
branch = master
[submodule "lib/ugfx"]
path = lib/ugfx
url = https://github.com/qmk/uGFX
branch = master
[submodule "lib/googletest"]
path = lib/googletest
url = https://github.com/google/googletest

View File

@@ -5,11 +5,13 @@
// Configure glob patterns for excluding files and folders.
"files.exclude": {
"**/.build": true,
"**/*.hex": true
"**/*.hex": true,
"**/*.bin": true
},
"files.associations": {
"*.h": "c",
"*.c": "c",
"*.inc": "c",
"*.cpp": "cpp",
"*.hpp": "cpp",
"xstddef": "c",

View File

@@ -623,13 +623,19 @@ endif
# Generate the version.h file
ifndef SKIP_GIT
GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
CHIBIOS_VERSION := $(shell cd lib/chibios && git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
CHIBIOS_CONTRIB_VERSION := $(shell cd lib/chibios-contrib && git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
else
GIT_VERSION := NA
CHIBIOS_VERSION := NA
CHIBIOS_CONTRIB_VERSION := NA
endif
ifndef SKIP_VERSION
BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h)
$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
$(shell echo '#define CHIBIOS_VERSION "$(CHIBIOS_VERSION)"' >> $(ROOT_DIR)/quantum/version.h)
$(shell echo '#define CHIBIOS_CONTRIB_VERSION "$(CHIBIOS_CONTRIB_VERSION)"' >> $(ROOT_DIR)/quantum/version.h)
else
BUILD_DATE := NA
endif

View File

@@ -23,4 +23,4 @@ endif
# Generate the keymap.c
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
bin/qmk json-keymap --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
bin/qmk json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)

View File

@@ -231,44 +231,19 @@ endif
# We can assume a ChibiOS target When MCU_FAMILY is defined since it's
# not used for LUFA
ifdef MCU_FAMILY
FIRMWARE_FORMAT?=bin
PLATFORM=CHIBIOS
PLATFORM_KEY=chibios
FIRMWARE_FORMAT?=bin
else ifdef ARM_ATSAM
PLATFORM=ARM_ATSAM
PLATFORM_KEY=arm_atsam
FIRMWARE_FORMAT=bin
else
PLATFORM=AVR
PLATFORM_KEY=avr
FIRMWARE_FORMAT?=hex
endif
ifeq ($(PLATFORM),CHIBIOS)
include $(TMK_PATH)/chibios.mk
OPT_OS = chibios
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
endif
endif
# Find all of the config.h files and add them to our CONFIG_H define.
CONFIG_H :=
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
@@ -304,11 +279,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
endif
# Save the defines and includes here, so we don't include any keymap specific ones
PROJECT_DEFS := $(OPT_DEFS)
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
PROJECT_CONFIG := $(CONFIG_H)
# Userspace setup and definitions
ifeq ("$(USER_NAME)","")
USER_NAME := $(KEYMAP)
@@ -354,23 +324,17 @@ SRC += $(TMK_COMMON_SRC)
OPT_DEFS += $(TMK_COMMON_DEFS)
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
ifeq ($(PLATFORM),AVR)
ifeq ($(strip $(PROTOCOL)), VUSB)
include $(TMK_PATH)/protocol/vusb.mk
include $(TMK_PATH)/$(PLATFORM_KEY).mk
ifneq ($(strip $(PROTOCOL)),)
include $(TMK_PATH)/protocol/$(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')).mk
else
include $(TMK_PATH)/protocol/lufa.mk
endif
include $(TMK_PATH)/avr.mk
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
endif
ifeq ($(PLATFORM),ARM_ATSAM)
include $(TMK_PATH)/arm_atsam.mk
include $(TMK_PATH)/protocol/arm_atsam.mk
endif
ifeq ($(PLATFORM),CHIBIOS)
include $(TMK_PATH)/protocol/chibios.mk
endif
# TODO: remove this bodge?
PROJECT_DEFS := $(OPT_DEFS)
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
PROJECT_CONFIG := $(CONFIG_H)
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer

View File

@@ -41,6 +41,7 @@ all: elf
VPATH += $(COMMON_VPATH)
PLATFORM:=TEST
PLATFORM_KEY:=test
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include tests/$(TEST)/rules.mk

View File

@@ -13,52 +13,42 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
SERIAL_DIR := $(QUANTUM_DIR)/serial_link
SERIAL_PATH := $(QUANTUM_PATH)/serial_link
SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
SERIAL_DEFS += -DSERIAL_LINK_ENABLE
COMMON_VPATH += $(SERIAL_PATH)
QUANTUM_SRC += \
$(QUANTUM_DIR)/quantum.c \
$(QUANTUM_DIR)/keymap_common.c \
$(QUANTUM_DIR)/keycode_config.c
ifeq ($(strip $(API_SYSEX_ENABLE)), yes)
OPT_DEFS += -DAPI_SYSEX_ENABLE
SRC += $(QUANTUM_DIR)/api/api_sysex.c
OPT_DEFS += -DAPI_ENABLE
SRC += $(QUANTUM_DIR)/api.c
MIDI_ENABLE=yes
SRC += $(QUANTUM_DIR)/api/api_sysex.c
SRC += $(QUANTUM_DIR)/api.c
endif
MUSIC_ENABLE := 0
ifeq ($(strip $(AUDIO_ENABLE)), yes)
OPT_DEFS += -DAUDIO_ENABLE
MUSIC_ENABLE := 1
MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
ifeq ($(PLATFORM),AVR)
SRC += $(QUANTUM_DIR)/audio/audio.c
else
SRC += $(QUANTUM_DIR)/audio/audio_arm.c
endif
SRC += $(QUANTUM_DIR)/audio/audio_$(PLATFORM_KEY).c
SRC += $(QUANTUM_DIR)/audio/voices.c
SRC += $(QUANTUM_DIR)/audio/luts.c
endif
ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE
MUSIC_ENABLE := 1
MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
endif
ifeq ($(MUSIC_ENABLE), 1)
MUSIC_ENABLE ?= no
ifeq ($(MUSIC_ENABLE), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
endif
ifeq ($(strip $(COMBO_ENABLE)), yes)
OPT_DEFS += -DCOMBO_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
endif
ifeq ($(strip $(STENO_ENABLE)), yes)
OPT_DEFS += -DSTENO_ENABLE
VIRTSER_ENABLE ?= yes
@@ -80,28 +70,6 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/pointing_device.c
endif
ifeq ($(strip $(UCIS_ENABLE)), yes)
OPT_DEFS += -DUCIS_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
endif
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
OPT_DEFS += -DUNICODEMAP_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
endif
ifeq ($(strip $(UNICODE_ENABLE)), yes)
OPT_DEFS += -DUNICODE_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
endif
ifeq ($(strip $(UNICODE_COMMON)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
endif
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c
EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
@@ -141,6 +109,10 @@ else
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
OPT_DEFS += -DEEPROM_EMU_STM32F072xB
OPT_DEFS += -DSTM32_EEPROM_ENABLE
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
OPT_DEFS += -DEEPROM_DRIVER
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
else
# This will effectively work the same as "transient" if not supported by the chip
SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
@@ -159,7 +131,6 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/color.c
SRC += $(QUANTUM_DIR)/rgblight.c
CIE1931_CURVE := yes
LED_BREATHING_TABLE := yes
RGB_KEYCODES_ENABLE := yes
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
@@ -246,31 +217,18 @@ ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
OPT_DEFS += -DTAP_DANCE_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
endif
ifeq ($(strip $(KEY_LOCK_ENABLE)), yes)
OPT_DEFS += -DKEY_LOCK_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_key_lock.c
endif
ifeq ($(strip $(PRINTING_ENABLE)), yes)
OPT_DEFS += -DPRINTING_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
SRC += $(TMK_DIR)/protocol/serial_uart.c
endif
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
OPT_DEFS += -DAUTO_SHIFT_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes)
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS
endif
endif
ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
SERIAL_DEFS += -DSERIAL_LINK_ENABLE
COMMON_VPATH += $(SERIAL_PATH)
SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
OPT_DEFS += $(SERIAL_DEFS)
VAPTH += $(SERIAL_PATH)
@@ -304,17 +262,17 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
COMMON_VPATH += $(QUANTUM_DIR)/backlight
SRC += $(QUANTUM_DIR)/backlight/backlight.c
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
OPT_DEFS += -DBACKLIGHT_ENABLE
ifeq ($(strip $(BACKLIGHT_DRIVER)), custom)
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER
else ifeq ($(strip $(BACKLIGHT_DRIVER)), software)
SRC += $(QUANTUM_DIR)/backlight/backlight_soft.c
else
ifeq ($(PLATFORM),AVR)
SRC += $(QUANTUM_DIR)/backlight/backlight_avr.c
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm)
SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c
else
SRC += $(QUANTUM_DIR)/backlight/backlight_arm.c
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c
endif
endif
endif
@@ -350,11 +308,6 @@ ifeq ($(strip $(CIE1931_CURVE)), yes)
LED_TABLES := yes
endif
ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
OPT_DEFS += -DUSE_LED_BREATHING_TABLE
LED_TABLES := yes
endif
ifeq ($(strip $(LED_TABLES)), yes)
SRC += $(QUANTUM_DIR)/led_tables.c
endif
@@ -369,34 +322,16 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes)
include $(TMK_DIR)/protocol/usb_hid.mk
endif
ifeq ($(strip $(WPM_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/wpm.c
OPT_DEFS += -DWPM_ENABLE
endif
ifeq ($(strip $(ENCODER_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/encoder.c
OPT_DEFS += -DENCODER_ENABLE
endif
HAPTIC_ENABLE ?= no
ifneq ($(strip $(HAPTIC_ENABLE)),no)
COMMON_VPATH += $(DRIVER_PATH)/haptic
SRC += haptic.c
OPT_DEFS += -DHAPTIC_ENABLE
endif
ifneq ($(filter DRV2605L, $(HAPTIC_ENABLE)), )
SRC += DRV2605L.c
QUANTUM_LIB_SRC += i2c_master.c
OPT_DEFS += -DDRV2605L
endif
ifneq ($(filter SOLENOID, $(HAPTIC_ENABLE)), )
SRC += solenoid.c
OPT_DEFS += -DSOLENOID_ENABLE
endif
ifeq ($(strip $(HD44780_ENABLE)), yes)
SRC += drivers/avr/hd44780.c
OPT_DEFS += -DHD44780_ENABLE
endif
ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
OPT_DEFS += -DVELOCIKEY_ENABLE
SRC += $(QUANTUM_DIR)/velocikey.c
@@ -415,26 +350,11 @@ ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/dynamic_keymap.c
endif
ifeq ($(strip $(LEADER_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c
OPT_DEFS += -DLEADER_ENABLE
endif
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/dip_switch.c
OPT_DEFS += -DDIP_SWITCH_ENABLE
OPT_DEFS += -DDIP_SWITCH_ENABLE
SRC += $(QUANTUM_DIR)/dip_switch.c
endif
include $(DRIVER_PATH)/qwiic/qwiic.mk
QUANTUM_SRC:= \
$(QUANTUM_DIR)/quantum.c \
$(QUANTUM_DIR)/keymap_common.c \
$(QUANTUM_DIR)/keycode_config.c
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
CUSTOM_MATRIX ?= no
@@ -492,6 +412,29 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
COMMON_VPATH += $(QUANTUM_PATH)/split_common
endif
HAPTIC_ENABLE ?= no
ifneq ($(strip $(HAPTIC_ENABLE)),no)
COMMON_VPATH += $(DRIVER_PATH)/haptic
SRC += haptic.c
OPT_DEFS += -DHAPTIC_ENABLE
endif
ifneq ($(filter DRV2605L, $(HAPTIC_ENABLE)), )
SRC += DRV2605L.c
QUANTUM_LIB_SRC += i2c_master.c
OPT_DEFS += -DDRV2605L
endif
ifneq ($(filter SOLENOID, $(HAPTIC_ENABLE)), )
SRC += solenoid.c
OPT_DEFS += -DSOLENOID_ENABLE
endif
ifeq ($(strip $(HD44780_ENABLE)), yes)
SRC += drivers/avr/hd44780.c
OPT_DEFS += -DHD44780_ENABLE
endif
ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
OPT_DEFS += -DOLED_DRIVER_ENABLE
COMMON_VPATH += $(DRIVER_PATH)/oled
@@ -499,10 +442,34 @@ ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
SRC += oled_driver.c
endif
include $(DRIVER_PATH)/qwiic/qwiic.mk
ifeq ($(strip $(UCIS_ENABLE)), yes)
OPT_DEFS += -DUCIS_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
endif
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
OPT_DEFS += -DUNICODEMAP_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
endif
ifeq ($(strip $(UNICODE_ENABLE)), yes)
OPT_DEFS += -DUNICODE_ENABLE
UNICODE_COMMON := yes
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
endif
ifeq ($(strip $(UNICODE_COMMON)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
endif
SPACE_CADET_ENABLE ?= yes
ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
OPT_DEFS += -DSPACE_CADET_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
OPT_DEFS += -DSPACE_CADET_ENABLE
endif
MAGIC_ENABLE ?= yes
@@ -521,3 +488,31 @@ ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c
OPT_DEFS += -DDYNAMIC_MACRO_ENABLE
endif
ifeq ($(strip $(COMBO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
OPT_DEFS += -DCOMBO_ENABLE
endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
OPT_DEFS += -DTAP_DANCE_ENABLE
endif
ifeq ($(strip $(KEY_LOCK_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_key_lock.c
OPT_DEFS += -DKEY_LOCK_ENABLE
endif
ifeq ($(strip $(LEADER_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c
OPT_DEFS += -DLEADER_ENABLE
endif
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
OPT_DEFS += -DAUTO_SHIFT_ENABLE
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes)
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS
endif
endif

View File

@@ -0,0 +1,75 @@
# QMK Breaking Change - 2020 Feb 29 Changelog
Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
## Update ChibiOS/ChibiOS-Contrib/uGFX submodules
* General Notes
* A `make git-submodule` may be required after pulling the latest QMK firmware code to update affected submodules to the upgraded revisions
* Enabling link-time-optimization (`LINK_TIME_OPTIMIZATION_ENABLE = yes`) should work on a lot more boards
* Upgrade to ChibiOS ver19.1.3
* This will allow QMK to update to upstream ChibiOS a lot easier -- the old version was ~2 years out of date. Automated update scripts have been made available to simplify future upgrades.
* Includes improved MCU support and bugfixes
* ChibiOS revision is now included in Command output
* Timers should now be more accurate
* Upgrade to newer ChibiOS-Contrib
* Also includes improved MCU support and bugfixes
* ChibiOS-Contrib revision is now included in Command output
* Upgrade to newer uGFX
* Required in order to support updated ChibiOS
## Fix ChibiOS timer overflow for 16-bit SysTick devices
* On 16-bit SysTick devices, the timer subsystem in QMK was incorrectly dealing with overflow.
* When running at a 100000 SysTick frequency (possible on 16-bit devices, but uncommon), this overflow would occur after 0.65 seconds.
* Timers are now correctly handling this overflow case and timing should now be correct on ChibiOS/ARM.
## Update LUFA submodule
* Updates the LUFA submodule to include updates from upstream (abcminiuser/lufa)
* Includes some cleanup for QMK DFU generation
## Encoder flip
* Flips the encoder direction so that `clockwise == true` is for actually turning the knob clockwise
* Adds `ENCODER_DIRECTION_FLIP` define, so that reversing the expected dirction is simple for users.
* Cleans up documentation page for encoders
## Adding support for `BACKLIGHT_ON_STATE` for hardware PWM backlight
* Previously, the define only affected software PWM, and hardware PWM always assumed an N-channel MOSFET.
* The hardware PWM backlight setup has been updated to respect this option.
* The default "on" state has been changed to `1` - **this impacts all keyboards using software PWM backlight that do not define it explicitly**. If your keyboard's backlight is acting strange, it may have a P-channel MOSFET, and will need to have `#define BACKLIGHT_ON_STATE 0` added to the keyboard-level `config.h`. Please see the PR for more detailed information.
## Migrating `ACTION_LAYER_TAP_KEY()` entries in `fn_actions` to `LT()` keycodes
* `fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
* The end result of removing this obsolete feature should result in a decent reduction in firmware size and code complexity
* All keymaps affected are recommended to switch away from `fn_actions` in favour of the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
## Moving backlight keycode handling to `process_keycode/`
* This refactors the backlight keycode logic to be clearer and more modular.
* All backlight-related keycodes are now actioned in a single file.
* The `ACTION_BACKLIGHT_*` macros have also been deleted. If you are still using these in a `fn_actions[]` block, please switch to using the backlight keycodes or functions directly.
## Refactor Planck keymaps to use Layout Macros
* Refactor Planck keymaps to use layout macros instead of raw matrix assignments
* Makes keymaps revision-agnostic
* Should reduce noise and errors in Travis CI logs
## GON NerD codebase refactor
* Splits the codebase for GON NerD 60 and NerdD TKL PCBs into two separate directories.
* If your keymap is for a NerD 60 PCB, your `make` command is now `make gon/nerd60:<keymap>`.
* If your keymap is for a NerD TKL PCB, your `make` command is now `make gon/nerdtkl:<keymap>`.

View File

@@ -9,24 +9,35 @@
## What is QMK Firmware?
QMK (*Quantum Mechanical Keyboard*) is an open source community that maintains QMK Firmware, QMK Toolbox, qmk.fm, and these docs. QMK Firmware is a keyboard firmware based on the [tmk\_keyboard](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). It has also been ported to ARM chips using ChibiOS. You can use it to power your own hand-wired or custom keyboard PCB.
QMK (*Quantum Mechanical Keyboard*) is an open source community centered around developing computer input devices. The community encompasses all sorts of input devices, such as keyboards, mice, and MIDI devices. A core group of collaborators maintains [QMK Firmware](https://github.com/qmk/qmk_firmware), [QMK Configurator](https://config.qmk.fm), [QMK Toolbox](https://github.com/qmk/qmk_toolbox), [qmk.fm](https://qmk.fm), and this documentation with the help of community members like you.
## How to Get It
## Get Started
If you plan on contributing a keymap, keyboard, or features to QMK, the easiest thing to do is [fork the repo through Github](https://github.com/qmk/qmk_firmware#fork-destination-box), and clone your repo locally to make your changes, push them, then open a [Pull Request](https://github.com/qmk/qmk_firmware/pulls) from your fork.
Totally new to QMK? There are two ways to get started:
Otherwise, you can clone it directly with `git clone https://github.com/qmk/qmk_firmware`. Do not download the zip or tar files; a git repository is required to download the submodules in order to compile.
* Basic: [QMK Configurator](https://config.qmk.fm)
* Just select your keyboard from the dropdown and program your keyboard.
* We have an [introductory video](https://www.youtube.com/watch?v=-imgglzDMdY) you can watch.
* There is also an overview [document you can read](newbs_building_firmware_configurator.md).
* Advanced: [Use The Source](newbs.md)
* More powerful, but harder to use
## How to Compile
## Make It Yours
Before you are able to compile, you'll need to [install an environment](getting_started_build_tools.md) for AVR or/and ARM development. Once that is complete, you'll use the `make` command to build a keyboard and keymap with the following notation:
QMK has lots of [features](features.md) to explore, and a good deal of reference documentation to dig through. Most features are taken advantage of by modifying your [keymap](keymap.md), and changing the [keycodes](keycodes.md).
make planck/rev4:default
## Need help?
This would build the `rev4` revision of the `planck` with the `default` keymap. Not all keyboards have revisions (also called subprojects or folders), in which case, it can be omitted:
Check out the [support page](support.md) to see how you can get help using QMK.
make preonic:default
## Give Back
## How to Customize
There are a lot of ways you can contribute to the QMK Community. The easiest way to get started is to use it and spread the word to your friends.
QMK has lots of [features](features.md) to explore, and a good deal of [reference documentation](http://docs.qmk.fm) to dig through. Most features are taken advantage of by modifying your [keymap](keymap.md), and changing the [keycodes](keycodes.md).
* Help people out on our forums and chat rooms:
* [/r/olkb](https://www.reddit.com/r/olkb/)
* [Discord Server](https://discord.gg/Uq7gcHh)
* Contribute to our documentation by clicking "Edit This Page" at the bottom
* [Translate our documentation into your language](translating.md)
* [Report a bug](https://github.com/qmk/qmk_firmware/issues/new/choose)
* [Open a Pull Request](contributing.md)

View File

@@ -1,130 +1,162 @@
* [Complete Newbs Guide](newbs.md)
* [Getting Started](newbs_getting_started.md)
* Tutorial
* [Introduction](newbs.md)
* [Setup](newbs_getting_started.md)
* [Building Your First Firmware](newbs_building_firmware.md)
* [Flashing Firmware](newbs_flashing.md)
* [Testing and Debugging](newbs_testing_debugging.md)
* [Best Git Practices](newbs_git_best_practices.md)
* [Using Your Fork's Master](newbs_git_using_your_master_branch.md)
* [Resolving Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
* [Resynchronizing a Branch](newbs_git_resynchronize_a_branch.md)
* [Learning Resources](newbs_learn_more_resources.md)
* [Getting Help/Support](support.md)
* [Other Resources](newbs_learn_more_resources.md)
* [QMK Basics](README.md)
* [QMK Introduction](getting_started_introduction.md)
* [QMK CLI](cli.md)
* [QMK CLI Config](cli_configuration.md)
* [Contributing to QMK](contributing.md)
* [How to Use Github](getting_started_github.md)
* [Getting Help](getting_started_getting_help.md)
* [Breaking Changes](breaking_changes.md)
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
* [2019 Aug 30](ChangeLog/20190830.md)
* [FAQ](faq.md)
* FAQs
* [General FAQ](faq_general.md)
* [Build/Compile QMK](faq_build.md)
* [Debugging/Troubleshooting QMK](faq_debug.md)
* [Keymap](faq_keymap.md)
* [Driver Installation with Zadig](driver_installation_zadig.md)
* Detailed Guides
* [Install Build Tools](getting_started_build_tools.md)
* [Vagrant Guide](getting_started_vagrant.md)
* [Build/Compile Instructions](getting_started_make_guide.md)
* [Flashing Firmware](flashing.md)
* [Customizing Functionality](custom_quantum_functions.md)
* [Keymap Overview](keymap.md)
* [Hardware](hardware.md)
* [Compatible Microcontrollers](compatible_microcontrollers.md)
* [AVR Processors](hardware_avr.md)
* [Drivers](hardware_drivers.md)
* Reference
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* [Config Options](config_options.md)
* [Keycodes](keycodes.md)
* [Coding Conventions - C](coding_conventions_c.md)
* [Coding Conventions - Python](coding_conventions_python.md)
* [Documentation Best Practices](documentation_best_practices.md)
* [Documentation Templates](documentation_templates.md)
* [Keymap FAQ](faq_keymap.md)
* [Glossary](reference_glossary.md)
* [Unit Testing](unit_testing.md)
* [Useful Functions](ref_functions.md)
* [Configurator Support](reference_configurator_support.md)
* [info.json Format](reference_info_json.md)
* [Python CLI Development](cli_development.md)
* [Features](features.md)
* [Basic Keycodes](keycodes_basic.md)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* [Quantum Keycodes](quantum_keycodes.md)
* [Advanced Keycodes](feature_advanced_keycodes.md)
* [Audio](feature_audio.md)
* [Auto Shift](feature_auto_shift.md)
* [Backlight](feature_backlight.md)
* [Bluetooth](feature_bluetooth.md)
* [Bootmagic](feature_bootmagic.md)
* [Combos](feature_combo.md)
* [Command](feature_command.md)
* [Debounce API](feature_debounce_type.md)
* [DIP Switch](feature_dip_switch.md)
* [Dynamic Macros](feature_dynamic_macros.md)
* [Encoders](feature_encoders.md)
* [Grave Escape](feature_grave_esc.md)
* [Haptic Feedback](feature_haptic_feedback.md)
* [HD44780 LCD Controller](feature_hd44780.md)
* [Key Lock](feature_key_lock.md)
* [Layouts](feature_layouts.md)
* [Leader Key](feature_leader_key.md)
* [LED Matrix](feature_led_matrix.md)
* [Macros](feature_macros.md)
* [Mouse Keys](feature_mouse_keys.md)
* [OLED Driver](feature_oled_driver.md)
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys)
* [Pointing Device](feature_pointing_device.md)
* [PS/2 Mouse](feature_ps2_mouse.md)
* [RGB Lighting](feature_rgblight.md)
* [RGB Matrix](feature_rgb_matrix.md)
* [Space Cadet](feature_space_cadet.md)
* [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md)
* [Swap Hands](feature_swap_hands.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)
* [Velocikey](feature_velocikey.md)
* Configurator
* [Overview](newbs_building_firmware_configurator.md)
* [Step by Step](configurator_step_by_step.md)
* [Troubleshooting](configurator_troubleshooting.md)
* QMK API
* [Overview](api_overview.md)
* [API Documentation](api_docs.md)
* [Keyboard Support](reference_configurator_support.md)
* For Makers and Modders
* [Hand Wiring Guide](hand_wire.md)
* [ISP Flashing Guide](isp_flashing_guide.md)
* [ARM Debugging Guide](arm_debugging.md)
* [ADC Driver](adc_driver.md)
* [I2C Driver](i2c_driver.md)
* [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md)
* [GPIO Controls](internals_gpio_control.md)
* [Custom Matrix](custom_matrix.md)
* [Proton C Conversion](proton_c_conversion.md)
* CLI
* [Overview](cli.md)
* [Configuration](cli_configuration.md)
* [Commands](cli_commands.md)
* For a Deeper Understanding
* [How Keyboards Work](how_keyboards_work.md)
* [Understanding QMK](understanding_qmk.md)
* Using QMK
* Guides
* [Customizing Functionality](custom_quantum_functions.md)
* [Driver Installation with Zadig](driver_installation_zadig.md)
* [Keymap Overview](keymap.md)
* [Vagrant Guide](getting_started_vagrant.md)
* Flashing
* [Flashing](flashing.md)
* [Flashing ATmega32A (ps2avrgb)](flashing_bootloadhid.md)
* IDEs
* [Using Eclipse with QMK](other_eclipse.md)
* [Using VSCode with QMK](other_vscode.md)
* Git Best Practices
* [Introduction](newbs_git_best_practices.md)
* [Your Fork](newbs_git_using_your_master_branch.md)
* [Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
* [Fixing Your Branch](newbs_git_resynchronize_a_branch.md)
* Keyboard Building
* [Hand Wiring Guide](hand_wire.md)
* [ISP Flashing Guide](isp_flashing_guide.md)
* Other Topics
* [Using Eclipse with QMK](other_eclipse.md)
* [Using VSCode with QMK](other_vscode.md)
* [Support](support.md)
* [Translating the QMK Docs](translating.md)
* Simple Keycodes
* [Full List](keycodes.md)
* [Basic Keycodes](keycodes_basic.md)
* [Modifier Keys](feature_advanced_keycodes.md)
* [Quantum Keycodes](quantum_keycodes.md)
* QMK Internals (In Progress)
* [Defines](internals_defines.md)
* [Input Callback Reg](internals_input_callback_reg.md)
* [Midi Device](internals_midi_device.md)
* [Midi Device Setup Process](internals_midi_device_setup_process.md)
* [Midi Util](internals_midi_util.md)
* [Send Functions](internals_send_functions.md)
* [Sysex Tools](internals_sysex_tools.md)
* Advanced Keycodes
* [Command](feature_command.md)
* [Dynamic Macros](feature_dynamic_macros.md)
* [Grave Escape](feature_grave_esc.md)
* [Leader Key](feature_leader_key.md)
* [Mod-Tap](mod_tap.md)
* [Macros](feature_macros.md)
* [Mouse Keys](feature_mouse_keys.md)
* [Space Cadet Shift](feature_space_cadet.md)
* [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
* Software Features
* [Auto Shift](feature_auto_shift.md)
* [Combos](feature_combo.md)
* [Debounce API](feature_debounce_type.md)
* [Key Lock](feature_key_lock.md)
* [Layers](feature_layers.md)
* [One Shot Keys](one_shot_keys.md)
* [Pointing Device](feature_pointing_device.md)
* [Swap Hands](feature_swap_hands.md)
* [Tap Dance](feature_tap_dance.md)
* [Tap-Hold Configuration](tap_hold.md)
* [Terminal](feature_terminal.md)
* [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md)
* [WPM Calculation](feature_wpm.md)
* Hardware Features
* Displays
* [HD44780 LCD Controller](feature_hd44780.md)
* [OLED Driver](feature_oled_driver.md)
* Lighting
* [Backlight](feature_backlight.md)
* [LED Matrix](feature_led_matrix.md)
* [RGB Lighting](feature_rgblight.md)
* [RGB Matrix](feature_rgb_matrix.md)
* [Audio](feature_audio.md)
* [Bluetooth](feature_bluetooth.md)
* [Bootmagic](feature_bootmagic.md)
* [Custom Matrix](custom_matrix.md)
* [DIP Switch](feature_dip_switch.md)
* [Encoders](feature_encoders.md)
* [Haptic Feedback](feature_haptic_feedback.md)
* [Proton C Conversion](proton_c_conversion.md)
* [PS/2 Mouse](feature_ps2_mouse.md)
* [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md)
* [Thermal Printer](feature_thermal_printer.md)
* [Velocikey](feature_velocikey.md)
* Developing QMK
* Breaking Changes
* [Overview](breaking_changes.md)
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
* History
* [2020 Feb 29](ChangeLog/20200229.md)
* [2019 Aug 30](ChangeLog/20190830.md)
* C Development
* [ARM Debugging Guide](arm_debugging.md)
* [AVR Processors](hardware_avr.md)
* [Coding Conventions](coding_conventions_c.md)
* [Compatible Microcontrollers](compatible_microcontrollers.md)
* [Drivers](hardware_drivers.md)
* [ADC Driver](adc_driver.md)
* [I2C Driver](i2c_driver.md)
* [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md)
* [GPIO Controls](internals_gpio_control.md)
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
* Python Development
* [Coding Conventions](coding_conventions_python.md)
* [QMK CLI Development](cli_development.md)
* Configurator Development
* QMK API
* [Development Environment](api_development_environment.md)
* [Architecture Overview](api_development_overview.md)
* QMK Reference
* [Contributing to QMK](contributing.md)
* [Translating the QMK Docs](translating.md)
* [Config Options](config_options.md)
* [Make Documentation](getting_started_make_guide.md)
* [Documentation Best Practices](documentation_best_practices.md)
* [Documentation Templates](documentation_templates.md)
* [Community Layouts](feature_layouts.md)
* [Unit Testing](unit_testing.md)
* [Useful Functions](ref_functions.md)
* [info.json Format](reference_info_json.md)
* For a Deeper Understanding
* [How Keyboards Work](how_keyboards_work.md)
* [How a Matrix Works](how_a_matrix_works.md)
* [Understanding QMK](understanding_qmk.md)
* QMK Internals (In Progress)
* [Defines](internals_defines.md)
* [Input Callback Reg](internals_input_callback_reg.md)
* [Midi Device](internals_midi_device.md)
* [Midi Device Setup Process](internals_midi_device_setup_process.md)
* [Midi Util](internals_midi_util.md)
* [Send Functions](internals_send_functions.md)
* [Sysex Tools](internals_sysex_tools.md)

View File

@@ -2,7 +2,7 @@
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders.md).
This driver is currently AVR-only. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V).
This driver currently supports both AVR and a limited selection of ARM devices. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V for AVR, 3.3V only for ARM), however on ARM there is more flexibility in control of operation through `#define`s if you need more precision.
## Usage
@@ -20,6 +20,8 @@ Then place this include at the top of your code:
## Channels
### AVR
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328P|
|-------|-------------|-------------|---------|----------|
|0 |`F0` |`F0` |`A0` |`C0` |
@@ -39,8 +41,84 @@ Then place this include at the top of your code:
<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
### ARM
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-based, whereas the F3 has 4 ADCs and the channels are 1 based. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|ADC|Channel|STM32F0XX|STM32F3XX|
|---|-------|---------|---------|
|1 |0 |`A0` | |
|1 |1 |`A1` |`A0` |
|1 |2 |`A2` |`A1` |
|1 |3 |`A3` |`A2` |
|1 |4 |`A4` |`A3` |
|1 |5 |`A5` |`F4` |
|1 |6 |`A6` |`C0` |
|1 |7 |`A7` |`C1` |
|1 |8 |`B0` |`C2` |
|1 |9 |`B1` |`C3` |
|1 |10 |`C0` |`F2` |
|1 |11 |`C1` | |
|1 |12 |`C2` | |
|1 |13 |`C3` | |
|1 |14 |`C4` | |
|1 |15 |`C5` | |
|1 |16 | | |
|2 |1 | |`A4` |
|2 |2 | |`A5` |
|2 |3 | |`A6` |
|2 |4 | |`A7` |
|2 |5 | |`C4` |
|2 |6 | |`C0` |
|2 |7 | |`C1` |
|2 |8 | |`C2` |
|2 |9 | |`C3` |
|2 |10 | |`F2` |
|2 |11 | |`C5` |
|2 |12 | |`B2` |
|2 |13 | | |
|2 |14 | | |
|2 |15 | | |
|2 |16 | | |
|3 |1 | |`B1` |
|3 |2 | |`E9` |
|3 |3 | |`E13` |
|3 |4 | | |
|3 |5 | | |
|3 |6 | |`E8` |
|3 |7 | |`D10` |
|3 |8 | |`D11` |
|3 |9 | |`D12` |
|3 |10 | |`D13` |
|3 |11 | |`D14` |
|3 |12 | |`B0` |
|3 |13 | |`E7` |
|3 |14 | |`E10` |
|3 |15 | |`E11` |
|3 |16 | |`E12` |
|4 |1 | |`E14` |
|4 |2 | |`B12` |
|4 |3 | |`B13` |
|4 |4 | |`B14` |
|4 |5 | |`B15` |
|4 |6 | |`E8` |
|4 |7 | |`D10` |
|4 |8 | |`D11` |
|4 |9 | |`D12` |
|4 |10 | |`D13` |
|4 |11 | |`D14` |
|4 |12 | |`D8` |
|4 |13 | |`D9` |
|4 |14 | | |
|4 |15 | | |
|4 |16 | | |
## Functions
### AVR
|Function |Description |
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
@@ -48,3 +126,28 @@ Then place this include at the top of your code:
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `F6` for ADC6 on the ATmega32U4. |
|`pinToMux(pin)` |Translates a given QMK pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
### ARM
Note that care was taken to match all of the functions used for AVR devices, however complications in the ARM platform prevent that from always being possible. For example, the `STM32` chips do not have assigned Arduino pins. We could use the default pin numbers, but those numbers change based on the package type of the device. For this reason, please specify your target pins with their identifiers (`A0`, `F3`, etc.). Also note that there are some variants of functions that accept the target ADC for the pin. Some pins can be used for multiple ADCs, and this specified can help you pick which ADC will be used to interact with that pin.
|Function |Description |
|----------------------------|--------------------------------------------------------------------------------------------------------------------|
|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
|`analogReadPinAdc(pin, adc)`|Reads the value from the specified QMK pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function.|
|`pinToMux(pin)` |Translates a given QMK pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)".|
|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and adc combination. See your MCU's datasheet for more information.|
## Configuration
## ARM
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates.
|`#define` |Type |Default |Description|
|-------------------|------|---------------------|-----------|
|ADC_CIRCULAR_BUFFER|`bool`|`false` |If `TRUE`, then the implementation will use a circular buffer.|
|ADC_NUM_CHANNELS |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`.|
|ADC_BUFFER_DEPTH |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to `2` bytes so we can contain our one value. This could be set to 1 if you opt for a 8-bit or lower result.|
|ADC_SAMPLING_RATE |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
|ADC_RESOLUTION |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|

View File

@@ -0,0 +1,3 @@
# Development Environment Setup
To setup a development stack head over to the [qmk_web_stack](https://github.com/qmk/qmk_web_stack).

View File

@@ -0,0 +1,44 @@
# QMK Compiler Development Guide
This page attempts to introduce developers to the QMK Compiler. It does not go into nitty gritty details- for that you should read code. What this will give you is a framework to hang your understanding on as you read the code.
# Overview
The QMK Compile API consists of a few movings parts:
![Architecture Diagram](https://raw.githubusercontent.com/qmk/qmk_api/master/docs/architecture.svg)
API Clients interact exclusively with the API service. This is where they submit jobs, check status, and download results. The API service inserts compile jobs into [Redis Queue](https://python-rq.org) and checks both RQ and S3 for the results of those jobs.
Workers fetch new compile jobs from RQ, compile them, and then upload the source and the binary to an S3 compatible storage engine.
# Workers
QMK Compiler Workers are responsible for doing the actual building. When a worker pulls a job from RQ it does several things to complete that job:
* Make a fresh qmk_firmware checkout
* Use the supplied layers and keyboard metadata to build a `keymap.c`
* Build the firmware
* Zip a copy of the source
* Upload the firmware, source zip, and a metadata file to S3.
* Report the status of the job to RQ
# API Service
The API service is a relatively simple Flask application. There are a few main views you should understand.
## @app.route('/v1/compile', methods=['POST'])
This is the main entrypoint for the API. A client's interaction starts here. The client POST's a JSON document describing their keyboard, and the API does some (very) basic validation of that JSON before submitting the compile job.
## @app.route('/v1/compile/&lt;string:job_id&gt;', methods=['GET'])
This is the most frequently called endpoint. It pulls the job details from redis, if they're still available, or the cached job details on S3 if they're not.
## @app.route('/v1/compile/&lt;string:job_id&gt;/download', methods=['GET'])
This method allows users to download the compiled firmware file.
## @app.route('/v1/compile/&lt;string:job_id&gt;/source', methods=['GET'])
This method allows users to download the source for their firmware.

68
docs/api_docs.md Normal file
View File

@@ -0,0 +1,68 @@
# QMK API
This page describes using the QMK API. If you are an application developer you can use this API to compile firmware for any [QMK](https://qmk.fm) Keyboard.
## Overview
This service is an asynchronous API for compiling custom keymaps. You POST some JSON to the API, periodically check the status, and when your firmware has finished compiling you can download the resulting firmware and (if desired) source code for that firmware.
#### Example JSON Payload:
```json
{
"keyboard": "clueboard/66/rev2",
"keymap": "my_awesome_keymap",
"layout": "LAYOUT_all",
"layers": [
["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_GRV","KC_BSPC","KC_PGUP","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_PGDN","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_LSFT","KC_NUBS","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_RO","KC_RSFT","KC_UP","KC_LCTL","KC_LGUI","KC_LALT","KC_MHEN","KC_SPC","KC_SPC","KC_HENK","KC_RALT","KC_RCTL","MO(1)","KC_LEFT","KC_DOWN","KC_RIGHT"],
["KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_TRNS","KC_DEL","BL_STEP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","_______","KC_TRNS","KC_PSCR","KC_SLCK","KC_PAUS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PGUP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_LEFT","KC_PGDN","KC_RGHT"],
["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","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","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","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"]
]
}
```
As you can see the payload describes all aspects of a keyboard necessary to create and generate a firmware. Each layer is a single list of QMK keycodes the same length as the keyboard's `LAYOUT` macro. If a keyboard supports mulitple `LAYOUT` macros you can specify which macro to use.
## Submitting a Compile Job
To compile your keymap into a firmware simply POST your JSON to the `/v1/compile` endpoint. In the following example we've placed the JSON payload into a file named `json_data`.
```
$ curl -H "Content-Type: application/json" -X POST -d "$(< json_data)" http://api.qmk.fm/v1/compile
{
"enqueued": true,
"job_id": "ea1514b3-bdfc-4a7b-9b5c-08752684f7f6"
}
```
## Checking The Status
After submitting your keymap you can check the status using a simple HTTP GET call:
```
$ curl http://api.qmk.fm/v1/compile/ea1514b3-bdfc-4a7b-9b5c-08752684f7f6
{
"created_at": "Sat, 19 Aug 2017 21:39:12 GMT",
"enqueued_at": "Sat, 19 Aug 2017 21:39:12 GMT",
"id": "f5f9b992-73b4-479b-8236-df1deb37c163",
"status": "running",
"result": null
}
```
This shows us that the job has made it through the queue and is currently running. There are 5 possible statuses:
* **failed**: Something about the compiling service has broken.
* **finished**: The compilation is complete and you should check `result` to see the results.
* **queued**: The keymap is waiting for a compilation server to become available.
* **running**: The compilation is in progress and should be complete soon.
* **unknown**: A serious error has occurred and you should [file a bug](https://github.com/qmk/qmk_compiler/issues).
## Examining Finished Results
Once your compile job has finished you'll check the `result` key. The value of this key is a hash containing several key bits of information:
* `firmware_binary_url`: A list of URLs for the the flashable firmware
* `firmware_keymap_url`: A list of URLs for the the `keymap.c`
* `firmware_source_url`: A list of URLs for the full firmware source code
* `output`: The stdout and stderr for this compile job. Errors will be found here.

15
docs/api_overview.md Normal file
View File

@@ -0,0 +1,15 @@
# QMK API
The QMK API provides an asynchronous API that Web and GUI tools can use to compile arbitrary keymaps for any keyboard supported by [QMK](http://qmk.fm/). The stock keymap template supports all QMK keycodes that do not require supporting C code. Keyboard maintainers can supply their own custom templates to enable more functionality.
## App Developers
If you are an app developer interested in using this API in your application you should head over to [Using The API](api_docs.md).
## Keyboard Maintainers
If you would like to enhance your keyboard's support in the QMK Compiler API head over to the [Keyboard Support](reference_configurator_support.md) section.
## Backend Developers
If you are interested in working on the API itself you should start by setting up a [Development Environment](api_development_environment.md), then check out [Hacking On The API](api_development_overview.md).

View File

@@ -1,9 +0,0 @@
# Becoming a QMK Collaborator
A QMK collaborator is a keyboard maker or designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users and customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements:
* **Have a PCB available for sale.** Unfortunately there's just too much variation and complications with handwired keyboards.
* **Maintain your keyboard in QMK.** This may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core that might break or render any custom code redundant.
* **Approve and merge keymap pull requests for your keyboard.** We like to encourage users to contribute their keymaps for others to see and work from when creating their own.
If you feel you meet these requirements, shoot us an email at hello@qmk.fm with an introduction and some links to your keyboard!

View File

@@ -6,20 +6,21 @@ The breaking change period is when we will merge PR's that change QMK in dangero
## What has been included in past Breaking Changes?
* [2020 Feb 29](ChangeLog/20200229.md)
* [2019 Aug 30](ChangeLog/20190830.md)
## When is the next Breaking Change?
The next Breaking Change is scheduled for February 29, 2020.
The next Breaking Change is scheduled for May 30, 2020.
### Important Dates
* [x] 2019 Sep 21 - `future` is created. It will be rebased weekly.
* [x] 2020 Feb 1 - `future` closed to new PR's.
* [x] 2020 Feb 1 - Call for testers.
* [ ] 2020 Feb 26 - `master` is locked, no PR's merged.
* [ ] 2020 Feb 28 - Merge `future` to `master`.
* [ ] 2020 Feb 29 - `master` is unlocked. PR's can be merged again.
* [x] 2020 Feb 29 - `future` is created. It will be rebased weekly.
* [ ] 2020 May 2 - `future` closed to new PR's.
* [ ] 2020 May 2 - Call for testers.
* [ ] 2020 May 28 - `master` is locked, no PR's merged.
* [ ] 2020 May 30 - Merge `future` to `master`.
* [ ] 2020 May 30 - `master` is unlocked. PR's can be merged again.
## What changes will be included?

View File

@@ -1,24 +1,14 @@
# QMK CLI
# QMK CLI :id=qmk-cli
This page describes how to setup and use the QMK CLI.
# Overview
## Overview :id=overview
The QMK CLI makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
* [Global CLI](#global-cli)
* [Local CLI](#local-cli)
* [CLI Commands](#cli-commands)
### Requirements :id=requirements
# Requirements
The CLI requires Python 3.5 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
The CLI requires Python 3.5 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
# Global CLI
QMK provides an installable CLI that can be used to setup your QMK build environment, work with QMK, and which makes working with multiple copies of `qmk_firmware` easier. We recommend installing and updating this periodically.
## Install Using Homebrew (macOS, some Linux)
### Install Using Homebrew (macOS, some Linux) :id=install-using-homebrew
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
@@ -29,7 +19,7 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Install Using easy_install or pip
### Install Using easy_install or pip :id=install-using-easy_install-or-pip
If your system is not listed above you can install QMK manually. First ensure that you have python 3.5 (or later) installed and have installed pip. Then install QMK with this command:
@@ -39,7 +29,7 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
## Packaging For Other Operating Systems
### Packaging For Other Operating Systems :id=packaging-for-other-operating-systems
We are looking for people to create and maintain a `qmk` package for more operating systems. If you would like to create a package for your OS please follow these guidelines:
@@ -47,247 +37,3 @@ We are looking for people to create and maintain a `qmk` package for more operat
* Document why in a comment when you do deviate
* Install using a virtualenv
* Instruct the user to set the environment variable `QMK_HOME` to have the firmware source checked out somewhere other than `~/qmk_firmware`.
# Local CLI
If you do not want to use the global CLI there is a local CLI bundled with `qmk_firmware`. You can find it in `qmk_firmware/bin/qmk`. You can run the `qmk` command from any directory and it will always operate on that copy of `qmk_firmware`.
**Example**:
```
$ ~/qmk_firmware/bin/qmk hello
Ψ Hello, World!
```
## Local CLI Limitations
There are some limitations to the local CLI compared to the global CLI:
* The local CLI does not support `qmk setup` or `qmk clone`
* The local CLI always operates on the same `qmk_firmware` tree, even if you have multiple repositories cloned.
* The local CLI does not run in a virtualenv, so it's possible that dependencies will conflict
# CLI Commands
## `qmk cformat`
This command formats C code using clang-format. Run it with no arguments to format all core code, or pass filenames on the command line to run it on specific files.
**Usage**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
## `qmk compile`
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm>, compile keymaps in the repo, or compile the keyboard in the current working directory.
**Usage for Configurator Exports**:
```
qmk compile <configuratorExport.json>
```
**Usage for Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
**Usage in Keyboard Directory**:
Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap <keymap_name>`
```
qmk compile
```
**Example**:
```
$ qmk config compile.keymap=default
$ cd ~/qmk_firmware/keyboards/planck/rev6
$ qmk compile
Ψ Compiling keymap with make planck/rev6:default
...
```
or with optional keymap argument
```
$ cd ~/qmk_firmware/keyboards/clueboard/66/rev4
$ qmk compile -km 66_iso
Ψ Compiling keymap with make clueboard/66/rev4:66_iso
...
```
or in keymap directory
```
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
$ qmk compile
Ψ Compiling keymap with make make gh60/satan:colemak
...
```
**Usage in Layout Directory**:
Must be under `qmk_firmware/layouts/`, and in a keymap folder.
```
qmk compile -kb <keyboard_name>
```
**Example**:
```
$ cd ~/qmk_firmware/layouts/community/60_ansi/mechmerlin-ansi
$ qmk compile -kb dz60
Ψ Compiling keymap with make dz60:mechmerlin-ansi
...
```
## `qmk flash`
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default.
To specify a different bootloader, use `-bl <bootloader>`. Visit <https://docs.qmk.fm/#/flashing>
for more details of the available bootloaders.
**Usage for Configurator Exports**:
```
qmk flash <configuratorExport.json> -bl <bootloader>
```
**Usage for Keymaps**:
```
qmk flash -kb <keyboard_name> -km <keymap_name> -bl <bootloader>
```
**Listing the Bootloaders**
```
qmk flash -b
```
## `qmk config`
This command lets you configure the behavior of QMK. For the full `qmk config` documentation see [CLI Configuration](cli_configuration.md).
**Usage**:
```
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
```
## `qmk docs`
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
**Usage**:
```
qmk docs [-p PORT]
```
## `qmk doctor`
This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
**Usage**:
```
qmk doctor [-y] [-n]
```
**Examples**:
Check your environment for problems and prompt to fix them:
qmk doctor
Check your environment and automatically fix any problems found:
qmk doctor -y
Check your environment and report problems only:
qmk doctor -n
## `qmk json-keymap`
Creates a keymap.c from a QMK Configurator export.
**Usage**:
```
qmk json-keymap [-o OUTPUT] filename
```
## `qmk kle2json`
This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
**Usage**:
```
qmk kle2json [-f] <filename>
```
**Examples**:
```
$ qmk kle2json kle.txt
☒ File info.json already exists, use -f or --force to overwrite.
```
```
$ qmk kle2json -f kle.txt -f
Ψ Wrote out to info.json
```
## `qmk list-keyboards`
This command lists all the keyboards currently defined in `qmk_firmware`
**Usage**:
```
qmk list-keyboards
```
## `qmk list-keymaps`
This command lists all the keymaps for a specified keyboard (and revision).
**Usage**:
```
qmk list-keymaps -kb planck/ez
```
## `qmk new-keymap`
This command creates a new keymap based on a keyboard's existing default keymap.
**Usage**:
```
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
```
## `qmk pyformat`
This command formats python code in `qmk_firmware`.
**Usage**:
```
qmk pyformat
```
## `qmk pytest`
This command runs the python test suite. If you make changes to python code you should ensure this runs successfully.
**Usage**:
```
qmk pytest
```

253
docs/cli_commands.md Normal file
View File

@@ -0,0 +1,253 @@
# QMK CLI Commands
# CLI Commands
## `qmk cformat`
This command formats C code using clang-format.
Run it with no arguments to format all core code that has been changed. Default checks `origin/master` with `git diff`, branch can be changed using `-b <branch_name>`
Run it with `-a` to format all core code, or pass filenames on the command line to run it on specific files.
**Usage for specified files**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
**Usage for all core files**:
```
qmk cformat -a
```
**Usage for only changed files against origin/master**:
```
qmk cformat
```
**Usage for only changed files against branch_name**:
```
qmk cformat -b branch_name
```
## `qmk compile`
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm>, compile keymaps in the repo, or compile the keyboard in the current working directory.
**Usage for Configurator Exports**:
```
qmk compile <configuratorExport.json>
```
**Usage for Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
**Usage in Keyboard Directory**:
Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap <keymap_name>`
```
qmk compile
```
**Usage for building all keyboards that support a specific keymap**:
```
qmk compile -kb all -km <keymap_name>
```
**Example**:
```
$ qmk config compile.keymap=default
$ cd ~/qmk_firmware/keyboards/planck/rev6
$ qmk compile
Ψ Compiling keymap with make planck/rev6:default
...
```
or with optional keymap argument
```
$ cd ~/qmk_firmware/keyboards/clueboard/66/rev4
$ qmk compile -km 66_iso
Ψ Compiling keymap with make clueboard/66/rev4:66_iso
...
```
or in keymap directory
```
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
$ qmk compile
Ψ Compiling keymap with make make gh60/satan:colemak
...
```
**Usage in Layout Directory**:
Must be under `qmk_firmware/layouts/`, and in a keymap folder.
```
qmk compile -kb <keyboard_name>
```
**Example**:
```
$ cd ~/qmk_firmware/layouts/community/60_ansi/mechmerlin-ansi
$ qmk compile -kb dz60
Ψ Compiling keymap with make dz60:mechmerlin-ansi
...
```
## `qmk flash`
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default.
To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing.md) guide for more details of the available bootloaders.
**Usage for Configurator Exports**:
```
qmk flash <configuratorExport.json> -bl <bootloader>
```
**Usage for Keymaps**:
```
qmk flash -kb <keyboard_name> -km <keymap_name> -bl <bootloader>
```
**Listing the Bootloaders**
```
qmk flash -b
```
## `qmk config`
This command lets you configure the behavior of QMK. For the full `qmk config` documentation see [CLI Configuration](cli_configuration.md).
**Usage**:
```
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
```
## `qmk docs`
This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
**Usage**:
```
qmk docs [-p PORT]
```
## `qmk doctor`
This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
**Usage**:
```
qmk doctor [-y] [-n]
```
**Examples**:
Check your environment for problems and prompt to fix them:
qmk doctor
Check your environment and automatically fix any problems found:
qmk doctor -y
Check your environment and report problems only:
qmk doctor -n
## `qmk json2c`
Creates a keymap.c from a QMK Configurator export.
**Usage**:
```
qmk json2c [-o OUTPUT] filename
```
## `qmk kle2json`
This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
**Usage**:
```
qmk kle2json [-f] <filename>
```
**Examples**:
```
$ qmk kle2json kle.txt
☒ File info.json already exists, use -f or --force to overwrite.
```
```
$ qmk kle2json -f kle.txt -f
Ψ Wrote out to info.json
```
## `qmk list-keyboards`
This command lists all the keyboards currently defined in `qmk_firmware`
**Usage**:
```
qmk list-keyboards
```
## `qmk list-keymaps`
This command lists all the keymaps for a specified keyboard (and revision).
**Usage**:
```
qmk list-keymaps -kb planck/ez
```
## `qmk new-keymap`
This command creates a new keymap based on a keyboard's existing default keymap.
**Usage**:
```
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
```
## `qmk pyformat`
This command formats python code in `qmk_firmware`.
**Usage**:
```
qmk pyformat
```
## `qmk pytest`
This command runs the python test suite. If you make changes to python code you should ensure this runs successfully.
**Usage**:
```
qmk pytest
```

View File

@@ -4,7 +4,7 @@ This document explains how `qmk config` works.
# Introduction
Configuration for QMK CLI is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set.
Configuration for the QMK CLI is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set.
## Simple Example

View File

@@ -53,6 +53,8 @@ This is a C header file that is one of the first things included, and will persi
* 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 MATRIX_IO_DELAY 30`
* the delay in microseconds when between changing matrix pin state and reading values
* `#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 }`
* pins unused by the keyboard for reference
* `#define MATRIX_HAS_GHOST`
@@ -134,20 +136,22 @@ If you define these options you will enable the associated feature, which may in
* enables handling for per key `TAPPING_TERM` settings
* `#define RETRO_TAPPING`
* tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
* See [Retro Tapping](feature_advanced_keycodes.md#retro-tapping) for details
* See [Retro Tapping](tap_hold.md#retro-tapping) for details
* `#define TAPPING_TOGGLE 2`
* how many taps before triggering the toggle
* `#define PERMISSIVE_HOLD`
* makes tap and hold keys trigger the hold if another key is pressed before releasing, even if it hasn't hit the `TAPPING_TERM`
* See [Permissive Hold](feature_advanced_keycodes.md#permissive-hold) for details
* See [Permissive Hold](tap_hold.md#permissive-hold) for details
* `#define PERMISSIVE_HOLD_PER_KEY`
* enabled handling for per key `PERMISSIVE_HOLD` settings
* `#define IGNORE_MOD_TAP_INTERRUPT`
* makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the `TAPPING_TERM` for both keys.
* See [Mod tap interrupt](feature_advanced_keycodes.md#ignore-mod-tap-interrupt) for details
* See [Ignore Mod Tap Interrupt](tap_hold.md#ignore-mod-tap-interrupt) for details
* `#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
* enables handling for per key `IGNORE_MOD_TAP_INTERRUPT` settings
* `#define TAPPING_FORCE_HOLD`
* makes it possible to use a dual role key as modifier shortly after having been tapped
* See [Hold after tap](feature_advanced_keycodes.md#tapping-force-hold)
* See [Tapping Force Hold](tap_hold.md#tapping-force-hold)
* Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle)
* `#define TAPPING_FORCE_HOLD_PER_KEY`
* enables handling for per key `TAPPING_FORCE_HOLD` settings
@@ -186,6 +190,8 @@ If you define these options you will enable the associated feature, which may in
* pin the DI on the WS2812 is hooked-up to
* `#define RGBLIGHT_ANIMATIONS`
* run RGB animations
* `#define RGBLIGHT_LAYERS`
* Lets you define [lighting layers](feature_rgblight.md) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
* `#define RGBLED_NUM 12`
* number of LEDs
* `#define RGBLIGHT_SPLIT`
@@ -331,7 +337,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
* `bootloadHID`
* `USBasp`
## Feature Options
## Feature Options :id=feature-options
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.

View File

@@ -0,0 +1,58 @@
# QMK Configurator: Step by Step
This page describes the steps for building your firmware in QMK Configurator.
## Step 1: Select Your Keyboard
Click the drop down box and select the keyboard you want to create a keymap for.
?> If your keyboard has several versions, make sure you select the correct one.
I'll say that again because it's important:
!> **MAKE SURE YOU SELECT THE RIGHT VERSION!**
If your keyboard has been advertised to be powered by QMK but is not in the list, chances are a developer hasn't gotten to it yet or we haven't had a chance to merge it in yet. File an issue at [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) requesting to support that particular keyboard, if there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) for it. There are also QMK powered keyboards that are in their manufacturer's own github accounts. Double check for that as well. <!-- FIXME(skullydazed): This feels too wordy and I'm not sure we want to encourage these kinds of issues. Also, should we prompt them to bug the manufacutrer? -->
## Step 2: Select Your Keyboard Layout
Choose the layout that best represents the keymap you want to create. Some keyboards do not have enough layouts or correct layouts defined yet. They will be supported in the future.
!> Sometimes there isn't a layout that supports your exact build. In that case select `LAYOUT_all`.
## Step 3: Name Your Keymap
Call this keymap what you want.
?> If you are running into issues when compiling, it may be worth changing this name, as it may already exist in the QMK Firmware repo.
## Step 4: Define Your Keymap
Keycode Entry is accomplished in one of 3 ways:
1. Drag and drop
2. Clicking on an empty spot on the layout, then clicking the keycode you desire
3. Clicking on an empty spot on the layout, then pressing the physical key on your keyboard
?> Hover your mouse over a key and a short blurb will tell you what that keycode does. For a more verbose description please see:
* [Basic Keycode Reference](keycodes_basic.md)
* [Advanced Keycode Reference](feature_advanced_keycodes.md)
!> If your selected layout doesn't match your physical build leave the unused keys blank. If you're not sure which key is in use, for example you have a one backspace key but `LAYOUT_all` has 2 keys, put the same keycode in both locations.
## Step 5: Save Your Keymap for Future Changes
When you're satisfied with your keymap or just want to work on it later, press the `Export Keymap` button. It will save your keymap to your computer. You can then load this .json file in the future by pressing the `Import Keymap` button.
!> **CAUTION:** This is not the same type of .json file used for kbfirmware.com or any other tool. If you try to use this for those tools, or the .json from those tools with QMK Configurator, you will encounter problems.
## Step 6: Compile Your Firmware File
Press the green `Compile` button.
When the compilation is done, you will be able to press the green `Download Firmware` button.
## Next steps: Flashing Your Keyboard
Please refer to [Flashing Firmware](newbs_flashing.md).

View File

@@ -0,0 +1,26 @@
# Configurator Troubleshooting
## My .json file is not working
If the .json file was generated with QMK Configurator, congratulations you have stumbled upon a bug. File an issue at [qmk_configurator](https://github.com/qmk/qmk_configurator/issues).
If not... how did you miss the big bold message at the top saying not to use other .json files?
## There are extra spaces in my layout? What do I do?
If you're referring to having three spots for space bar, the best course of action is to just fill them all with Space. The same can be done for Backspace and Shift keys.
## What is the keycode for...
Please see:
* [Basic Keycode Reference](keycodes_basic.md)
* [Advanced Keycode Reference](feature_advanced_keycodes.md)
## It won't compile
Please double check the other layers of your keymap to make sure there are no random keys present.
## Problems and Bugs
We are always accepting customer requests and bug reports. Please file them at [qmk_configurator](https://github.com/qmk/qmk_configurator/issues).

View File

@@ -101,7 +101,7 @@ enum my_keycodes {
};
```
### Previewing the Documentation
### Previewing the Documentation :id=previewing-the-documentation
Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:

View File

@@ -4,7 +4,7 @@ For a lot of people a custom keyboard is about more than sending button presses
This page does not assume any special knowledge about QMK, but reading [Understanding QMK](understanding_qmk.md) will help you understand what is going on at a more fundamental level.
## A Word on Core vs Keyboards vs Keymap
## A Word on Core vs Keyboards vs Keymap :id=a-word-on-core-vs-keyboards-vs-keymap
We have structured QMK as a hierarchy:
@@ -34,7 +34,7 @@ enum my_keycodes {
};
```
## Programming the Behavior of Any Keycode
## Programming the Behavior of Any Keycode :id=programming-the-behavior-of-any-keycode
When you want to override the behavior of an existing key, or define the behavior for a new key, you should use the `process_record_kb()` and `process_record_user()` functions. These are called by QMK during key processing before the actual key event is handled. If these functions return `true` QMK will process the keycodes as usual. That can be handy for extending the functionality of a key rather than replacing it. If these functions return `false` QMK will skip the normal key handling, and it will be up to you to send any key up or down events that are required.
@@ -313,7 +313,7 @@ void suspend_wakeup_init_user(void) {
* Keyboard/Revision: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
* Keymap: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
# Layer Change Code
# Layer Change Code :id=layer-change-code
This runs code every time that the layers get changed. This can be useful for layer indication, or custom layer handling.

View File

@@ -77,7 +77,7 @@
* [Macros](de/feature_macros.md)
* [Mouse Keys](de/feature_mouse_keys.md)
* [OLED Driver](de/feature_oled_driver.md)
* [One Shot Keys](de/feature_advanced_keycodes.md#one-shot-keys)
* [One Shot Keys](de/one_shot_keys.md)
* [Pointing Device](de/feature_pointing_device.md)
* [PS/2 Mouse](de/feature_ps2_mouse.md)
* [RGB Lighting](de/feature_rgblight.md)
@@ -108,7 +108,7 @@
* Andere Themen
* [Eclipse mit QMK](de/other_eclipse.md)
* [VSCode mit QMK](de/other_vscode.md)
* [Support](de/support.md)
* [Support](de/getting_started_getting_help.md)
* [Übersetzungen](de/translating.md)
* QMK Internals (In Progress)

View File

@@ -2,7 +2,7 @@
This page documents the templates you should use when submitting new Keymaps and Keyboards to QMK.
## Keymap `readme.md` Template
## Keymap `readme.md` Template :id=keyboard-readmemd-template
Most keymaps have an image depicting the layout. You can use [Keyboard Layout Editor](http://keyboard-layout-editor.com) to create an image. Upload it to [Imgur](http://imgur.com) or another hosting service, please do not include images in your Pull Request.

View File

@@ -2,14 +2,16 @@
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
Driver | Description
--------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`EEPROM_DRIVER = vendor` | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
Driver | Description
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
## Vendor Driver Configuration
!> Resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.
No configurable options are available.
## I2C Driver Configuration

View File

@@ -77,7 +77,7 @@
* [Macros](es/feature_macros.md)
* [Teclas del ratón](es/feature_mouse_keys.md)
* [Driver OLED](es/feature_oled_driver.md)
* [Teclas One Shot](es/feature_advanced_keycodes.md#one-shot-keys)
* [Teclas One Shot](es/one_shot_keys.md)
* [Dispositivo de apuntado](es/feature_pointing_device.md)
* [Ratón PS/2](es/feature_ps2_mouse.md)
* [Iluminación RGB](es/feature_rgblight.md)
@@ -108,7 +108,7 @@
* Otros temas
* [Usando Eclipse con QMK](es/other_eclipse.md)
* [Usando VSCode con QMK](es/other_vscode.md)
* [Soporte](es/support.md)
* [Soporte](es/getting_started_getting_help.md)
* [Cómo añadir traducciones](es/translating.md)
* QMK Internals (En progreso)

View File

@@ -1,9 +0,0 @@
# Llegar a ser un colaborador QMK
Un colaborador QMK es un maker o diseñador de teclados que tiene interés en ayudar a QMK a crecer y mantener sus teclado(s), y alentar a los usuarios y clientes a presentar herramientas, ideas, y keymaps. Siempre procuramos agregar más teclados y colaboradores, pero pedimos que cumplan los siguientes requisitos:
* **Tener un PCB disponible a la venta.** Desafortunadamente, hay demasiada variación y complicaciones con teclados cableados a mano.
* **Realizar el mantenimiento de tu teclado en QMK.** Este podría requirir un setup inicial para hacer que tu teclado funcione, pero también podría incluir adaptarse a cambios hecho al base de QMK que podrían descomponer o rendir código superfluo.
* **Aprobar e incorporar pull requests de keymaps para tu teclado.** Nos gusta alentar a los usuarios a contribuir sus keymaps para que otros los vean y los puedan usar para crear sus propios.
Si sientes que cumples los requisitos, ¡mándanos un email a hello@qmk.fm con una introducción y algunos enlaces para tu teclado!

View File

@@ -4,7 +4,7 @@ El [Configurador QMK](https://config.qmk.fm) es un entorno gráfico online que g
?> **Por favor sigue estos pasos en orden.**
Ve el [Video tutorial](https://youtu.be/tx54jkRC9ZY)
Ve el [Video tutorial](https://www.youtube.com/watch?v=-imgglzDMdY)
El Configurador QMK functiona mejor con Chrome/Firefox.

View File

@@ -1,6 +0,0 @@
# Frequently Asked Questions
* [General](faq_general.md)
* [Building or Compiling QMK](faq_build.md)
* [Debugging and Troubleshooting QMK](faq_debug.md)
* [Keymap](faq_keymap.md)

View File

@@ -4,6 +4,44 @@
[QMK](https://github.com/qmk), short for Quantum Mechanical Keyboard, is a group of people building tools for custom keyboards. We started with the [QMK firmware](https://github.com/qmk/qmk_firmware), a heavily modified fork of [TMK](https://github.com/tmk/tmk_keyboard).
## I don't know where to start!
If this is the case, then you should start with our [Newbs Guide](newbs.md). There is a lot of great info there, and that should cover everything you need to get started.
If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there.
## How can I flash the firmware I built?
First, head to the [Compiling/Flashing FAQ Page](faq_build.md). There is a good deal of info there, and you'll find a bunch of solutions to common issues there.
## What if I have an issue that isn't covered here?
Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same).
If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues/new)!
## What if I found a bug?
Then please open an [issue](https://github.com/qmk/qmk_firmware/issues/new), and if you know how to fix it, open up a Pull Request on GitHub with the fix.
## But `git` and `GitHub` are intimidating!
Don't worry, we have some pretty nice [Guidelines](newbs_git_best_practices.md) on how to start using `git` and GitHub to make things easier to develop.
Additionally, you can find additional `git` and GitHub related links [here](newbs_learn_more_resources.md).
## I have a Keyboard that I want to add support for
Awesome! Open up a Pull Request for it. We'll review the code, and merge it!
### What if I want to do brand it with `QMK`?
That's amazing! We would love to assist you with that!
In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh).
## 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](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.

View File

@@ -14,6 +14,17 @@ There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JI
<!-- Source for this image: http://www.keyboard-layout-editor.com/#/gists/bf431647d1001cff5eff20ae55621e9a -->
![Keyboard Layout Image](https://i.imgur.com/5wsh5wM.png)
## How Can I Make Custom Names For Complex Keycodes?
Sometimes, for readability's sake, it's useful to define custom names for some keycodes. People often define custom names using `#define`. For example:
```c
#define FN_CAPS LT(_FL, KC_CAPSLOCK)
#define ALT_TAB LALT(KC_TAB)
```
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
## Some Of My Keys Are Swapped Or Not Working
QMK has two features, Bootmagic and Command, which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling Gui, swapping Alt/Gui, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.

View File

@@ -1,62 +1,4 @@
# Advanced Keycodes
Your keymap can include keycodes that are more advanced than normal, for example keys that switch layers or send modifiers when held, but send regular keycodes when tapped. This page documents the functions that are available to you.
## Assigning Custom Names
People often define custom names using `#define`. For example:
```c
#define FN_CAPS LT(_FL, KC_CAPSLOCK)
#define ALT_TAB LALT(KC_TAB)
```
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
## Caveats
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
# Switching and Toggling Layers
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers). When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](#one-shot-keys) for details and additional functionality.
* `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
* `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
# 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.
## Beginners
If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
## Intermediate Users
Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
## Advanced Users
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
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.
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](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
# Modifier Keys
# Modifier Keys :id=modifier-keys
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
@@ -78,289 +20,22 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
You can also chain them, for example `LCTL(LALT(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
# Mod-Tap
# Legacy Content :id=legacy-content
The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down.
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`:
## Layers :id=switching-and-toggling-layers
|Modifier |Description |
|----------|----------------------------------------|
|`MOD_LCTL`|Left Control |
|`MOD_LSFT`|Left Shift |
|`MOD_LALT`|Left Alt |
|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) |
|`MOD_RCTL`|Right Control |
|`MOD_RSFT`|Right Shift |
|`MOD_RALT`|Right Alt (AltGr) |
|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) |
|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)|
|`MOD_MEH` |Meh (Left Control, Shift, and Alt) |
* [Layers](feature_layers.md)
You can combine these by ORing them together like so:
## Mod-Tap :id=mod-tap
```c
MT(MOD_LCTL | MOD_LSFT, KC_ESC)
```
* [Mod-Tap](mod_tap.md)
This key would activate Left Control and Left Shift when held, and send Escape when tapped.
## One Shot Keys :id=one-shot-keys
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
* [One Shot Keys](one_shot_keys.md)
|Key |Aliases |Description |
|------------|-----------------------------------------------------------------|-------------------------------------------------------|
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## Tap-Hold Configuration Options :id=tap-hold-configuration-options
## Caveats
Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored.
Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes.
To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly.
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys".
For example, if you define a key as `OSM(MOD_LSFT)`, you can type a capital A character by first pressing and releasing shift, and then pressing and releasing A. Your computer will see the shift key being held the moment shift is pressed, and it will see the shift key being released immediately after A is released.
One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key.
Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the `ONESHOT_TAP_TOGGLE` define.
You can control the behavior of one shot keys by defining these in `config.h`:
```c
#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped once again. */
#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */
```
* `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 key as part of a macro or tap dance routine.
For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`.
For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear_oneshot_mods()` to cancel it.
!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
## Callbacks
When you'd like to perform custom logic when pressing a one shot key, there are several callbacks you can choose to implement. You could indicate changes in one shot keys by flashing an LED or making a sound, for example.
There is a callback for `OSM(mod)`. It is called whenever the state of any one shot modifier key is changed: when it toggles on, but also when it is toggled off. You can use it like this:
```c
void oneshot_mods_changed_user(uint8_t mods) {
if (mods & MOD_MASK_SHIFT) {
println("Oneshot mods SHIFT");
}
if (mods & MOD_MASK_CTRL) {
println("Oneshot mods CTRL");
}
if (mods & MOD_MASK_ALT) {
println("Oneshot mods ALT");
}
if (mods & MOD_MASK_GUI) {
println("Oneshot mods GUI");
}
if (!mods) {
println("Oneshot mods off");
}
}
```
The `mods` argument contains the active mods after the change, so it reflects the current state.
When you use One Shot Tap Toggle (by adding `#define ONESHOT_TAP_TOGGLE 2` in your `config.h` file), you may lock a modifier key by pressing it the specified amount of times. There's a callback for that, too:
```c
void oneshot_locked_mods_changed_user(uint8_t mods) {
if (mods & MOD_MASK_SHIFT) {
println("Oneshot locked mods SHIFT");
}
if (mods & MOD_MASK_CTRL) {
println("Oneshot locked mods CTRL");
}
if (mods & MOD_MASK_ALT) {
println("Oneshot locked mods ALT");
}
if (mods & MOD_MASK_GUI) {
println("Oneshot locked mods GUI");
}
if (!mods) {
println("Oneshot locked mods off");
}
}
```
Last, there is also a callback for the `OSL(layer)` one shot key:
```c
void oneshot_layer_changed_user(uint8_t layer) {
if (layer == 1) {
println("Oneshot layer 1 on");
}
if (!layer) {
println("Oneshot layer off");
}
}
```
If any one shot layer is switched off, `layer` will be zero. When you're looking to do something on any layer change instead of one shot layer changes, `layer_state_set_user` is a better callback to use.
If you are making your own keyboard, there are also `_kb` equivalent functions:
```c
void oneshot_locked_mods_changed_kb(uint8_t mods);
void oneshot_mods_changed_kb(uint8_t mods);
void oneshot_layer_changed_kb(uint8_t layer);
```
As with any callback, be sure to call the `_user` variant to allow for further customizability.
# Tap-Hold Configuration Options
While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonal defaults, but that may still cause issues for some people.
These options let you modify the behavior of the Tap-Hold keys.
## Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
```c
#define PERMISSIVE_HOLD
```
This makes tap and hold keys (like Mod Tap) work better for fast typist, or for high `TAPPING_TERM` settings.
If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys.
For Instance:
- `SFT_T(KC_A)` Down
- `KC_X` Down
- `KC_X` Up
- `SFT_T(KC_A)` Up
Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`).
?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
## Ignore Mod Tap Interrupt
To enable this setting, add this to your `config.h`:
```c
#define IGNORE_MOD_TAP_INTERRUPT
```
Similar to Permissive Hold, this alters how the firmware processes input for fast typist. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys.
Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod).
For Instance:
- `SFT_T(KC_A)` Down
- `KC_X` Down
- `SFT_T(KC_A)` Up
- `KC_X` Up
Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output `X` (`SHIFT`+`x`).
?> __Note__: This only concerns modifiers and not layer switching keys.
?> If you have `Permissive Hold` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
For more granular control of this feature, you can add the following to your `config.h`:
```c
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
```
You can then add the following function to your keymap:
```c
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
switch (keycode) {
case SFT_T(KC_SPC):
return true;
default:
return false;
}
}
```
## Tapping Force Hold
To enable `tapping force hold`, add the following to your `config.h`:
```c
#define TAPPING_FORCE_HOLD
```
When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key.
Example:
- SFT_T(KC_A) Down
- SFT_T(KC_A) Up
- SFT_T(KC_A) Down
- wait more than tapping term...
- SFT_T(KC_A) Up
With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function.
With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allowing to use it as a modifier shortly after having used it as a tap.
!> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tapping Toggle).
For more granular control of this feature, you can add the following to your `config.h`:
```c
#define TAPPING_FORCE_HOLD_PER_KEY
```
You can then add the following function to your keymap:
```c
bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LT(1, KC_BSPC):
return true;
default:
return false;
}
}
```
## Retro Tapping
To enable `retro tapping`, add the following to your `config.h`:
```c
#define RETRO_TAPPING
```
Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
* [Tap-Hold Configuration Options](tap_hold.md)

View File

@@ -119,10 +119,22 @@ When both timers are in use for Audio, the backlight PWM will not use a hardware
To change the behavior of the backlighting, `#define` these in your `config.h`:
|Define |Default |Description |
|---------------------|-------------|--------------------------------------------------------------------------------------------------------------|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this |
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|Define |Default |Description |
|---------------------|-------------|-------------------------------------------------------------------------------------------------------------|
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PINS` |*Not defined*|experimental: see below for more information |
|`BACKLIGHT_LEVELS` |`3` |The number of brightness levels (maximum 31 excluding off) |
|`BACKLIGHT_CAPS_LOCK`|*Not defined*|Enable Caps Lock indicator using backlight (for keyboards without dedicated LED) |
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|`BACKLIGHT_ON_STATE` |`1` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
### Backlight On State
Most backlight circuits are driven by an N-channel MOSFET or NPN transistor. This means that to turn the transistor *on* and light the LEDs, you must drive the backlight pin, connected to the gate or base, *high*.
Sometimes, however, a P-channel MOSFET, or a PNP transistor is used. In this case, when the transistor is on, the pin is driven *low* instead.
This functionality is configured at the keyboard level with the `BACKLIGHT_ON_STATE` define.
### Multiple backlight pins
@@ -180,7 +192,7 @@ To change the behavior of the backlighting, `#define` these in your `config.h`:
|`BACKLIGHT_PWM_CHANNEL` |`3` |The PWM channel to use, see ST datasheets for pin to PWM channel mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PAL_MODE` |`2` |The pin alternative function to use, see ST datasheets for pin AF mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
## Software PWM Driver
## Software PWM Driver :id=software-pwm-driver
Emulation of PWM while running other keyboard tasks, it offers maximum hardware compatibility without extra platform configuration. The tradeoff is the backlight might jitter when the keyboard is busy. To enable, add this to your rules.mk:
```makefile

View File

@@ -54,7 +54,7 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug
|`6` |Make layer 6 the default layer |
|`7` |Make layer 7 the default layer |
## Keycodes
## Keycodes :id=keycodes
|Key |Aliases |Description |
|----------------------------------|---------|--------------------------------------------------------------------------|
@@ -121,9 +121,9 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes
|`BOOTMAGIC_KEY_DEFAULT_LAYER_6` |`KC_6` |Make layer 6 the default layer |
|`BOOTMAGIC_KEY_DEFAULT_LAYER_7` |`KC_7` |Make layer 7 the default layer |
# Bootmagic Lite
# Bootmagic Lite :id=bootmagic-lite
In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause.
In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause.
To enable this version of Bootmagic, you need to enable it in your `rules.mk` with:
@@ -131,7 +131,7 @@ To enable this version of Bootmagic, you need to enable it in your `rules.mk` wi
BOOTMAGIC_ENABLE = lite
```
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
```c
#define BOOTMAGIC_LITE_ROW 0
@@ -144,9 +144,20 @@ And to trigger the bootloader, you hold this key down when plugging the keyboard
!> Using bootmagic lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
## Split Keyboards
When handedness is predetermined via an option like `SPLIT_HAND_PIN`, you might need to configure a different key between halves. This To do so, add these entries to your `config.h` file:
```c
#define BOOTMAGIC_LITE_ROW_RIGHT 4
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
```
By default, these values are not set.
## Advanced Bootmagic Lite
The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
To replace the function, all you need to do is add something like this to your code:
@@ -163,4 +174,4 @@ void bootmagic_lite(void) {
}
```
You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.

View File

@@ -2,23 +2,35 @@
Basic encoders are supported by adding this to your `rules.mk`:
ENCODER_ENABLE = yes
```make
ENCODER_ENABLE = yes
```
and this to your `config.h`:
#define ENCODERS_PAD_A { B12 }
#define ENCODERS_PAD_B { B13 }
```c
#define ENCODERS_PAD_A { B12 }
#define ENCODERS_PAD_B { B13 }
```
Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.:
#define ENCODERS_PAD_A { encoder1a, encoder2a }
#define ENCODERS_PAD_B { encoder1b, encoder2b }
```c
#define ENCODERS_PAD_A { encoder1a, encoder2a }
#define ENCODERS_PAD_B { encoder1b, encoder2b }
```
If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions.
If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions. They can also be flipped with a define:
```c
#define ENCODER_DIRECTION_FLIP
```
Additionally, the resolution can be specified in the same file (the default & suggested is 4):
#define ENCODER_RESOLUTION 4
```c
#define ENCODER_RESOLUTION 4
```
## Split Keyboards
@@ -33,27 +45,31 @@ If you are using different pinouts for the encoders on each half of a split keyb
The callback functions can be inserted into your `<keyboard>.c`:
void encoder_update_kb(uint8_t index, bool clockwise) {
encoder_update_user(index, clockwise);
}
```c
void encoder_update_kb(uint8_t index, bool clockwise) {
encoder_update_user(index, clockwise);
}
```
or `keymap.c`:
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
```c
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
if (clockwise) {
tap_code(KC_PGDN);
tap_code(KC_PGDN);
} else {
tap_code(KC_PGUP);
tap_code(KC_PGUP);
}
} else if (index == 1) { /* Second encoder */
} else if (index == 1) { /* Second encoder */
if (clockwise) {
tap_code(KC_UP);
tap_code(KC_DOWN);
} else {
tap_code(KC_DOWN);
tap_code(KC_UP);
}
}
}
}
```
## Hardware

View File

@@ -16,7 +16,7 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
## Caveats
Key Lock is only able to hold standard action keys and [One Shot modifier](feature_advanced_keycodes.md#one-shot-keys) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
Switching layers will not cancel the Key Lock.

94
docs/feature_layers.md Normal file
View File

@@ -0,0 +1,94 @@
# Layers :id=layers
One of the most powerful and well used features of QMK Firmware is the ability to use layers. For most people, this amounts to a function key that allows for different keys, much like what you would see on a laptop or tablet keyboard.
For a detailed explanation of how the layer stack works, checkout [Keymap Overview](keymap.md#keymap-and-layers).
## Switching and Toggling Layers :id=switching-and-toggling-layers
These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](one_shot_keys.md) for details and additional functionality.
* `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
* `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
### Caveats :id=caveats
Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Specifically, dual function keys like `LT` and `MT` use a 16 bit keycode. 4 bits are used for the function identifier, the next 12 are divided into the parameters. Layer Tap uses 4 bits for the layer (and is why it's limited to layers 0-16, actually), while Mod Tap does the same, 4 bits for the identifier, 4 bits for which mods are used, and all of them use 8 bits for the keycode. Because of this, the keycode used is limited to `0xFF` (0-255), which are the basic keycodes only.
Expanding this would be complicated, at best. Moving to a 32-bit keycode would solve a lot of this, but would double the amount of space that the keymap matrix uses. And it could potentially cause issues, too. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
## Working with Layers :id=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.
### Beginners :id=beginners
If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
### Intermediate Users :id=intermediate-users
Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
### Advanced Users :id=advanced-users
Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
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.
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](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
## Functions :id=functions
There are a number of functions (and variables) related to how you can use or manipulate the layers.
|Function |Description |
|----------------------------------------------|---------------------------------------------------------------------------------------------------------|
| `layer_state_set(layer_mask)` | Directly sets the layer state (recommended, do not use unless you know what you are doing). |
| `layer_clear()` | Clears all layers (turns them all off). |
| `layer_move(layer)` | Turns specified layer on, and all other layers off. |
| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. |
| `layer_off(layer)` | Turns specified layer off, leaves all other layers in existing state. |
| `layer_invert(layer)` | Interverts/toggles the state of the specified layer |
| `layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing layer state. |
| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. |
| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. |
| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. |
| `default_layer_set(layer_mask)` | Directly sets the default layer state (recommended, do not use unless you know what you are doing). |
| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. |
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified.
|Callbacks |Description |
|-----------------------------------------------------|----------------------------------------------------------------------------------------|
| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
| `default_layer_state_set_kb(layer_state_t state)` | Callback for default layer functions, for keyboard. Called on keyboard initialization. |
| `default_layer_state_set_user(layer_state_t state)` | Callback for default layer functions, for users. Called on keyboard initialization. |
?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
|Check functions |Description |
|-------------------------------------------|------------------------------------------------------------------------------|
| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. |
| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). |
!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned.

View File

@@ -74,9 +74,9 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
## Strict Key Processing
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](feature_advanced_keycodes.md#mod-tap) and [`Layer Tap`](feature_advanced_keycodes.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This well then disable the filtering, and you'll need to specify the whole keycode.
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
## Customization

View File

@@ -88,6 +88,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
```
### Advanced Macros
In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
In this example, we modify most normal keypresses so that `F22` is pressed before the keystroke is normally sent, and release it __only after__ it's been released.
```c
static uint8_t f22_tracker;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_A ... KC_F21: //notice how it skips over F22
case KC_F23 ... KC_EXSEL: //exsel is the last one before the modifier keys
if (record->event.pressed) {
register_code(KC_F22); //this means to send F22 down
f22_tracker++;
register_code(keycode);
return false;
}
break;
}
return true;
}
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_A ... KC_F21: //notice how it skips over F22
case KC_F23 ... KC_EXSEL: //exsel is the last one before the modifier keys
if (!record->event.pressed) {
f22_tracker--;
if (!f22_tracker) {
unregister_code(KC_F22); //this means to send F22 up
}
}
break;
}
}
```
### TAP, DOWN and UP
You may want to use keys in your macros that you can't write down, such as `Ctrl` or `Home`.
@@ -107,6 +147,16 @@ Would tap `KC_HOME` - note how the prefix is now `X_`, and not `KC_`. You can al
Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline).
Delays can be also added to the string:
* `SS_DELAY(msecs)` will delay for the specified number of milliseconds.
For example:
SEND_STRING("VE" SS_DELAY(1000) SS_TAP(X_HOME) "LO");
Which would send "VE" followed by a 1-second delay, then a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline, but delayed in the middle).
There's also a couple of mod shortcuts you can use:
* `SS_LCTL(string)`
@@ -154,6 +204,8 @@ SEND_STRING(".."SS_TAP(X_END));
There are some functions you may find useful in macro-writing. Keep in mind that while you can write some fairly advanced code within a macro, if your functionality gets too complex you may want to define a custom keycode instead. Macros are meant to be simple.
?> You can also use the functions described in [Useful function](ref_functions.md) for additional functionality. For example `reset_keyboard()` allows you to reset the keyboard as part of a macro.
### `record->event.pressed`
This is a boolean value that can be tested to see if the switch is being pressed or released. An example of this is
@@ -198,11 +250,11 @@ This will clear all mods currently pressed.
This will clear all keys besides the mods currently pressed.
## Advanced Example:
## Advanced Example:
### Super ALT↯TAB
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
```c
bool is_alt_tab_active = false; # ADD this near the begining of keymap.c
@@ -219,7 +271,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!is_alt_tab_active) {
is_alt_tab_active = true;
register_code(KC_LALT);
}
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
@@ -230,7 +282,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void matrix_scan_user(void) { # The very important timer.
void matrix_scan_user(void) { # The very important timer.
if (is_alt_tab_active) {
if (timer_elapsed(alt_tab_timer) > 1000) {
unregister_code(KC_LALT);
@@ -319,7 +371,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
```
## Advanced Example:
## Advanced Example:
### Single-Key Copy/Paste

View File

@@ -58,6 +58,8 @@ This is the default mode. You can adjust the cursor and scrolling acceleration u
|`MOUSEKEY_INTERVAL` |50 |Time between cursor movements |
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|`MOUSEKEY_TIME_TO_MAX` |20 |Time until maximum cursor speed is reached |
|`MOUSEKEY_WHEEL_DELAY` |300 |Delay between pressing a wheel key and wheel movement |
|`MOUSEKEY_WHEEL_INTERVAL` |100 |Time between wheel movements |
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
@@ -66,6 +68,7 @@ Tips:
* Setting `MOUSEKEY_DELAY` too low makes the cursor unresponsive. Setting it too high makes small movements difficult.
* For smoother cursor movements, lower the value of `MOUSEKEY_INTERVAL`. If the refresh rate of your display is 60Hz, you could set it to `16` (1/60). As this raises the cursor speed significantly, you may want to lower `MOUSEKEY_MAX_SPEED`.
* Setting `MOUSEKEY_TIME_TO_MAX` or `MOUSEKEY_WHEEL_TIME_TO_MAX` to `0` will disable acceleration for the cursor or scrolling respectively. This way you can make one of them constant while keeping the other accelerated, which is not possible in constant speed mode.
* Setting `MOUSEKEY_WHEEL_INTERVAL` too low will make scrolling too fast. Setting it too high will make scrolling too slow when the wheel key is held down.
Cursor acceleration uses the same algorithm as the X Window System MouseKeysAccel feature. You can read more about it [on Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys).

View File

@@ -221,6 +221,12 @@ void oled_write(const char *data, bool invert);
// Advances the cursor to the next page, wiring ' ' to the remainder of the current page
void oled_write_ln(const char *data, bool invert);
// Pans the buffer to the right (or left by passing true) by moving contents of the buffer
// Useful for moving the screen in preparation for new drawing
// oled_scroll_left or oled_scroll_right should be preferred for all cases of moving a static
// image such as a logo or to avoid burn-in as it's much, much less cpu intensive
void oled_pan(bool left);
// Writes a PROGMEM string to the buffer at current cursor position
// Advances the cursor while writing, inverts the pixels if true
// Remapped to call 'void oled_write(const char *data, bool invert);' on ARM
@@ -235,6 +241,9 @@ void oled_write_ln_P(const char *data, bool invert);
// Writes a string to the buffer at current cursor position
void oled_write_raw(const char *data, uint16_t size);
// Writes a single byte into the buffer at the specified index
void oled_write_raw_byte(const char data, uint16_t index);
// Writes a PROGMEM string to the buffer at current cursor position
void oled_write_raw_P(const char *data, uint16_t size);
@@ -252,12 +261,24 @@ void oled_task(void);
// Called at the start of oled_task, weak function overridable by the user
void oled_task_user(void);
// Scrolls the entire display right
// Set the specific 8 lines rows of the screen to scroll.
// 0 is the default for start, and 7 for end, which is the entire
// height of the screen. For 128x32 screens, rows 4-7 are not used.
void oled_scroll_set_area(uint8_t start_line, uint8_t end_line);
// Sets scroll speed, 0-7, fastest to slowest. Default is three.
// Does not take effect until scrolling is either started or restarted
// the ssd1306 supports 8 speeds with the delay
// listed below betwen each frame of the scrolling effect
// 0=2, 1=3, 2=4, 3=5, 4=25, 5=64, 6=128, 7=256
void oled_scroll_set_speed(uint8_t speed);
// Begin scrolling the entire display right
// Returns true if the screen was scrolling or starts scrolling
// NOTE: display contents cannot be changed while scrolling
bool oled_scroll_right(void);
// Scrolls the entire display left
// Begin scrolling the entire display left
// Returns true if the screen was scrolling or starts scrolling
// NOTE: display contents cannot be changed while scrolling
bool oled_scroll_left(void);

View File

@@ -1,10 +1,10 @@
## Pointing Device
# Pointing Device :id=pointing-device
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and lightweight. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
To enable Pointing Device, uncomment the following line in your rules.mk:
```
```makefile
POINTING_DEVICE_ENABLE = yes
```
@@ -25,7 +25,7 @@ When the mouse report is sent, the x, y, v, and h values are set to 0 (this is d
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
```
```c
case MS_SPECIAL:
report_mouse_t currentReport = pointing_device_get_report();
if (record->event.pressed)

View File

@@ -1,4 +1,4 @@
## PS/2 Mouse Support
# PS/2 Mouse Support :id=ps2-mouse-support
Its possible to hook up a PS/2 mouse (for example touchpads or trackpoints) to your keyboard as a composite device.
@@ -6,7 +6,7 @@ To hook up a Trackpoint, you need to obtain a Trackpoint module (i.e. harvest fr
There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended).
### The Cirtuitry between Trackpoint and Controller
## The Circuitry between Trackpoint and Controller :id=the-circuitry-between-trackpoint-and-controller
To get the things working, a 4.7K drag is needed between the two lines DATA and CLK and the line 5+.
@@ -24,20 +24,20 @@ MODULE 5+ --------+--+--------- PWR CONTROLLER
```
### Busywait Version
## Busywait Version :id=busywait-version
Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
In rules.mk:
```
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_BUSYWAIT = yes
```
In your keyboard config.h:
```
```c
#ifdef PS2_USE_BUSYWAIT
# define PS2_CLOCK_PORT PORTD
# define PS2_CLOCK_PIN PIND
@@ -50,20 +50,20 @@ In your keyboard config.h:
#endif
```
### Interrupt Version
## Interrupt Version :id=interrupt-version
The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
In rules.mk:
```
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
```
In your keyboard config.h:
```
```c
#ifdef PS2_USE_INT
#define PS2_CLOCK_PORT PORTD
#define PS2_CLOCK_PIN PIND
@@ -88,20 +88,20 @@ In your keyboard config.h:
#endif
```
### USART Version
## USART Version :id=usart-version
To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
In rules.mk:
```
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_USART = yes
```
In your keyboard config.h:
```
```c
#ifdef PS2_USE_USART
#define PS2_CLOCK_PORT PORTD
#define PS2_CLOCK_PIN PIND
@@ -145,13 +145,13 @@ In your keyboard config.h:
#endif
```
### Additional Settings
## Additional Settings :id=additional-settings
#### PS/2 Mouse Features
### PS/2 Mouse Features :id=ps2-mouse-features
These enable settings supported by the PS/2 mouse protocol.
```
```c
/* Use remote mode instead of the default stream mode (see link) */
#define PS2_MOUSE_USE_REMOTE_MODE
@@ -170,7 +170,7 @@ These enable settings supported by the PS/2 mouse protocol.
You can also call the following functions from ps2_mouse.h
```
```c
void ps2_mouse_disable_data_reporting(void);
void ps2_mouse_enable_data_reporting(void);
@@ -188,36 +188,36 @@ void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
```
#### Fine Control
### Fine Control :id=fine-control
Use the following defines to change the sensitivity and speed of the mouse.
Note: you can also use `ps2_mouse_set_resolution` for the same effect (not supported on most touchpads).
```
```c
#define PS2_MOUSE_X_MULTIPLIER 3
#define PS2_MOUSE_Y_MULTIPLIER 3
#define PS2_MOUSE_V_MULTIPLIER 1
```
#### Scroll Button
### Scroll Button :id=scroll-button
If you're using a trackpoint, you will likely want to be able to use it for scrolling.
It's possible to enable a "scroll button/s" that when pressed will cause the mouse to scroll instead of moving.
To enable the feature, you must set a scroll button mask as follows:
```
```c
#define PS2_MOUSE_SCROLL_BTN_MASK (1<<PS2_MOUSE_BUTTON_MIDDLE) /* Default */
```
To disable the scroll button feature:
```
```c
#define PS2_MOUSE_SCROLL_BTN_MASK 0
```
The available buttons are:
```
```c
#define PS2_MOUSE_BTN_LEFT 0
#define PS2_MOUSE_BTN_RIGHT 1
#define PS2_MOUSE_BTN_MIDDLE 2
@@ -229,27 +229,28 @@ Once you've configured your scroll button mask, you must configure the scroll bu
This is the interval before which if the scroll buttons were released they would be sent to the host.
After this interval, they will cause the mouse to scroll and will not be sent.
```
```c
#define PS2_MOUSE_SCROLL_BTN_SEND 300 /* Default */
```
To disable sending the scroll buttons:
```
```c
#define PS2_MOUSE_SCROLL_BTN_SEND 0
```
Fine control over the scrolling is supported with the following defines:
```
```c
#define PS2_MOUSE_SCROLL_DIVISOR_H 2
#define PS2_MOUSE_SCROLL_DIVISOR_V 2
```
#### Invert Mouse and Scroll Axes
### Invert Mouse and Scroll Axes :id=invert-mouse-and-scroll-axes
To invert the X and Y axes you can put:
```
```c
#define PS2_MOUSE_INVERT_X
#define PS2_MOUSE_INVERT_Y
```
@@ -258,18 +259,18 @@ into config.h.
To reverse the scroll axes you can put:
```
```c
#define PS2_MOUSE_INVERT_H
#define PS2_MOUSE_INVERT_V
```
into config.h.
#### Debug Settings
### Debug Settings :id=debug-settings
To debug the mouse, add `debug_mouse = true` or enable via bootmagic.
```
```c
/* To debug the mouse reports */
#define PS2_MOUSE_DEBUG_HID
#define PS2_MOUSE_DEBUG_RAW

View File

@@ -1,22 +1,22 @@
# RGB Matrix Lighting
# RGB Matrix Lighting :id=rgb-matrix-lighting
This feature allows you to use RGB LED matrices driven by external drivers. It hooks into the RGBLIGHT system so you can use the same keycodes as RGBLIGHT to control it.
If you want to use single color LED's you should use the [LED Matrix Subsystem](feature_led_matrix.md) instead.
## Driver configuration
## Driver configuration :id=driver-configuration
---
### IS31FL3731
### IS31FL3731 :id=is31fl3731
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
```C
```makefile
RGB_MATRIX_ENABLE = IS31FL3731
```
Configure the hardware via your `config.h`:
```C
```c
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
@@ -39,7 +39,7 @@ Currently only 2 drivers are supported, but it would be trivial to support all 4
Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
```c
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
/* Refer to IS31 manual for these locations
* driver
@@ -55,19 +55,19 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](http://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/issi/is31fl3731.h`. The `driver` is the index of the driver you defined in your `config.h` (`0` or `1` right now).
---
### IS31FL3733/IS31FL3737
### IS31FL3733/IS31FL3737 :id=is31fl3733is31fl3737
!> For the IS31FL3737, replace all instances of `IS31FL3733` below with `IS31FL3737`.
There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`:
```C
```makefile
RGB_MATRIX_ENABLE = IS31FL3733
```
Configure the hardware via your `config.h`:
```C
```c
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
@@ -90,7 +90,7 @@ Currently only a single drivers is supported, but it would be trivial to support
Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
```c
const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
/* Refer to IS31 manual for these locations
* driver
@@ -107,17 +107,17 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
---
### WS2812
### WS2812 :id=ws2812
There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
```C
```makefile
RGB_MATRIX_ENABLE = WS2812
```
Configure the hardware via your `config.h`:
```C
```c
// The pin connected to the data pin of the LEDs
#define RGB_DI_PIN D7
// The number of LEDs connected
@@ -128,7 +128,7 @@ Configure the hardware via your `config.h`:
From this point forward the configuration is the same for all the drivers. The `led_config_t` struct provides a key electrical matrix to led index lookup table, what the physical position of each LED is on the board, and what type of key or usage the LED if the LED represents. Here is a brief example:
```C
```c
const led_config_t g_led_config = { {
// Key Matrix to LED Index
{ 5, NO_LED, NO_LED, 0 },
@@ -146,7 +146,7 @@ const led_config_t g_led_config = { {
The first part, `// Key Matrix to LED Index`, tells the system what key this LED represents by using the key's electrical matrix row & col. The second part, `// LED Index to Physical Position` represents the LED's physical `{ x, y }` position on the keyboard. The default expected range of values for `{ x, y }` is the inclusive range `{ 0..224, 0..64 }`. This default expected range is due to effects that calculate the center of the keyboard for their animations. The easiest way to calculate these positions is imagine your keyboard is a grid, and the top left of the keyboard represents `{ x, y }` coordinate `{ 0, 0 }` and the bottom right of your keyboard represents `{ 224, 64 }`. Using this as a basis, you can use the following formula to calculate the physical position:
```C
```c
x = 224 / (NUMBER_OF_COLS - 1) * COL_POSITION
y = 64 / (NUMBER_OF_ROWS - 1) * ROW_POSITION
```
@@ -157,7 +157,7 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
`// LED Index to Flag` is a bitmask, whether or not a certain LEDs is of a certain type. It is recommended that LEDs are set to only 1 type.
## Flags
## Flags :id=flags
|Define |Description |
|------------------------------------|-------------------------------------------|
@@ -169,7 +169,7 @@ As mentioned earlier, the center of the keyboard by default is expected to be `{
|`#define LED_FLAG_UNDERGLOW 0x02` |If the LED is for underglow. |
|`#define LED_FLAG_KEYLIGHT 0x04` |If the LED is for key backlight. |
## Keycodes
## Keycodes :id=keycodes
All RGB keycodes are currently shared with the RGBLIGHT system:
@@ -189,11 +189,11 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
* `RGB_MODE_*` keycodes will generally work, but are not currently mapped to the correct effects for the RGB Matrix system
## RGB Matrix Effects
## RGB Matrix Effects :id=rgb-matrix-effects
All effects have been configured to support current configuration values (Hue, Saturation, Value, & Speed) unless otherwise noted below. These are the effects that are currently available:
```C
```c
enum rgb_matrix_effects {
RGB_MATRIX_NONE = 0,
RGB_MATRIX_SOLID_COLOR = 1, // Static single hue, no speed support
@@ -285,7 +285,7 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|`#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH` |Disables `RGB_MATRIX_SOLID_MULTISPLASH` |
## Custom RGB Matrix Effects
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
By setting `RGB_MATRIX_CUSTOM_USER` (and/or `RGB_MATRIX_CUSTOM_KB`) in `rules.mk`, new effects can be defined directly from userspace, without having to edit any QMK core files.
@@ -294,7 +294,7 @@ To declare new effects, create a new `rgb_matrix_user/kb.inc` that looks somethi
`rgb_matrix_user.inc` should go in the root of the keymap directory.
`rgb_matrix_kb.inc` should go in the root of the keyboard directory.
```C
```c
// !!! DO NOT ADD #pragma once !!! //
// Step 1.
@@ -341,7 +341,7 @@ static bool my_cool_effect2(effect_params_t* params) {
For inspiration and examples, check out the built-in effects under `quantum/rgb_matrix_animation/`
## Colors
## Colors :id=colors
These are shorthands to popular colors. The `RGB` ones can be passed to the `setrgb` functions, while the `HSV` ones to the `sethsv` functions.
@@ -369,9 +369,9 @@ These are shorthands to popular colors. The `RGB` ones can be passed to the `set
These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h). Feel free to add to this list!
## Additional `config.h` Options
## Additional `config.h` Options :id=additional-configh-options
```C
```c
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
@@ -386,28 +386,98 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
#define RGB_MATRIX_STARTUP_SPD 127 // Sets the default animation speed, if none has been set
```
## EEPROM storage
## EEPROM storage :id=eeprom-storage
The EEPROM for it is currently shared with the RGBLIGHT system (it's generally assumed only one RGB would be used at a time), but could be configured to use its own 32bit address with:
```C
```c
#define EECONFIG_RGB_MATRIX (uint32_t *)28
```
Where `28` is an unused index from `eeconfig.h`.
## Suspended state
## Functions :id=functions
To use the suspend feature, add this to your `<keyboard>.c`:
### Direct Operation :id=direct-operation
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_set_color_all(r, g, b)` |Set all of the LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|`rgb_matrix_set_color(index, r, g, b)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
```C
void suspend_power_down_kb(void)
{
### Disable/Enable Effects :id=disable-enable-effects
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_toggle()` |Toggle effect range LEDs between on and off |
|`rgb_matrix_toggle_noeeprom()` |Toggle effect range LEDs between on and off (not written to EEPROM) |
|`rgb_matrix_enable()` |Turn effect range LEDs on, based on their previous state |
|`rgb_matrix_enable_noeeprom()` |Turn effect range LEDs on, based on their previous state (not written to EEPROM) |
|`rgb_matrix_disable()` |Turn effect range LEDs off |
|`rgb_matrix_disable_noeeprom()` |Turn effect range LEDs off (not written to EEPROM) |
### Change Effect Mode :id=change-effect-mode
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_mode(mode)` |Set the mode, if RGB animations are enabled |
|`rgb_matrix_mode_noeeprom(mode)` |Set the mode, if RGB animations are enabled (not written to EEPROM) |
|`rgb_matrix_step()` |Change the mode to the next RGB animation in the list of enabled RGB animations |
|`rgb_matrix_step_reverse()` |Change the mode to the previous RGB animation in the list of enabled RGB animations |
|`rgb_matrix_increase_speed()` |Increases the speed of the animations |
|`rgb_matrix_decrease_speed()` |Decreases the speed of the animations |
### Change Color :id=change-color
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_increase_hue()` |Increase the hue for effect range LEDs. This wraps around at maximum hue |
|`rgb_matrix_decrease_hue()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue |
|`rgb_matrix_increase_sat()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation |
|`rgb_matrix_decrease_sat()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation |
|`rgb_matrix_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
|`rgb_matrix_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
|`rgb_matrix_sethsv(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgb_matrix_sethsv_noeeprom(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
### Query Current Status :id=query-current-status
|Function |Description |
|-----------------------|-----------------|
|`rgb_matrix_get_mode()` |Get current mode |
|`rgb_matrix_get_hue()` |Get current hue |
|`rgb_matrix_get_sat()` |Get current sat |
|`rgb_matrix_get_val()` |Get current val |
## Callbacks :id=callbacks
### Indicators :id=indicators
If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that:
```c
void rgb_matrix_indicators_kb(void) {
rgb_matrix_set_color(index, red, green, blue);
}
```
### Suspended state :id=suspended-state
To use the suspend feature, make sure that `#define RGB_DISABLE_WHEN_USB_SUSPENDED true` is added to the `config.h` file.
Additionally add this to your `<keyboard>.c`:
```c
void suspend_power_down_kb(void) {
rgb_matrix_set_suspend_state(true);
suspend_power_down_user();
}
void suspend_wakeup_init_kb(void) {
rgb_matrix_set_suspend_state(false);
suspend_wakeup_init_user();
}
```
or add this to your `keymap.c`:
```c
void suspend_power_down_user(void) {
rgb_matrix_set_suspend_state(true);
}
void suspend_wakeup_init_kb(void)
{
void suspend_wakeup_init_user(void) {
rgb_matrix_set_suspend_state(false);
}
```

View File

@@ -172,6 +172,64 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
```
## Lighting Layers
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently:
```c
// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{6, 4, HSV_RED}, // Light 4 LEDs, starting with LED 6
{12, 4, HSV_RED} // Light 4 LEDs, starting with LED 12
);
// Light LEDs 9 & 10 in cyan when keyboard layer 1 is active
const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{9, 2, HSV_CYAN}
);
// Light LEDs 11 & 12 in purple when keyboard layer 2 is active
const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{11, 2, HSV_PURPLE}
);
// etc..
```
We combine these layers into an array using the `RGBLIGHT_LAYERS_LIST` macro, and assign it to the `rgblight_layers` variable during keyboard setup. Note that you can only define up to 8 lighting layers. Any extra layers will be ignored. Since the different lighting layers overlap, the order matters in the array, with later layers taking precedence:
```c
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
my_capslock_layer,
my_layer1_layer, // Overrides caps lock layer
my_layer2_layer // Overrides other layers
);
void keyboard_post_init_user(void) {
// Enable the LED layers
rgblight_layers = my_rgb_layers;
}
```
Finally, we enable and disable the lighting layers whenever the state of the keyboard changes:
```c
layer_state_t layer_state_set_user(layer_state_t state) {
// Both layers will light up if both kb layers are active
rgblight_set_layer_state(1, layer_state_cmp(state, 1));
rgblight_set_layer_state(2, layer_state_cmp(state, 2));
return state;
}
bool led_update_user(led_t led_state) {
rgblight_set_layer_state(0, led_state.caps_lock);
return true;
}
```
Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
## Functions
If you need to change your RGB lighting in code, for example in a macro to change the color whenever you switch layers, QMK provides a set of functions to assist you. See [`rgblight.h`](https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight.h) for the full list, but the most commonly used functions include:
@@ -263,6 +321,12 @@ rgblight_sethsv(HSV_GREEN, 2); // led 2
|`rgblight_sethsv(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgblight_sethsv_noeeprom(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
#### layer functions
|Function |Description |
|--------------------------------------------|-------------|
|`rgblight_get_layer_state(i)` |Returns `true` if lighting layer `i` is enabled |
|`rgblight_set_layer_state(i, is_on)` |Enable or disable lighting layer `i` based on value of `bool is_on` |
#### query
|Function |Description |
|-----------------------|-----------------|

View File

@@ -1,16 +1,16 @@
# Stenography in QMK
# Stenography in QMK :id=stenography-in-qmk
[Stenography](https://en.wikipedia.org/wiki/Stenotype) is a method of writing most often used by court reports, closed-captioning, and real-time transcription for the deaf. In stenography words are chorded syllable by syllable with a mixture of spelling, phonetic, and shortcut (briefs) strokes. Professional stenographers can reach 200-300 WPM without any of the strain usually found in standard typing and with far fewer errors (>99.9% accuracy).
The [Open Steno Project](http://www.openstenoproject.org/) has built an open-source program called Plover that provides real-time translation of steno strokes into words and commands. It has an established dictionary and supports
## Plover with QWERTY Keyboard
## Plover with QWERTY Keyboard :id=plover-with-qwerty-keyboard
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
To use Plover with QMK just enable NKRO and optionally adjust your layout if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
## Plover with Steno Protocol
## Plover with Steno Protocol :id=plover-with-steno-protocol
Plover also understands the language of several steno machines. QMK can speak a couple of these languages, TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`.
@@ -20,26 +20,26 @@ In this mode Plover expects to speak with a steno machine over a serial port so
> Note: Due to hardware limitations you may not be able to run both a virtual serial port and mouse emulation at the same time.
### TX Bolt
### TX Bolt :id=tx-bolt
TX Bolt communicates the status of 24 keys over a very simple protocol in variable-sized (1-5 byte) packets.
### GeminiPR
### GeminiPR :id=geminipr
GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including supporting non-English theories.
## Configuring QMK for Steno
## Configuring QMK for Steno :id=configuring-qmk-for-steno
Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
```Makefile
```makefile
STENO_ENABLE = yes
MOUSEKEY_ENABLE = no
```
In your keymap create a new layer for Plover. You will need to include `keymap_steno.h`. See `planck/keymaps/steno/keymap.c` for an example. Remember to create a key to switch to the layer as well as a key for exiting the layer. If you would like to switch modes on the fly you can use the keycodes `QK_STENO_BOLT` and `QK_STENO_GEMINI`. If you only want to use one of the protocols you may set it up in your initialization function:
```C
```c
void matrix_init_user() {
steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT
}
@@ -49,37 +49,37 @@ Once you have your keyboard flashed launch Plover. Click the 'Configure...' butt
On the display tab click 'Open stroke display'. With Plover disabled you should be able to hit keys on your keyboard and see them show up in the stroke display window. Use this to make sure you have set up your keymap correctly. You are now ready to steno!
## Learning Stenography
## Learning Stenography :id=learning-stenography
* [Learn Plover!](https://sites.google.com/site/ploverdoc/)
* [Learn Plover!](https://sites.google.com/site/learnplover/)
* [QWERTY Steno](http://qwertysteno.com/Home/)
* [Steno Jig](https://joshuagrams.github.io/steno-jig/)
* More resources at the Plover [Learning Stenography](https://github.com/openstenoproject/plover/wiki/Learning-Stenography) wiki
## Interfacing with the code
## Interfacing with the code :id=interfacing-with-the-code
The steno code has three interceptible hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
```C
```c
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
```
This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen.
```C
```c
bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
```
This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values.
```C
```c
bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
```
This function is called after a key has been processed, but before any decision about whether or not to send a chord. If `IS_PRESSED(record->event)` is false, and `pressed` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This is where to put hooks for things like, say, live displays of steno chords or keys.
## Keycode Reference
## Keycode Reference :id=keycode-reference
As defined in `keymap_steno.h`.

View File

@@ -335,7 +335,7 @@ If you want to implement this in your userspace, then you may want to check out
> In this configuration "hold" takes place **after** tap dance timeout (see `ACTION_TAP_DANCE_FN_ADVANCED_TIME`). To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys
Tap dance can be used to emulate `MT()` and `LT()` behavior when the tapped code is not a basic keycode. This is useful to send tapped keycodes that normally require `Shift`, such as parentheses or curly braces—or other modified keycodes, such as `Control + X`.

View File

@@ -193,12 +193,23 @@ By default, when the keyboard boots, it will initialize the input mode to the la
!> Using `UNICODE_SELECTED_MODES` means you don't have to initially set the input mode in `matrix_init_user()` (or a similar function); the Unicode system will do that for you on startup. This has the added benefit of avoiding unnecessary writes to EEPROM.
## `send_unicode_hex_string`
## `send_unicode_string()`
To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values separate by spaces.
For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")`
This function is much like `send_string()` but allows you to input UTF-8 characters directly, and supports all code points (provided the selected input method also supports it). Make sure your `keymap.c` is formatted in UTF-8 encoding.
There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string.
```c
send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
```
## `send_unicode_hex_string()`
Similar to `send_unicode_string()`, but the characters are represented by their code point values in ASCII, separated by spaces. For example, the table flip above would be achieved with:
```c
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
```
An easy way to convert your Unicode string to this format is by using [this site](https://r12a.github.io/app-conversion/), and taking the result in the "Hex/UTF-32" section.
## Additional Language Support
@@ -228,6 +239,6 @@ AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
If you enable the US International layout on the system, it will use punctuation to accent the characters.
For instance, typing "`a" will result in à.
For instance, typing "\`a" will result in à.
You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout).

View File

@@ -97,13 +97,25 @@ You'd want to replace the year, name, email and github username with your info.
Additionally, this is a good place to document your code, if you wish to share it with others.
# Examples
## Build All Keyboards That Support a Specific Keymap
Want to check all your keymaps build in a single command? You can run:
make all:<name>
For example,
make all:jack
This is ideal for when you want ensure everything compiles successfully when preparing a [_Pull request_](https://github.com/qmk/qmk_firmware/pulls).
## Examples
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna).
For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace.
## Customized Functions
### Customized Functions
QMK has a bunch of [functions](custom_quantum_functions.md) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions.md#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap.
@@ -130,7 +142,7 @@ The `_keymap` part here doesn't matter, it just needs to be something other than
You can see a list of this and other common functions in [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in [`users/drashna`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna).
## Custom Features
### Custom Features
Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace.
@@ -166,7 +178,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
```
## Consolidated Macros
### Consolidated Macros
If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too.

25
docs/feature_wpm.md Normal file
View File

@@ -0,0 +1,25 @@
# Word Per Minute (WPM) Calculcation
The WPM feature uses time between keystrokes to compute a rolling average words
per minute rate and makes this available for various uses.
Enable the WPM system by adding this to your `rules.mk`:
WPM_ENABLE = yes
For split keyboards using soft serial, the computed WPM
score will be available on the master AND slave half.
## Public Functions
`uint8_t get_current_wpm(void);`
This function returns the current WPM as an unsigned integer.
## Customized keys for WPM calc
By default, the WPM score only includes letters, numbers, space and some
punctuation. If you want to change the set of characters considered as part of
the WPM calculation, you can implement `wpm_keycode_user(uint16_t keycode)`
and return true for any characters you would like included in the calculation,
or false to not count that particular keycode.

View File

@@ -1,42 +0,0 @@
# 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 achieve your goal.
* [Advanced Keycodes](feature_advanced_keycodes.md) - Change layers, dual-action 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.
* [Bluetooth](feature_bluetooth.md) - BlueTooth support for your keyboard.
* [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys.
* [Combos](feature_combo.md) - Custom actions for multiple key holds.
* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic").
* [Debounce API](feature_debounce_type.md) - Customization of debouncing algorithms, and the ability to add more/custom debouncing.
* [DIP Switch](feature_dip_switch.md) - Toggle switches for customizing board function.
* [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself.
* [Encoders](feature_encoders.md) - Rotary encoders!
* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave.
* [Haptic Feedback](feature_haptic_feedback.md) - Add haptic feedback drivers to your board.
* [HD44780 LCD Display](feature_hd44780.md) - Support for LCD character displays using the HD44780 standard.
* [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.
* [LED Matrix](feature_led_matrix.md) - LED Matrix single color lights for per key lighting (Single Color, not RGB).
* [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.
* [OLED Driver](feature_oled_driver.md) - Add OLED screens to your keyboard.
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - Sticky Keys, lets you hit a key rather than holding it.
* [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 PS/2 mouse directly to your keyboard.
* [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard.
* [RGB Matrix](feature_rgb_matrix.md) - RGB Matrix lights for per key lighting.
* [Space Cadet](feature_space_cadet.md) - Use your left/right shift keys to type parenthesis and brackets.
* [Split Keyboard](feature_split_keyboard.md)
* [Stenography](feature_stenography.md) - Put your keyboard into Plover mode for stenography use.
* [Swap Hands](feature_swap_hands.md) - Mirror your keyboard for one handed usage.
* [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.
* [Velocikey](feature_velocikey.md) - Allows changes in RGB animation speed based on WPM/Typing speed.

View File

@@ -1,8 +1,8 @@
# Flashing Instructions and Bootloader Information
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.
There are quite a few different types of bootloaders that keyboards use, and just about all of them 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.
If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size in bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`.
If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size in bytes (along with the max).
## DFU
@@ -100,7 +100,7 @@ or
make <keyboard>:<keymap>:avrdude
#### Caterina commands
### Caterina commands
There are a number of DFU commands that you can use to flash firmware to a DFU device:
@@ -113,7 +113,7 @@ There are a number of DFU commands that you can use to flash firmware to a DFU d
## Halfkay
Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on all Teensys (namely the 2.0).
Halfkay is a super-slim protocol developed by PJRC that uses HID, and comes on all Teensys (namely the 2.0).
To ensure compatibility with the Halfkay bootloader, make sure this block is present your `rules.mk`:

View File

@@ -81,7 +81,7 @@
* [Macros](fr-fr/feature_macros.md)
* [Boutons de souris](fr-fr/feature_mouse_keys.md)
* [Pilotes / Drivers OLED](fr-fr/feature_oled_driver.md)
* [Touche one-shot](fr-fr/feature_advanced_keycodes.md#one-shot-keys)
* [Touche one-shot](fr-fr/one_shot_keys.md)
* [Périphériques de pointage](fr-fr/feature_pointing_device.md)
* [Souris PS/2](fr-fr/feature_ps2_mouse.md)
* [Éclairage RGB](fr-fr/feature_rgblight.md)
@@ -112,7 +112,7 @@
* Autres sujets
* [Utiliser Eclipse avec QMK](fr-fr/other_eclipse.md)
* [Utiliser VSCode avec QMK](fr-fr/other_vscode.md)
* [Support](fr-fr/support.md)
* [Support](fr-fr/getting_started_getting_help.md)
* [Comment ajouter des traductions](fr-fr/translating.md)
* À lintérieur de QMK (En cours de documentation)

View File

@@ -4,7 +4,7 @@ Le [Configurateur de QMK](https://config.qmk.fm) est une interface graphique en
?> **S'il vous plaît, suivez les étapes suivantes dans l'ordre.**
Regardez le [Tutoriel vidéo](https://youtu.be/tx54jkRC9ZY)
Regardez le [Tutoriel vidéo](https://youtu.be/tx54jkRC9ZY)https://www.youtube.com/watch?v=-imgglzDMdY)
Le configurateur de QMK fonctionne mieux avec Chrome et Firefox.

View File

@@ -1,141 +0,0 @@
# Installing Build Tools
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. -->
**Note:** If this is your first time here, check out the [Complete Newbs Guide](newbs.md) page.
Before continuing, double check that your submodules (third-party libraries) are up to date by running `make git-submodule`.
## Linux
To ensure you are always up to date, you can just run `sudo util/qmk_install.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.**
You can also install things manually, but this documentation might not be always up to date with all requirements.
The current requirements are the following, but not all might be needed depending on what you do. Also note that some systems might not have all the dependencies available as packages, or they might be named differently.
```
build-essential
gcc
unzip
wget
zip
gcc-avr
binutils-avr
avr-libc
dfu-programmer
dfu-util
gcc-arm-none-eabi
binutils-arm-none-eabi
libnewlib-arm-none-eabi
git
```
Install the dependencies with your favorite package manager.
Debian / Ubuntu example:
sudo apt-get update
sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
Fedora / Red Hat example:
sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
Arch / Manjaro example:
pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git dfu-programmer dfu-util
## Nix
If you're on [NixOS](https://nixos.org/), or have Nix installed on Linux or macOS, run `nix-shell` from the repository root to get a build environment.
By default, this will download compilers for both AVR and ARM. If you don't need both, disable the `avr` or `arm` arguments, e.g.:
nix-shell --arg arm false
## macOS
If you're using [Homebrew](http://brew.sh/), you can use the following commands:
brew tap osx-cross/avr
brew tap osx-cross/arm
brew update
brew install avr-gcc@8
brew link --force avr-gcc@8
brew install dfu-programmer
brew install dfu-util
brew install arm-gcc-bin@8
brew link --force arm-gcc-bin@8
brew install avrdude
This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of `avr-gcc@8` can take over 20 minutes and exhibit high CPU usage.
## 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).
* 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 repository. For example, if it's in the root of your c drive:
* `$ cd /c/qmk_firmware`
* Run `util/qmk_install.sh` and follow the prompts
## Windows 10 (deprecated)
These are the old instructions for Windows 10. We recommend you use [MSYS2 as outlined above](#windows-with-msys2-recommended).
### Creators Update
If you have Windows 10 with Creators Update or later, you can build and flash the firmware directly. Before the Creators Update, only building was possible. If you don't have it yet or if are unsure, follow [these instructions](https://support.microsoft.com/en-us/instantanswers/d4efb316-79f0-1aa1-9ef3-dcada78f3fa0/get-the-windows-10-creators-update).
### Windows Subsystem for Linux
In addition to the Creators Update, you need Windows 10 Subystem for Linux, so install it following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/). If you already have the Windows 10 Subsystem for Linux from the Anniversary update it's recommended that you [upgrade](https://betanews.com/2017/04/14/upgrade-windows-subsystem-for-linux/) it to 16.04LTS, because some keyboards don't compile with the toolchains included in 14.04LTS. Note that you need to know what your are doing if you chose the `sudo do-release-upgrade` method.
### Git
If you already have cloned the repository on your Windows file system you can ignore this section.
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.
### 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.
1. Open "Bash On Ubuntu On Windows" from the start menu.
2. Go to the directory where you cloned `qmk_firmware`. Note that the paths start with `/mnt/` in the WSL, so you have to write for example `cd /mnt/c/path/to/qmk_firmware`.
3. Run `util/wsl_install.sh` and follow the on-screen instructions.
4. Close the Bash command window, and re-open it.
5. You are ready to compile and flash the firmware!
### Some Important Things to Keep in Mind
* You can run `util/wsl_install.sh` again to get all the newest updates.
* Your QMK repository need to be on a Windows file system path, since WSL can't run executables outside it.
* The WSL Git is **not** compatible with the Windows Git, so use the Windows Git Bash or a windows Git GUI for all Git operations
* You can edit files either inside WSL or normally using Windows, but note that if you edit makefiles or shell scripts, make sure you are using an editor that saves the files with Unix line endings. Otherwise the compilation might not work.
## Docker
If this is a bit complex for you, Docker might be the turnkey solution you need. After installing [Docker CE](https://docs.docker.com/install/#supported-platforms), run the following command from the `qmk_firmware` directory to build a keyboard/keymap:
```bash
util/docker_build.sh keyboard:keymap
# For example: util/docker_build.sh ergodox_ez:steno
```
This will compile the desired keyboard/keymap and leave the resulting `.hex` or `.bin` file in the QMK directory for you to flash. If `:keymap` is omitted, all keymaps are used. Note that the parameter format is the same as when building with `make`.
You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use:
```bash
util/docker_build.sh
# Reads parameters as input (leave blank for all keyboards/keymaps)
```
There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well:
```bash
util/docker_build.sh keyboard:keymap:target
# For example: util/docker_build.sh planck/rev6:default:flash
```
If you're on Linux, this should work out of the box. On Windows and macOS, it requires [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) to be running. This is tedious to set up, so it's not recommended; use [QMK Toolbox](https://github.com/qmk/qmk_toolbox) instead.
!> Docker for Windows requires [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) to be enabled. This means that it cannot work on versions of Windows which don't have Hyper-V, such as Windows 7, Windows 8 and **Windows 10 Home**.
## 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](getting_started_vagrant.md).

View File

@@ -1,15 +0,0 @@
# Getting Help
There are a lot of resources for getting help with QMK.
## Realtime Chat
You can find QMK developers and users on our main [Discord server](https://discord.gg/Uq7gcHh). There are specific channels in the server for chatting about the firmware, Toolbox, hardware, and configurator.
## OLKB Subreddit
The official QMK forum is [/r/olkb](https://reddit.com/r/olkb) on [reddit.com](https://reddit.com).
## Github Issues
You can open an [issue on GitHub](https://github.com/qmk/qmk_firmware/issues). This is especially handy when your issue will require long-term discussion or debugging.

View File

@@ -1,114 +1,5 @@
# Hand-Wiring Guide
## Preamble: How a Keyboard Matrix Works (and why we need diodes)
The collapsible section below covers why keyboards are wired the way they are, as outlined in this guide. It isn't required reading to make your own hand wired keyboard, but provides background information.
<details>
<summary>Click for details</summary>
Without a matrix circuit each switch would require its own wire directly to the controller.
Simply put, when the circuit is arranged in rows and columns, if a key is pressed, a column wire makes contact with a row wire and completes a circuit. The keyboard controller detects this closed circuit and registers it as a key press.
The microcontroller will be setup up via the firmware to send a logical 1 to the columns, one at a time, and read from the rows, all at once - this process is called matrix scanning. The matrix is a bunch of open switches that, by default, don't allow any current to pass through - the firmware will read this as no keys being pressed. As soon as you press one key down, the logical 1 that was coming from the column the keyswitch is attached to gets passed through the switch and to the corresponding row - check out the following 2x2 example:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
row0 ---(key0)---(key1) row0 ---(key0)---(key1)
| | | |
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
The `x` represents that the column/row associated has a value of 1, or is HIGH. Here, we see that no keys are being pressed, so no rows get an `x`. For one keyswitch, keep in mind that one side of the contacts is connected to its row, and the other, its column.
When we press `key0`, `col0` gets connected to `row0`, so the values that the firmware receives for that row is `0b01` (the `0b` here means that this is a bit value, meaning all of the following digits are bits - 0 or 1 - and represent the keys in that column). We'll use this notation to show when a keyswitch has been pressed, to show that the column and row are being connected:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1)
| | | |
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
We can now see that `row0` has an `x`, so has the value of 1. As a whole, the data the firmware receives when `key0` is pressed is
col0: 0b01
col1: 0b00
│└row0
└row1
A problem arises when you start pressing more than one key at a time. Looking at our matrix again, it should become pretty obvious:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1)
| | | |
x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3)
Remember that this ^ is still connected to row1
The data we get from that is:
col0: 0b11
col1: 0b11
│└row0
└row1
Which isn't accurate, since we only have 3 keys pressed down, not all 4. This behavior is called ghosting, and only happens in odd scenarios like this, but can be much more common on a bigger keyboard. The way we can get around this is by placing a diode after the keyswitch, but before it connects to its row. A diode only allows current to pass through one way, which will protect our other columns/rows from being activated in the previous example. We'll represent a dioded matrix like this;
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
│ │ | │
(key0) (key1) (key0) (key1)
! │ ! │ ! | ! │
row0 ─────┴────────┘ │ row0 ─────┴────────┘ │
│ │ | │
(key2) (key3) (key2) (key3)
! ! ! !
row1 ─────┴────────┘ row1 ─────┴────────┘
In practical applications, the black line of the diode will be placed facing the row, and away from the keyswitch - the `!` in this case is the diode, where the gap represents the black line. A good way to remember this is to think of this symbol: `>|`
Now when we press the three keys, invoking what would be a ghosting scenario:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
│ │ │ │
(┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1)
! │ ! │ ! │ ! │
x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │
│ │ │ │
(key2) (┌─┘3) (key2) (┌─┘3)
! ! ! !
row1 ─────┴────────┘ x row1 ─────┴────────┘
Things act as they should! Which will get us the following data:
col0: 0b01
col1: 0b11
│└row0
└row1
The firmware can then use this correct data to detect what it should do, and eventually, what signals it needs to send to the OS.
Further reading:
- [Wikipedia article](https://en.wikipedia.org/wiki/Keyboard_matrix_circuit)
- [Deskthority article](https://deskthority.net/wiki/Keyboard_matrix)
- [Keyboard Matrix Help by Dave Dribin (2000)](https://www.dribin.org/dave/keyboard/one_html/)
- [How Key Matrices Works by PCBheaven](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) (animated examples)
- [How keyboards work - QMK documentation](how_keyboards_work.md)
</details>
## Parts list
You will need: (where *x* is the number of keys on your planned keyboard)
@@ -141,29 +32,29 @@ Start by installing the switches and stabilisers in the plate. Depending on the
If you are following a pre-existing handwire guide (e.g. for the keyboards in the [handwire firmware section](https://github.com/qmk/qmk_firmware/tree/master/keyboards/handwired) you can skip this step, just ensure you wire the matrix as described.
What you want to achieve is one leg from each switch being attached to the corresponding switches next to it (rows) and the other leg being attached to the switches above and below it (columns) and a diode to one of the legs, mosy commonly this will be the leg attached to the rows, and the diode will face away from it (Column to Row) i.e. with the wire furthest from the black line on the diode connected to the switch (as current will only travel in one direction through a diode)
What you want to achieve is one leg from each switch being attached to the corresponding switches next to it (rows) and the other leg being attached to the switches above and below it (columns) and a diode to one of the legs, mosy commonly this will be the leg attached to the rows, and the diode will face away from it (Column to Row) i.e. with the wire furthest from the black line on the diode connected to the switch (as current will only travel in one direction through a diode).
It is fairly simple to plan for an ortholinear keyboard (like a Planck).
![Example planck matrix](https://i.imgur.com/FRShcLD.png)
![Example Planck matrix](https://i.imgur.com/FRShcLD.png)
Image from [RoastPotatoes' "How to hand wire a Planck"](https://blog.roastpotatoes.co/guide/2015/11/04/how-to-handwire-a-planck/)
But the larger and more complicated your keyboard, the more complex the matrix. [Keyboard Firmware Builder](https://kbfirmware.com/) can help you plan your matrix layout (shown here with a basic fullsize ISO keyboard imported from [Keyboard Layout Editor](http://www.keyboard-layout-editor.com).
![Example ISO matrix](https://i.imgur.com/UlJ4ZDP.png)
Bear in mind that the number of rows plus the number of columns can not exceed the number of I/O pins on your controller. So the fullsize matrix shown above would be possible on a Proton C or Teensy++, but not on a regular Teensy or Pro Micro
Bear in mind that the number of rows plus the number of columns can not exceed the number of I/O pins on your controller. So the fullsize matrix shown above would be possible on a Proton C or Teensy++, but not on a regular Teensy or Pro Micro.
#### Common Microcontroller Boards
### Common Microcontroller Boards
| Board | Controller | # I/O | Pinout |
| :------------ |:-------------:| ------:| ------ |
| Pro Micro* | ATmega32u4 | 20 | [link](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro#Teensy++_2.0) |
| Pro Micro* | ATmega32u4 | 20 | [link](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro#Teensy++_2.0) |
| Teensy 2.0 | ATmega32u4 | 25 | [link](https://www.pjrc.com/teensy/pinout.html) |
| [QMK Proton C](https://qmk.fm/proton-c/) | STM32F303xC | 36 | [link 1](https://i.imgur.com/RhtrAlc.png), [2](https://deskthority.net/wiki/QMK_Proton_C) |
| Teensy++ 2.0 | AT90USB1286 | 46 | [link](https://www.pjrc.com/teensy/pinout.html#Teensy_2.0) |
*Elite C is essentially the same as a pro micro with a USB-C instead of Micro-USB
*Elite C is essentially the same as a Pro Micro with a USB-C instead of Micro-USB
There are also a number of boards designed specifically for handwiring that mount directly to a small number of switches and offer pinouts for the rest. Though these are generally more expensive and may be more difficult to get hold of.
@@ -204,7 +95,7 @@ If you are planning a split keyboard (e.g. Dactyl) each half will require a cont
There are a lot of soldering guides and tips available elsewhere but here are some of the most useful and relevant for hand wiring:
To ensure a strong solder joint you want a good amount of contact between the solder and the 2 peices of metal you are connecting, a good way of doing this (though not required) is looping around pins or twisting wires together before applying solder.
To ensure a strong solder joint you want a good amount of contact between the solder and the two pieces of metal you are connecting. A good way of doing this (though not required) is looping around pins or twisting wires together before applying solder.
<img src="https://i.imgur.com/eHJjmnU.jpg" alt="Looped around rod" width="200"/> <img src="https://i.imgur.com/8nbxmmr.jpg?1" alt="Looped diode leg" width="200"/>
@@ -220,24 +111,11 @@ When you come to apply the solder, hold the soldering iron against the two surfa
Don't hold the iron on the solder/joint longer than necessary. Heat will be conducted through the surfaces and can damage components (melt switch housings etc.). Also, solder contains flux, which aids in ["wetting"](https://en.m.wikipedia.org/wiki/Wetting). The longer heat is applied to the solder the more flux will evaporate meaning you may end up with a bad solder joint with peaks which, apart from looking bad, may also increase the risk of electrical shorts.
The following collapsible section describes in detail how to solder rows using the bent diode technique and columns using short lengths of wire.
#### Soldering the Diodes
<details>
Starting at the top-left switch, place the diode (with tweezers if you have them) on the switch so that the diode itself is vertically aligned, and the black line is facing toward you. The input lead of the diode should be touching the left contact on the switch, and the bent, output end should be facing to the right and resting on the switch there, like this:
<summary>Click for details</summary>
## Soldering the Diodes
Starting at the top-left switch, place the diode (with tweezers if you have them) on the switch so that the diode itself is vertically aligned, and the black line is facing toward you. The straight end of the diode should be touching the left contact on the switch, and the bent end should be facing to the right and resting on the switch there, like this:
```
│o
┌┴┐ o
│ │ O
├─┤
└┬┘
└─────────────
```
![soldering-diodes-01.png](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/docs/hand_wire/soldering-diodes-01.png)
Letting the diode rest, grab your solder, and touch both it and the soldering iron to the left contact at the same time - the rosin in the solder should make it easy for the solder to flow over both the diode and the keyswitch contact. The diode may move a little, and if it does, carefully position it back it place by grabbing the bent end of the diode - the other end will become hot very quickly. If you find that it's moving too much, using needle-nose pliers of some sort may help to keep the diode still when soldering.
@@ -247,20 +125,13 @@ After soldering things in place, it may be helpful to blow on the joint to push
When the first diode is complete, the next one will need to be soldered to both the keyswitch, and the previous diode at the new elbow. That will look something like this:
```
│o │o
┌┴┐ o ┌┴┐ o
│ │ O │ │ O
├─┤ ├─┤
└┬┘ └┬┘
└────────────────┴─────────────
```
![soldering-diodes-02.png](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/docs/hand_wire/soldering-diodes-02.png)
After completing a row, use the wire cutters to trim the excess wire from the tops of the diodes, and from the right side on the final switch. This process will need to completed for each row you have.
When all of the diodes are completely soldered, it's a good idea to quickly inspect each one to ensure that your solder joints are solid and sturdy - repairing things after this is possible, but more difficult.
## Soldering the Columns
#### Soldering the Columns
You'll have some options in the next process - it's a good idea to insulate the column wires (since the diodes aren't), but if you're careful enough, you can use exposed wires for the columns - it's not recommended, though. If you're using single-cored wire, stripping the plastic off of the whole wire and feeding it back on is probably the best option, but can be difficult depending on the size and materials. You'll want to leave parts of the wire exposed where you're going to be solder it onto the keyswitch.
@@ -270,9 +141,7 @@ Before beginning to solder, it helps to have your wire pre-bent (if using single
If you're not using any insulation, you can try to keep the column wires elevated, and solder them near the tips of the keyswitch contacts - if the wires are sturdy enough, they won't short out to the row wiring an diodes.
</details>
# Wiring up the controller
## Wiring up the controller
Now that the matrix itself is complete, it's time to connect what you've done to the microcontroller board.
@@ -280,15 +149,16 @@ Place the microcontroller where you want it to be located, give thought to mount
Find the pinout/documentation for your microcontroller board ([links here](#common-microcontroller-boards)) and make a note of all the digital I/O pins on it (note that on some controllers, like the teensy, analogue I/O can double as digital) as these are the pins you want to connect your wires to.
<details>
----
<summary>Specific instructions for the Teensy 2.0</summary>
### Specific instructions for the Teensy 2.0
There are some pins on the Teensy that are special, like D6 (the LED on the chip), or some of the UART, SPI, I2C, or PWM channels, but only avoid those if you're planning something in addition to a keyboard. If you're unsure about wanting to add something later, you should have enough pins in total to avoid a couple.
There are some pins on the Teensy that are special, like D6 (the LED on the chip), or some of the UART, SPI, I2C, or PWM channels, but only avoid those if you're planning something in addition to a keyboard. If you're unsure about wanting to add something later, you should have enough pins in total to avoid a couple.
The pins you'll absolutely have to avoid, as with any controller, are: GND, VCC, AREF, and RST - all the others are usable and accessible in the firmware.
</details>
----
Cut wires to the length of the distance from the a point on each column/row to the controller. You can solder anywhere along the row, as long as it's after the diode - soldering before the diode (on the keyswitch side) will cause that row not to work.
@@ -301,150 +171,32 @@ As you solder the wires to the controller make a note of which row/column is goi
As you move along, be sure that the controller is staying in place - recutting and soldering the wires is a pain!
# Getting Some Basic Firmware Set Up
## Getting Some Basic Firmware Set Up
From here, you should have a working keyboard once you program a firmware.
Simple firmware can be created easily using the [Keyboard Firmware Builder](https://kbfirmware.com/) website. Recreate your layout using [Keyboard Layout Editor](http://www.keyboard-layout-editor.com), import it and recreate the matrix (if not already done as part of [planning the matrix](#planning-the-matrix).
Go through the rest of the tabs, assigning keys until you get to the last one where you can compile and download your firmware. The .hex file can be flashed straight onto your keyboard, and the .zip of source files can be modified for advanced functionality and compiled locally using the method described in the collapsable section below, or using the more comprehensive [getting started guide.](newbs_getting_started)
Go through the rest of the tabs, assigning keys until you get to the last one where you can compile and download your firmware. The .hex file can be flashed straight onto your keyboard, and the .zip of source files can be modified for advanced functionality and compiled locally using the method described in [Building Your First Firmware](newbs_building_firmware?id=build-your-firmware).
The source given by Keyboard Firmware Builder is QMK, but is based on a version of QMK from early 2017. To compile the code from your .zip file in a modern version of QMK Firmware, you'll need to open the .zip and follow these instructions:
<details>
<summary>Creating and compiling your firmware locally (command line method)</summary>
To start out, download [the firmware](https://github.com/qmk/qmk_firmware/) - We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/) (paid) or [Visual Studio Code](https://code.visualstudio.com) (free).
The first thing we're going to do is create a new keyboard. In your terminal, run this command, which will ask you some questions and generate a basic keyboard project:
```
./util/new_keyboard.sh
```
You'll want to navigate to the `keyboards/<project_name>/` folder by typing, like the print-out from the script specifies:
```
cd keyboards/<project_name>
```
### `config.h`
The first thing you're going to want to modify is the `config.h` file. Find `MATRIX_ROWS` and `MATRIX_COLS` and change their definitions to match the dimensions of your keyboard's matrix.
Farther down are `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`. Change their definitions to match how you wired up your matrix (looking from the top of the keyboard, the rows run top-to-bottom and the columns run left-to-right). Likewise, change the definition of `UNUSED_PINS` to match the pins you did not use (this will save power).
### `<project_name>.h`
The next file you'll want to look at is `<project_name>.h`. You're going to want to rewrite the `LAYOUT` definition - the format and syntax here is extremely important, so pay attention to how things are setup. The first half of the definition are considered the arguments - this is the format that you'll be following in your keymap later on, so you'll want to have as many k*xy* variables here as you do keys. The second half is the part that the firmware actually looks at, and will contain gaps depending on how you wired your matrix.
We'll dive into how this will work with the following example. Say we have a keyboard like this:
```
┌───┬───┬───┐
│ │ │ │
├───┴─┬─┴───┤
│ │ │
└─────┴─────┘
```
This can be described by saying the top row is 3 1u keys, and the bottom row is 2 1.5u keys. The difference between the two rows is important, because the bottom row has an unused column spot (3 v 2). Let's say that this is how we wired the columns:
```
┌───┬───┬───┐
│ ┋ │ ┋ │ ┋ │
├─┋─┴─┬─┴─┋─┤
│ ┋ │ ┋ │
└─────┴─────┘
```
The middle column is unused on the bottom row in this example. Our `LAYOUT` definition would look like this:
```
#define LAYOUT( \
k00, k01, k02, \
k10, k11, \
) \
{ \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
1. Extract the `kb` folder to `qmk_firmware/keyboards/handwired/`.
2. Open the extracted `kb` folder, then proceed to the `keymaps/default/` folder, and open `keymap.c`.
3. Locate and delete the `action_get_macro` code block:
```
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
...
return MACRO_NONE;
}
```
Notice how the top half is spaced to resemble our physical layout - this helps us understand which keys are associated with which columns. The bottom half uses the keycode `KC_NO` where there is no keyswitch wired in. It's easiest to keep the bottom half aligned in a grid to help us make sense of how the firmware actually sees the wiring.
Let's say that instead, we wired our keyboard like this (a fair thing to do):
```
┌───┬───┬───┐
│ ┋ │ ┋│ ┋ │
├─┋─┴─┬┋┴───┤
│ ┋ │┋ │
└─────┴─────┘
```
This would require our `LAYOUT` definition to look like this:
```
#define LAYOUT( \
k00, k01, k02, \
k10, k11, \
) \
{ \
{ k00, k01, k02 }, \
{ k10, k11, KC_NO }, \
}
```
Notice how the `k11` and `KC_NO` switched places to represent the wiring, and the unused final column on the bottom row. Sometimes it'll make more sense to put a keyswitch on a particular column, but in the end, it won't matter, as long as all of them are accounted for. You can use this process to write out the `LAYOUT` for your entire keyboard - be sure to remember that your keyboard is actually backwards when looking at the underside of it.
### `keymaps/<variant>/default.c`
This is the actual keymap for your keyboard, and the main place you'll make changes as you perfect your layout. `default.c` is the file that gets pull by default when typing `make`, but you can make other files as well, and specify them by typing `make handwired/<keyboard>:<variant>`, which will pull `keymaps/<variant>/keymap.c`.
The basis of a keymap is its layers - by default, layer 0 is active. You can activate other layers, the highest of which will be referenced first. Let's start with our base layer.
Using our previous example, let's say we want to create the following layout:
```
┌───┬───┬───┐
│ A │ 1 │ H │
├───┴─┬─┴───┤
│ TAB │ SPC │
└─────┴─────┘
```
This can be accomplished by using the following `keymaps` definition:
```
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT( /* Base */
KC_A, KC_1, KC_H, \
KC_TAB, KC_SPC \
),
};
```
Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [Keycodes](keycodes.md) - there are also a lot of aliases to condense your keymap file.
It's also important to use the `LAYOUT` function we defined earlier - this is what allows the firmware to associate our intended readable keymap with the actual wiring.
## Compiling Your Firmware
After you've written out your entire keymap, you're ready to get the firmware compiled and onto your Teensy. Before compiling, you'll need to get your [development environment set-up](getting_started_build_tools.md) - you can skip the dfu-programmer instructions, but you'll need to download and install the [Teensy Loader](https://www.pjrc.com/teensy/loader.html) to get the firmware on your Teensy.
Once everything is installed, running `make` in the terminal should get you some output, and eventually a `<project_name>.hex` file in that folder. If you're having trouble with this step, see the end of the guide for the trouble-shooting section.
Once you have your `<project_name>.hex` file, open up the Teensy loader application, and click the file icon. From here, navigate to your `QMK/keyboards/<project_name>/` folder, and select the `<project_name>.hex` file. Plug in your keyboard and press the button on the Teensy - you should see the LED on the device turn off once you do. The Teensy Loader app will change a little, and the buttons should be clickable - click the download button (down arrow), and then the reset button (right arrow), and your keyboard should be ready to go!
</details>
```
4. Save and close `keymap.c`.
## Flashing the Firmware
Install [QMK toolbox](https://github.com/qmk/qmk_toolbox).
Install [QMK Toolbox](https://github.com/qmk/qmk_toolbox).
![QMK Toolbox](https://i.imgur.com/86Cz30H.png)
![QMK Toolbox](https://raw.githubusercontent.com/noroadsleft/qmk_images/master/docs/hand_wire/qmk_toolbox.png "QMK Toolbox 0.0.16 on Windows 8.1")
Under "Local File" navigate to your newly created .hex file. Under "Microcontroller", select the corresponding one for your controller board (common ones available [here](#common-microcontroller-boards)).
@@ -453,20 +205,20 @@ Plug in your keyboard and press the reset button (or short the Reset and Ground
## Testing Your Firmware
Use a website such as [keyboard tester](https://www.keyboardtester.com/tester.html)/[keyboard checker](http://keyboardchecker.com/) or just open a text editor and try typing - you should get the characters that you put into your keymap. Test each key, and make a note of the ones that aren't working. Here's a quick trouble-shooting guide for non-working keys:
Use a website such as [QMK Configurator's Keyboard Tester](https://config.qmk.fm/#/test), [Keyboard Tester](https://www.keyboardtester.com/tester.html), or [Keyboard Checker](http://keyboardchecker.com/) or just open a text editor and try typing - you should get the characters that you put into your keymap. Test each key, and make a note of the ones that aren't working. Here's a quick trouble-shooting guide for non-working keys:
0. Flip the keyboard back over and short the keyswitch's contacts with a piece wire - this will eliminate the possibility of the keyswitch being bad and needing to be replaced.
1. Check the solder points on the keyswitch - these need to be plump and whole. If you touch it with a moderate amount of force and it comes apart, it's not strong enough.
2. Check the solder joints on the diode - if the diode is loose, part of your row may register, while the other may not.
3. Check the solder joints on the columns - if your column wiring is loose, part or all of the column may not work.
4. Check the solder joints on both sides of the wires going to/from the Teensy - the wires need to be fully soldered and connect to both sides.
5. Check the `<project_name>.h` file for errors and incorrectly placed `KC_NO`s - if you're unsure where they should be, instead duplicate a k*xy* variable.
6. Check to make sure you actually compiled the firmware and flashed the Teensy correctly. Unless you got error messages in the terminal, or a pop-up during flashing, you probably did everything correctly.
7. Use a multimeter to check that the switch is actually closing when actuated (completing the circuit when pressed down).
1. Flip the keyboard back over and short the keyswitch's contacts with a piece wire - this will eliminate the possibility of the keyswitch being bad and needing to be replaced.
2. Check the solder points on the keyswitch - these need to be plump and whole. If you touch it with a moderate amount of force and it comes apart, it's not strong enough.
3. Check the solder joints on the diode - if the diode is loose, part of your row may register, while the other may not.
4. Check the solder joints on the columns - if your column wiring is loose, part or all of the column may not work.
5. Check the solder joints on both sides of the wires going to/from the Teensy - the wires need to be fully soldered and connect to both sides.
6. Check the `<project_name>.h` file for errors and incorrectly placed `KC_NO`s - if you're unsure where they should be, instead duplicate a k*xy* variable.
7. Check to make sure you actually compiled the firmware and flashed the Teensy correctly. Unless you got error messages in the terminal, or a pop-up during flashing, you probably did everything correctly.
8. Use a multimeter to check that the switch is actually closing when actuated (completing the circuit when pressed down).
If you've done all of these things, keep in mind that sometimes you might have had multiple things affecting the keyswitch, so it doesn't hurt to test the keyswitch by shorting it out at the end.
# Finishing up
## Finishing up
Once you have confirmed that the keyboard is working, if you have used a seperate (non handwire specific) controller you will want to secure it in place. This can be done in many different ways e.g. hot glue, double sided sticky tape, 3D printed caddy, electrical tape.
@@ -474,7 +226,7 @@ If you found this fullfilling you could experiment by adding additional features
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](http://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](http://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/Uq7gcHh) for help!
# Links to other guides:
## Links to Other Guides
- [matt3o's step by step guide (BrownFox build)](https://deskthority.net/viewtopic.php?f=7&t=6050) also his [website](https://matt3o.com/hand-wiring-a-custom-keyboard/) and [video guide](https://www.youtube.com/watch?v=LVzpsjFWPP4)
- [Cribbit's "Modern hand wiring guide - stronger, cleaner, easier"](https://geekhack.org/index.php?topic=87689.0)
@@ -483,4 +235,10 @@ There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](htt
- [Masterzen's "Handwired keyboard build log"](http://www.masterzen.fr/2018/12/16/handwired-keyboard-build-log-part-1/)
# Legacy Content
This page used to include more content. We have moved a section that used to be part of this page its own page. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
## Preamble: How a Keyboard Matrix Works (and why we need diodes) :id=preamble-how-a-keyboard-matrix-works-and-why-we-need-diodes
* [How a Keyboard Matrix Works](how_a_matrix_works.md)

View File

@@ -1,8 +0,0 @@
# Hardware
QMK runs on a variety of hardware. If your processor can be targeted 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)

View File

@@ -61,6 +61,57 @@ This file is used by the [QMK API](https://github.com/qmk/qmk_api). It contains
All projects need to have a `config.h` file that sets things like the matrix size, product name, USB VID/PID, description and other settings. In general, use this file to set essential information and defaults for your keyboard that will always work.
The `config.h` files can also be placed in sub-folders, and the order in which they are read is as follows:
* `keyboards/top_folder/config.h`
* `keyboards/top_folder/sub_1/config.h`
* `keyboards/top_folder/sub_1/sub_2/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/config.h`
* `users/a_user_folder/config.h`
* `keyboards/top_folder/keymaps/a_keymap/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/post_config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/post_config.h`
* `keyboards/top_folder/sub_1/sub_2/post_config.h`
* `keyboards/top_folder/sub_1/post_config.h`
* `keyboards/top_folder/post_config.h`
The `post_config.h` file can be used for additional post-processing, depending on what is specified in the `config.h` file. For example, if you define the `IOS_DEVICE_ENABLE` macro in your keymap-level `config.h` file as follows, you can configure more detailed settings accordingly in the `post_config.h` file:
* `keyboards/top_folder/keymaps/a_keymap/config.h`
```c
#define IOS_DEVICE_ENABLE
```
* `keyboards/top_folder/post_config.h`
```c
#ifndef IOS_DEVICE_ENABLE
// USB_MAX_POWER_CONSUMPTION value for this keyboard
#define USB_MAX_POWER_CONSUMPTION 400
#else
// fix iPhone and iPad power adapter issue
// iOS device need lessthan 100
#define USB_MAX_POWER_CONSUMPTION 100
#endif
#ifdef RGBLIGHT_ENABLE
#ifndef IOS_DEVICE_ENABLE
#define RGBLIGHT_LIMIT_VAL 200
#define RGBLIGHT_VAL_STEP 17
#else
#define RGBLIGHT_LIMIT_VAL 35
#define RGBLIGHT_VAL_STEP 4
#endif
#ifndef RGBLIGHT_HUE_STEP
#define RGBLIGHT_HUE_STEP 10
#endif
#ifndef RGBLIGHT_SAT_STEP
#define RGBLIGHT_SAT_STEP 17
#endif
#endif
```
?> If you define options using `post_config.h` as in the above example, you should not define the same options in the keyboard- or user-level `config.h`.
### `rules.mk`
The presence of this file means that the folder is a keyboard target and can be used in `make` commands. This is where you setup the build environment for your keyboard and configure the default set of features.

View File

@@ -93,7 +93,7 @@
* [Macros](he-il/feature_macros.md)
* [Mouse Keys](he-il/feature_mouse_keys.md)
* [OLED Driver](he-il/feature_oled_driver.md)
* [One Shot Keys](he-il/feature_advanced_keycodes.md#one-shot-keys)
* [One Shot Keys](he-il/one_shot_keys.md)
* [Pointing Device](he-il/feature_pointing_device.md)
* [PS/2 Mouse](he-il/feature_ps2_mouse.md)
* [RGB Lighting](he-il/feature_rgblight.md)
@@ -124,7 +124,7 @@
* נושאים נוספים
* [שימוש ב - Eclipse עם QMK](he-il/other_eclipse.md)
* [שימוש ב - VSCode עם QMK](he-il/other_vscode.md)
* [תמיכה](he-il/support.md)
* [תמיכה](he-il/getting_started_getting_help.md)
* [כיצד להוסיף תרגום](he-il/translating.md)
* QMK מבפנים (בתהליך)

View File

@@ -1,11 +0,0 @@
<div dir="rtl" markdown="1">
# איך להפוך לשותף של QMK
שותף של QMK הוא יצרן מקלדות או מעצב שמעוניין בלעזור ל-QMK לגדול ולתמוך במקלד(ו)ת שלהם, ולעודד את המשתמשים והצרכנים להוסיף יכולות, רעיונות ומיפויים. אנחנו תמיד מחפשים עוד מקלדות ומשתפי פעולה, אבל אנחנו מבקשים שיעמדו בדרישות הבאות:
* **קיום לוח PCB למכירה.** לצערינו, יש יותר מידי הסתבכויות ובעיות עם מקלדות המחווטות ידנית.
* **תחזוק המקלדת ב-QMK.** זה אולי רק ידרוש הגדרה בסיסית כדי לגרום למקלדת לעבוד, אבל זה גם יכול לכלול התאמה של שינויים בקוד הליבה של QMK שיכול לשבור קוד ייחודי שלכם.
* **אישור ומיזוג Pull Requests של מיפויי מקלדת עבור המקלדת** אנחנו רוצים לעודד משתמשים לתרום את מיפויי המקלדת שלהם לאחרים כדי לעזור לאחרים להתחיל ליצור את שלהם.
אם אתם עומדים בדרישות הללו, שלחו לנו מייל לכתובת hello@qmk.fm עם מבוא וקישורים עבור המקלדת שלכם.
</div>

View File

@@ -0,0 +1,99 @@
# How a Keyboard Matrix Works
Keyboard switch matrices are arranged in rows and columns. Without a matrix circuit, each switch would require its own wire directly to the controller.
When the circuit is arranged in rows and columns, if a key is pressed, a column wire makes contact with a row wire and completes a circuit. The keyboard controller detects this closed circuit and registers it as a key press.
The microcontroller will be set up via the firmware to send a logical 1 to the columns, one at a time, and read from the rows, all at once - this process is called matrix scanning. The matrix is a bunch of open switches that, by default, don't allow any current to pass through - the firmware will read this as no keys being pressed. As soon as you press one key down, the logical 1 that was coming from the column the keyswitch is attached to gets passed through the switch and to the corresponding row - check out the following 2x2 example:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
row0 ---(key0)---(key1) row0 ---(key0)---(key1)
| | | |
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
The `x` represents that the column/row associated has a value of 1, or is HIGH. Here, we see that no keys are being pressed, so no rows get an `x`. For one keyswitch, keep in mind that one side of the contacts is connected to its row, and the other, its column.
When we press `key0`, `col0` gets connected to `row0`, so the values that the firmware receives for that row is `0b01` (the `0b` here means that this is a bit value, meaning all of the following digits are bits - 0 or 1 - and represent the keys in that column). We'll use this notation to show when a keyswitch has been pressed, to show that the column and row are being connected:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1)
| | | |
row1 ---(key2)---(key3) row1 ---(key2)---(key3)
We can now see that `row0` has an `x`, so has the value of 1. As a whole, the data the firmware receives when `key0` is pressed is:
col0: 0b01
col1: 0b00
│└row0
└row1
A problem arises when you start pressing more than one key at a time. Looking at our matrix again, it should become pretty obvious:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
| | | |
x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1)
| | | |
x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3)
Remember that this ^ is still connected to row1
The data we get from that is:
col0: 0b11
col1: 0b11
│└row0
└row1
Which isn't accurate, since we only have 3 keys pressed down, not all 4. This behavior is called ghosting, and only happens in odd scenarios like this, but can be much more common on a bigger keyboard. The way we can get around this is by placing a diode after the keyswitch, but before it connects to its row. A diode only allows current to pass through one way, which will protect our other columns/rows from being activated in the previous example. We'll represent a dioded matrix like this;
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
│ │ | │
(key0) (key1) (key0) (key1)
! │ ! │ ! | ! │
row0 ─────┴────────┘ │ row0 ─────┴────────┘ │
│ │ | │
(key2) (key3) (key2) (key3)
! ! ! !
row1 ─────┴────────┘ row1 ─────┴────────┘
In practical applications, the black line of the diode will be placed facing the row, and away from the keyswitch - the `!` in this case is the diode, where the gap represents the black line. A good way to remember this is to think of this symbol: `>|`
Now when we press the three keys, invoking what would be a ghosting scenario:
Column 0 being scanned Column 1 being scanned
x x
col0 col1 col0 col1
│ │ │ │
(┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1)
! │ ! │ ! │ ! │
x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │
│ │ │ │
(key2) (┌─┘3) (key2) (┌─┘3)
! ! ! !
row1 ─────┴────────┘ x row1 ─────┴────────┘
Things act as they should! Which will get us the following data:
col0: 0b01
col1: 0b11
│└row0
└row1
The firmware can then use this correct data to detect what it should do, and eventually, what signals it needs to send to the OS.
Further reading:
- [Wikipedia article](https://en.wikipedia.org/wiki/Keyboard_matrix_circuit)
- [Deskthority article](https://deskthority.net/wiki/Keyboard_matrix)
- [Keyboard Matrix Help by Dave Dribin (2000)](https://www.dribin.org/dave/keyboard/one_html/)
- [How Key Matrices Works by PCBheaven](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) (animated examples)
- [How keyboards work - QMK documentation](how_keyboards_work.md)

View File

@@ -1,33 +1,46 @@
# I2C Master Driver
# I2C Master Driver :id=i2c-master-driver
The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs.
## Available functions
## An important note on I2C Addresses :id=note-on-i2c-addresses
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
You can either do this on each call to the functions below, or once in your definition of the address. For example if your device has an address of `0x18`:
`#define MY_I2C_ADDRESS (0x18 << 1)`
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
## Available functions :id=available-functions
|Function |Description |
|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. |
|`uint8_t i2c_start(uint8_t address, uint16_t timeout);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. |
|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. |
|`uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. |
|`uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. |
|`uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. |
|`uint8_t i2c_stop(void);` |Ends an I2C transaction. |
|`i2c_status_t i2c_start(uint8_t address, uint16_t timeout);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. |
|`i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. |
|`i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. |
|`i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. |
|`i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. |
|`i2c_status_t i2c_stop(void);` |Ends an I2C transaction. |
### Function Return
### Function Return :id=function-return
All the above functions, except `void i2c_init(void);` return the following truth table:
|Return Value |Description |
|---------------|---------------------------------------------------|
|0 |Operation executed successfully. |
|-1 |Operation failed. |
|-2 |Operation timed out. |
|Return Constant |Value|Description |
|--------------------|-----|--------------------------------|
|`I2C_STATUS_SUCCESS`|0 |Operation executed successfully.|
|`I2C_STATUS_ERROR` |-1 |Operation failed. |
|`I2C_STATUS_TIMEOUT`|-2 |Operation timed out. |
## AVR
## AVR :id=avr
### Configuration
### Configuration :id=avr-configuration
The following defines can be used to configure the I2C master driver.
@@ -37,12 +50,12 @@ The following defines can be used to configure the I2C master driver.
AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required.
## ARM
## ARM :id=arm
For ARM the Chibios I2C HAL driver is under the hood.
This section assumes an STM32 MCU.
### Configuration
### Configuration :id=arm-configuration
The configuration for ARM MCUs can be quite complex as often there are multiple I2C drivers which can be assigned to a variety of ports.
@@ -77,7 +90,7 @@ The ChibiOS I2C driver configuration depends on STM32 MCU:
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx and STM32L1xx use I2Cv1;
STM32F0xx, STM32F3xx, STM32F7xx and STM32L4xx use I2Cv2;
#### I2Cv1
#### I2Cv1 :id=i2cv1
STM32 MCUs allow for different clock and duty parameters when configuring I2Cv1. These can be modified using the following parameters, using <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> as a reference:
| Variable | Default |
@@ -86,7 +99,7 @@ STM32 MCUs allow for different clock and duty parameters when configuring I2Cv1.
| `I2C1_CLOCK_SPEED` | `100000` |
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
#### I2Cv2
#### I2Cv2 :id=i2cv2
STM32 MCUs allow for different timing parameters when configuring I2Cv2. These can be modified using the following parameters, using <https://www.st.com/en/embedded-software/stsw-stm32126.html> as a reference:
| Variable | Default |
@@ -104,10 +117,10 @@ STM32 MCUs allow for different "alternate function" modes when configuring GPIO
| `I2C1_SCL_PAL_MODE` | `4` |
| `I2C1_SDA_PAL_MODE` | `4` |
#### Other
#### Other :id=other
You can also overload the `void i2c_init(void)` function, which has a weak attribute. If you do this the configuration variables above will not be used. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function:
```C
```c
void i2c_init(void)
{
setPinInput(B6); // Try releasing special pins for a short time

View File

@@ -13,19 +13,38 @@
<meta property="og:image" content="https://i.imgur.com/svjvIrw.jpg">
<meta property="og:url" content="https://docs.qmk.fm">
<meta name="twitter:card" content="summary_large_image">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css" title="light">
<link rel="stylesheet" href="qmk.css" title="dark" disabled>
<link rel="stylesheet" href="sidebar.css" />
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css" title="light">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/dark.css" media="(prefers-color-scheme: dark)">
<link rel="stylesheet" href="//unpkg.com/docsify-toc@1.0.0/dist/toc.css">
<link rel="stylesheet" href="qmk_custom_light.css">
<link rel="stylesheet" href="qmk_custom_dark.css" media="(prefers-color-scheme: dark)">
</head>
<body>
<div id="app"></div>
<script>
window.$docsify = {
alias: {
// Translation aliases
'/en/(.*)': '/$1',
'/en-us/(.*)': '/$1',
'/en-gb/(.*)': '/$1',
'/.*/_langs.md': '/_langs.md',
// Moved pages
'/adding_a_keyboard_to_qmk': '/hardware_keyboard_guidelines',
'/build_environment_setup': '/getting_started_build_tools',
'/cli_dev_configuration': '/cli_configuration',
'/dynamic_macros': '/feature_dynamic_macros',
'/feature_common_shortcuts': '/feature_advanced_keycodes',
'/glossary': '/reference_glossary',
'/key_lock': '/feature_key_lock',
'/make_instructions': '/getting_started_make_guide',
'/porting_your_keyboard_to_qmk': '/hardware_avr',
'/space_cadet_shift': '/feature_space_cadet_shift',
'/getting_started_getting_help': '/support',
'/tap_dance': '/feature_tap_dance',
'/unicode': '/feature_unicode',
'/python_development': '/cli_development',
},
basePath: '/',
name: 'QMK Firmware',
@@ -45,6 +64,7 @@
loadNavbar: '_langs.md',
mergeNavbar: true,
auto2top: true,
autoHeader: true,
fallbackLanguages: [
'de',
'es',
@@ -74,6 +94,36 @@
},
depth: 6
},
markdown: {
smartypants: true,
smartLists: true,
},
copyCode: {
buttonText: {
'/zh-cn/': '点击复制',
'/ru/' : 'Скопировать в буфер обмена',
'/de-de/': 'Klicken Sie zum Kopieren',
'/es/' : 'Haga clic para copiar',
'/' : 'Copy to clipboard'
},
errorText: {
'/zh-cn/': '错误',
'/ru/' : 'ошибка',
'/' : 'Error'
},
successText: {
'/zh-cn/': '复制',
'/ru/' : 'Скопировано',
'/de-de/': 'Kopiert',
'/es/' : 'Copiado',
'/' : 'Copied'
}
},
toc: {
scope: '.markdown-section',
headings: 'h1, h2',
title: 'Table of Contents',
},
plugins: [
function (hook, vm) {
hook.beforeEach(function (html) {
@@ -96,13 +146,16 @@
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/emoji.min.js"></script>
<script src="//unpkg.com/docsify-copy-code@2"></script>
<script src="//unpkg.com/docsify-toc@1.0.0/dist/toc.js"></script>
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-c.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-cpp.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-json.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-makefile.min.js"></script>
<script>
// Register the offline cache worker
// Register the cache worker for offline viewing mode
// https://docsify.now.sh/pwa
if (typeof navigator.serviceWorker !== 'undefined') {
navigator.serviceWorker.register('sw.js')
}

View File

@@ -1,22 +1,22 @@
# GPIO Control
# GPIO Control :id=gpio-control
QMK has a GPIO control abstraction layer which is microcontroller agnostic. This is done to allow easy access to pin control across different platforms.
## Functions
## Functions :id=functions
The following functions can provide basic control of GPIOs and are found in `quantum/quantum.h`.
|Function |Description | Old AVR Examples | Old ChibiOS/ARM Examples |
|----------------------|------------------------------------------------------------------|------------------------------------------------|-------------------------------------------------|
|`setPinInput(pin)` |Set pin as input with high impedance (High-Z) | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
|`setPinInputHigh(pin)`|Set pin as input with builtin pull-up resistor | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
|`setPinInputLow(pin)` |Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
|`setPinOutput(pin)` |Set pin as output | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|`writePinHigh(pin)` |Set pin level as high, assuming it is an output | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
|`writePinLow(pin)` |Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
|`writePin(pin, level)`|Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
|`readPin(pin)` |Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
|Function |Description | Old AVR Examples | Old ChibiOS/ARM Examples |
|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------|
| `setPinInput(pin)` | Set pin as input with high impedance (High-Z) | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
| `setPinInputHigh(pin)` | Set pin as input with builtin pull-up resistor | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
| `setPinInputLow(pin)` | Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
| `setPinOutput(pin)` | Set pin as output | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
| `writePinHigh(pin)` | Set pin level as high, assuming it is an output | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
| `writePinLow(pin)` | Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
| `writePin(pin, level)` | Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
| `readPin(pin)` | Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
## Advanced Settings
## Advanced Settings :id=advanced-settings
Each microcontroller can have multiple advanced settings regarding its GPIO. This abstraction layer does not limit the use of architecture-specific functions. Advanced users should consult the datasheet of their desired device and include any needed libraries. For AVR, the standard avr/io.h library is used; for STM32, the ChibiOS [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.

View File

@@ -1,6 +1,14 @@
# ISP Flashing Guide
If you're having trouble flashing/erasing your board, and running into cryptic error messages like any of the following:
ISP flashing (also known as ICSP flashing) is the process of programming a microcontroller directly. This allows you to replace the bootloader, or change the "fuses" on the controller, which control a number of hardware- and software-related functions, such as the speed of the controller, how it boots, and other options.
The main use of ISP flashing for QMK is flashing or replacing the bootloader on your AVR-based controller (Pro Micros, or V-USB chips).
?> This is only for programming AVR based boards, such as the Pro Micro or other ATmega controllers. It is not for Arm controllers, such as the Proton C.
## Dealing with Corrupted Bootloaders
If you're having trouble flashing/erasing your board, and running into cryptic error messages like any of the following for a DFU based controller:
libusb: warning [darwin_transfer_status] transfer error: timed out
dfu.c:844: -ETIMEDOUT: Transfer timed out, NAK 0xffffffc4 (-60)
@@ -19,16 +27,60 @@ If you're having trouble flashing/erasing your board, and running into cryptic e
Memory write error, use debug for more info.
commands.c:360: Error writing memory data. (err -4)
You're likely going to need to ISP flash your board/device to get it working again. Luckily, this process is pretty straight-forward, provided you have any extra programmable keyboard, Pro Micro, or Teensy 2.0/Teensy 2.0++. There are also dedicated ISP flashers available for this, but most cost >$15, and it's assumed that if you are googling this error, this is the first you've heard about ISP flashing, and don't have one readily available (whereas you might have some other AVR board). __We'll be using a Teensy 2.0 or Pro Micro with Windows 10 in this guide__ - if you are comfortable doing this on another system, please consider editing this guide and contributing those instructions!
Or, if you see this sort of message for a Pro Micro based controller:
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: verification error, first mismatch at byte 0x002a
0x2b != 0x75
avrdude: verification error; content mismatch
avrdude: verification error; content mismatch
You're likely going to need to ISP flash your board/device to get it working again.
## Hardware Needed
You'll need one of the following to actually perform the ISP flashing (followed by the protocol they use):
* [SparkFun PocketAVR](https://www.sparkfun.com/products/9825) - (USB Tiny)
* [USBtinyISP AVR Programmer Kit](https://www.adafruit.com/product/46) - (USB Tiny)
* [Teensy 2.0](https://www.pjrc.com/store/teensy.html) - (avrisp)
* [Pro Micro](https://www.sparkfun.com/products/12640) - (avrisp)
* [Bus Pirate](https://www.adafruit.com/product/237) - (buspirate)
There are other devices that can be used to ISP flash, but these are the main ones. Also, all product links are to the official versions. You can source them elsewhere.
You'll also need something to wire your "ISP Programmer" to the device that you're programming. Some PCBs may have ISP headers that you can use directly, but this often isn't the case, so you'll likely need to solder to the controller itself or to different switches or other components.
### The ISP Firmware
The Teensy and Pro Micro controllers will need you to flash the ISP firmware to the controllers before you can use them as an ISP programmer. The rest of the hardware should come preprogrammed. So, for these controllers, download the correct hex file, and flash it first.
* Teensy 2.0: [`util/teensy_2.0_ISP_B0.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/teensy_2.0_ISP_B0.hex) (`B0`)
* Pro Micro: [`util/pro_micro_ISP_B6_10.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/pro_micro_ISP_B6_10.hex) (`10/B6`)
Once you've flashed your controller, you won't need this hex file anymore.
## Software Needed
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html) (if using a Teensy)
* QMK Toolbox (flash as usual - be sure to select the correct MCU) or `avrdude` via [WinAVR](http://www.ladyada.net/learn/avr/setup-win.html) (for Teensy & Pro Micro)
The QMK Toolbox can be used for most (all) of this.
However, you can grab the [Teensy Loader](https://www.pjrc.com/teensy/loader.html) to flash your Teensy 2.0 board, if you are using that. Or you can use `avrdude` (installed as part of `qmk_install.sh`), or [AVRDUDESS](https://blog.zakkemble.net/avrdudess-a-gui-for-avrdude/) (for Windows) to flash the Pro Micro, and the ISP flashing.
## Wiring
This is pretty straight-forward - we'll be connecting like-things to like-things in the following manner:
This is pretty straight-forward - we'll be connecting like-things to like-things in the following manner.
### SparkFun Pocket AVR
PocketAVR RST <-> Keyboard RESET
PocketAVR SCLK <-> Keyboard B1 (SCLK)
PocketAVR MOSI <-> Keyboard B2 (MOSI)
PocketAVR MISO <-> Keyboard B3 (MISO)
PocketAVR VCC <-> Keyboard VCC
PocketAVR GND <-> Keyboard GND
### Teensy 2.0
@@ -39,6 +91,8 @@ This is pretty straight-forward - we'll be connecting like-things to like-things
Teensy VCC <-> Keyboard VCC
Teensy GND <-> Keyboard GND
!> Note that the B0 pin on the Teensy is wired to the RESET/RST pin on the keyboard's controller. ***DO NOT*** wire the RESET pin on the Teensy to the RESET on the keyboard.
### Pro Micro
Pro Micro 10 (B6) <-> Keyboard RESET
@@ -48,45 +102,61 @@ This is pretty straight-forward - we'll be connecting like-things to like-things
Pro Micro VCC <-> Keyboard VCC
Pro Micro GND <-> Keyboard GND
## The ISP Firmware (now pre-compiled)
!> Note that the 10/B6 pin on the Pro Micro is wired to the RESET/RST pin on the keyboard's controller. ***DO NOT*** wire the RESET pin on the Pro Micro to the RESET on the keyboard.
The only difference between the .hex files below is which pin is connected to RESET. You can use them on other boards as well, as long as you're aware of the pins being used. If for some reason neither of these pins are available, [create an issue](https://github.com/qmk/qmk_firmware/issues/new), and we can generate one for you!
* Teensy 2.0: [`util/teensy_2.0_ISP_B0.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/teensy_2.0_ISP_B0.hex) (`B0`)
* Pro Micro: [`util/pro_micro_ISP_B6_10.hex`](https://github.com/qmk/qmk_firmware/blob/master/util/pro_micro_ISP_B6_10.hex) (`B6/10`)
## Flashing Your Keyboard
**Flash your Teenys/Pro Micro with one of these and continue - you won't need the file after flashing your ISP device.**
After you have your ISP programmer set up, and wired to your keyboard, it's time to flash your keyboard.
## Just the Bootloader File
### The Bootloader File
If you just want to get things back to normal, you can flash only a bootloader from [`util/` folder](https://github.com/qmk/qmk_firmware/tree/master/util), and use your normal process to flash the firmware afterwards. Be sure to flash the correct bootloader for your chip:
The simplest and quickest way to get things back to normal is to flash only a bootloader to the keyboard. Once this is done, you can connect the keyboard normally and flash the keyboard like you normally would.
You can find the stock bootloaders in the [`util/` folder](https://github.com/qmk/qmk_firmware/tree/master/util). Be sure to flash the correct bootloader for your chip:
* [`atmega32u4`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32u4_1_0_0.hex) - Most keyboards, Planck Rev 1-5, Preonic Rev 1-2
* [`Pro Micro`](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro16.hex) - The default bootloader for Pro Micro controllers
* [`at90usb1286`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb128x_1_0_1.hex) - Planck Light Rev 1
* [`atmega32a`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32a_1_0_0.hex) - jj40
* [`atmega32a`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32a_1_0_0.hex) - jj40, and other V-USB/ps2avrGB keyboards
If you're not sure what your board uses, look in the `rules.mk` file for the keyboard in QMK. The `MCU =` line will have the value you need. It may differ between different versions of the board.
### Advanced/Production Techniques
### Production Techniques
If you'd like to flash both the bootloader **and** the regular firmware at the same time, you need to combine the files.
If you'd like to flash both the bootloader **and** the regular firmware at the same time, there are two options to do so. Manually, or with the `:production` target when compiling.
To do this manually:
1. Open the original firmware .hex file in a text editor
2. Remove the last line (which should be `:00000001FF` - this is an EOF message)
3. Copy the entire bootloader's contents onto a new line (with no empty lines between) and paste it at the end of the original file
4. Save it as a new file by naming it `<keyboard>_<keymap>_production.hex`
It's possible to use other bootloaders here in the same way, but __you need a bootloader__, otherwise you'll have to use ISP again to write new firmware to your keyboard.
?> It's possible to use other bootloaders here in the same way, but __you need a bootloader__, otherwise you'll have to use ISP again to write new firmware to your keyboard.
To do this the easy way, you can flash the board using the `:production` target when compiling. This compiles the firmware, then compiles the QMK DFU bootloader, and then creates a combined image. Once this is done, you'll see three files:
* `<keyboard>_<keymap>.hex`
* `<keyboard>_<keymap>_bootloader.hex`
* `<keyboard>_<keymap>_production.hex`
The QMK DFU bootloader has only really been tested on `atmega32u4` controllers (such as the AVR based Planck boards, and the Pro Micro), and hasn't been tested on other controllers. However, it will definitely not work on V-USB controllers, such as the `atmega32a` or `atmega328p`.
You can flash either the bootloader or the production firmware file. The production firmware file will take a lot longer to flash, since it's flashing a lot more data.
?> Note: You should stay with the same bootloader. If you're using DFU already, switching to QMK DFU is fine. But flashing QMK DFU onto a Pro Micro, for instance, has additional steps needed.
## Flashing Your Bootloader/Production File
Make sure your keyboard is unplugged from any device, and plug in your Teensy.
Make sure your keyboard is unplugged from any device, and plug in your ISP Programmer.
If you want to change bootloader types, You'll need to use the command line.
### QMK Toolbox
1. `AVRISP device connected` will show up in yellow
1. `AVRISP device connected` or `USB Tiny device connected` will show up in yellow
2. Select the correct bootloader/production .hex file with the `Open` dialog (spaces can't be in the path)
3. Be sure the correct `Microcontroller` option is selected
3. Be sure the correct `Microcontroller` option for the keyboard you're flashing (not the ISP programmer) is selected
4. Hit `Flash`
5. Wait, as nothing will output for a while, especially with production files
@@ -94,7 +164,7 @@ If the verification and fuse checks are ok, you're done! Your board may restart
### Command Line
Open `cmd` and navigate to your where your modified .hex file is. We'll pretend this file is called `main.hex`, and that your Teensy 2.0 is on the `COM3` port - if you're unsure, you can open your Device Manager, and look for `Ports > USB Serial Device`. Use that COM port here. You can confirm it's the right port with:
Open a terminal (`cmd` on Windows, for instance) and navigate to your where your modified .hex file is. We'll pretend this file is called `main.hex`, and that your Teensy 2.0 is on the `COM3` port - if you're unsure, you can open your Device Manager, and look for `Ports > USB Serial Device`. Use that COM port here. You can confirm it's the right port with:
avrdude -c avrisp -P COM3 -p atmega32u4
@@ -129,4 +199,47 @@ You should see a couple of progress bars, then you should see:
Which means everything should be ok! Your board may restart automatically, otherwise, unplug your Teensy and plug in your keyboard - you can leave your Teensy wired to your keyboard while testing things, but it's recommended that you desolder it/remove the wiring once you're sure everything works.
If you're using a SparkFun PocketAVR Programmer, or another USB Tiny based ISP programmer, you will want to use something like this:
avrdude -c usbtiny -P usb -p atmega32u4
#### Advanced: Changing Fuses
If you're switching bootloaders, such as flashing QMK DFU on a Pro Micro, you will need to change the fuses, in additional to flashing the bootloader hex file. This is because `caterina` (the Pro Micro bootloader) and `dfu` handle the startup routines differently, and that behavior is controlled by the fuses.
!> This is one area that it is very important to be careful, as changing fuses is one of the ways that you can permanently brick your controller.
For this, we are assuming the 5V 16MHz versions of the `atmega32u4` (such as the 5V Pro Micro).
For DFU on the `atmega32u4`, these are the fuse settings that you want:
| Fuse | Setting |
|----------|------------------|
| Low | `0x5E` |
| High | `0xD9` or `0x99` |
| Extended | `0xC3` |
The High fuse can be 0xD9 or 0x99. The difference is that 0xD9 disables JTAG, which QMK Firmware disables via software as well, while 0x99 doesn't disable JTAG.
To set this add `-U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m` to your command. So the final command should look something like:
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0x5E:m -U hfuse:w:0xD9:m -U efuse:w:0xC3:m
For Caterina on the `atmega32u4`, these are the fuse settings that you want:
| Fuse | Setting|
|----------|--------|
| Low | `0xFF` |
| High | `0xD9` |
| Extended | `0xC3` |
To set this add `-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m` to your command. So the final command should look something like:
avrdude -c avrisp -P COM3 -p atmega32u4 -U flash:w:main.hex:i -U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xC3:m
If you are using a different controller or want different configuration, you can use [this AVR Fuse Calculator](http://www.engbedded.com/fusecalc/) to find a better value for you.
## Help
If you have any questions/problems, feel free to [open an issue](https://github.com/qmk/qmk_firmware/issues/new)!

View File

@@ -1,8 +1,8 @@
# Quantum Mechanical Keyboard Firmware
<!---
original document: eae21eed7:docs/README.md
git diff eae21eed7 HEAD -- docs/README.md | cat
original document: 0.8.58:docs/README.md
git diff 0.8.58 HEAD -- docs/README.md | cat
-->
[![現在のバージョン](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
@@ -12,26 +12,37 @@
[![GitHub 貢献者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
[![GitHub フォーク](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
## QMK ファームウェアとは何か?
## QMK ファームウェアとは何でしょうか?
QMK (*Quantum Mechanical Keyboard*)は QMK ファームウェア、QMK ツールボックス、qmk.fm およびそれらのドキュメントを保守するオープンソースコミュニティです。QMK ファームウェアは[tmk\_keyboard](http://github.com/tmk/tmk_keyboard) を元にしたキーボードファームウェアで、Atmel AVR コントローラ、より具体的には [OLKB 製品](http://olkb.com)、[ErgoDox EZ](http://www.ergodox-ez.com) キーボードおよび [Clueboard 製品](http://clueboard.co/) のための幾つかの便利な機能を持ちます。また、ChibiOS を使って ARM チップに移植されています。これを使ってあなたの作った手配線のキーボードあるいはカスタムキーボード PCB で作ったキーボードを動かすことができます。
QMK (*Quantum Mechanical Keyboard*)は、コンピュータ入力デバイスの開発を中心としたオープンソースコミュニティです。コミュニティには、キーボード、マウス、MIDI デバイスなど、全ての種類の入力デバイスが含まれます。協力者の中心グループは、[QMK ファームウェア](https://github.com/qmk/qmk_firmware)、[QMK Configurator](https://config.qmk.fm)、[QMK ツールボックス](https://github.com/qmk/qmk_toolbox)、[qmk.fm](https://qmk.fm)、そして、このドキュメントを、あなたのようなコミュニティメンバーの助けを借りて保守しています。
## 入手方法
## 始めましょう
QMK のキーマップ、キーボード、機能に貢献をする予定がある場合、最も簡単なのは、[Github を介してリポジトリをフォークし](https://github.com/qmk/qmk_firmware#fork-destination-box)、リポジトリをあなたの開発環境にクローンして変更を加え、それらをプッシュし、[プルリクエスト](https://github.com/qmk/qmk_firmware/pulls)を開くことです。
QMK は初めてですか始めるには2つの方法があります:
それ以外の場合は、`git clone https://github.com/qmk/qmk_firmware` を介して直接クローンすることができます。zip または tar ファイルをダウンロードしないでください。コンパイルするためのサブモジュールをダウンロードするために git リポジトリが必要です。
* 基本: [QMK Configurator](https://config.qmk.fm)
* ドロップダウンからあなたのキーボードを選択し、キーボードをプログラムします。
* 見ることができる [紹介ビデオ](https://www.youtube.com/watch?v=-imgglzDMdY) があります。
* 読むことができる概要 [ドキュメント](ja/newbs_building_firmware_configurator.md) があります。
* 発展: [ソースを使用します](ja/newbs.md)
* より強力ですが、使うのはより困難です。
## コンパイル方法
## 自分用にアレンジします
コンパイルをする前に、AVR または ARM 開発のための[環境をインストール](ja/getting_started_build_tools.md)する必要があります。それが完了したら、`make` コマンドを使用して、以下の表記でキーードとキーマップをビルドします。
QMK には、探求すべき多くの[機能](ja/features.md)と、深く知るためのリファレンスドキュメントがたくさんあります。ほとんどの機能は[キーマップ](ja/keymap.md)を変更し、[キーード](ja/keycodes.md)を変更することで活用されます。
make planck/rev4:default
## 手助けが必要ですか?
これは、`planck``rev4` リビジョンを `default` キーマップでビルドします。全てのキーボードにリビジョン(サブプロジェクトまたはフォルダとも呼ばれます)があるわけではありません。その場合は省略されます:
[サポートページ](ja/support.md) をチェックして、QMK の使い方について手助けを得る方法を確認してください。
make preonic:default
## 貢献する
## カスタマイズ方法
QMK コミュニティに貢献する方法はたくさんあります。始める最も簡単な方法は、それを使って友人に QMK という単語を広めることです。
QMK には、探求すべき多くの[機能](ja/features.md)と、深堀りするための[リファレンス ドキュメント](http://docs.qmk.fm)がたくさんあります。ほとんどの機能は[キーマップ](ja/keymap.md)を変更し、[キーコード](ja/keycodes.md)を変更することで活用されます
* フォーラムやチャットルームで人々を支援します:
* [/r/olkb](https://www.reddit.com/r/olkb/)
* [Discord サーバ](https://discord.gg/Uq7gcHh)
* 下にある「Edit This Page」をクリックしてドキュメントに貢献します
* [ドキュメントをあなたの言語に翻訳します](ja/translating.md)
* [バグを報告します](https://github.com/qmk/qmk_firmware/issues/new/choose)
* [プルリクエストを開きます](ja/contributing.md)

View File

@@ -1,130 +1,162 @@
* [完全な初心者のガイド](ja/newbs.md)
* [はじめに](ja/newbs_getting_started.md)
* [初めてのファームウェアの構築](ja/newbs_building_firmware.md)
* [ファームウェアのフラッシュ](ja/newbs_flashing.md)
* [テストとデバッグ](ja/newbs_testing_debugging.md)
* [QMK における Git 運用作法](ja/newbs_git_best_practices.md)
* [あなたのフォークの master ブランチ](ja/newbs_git_using_your_master_branch.md)
* [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
* [同期のとれていない git ブランチの再同期](ja/newbs_git_resynchronize_a_branch.md)
* [学習リソース](ja/newbs_learn_more_resources.md)
* チュートリアル
* [入門](ja/newbs.md)
* [セットアップ](ja/newbs_getting_started.md)
* [初めてのファームウェアの構築](ja/newbs_building_firmware.md)
* [ファームウェアのフラッシュ](ja/newbs_flashing.md)
* [テストとデバッグ](ja/newbs_testing_debugging.md)
* [手助けを得る/サポート](ja/support.md)
* [他のリソース](ja/newbs_learn_more_resources.md)
* [QMKの基本](ja/README.md)
* [QMK の導入](ja/getting_started_introduction.md)
* [QMK CLI](ja/cli.md)
* [QMK CLI 設定](ja/cli_configuration.md)
* [QMK への貢献](ja/contributing.md)
* [Github の使い方](ja/getting_started_github.md)
* [ヘルプ](ja/getting_started_getting_help.md)
* FAQ
* [一般的な FAQ](ja/faq_general.md)
* [QMK のビルド/コンパイル](ja/faq_build.md)
* [QMK のデバッグ/トラブルシューティング](ja/faq_debug.md)
* [キーマップ FAQ](ja/faq_keymap.md)
* [用語](ja/reference_glossary.md)
* [破壊的な変更](ja/breaking_changes.md)
* [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
* [2019年8月30日](ja/ChangeLog/20190830.md)
* Configurator
* [概要](ja/newbs_building_firmware_configurator.md)
* [ステップ・バイ・ステップ](ja/configurator_step_by_step.md)
* [トラブルシューティング](ja/configurator_troubleshooting.md)
* QMK API
* [概要](ja/api_overview.md)
* [API ドキュメント](ja/api_docs.md)
* [キーボードサポート](ja/reference_configurator_support.md)
* [FAQ](ja/faq.md)
* [一般的な FAQ](ja/faq_general.md)
* [QMK のビルド/コンパイル](ja/faq_build.md)
* [QMK のデバッグ/トラブルシューティング](ja/faq_debug.md)
* [キーマップ](ja/faq_keymap.md)
* [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
* CLI
* [概要](ja/cli.md)
* [設定](ja/cli_configuration.md)
* [コマンド](ja/cli_commands.md)
* 詳細なガイド
* [ビルドツールのインストール](ja/getting_started_build_tools.md)
* [Vagrant のガイド](ja/getting_started_vagrant.md)
* [ビルド/コンパイルの説明](ja/getting_started_make_guide.md)
* [ファームウェアのフラッシュ](ja/flashing.md)
* [機能のカスタマイズ](ja/custom_quantum_functions.md)
* [キーマップの概要](ja/keymap.md)
* QMK を使う
* ガイド
* [機能のカスタマイズ](ja/custom_quantum_functions.md)
* [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
* [キーマップの概要](ja/keymap.md)
* [Vagrant のガイド](ja/getting_started_vagrant.md)
* 書き込み
* [書き込み](ja/flashing.md)
* [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md)
* IDE
* [Eclipse で QMK を使用](ja/other_eclipse.md)
* [VSCode で QMK を使用](ja/other_vscode.md)
* Git のベストプラクティス
* [入門](ja/newbs_git_best_practices.md)
* [フォーク](ja/newbs_git_using_your_master_branch.md)
* [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
* [ブランチの修正](ja/newbs_git_resynchronize_a_branch.md)
* キーボードを作る
* [Hand Wiring ガイド](ja/hand_wire.md)
* [ISP 書き込みガイド](ja/isp_flashing_guide.md)
* [ハードウェア](ja/hardware.md)
* [互換性のあるマイクロコントローラ](ja/compatible_microcontrollers.md)
* [AVR プロセッサ](ja/hardware_avr.md)
* [ドライバ](ja/hardware_drivers.md)
* 単純なキーコード
* [完全なリスト](ja/keycodes.md)
* [基本的なキーコード](ja/keycodes_basic.md)
* [修飾キー](ja/feature_advanced_keycodes.md)
* [Quantum キーコード](ja/quantum_keycodes.md)
* リファレンス
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
* [設定オプション](ja/config_options.md)
* [キーコード](ja/keycodes.md)
* [コーディング規約 - C](ja/coding_conventions_c.md)
* [コーディング規約 - Python](ja/coding_conventions_python.md)
* [ドキュメント ベストプラクティス](ja/documentation_best_practices.md)
* [ドキュメント テンプレート](ja/documentation_templates.md)
* [用語](ja/reference_glossary.md)
* [ユニットテスト](ja/unit_testing.md)
* [便利な関数](ja/ref_functions.md)
* [Configurator サポート](ja/reference_configurator_support.md)
* [info.json 形式](ja/reference_info_json.md)
* [Python CLI 開発](ja/cli_development.md)
* 高度なキーコード
* [コマンド](ja/feature_command.md)
* [動的マクロ](ja/feature_dynamic_macros.md)
* [グレイブ エスケープ](ja/feature_grave_esc.md)
* [リーダーキー](ja/feature_leader_key.md)
* [モッドタップ](ja/mod_tap.md)
* [マクロ](ja/feature_macros.md)
* [マウスキー](ja/feature_mouse_keys.md)
* [Space Cadet Shift](ja/feature_space_cadet.md)
* [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md)
* [機能](ja/features.md)
* [基本的なキーコード](ja/keycodes_basic.md)
* [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md)
* [Quantum キーコード](ja/quantum_keycodes.md)
* [Advanced キーコード](ja/feature_advanced_keycodes.md)
* [オーディオ](ja/feature_audio.md)
* [自動シフト](ja/feature_auto_shift.md)
* [バックライト](ja/feature_backlight.md)
* [ブルートゥース](ja/feature_bluetooth.md)
* [ブートマジック](ja/feature_bootmagic.md)
* [コンボ](ja/feature_combo.md)
* [コマンド](ja/feature_command.md)
* [デバウンス API](ja/feature_debounce_type.md)
* [DIP スイッチ](ja/feature_dip_switch.md)
* [動的マクロ](ja/feature_dynamic_macros.md)
* [エンコーダ](ja/feature_encoders.md)
* [グレイブ エスケープ](ja/feature_grave_esc.md)
* [触覚フィードバック](ja/feature_haptic_feedback.md)
* [HD44780 LCD コントローラ](ja/feature_hd44780.md)
* [キーロック](ja/feature_key_lock.md)
* [レイアウト](ja/feature_layouts.md)
* [リーダー キー](ja/feature_leader_key.md)
* [LED マトリクス](ja/feature_led_matrix.md)
* [マクロ](ja/feature_macros.md)
* [マウスキー](ja/feature_mouse_keys.md)
* [OLED ドライバ](ja/feature_oled_driver.md)
* [One Shot Keys](ja/feature_advanced_keycodes.md#one-shot-keys)
* [ポインティング デバイス](ja/feature_pointing_device.md)
* [PS/2 マウス](ja/feature_ps2_mouse.md)
* [RGB ライト](ja/feature_rgblight.md)
* [RGB マトリクス](ja/feature_rgb_matrix.md)
* [Space Cadet](ja/feature_space_cadet.md)
* [分割キーボード](ja/feature_split_keyboard.md)
* [Stenography](ja/feature_stenography.md)
* [Swap Hands](ja/feature_swap_hands.md)
* [タップ ダンス](ja/feature_tap_dance.md)
* [ターミナル](ja/feature_terminal.md)
* [感熱式プリンタ](ja/feature_thermal_printer.md)
* [ユニコード](ja/feature_unicode.md)
* [ユーザスペース](ja/feature_userspace.md)
* [Velocikey](ja/feature_velocikey.md)
* ソフトウェア機能
* [自動シフト](ja/feature_auto_shift.md)
* [コンボ](ja/feature_combo.md)
* [デバウンス API](ja/feature_debounce_type.md)
* [キーロック](ja/feature_key_lock.md)
* [レイヤー](ja/feature_layers.md)
* [One Shot Keys](ja/one_shot_keys.md)
* [ポインティング デバイス](ja/feature_pointing_device.md)
* [Swap Hands](ja/feature_swap_hands.md)
* [タップダンス](ja/feature_tap_dance.md)
* [タップホールド設定](ja/tap_hold.md)
* [ターミナル](ja/feature_terminal.md)
* [ユニコード](ja/feature_unicode.md)
* [ユーザスペース](ja/feature_userspace.md)
* [WPM 計算](ja/feature_wpm.md)
* メーカーおよびモッダーのために
* [Hand Wiring ガイド](ja/hand_wire.md)
* [ISP 書き込みガイド](ja/isp_flashing_guide.md)
* [ARM デバッグ ガイド](ja/arm_debugging.md)
* [ADC ドライバ](ja/adc_driver.md)
* [I2C ドライ](ja/i2c_driver.md)
* [WS2812 ドライバ](ja/ws2812_driver.md)
* [EEPROM ドライ](ja/eeprom_driver.md)
* [GPIO コントロール](ja/internals_gpio_control.md)
* [カスタムマトリックス](ja/custom_matrix.md)
* [Proton C 規約](ja/proton_c_conversion.md)
* ハードウェア機能
* 表示
* [HD44780 LCD コントローラ](ja/feature_hd44780.md)
* [OLED ドライバ](ja/feature_oled_driver.md)
* 電飾
* [バックライ](ja/feature_backlight.md)
* [LED マトリックス](ja/feature_led_matrix.md)
* [RGB ライ](ja/feature_rgblight.md)
* [RGB マトリックス](ja/feature_rgb_matrix.md)
* [オーディオ](ja/feature_audio.md)
* [Bluetooth](ja/feature_bluetooth.md)
* [ブートマジック](ja/feature_bootmagic.md)
* [カスタムマトリックス](ja/custom_matrix.md)
* [DIP スイッチ](ja/feature_dip_switch.md)
* [エンコーダ](ja/feature_encoders.md)
* [触覚フィードバック](ja/feature_haptic_feedback.md)
* [Proton C 規約](ja/proton_c_conversion.md)
* [PS/2 マウス](ja/feature_ps2_mouse.md)
* [分割キーボード](ja/feature_split_keyboard.md)
* [Stenography](ja/feature_stenography.md)
* [感熱式プリンタ](ja/feature_thermal_printer.md)
* [Velocikey](ja/feature_velocikey.md)
* より深く知るために
* [キーボードがどのように動作するか](ja/how_keyboards_work.md)
* [QMK の理解](ja/understanding_qmk.md)
* QMK の開発
* 破壊的な変更
* [概要](ja/breaking_changes.md)
* [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
* 履歴
* [2020年2月29日](ja/ChangeLog/20200229.md)
* [2019年8月30日](ja/ChangeLog/20190830.md)
* 他の話題
* [Eclipse で QMK を使用](ja/other_eclipse.md)
* [VSCode で QMK を使用](ja/other_vscode.md)
* [サポート](ja/support.md)
* [翻訳を追加する方法](ja/translating.md)
* C 開発
* [ARM デバッグ ガイド](ja/arm_debugging.md)
* [AVR プロセッサ](ja/hardware_avr.md)
* [コーディング規約](ja/coding_conventions_c.md)
* [互換性のあるマイクロコントローラ](ja/compatible_microcontrollers.md)
* [ドライバ](ja/hardware_drivers.md)
* [ADC ドライバ](ja/adc_driver.md)
* [I2C ドライバ](ja/i2c_driver.md)
* [WS2812 ドライバ](ja/ws2812_driver.md)
* [EEPROM ドライバ](ja/eeprom_driver.md)
* [GPIO コントロール](ja/internals_gpio_control.md)
* [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
* QMK の内部詳細(作成中)
* [定義](ja/internals_defines.md)
* [Input Callback Reg](ja/internals_input_callback_reg.md)
* [Midi ドライバ](ja/internals_midi_device.md)
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
* [Midi ユーティリティ](ja/internals_midi_util.md)
* [Send Functions](ja/internals_send_functions.md)
* [Sysex Tools](ja/internals_sysex_tools.md)
* Python 開発
* [コーディング規約](ja/coding_conventions_python.md)
* [QMK CLI 開発](ja/cli_development.md)
* Configurator 開発
* QMK API
* [開発環境](ja/api_development_environment.md)
* [アーキテクチャの概要](ja/api_development_overview.md)
* QMK Reference
* [QMK への貢献](ja/contributing.md)
* [QMK ドキュメントの翻訳](ja/translating.md)
* [設定オプション](ja/config_options.md)
* [Make ドキュメント](ja/getting_started_make_guide.md)
* [ドキュメント ベストプラクティス](ja/documentation_best_practices.md)
* [ドキュメント テンプレート](ja/documentation_templates.md)
* [コミュニティレイアウト](ja/feature_layouts.md)
* [ユニットテスト](ja/unit_testing.md)
* [便利な関数](ja/ref_functions.md)
* [info.json 形式](ja/reference_info_json.md)
* より深く知るために
* [キーボードがどのように動作するか](ja/how_keyboards_work.md)
* [マトリックスがどのように動作するか](ja/how_a_matrix_works.md)
* [QMK を理解する](ja/understanding_qmk.md)
* QMK の内部詳細(作成中)
* [定義](ja/internals_defines.md)
* [Input Callback Reg](ja/internals_input_callback_reg.md)
* [Midi デバイス](ja/internals_midi_device.md)
* [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
* [Midi ユーティリティ](ja/internals_midi_util.md)
* [Send Functions](ja/internals_send_functions.md)
* [Sysex Tools](ja/internals_sysex_tools.md)

View File

@@ -1,8 +1,8 @@
# Eclipse を使った ARM デバッグ
<!---
original document: eae21eed7:docs/arm_debugging.md
git diff eae21eed7 HEAD -- docs/arm_debugging.md | cat
original document: 0.8.58:docs/arm_debugging.md
git diff 0.8.58 HEAD -- docs/arm_debugging.md | cat
-->
このページでは、SWD アダプタとオープンソース/フリーツールを使って ARM MCU をデバッグするためのセットアップ方法について説明します。このガイドでは、GNU MCU Eclipse IDE for C/C++ Developers および OpenOCD を必要な依存関係と一緒にインストールします。
@@ -60,7 +60,7 @@ Java は Eclipse で必要とされるため、[ここ](https://www.oracle.com/t
Eclipse に QMK をビルドしようとするデバイスを教える必要があります。QMK フォルダを右クリック -> Properties -> C/C++ Build -> Settings を選択します。Devices タブを選択し、Devices の下から MCU の適切な種類を選択します。私の例では、STM32F303CC です。
この間に、Build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
この間に、Build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。Build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
## ビルド
@@ -70,13 +70,13 @@ Eclipse に QMK をビルドしようとするデバイスを教える必要が
### デバッガの接続
ARM MCU は、クロック信号(SWCLK) とデータ信号(SWDIO) で構成される Single Wire Debug (SWD) プロトコルを使います。MCU を 完全に操作するには、この2本のワイヤとグラウンドを接続するだけで十分です。ここでは、キーボードは USB を介して電力が供給されると想定しています。手動でリセットボタンを使えるため、RESET 信号は必要ありません。より高度なセットアップのために printf と scanf をホストに非同期にパイプする SWO 信号を使用できますが、私たちのセットアップでは無視します。
ARM MCU は、クロック信号(SWCLK) とデータ信号(SWDIO) で構成される Single Wire Debug (SWD) プロトコルを使います。MCU を完全に操作するには、この2本のワイヤとグラウンドを接続するだけで十分です。ここでは、キーボードは USB を介して電力が供給されると想定しています。手動でリセットボタンを使えるため、RESET 信号は必要ありません。より高度なセットアップのために printf と scanf をホストに非同期にパイプする SWO 信号を使用できますが、私たちのセットアップでは無視します。
注意: SWCLK と SWDIO ピンがキーボードのマトリックスで使われていないことを確認してください。もし使われている場合は、一時的に他のピンに切り替えることができます。
### デバッガの設定
QMK フォルダを右クリックし、Debug As -> Debug Configurations... を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは stm32f3discovery.cfg と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
QMK フォルダを右クリックし、Debug As -> Debug Configurations... を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは `stm32f3discovery.cfg` と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
注意: 私の場合、この設定スクリプトはリセット操作を無効にするために編集が必要です。スクリプトの場所は、通常はパス `openocd/version/.content/scripts/board` の下の実際の実行可能フィールドの中で見つかります。ここで、私は `reset_config srst_only``reset_config none` に編集しました。
@@ -86,7 +86,7 @@ Apply and Close を選択します。
キーボードをリセットしてください。
虫アイコンをクリックし、もし全てうまく行けば Debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止するので、Play ボタンを押します。全てのデバッガのほとんどの機能は ARM MCU で動作しますが、正確な詳細については google があなたのお友達です!
虫アイコンをクリックし、もし全てうまく行けば Debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止、Play ボタンが押されるのを待ちます。全てのデバッガのほとんどの機能は Arm MCU で動作しますが、正確な詳細については Google があなたのお友達です!
ハッピーデバッギング!

View File

@@ -1,8 +1,8 @@
# QMK CLI
<!---
original document: 2fe288d01:docs/cli.md
git diff 2fe288d01 HEAD -- docs/cli.md | cat
original document: 79e6b7866:docs/cli.md
git diff 79e6b7866 HEAD -- docs/cli.md | cat
-->
このページは QMK CLI のセットアップと使用方法について説明します。
@@ -215,14 +215,14 @@ qmk doctor [-y] [-n]
qmk doctor -n
## `qmk json-keymap`
## `qmk json2c`
QMK Configurator からエクスポートしたものから keymap.c を生成します。
**使用法**:
```
qmk json-keymap [-o OUTPUT] filename
qmk json2c [-o OUTPUT] filename
```
## `qmk kle2json`
@@ -257,6 +257,16 @@ $ qmk kle2json -f kle.txt -f
qmk list-keyboards
```
## `qmk list-keymaps`
このコマンドは指定されたキーボード(とリビジョン)の全てのキーマップをリスト化します。
**使用法**:
```
qmk list-keymaps -kb planck/ez
```
## `qmk new-keymap`
このコマンドは、キーボードの既存のデフォルトのキーマップに基づいて新しいキーマップを作成します。

View File

@@ -1,8 +1,8 @@
# 貢献方法
<!---
original document: d47809575:docs/contributing.md
git diff d47809575 HEAD -- docs/contributing.md | cat
original document: 0.8.62:docs/contributing.md
git diff 0.8.62 HEAD -- docs/contributing.md | cat
-->
👍🎉 まず、これを読み貢献する時間を作ってくれてありがとうございます!🎉👍
@@ -106,7 +106,7 @@ enum my_keycodes {
};
```
### ドキュメントのプレビュー
### ドキュメントのプレビュー :id=previewing-the-documentation
開発環境をセットアップした場合は、プルリクエストを開く前に以下のコマンドを `qmk_firmware/` フォルダから実行することで、あなたの変更をプレビューすることができます:
@@ -122,7 +122,7 @@ enum my_keycodes {
ほとんどの初めての QMK 貢献者は、個人のキーマップから始めます。キーマップの標準はかなりカジュアルなものにしようとしています(キーマップは結局のところ作成者の性格を反映しています)が、他の人があなたのキーマップを簡単に見つけて学ぶことができるように、これらのガイドラインに従うようにお願いします。
* [the template](documentation_templates.md) を使って `readme.md` を書きます。
* [テンプレート](documentation_templates.md) を使って `readme.md` を書きます。
* 全てのキーマップの PR は squash されるため、コミットがどのように squash されるかを気にする場合は、自分で行う必要があります。
* キーマップの PR に機能をまとめないでください。最初に機能をサブミットし、次にキーマップのための2つ目の PR をサブミットします。
* `Makefile` をキーマップフォルダに含めないでください(もう使われていません)。
@@ -134,7 +134,7 @@ enum my_keycodes {
また以下のガイドラインに従うことをお願いします:
* [the template](ja/documentation_templates.md) を使って `readme.md` を書きます。
* [テンプレート](ja/documentation_templates.md) を使って `readme.md` を書きます。
* コミットの数を適切に保ってください。そうでなければあなたの PR を squash します。
* コア機能を新しいキーボードにまとめないでください。最初に機能をサブミットし、次にキーボード用に別の PR をサブミットしてください。
* `.c`/`.h` ファイルにすぐ上の親フォルダに従って名前を付けます。例えば、`/keyboards/<kb1>/<kb2>/<kb2>.[ch]`

114
docs/ja/custom_matrix.md Normal file
View File

@@ -0,0 +1,114 @@
# カスタムマトリックス
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: 0.8.46:docs/custom_matrix.md
git diff 0.8.46 HEAD -- docs/custom_matrix.md | cat
-->
QMKは、デフォルトのマトリックススキャンルーチンを独自のコードで部分的に入れ替えたり全部入れ替えたりしたりするメカニズムを提供します。
この機能を使用する理由は次のとおりです:
* キーボードのスイッチと MCU ピンの間に追加のハードウェアがある場合
* I/O マルチプレクサ
* ラインデコーダー
* 一般的ではないキースイッチマトリックス
* `COL2ROW``ROW2COL` の同時使用
## 前提条件
カスタムマトリックスの実装には、通常、追加のソースファイルのコンパイルが含まれます。
一貫性を保つために、このソースファイルのファイル名は `matrix.c` とすることをお勧めします。
あなたのキーボードディレクトリに新しいファイルを追加します:
```text
keyboards/<keyboard>/matrix.c
```
そして、新しいファイルのコンパイルを指定するため、以下を `rules.mk` に追加します
```make
SRC += matrix.c
```
## マトリックスコードの部分置き換え
カスタムマトリックスを実装する際、定型コードを書かなくてすむように、さまざまなスキャン関数のデフォルト実装を提供しています。
設定するには、以下を `rules.mk` に追加します:
```make
CUSTOM_MATRIX = lite
```
そして、キーボードディレクトリの `matrix.c` ファイルに次の関数を実装します。
```c
void matrix_init_custom(void) {
// TODO: ここでハードウェアの初期化をする
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool matrix_has_changed = false;
// TODO: ここで、マトリックススキャンを行なう
return matrix_has_changed;
}
```
## マトリックスコードの全面置き換え
スキャンルーチンをさらに変更する必要がある場合は、完全なスキャンルーチンを実装することを選択できます。
設定するには、以下を `rules.mk` に追加します:
```make
CUSTOM_MATRIX = yes
```
そして、キーボードディレクトリの `matrix.c` ファイルに次の関数を実装します。
```c
matrix_row_t matrix_get_row(uint8_t row) {
// TODO: 要求された行データを返します
}
void matrix_print(void) {
// TODO: printf() を使って現在のマトリックスの状態をコンソールにダンプします
}
void matrix_init(void) {
// TODO: ここでハードウェアとグローバルマトリックスの状態を初期化します
// ハードウェアによるデバウンスがない場合 - 設定されているデバウンスルーチンを初期化します
debounce_init(MATRIX_ROWS);
// 正しいキーボード動作のためにこれを呼び出す*必要があります*
matrix_init_quantum();
}
uint8_t matrix_scan(void) {
bool matrix_has_changed = false;
// TODO: ここにマトリックススキャンルーチンを追加します
// ハードウェアによるデバウンスがない場合 - 設定されているデバウンスルーチンを使用します
debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
// 正しいキーボード動作のためにこれを呼び出す*必要があります*
matrix_scan_quantum();
return matrix_has_changed;
}
```
また、次のコールバックのデフォルトも提供します。
```c
__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) {}
```

View File

@@ -1,8 +1,8 @@
# キーボードの挙動をカスタマイズする方法
<!---
original document: 7494490d6:docs/custom_quantum_functions.md
git diff 7494490d6 HEAD -- docs/custom_quantum_functions.md | cat
original document: 0.8.62:docs/custom_quantum_functions.md
git diff 0.8.62 HEAD -- docs/custom_quantum_functions.md | cat
-->
多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
@@ -39,7 +39,7 @@ enum my_keycodes {
};
```
## 任意のキーコードの挙動のプログラミング
## 任意のキーコードの挙動のプログラミング :id=programming-the-behavior-of-any-keycode
既存のキーの挙動を上書きしたい場合、あるいは新しいキーについて挙動を定義する場合、`process_record_kb()` および `process_record_user()` 関数を使うべきです。これらは実際のキーイベントが処理される前のキー処理中に QMK によって呼び出されます。これらの関数が `true` を返す場合、QMK はキーコードを通常通りに処理します。これは、キーを置き換えるのではなく、キーの機能を拡張するのに便利です。これらの関数が `false` を返す場合、QMK は通常のキー処理をスキップし、必要なキーのアップまたはダウンイベントを送信するのかはユーザ次第です。
@@ -316,7 +316,7 @@ void suspend_wakeup_init_user(void) {
* キーボード/リビジョン : `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
* キーマップ: `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
# レイヤー切り替えコード
# レイヤー切り替えコード :id=layer-change-code
これはレイヤーが切り替えられるたびにコードを実行します。レイヤー表示あるいはカスタムレイヤー処理に役立ちます。
@@ -491,14 +491,24 @@ void eeconfig_init_user(void) { // EEPROM がリセットされます!
# カスタムタッピング期間
デフォルトでは、タッピング期間はグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能な `TAPPING_TERM` を使用できます。
デフォルトでは、タッピング期間と(`IGNORE_MOD_TAP_INTERRUPT` のような)関連オプションはグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能なタイムアウトの挙動を設定できます。
この機能を有効にするには、最初に `config.h``#define TAPPING_TERM_PER_KEY` を追加する必要があります
キーごとのタイムアウトの挙動を制御するための2つの設定可能なオプションがあります:
- `TAPPING_TERM_PER_KEY`
- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
必要な機能ごとに、`config.h``#define` 行を追加する必要があります。
```
#define TAPPING_TERM_PER_KEY
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
```
## `get_tapping_term` の実装例
キーコードに基づいて `TAPPING TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
```c
uint16_t get_tapping_term(uint16_t keycode) {
@@ -513,6 +523,21 @@ uint16_t get_tapping_term(uint16_t keycode) {
}
```
### `get_tapping_term` 関数のドキュメント
## `get_ignore_mod_tap_interrupt` の実装例
キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
```c
bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
switch (keycode) {
case SFT_T(KC_SPC):
return true;
default:
return false;
}
}
```
## `get_tapping_term` / `get_ignore_mod_tap_interrupt` 関数のドキュメント
ここにある他の多くの関数とは異なり、quantum あるいはキーボードレベルの関数を持つ必要はありません (または理由さえありません)。ここではユーザレベルの関数だけが有用なため、そのようにマークする必要はありません。

View File

@@ -0,0 +1,547 @@
# タップダンス: 1つのキーが3つ、5つまたは100の異なる動作をします
<!---
original document: 634b277b0:docs/feature_tap_dance.md
git diff 634b277b0 HEAD -- docs//feature_tap_dance.md | cat
-->
## イントロダクション
セミコロンキーを1回叩くと、セミコロンが送信されます。2回素早く叩くと、コロンが送信されます。3回叩くと、あなたのキーボードのLEDが激しく踊るように明滅します。これは、タップダンスでできることの一例です。それは、コミュニティが提案したとても素敵なファームウェアの機能の1つで、[algernon](https://github.com/algernon) がプルリクエスト [#451](https://github.com/qmk/qmk_firmware/pull/451) で考えて作ったものです。algernon が述べる機能は次の通りです:
この機能を使うと、特定のキーが、タップした回数に基づいて異なる振る舞いをします。そして、割り込みがあった時は、割り込み前に上手く処理されます。
## `ACTION_FUNCTION_TAP` との比較について
`ACTION_FUNCTION_TAP` はタップダンスに似た機能を提供しますが、注目すべきいくつかの重要な違いがあります。違いを確認するため、いくつかの設定を調べてみましょう。1つのキーを1回タップすると `Space` キーが送信され、2回タップすると `Enter` キーが送信されるよう設定します。
`ACTION_FUNCTION_TAP` では、これを設定するのはかなり大変で、キーの順番が割り込まれた時に割り込んだキーが最初に送られるという問題に直面します。例えば、`SPC a` は、もし `SPC``a``TAPPING_TERM` で設定した時間内に両方とも入力された場合、結果として `a SPC` が送信されます。タップダンス機能を使う場合、正しく `SPC a` が送信されます(`TAPPING_TERM` で設定した時間内に `SPC``a` を入力した場合であっても)。
割り込みを正しくハンドリングして目的を達成するため、タップダンスの実装ではシステムの2つの部分をフックします: `process_record_quantum()` とマトリックススキャンです。この2つの部分については以下で説明しますが、今注意すべき点は、マトリックススキャンでは、キーが押されていない時でもタップのシーケンスをタイムアウトにできる必要があるということです。そうすれば、`TAPPING_TERM` の時間が経過した後、`SPC` だけがタイムアウトになって登録されます。
## タップダンスの使い方
一般論は十分です。タップダンスの実際の使い方を見てみましょう!
最初に、あなたの `rules.mk` ファイルで `TAP_DANCE_ENABLE=yes` と設定する必要があります。なぜならば、デフォルトでは無効になっているからです。これでファームウェアのサイズが1キロバイトほど増加します。
オプションで、あなたの `config.h` ファイルに次のような設定を追加して、`TAPPING_TERM` の時間をカスタマイズしたほうが良いです。
```
#define TAPPING_TERM 175
```
`TAPPING_TERM` の時間は、あなたのタップダンスのキーのタップとタップの間の時間として許可された最大の時間で、ミリ秒単位で計測されます。例えば、もし、あなたがこの上にある `#define` ステートメントを使い、1回タップすると `Space` が送信され、2回タップすると `Enter` が送信されるタップダンスキーをセットアップした場合、175ミリ秒以内に2回キーをタップすれば `ENT` だけが送信されるでしょう。もし、1回タップしてから175ミリ秒以上待ってからもう一度タップすると、`SPC SPC` が送信されます。
次に、いくつかのタップダンスのキーを定義するためには、`TD()` マクロ — `F()` マクロに似ています — を使うのが最も簡単です。これは数字を受け取り、この数字は後で `tap_dance-actions` 配列のインデックスとして使われます。
その後、`tap_dance_actions` 配列を使って、タップダンスキーを押した時のアクションを定義します。現在は、5つの可能なオプションがあります:
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: 1回タップすると `kc1` キーコードを送信し、2回タップすると `kc2` キーコードを送信します。キーを押し続けているときは、適切なキーコードが登録されます: キーを押し続けた場合は `kc1`、一度タップしてから続けてもう一度キーを押してそのまま押し続けたときは、 `kc2` が登録されます。
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` レイヤーに移動します(これは `TO` レイヤーキーコードのように機能します)。
* この機能は `ACTION_TAP_DANCE_DUAL_ROLE` と同じですが、機能が明確になるように関数名を変更しました。どちらの関数名でも実行できます。
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` の状態をトグルします(これは `TG` レイヤーキーコードのように機能します)。
* `ACTION_TAP_DANCE_FN(fn)`: ユーザーキーマップに定義した指定の関数が呼び出されます。タップダンス実行の回数分タップすると、最後の時点で呼び出されます。
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: タップする度にユーザーキーマップに定義した最初の関数が呼び出されます。タップダンスの実行が終わった時点で2番目の関数が呼び出され、タップダンスの実行をリセットするときに最後の関数が呼び出されます。
* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: これは `ACTION_TAP_DANCE_FN_ADVANCED` と同じように機能します。しかし、`TAPPING_TERM` で事前に定義した時間に代えて、カスタマイズしたタップ時間を使えます。
最初のオプションで、1つのキーに2つの役割を持たせる大抵のケースには十分です。例えば、`ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` は、1回タップすると `Space` を送信し、2回タップすると `Enter` を送信します。
!> ここでは [基本的なキーコード](ja/keycodes_basic.md) だけがサポートされていることを覚えておいてください。カスタムキーコードはサポートされていません。
最初のオプションに似ていますが、2番目のオプションは単純なレイヤー切替のケースに適しています。
これ以上に複雑なケースの場合、3番目か4番目のオプションを使います。以下でそれらの例を列挙します
最後に、5番目のオプションは、もし、タップダンスキーをコードに追加した後、非タップダンスキーが奇妙な振る舞いを始めた時に特に役に立ちます。ありうる問題は、あなたがタップダンスキーを使いやすくするために `TAPPING_TERM` の時間を変更した結果、その他のキーが割り込みを処理する方法が変わってしまったというものです。
## 実装の詳細
さて、説明の大部分はここまでです! 以下に挙げているいくつかの例に取り組むことができるようになり、あなた自身のタップダンスの機能を開発できるようになります。しかし、もし、あなたが裏側で起きていることをより深く理解したいのであれば、続けてそれが全てどのように機能するかの説明を読みましょう!
メインエントリーポイントは、`process_tap_dance()` で、`process_record_quantum()` から呼び出されます。これはキーを押すたびに実行され、ハンドラは早期に実行されます。この関数は、押されたキーがタップダンスキーがどうか確認します。
もし、押されたキーがタップダンスキーではなく、かつ、タップダンスが実行されていたなら、最初にそれを処理し、新しく押されたキーをキューに格納します。
もし、押されたキーがタップダンスキーであるなら、既にアクティブなタップダンスと同じキーか確認します(もしアクティブなものがある場合、それと)。
異なる場合、まず、古いタップダンスを処理し、続いて新しいタップダンスを登録します。
同じ場合、カウンタの値を増やし、タイマーをリセットします。
このことは、あなたは再びキーをタップするまでの時間として `TAPPING_TERM` の時間を持っていることを意味します。そのため、あなたは1つの `TAPPING_TERM` の時間内に全てのタップを行う必要はありません。これにより、キーの反応への影響を最小限に抑えながら、より長いタップ回数を可能にします。
次は `matrix_scan_tap_dance()` です。この関数はタップダンスキーのタイムアウトを制御します。
柔軟性のために、タップダンスは、キーコードの組み合わせにも、ユーザー関数にもなることができます。後者は、より高度なタップ回数の制御や、LED を点滅させたり、バックライトをいじったり、等々の制御を可能にします。これは、1つの共用体と、いくつかの賢いマクロによって成し遂げられています。
# 実装例
## シンプルな実装例
ここに1つの定義のための簡単な例があります。
1. `rules.mk``TAP_DANCE_ENABLE = yes` を追加します。
2. `config.h` ファイル(`qmk_firmware/keyboards/planck/config.h` からあなたのキーマップディレクトリにコピーできます)に `#define TAPPING_TERM 200` を追加します。
3. `keymap.c` ファイルに変数とタップダンスの定義を定義し、それからキーマップに追加します。
```c
// タップダンスの宣言
enum {
TD_ESC_CAPS = 0
};
// タップダンスの定義
qk_tap_dance_action_t tap_dance_actions[] = {
// 1回タップすると Escape キー、2回タップすると Caps Lock。
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS)
// ほかの宣言もカンマで区切ってここに記述します
};
// レイヤー定義で、キーコードの代わりにタップダンスキーを追加します
TD(TD_ESC_CAPS)
```
## 複雑な実装例
このセクションでは、いくつかの複雑なタップダンスの例を詳しく説明します。
例で使われている全ての列挙型はこのように宣言します。
```c
// 全ての例のための列挙型定義
enum {
CT_SE = 0,
CT_CLN,
CT_EGG,
CT_FLSH,
X_TAP_DANCE
};
```
### 例1: 1回タップすると `:` を送信し、2回タップすると `;` を送信する
```c
void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_RSFT);
register_code (KC_SCLN);
} else {
register_code (KC_SCLN);
}
}
void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_RSFT);
unregister_code (KC_SCLN);
} else {
unregister_code (KC_SCLN);
}
}
// 全てのタップダンス関数はここに定義します。ここでは1つだけ示します。
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
};
```
### 例2: 100回タップした後に "Safety Dance!" を送信します
```c
void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 100) {
SEND_STRING ("Safety dance!");
reset_tap_dance (state);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
};
```
### 例3: 1つずつ LED を点灯させてから消灯する
```c
// タップする毎に、LED を右から左に点灯します。
// 4回目のタップで、右から左に消灯します。
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_1_on();
break;
case 4:
ergodox_right_led_3_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_1_off();
}
}
// 4回目のタップで、キーボードをフラッシュ状態にセットします。
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 4) {
reset_keyboard();
reset_tap_dance(state);
}
}
// もしフラッシュ状態にならない場合、LED を左から右に消灯します。
void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_1_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_3_off();
}
// 全てのタップダンス関数を一緒に表示しています。この例3は "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)
,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
};
```
### 例4: クアッドファンクションのタップダンス
[DanielGGordon](https://github.com/danielggordon) によるもの
キーを押す回数と、キーを押し続けるかタップするかによって、1つのキーに4つまたはそれ以上の機能を持たせることができるようになります。
以下に例をあげます:
* 1回タップ = `x` を送信
* 押し続ける = `Control` を送信
* 2回タップ = `Escape` を送信
* 2回タップして押し続ける = `Alt` を送信
## 準備
'クアッドファンクションのタップダンス' を利用できるようにするには、いくつかのものが必要になります。
`keymap.c` ファイルの先頭、つまりキーマップの前に、以下のコードを追加します。
```c
typedef struct {
bool is_press_action;
int state;
} tap;
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //シングルタップを2回送信
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7
};
// タップダンスの列挙型
enum {
X_CTL = 0,
SOME_OTHER_DANCE
};
int cur_dance (qk_tap_dance_state_t *state);
//xタップダンスのための関数。キーマップで利用できるようにするため、ここに置きます。
void x_finished (qk_tap_dance_state_t *state, void *user_data);
void x_reset (qk_tap_dance_state_t *state, void *user_data);
```
次に、`keymap.c` ファイルの末尾に、次のコードを追加する必要があります。
```c
/* 実行されるタップダンスの種類に対応する整数を返します。
*
* タップダンスの状態を判別する方法: 割り込みと押下。
*
* 割り込み:
* タップダンスの状態が「割り込み」の場合、他のキーがタップ時間中に押されたことを意味します。
* これは通常、キーを「タップ」しようとしていることを示します。
*
* 押下:
* キーがまだ押されているかどうか。この値が true の場合、タップ時間が終了したことを意味しますが、
* キーはまだ押されたままです。これは通常、キーが「ホールド」されていることを意味します。
*
* タップダンスに関して、qmk ソフトウェアで現在不可能なことの1つは、"permissive hold" 機能を
* 模倣することです。
* 一般に、高度なタップダンスは一般的に入力される文字で使われた場合にうまく機能しません。
* 例えば "A" の場合。タップダンスは文字の入力中に入力しない文字以外のキーで使うのが最適です。
*
* 高度なタップダンスを配置するのに適した場所:
* z、q、x、j、k、v、b、ファンクションキー、home/end、コンマ、セミコロン
*
* タップダンスキーの「最適な配置場所」の基準:
* 文章中で頻繁に入力するキーでないこと
* ダブルタップに頻繁に使われるキーでないこと。例えば、'tab' はターミナルやウェブフォームで
* しばしばダブルタップされます。そのため、タップダンスでは 'tab' は良い選択ではありません。
* 一般的な単語で2回続けて使われる文字でないこと。例えば 'pepper' 中の 'p'。もしタップダンス機能が
* 文字 'p' に存在する場合、'pepper' という単語は入力するのが非常にいらだたしいものになるでしょう。
*
* 3つ目の点については、'DOUBLE_SINGLE_TAP' が存在しますが、これは完全にはテストされていません
*
*/
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) return SINGLE_TAP;
//キーは割り込まれていませんが、まだ押し続けられています。'HOLD' を送信することを意味します。
else return SINGLE_HOLD;
}
else if (state->count == 2) {
/*
* DOUBLE_SINGLE_TAP は "pepper" と入力することと、'pp' と入力したときに実際に
* ダブルタップしたい場合とを区別するためのものです。
* この戻り値の推奨されるユースケースは、'ダブルタップ' 動作やマクロではなく、
* そのキーの2つのキー入力を送信したい場合です。
*/
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
//誰も同じ文字を3回入力しようとしていないと仮定します(少なくとも高速には)。
//タップダンスキーが 'KC_W' で、"www." と高速に入力したい場合、ここに例外を追加して
//'TRIPLE_SINGLE_TAP' を返し、'DOUBLE_SINGLE_TAP' のようにその列挙型を定義する
//必要があります。
if (state->count == 3) {
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
}
else return 8; //マジックナンバー。いつかこのメソッドはより多くの押下に対して機能するよう拡張されるでしょう
}
//'x' タップダンスの 'tap' のインスタンスをインスタンス化します
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);
//最後の case は高速入力用です。キーが `f` であると仮定します:
//例えば、`buffer` という単語を入力するとき、`Esc` ではなく `ff` を送信するようにします。
//高速入力時に `ff` と入力するには、次の文字は `TAPPING_TERM` 以内に入力する必要があります。
//`TAPPING_TERM` はデフォルトでは 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;
}
qk_tap_dance_action_t tap_dance_actions[] = {
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,x_finished, x_reset)
};
```
これで、キーマップのどこでも簡単に `TD(X_CTL)` マクロが使えます。
もし、この機能をユーザスペースで実現したい場合、 [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) がユーザスペースでどのように実装しているか確認してください。
> この設定の "hold" は、タップダンスのタイムアウト(`ACTION_TAP_DANCE_FN_ADVANCED_TIME` 参照)の **後** に起こります。即座に "hold" を得るためには、条件から `state->interrupted` の確認を除きます。結果として、複数回のタップのための時間をより多く持つことで快適な長いタップの期限を使うことができ、そして、"hold" のために長く待たないようにすることができます(2倍の `TAPPING TERM` で開始してみてください)。
### 例5: タップダンスを高度なモッドタップとレイヤータップキーに使う :id=example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys
タップダンスは、タップされたコードが基本的なキーコード以外の場合に、 `MT()``LT()` マクロをエミュレートするのに利用できます。これは、通常 `Shift` を必要とする '(' や '{' のようなキーや、`Control + X` のように他の修飾されたキーコードをタップされたキーコードとして送信することに役立ちます。
あなたのレイヤーとカスタムキーコードの下に、以下のコードを追加します。
```c
//タップダンスのキーコード
enum td_keycodes {
ALT_LP //例: 押していると `LALT`、タップすると `(`。それぞれのタップダンスの追加のキーコードを追加します
};
//必要な数のタップダンス状態を含むタイプを定義します
typedef enum {
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_SINGLE_TAP
} td_state_t;
//タップダンスの状態の型のグローバルインスタンスを作ります
static td_state_t td_state;
//タップダンス関数を宣言します:
//現在のタップダンスの状態を特定するための関数
int cur_dance (qk_tap_dance_state_t *state);
//それぞれのタップダンスキーコードに適用する `finished` と `reset` 関数
void altlp_finished (qk_tap_dance_state_t *state, void *user_data);
void altlp_reset (qk_tap_dance_state_t *state, void *user_data);
```
キーレイアウト(`LAYOUT`)の下に、タップダンスの関数を定義します。
```c
// 返却するタップダンス状態を特定します
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
else { return SINGLE_HOLD; }
}
if (state->count == 2) { return DOUBLE_SINGLE_TAP; }
else { return 3; } // 上記で返却する最大の状態の値より大きい任意の数
}
// 定義する各タップダンスキーコードのとりうる状態を制御します:
void altlp_finished (qk_tap_dance_state_t *state, void *user_data) {
td_state = cur_dance(state);
switch (td_state) {
case SINGLE_TAP:
register_code16(KC_LPRN);
break;
case SINGLE_HOLD:
register_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_on(_MY_LAYER)` を使います
break;
case DOUBLE_SINGLE_TAP: // タップ時間内に2つの括弧 `((` の入れ子を可能にします
tap_code16(KC_LPRN);
register_code16(KC_LPRN);
}
}
void altlp_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (td_state) {
case SINGLE_TAP:
unregister_code16(KC_LPRN);
break;
case SINGLE_HOLD:
unregister_mods(MOD_BIT(KC_LALT)); // レイヤータップキーの場合、ここでは `layer_off(_MY_LAYER)` を使います
break;
case DOUBLE_SINGLE_TAP:
unregister_code16(KC_LPRN);
}
}
// 各タップダンスキーコードの `ACTION_TAP_DANCE_FN_ADVANCED()` を定義し、`finished` と `reset` 関数を渡します
qk_tap_dance_action_t tap_dance_actions[] = {
[ALT_LP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
};
```
それぞれのタップダンスキーコードをキーマップに含めるときは、`TD()` マクロでキーコードをラップします。例: `TD(ALT_LP)`
### 例6: タップダンスを一時的なレイヤー切り替えとレイヤートグルキーに使う
タップダンスは、MO(layer) と TG(layer) 機能を模倣することにも使用できます。この例では、1回タップすると `KC_QUOT` 、1回押してそのまま押し続けたら `MO(_MY_LAYER)` 、2回タップしたときは `TG(_MY_LAYER)` として機能するキーを設定します。
最初のステップは、あなたの `keymap.c` ファイルの最初のあたりに以下のコードを追加します。
```c
typedef struct {
bool is_press_action;
int state;
} tap;
//必要な数のタップダンス状態のタイプを定義します
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3
};
enum {
QUOT_LAYR = 0 //カスタムタップダンスキー。他のタップダンスキーはこの列挙型に追加します
};
//タップダンスキーで使われる関数を宣言します
//全てのタップダンスに関連する関数
int cur_dance (qk_tap_dance_state_t *state);
//個別のタップダンスに関連する関数
void ql_finished (qk_tap_dance_state_t *state, void *user_data);
void ql_reset (qk_tap_dance_state_t *state, void *user_data);
```
あなたの `keymap.c` ファイルの最後の方に以下のコードを追加します。
```c
//現在のタップダンスの状態を決定します
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (!state->pressed) {
return SINGLE_TAP;
} else {
return SINGLE_HOLD;
}
} else if (state->count == 2) {
return DOUBLE_TAP;
}
else return 8;
}
//この例のタップダンスキーに関連付けられた "tap" 構造体を初期化します
static tap ql_tap_state = {
.is_press_action = true,
.state = 0
};
//タップダンスキーの動作をコントロールする関数
void ql_finished (qk_tap_dance_state_t *state, void *user_data) {
ql_tap_state.state = cur_dance(state);
switch (ql_tap_state.state) {
case SINGLE_TAP:
tap_code(KC_QUOT);
break;
case SINGLE_HOLD:
layer_on(_MY_LAYER);
break;
case DOUBLE_TAP:
//レイヤーが既にセットされているか確認します
if (layer_state_is(_MY_LAYER)) {
//レイヤーが既にセットされていたら、オフにします。
layer_off(_MY_LAYER);
} else {
//レイヤーがセットされていなかったら、オンにします。
layer_on(_MY_LAYER);
}
break;
}
}
void ql_reset (qk_tap_dance_state_t *state, void *user_data) {
//キーを押し続けていて今離したら、レイヤーをオフに切り替えます。
if (ql_tap_state.state==SINGLE_HOLD) {
layer_off(_MY_LAYER);
}
ql_tap_state.state = 0;
}
//タップダンスキーを機能に関連付けます
qk_tap_dance_action_t tap_dance_actions[] = {
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
};
```
上記のコードは、前の例で使われたコードに似ています。注意する1つのポイントは、必要に応じてレイヤーを切り替えられるように、どのレイヤーがアクティブになっているかいつでも確認できる必要があることです。これを実現するために、引数で与えられた `layer` がアクティブなら `true` を返す `layer_state_is( layer )` を使います。
`cur_dance()``ql_tap_state` の使い方は、上の例と似ています。
`ql_finished` 関数における `case:SINGLE_TAP` は、上の例と似ています。`case:SINGLE_HOLD` は、`ql_reset()` と連動してタップダンスキーを押している間 `_MY_LAYER` に切り替わり、キーを離した時に `_MY_LAYER` から離れます。これは、`MO(_MY_LAYER)` に似ています。`case:DOUBLE_TAP` は、`_MY_LAYER` がアクティブレイヤーかどうかを確認することによって動きます。そして、その結果に基づいてレイヤーのオン・オフをトグルします。これは `TG(_MY_LAYER)` に似ています。
`tap_dance_actions[]` は、上の例に似ています。 `ACTION_TAP_DANCE_FN_ADVANCED()` の代わりに `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` を使ったことに注意してください。
この理由は、私は、非タップダンスキーを使うにあたり `TAPPING_TERM` が短い(175ミリ秒以内)方が好きなのですが、タップダンスのアクションを確実に完了させるには短すぎるとわかったからです——そのため、ここでは時間を275ミリ秒に増やしています。
最後に、このタップダンスキーを動かすため、忘れずに `TD(QUOT_LAYR)``keymaps[]` に加えてください。

View File

@@ -1,13 +1,13 @@
# 書き込みの手順とブートローダ情報
<!---
original document: 7494490d6:docs/flashing.md
git diff 7494490d6 HEAD -- docs/flashing.md | cat
original document: 0.8.62:docs/flashing.md
git diff 0.8.62 HEAD -- docs/flashing.md | cat
-->
キーボードが使用するブートローダにはかなり多くの種類があり、ほぼ全てが異なる書き込みの方法を使います。幸いなことに、[QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) のようなプロジェクトは、あまり深く考える必要無しに様々なタイプと互換性を持つことを目指していますが、この文章では様々なタイプのブートローダとそれらを書き込むために利用可能な方法について説明します。
`rules.mk``BOOTLOADER` 変数で選択されたブートローダがある場合、QMK は .hex ファイルがデバイスに書き込むのに適切なサイズかどうかを自動的に計算し、合計サイズをバイト単位で(最大値とともに)出力します。この処理を手動で実行するには、`check-size` を付けてコンパイルします。例えば、`make planck/rev4:default:check-size`
`rules.mk``BOOTLOADER` 変数で選択されたブートローダがある場合、QMK は .hex ファイルがデバイスに書き込むのに適切なサイズかどうかを自動的に計算し、合計サイズをバイト単位で(最大値とともに)出力します。
## DFU
@@ -105,7 +105,7 @@ BOOTLOADER = caterina
make <keyboard>:<keymap>:avrdude
#### Caterina コマンド
### Caterina コマンド
ファームウェアを DFU デバイスに書き込むために使用できる DFU コマンドがいくつかあります。

128
docs/ja/i2c_driver.md Normal file
View File

@@ -0,0 +1,128 @@
# I2C マスタドライバ
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: 85041ff05:docs/i2c_driver.md
git diff 85041ff05 HEAD -- docs/i2c_driver.md | cat
-->
QMK で使われる I2C マスタドライバには、MCU 間のポータビリティを提供するための一連の関数が用意されています。
## 使用できる関数
| 関数 | 説明 |
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `void i2c_init(void);` | I2C ドライバを初期化します。他のあらゆるトランザクションを開始する前に、この関数を一度だけ呼ぶ必要があります。 |
| `uint8_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
| `uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 |
| `uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 |
| `uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 |
| `uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 |
| `uint8_t i2c_stop(void);` | I2C トランザクションを終了します。 |
### 関数の戻り値
`void i2c_init(void)` を除く上にあるすべての関数は、次の真理値表にある値を返します。
| 戻り値 | 説明 |
|--------|------------------------------|
| 0 | 処理が正常に実行されました。 |
| -1 | 処理に失敗しました。 |
| -2 | 処理がタイムアウトしました。 |
## AVR
### 設定
I2Cマスタドライバを設定するために、次の定義が使えます。
| 変数 | 説明 | 既定値 |
|---------|---------------------|--------|
| `F_SCL` | クロック周波数 (Hz) | 400KHz |
AVR は通常 I2C ピンとして使う GPIO が設定されているので、これ以上の設定は必要ありません。
## ARM
ARM の場合は、内部に ChibiOS I2C HAL ドライバがあります。この節では STM32 MCU を使用していると仮定します。
### 設定
ARM MCU 用の設定はしばしば非常に複雑です。これは、多くの場合複数の I2C ドライバをさまざまなポートに対して割り当てられるためです。
最初に、必要なハードウェアドライバを有効にするために `mcuconf.h` ファイルをセットアップします。
| 変数 | 説明 | 既定値 |
|-------------------------------|------------------------------------------------------------------------------------------------|--------|
| `#STM32_I2C_USE_XXX` | ハードウェアドライバ XXX の有効化/無効化(すべてのドライバを明示的にリストアップする必要あり) | FALSE |
| `#STM32_I2C_BUSY_TIMEOUT` | レスポンスの受信がない場合に I2C コマンドを中断するまでの時間 (ms) | 50 |
| `#STM32_I2C_XXX_IRQ_PRIORITY` | ハードウェアドライバ XXX の割り込み優先度(上級者向けの設定) | 10 |
| `#STM32_I2C_USE_DMA` | MCU がデータ送信を DMA ユニットにオフロードする機能の有効化/無効化 | TRUE |
| `#STM32_I2C_XXX_DMA_PRIORITY` | ハードウェアドライバ XXX に使用する DMA ユニットの優先度(上級者向けの設定) | 1 |
次に `halconf.h` ファイル内で `#define HAL_USE_I2C``TRUE` にします。これにより ChibiOS が I2C ドライバを読み込みます。
最後に、使用したい I2C ハードウェアドライバに応じて正しい GPIO ピンを割り当てます。
標準では I2C1 ハードウェアドライバが使われます。もし他のハードウェアドライバを使う場合、 `config.h` ファイルに `#define I2C_DRIVER I2CDX` を追加します( X は使用するハードウェアドライバの番号です)。例えば I2C3 を有効化する場合、`config.h` ファイルに `#define I2C_DRIVER I2CD3` と定義します。これにより QMK I2C ドライバと ChibiOS I2C driver が同期されます。
STM32 MCU では、使用するハードウェアドライバにより、さまざまなピンを I2C ピンとして設定できます。標準では `B6`, `B7` ピンが I2C 用のピンです。 I2C 用のピンを設定するために次の定義が使えます:
| 変数 | 説明 | 既定値 |
|-----------------------|--------------------------------------------------------------------------------------------------|---------|
| `I2C1_SCL_BANK` | SCL に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` |
| `I2C1_SDA_BANK` | SDA に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` |
| `I2C1_SCL` | SCL のピン番号 (0-9) | `6` |
| `I2C1_SDA` | SDA のピン番号 (0-9) | `7` |
| `I2C1_BANK`(非推奨) | 使用するピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`)。後継は `I2C1_SCL_BANK`, `I2C1_SDA_BANK` です。 | `GPIOB` |
ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します。
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx, STM32L1xx では I2Cv1 が使われます。
STM32F0xx, STM32F3xx, STM32F7xx, STM32L4xx では I2Cv2 が使われます。
#### I2Cv1
STM32 MCU の I2Cv1 では、クロック周波数とデューティ比を次の変数で変更できます。詳しくは <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> を参照してください。
| 変数 | 既定値 |
|--------------------|------------------|
| `I2C1_OPMODE` | `OPMODE_I2C` |
| `I2C1_CLOCK_SPEED` | `100000` |
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
#### I2Cv2
STM32 MCU の I2Cv2 では、信号のタイミングパラメータを次の変数で変更できます。詳しくは <https://www.st.com/en/embedded-software/stsw-stm32126.html> を参照してください。
| 変数 | 既定値 |
|-----------------------|--------|
| `I2C1_TIMINGR_PRESC` | `15U` |
| `I2C1_TIMINGR_SCLDEL` | `4U` |
| `I2C1_TIMINGR_SDADEL` | `2U` |
| `I2C1_TIMINGR_SCLH` | `15U` |
| `I2C1_TIMINGR_SCLL` | `21U` |
STM32 MCU では GPIO ピンを設定するとき、別の「代替機能」モードを使うことができます。これは I2Cv2 モードで使われるピンを変更するために必要です。適切な設定値は、使用している MCU のデータシートを参照してください。
| 変数 | 既定値 |
|---------------------|--------|
| `I2C1_SCL_PAL_MODE` | `4` |
| `I2C1_SDA_PAL_MODE` | `4` |
#### その他
`void i2c_init(void)` 関数は `weak` 属性が付いており、オーバーロードすることができます。この場合、上記で設定した変数は使用されません。可能な GPIO の設定については、 MCU のデータシートを参照してください。次に示すのは初期化関数の例です:
```C
void i2c_init(void)
{
setPinInput(B6); // Try releasing special pins for a short time
setPinInput(B7);
wait_ms(10); // Wait for the release to happen
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
}
```

View File

@@ -1,14 +1,14 @@
# キーマップの概要
<!---
original document: 7494490d6:docs/keymap.md
git diff 7494490d6 HEAD -- docs/keymap.md | cat
original document: 0.8.62:docs/keymap.md
git diff 0.8.62 HEAD -- docs/keymap.md | cat
-->
QMK のキーマップは C のソースファイルの中で定義されます。そのデータ構造は配列の配列です。外側はレイヤーを要素とする配列で、レイヤーはキーを要素とする配列。ほとんどのキーボードは `LAYOUT()` マクロを定義して、この配列の配列を作成しやすくしています。
## キーマップとレイヤー
## キーマップとレイヤー :id=keymap-and-layers
QMKでは、**`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`**は、**アクションコード**を保持している **16 bit** データの中でキーマップ情報の複数の**レイヤー**を保持します。最大で**32個のレイヤー**を定義することができます。
普通のキー定義の場合、**アクションコード**の上位8ビットは全て0で、下位8ビットは**キーコード**としてキーによって生成された USB HID usage コードを保持します。
@@ -32,7 +32,8 @@ QMKでは、**`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`**は
TMK の歴史的経緯から、キーマップに保存されたアクションコードは、一部のドキュメントではキーコードと呼ばれる場合があります。
### キーマップレイヤーステータス
### キーマップレイヤーステータス :id=keymap-layer-status
キーマップレイヤーの状態は、2つの32ビットパラメータによって決定されます。
* **`default_layer_state`** は、常に有効で参照される基本キーマップレイヤー (0-31) を示します (デフォルトレイヤー)。

View File

@@ -10,7 +10,7 @@
?> **次の手順を順番に実行してください。**
[Video Tutorial](https://youtu.be/tx54jkRC9ZY) を見てください。
[Video Tutorial](https://www.youtube.com/watch?v=-imgglzDMdY) を見てください。
QMK Configurator は Chrome/Firefox で最適に動作します。

View File

@@ -4,7 +4,9 @@ When defining a [keymap](keymap.md) each key needs a valid key definition. This
This is a reference only. Each group of keys links to the page documenting their functionality in more detail.
## [Basic Keycodes](keycodes_basic.md)
## Basic Keycodes :id=basic-keycodes
See also: [Basic Keycodes](keycodes_basic.md)
|Key |Aliases |Description |
|-----------------------|------------------------------|-----------------------------------------------|
@@ -206,7 +208,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |
## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
## Quantum Keycodes :id=quantum-keycodes
See also: [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes)
|Key |Aliases |Description |
|--------------|---------|-------------------------------------------------------|
@@ -214,7 +218,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`DEBUG` | |Toggle debug mode |
|`EEPROM_RESET`|`EEP_RST`|Reinitializes the keyboard's EEPROM (persistent memory)|
## [Audio Keys](feature_audio.md)
## Audio Keys :id=audio-keys
See also: [Audio](feature_audio.md)
|Key |Aliases |Description |
|----------------|---------|----------------------------------|
@@ -230,7 +236,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`MU_TOG` | |Toggles Music Mode |
|`MU_MOD` | |Cycles through the music modes |
## [Backlighting](feature_backlight.md)
## Backlighting :id=backlighting
See also: [Backlighting](feature_backlight.md)
|Key |Description |
|---------|------------------------------------------|
@@ -242,7 +250,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`BL_DEC` |Decrease the backlight level |
|`BL_BRTG`|Toggle backlight breathing |
## [Bootmagic](feature_bootmagic.md)
## Bootmagic :id=bootmagic
See also: [Bootmagic](feature_bootmagic.md)
|Key |Aliases |Description |
|----------------------------------|---------|--------------------------------------------------------------------------|
@@ -276,7 +286,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`MAGIC_EE_HANDS_LEFT` |`EH_LEFT`|Set the master half of a split keyboard as the left hand (for `EE_HANDS`) |
|`MAGIC_EE_HANDS_RIGHT` |`EH_RGHT`|Set the master half of a split keyboard as the right hand (for `EE_HANDS`)|
## [Bluetooth](feature_bluetooth.md)
## Bluetooth :id=bluetooth
See also: [Bluetooth](feature_bluetooth.md)
|Key |Description |
|----------|----------------------------------------------|
@@ -284,7 +296,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`OUT_USB` |USB only |
|`OUT_BT` |Bluetooth only |
## [Dynamic Macros](feature_dynamic_macros.md)
## Dynamic Macros :id=dynamic-macros
See also: [Dynamic Macros](feature_dynamic_macros.md)
|Key |Aliases |Description |
|-----------------|---------|--------------------------------------------------|
@@ -294,38 +308,48 @@ This is a reference only. Each group of keys links to the page documenting their
|`DYN_MACRO_PLAY2`|`DM_PLY2`|Replay Macro 2 |
|`DYN_REC_STOP` |`DM_RSTP`|Finish the macro that is currently being recorded.|
## [Grave Escape](feature_grave_esc.md)
## Grave Escape :id=grave-escape
See also: [Grave Escape](feature_grave_esc.md)
|Key |Aliases |Description |
|-----------|---------|------------------------------------------------------------------|
|`GRAVE_ESC`|`KC_GESC`|Escape when pressed, <code>&#96;</code> when Shift or GUI are held|
## [Key Lock](feature_key_lock.md)
## Key Lock :id=key-lock
See also: [Key Lock](feature_key_lock.md)
|Key |Description |
|---------|--------------------------------------------------------------|
|`KC_LOCK`|Hold down the next key pressed, until the key is pressed again|
## [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
## Layer Switching :id=layer-switching
See also: [Layer Switching](feature_layers.md#switching-and-toggling-layers)
|Key |Description |
|----------------|----------------------------------------------------------------------------------|
|`DF(layer)` |Set the base (default) layer |
|`MO(layer)` |Momentarily turn on `layer` when pressed (requires `KC_TRNS` on destination layer)|
|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](https://docs.qmk.fm/#/feature_advanced_keycodes?id=one-shot-keys) for details. |
|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. Where `mod` is a mods_bit. Mods can be viewed [here](https://docs.qmk.fm/#/feature_advanced_keycodes?id=mod-tap). Example Implementation: `LM(LAYER_1, MOD_LALT)`|
|`OSL(layer)` |Momentarily activates `layer` until a key is pressed. See [One Shot Keys](one_shot_keys.md) for details. |
|`LM(layer, mod)`|Momentarily turn on `layer` (like MO) with `mod` active as well. Where `mod` is a mods_bit. Mods can be viewed [here](mod_tap.md). Example Implementation: `LM(LAYER_1, MOD_LALT)`|
|`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped |
|`TG(layer)` |Toggle `layer` on or off |
|`TO(layer)` |Turns on `layer` and turns off all other layers, except the default layer |
|`TT(layer)` |Normally acts like MO unless it's tapped multiple times, which toggles `layer` on |
## [Leader Key](feature_leader_key.md)
## Leader Key :id=leader-key
See also: [Leader Key](feature_leader_key.md)
|Key |Description |
|---------|------------------------|
|`KC_LEAD`|Begins a leader sequence|
## [Mouse Keys](feature_mouse_keys.md)
## Mouse Keys :id=mouse-keys
See also: [Mouse Keys](feature_mouse_keys.md)
|Key |Aliases |Description |
|----------------|---------|---------------------------|
@@ -346,7 +370,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`KC_MS_ACCEL1` |`KC_ACL1`|Set mouse acceleration to 1|
|`KC_MS_ACCEL2` |`KC_ACL2`|Set mouse acceleration to 2|
## [Modifiers](feature_advanced_keycodes.md#modifier-keys)
## Modifiers :id=modifiers
See also: [Modifier Keys](feature_advanced_keycodes.md#modifier-keys)
|Key |Aliases |Description |
|----------|-------------------------------|----------------------------------------------------|
@@ -366,7 +392,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`KC_MEH` | |Left Control, Shift and Alt |
|`KC_HYPR` | |Left Control, Shift, Alt and GUI |
## [Mod-Tap Keys](feature_advanced_keycodes.md#mod-tap)
## Mod-Tap Keys :id=mod-tap-keys
See also: [Mod-Tap](mod_tap.md)
|Key |Aliases |Description |
|-------------|-----------------------------------------------------------------|-------------------------------------------------------|
@@ -387,7 +415,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|`HYPR_T(kc)` |`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## [RGB Lighting](feature_rgblight.md)
## RGB Lighting :id=rgb-lighting
See also: [RGB Lighting](feature_rgblight.md)
|Key |Aliases |Description |
|-------------------|----------|--------------------------------------------------------------------|
@@ -410,7 +440,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode |
|`RGB_MODE_RGBTEST` |`RGB_M_T` |Red,Green,Blue test animation mode |
## [RGB Matrix Lighting](feature_rgb_matrix.md)
## RGB Matrix Lighting :id=rgb-matrix-lighting
See also: [RGB Matrix Lighting](feature_rgb_matrix.md)
|Key |Aliases |Description |
|-------------------|----------|--------------------------------------------------------------------------------------|
@@ -426,14 +458,18 @@ This is a reference only. Each group of keys links to the page documenting their
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
## [Thermal Printer](feature_thermal_printer.md)
## Thermal Printer :id=thermal-printer
See also: [Thermal Printer](feature_thermal_printer.md)
|Key |Description |
|-----------|----------------------------------------|
|`PRINT_ON` |Start printing everything the user types|
|`PRINT_OFF`|Stop printing everything the user types |
## [US ANSI Shifted Symbols](keycodes_us_ansi_shifted.md)
## US ANSI Shifted Symbols :id=us-ansi-shifted-symbols
See also: [US ANSI Shifted Symbols](keycodes_us_ansi_shifted.md)
|Key |Aliases |Description|
|------------------------|-------------------|-----------|
@@ -459,14 +495,18 @@ This is a reference only. Each group of keys links to the page documenting their
|`KC_RIGHT_ANGLE_BRACKET`|`KC_RABK`, `KC_GT` |`>` |
|`KC_QUESTION` |`KC_QUES` |`?` |
## [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys)
## One Shot Keys :id=one-shot-keys
See also: [One Shot Keys](one_shot_keys.md)
|Key |Description |
|------------|----------------------------------|
|`OSM(mod)` |Hold `mod` for one keypress |
|`OSL(layer)`|Switch to `layer` for one keypress|
## [Space Cadet](feature_space_cadet.md)
## Space Cadet :id=space-cadet
See also: [Space Cadet](feature_space_cadet.md)
|Key |Description |
|-----------|----------------------------------------|
@@ -478,7 +518,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`KC_RAPC` |Right Alt when held, `)` when tapped |
|`KC_SFTENT`|Right Shift when held, Enter when tapped|
## [Swap Hands](feature_swap_hands.md)
## Swap Hands :id=swap-hands
See also: [Swap Hands](feature_swap_hands.md)
|Key |Description |
|-----------|-------------------------------------------------------------------------|
@@ -490,7 +532,9 @@ This is a reference only. Each group of keys links to the page documenting their
|`SH_TG` |Toggles swap on and off with every key press. |
|`SH_TT` |Toggles with a tap; momentary when held. |
## [Unicode Support](feature_unicode.md)
## Unicode Support :id=unicode-support
See also: [Unicode Support](feature_unicode.md)
|Key |Aliases |Description |
|----------------------|---------|----------------------------------------------------------------|

View File

@@ -3,7 +3,7 @@
QMK keymaps are defined inside a C source file. The data structure is an array of arrays. The outer array is a list of layer arrays while the inner layer array is a list of keys. Most keyboards define a `LAYOUT()` macro to help you create this array of arrays.
## Keymap and Layers
## Keymap and Layers :id=keymap-and-layers
In QMK, **`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`** holds multiple **layers** of keymap information in **16 bit** data holding the **action code**. You can define **32 layers** at most.
For trivial key definitions, the higher 8 bits of the **action code** are all 0 and the lower 8 bits holds the USB HID usage code generated by the key as **keycode**.
@@ -27,7 +27,8 @@ 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 Status :id=keymap-layer-status
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 (the default layer).

54
docs/mod_tap.md Normal file
View File

@@ -0,0 +1,54 @@
# Mod-Tap
The Mod-Tap key `MT(mod, kc)` acts like a modifier when held, and a regular keycode when tapped. In other words, you can have a key that sends Escape when you tap it, but functions as a Control or Shift key when you hold it down.
The modifiers this keycode and `OSM()` accept are prefixed with `MOD_`, not `KC_`:
|Modifier |Description |
|----------|----------------------------------------|
|`MOD_LCTL`|Left Control |
|`MOD_LSFT`|Left Shift |
|`MOD_LALT`|Left Alt |
|`MOD_LGUI`|Left GUI (Windows/Command/Meta key) |
|`MOD_RCTL`|Right Control |
|`MOD_RSFT`|Right Shift |
|`MOD_RALT`|Right Alt (AltGr) |
|`MOD_RGUI`|Right GUI (Windows/Command/Meta key) |
|`MOD_HYPR`|Hyper (Left Control, Shift, Alt and GUI)|
|`MOD_MEH` |Meh (Left Control, Shift, and Alt) |
You can combine these by ORing them together like so:
```c
MT(MOD_LCTL | MOD_LSFT, KC_ESC)
```
This key would activate Left Control and Left Shift when held, and send Escape when tapped.
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
|Key |Aliases |Description |
|------------|-----------------------------------------------------------------|-------------------------------------------------------|
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## Caveats
Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored.
Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes.
To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly.

View File

@@ -1,23 +1,30 @@
# The Complete Newbs Guide To QMK
QMK is a powerful Open Source firmware for your mechanical keyboard. You can use QMK to customize your keyboard in ways both simple and powerful. People of all skill levels, from complete newbie to master programmer, have successfully used QMK to customize their keyboard. This guide will help you do the same, no matter your skill level.
Your computer keyboard has a processor inside of it, similar to the one inside your computer. This processor runs software that is responsible for detecting button presses and informing the computer when keys are pressed. QMK Firmware fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom keymap, you are creating an executable program for your keyboard.
Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built yourself chances are good it can. We support a [large number of hobbyist boards](http://qmk.fm/keyboards/), so even if your current keyboard can't run QMK you shouldn't have trouble finding one to suit your needs.
QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful keymaps — you only have to follow a few simple syntax rules.
Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built yourself chances are good it can. We support a [large number of hobbyist boards](http://qmk.fm/keyboards/). If your current keyboard can't run QMK there are a lot of choices out there for boards that do.
## Is This Guide For Me?
This guide is suitable for everyone who wants to build a keyboard firmware using the source code. If you are already a programmer you will find the process very familiar and easier to follow. If the thought of programming intimidates you please [take a look at our online GUI](newbs_building_firmware_configurator.md) instead.
## Overview
There are 7 main sections to this guide:
There are 4 main sections to this guide:
* [Getting Started](newbs_getting_started.md)
* [Building Your First Firmware using the command line](newbs_building_firmware.md)
* [Building Your First Firmware using the online GUI](newbs_building_firmware_configurator.md)
* [Flashing Firmware](newbs_flashing.md)
* [Testing and Debugging](newbs_testing_debugging.md)
* [Best Git Practices](newbs_git_best_practices.md)
* [Learn More with these Resources](newbs_learn_more_resources.md)
1. [Setup Your Environment](newbs_getting_started.md)
2. [Building Your First Firmware](newbs_building_firmware.md)
3. [Flashing Firmware](newbs_flashing.md)
4. [Testing and Debugging](newbs_testing_debugging.md)
This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md).
## Additional Resources
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) A user-created blog covering the basics of how to use QMK Firmware, as seen from a new user's perspective.
Beyond this guide there are several resources you may find helpful while you learn QMK. We've collected them on the [Learning Resources](newbs_learn_more_resources.md) page.
## Open Source
QMK is Open Source Software released under the GNU General Public License.

View File

@@ -2,78 +2,61 @@
Now that you have setup your build environment you are ready to start building custom firmware. For this section of the guide we will bounce between 3 programs- your file manager, your text editor, and your terminal window. Keep all 3 open until you are done and happy with your keyboard firmware.
If you have closed and reopened your terminal window since following the first part of the guide, don't forget to `cd qmk_firmware` so that your terminal is in the correct directory.
## Create a New Keymap
## Navigate To Your Keymaps Folder
To create your own keymap you'll want to create a copy of the `default` keymap. If you configured your build environment in the last step you can do that easily with the QMK CLI:
Start by navigating to the `keymaps` folder for your keyboard.
qmk new-keymap
If you are on macOS or Windows there are commands you can use to easily open the keymaps folder.
If you did not configure your environment, or you have multiple keyboards, you can specify a keyboard name:
### macOS:
qmk new-keymap -kb <keyboard_name>
``` open keyboards/<keyboard_folder>/keymaps ```
Look at the output from that command, you should see something like this:
### Windows:
Ψ <github_username> keymap directory created in: /home/me/qmk_firmware/keyboards/clueboard/66/rev3/keymaps/<github_username>
``` start .\\keyboards\\<keyboard_folder>\\keymaps ```
## Create a Copy Of The `default` Keymap
Once you have the `keymaps` folder open you will want to create a copy of the `default` folder. We highly recommend you name your folder the same as your GitHub username, but you can use any name you want as long as it contains only lower case letters, numbers, and the underscore character.
To automate the process, you also have the option to run the `new_keymap.sh` script.
Navigate to the `qmk_firmware/util` directory and type the following:
```
./new_keymap.sh <keyboard path> <username>
```
For example, for a user named John, trying to make a new keymap for the 1up60hse, they would type in
```
./new_keymap.sh 1upkeyboards/1up60hse john
```
This is the location of your new `keymap.c` file.
## Open `keymap.c` In Your Favorite Text Editor
Open up your `keymap.c`. Inside this file you'll find the structure that controls how your keyboard behaves. At the top of `keymap.c` there may be some defines and enums that make the keymap easier to read. Farther down you'll find a line that looks like this:
Open your `keymap.c` file in your text editor. Inside this file you'll find the structure that controls how your keyboard behaves. At the top of `keymap.c` there may be some defines and enums that make the keymap easier to read. Farther down you'll find a line that looks like this:
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
This line indicates the start of the list of Layers. Below that you'll find lines containing either `LAYOUT` or `KEYMAP`, and these lines indicate the start of a layer. Below that line is the list of keys that comprise a particular layer.
This line indicates where the list of Layers begins. Below that you'll find lines containing `LAYOUT`, and these lines indicate the start of a layer. Below that line is the list of keys that comprise a particular layer.
!> When editing your keymap file be careful not to add or remove any commas. If you do you will prevent your firmware from compiling and it may not be easy to figure out where the extra, or missing, comma is.
## Customize The Layout To Your Liking
How to complete this step is entirely up to you. Make the one change that's been bugging you, or completely rework everything. You can remove layers if you don't need all of them, or add layers up to a total of 32. Check the following documentation to find out what you can define here:
How to complete this step is entirely up to you. Make the one change that's been bugging you, or completely rework everything. You can remove layers if you don't need all of them, or add layers up to a total of 32. There are a lot of features in QMK, explore the sidebar to the left under "Using QMK" to see the full list. To get you started here are a few of the easier to use features:
* [Keycodes](keycodes.md)
* [Features](features.md)
* [FAQ](faq.md)
* [Basic Keycodes](keycodes_basic.md)
* [Quantum Keycodes](quantum_keycodes.md)
* [Grave/Escape](feature_grave_esc.md)
* [Mouse keys](feature_mouse_keys.md)
?> While you get a feel for how keymaps work, keep each change small. Bigger changes make it harder to debug any problems that arise.
## Build Your Firmware
## Build Your Firmware :id=build-your-firmware
When your changes to the keymap are complete you will need to build the firmware. To do so go back to your terminal window and run the build command:
When your changes to the keymap are complete you will need to build the firmware. To do so go back to your terminal window and run the compile command:
make <my_keyboard>:<my_keymap>
qmk compile
For example, if your keymap is named "xyverz" and you're building a keymap for a rev5 planck, you'll use this command:
If you did not configure your environment, or you have multiple keyboards, you can specify a keyboard and/or keymap:
make planck/rev5:xyverz
qmk compile -kb <keyboard> -km <keymap>
While this compiles you will have a lot of output going to the screen informing you of what files are being compiled. It should end with output that looks similar to this:
```
Linking: .build/planck_rev5_xyverz.elf [OK]
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
Checking file size of planck_rev5_xyverz.hex [OK]
* File size is fine - 18392/28672
Linking: .build/planck_rev5_default.elf [OK]
Creating load file for flashing: .build/planck_rev5_default.hex [OK]
Copying planck_rev5_default.hex to qmk_firmware folder [OK]
Checking file size of planck_rev5_default.hex [OK]
* The firmware size is fine - 27312/28672 (95%, 1360 bytes free)
```
## Flash Your Firmware

View File

@@ -1,105 +1,13 @@
# QMK Configurator
The [QMK Configurator](https://config.qmk.fm) is an online graphical user interface that generates QMK Firmware hex files.
[![QMK Configurator Screenshot](https://i.imgur.com/anw9cOL.png)](https://config.qmk.fm/)
?> **Please follow these steps in order.**
The [QMK Configurator](https://config.qmk.fm) is an online graphical user interface that generates QMK Firmware hex files.
Watch the [Video Tutorial](https://youtu.be/tx54jkRC9ZY)
Watch the [Video Tutorial](https://www.youtube.com/watch?v=-imgglzDMdY). Many people find that is enough information to start programming their own keyboard.
The QMK Configurator works best with Chrome/Firefox.
The QMK Configurator works best with Chrome or Firefox.
!> **Note: Files from other tools such as Keyboard Layout Editor (KLE), or kbfirmware will not be compatible with QMK Configurator. Do not load them, do not import them. QMK Configurator is a DIFFERENT tool.**
!> **Files from other tools such as KLE, or kbfirmware will not be compatible with QMK Configurator. Do not load them, do not import them. QMK Configurator is a DIFFERENT tool. **
## Selecting your keyboard
Click the drop down box and select the keyboard you want to create a keymap for.
?> If your keyboard has several versions, make sure you select the correct one.**
I'll say that again because it's important
!> **MAKE SURE YOU SELECT THE RIGHT VERSION!**
If your keyboard has been advertised to be powered by QMK but is not in the list, chances are a developer hasn't gotten to it yet or we haven't had a chance to merge it in yet. File an issue at [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) requesting to support that particular keyboard, if there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) for it. There are also QMK powered keyboards that are in their manufacturer's own github accounts. Double check for that as well.
## Selecting your keyboard layout
Choose the layout that best represents the keymap you want to create. Some keyboards do not have enough layouts or correct layouts defined yet. They will be supported in the future.
## Keymap Name
Call this keymap what you want.
?> If you are running into issues when compiling, it may be worth changing this name, as it may already exist in the QMK Firmware repo.
## Creating Your Keymap
Keycode Entry is accomplished in 3 ways.
1. Drag and dropping
2. Clicking on an empty spot on the layout and clicking the keycode you desire
3. Clicking on an empty spot on the layout, pressing the physical key on your keyboard.
Hover your mouse over a key and a short blurb will tell you what that keycode does. For a more verbose description please see
[Basic Keycode Reference](https://docs.qmk.fm/#/keycodes_basic)
[Advanced Keycode Reference](https://docs.qmk.fm/#/feature_advanced_keycodes)
In the event that you can't find a layout that supports your keymap, for example three spots for spacebar, or two spots for backspace, or 2 spots for shift etc etc, Fill them ALL up.
### Example:
3 spots for spacebar: Fill them ALL with spacebar
2 spots for backspace: Fill them BOTH with backspace
2 spots for right shift: Fill them BOTH with right shift
1 spot for left shift and 1 spot for iso support: Fill them both with left shift
5 spots, but only 4 keys: Guess and check or ask someone who has done it before.
## Saving Your Keymap for Future Edits
When you're satisfied with your keymap or just want to work on it later, press the `Export Keymap` button. It will save your keymap as the name you chose above appended with .json.
You can then load this .json file in the future by pressing the `Import Keymap` button.
!> **CAUTION:** This is not the same type of .json file used for kbfirmware.com or any other tool. If you try to use this for those tools, or the .json from those tools with QMK Configurator, there is a chance your keyboard will **explode**.
## Generating your firmware file
Press the green `Compile` button.
When the compilation is done, you will be able to press the green `Download Firmware` button.
## Flashing Your Keyboard
Please refer to [Flashing Firmware](newbs_flashing.md)
## Troubleshooting
#### My .json file is not working
If the .json file was generated with QMK Configurator, congratulations you have stumbled upon a bug. File an issue at [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
If not....how did you miss my big bold message at the top saying not to use other .json files?
#### There are extra spaces in my layout? What do I do?
If you're referring to having three spots for space bar, the best course of action is to just fill them all with space bar. The same can be done for backspace and shifts
#### What is the keycode for.......
Please see
[Basic Keycode Reference](https://docs.qmk.fm/#/keycodes_basic)
[Advanced Keycode Reference](https://docs.qmk.fm/#/feature_advanced_keycodes)
#### It won't compile
Please double check the other layers of your keymap to make sure there are no random keys present.
## Problems and Bugs
We are always accepting customer requests and bug reports. Please file them at [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
Please refer to [QMK Configurator: Step by Step](configurator_step_by_step.md).

View File

@@ -6,7 +6,7 @@ Now that you've built a custom firmware file you'll want to flash your keyboard.
The simplest way to flash your keyboard will be with the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases).
However, the QMK Toolbox is only available for Windows and macOS currently. If you're using Linux (or just wish to flash the firmware from the command line), you'll have to use the [method outlined below](newbs_flashing.md#flash-your-keyboard-from-the-command-line).
However, the QMK Toolbox is only available for Windows and macOS currently. If you're using Linux (or just wish to flash the firmware from the command line), proceed down to [Flash Your Keyboard From The Command Line](#flash-your-keyboard-from-the-command-line).
### Load The File Into QMK Toolbox
@@ -86,13 +86,13 @@ Click the `Flash` button in QMK Toolbox. You will see output similar to the foll
## Flash your Keyboard from the Command Line
This has been made pretty simple compared to what it used to be. When you are ready to compile and flash your firmware, open up your terminal window and run the build command:
This has been made pretty simple compared to what it used to be. When you are ready to compile and flash your firmware, open up your terminal window and run the flash command:
make <my_keyboard>:<my_keymap>:flash
qmk flash
For example, if your keymap is named "xyverz" and you're building a keymap for a rev5 planck, you'll use this command:
If you have not configured your keyboard/keymap name, or you have multiple keyboards, you can specify the keyboard and keymap:
make planck/rev5:xyverz:flash
qmk flash -kb <my_keyboard> -km <my_keymap>
This will check the keyboard's configuration, and then attempt to flash it based on the specified bootloader. This means that you don't need to know which bootloader that your keyboard uses. Just run the command, and let the command do the heavy lifting.
@@ -100,279 +100,10 @@ However, this does rely on the bootloader being set by the keyboard. If this in
WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.
In this case, you'll have to fall back on specifying the bootloader.
There are five main bootloaders that are used. Pro Micro and clones use Caterina, Teensys use HalfKay, OLKB's AVR boards use QMK-DFU, other ATmega32U4 boards use DFU, and most ARM boards use ARM DFU.
You can find more information about the bootloaders in the [Flashing Instructions and Bootloader Information](flashing.md) page.
If you know what bootloader that you're using, then when compiling the firmware, you can actually add some extra text to the `make` command to automate the flashing process.
### DFU
For the DFU bootloader, when you're ready to compile and flash your firmware, open up your terminal window and run the build command:
make <my_keyboard>:<my_keymap>:dfu
For example, if your keymap is named "xyverz" and you're building a keymap for a rev5 planck, you'll use this command:
make planck/rev5:xyverz:dfu
Once it finishes compiling, it should output the following:
```
Linking: .build/planck_rev5_xyverz.elf [OK]
Creating load file for flashing: .build/planck_rev5_xyverz.hex [OK]
Copying planck_rev5_xyverz.hex to qmk_firmware folder [OK]
Checking file size of planck_rev5_xyverz.hex
* File size is fine - 18574/28672
```
After it gets to this point, the build script will look for the DFU bootloader every 5 seconds. It will repeat the following until the device is found or you cancel it.
dfu-programmer: no device present.
Error: Bootloader not found. Trying again in 5s.
Once it does this, you'll want to reset the controller. It should then show output similar to this:
```
*** Attempting to flash, please don't remove device
>>> dfu-programmer atmega32u4 erase --force
Erasing flash... Success
Checking memory from 0x0 to 0x6FFF... Empty.
>>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
Checking memory from 0x0 to 0x55FF... Empty.
0% 100% Programming 0x5600 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
0% 100% Reading 0x7000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
Validating... Success
0x5600 bytes written into 0x7000 bytes memory (76.79%).
>>> dfu-programmer atmega32u4 reset
```
?> If you have any issues with this - such as `dfu-programmer: no device present` - please see the [Frequently Asked Build Questions](faq_build.md).
#### DFU commands
There are a number of DFU commands that you can use to flash firmware to a DFU device:
* `:dfu` - This is the normal option and waits until a DFU device is available, and then flashes the firmware. This will check every 5 seconds, to see if a DFU device has appeared.
* `:dfu-ee` - This flashes an `eep` file instead of the normal hex. This is uncommon.
* `:dfu-split-left` - This flashes the normal firmware, just like the default option (`:dfu`). However, this also flashes the "Left Side" EEPROM file for split keyboards. _This is ideal for Elite C based split keyboards._
* `:dfu-split-right` - This flashes the normal firmware, just like the default option (`:dfu`). However, this also flashes the "Right Side" EEPROM file for split keyboards. _This is ideal for Elite C based split keyboards._
### Caterina
For Arduino boards and their clones (such as the SparkFun ProMicro), when you're ready to compile and flash your firmware, open up your terminal window and run the build command:
make <my_keyboard>:<my_keymap>:avrdude
For example, if your keymap is named "xyverz" and you're building a keymap for a rev2 Lets Split, you'll use this command:
make lets_split/rev2:xyverz:avrdude
Once the firmware finishes compiling, it will output something like this:
```
Linking: .build/lets_split_rev2_xyverz.elf [OK]
Creating load file for flashing: .build/lets_split_rev2_xyverz.hex [OK]
Checking file size of lets_split_rev2_xyverz.hex [OK]
* File size is fine - 27938/28672
Detecting USB port, reset your controller now..............
```
At this point, reset the board and then the script will detect the bootloader and then flash the board. The output should look something like this:
```
Detected controller on USB port at /dev/ttyS15
Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.
Programmer supports the following devices:
Device code: 0x44
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: reading input file "./.build/lets_split_rev2_xyverz.hex"
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
avrdude.exe: writing flash (27938 bytes):
Writing | ################################################## | 100% 2.40s
avrdude.exe: 27938 bytes of flash written
avrdude.exe: verifying flash memory against ./.build/lets_split_rev2_xyverz.hex:
avrdude.exe: load data flash data from input file ./.build/lets_split_rev2_xyverz.hex:
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex auto detected as Intel Hex
avrdude.exe: input file ./.build/lets_split_rev2_xyverz.hex contains 27938 bytes
avrdude.exe: reading on-chip flash data:
Reading | ################################################## | 100% 0.43s
avrdude.exe: verifying ...
avrdude.exe: 27938 bytes of flash verified
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
avrdude.exe done. Thank you.
```
If you have any issues with this, you may need to this:
sudo make <my_keyboard>:<my_keymap>:avrdude
#### Caterina commands
There are a number of DFU commands that you can use to flash firmware to a DFU device:
* `:avrdude` - This is the normal option which waits until a Caterina device is available (by detecting a new COM port), and then flashes the firmware.
* `:avrdude-loop` - This runs the same command as `:avrdude`, but after each device is flashed, it will attempt to flash again. This is useful for bulk flashing. _This requires you to manually escape the loop by hitting Control+C._
* `:avrdude-split-left` - This flashes the normal firmware, just like the default option (`:avrdude`). However, this also flashes the "Left Side" EEPROM file for split keyboards. _This is ideal for Pro Micro based split keyboards._
* `:avrdude-split-right` - This flashes the normal firmware, just like the default option (`:avrdude`). However, this also flashes the "Right Side" EEPROM file for split keyboards. _This is ideal for Pro Micro based split keyboards._
### HalfKay
For the PJRC devices (Teensy's), when you're ready to compile and flash your firmware, open up your terminal window and run the build command:
make <my_keyboard>:<my_keymap>:teensy
For example, if your keymap is named "xyverz" and you're building a keymap for an Ergodox or Ergodox EZ, you'll use this command:
make ergodox_ez:xyverz:teensy
Once the firmware finishes compiling, it will output something like this:
```
Linking: .build/ergodox_ez_xyverz.elf [OK]
Creating load file for flashing: .build/ergodox_ez_xyverz.hex [OK]
Checking file size of ergodox_ez_xyverz.hex [OK]
* File size is fine - 25584/32256
Teensy Loader, Command Line, Version 2.1
Read "./.build/ergodox_ez_xyverz.hex": 25584 bytes, 79.3% usage
Waiting for Teensy device...
(hint: press the reset button)
```
At this point, reset your board. Once you've done that, you'll see output like this:
```
Found HalfKay Bootloader
Read "./.build/ergodox_ez_xyverz.hex": 28532 bytes, 88.5% usage
Programming............................................................................................................................................................................
...................................................
Booting
```
### STM32 (ARM)
For a majority of ARM boards (including the Proton C, Planck Rev 6, and Preonic Rev 3), when you're ready to compile and flash your firmware, open up your terminal window and run the build command:
make <my_keyboard>:<my_keymap>:dfu-util
For example, if your keymap is named "xyverz" and you're building a keymap for the Planck Revision 6 keyboard, you'll use this command and then reboot the keyboard to the bootloader (before it finishes compiling):
make planck/rev6:xyverz:dfu-util
Once the firmware finishes compiling, it will output something like this:
```
Linking: .build/planck_rev6_xyverz.elf [OK]
Creating binary load file for flashing: .build/planck_rev6_xyverz.bin [OK]
Creating load file for flashing: .build/planck_rev6_xyverz.hex [OK]
Size after:
text data bss dec hex filename
0 41820 0 41820 a35c .build/planck_rev6_xyverz.hex
Copying planck_rev6_xyverz.bin to qmk_firmware folder [OK]
dfu-util 0.9
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Invalid DFU suffix signature
A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 0483:df11
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Downloading to address = 0x08000000, size = 41824
Download [=========================] 100% 41824 bytes
Download done.
File downloaded successfully
Transitioning to dfuMANIFEST state
```
#### STM32 Commands
There are a number of DFU commands that you can use to flash firmware to a STM32 device:
* `:dfu-util` - The default command for flashing to STM32 devices, and will wait until an STM32 bootloader is present. .
* `:dfu-util-split-left` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Left Side" EEPROM setting for split keyboards.
* `:dfu-util-split-right` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Right Side" EEPROM setting for split keyboards.
* `:st-link-cli` - This allows you to flash the firmware via ST-LINK's CLI utility, rather than dfu-util.
### BootloadHID
For Bootmapper Client(BMC)/bootloadHID/ATmega32A based boards, when you're ready to compile and flash your firmware, open up your terminal window and run the build command:
make <my_keyboard>:<my_keymap>:bootloaderHID
For example, if your keymap is named "xyverz" and you're building a keymap for a jj40, you'll use this command:
make jj40:xyverz:bootloaderHID
Once the firmware finishes compiling, it will output something like this:
```
Linking: .build/jj40_default.elf [OK]
Creating load file for flashing: .build/jj40_default.hex [OK]
Copying jj40_default.hex to qmk_firmware folder [OK]
Checking file size of jj40_default.hex [OK]
* The firmware size is fine - 21920/28672 (6752 bytes free)
```
After it gets to this point, the build script will look for the DFU bootloader every 5 seconds. It will repeat the following until the device is found or you cancel it.
```
Error opening HIDBoot device: The specified device was not found
Trying again in 5s.
```
Once it does this, you'll want to reset the controller. It should then show output similar to this:
```
Page size = 128 (0x80)
Device size = 32768 (0x8000); 30720 bytes remaining
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
0x05580 ... 0x05600
```
In this case, you'll have to fall back on specifying the bootloader. See the [Flashing Firmware](flashing.md) Guide for more details.
## Test It Out!
Congrats! Your custom firmware has been programmed to your keyboard!
Give it a try and make sure everything works the way you want it to. We've written [Testing and Debugging](newbs_testing_debugging.md) to round out this Newbie Guide, so head over there to learn about how to troubleshoot your custom functionality.
Give it a try and make sure everything works the way you want it to. We've written [Testing and Debugging](newbs_testing_debugging.md) to round out this guide, so head over there to learn about validating your firmware and how to troubleshoot your custom functionality.

View File

@@ -1,17 +1,10 @@
# Introduction
# Setting Up Your QMK Environment
Your computer keyboard has a processor inside of it, not unlike the one inside your computer. This processor runs software that is responsible for detecting button presses and sending reports about the state of the keyboard when buttons are pressed or released. QMK fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom keymap, you are creating the equivalent of an executable program for your keyboard.
Before you can build keymaps, you need to install some software and set up your build environment. This only has to be done once no matter how many keyboards you plan to compile firmware for.
QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful keymaps — you only have to follow a few simple syntax rules.
## 1. Download Software
# Getting Started
Before you can build keymaps, you need to install some software and set up your build environment. This only has to be done once no matter how many keyboards you plan to compile firmware for.
If you would prefer a more graphical user interface approach, please consider using the online [QMK Configurator](https://config.qmk.fm). Please refer to [Building Your First Firmware using the online GUI](newbs_building_firmware_configurator.md).
## Download Software
There are a few pieces of software you'll need to get started.
### Text Editor
@@ -30,7 +23,13 @@ QMK Toolbox is an optional graphical program for Windows and macOS that allows y
* For Windows: `qmk_toolbox.exe` (portable) or `qmk_toolbox_install.exe` (installer)
* For macOS: `QMK.Toolbox.app.zip` (portable) or `QMK.Toolbox.pkg` (installer)
## Set Up Your Environment
### A Unix-like Environment
Linux and macOS come with unix shells you can execute already. You will only need to setup your build environment.
On Windows you will need to install MSYS2 or WSL and use those environments. Instructions for setting up MSYS2 are provided below.
## 2. Prepare Your Build Environment :id=set-up-your-environment
We've tried to make QMK as easy to set up as possible. You only have to prepare your Linux or Unix environment, then let QMK install the rest.
@@ -40,52 +39,56 @@ We've tried to make QMK as easy to set up as possible. You only have to prepare
### Windows
You will need to install MSYS2 and Git.
You will need to install MSYS2, Git, and the QMK CLI.
* Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org).
* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal.
* Install Git by running this command: `pacman -S git`.
* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal. NOTE: This is **not** the same as the MSYS terminal that opens when installation is completed.
After opening a new MSYS2 MinGW 64-bit terminal, make sure `pacman` is up to date with:
pacman -Syu
You may be asked to close and reopen the window. Do this and keep running the above command until it says `there is nothing to do`. Then run the following:
pacman -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
python3 -m pip install qmk
### macOS
You will need to install Homebrew. Follow the instructions on the [Homebrew homepage](https://brew.sh).
After Homebrew is installed, continue with _Set Up QMK_. In that step you will run a script that will install other packages.
After Homebrew is installed run these commands:
brew tap qmk/qmk
brew install qmk
### Linux
You will need to install Git. It's very likely that you already have it, but if not, one of the following commands should install it:
You will need to install Git and Python. It's very likely that you already have both, but if not, one of the following commands should install them:
* Debian / Ubuntu / Devuan: `apt-get install git`
* Fedora / Red Hat / CentOS: `yum install git`
* Arch: `pacman -S git`
* Debian / Ubuntu / Devuan: `apt-get install git python3 && python3 -m pip install qmk`
* Fedora / Red Hat / CentOS: `yum install git python3 && python3 -m pip install qmk`
* Arch: `pacman -S qmk`
?> Docker is also an option on all platforms. [Click here for details.](getting_started_build_tools.md#docker)
## 3. Run QMK Setup :id=set-up-qmk
## Set Up QMK
After installing QMK you can set it up with this command:
Once you have set up your Linux/Unix environment, you are ready to download QMK. We will do this by using Git to "clone" the QMK repository. Open a Terminal or MSYS2 MinGW window and leave it open for the remainder of this guide. Inside that window run these two commands:
qmk setup
```shell
git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
cd qmk_firmware
```
In most situations you will want to answer Yes to all of the prompts.
?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create and clone your own fork instead. If you don't know what that means, you can safely ignore this message.
?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create your own fork and use `qmk setup <github_username>` to clone your personal fork. If you don't know what that means you can safely ignore this message.
QMK comes with a script to help you set up the rest of what you'll need. You should run it now by typing in this command:
util/qmk_install.sh
## Test Your Build Environment
## 4. Test Your Build Environment
Now that your QMK build environment is set up, you can build a firmware for your keyboard. Start by trying to build the keyboard's default keymap. You should be able to do that with a command in this format:
make <keyboard>:default
qmk compile -kb <keyboard> -km default
For example, to build a firmware for a Clueboard 66% you would use:
make clueboard/66/rev3:default
qmk compile -kb clueboard/66/rev3 -km default
When it is done you should have a lot of output that ends similar to this:
@@ -97,6 +100,22 @@ Checking file size of clueboard_66_rev3_default.hex
* The firmware size is fine - 26356/28672 (2316 bytes free)
```
## 5. Configure Your Build Environment (Optional)
You can configure your build environment to set the defaults and make working with QMK less tedious. Let's do that now!
Most people new to QMK only have 1 keyboard. You can set this keyboard as your default with the `qmk config` command. For example, to set your default keyboard to `clueboard/66/rev4`:
qmk config user.keyboard=clueboard/66/rev4
You can also set your default keymap name. Most people use their github username here, and we recommend that you do too.
qmk config user.keymap=<github_username>
After this you can leave those arguments off and compile your keyboard like this:
qmk compile
# Creating Your Keymap
You are now ready to create your own personal keymap! Move on to [Building Your First Firmware](newbs_building_firmware.md) for that.

View File

@@ -37,7 +37,7 @@ git push origin master
This switches you to your `master` branch, retrieves the refs from the QMK repo, downloads the current QMK `master` branch to your computer, and then uploads it to your fork.
## Making Changes
## Making Changes :id=making-changes
To make changes, create a new branch by entering:

View File

@@ -2,14 +2,16 @@
These resources are aimed at giving new members in the QMK community more understanding to the information provided in the Newbs docs.
Git resources:
**QMK resources**:
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)
* [Git Resources to Learn More About Github](getting_started_github.md)
* [Git Resources Aimed Specifically toward QMK](contributing.md)
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) A user-created blog covering the basics of how to use QMK Firmware, as seen from a new user's perspective.
Command Line resources:
**Command Line resources**:
* [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line)
**Git resources**:
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
* [Flight Rules For Git](https://github.com/k88hudson/git-flight-rules)
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)

View File

@@ -4,17 +4,9 @@ Once you've flashed your keyboard with a custom firmware you're ready to test it
## Testing
Testing your keyboard is usually pretty straightforward. Press every single key and make sure it sends the keys you expect. There are even programs that will help you make sure that no key is missed.
Testing your keyboard is usually pretty straightforward. Press every single key and make sure it sends the keys you expect. You can use [QMK Configurator](https://config.qmk.fm/#/test/)'s test mode to check your keyboard, even if it doesn't run QMK.
Note: These programs are not provided by or endorsed by QMK.
* [QMK Configurator](https://config.qmk.fm/#/test/) (Web Based)
* [Switch Hitter](https://web.archive.org/web/20190413233743/https://elitekeyboards.com/switchhitter.php) (Windows Only)
* [Keyboard Viewer](https://www.imore.com/how-use-keyboard-viewer-your-mac) (Mac Only)
* [Keyboard Tester](http://www.keyboardtester.com) (Web Based)
* [Keyboard Checker](http://keyboardchecker.com) (Web Based)
## Debugging
## Debugging :id=debugging
Your keyboard will output debug information if you have `CONSOLE_ENABLE = yes` in your `rules.mk`. By default the output is very limited, but you can turn on debug mode to increase the amount of debug output. Use the `DEBUG` keycode in your keymap, use the [Command](feature_command.md) feature to enable debug mode, or add the following code to your keymap.
@@ -28,6 +20,10 @@ void keyboard_post_init_user(void) {
}
```
## Debugging Tools
There are two different tools you can use to debug your keyboard.
### Debugging With QMK Toolbox
For compatible platforms, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) can be used to display debug messages from your keyboard.
@@ -36,8 +32,6 @@ For compatible platforms, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) can
Prefer a terminal based solution? [hid_listen](https://www.pjrc.com/teensy/hid_listen.html), provided by PJRC, can also be used to display debug messages. Prebuilt binaries for Windows,Linux,and MacOS are available.
<!-- FIXME: Describe the debugging messages here. -->
## Sending Your Own Debug Messages
Sometimes it's useful to print debug messages from within your [custom code](custom_quantum_functions.md). Doing so is pretty simple. Start by including `print.h` at the top of your file:

102
docs/one_shot_keys.md Normal file
View File

@@ -0,0 +1,102 @@
# One Shot Keys
One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys".
For example, if you define a key as `OSM(MOD_LSFT)`, you can type a capital A character by first pressing and releasing shift, and then pressing and releasing A. Your computer will see the shift key being held the moment shift is pressed, and it will see the shift key being released immediately after A is released.
One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key.
Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the `ONESHOT_TAP_TOGGLE` define.
You can control the behavior of one shot keys by defining these in `config.h`:
```c
#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped once again. */
#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */
```
* `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 key as part of a macro or tap dance routine.
For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`.
For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear_oneshot_mods()` to cancel it.
!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop.
## Callbacks
When you'd like to perform custom logic when pressing a one shot key, there are several callbacks you can choose to implement. You could indicate changes in one shot keys by flashing an LED or making a sound, for example.
There is a callback for `OSM(mod)`. It is called whenever the state of any one shot modifier key is changed: when it toggles on, but also when it is toggled off. You can use it like this:
```c
void oneshot_mods_changed_user(uint8_t mods) {
if (mods & MOD_MASK_SHIFT) {
println("Oneshot mods SHIFT");
}
if (mods & MOD_MASK_CTRL) {
println("Oneshot mods CTRL");
}
if (mods & MOD_MASK_ALT) {
println("Oneshot mods ALT");
}
if (mods & MOD_MASK_GUI) {
println("Oneshot mods GUI");
}
if (!mods) {
println("Oneshot mods off");
}
}
```
The `mods` argument contains the active mods after the change, so it reflects the current state.
When you use One Shot Tap Toggle (by adding `#define ONESHOT_TAP_TOGGLE 2` in your `config.h` file), you may lock a modifier key by pressing it the specified amount of times. There's a callback for that, too:
```c
void oneshot_locked_mods_changed_user(uint8_t mods) {
if (mods & MOD_MASK_SHIFT) {
println("Oneshot locked mods SHIFT");
}
if (mods & MOD_MASK_CTRL) {
println("Oneshot locked mods CTRL");
}
if (mods & MOD_MASK_ALT) {
println("Oneshot locked mods ALT");
}
if (mods & MOD_MASK_GUI) {
println("Oneshot locked mods GUI");
}
if (!mods) {
println("Oneshot locked mods off");
}
}
```
Last, there is also a callback for the `OSL(layer)` one shot key:
```c
void oneshot_layer_changed_user(uint8_t layer) {
if (layer == 1) {
println("Oneshot layer 1 on");
}
if (!layer) {
println("Oneshot layer off");
}
}
```
If any one shot layer is switched off, `layer` will be zero. When you're looking to do something on any layer change instead of one shot layer changes, `layer_state_set_user` is a better callback to use.
If you are making your own keyboard, there are also `_kb` equivalent functions:
```c
void oneshot_locked_mods_changed_kb(uint8_t mods);
void oneshot_mods_changed_kb(uint8_t mods);
void oneshot_layer_changed_kb(uint8_t layer);
```
As with any callback, be sure to call the `_user` variant to allow for further customizability.

View File

@@ -17,7 +17,7 @@ Note that this set-up has been tested on Ubuntu 16.04 only for the moment.
# Prerequisites
## Build Environment
Before starting, you must have followed the [Getting Started](README.md#getting-started) section corresponding to your system. In particular, you must have been able to build the firmware with [the `make` command](../#the-make-command).
Before starting, you must have followed the [Getting Started](newbs_getting_started.md) section of the Tutorial. In particular, you must have been able to build the firmware with [the `qmk compile` command](newbs_building_firmware.md#build-your-firmware).
## Java
Eclipse is a Java application, so you will need to install Java 8 or more recent to be able to run it. You may choose between the JRE or the JDK, the latter being useful if you intend to do Java development.
@@ -85,4 +85,4 @@ We will now configure a make target that cleans the project and builds the keyma
8. Double-click the build target you created to trigger a build.
9. Select the <kbd>Console</kbd> view at the bottom to view the running build.
[1]: https://en.wikipedia.org/wiki/Eclipse_(software)
[1]: https://en.wikipedia.org/wiki/Eclipse_(software)

View File

@@ -1,82 +0,0 @@
Setting up your ARM based PCB is a little more involved than an Atmel MCU, but is easy enough. Start by running `util/new_keyboard.sh`:
```
$ ./util/new_keyboard.sh
Generating a new QMK keyboard directory
Keyboard Name: mycoolkb
Keyboard Type [avr]:
Your Name [John Smith]:
Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %KEYBOARD% with mycoolkb... done
Replacing %YOUR_NAME% with John Smith... done
Created a new keyboard called mycoolkb.
To start working on things, cd into keyboards/mycoolkb,
or open the directory in your favourite text editor.
```
# END OF NEW ARM DOC, OLD ATMEL DOC FOLLOWS
## `/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.
To configure a keyboard where each switch is connected to a separate pin and ground instead of sharing row and column pins, use `DIRECT_PINS`. The mapping defines the pins of each switch in rows and columns, from left to right. Must conform to the sizes within `MATRIX_ROWS` and `MATRIX_COLS`, use `NO_PIN` to fill in blank spaces. Overrides the behaviour of `DIODE_DIRECTION`, `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`.
`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to.
`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 31, and they are computed automatically from this number.
## `/keyboards/<keyboard>/Makefile`
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 documentation of these features, see the [Makefile options](#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. This file will be rendered into a webpage at qmk.fm/keyboards/<keyboard>/.
## `/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-for-keyboards-and-keymaps)
## `/keyboards/<keyboard>/<keyboard>.h`
Here is where you can (optionally) define your `LAYOUT` function to remap your matrix into a more readable format. With ortholinear boards, this isn't always necessary, but it can help to accommodate 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 LAYOUT( \
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

@@ -77,7 +77,7 @@
* [Macros](pt-br/feature_macros.md)
* [Mouse Keys](pt-br/feature_mouse_keys.md)
* [OLED Driver](pt-br/feature_oled_driver.md)
* [One Shot Keys](pt-br/feature_advanced_keycodes.md#one-shot-keys)
* [One Shot Keys](pt-br/one_shot_keys.md)
* [Pointing Device](pt-br/feature_pointing_device.md)
* [PS/2 Mouse](pt-br/feature_ps2_mouse.md)
* [RGB Lighting](pt-br/feature_rgblight.md)
@@ -108,7 +108,7 @@
* Other Topics
* [Using Eclipse with QMK](pt-br/other_eclipse.md)
* [Using VSCode with QMK](pt-br/other_vscode.md)
* [Support](pt-br/support.md)
* [Support](pt-br/getting_started_getting_help.md)
* [How to add translations](pt-br/translating.md)
* QMK Internals (In Progress)

29
docs/qmk_custom_dark.css Normal file
View File

@@ -0,0 +1,29 @@
.sidebar li.active {
background-color: #555;
}
.markdown-section p.tip,
.markdown-section tr:nth-child(2n) {
background-color:#444;
}
.markdown-section tr {
border-top: 1px solid #555;
}
.markdown-section td, .markdown-section th {
border: 1px solid #555;
}
.markdown-section p.tip code {
background-color: #555;
color: #fff;
}
.page_toc code {
background-color: #555;
}
.markdown-section hr, .search {
border-bottom: 1px solid #777 !important;
}

30
docs/qmk_custom_light.css Normal file
View File

@@ -0,0 +1,30 @@
.sidebar-toggle {
position: absolute;
top: 0;
bottom: auto;
left: 0;
}
.search {
margin-top: 40px;
}
.markdown-section h2 {
padding-top: 0.25rem;
}
.markdown-section h3 {
margin-top: 0.25rem;
}
.sidebar, .sidebar-nav {
line-height: 1.5em !important;
}
.markdown-section ul ul {
margin: 0;
}
.markdown-section pre {
padding: 0;
}

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