The subcommand functions' name follows the Python convention of using
snake case, but looks odd on the command line.
Fix it by converting underscores to dashes, eg.: list_keyboards ->
list-keyboards.
* initial commit
begin development of Grand Theft Macro Pad (2key2crawl clone)
* Minor Changes
Changes to readme.md
Changes to config.h matrix pins
Changes to gtm.h layout
Changes to rules.mk
* initial commit
begin development of Grand Theft Macro Pad (2key2crawl clone)
* Minor Changes
Changes to readme.md
Changes to config.h matrix pins
Changes to gtm.h layout
Changes to rules.mk
* Update keyboards/sck/gtm/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/gtm/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Changes to gtm.h
Changes to layout to be correct for matrix_cols and matrix_col_pins
* Minor Changes
Removed rotary encoder index in keymaps per suggestion
* Update ergodox infinity nordic_ergo keymap
- Add missing important keys to base layer.
- Move arrow keys around as the original position was not optimal.
- Fix some code styling issues.
* Fix indentation to 4 spaces
* More code style fixes
- Formated the methods in the nordic ergo keymap.
* Fix QMK code style issues
- Change layer defines to enums.
- Split enums to multi-line.
- Remove non required switch case.
* Fix held key getting stuck when NKRO is toggled
* Updated file to latest qmk version and added fix to cases MAGIC_UNHOST_NKRO & MAGIC_HOST_NKRO as well.
* Revert merged quantum.c
* Add Planck keymap and custom keycodes to userspace
* Add Preonic keymap and extract common ortho layers and keycodes
* Add Leaf60 WKL keymap
* Add M60-A keymap
* Add Levinson keymap
* Fix links in personal readmes
* Use flash target
* Remove duplicate definition
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove superfluous line endings
* Planck and preonic encoder should have the same behavior
* Use higher level API
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Use layouts to reduce planck/levinson duplication
* Update flash instructions for levinson
While this was historically a valid possibility, nowadays, it reads
kinda weird, and the [Oxford Dictionaries Online suggests to avoid it](https://english.stackexchange.com/a/56010).
Thus, I removed it everywhere I found it.
* Setup keymaps and userspace for Rishka
* Creates a keymap for Ergodox Ez, bdn9 and Dactyl Manuform 5x6
* Update bdn9 config with suggested change
* Add pragma to other header files
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Updates from review from fauxpark
* Updates from review
Swap to keyboard_post_init, layer_state_t and use layer state for encoder
* Updates from review
Swap to keyboard_post_init, layer_state_t and use layer state for encoder
* Add missing change from review
* Add a short explanation to the troubleshooting section
While translating I noticed that the troubleshooting section could use a
little bit more explanation. @Yanfali was so kind to chime in on this on
discord and explained that this was ment for people who accidently
forget to put their board in bootloader mode, so I added this as a
possible common mistake.
Also fixed the spelling of Msys2 to MSYS2 and Halfkay to HalfKay as
these are the official spellings they use themselves.
* Update driver_installation_zadig.md
* Update driver_installation_zadig.md
English is hard.
* Update docs/driver_installation_zadig.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update docs/driver_installation_zadig.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Keyboard Naked48 Update
Support for SPLIT_KEYBOARD
Readme updates
Keymap updates
Support for RGB matrix (salicylic keymap)
* Keymap Update
Change KC_NO to KC_TRANSPARENT.
Update the old part.
* Enable PERMISSIVE_HOLD and TAPPING_FORCE_HOLD
* Fix indentation in userspace
* Shuffle around more Lily58 symbol keys
* Reformat KBD67 keymap and KLE images
* Fix Lily58 lower layer image
* Reformat Quefrency keymap and KLE images
* Fix KBD67 KLE images... again
* Add KLE links for Quefrency
* Reformat 60% layouts and KLE images
* Move Super key back to right half of Lily58
* Move Lily58 ins/del out of the way of numbers
* Fix bottom row of Lily58 KLE image
* Initialize ergodash rev 1 keymap
./util/new_keymap.sh ergodash/rev1 yet-another-developer
* Add user space configurations referenced from drashna
* Start community layout for ergodash in ortho_5x14
* Remove unused layers
* Add userspace layers
* Add Userspace gitignore
Hide Secrets
* Remove userspace unused drashna features
* Scrap default keymap and follow drashna's template
* Add code referenced from kuchosauronad0
* Make sure that the author is named Developer
* Replace middle keys del and bksp with curly brace
* Reduce ONESHOT_TIMEOUT from 3sec to 2sec
* Remove adjust key AG_SWAP
* Disable UNICODEMAP_ENABLE, remove code causing build fail
* Increase TAPPING_TERM to 240
Reason: Because Space is also LOWER, space sometimes not registering.
PS: I dont want to #define RETRO_TAPPING yet
* Update KC_MAKE to use :flash
* Remove TAP_ONCE, use tap_code
Signed-off-by: Developer <anotherdeveloper@icloud.com>
* Remove redundant code implementation of keyboard_post_init_user
https://github.com/qmk/qmk_firmware/pull/7046
users/yet-another-developer/leader.c
```
static bool has_ran_yet;
if (!has_ran_yet) {
has_ran_yet = true;
startup_user();
```
Comment for lines +11 – +14
@drashna: Not needed anymore. You can use keyboard_post_init_user now.
Signed-off-by: Developer <anotherdeveloper@icloud.com>
* rebaselined the whole fork and added cool matrix animations
* Updated dfu bootloader rules, oleds working on test map
* Moving test branch into main
moving my _test branch files into the main since the repo is now in the dev branch, don't see any reason to keep separate folders.
* Update keymap.c
Adding DOT to number layer
* added LED sleeping
* working on getting matrix rgb to sleep upon usb suspend
uploading to github for qmk staff help
* Added master sleep on usb suspend
Unfortunately the sleep function does not work on the slave side so will probably revert this change later
* bringing hhkb config up to current with other tominabox1 configs
* Update config.h
since master side is the only one that sleeps, going to disable this for now.
* testing oled stuff
* Update rules.mk
* tinkering with oled still
* Finally fixed custom image with corne doug
* Adding keymap to dimple instead of screwing up the upstream references.
* Changed oled image to peepo ggers
* working on oled sleep
* Update keymap.c
* fixes oled wake/sleep issues
* Adding 🅱️ and BEPIS macros
* Update .gitignore
* Cleaning up and improving documentation
* Update keymap.c
* Adding my minivan keymap
* Fixed error on keymap
* fixed OLEDs not turning on and moved tapping term to the keymap file
* Changed tapping term from 200 to 250
* Revised Fkey layers, arrows, question mark locations
* Update keymap.c
* tweaked tapping term and types on CRKBD, revised layout on HHKB
* Update keymap.c
* general code cleanup, keymap displays
* Set up userspace for common keymap elements
* tapping term stuff for shift
* testing
* Fixed new tapdance for accessing number and fkey layers
* Update tominabox1.h
* stuff
* fixing function calls for userspace
* cleaning up crkbd config and moving stuff to userspace
* finally fixed oled lightup issues
* cleaning up a few maps and rules
* Removing permissive hold and returning spacefn to all boards.
* Settting up wrapper keymaps for Dimple, Minivan, and Corne
Wrappers
* small tweaks
* Update wrappers.h
* finishing wrappers on Minivan and Dimple
* Revised tapping term definition
Providing additional tapping term config for CRKBD only.
* Code cleanup and documentation
* Update readme.md
* Update readme.md
* Wrapers and continued code cleanup and documentation
* moved oled py scripts to user folder
* completed wrapper implementation of CRKBD
* added matrix startup mode - not working yet pending upstream changes
* removed unused code in tominabox1.c
* Fixing custom keycodes and tap dance indices
fixed custom keycodes and tap dance indices
Adding beginning of dimple RGB matrix definition
changed oled on corne to scrolling matrix thing
Added copy pasta
* Secondary layer tweaks
Swapping hands of numbers and symbols as well as tweaking tapping terms accordingly
* Update tominabox1.c
Continued refinement of tapping term to support better right hand symbol access.
* Fixes from pr 7014
Removed gitignore data from qmk master
Reverted changes to Drashna's crkbd keymap
Accepted changes to crkbd keymap
Added ignore to hhkb keymap - I think I need this because Teensy. Will revisit another time
* Removing hhkb keymap for rework
* Adding back hhkb keymap
Re-adding hhkb folder with ignores
* Reverting changes to Dimple default
totally did not intend to modify these
* Update keymap.c
Reverting changes to Drashna's corne map
* Accepting recommended changes
* Reduced tap hold caps delay
moved bootmagic enable to general usage
Revised tapping terms
Removed unused keycode defs
* bootmagic
* Update rules.mk
* Fixed permissions (support 7014) and bootmagic addition
Fixed permissions on Drashna's keymap and Dimple default keymap files.
Adding bootmagic to my crkbd config.
* Fixing permissions
* First draft of my layout
* Improved layout and cleanup of files
* Update keymap and add rules
* Add keymap.h with permissive_hold setting
* Rename keymap.h to correct name config.h
* Add next/prev and special lock key to Fn layer
* Use correct modifier in MY_LOCK command
* Removed unnecessary filler defines
* Add build instructions to README
* Move RGB controls to more logical up/down key positions, move next/prev controls, remove del from Fn layer
* Fix wrong placeholders and fix up formatting
* Remove unused code
* Clarify comments on custom defines
* Update keyboards/kbdfans/kbd6x/keymaps/mekberg/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Version 1 of keymappings
* Adding updated keymappings
* Adding hash/pound symbol to layer
* Removing broken macros
* Adding to readme. Amending value of pound sign
* Changing language in readme
* Addressing PR comments. Removing unneeded code, corrected syntax
* Removing commented out code and fixing white space issues
* Small clean up to readme
* Add a via compatible keymap
* Disable VIA on default for configurator
- use the via keymap if you want via support
* Move wilba dep to keymap avoid breaking community
- moves via specific includes into the _via keymap
- fixes configurator builds
* Avoid NO_USB_STARTUP_CHECK - Disable USB as checks seem to enable it somehow
* Update quantum/split_common/split_util.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Also remove NO_USB_STARTUP_CHECK from vitamins_included/rev1
* Move tmk_core/common/backlight to quantum/backlight
* Add guards to backlight inclusion
* Add guards to backlight inclusion
* Update backlight guards on clueboard/60
* Use full paths to avoid vpath issues
* Change RGBLight pin for Planck Light
Move it to A0, so that the SPI? pins are available for BT hackery
* Add QMK DFU bootloader info
* Add Solenoid
* Disable annoying white LED on bottom
* Enable Solenoid on Corne
* Remove bounds for animations
* Increase debounce for Ergodox EZ to reduce repeat key issues
* Set swap hands key to be a hold-tap key
This way, it's not ANNOYING and doesn't swap the hands inteniontally
* Move MT Alt in Corne keymap
* Re-Add fine tuned control of secrets
* Squash mods to single row
* Add LRA settings to haptic feedback settings for Rev6
* Fix issue with non-Planck EZ keymaps
* Add 40 Percent Nano with Analog Joystick
* Add Collide39 keymap
* Fix OLED printing to be more flavorful
* Fix up Iris GamePad and come cleanup
* Expand OLED char map further
* Add modded characters to keylogger
* Here be dragons
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Fix up rules for community layouts
* Some more OLED tweaks
* Add mod mask check function
* Change QMK DFU Audio pin to be correct
* Use manual STM config instead of CTPC for Collide 39
* Fix off-by-one error in Lily58 function keys
* Swap number and symbol layers
* Move grave/tilde to the left of brackets/braces
* Add KLE links
* Move function keys to Raise layer
* Move symbols nearer to home row
* Add readme for Lily58 layout
* add temporary test shell-spript
* Use LINK_TIME_OPTIMIZATION_ENABLE instead of Link_Time_Optimization
No change in build result.
* Helix config.h use '#pragma once'
No change in build result.
* Helix helix.h,rev?/rev?.h,pico/pico.h use '#pragma once'
No change in build result.
* Use drivers/avr/pro_micro.h instead of keyboards/helix/pro_micro.h
No change in build result.
* remove keyboards/helix/{rev2|pico}/serial_config.h
No change in build result.
* 'HELIX_ROWS' macro is now referenced only in rev1/config.h and rev2/config.h.
No change in build result.
* The contents of helix/rules.mk were distributed to subdirectories.
This is a preparation to create a new subdirectory for helix code using split_common.
No change in build result.
remove 'USE_I2C = yes', 'SUBPROJECT_rev1 = no' from keyboards/helix/rules.mk.
follow code move from keyboards/helix/rules.mk to keyboards/helix/{rev1,rev2,pico}/rules.mk.
----
SRC += i2c.c
SRC += serial.c
SRC += ssd1306.c
CUSTOM_MATRIX = yes
---
* helix/{i2c.[ch], serial.[ch], ssd1306.[ch]} move into helix/local_drivers/
No change in build result.
* Simplified 'helix/pico/keymap/*/rules.mk' using KEYBOARD_LOCAL_FEATURES_MK.
No change in build result.
* add keyboards/helix/pico/local_features.mk
* add 'KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk' into keyboards/helix/pico/rules.mk
* remove HELIX_CUSTOMISE_MSG from keyboards/helix/pico/keymaps/*/rules.mk
* remove HELIX= process from keyboards/helix/pico/keymaps/*/rules.mk
* remove convert code(helix to standaerd) from keyboards/helix/pico/keymaps/*/rules.mk
* add 'include $(strip $(KEYBOARD_LOCAL_FEATURES_MK))' into keyboards/helix/pico/keymaps/*/rules.mk
* Simplified 'helix/rev2/keymap/*/rules.mk' using KEYBOARD_LOCAL_FEATURES_MK.
No change in build result.
* add keyboards/helix/rev2/local_features.mk
* add 'KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk' into keyboards/helix/rev2/rules.mk
* remove HELIX_CUSTOMISE_MSG from keyboards/helix/rev2/keymaps/*/rules.mk
* remove HELIX= process from keyboards/helix/rev2/keymaps/*/rules.mk
* remove convert code(helix to standaerd) from keyboards/helix/rev2/keymaps/*/rules.mk
* add 'include $(strip $(KEYBOARD_LOCAL_FEATURES_MK))' into keyboards/helix/rev2/keymaps/*/rules.mk
* Added helix keyboard build NEW method.
No change in build result.
## Helix build
$ make helix:default ## no oled, no backlight, no underglow
$ make helix/rev2/back:default ## no oled, with backlight, no underglow
$ make helix/rev2/under:default ## no oled, no backlight, with underglow
$ make helix/rev2/oled:default ## with oled, no backlight, not underglow
$ make helix/rev2/oled/back:default ## with oled, with backlight, no underglow
$ make helix/rev2/back/oled:default ## with oled, with backlight, no underglow
$ make helix/rev2/oled/under:default ## with oled, no backlight, with underglow
$ make helix/rev2/under/oled:default ## with oled, no backlight, with underglow
## Helix pico build
$ make helix/pico:default ## no oled, no backlight, no underglow
$ make helix/pico/back:default ## no oled, with backlight, no underglow
$ make helix/pico/under:default ## no oled, no backlight, with underglow
$ make helix/pico/oled:default ## with oled, no backlight, not underglow
* add temporary test shell-spript
* test end remove test script. Revert "add temporary test shell-spript"
This reverts commit 5dac20cd0f.
* test end remove test script. Revert "add temporary test shell-spript"
This reverts commit ec49f63b2d.
* Extended the 'HELIX=' option. add keyword 'verbose', 'no_ani'.
No change in build result.
* update keyboards/helix/{rev2,pico}/keymaps/default/readme.md
* rename KEYBOARD_TOP_DIR to HELIX_TOP_DIR in rules.mk
* update keyboards/helix/{rev2,pico}/keymaps/default/readme_jp.md
* rm keyboards/helix/pico/oled/rules.mk
* update helix's readmes. All the ':avrdude' was replaced with ':flash'.
* remove F_CPU, ARCH, F_USB, INTERRUPT_CONTROL_ENDPOINT from helix/rules.mk
No change in build result.
* Revert raise/backspace mod tap to just backspace
* Initialize usb_usb/narze
* Modify keys
* Add readme
* Support Right shift to )
* Add Dev layer
* Use Dev layer on holding z key
* Add Dev layer for Ergodox
* Update keyboards/converter/usb_usb/keymaps/narze/README.md
Fix the command & close the code block as suggested
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Reduce rules
* Add dz60 keymap
* Add my TADA68 layout
* Fix descriptions and formatting
* Formatting fixes
* Add readme file
* Formatting
* move caps lock to correct key, add F-keys to both layers
* Add readme for dz60
* First draft of custom Let's Split layout
* Some more keys
* Finalized keymap
* Added a bunch of custom shortcuts to make layout easier to read
* Add PERMISSIVE_HOLD option to modtap behavior
* Add lock and sleep shortcuts, formatting
* Minor fixes and adjustments
* Add PERMISSIVE_HOLD option, add sleep/lock shortcuts, minor fixes
* Add sleep/lock shortcuts, minor fixes
* fixups
* Major simplification of lets_split layout into more standard raise/lower/special layers
* Remove layer songs, add to readme
* Formatting
* Switch a few keys around for reachability
* Add windows/mac specific layers
* simplify layers
* Update README
* Fix legends
* Invert numpad and put Del in upper right corner
* Disable arrow keys on Raise, add build instructions
* Move dz60 keymap to its own branch
* Remove redundant configuration
* Change volume and sleep keycodes to standard
* Removing empty rules.mk
* Changing layer defines to enum
* Adding comment to explain reason for swapping KC_TRNS and KC_NO fillers
* Adding profile for Corne with tap dance Swedish support.
* Remove extern keymap_config_t keymap_config as no longer needed
* Changed to use tap_code over register_code
* Removed persistent_default_layer_set
* Moved macros to hvp user space ink tap dance code
* Removed not used functions
* Moved to an ifbased include statement
* Removed not needed characters
* initial commit
* OLEDに表示するロゴをuzuのものに差し替えた
* delete undefault keymaps
* delete info.json
* delete pro_micro.h
* remove USE_Link_Time_Optimization check
* Moved constant defined for each keymap.c to rev1.h
* update layer_state_reader.c
* Rename Uzu42 to uzu42
* remove bootloader.h include
* LAYOUT_kc to LAYOUT
* delete keymap level rules.mk
* update readme.md
* remove persistent_default_layer_set function.
* try refactor to use split_common and use OLED driver
* Revert "try refactor to use split_common and use OLED driver"
This reverts commit 5a9afceacb.
* Update keyboards/uzu42/rev1/config.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rev1/rev1.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rev1/rev1.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove lines already defined in QMK
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/uzu42/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* replaced comment block
* Update keyboards/uzu42/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Revert "Revert "try refactor to use split_common and use OLED driver""
This reverts commit a7849216f4.
* fix setting for RGBLED
* The default of OLED_DRIVER_ENABLE has been changed to no.
* Delete unuse block.
* Remove unnecessary keycode definitions.
* Remove unuse custom keycode.
* Remove not needed code.
* Remove not called code.
* Remove code overwritten by the core.
* Remove LAYOUT_kc macro.
* Moved the definition of the layer block to keymap.c.
* Removed unuse variable.
* Remove code overwritten by the core too.
* incorporate layer changes
* Moved src rule to keymap from rev1.
* Removed rgb_state_reader.c from lib folder and the code move to the keymap.c
* Removed layer_state_reader.c from lib folder and the code move to the keymap.c
* Removed logo_reader.c from lib folder and the code move to the keymap.c
* Removed keylogger.c from lib folder and the code move to the keymap.c
* Moved glcdfont_uzu42.c from lib folder to the default keymaps folder.
* Removed unused files.
* - Enabled Unicode Feature to fix the build
- Added TapDance Feature to improve the functionality of the Keyboard
- Added the ability to switch between the Unicodes Modes
- Added more Emojis thanks to the tap dance feature
* Fix Format
* new keyboard bm43a
* Thanks to noroads for generating this with his online tool
* add QMK Configurator support thanks to noroads
* turn on bootmagic lite
* update readme
* remove unneeded comments
* Removed ugfx binary because of antivirus
* Created laurent's keymap
* Made QWERTY Mac and QWERTY Windows
* Rev 1.0, added _PUNC, _NAV, _EXTRA
* REV 1.1, Dynamic macros start/stop now plays a sound, Lower acts like backspace on tap
* Formatting fixes
* Added Intellisense macro, fixed formatting
* Improved ergonomics/muscle mem on punctuation lay
* Added Raise Tap to Backspace
* Mirrored Ergodox, added One-Handed
* Added layers in README.md, added Caps lock, Scroll lock
* Moved Caps to better location
* Added ErgoDox link
* Edit Readme.md with more layer switching information
* Modified _PUNC for muscle memory
* Reverted .gitignore and .vscode settings.json to reflect master
* Improved formatting according to PR review
* QMK_KEYBOARD_H def for Intellisense fixed->rev3.h
* .gitignore diff fix
* Fixing settings.json diff
* Update settings.json
* Update keyboards/preonic/keymaps/laurentlaurent/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* - added new layout for dz60
- created personal keymap using new layout
* - changes based on pr feedback from @noroadsleft
* - further readme formatting
* Apply suggestions from code review
applied changes based on review feedback
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* - readme formatting
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Added KBD6X Vimwarrior HHKB TOFU Personal Layout
* Added Readme.md for Vimwarrior HHKB Tofu Keymap
* Added DZ60 Vimwarrior WKL Tofu Keymap
* Update Rename keymaps to devinceble_hhkb_tofu and devinceble_wkl_tofu
* Update rules.mk Added BOOTLOADER config.
* [Keymap] Added devinceble keymap for TADA68
* Fix projectkb/alice Right Spacebar Size to 2.75 not a bug though but confusing
* Update Right Alt for Layout Fix
* Use .template file extension for keyboard template files
* Filter out .template files completely before passing to clang-format
* Undo file extension stuff; just ignore quantum/template dir
* Translated breaking_changes.md in French
* Translated ChangeLog/20190830.md to French
* Update docs/fr-FR/breaking_changes.md
Co-Authored-By: Max Rumpf <max.rumpf1998@gmail.com>
* Fix comments from @zekth
Co-Authored-By: Vincent LE GOFF <g_n_s@hotmail.fr>
* initial commit
* thank you mr keebs for making this easy. Added 65_ansi macro made from mrkeebs kle2qmk tool.
* split backspace requires an additional row
* change k43 to k42
* add in split space bar support for LAYOUT_all
* add QMK Configurator support
* make default keymap more usable
* update readme
* Update keyboards/exent/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/exent/keymaps/default/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/exent/keymaps/default/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/exent/rules.mk
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Adds the files that will be translated
* Start translate cli_configuration.md in French
* Translated cli.md in French
* Translated getting_started_getting_help.md in French
* /getting_started_github.md
* Translated first part of contributing.md in French
* Finish translation of contributing.md
* Translated the getting_started_introduction.md in French
* Corrected issues from @zekth review
Co-Authored-By: Vincent LE GOFF <g_n_s@hotmail.fr>
* using similar keymaps (with vim in mind) for planck and crkbd
* changed to rgb matrix and lower max brightness to prevent unresponsiveness
* readme and default rgb mode
* disable all the not wanted effects and activate the framebuffer ones
* changed effects
* changed custom keycodes to defines
* fixed comment
* CLI command to serve docs locally
* Document it
* Default port
* Use `with` and subclass `SimpleHTTPRequestHandler` to set working dir
* Apply suggestions from code review
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Update docs/cli.md
* Translated _summary.md + newbs.md
* Translated news_best_practices.md in French
* Translated newbs_building_firmware_configurator.md in French
* Translated the file newbs_building_firmware.md in French
* Translated page newbs_flashing.md in French
* Translated the page newbs_getting_started.md in French
* Translated the page newbs_learn_more_resources.md in French
* Translated the page newbs_testing_debugging.md in French
* Change translation of split from 'séparé' to 'scindé'
* Adding the lang file for gitbook and some others tranme other translation
* Correcting typos after Gimly's review
* Some others sections on the summary
* Fix first comments from @zekth
* Fix some issues from @4sStylZ
* Fix other issues from @4sStylZ
* Fix weird phrase
* Replaced all uses of 'téléverser' by 'flash'
* Replaced all planches by board
* Fix other PR comments
* Fix comment
* [Docs] Add AVR and ARM examples to GPIO Commands
Add examples for reference for people not as well versed in microcontroller coding, such as myself.
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
The top-right key should be = and not the shifted pseudo-key +. This
matches the sample layout from the picture in the readme [0].
[0]: https://i.imgur.com/xVkODOu.jpg
sprintf always adds a NULL terminator at the end of the buffer it works on.
A few places made just enough space for the resulting string, but not the terminator.
So this just adds one to the buffer size to make room for it.
`list_keyboards` replicates the `make list-keyboards` by globbing for all paths
that include `rules.mk` and then removing the paths that include `keymaps`.
This basis of this cli command could be reused in the future as a util, but is
not done so here since this would be the only place that would use it currently
Resolves#6911
* [refactor] updating ninjonas layout blocks and standardized LOWER & ADJUST
* [feat] added new macro M_TERM to open MacOS terminal app
* [feat] introducing mod-tap functionality on keymap
* [fix] fixing oled turning on when it feels like it. thanks @drashna for helping
* [feat] updating OLED to rotate logo 180 degrees
* [feat] updating keymaps to reflect VSCode frequent habits
* [refactor] converting crkbd modifier keys to layer blocks
* [fix(#6903)] converting _delay_ms to wait_ms on launching terminal macro
* [keymap] dactyl_left
Special layout for the left side of the ergodox dactyl.
* [keymap] dactyl_left
Special layout for the left side of the ergodox dactyl.
* Updated readme.md
* Update keyboards/handwired/dactyl_left/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/handwired/dactyl_left/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Addressing changes for PR
removed layers.json and 15-24 from rules.mk
* Updating keymap for better a default
Hopefully this works as a starting point
* Created personal keymap for dz60 hhkb layout.
* Renamed directory joooosh to joooosh_hhkb... Removed redundant KC_TRNS alias #define... Updated to use KC_TRNS alias defined in QMK_KEYBOARD_H.
* Initial Lily58 keymap
* Still not sure if these thumb key placements are optimal or not. I
might want to move space (enter) one key to the left (right),
respectively.
* Also unsure how I feel about Esc on a mod tap key with Ctrl... might
move it back to its own key and relocate the = key.
* Missing bindings for Print Screen, Scroll Lock, Pause/Break.
* Make Lily58 layout support operation without numrow
* Move some Lily58 modifiers around
* Move nav keys to more consistent locations
* Rebinding shift on Raise is stupid
* Don't stomp Ctrl on the Lower layer
* Tweak bottom row a little bit
* add ISO-DE layout with 5x1u and split right shift
* cleaning up
* renamed readme.md and layout. added underglow
* change layout name in info.json
* rename readme.md
* renamed layout in comment. added rgb keys to visualisation
* change Layout name in dz60.h visualization
* initial commit
restart of osa development
* minor changes
Minor changes
mostly changing naming and comment out rgb modes
* initial commit
restart of osa development
* minor changes
Minor changes
mostly changing naming and comment out rgb modes
* more minor changes
comment out some functions
correct some spelling errors
change some of the descriptive text
* Minor Changes
Minor changers per PR requests
* Minor Changes
Minor changes per PR suggestions
* Major Changes
Per PR suggestion from noroadsleft:
- changed macro to LAYOUT_all in info.json, dualsplit/keymap.c and ocm/keymap.c, and osa.h
- added osa.h macros for other layouts per suggestion and used suggested naming
- changed naming of layout macros to correspond to macros and naming in default/keymap.c, dualsplit/keymap.c, ocm/keymap.c, splitbs/keymap.c, and splitrs/keymap.c
- removed duplicate layers from all keymaps and edited per suggestions
- compiled each keymap to check for and correct any potential errors. all compiled with no errors
* Minor Change
- fixed imgur image link in readme.md to be correct format
* Minor Changes
changes to macro layouts in osa.h
changes to dualsplit/keymap.c - added arrows to layer 1
* Changes
- Made changes to info.json to match osa.h
- changes to osa.c enabling indicator LEDs
- changed "dualsplit" directory name to "all" to match keymap naming in osa.h, info.json, and keymap.c
- minor changes to all/keymap.c
* Update keyboards/sck/osa/rules.mk
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/sck/osa/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Changes to info.json
- revert to info.json from version in b3b49c3 per requested changes
* production version of the PCB has the top two right most keys swapped around. There are only 6 protos in existence and one of them is mine so we can just do this.
* update readme by adding backticks
* initial commit
* fixup init_rows and read_rows routine
* fixup matrix based on Marcus's tracing info
* add a temporary keymap
* add notes
* use a standard tkl ansi keymap
* turn on that last column
* backslash and backspace row left to fix
* reorg from backslash to pgdn
* got the matrix done but the backspace location at K4N is still suspect
* add reset info into readme
* add qmk configurator support
* add community layout support
* remove uneeded keymap readme
* add a new column just for the reset switch
* change copyright dates
* add cautionary message to readme as we don't know about the lighting condition yet
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/duck/orion/v3/v3.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* change bootloader comments
* initial commit of skog_lite
* add layout macro from misterkeeb's tool
* add default keymap
* add pins used
* rgb support
* add tkl ansi community support
* update readmes
* add new layouts and configurator support
Features:
* Tap space for space, hold for cmd
* Tap caps lock for esc, hold for ctrl
* Dedicated key for entering default mode of yabai window manager
* Who needs arrow keys, anyways???
* Method for clearing all stuck-down mods
This fixes the following issue related to encoding on linux systems. Add
`universal_newlines=True` to subprocess.
<class 'TypeError'>
☒ a bytes-like object is required, not 'str'
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/milc.py", line 564, in __call__
return self.__call__()
File "/usr/local/lib/python3.7/site-packages/milc.py", line 569, in __call__
return self._entrypoint(self)
File "$HOME/qmk_firmware/lib/python/qmk/cli/doctor.py", line 56, in doctor
for line in mm_check.stdout.split('\n'):
TypeError: a bytes-like object is required, not 'str'
* remove IT_PIPE duplicate and add IT_GRAD
IT_PIPE was declared 2 times, ones as ° and once as |. I changed the first declaration and called it IT_GRAD. I even fixed the definition because the ° in Italian is obtained with LSFT(IT_AACC)
* rename IT_GRAD to IT_DEGR
* add missing plus_and_minus
* fix missing IT_ACUT definition
* change KC_LALT(KC_LSFT to LALT(LSFT
* Fix alignment
* remove leftover
* fix issue generated with chars while pushing
* fix typo
* fix LCBR and RCBR
* fix euro symbol
* fix RBRC
* change IT_LESS form KC_NUBS to KC_GRAVE
* add IT_TILDE and change IT_GRAV to IT_GRAVE
* add missing legends for accented vowels
* format for readability
* revert to commit befor I edit it
* initial commit
* edited to be easier to compare to _ansi.h
* remove keymap_italian_osx_iso.h and rename with edits keymap_italian_osx_ansi.h to keymap_italian_osx.h
I found out there were no difference at all
* fix missing #endif
* rename quantum/keymap_extras/keymap_italian_osx.h to quantum/keymap_extras/keymap_italian_ansi.h
Now this file is a clone of the keymap_italian.h that appears to be working only for ISO keyboards. It also contains a few improvements for IT_PIPE (defined two times) and IT_ACUT (missing definition). Additionally it redefines LCBR and RCBR to LSFT(IT_LBRC) and LSFT(IT_RBRC)
* rename file
* redefines IT_BKSL and IT_PIPE based on KC_BKSL
* add new osx_iso and osx_ansi version for italian.h and align BKSL to BSLS, fix double definition of PIPE
* Align bottom row in KBD6X keymap to match LAYOUT macro
* Remove TAP_HOLD_CAPS_DELAY override in userspace
* Change default USB polling rate to 1000 Hz
* Move media controls to nav cluster on Wasdat
* Add dz60:konstantin_b keymap
* Add personal keymap
* Additional readme note
* Fix typo's in readme
* Additional layer key info in readme
* Update keyboards/crkbd/keymaps/rpbaptist/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/crkbd/keymaps/rpbaptist/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/crkbd/keymaps/rpbaptist/keymap.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove redundant config
* Remove disabling of NO_ACTION_MACRO and NO_ACTION_FUNCTION
* Remove layer keycode macros
* Use layer_state_t instead of uint32_t
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* OLED_ROTATION_90 instead of 180
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Use get_highest_layer instead of biton32
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Revert "OLED_ROTATION_90 instead of 180"
This reverts commit f14a4353ab.
It messed up the logo on slave
* Use IS_LED_ON function to check LED status
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* first commit, skeleton code, not sure if working
* Owlet 60 working firmware, json not sure
* use json from kle to qmk converter
* deleted temporary text from owlet60.h
* owlet60 working oled and led firmware
* moved owlet60 to handwired
* updated readme.md
* Revert "owlet60 working oled and led firmware"
This reverts commit 27f9465aab.
* Revert "moved owlet60 to handwired"
This reverts commit 9b8e8344fc.
* revert changes, moved owlet60 to handwired, updated copyright blurb
* fixed readme.md
* removed duplicate items
* resolve merge artifact
* Update keyboards/handwired/owlet60/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* check out merge artifacts with qmk master
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/owlet60/matrix.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* removed redundant rule on oled_testing/rules.mk, refactored mux switching code on matrix.c
* setup local build config, created npm build script to speed things up
* removed some profiles and gutted readme
* began configuring default and lower layout
* lower: fixed right arrow and added music toggle
* began configuring default and lower layout
* changed startup song
* updated comment typos
* I did that thing where i basically refactored everything :)
* Converted 2U key to 1U's
* Reorganized and tidied up
* Reorganized and tidied up
* space now changes layers
* updated numbpad
* updated readme
* removed unwanted files
* addressed change requests
* support tkl_iso community layout
* fix comments from review
* fix review comments
* LAYOUT is an alias for LAYOUT_all
* add keymap default_iso
* revert changes to default keymap
* Initial stab at some fake dfu-util-split-left behaviour
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Clang format fixes
* Fake eeprom init for both left and right hand
* Port personal keymap to 60_tsangan_hhkb
- add 60_tsangan_hhkb layout to plain60
- Fix bug in split rs in plain60
- use community and user based layout for 60_tsangan_hhkb
- set up audio for plain60 only
* Add LAYOUT_60_ansi_split_bs_rshift
* Refactor: matrix
* New readme file
* Configurator support
* change info.json to debug linting
* use an enum to manage the layers
* readme cleanup
file header, docs links
* use #pragma once in keyboard header file
* use new-style OLKB layout macro naming scheme
* fix layout macro references in keymap.c
* correct Keyboard Maintainer
* start wraith firmware
* completed initial setup
* added amber keymap to wraith
* fixed LEDs, wrote readme files
* reverted bootloader type after troubleshooting
* decapitalised files and directory as per qmk standards
* Update Wraith keyboard folder
- Add timer keymap with documentation
- Remove boilerplate in rules.mk, ready for pull request
- Update info.json with ISO and ANSI layouts, ready for QMK Configurator
* Add Efreet keyboard
* Remove unnecessary keyboard folders
* Enable community layout support for Efreet
- Rename LAYOUT macro to LAYOUT_ortho_4x12
- Add layout macro named LAYOUT_planck_mit
- Remove unnecessary magic key command, as we are using the default
- Fix readme.md formatting for GitHub
* Fix community layout support for Efreet
- Fix 2u spacebar keycodes in LAYOUT_planck_mit to denote absence of switch
- Turn on Community Layouts in rules.mk
* Update default keymap.c to use community layout
* e6.5 actually already had a 65_ansi_blocker LAYOUT macro, so just had to enable in rules.
* Add the 65_ansi_blocker LAYOUT macro and enable in rules.mk
* rename LAYOUT macro in .h and in the keymap.c as it was only a default keymap. Also enable in rules.mk
* rename but also had to define the existing LAYOUT macro as the new one to prevent breakage of existing keymaps
* add 65_ansi_blocker support for vinta
* forgot to update the info.json on these
* add new default layout 65_ansi_blocker support to alt
* add 65_ansi_blocker support
* undo changes
* Began Work On STM32 Ergodox
Changes to be committed:
new file: keyboards/ergodox_stm32/config.h
new file: keyboards/ergodox_stm32/rules.mk
* test
* Now it compile. Not linking thou
* Screw this Linker. It links now!
* Blinkly Keyboard
* bootloader test code
* Working on matrix / i2c stuff
* Progress (LED Blink)
* Progress on MCP_23017 Status Flag
* [WIP]
* update
* Works! Remeber to change back the bootloader address when the new bootloadrer is ready.
* Time to go debug the i2c
* Finally, it now works with PCB Rev 1.0.2
* updated for rev.2 pcb
* minor compilation fix
* Why when debugger is enabled then everything works.
* Remeber to call init functions.
* Update arm i2c driver to support STM32F103 series device.
* fix include once header. Replaced with #pragma once.
* complication test
* add default LAYOUT_60_ansi
* add LAYOUT_60_hhkb support
* add tsangan_hhkb support
* add ISO support and rename LAYOUT to LAYOUT_all
* formatting
* add community layouts support
* remove unneeded code
* missed a LAYOUT rename
* add link time optimization to reduce firmware size for some people's keymaps
* new keymap for my chocolate tofu65 with dz65rgb
* consistent with a tada68 layout
* remove extra layer, add swap keycodes and mouse keycodes
* fix the tabs and spaces
* fix the left shift
* readme updates for 60_ansi and split variations
* add new community layout for mechmerlin for the new default layout 65_ansi_blocker
* change path now that kbd67 has been updated
* fix up spacing
* move kbd67mkiirgb into kbd67 directory as mkiirgb
* rename files
* rename LAYOUT to LAYOUT_65_ansi_blocker
* add support for default layout
* update readme for new build target
* update parent readme with the fourth variant
* rename LAYOUT to LAYOUT_65_blocker_ansi
* rename LAYOUT macro
* enable LAYOUT_65_blocker_ansi community layout support and remove uneeded lines of code
* rename LAYOUT to LAYOUT_65_blocker_ansi
* rename LAYOUT macro
* enable LAYOUT_65_blocker_ansi community layout support
* enable LAYOUT_65_blocker_ansi support
* fix rename mess up
* add QMK Configurator support with the new rename
* rename blocker_ansi to ansi_blocker as it rolls off the tongue easier
* Rework how bin/qmk handles subcommands
* qmk config wip
* Code to show all configs
* Fully working `qmk config` command
* Mark some CLI arguments so they don't pollute the config file
* Fleshed out config support, nicer subcommand support
* sync with installable cli
* pyformat
* Add a test for subcommand_modules
* Documentation for the `qmk config` command
* split config_token on space so qmk config is more predictable
* Rework how subcommands are imported
* Document `arg_only`
* Document deleting from CLI
* Document how multiple operations work
* Add cli config to the doc index
* Add tests for the cli commands
* Make running the tests more reliable
* Be more selective about building all default keymaps
* Update new-keymap to fit the new subcommand style
* Add documentation about writing CLI scripts
* Document new-keyboard
* Update docs/cli_configuration.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/cli_development.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Address yan's comments.
* Apply suggestions from code review
suggestions from @noahfrederick
Co-Authored-By: Noah Frederick <code@noahfrederick.com>
* Apply suggestions from code review
Co-Authored-By: Noah Frederick <code@noahfrederick.com>
* Remove pip3 from the test runner
* move canoe into percent directory
* update readme for new make path
* move skog into percent directory
* update readme for new path and new instructions
* update readme
* fix error in naming
* made tapdance dual_role general
* updated original dual_role functionality
* added toggling layer example
* Fix dual role and add alias
* Update docs about new layer tap dances
* Fix up based on feedback
* Add support for Void Linux systems to the qmk_install.sh script
* Fix typos + grammatical edits in comments
* Sort distributions by alphabetical order in linux_install.sh
* Revert previous commit and sort Void packages in alphabetical order
* Fix permissions on `util/linux_install.sh`
* Add reset instructions for boards that use Command to the Zadig driver installation guide
* -> → →
* Apply suggestions from code review
Replace shorthand keycode names with full names
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Added ottodokto keymaps for dz60 and tmo50.
* moved placement of keymaps to proper directory
* fixed accidental deletion of semicolon for tmo50 map
* fix to use short form codes
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* provide means to turn on RTP mode and set the amplitude
* new keycode HPT_CONT to turn RTP off/on
* introduce new keycodes HPT_CONI, and HPT_COND for Haptic Continuous Increase and Decrease
* support for continuous mode amplitude increase and decrease
* code cleanup
* update docs to reference new keycodes and functionality
* don't touch the keymaps
* add function prototypes
* add proper guards
* cleanup guards
* remove extra reserved
* move caps lock led to keyboard level so even QMK Configurator users have access to it
* set bootloader correctly to atmel-dfu
* clean up extra carriage return
* Updated encoder.c so that split encoders are indexed based on left hand encoders first.
This ensures when swapping master sides that code logic based on encoder index doesn't change.
PR Review fixes
* Removed extra define
* convert codebase to #pragma once
* fix file includes
- quantum.h is included at keyboard level, redundant at revision level
- keyboard-level path is accessible at revision level, remove relative pathing
* duplicate common layout macros from rev1 to rev2
Add the layout macros supported by both rev1 and rev2 to rev2.h directly, which exposes these layouts to QMK Configurator.
* enable community layout support (75_ansi, 75_iso)
* add LAYOUT_75_iso layout data
It needs its own tree because its keys are in a different order from LAYOUT_iso_1u even though the physical layout is the same.
* minimize rules.mk files (use QMK defaults)
* use atmel-dfu bootloader rule
* fix typo on rev1 info.json
* making a new board setup for ymdk bface clone
* removing extra keymaps that copied over
* documentation and edits for new ymdk_bface board
* cleaning up config and keymaps
* removed extra keymap and working on READMEs
* readme edits
* shorter aliexpress link in ymdk_bface readme
* added images to readmes and edited the keymaps
* more flashing directions
* Mac directions formatting
* editing and creating the all layout
* cleanign up ymdk_bface keymaps
* fixed typos in layout
* removed tabs
* cleaned up the LED and Backlight configuration.
* adding more to info.josn and cleaning up readme
* fixing JSON typos
* made a ymdk folder and moved the bface into it.
* fixing file names for the new folder structure
* Added Xerpocalypse's layout
+ Number row and symbols are switched compared to default TMO50 layout
+ Right-hand spacebar acts as backspace and a hold-layer for layer 2.
* Update keyboards/tmo50/keymaps/xerpocalypse/keymap.c
Removed unnecessary #define
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/tmo50/keymaps/xerpocalypse/keymap.c
Changed keymap to use KC_UNDS instead of custom-defined keycode
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* get rid of custom matrix that is no longer being used
* remove _kc LAYOUT
* remove ifdefs and replace with pragma once
* cleanup rules and use bootmagic lite
* get rid of led.c
* Update keyboards/alps64/alps64.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* remove unneeded configurations
* Fix Planck default keymap to play sounds on rev6
The dip_switch_update callback was overriding the default startup sound. This should prevent that from happening, and still allow it to play sounds, or stop them, when appropriate.
* Fix Preonic default keymap to play sounds on Rev 3
The dip_switch_update callback was overriding the default startup sound. This should prevent that from happening, and still allow it to play sounds, or stop them, when appropriate.
* Fix enables for Haptic Feedback
If you enabled bothe DRV2605 and SOLENOID, it would only enable one of these, not both.
This fixes the check so that you can enable both options.
* Fix check for haptic feature
It was sending a comma keypress, while I believe that the targeted
stenography software (at least on systems that generally use
US-International keyboard layout) expects a single-quote/apostrophe key.
* adding working 2key2crawl
Adding working 2key2crawl files
edited files in accordance with original PR comments
* Changes
Changes and updates
* Update readme.md
* Update config.h
removed IS_COMMAND block that was missed in previous commit
* Changes to vol/keymap.c
Removed unneccesary function
* adding a custom mf68 keymap
* added custom tada68 keymap
* readme edit on tada68 map
* added mac fast-forward and rewind keybindings to tada68 emdarcher keymap
* tada68 keymap documentation and edits
* cleanup and edits
* typo fix in emdarcher's tada68 keymap
* cleaning up emdarcher keymap for tada68
* cleaned up emdarcher keymap for mf68
* Created python version of new_keymap.sh: new_keymap.py
* Updated usage message
* Updated new_keymap.py to use python3.5+ syntax & be more similar to new_keyboard.sh
* Updated complete message
* Updated usage in argparser and removed incorrect usage_message
* Reverted the fstrings back to strings that use .format() & updated docstring convention
* Added helper to recursively cd .. until at qmk_firmware root directory
* Revert "Added helper to recursively cd .. until at qmk_firmware root directory"
This reverts commit 61a0ff3b25f91901287bec8d58eb51a1f126e2ad.
* Updated new_keymap.py to use printf-style format strings
* First draft lib/python/qmk/cli/new/keymap.py with milc
* Removed shebang & syspath appending lines
* Added optional args & resolved some cr comemnts
* Added a docstring and updated strings
* Added new 2x5 Keypad with 3 LEDs to indicate the selected layer. By Jonathan Cameron.
* Minor refactor from suggestions from qmk team
* Added
* Moved to 'handwired' directory
* Update readme.md
* Update readme.md
* Update readme.md
* Update keyboards/handwired/2x5keypad/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Switch to image offsite
* Moved image offsite
* Update keyboards/handwired/2x5keypad/keymaps/default/keymap.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update keyboards/handwired/2x5keypad/2x5keypad.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Moved functions into .c file per suggestions
* Cosmetic
* Fixed function called, per suggestions.
* Update keyboards/handwired/2x5keypad/2x5keypad.h
Ok
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Moved LED functions to the top level since they can be used it various flavors
* Declare those moved LED functions!
* Update keyboards/handwired/2x5keypad/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
The E6.5 is the new 65% keyboard made by Exclusive.
This changeset adds its PCB to QMK, including all the bottom row
variants and iso/ansi/split BS layouts.
* add dp60 keyboard
* fixup wording in readme
* fix layout name in default keymap. I was missing an r
* Add QMK Configurator support for the additional layouts
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/dp60/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* strip out the VIA enabling from default rules.mk
* add a VIA only keymap
* Add Rabbit68 Keyboard w/ default,kaiec keymaps.
* Requested changes by @fauxpark
* Change flash command, as suggested by @drashna
* Update keyboards/rabbit/rabbit68/readme.md
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Add link to Github repo
As I per suggestion changed the link above to an image, I added now the link to the project page to the Open Source text, where it actually makes the most sense.
* change LAYOUT_ANSI to LAYOUT_60_ansi
* change QMK Configurator layout to LAYOUT_60_ansi as well
* add 60_ansi support so I can make my userspace =)
* update readme
* Very strange. ISO keymap is still using 60_ansi LAYOUT macro. But then again....no ISO hottswap dz60 has been released
* UT47.2 keymap/updates for Planck style layout switching
* UT47.2 keymap for Planck-style layout switching / code clean up
* UT47.2 keymap for Planck-style layout switching: Qwerty, Workman, Colemak, Colemak Mod-DH, and Dvorak added / code clean up
* Change the layout info to match the keymap
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching
* Edit readme to contain relevant info for layout switching. Add QMK Configurator file.
* Update readme.md with make information
* Undo breaking change in config.h
* Code cleanup
* Code cleanup
* Code cleanup
* More code cleanup
* Turn off more unnecessary features by default
* Double TAP_CODE_DELAY due to more media key issues
Even with this change, some of the rotary encoder turns on my BDN9's
volume knob still seem to get dropped. It's possible there's something
wrong with the encoder itself. (Maybe the TAP_CODE_DELAY actually causes
QMK to miss an encoder turn? Unclear.) The other knob (backlight
brightness) works fine, FWIW....
* Restructure userspace config.h a bit
* Hack around Instant60 Via EEPROM conflict
Remove this when #6589 is fixed for Via boards.
* Add backlight breathing and (EEPROM) reset to BDN9
* Add keymap for 9-Key macropad
* Add a quefrency keymap
* New Alt-ernate layouts
* Enable Per Key Tapping Term to preserve sanity
* Use underglow and mod lights for status on Corne
* Update the drashna_ms keymap for quefrency
* Disable Audio since there isn't enough space
* Update KC_MAKE to ues :flash target
* Cleanup ergodox layout
* Enable i2c support for Iris
* Add keymap support for CG_SWAP
* Enable RGB Matrix Shutdown mode
* enable heatmap
* Update gitlab CI to install python3
* Remove game macros
These are no longer needed, and haven't been used in ages
* Cleanup planck layout
* Add RGB Matrix fun and RGB cleanup
* Add keycode and config for RGB Matrix idle animations
* Clean up rgb idle animation code
* Add rgb idle keycode to keymaps
* Fix issues with rgb matrix idle animation
* Fix some handling for idle animation
* Reduce idle animation timeout to 15s to be more reasonable
* fix up rgb stuff
* Fix isses with rgb functions not being called for matrix
* Use custom EEPROM Magic Number so testing is easier
* Extend Default Layer macro to support a lot more layers
* Fix bjohnson macropad
* Adjust KC_MAKE to process mods for more consistent behavior
* Fix up rgb stuff on corne
* Corne OLED Overhaul
* Fixes a number of issues with weirdness.
* Fixes issues with keylogger (should be more reliable now)
* Modulaize the OLED render sections
* Rewrite layer display code
* Update URL for Font Editor
Due to odd issues, I ended up rewriting from scratch. And using PROGMEM versions, since I think I was getting memory overflows.
* Update polling rate on all keebs
* Fix planck ez layout config
* Remove macros from Viterbi
* Update keymap.c
Additional functionality added to layers.
* Error fix
Fixed missing key in layer 5, fixed brightness keys with universal codes, made code more readable.
* fix missing commas
fixed missing commas on line 19 and line 23
* fix Indicator LED sticking on RGB off toggle.
fixes issue: LED indicators stay on when toggling RGB off
* fixup readme to adhere to QMK standards and to also have more information
* use pragma once
* strip out the custom bootmagic lite routine as it is the same as QMK's default bootmagic lite routine. Also add the caps lock led indicator
* turn on bootmagic lite
* update default keymap
* Update keyboards/playkbtw/ca66/ca66.c
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* remove lines 4 thru 37 and add bootloader
* Add missing void parameter declarations to *_light functions
* Add doro67/multi:konstantin keymap
* Allow FNLK to be canceled with Esc
* Function layer → Fn layer in keymap comments
* Fix battery level code in adafruit_ble.cpp
The code in tsk_core/protocol/lufa/adafluit_ble.cpp that polls the
battery level for the Adafruit feather BLE controller reads the
regulated voltage, not the raw voltage coming from the battery. To do
that, the Adafruit Feather docs say you should read from pin A9:
https://learn.adafruit.com/adafruit-feather-32u4-basic-proto/power-management#measuring-battery-4-9.
(See also
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/pinouts#logic-pins-2-9.)
I'm not sure why, but analogRead(9); doesn't read the correct pin.
Checking all available analog pins experimentally, it turns out that
analogRead(7); returns the correct value. So the code above should read:
state.vbat = analogRead(7);
* Update tmk_core/protocol/lufa/adafruit_ble.cpp
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Remove old comment
* Fix linking error
* Remove `#ifdef` around `#include analog.h`.
* Really fix linking error
Add spacing to LAYOUT macros, add layout comments, improve consistency, fix ISO layout bug
* Remove placeholder comments in regular.h and rgb.h
* Change K## to k## in multi.h and regular.h
* Add alignment whitespace in Doro67 LAYOUT macros
* Update multi default keymaps and add layout comments
* Update rgb default keymap and add layout comments
* Add RESET to Fn layer in multi default keymaps
* Replace KC_GESC with KC_ESC in rgb default keymap for consistency with other Doro keymaps
* Update regular default keymap and add layout comments
* WIP
* Replace odd F1, F2 with proper split LShift/Backspace keys in default_multi
* Minor fixes and tweaks in multi default keymaps
* Fix Enter and NUHS positions in multi LAYOUT_iso
* Return true in process_record_user in rgb default keymap
* Update Enter position in multi info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update labels in multi info.json to match the default keymaps
* Enable Fn layer tap dances only if LAYER_FN is defined
* Update KBD6X keymap spacing to match LAYOUT spacing
* Add regular FNLK to userspace, update keymap comment labels
* Rename KC_BRK → BREAK, KC_SYSR → SYSRQ in userspace
* Change mousekey positions in KBD6X
* Disable Console in KBD6X to reduce firmware size
* Return false in process_record_* only when overriding existing keys
* Fix Caps light not working after LSFT_FN
* Refactor Fn/Caps light, fix sequencing issues
* Add Dip Switches as a core feature
* Add documentation for Dip Switch feature
* Update Preonic Rev3 to use new feature and remove custom matrix
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Remove custom matrix line completely
Rather than just disabling it
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* DIP changes
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Use better check for DIP Switch configuration
* Add to show features
* Add bitmask callback for dip switch
* Fix OLKB Boards dip switch config
* Update docs to include bitmask example
* Fix comments/documentation
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix issues with docs and use example from @tuzonghua
* Fix wording
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Fix example to use proper formatting
Bad, BAAAAAAD drashna!!!
* Handle dip switch initialization better
* Add `dfu-programmer` to `pacman -S` (#6618)
`dfu-programmer` now resides at `extra/dfu-programmer` and is no longer
in the AUR
* Add `--needed` option to `pacman -S` for efficiency
* Fix
* Update util/linux_install.sh
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
Specifically, the `util/travis_compiled_push.sh` runs a number of cleanup and deployment routines. This includes `dos2unix` that fixes the line endings for sanity's sake. However, it only runs on successful builds. That would be fine, except some builds WILL fail (community layouts, yay), which is a problem.
This should change the behavior to always run the post compile checks.
However, in the long run, we should break up this script into more parts.
* update codebase to four-space indent
* update codebase to use #pragma once
* refactor config.h
* change info.json to debug linting
* refactor readme
- file header
- update docs links
* minimize and lint rules.mk
* change features
- enable mousekeys and nkro
* use GPIO commands for Status LED
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* use IS_LED_ON macro
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* update compile/flash examples in readme
* :flash doesn't use QMK Toolbox
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* updated keymap to work kindof
* KEYMAP: changed list of rgb effects
* changed CTRL rgb defaults
* KEYMAP: new LED layout for ctrl
* fixed white LED position in indicator
* changed capslock tap timing
* Added new keymap - dz68rgb
* Apply suggestions from code review
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Apply suggestions from code review
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Fixed pin for RGB
* Added support for second revision of vitamins included
* Added rev2 config and switched to #pragma once
* Switch to quantum.h pincontrol
* Fixed left-half check
* Moved revision agnostic code to main header file
* Moved common build options to main makefile
* Referred to rev2 documentation
* JTAG is dissabled in keyboard.c now
* moved EEHANDS to rev1 config
* moved rev2 to use split_common
* Updated default keymaps
* Changed handedness ifdef to allow user-overrides
* Add some space saving defines
* Changed to more sane I2C clock
* Removed rev2 check in matrix.c as rev2 uses split_common
* Removed rev2 check in rev1 only code
* Update debounce constant name
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch KEYMAP macro to LAYOUT
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch kc_keymap macro to layout_kc
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Switch kc_keymap macro to layout_kc
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Add legacy layout macro alias
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/vitamins_included/rev2/config.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Split readme into revision specific versions
* Updated src to allow LTO
* Renamed readmes to lower-case
* Switched my keyboards to FEED VID
* Fixed markdown lint errors
* fixed readme links
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Maintain keymap backwards compatibility
Co-Authored-By: Joel Challis <git@zvecr.com>
* Switch Quefrency back to I2C (#6161 fixes the lag)
* Update Quefrency keymap
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update KBD67 keymap
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Move Menu to a layer tap on the Fn key since that's a more natural
location.
* Update 60% Tsangan HHKB layout
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update 60% ANSI split backspace/right-shift layout
* Add reset and EEPROM reset keybindings so these tasks can be performed
separately, rather than relying on Bootmagic Lite, which performs both
tasks at the same time.
* Move Caps Lock from Fn+Ctrl to Fn+Tab since Fn+Ctrl is sometimes used
as part of a more complex keybinding, whereas Fn+Tab is always safe.
* Update atreus to current code conventions - add multi revision instead of defines
* Remove config.h duplication from user keymaps
* Add breaking change log
* Add missing pragma once
* Branch point for 2019 Aug 30 Breaking Change
* LUFA USB descriptor cleanup (#4871)
* Fix indentation
* Fix braces
* Expand descriptor headers
* Align descriptor elements
* Nicer formatting
* Tidy up preprocessor statements
* Remove VERSION_BCD redefine - LUFA_VERSION_INTEGER is currently 0x170418
* Tidy up comments
* Tweak ordering of HID report elements (no functional changes)
* We don't need all of these newlines
* Move default USB_MAX_POWER_CONSUMPTION closer to where it makes sense
* Ask nicely
* Add some more comments
* Change indentation back to 4 spaces
* Add changelog entry
* Language Keymap extras backport from ZSA fork (#6198)
* Swedish extra keymap refactor
* Fix swedish $ sign definition (#81)
* Fix br abnt2 keymap compilation error
* Add PR changelog doc
* Update PR6198.md
* Enforce clang-format (#6293)
* Enforce clang-format on commit for core files
* forgot about tests
* Migrate ACTION_LAYER_MOMENTARYs to MO() (#5176)
* Migrate ACTION_LAYER_MOMENTARYs to MO()
* Add changelog entry
* Update docs/ChangeLog/20190830/PR5176.md
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Migrate ACTION_BACKLIGHT_* to BL_*
* Add changelog
* Update docs/ChangeLog/20190830/PR6299.md
Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>
* Fix indentation
* Fix braces
* Expand descriptor headers
* Align descriptor elements
* Nicer formatting
* Tidy up preprocessor statements
* Remove VERSION_BCD redefine - LUFA_VERSION_INTEGER is currently 0x170418
* Tidy up comments
* Tweak ordering of HID report elements (no functional changes)
* We don't need all of these newlines
* Move default USB_MAX_POWER_CONSUMPTION closer to where it makes sense
* Ask nicely
* Add some more comments
* Change indentation back to 4 spaces
* Add changelog entry
This will manually wipe the EEPROM. This is a hacky solution for when new ranges are added or moved around.
A better (more complicated) solution would be to zero out everything, not just known ranges. But for now, this is a hacky solution that will work.
* default keymap fix for questionmark
Added /? to the default position for a qwerty keyboard. Moved |\ to the left ctrl with the same behaviour as before.
* Small PR adjustments and Keypad optimization
* Update keymap.c
* Update keymap.c
* Add 2015 revision of pegasus hoof to QMK
* Add different version strings
* Fix ansi tkl layout
- temporary JIS mapping, I can't test this as I don't have the hardware
* Reverse engineer JIS layout macro for 2015 Pegasus Hoof
* Linting on 2013.h
* Add more resources to readme
* Update keyboards/bpiphany/pegasushoof/2013/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/bpiphany/pegasushoof/2015/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/bpiphany/pegasushoof/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/bpiphany/pegasushoof/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Try to use core debouncing code
* return changed
* Use helpers
* initial commit
* Add the correct pins and ordering
* create an appropriate keymap macro for the board
* add an appropriate LAYOUT macro
* add a keymap that fits the LAYOUT layout macro
* add QMK Configurator support
* add missing pin D7 and LAYOUT_all
* fix my mistake when I added an extra key to the electrical matrix instead of the physical one
* add qmk configurator support for LAYOUT_all
* Update keyboards/eve/meteor/readme.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/eve/meteor/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* use the default names so BMC still works
* remove mcu rules as per resolution of 6253
* added combos
* minor adjustments, added combos
* Add second encoder, add modifiers to encoders
Added a skeleton for the possibily having a second encoder.
Added 9 modifiers for the first rotary encoder:
- None
General navigation. Page up/down
- SHIFT
Fast navigation. Home/end
- CTRL
Vertical navigation. Up/down
- CTRL+SHIFT
Horizontal navigation. Left/right
- ALT
Audio volume control.
- GUI
Browser navigation(windows). Forward/backward
- ALT+SHIFT
Form navigation. Tab up/down
- ALT+CTRL
Media control. (Play|pause)/mute
- HYPER
Media navigation. Next/prev track
Key codes are stored in `uint16_t encoder_actions[2][9]`
* Add second encoder, add modifiers to encoders
Added a skeleton for the possibily having a second encoder.
Added 9 modifiers for the first rotary encoder:
- None
General navigation. Page up/down
- SHIFT
Fast navigation. Home/end
- CTRL
Vertical navigation. Up/down
- CTRL+SHIFT
Horizontal navigation. Left/right
- ALT
Audio volume control.
- GUI
Browser navigation(windows). Forward/backward
- ALT+SHIFT
Form navigation. Tab up/down
- ALT+CTRL
Media control. (Play|pause)/mute
- HYPER
Media navigation. Next/prev track
Key codes are stored in `uint16_t encoder_actions[2][9]`
* Clean up; added combos
Combos:
- CV: Copy
- XC: Cut
- ZV: Paste
- QP: KC_SLEEP
* Fix LEADER_DICTIONARY to be more useful
* Add documentation
* Minor fixes
* Raise TAPPING_TERM
* testing
* Rearrange modifiers
* Fix kc being stored in uint8 instead of uint16
* Update documentation
* Clean up
* Remove excess comments
* Put encoder_actions in progmem
* Add Zadig 101 to docs
* Add USBasp bootloader name
* Add links to the page
* Note the usual VIDs and PIDs for the bootloaders
* Add "List All Devices" note, just in case
* Talk about keyboard-specific bootloader procedures
* Send users to the new page in "Unknown Device for DFU Bootloader" section
* Halfkay bootloaders are also an exception here
* Update how_keyboards_work.md
bridged the gap between scancodes and keycodes, the doc didn't make the distinction and was ambiguous.
* Update docs/how_keyboards_work.md
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update docs/how_keyboards_work.md
fix typo
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update Layer functions to use layer_state_t in ZSA Boards
* Update Music Mask for ZSA boards
Fixes an issue with the board getting stuck on Adjust layer when activating music mode
* Add Support for SMART LED Toggle to Planck EZ
* Add support for SMART LED toggle in Ergodox EZ
* Ifdef swiss cheeze for Oryx Configurator
* Documentation and updates
* Add Oryx Keymap
* Add option to configure the layers for the Layer Indicator
* Update keymap with better examples
* Make sure eeprom is initialized before reading from it
* Force flush of LED matrix when suspending board
This fixes an issue where the LEDs don't fully clear sometimes when the host system goes to sleep
* Enable RGB Sleeping by default
* Add clarification about planck ez led layer config
* A little easier to read the definition of the GPIO control macro for AVR.
No change in build result.
* Changed to not use GNU statement expression extension.
No change in build result.
* Modified split_common/serial.c to use qmk_firmware standard GPIO control macro.
No change in build result.
* fix PE6 -> E6
* remove some space
* add some comment to config_common.h
* Changed split_common/serial.c to use a newer version of qmk_firmware standard GPIO control macro.
* Additional changes for Layer State typedef compatibility
* Replace biton32 with get_highest_layer in docs
* Change additional layer structure code
* Fix uGFX reference issue
* Remove dynamic_keymap check
* Where did all these extra spaces come from
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add MAGIC_SWAP_CONTROL_LGUI and MAGIC_UNSWAP_CONTROL_LGUI keycodes
Key codes to swap and unswap the control and windows/cmd keys
* Fix issues with pull request #6110
Renamed swap/unswap lctl and lgui key codes, added key codes to swap/unswap rctl and rgui, and moved new bool inside keycode_config.h struct to the end
* Move new keycodes to the end of the enum (#6110)
* add cases for swapped control and OS keys to mod_config (#6110)
* Add new keycodes to feature_bootmagic.md (#6110)
* Add R+L swap codes to keep in parity with AG_* codes
* Extend Magic range check to include new magic codes
* Update audio docs
* Combine 2 byte ranges into 1 word for EECONFG
Fix names for Keymap config EEPROM
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update docs/feature_bootmagic.md
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Optimize RGB Matrix rendering for Ergodox EZ
* Optimize RGB Matrix rendering for Planck EZ
* Update keyboards/planck/ez/config.h
Co-Authored-By: Joel Challis <git@zvecr.com>
* Remove superfluous JTAG disable code
* 32A has differently named register
* Accidentally some operators
* 32A also has different JTAG pins
* Wrap disable_jtag() in an ifndef
* Document this new define
* Rename the define, it conflicts with a LUFA thing
Also, move the ifndef wrapping to the call in keyboard_setup()
* removed some debug prints
* removed unnecessary files, tweaked some things
* rotary encoder button now connected into column 0, row 3
* tweaked keymap and moved encoder control into keymap
* tweaks
* added test keymap
* updated some things to make it easier to work with QMK configurator
* updates after merging latest master in
* fixed a few things
* removed test keymap and all related #ifdefs
* changed some dumbpad default keys, added KC_LOCK
* added image to readme
* added link to PCB github repo
* moved lock key to the rotary encoder pushbutton
* making suggested changes from @fauxpark in https://github.com/qmk/qmk_firmware/pull/6452
* adding bootmagic lite since i'm lazy and haven't soldered on the reset button...
* renamed to
* using 7 underscores for KC_TRNS
* adding my layout (default is for wife)
* updated my own layout, tweaked default keymap to use cleaner switch for encoder control
* removed commented out import from imchipwood keymap, removed unnecessary comment from default layout
* added LED layer control
* flash the layer indicator LEDs at startup
* change layer_state_set_user to layer_state_set_kb
Co-Authored-By: Joel Challis <git@zvecr.com>
* in layer_state_set_kb, return layer_state_set_user
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* remove include of upper level config.h, add pragma once
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* changing default keymap slightly, added config.h for default layout
* change _delay_ms to wait_ms
* replaced locking numlock with numlock
* Update keyboards/dumbpad/dumbpad.c
change `keyboard_pre_init_user` to `keyboard_pre_init_kb`
Co-Authored-By: Joel Challis <git@zvecr.com>
* Update keyboards/dumbpad/dumbpad.c
adding `keyboard_pre_init_user()` to `keyboard_pre_init_kb()`
Co-Authored-By: Joel Challis <git@zvecr.com>
* fixed some comments about the layer key (MO to TT) and the SUB layer rotary encoder control
* Move default keymap's rules to keyboard level
* Concatenate the two sets of rules
This sets CONSOLE_ENABLE to no, which was being set at the keymap level.
* Wrap the USB Device Description in quotes
Some preventative maintenance. The firmware for the_ruler can't be compiled without this change if `CONSOLE_ENABLE = yes` because this string has a comma, which gets picked up as two arguments by the Command code, instead of one as it should be.
* Linting
- remove firmware size impacts
- remove trailing white space
- visual alignment of rules
* Use QMK's pre-loaded default rules for atmega32u4
* Update readme
- markdown formatting
- update Hardware Availability link (Maple Computing's site has disappeared)
- update Docs links
* Update header files to use #pragma once
* Add universal flash command
* Add bootloader info to I:C boards
* Add support for ATSAM
* Add messages for flash target
* Message cleanup
* Add USB ASP Flashing target
* Make usbasp target more universal
* Add phoney target for usbasp
* Clarify error message when bootloader isn't matched
* Fix Clueboard hotswap gen1 not compiling when LED Matrix is disabled
* Move keymap.json to default keymap folder
* Revert "Move keymap.json to default keymap folder"
This reverts commit 7f28df909d.
* Add an alternative method for keyboard discovery to speed up build
* Chain MAKEFLAGS for docker_build.sh
* Slight improvement to number of items sent to sort
* Remove debug line
* Fix line escape
* Added Bulbizarre keymap for the XD75
* Fixed no newline at the end of file
* Update keyboards/xd75/keymaps/bulbizarre/readme.md
Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com>
* Update led status check
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Remove unnecessary define
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* remove led layer code
* enable PWM on STM32F303
* Unusable PWM code
* Updated PWM Stuff?
* PWM Semi-working
* Both LEDs working at the same time
* Update names
* Add led level functions
* Add LED levels and persistent settings
* Revert change due to issues with timing related code
* Review feedback and minor cleanup
* add Userspace and keymaps
* Adding keymaps for zeal60 and iris
* Created my own tap dance that toggles RGB Mode based on whether I toggled caps lock or not
* parent 578ed42a7f
author Seth Barberee <seth.barberee@gmail.com> 1565065903 -0500
committer Seth Barberee <seth.barberee@gmail.com> 1565065903 -0500
move to userspace
add zeal60
* update based on review
* move userspace to github name
* Add some defaults for ATmega32A to mcu_selection.mk
* Remove boilerplate from templates
* Relax INTERRUPT_CONTROL_ENDPOINT and PROGRAM_CMD
* Apply suggestions from code review
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Extend allowed range of tappable keycodes to include modifiers
* Get rid of the magic numbers altogether
* Remove some more magic numbers
* Extract LM() functionality from ACT_LAYER_TAP
* Use ACTION() macro everywhere
* Improve backlight PWM pin support
* I accidentally an equals sign
* Another typo
* Order by pin number
* Throw an error if backlight pin is C4 or C5 on 16/32U4
* Use else for clarity
* Minor alignment adjustments
* Add Kudox Keyboard profile.
* Modified info.json and image link on readme.
* Remove unnecessary codes.
* Set BootLoader caterina.
* Remove duplicated settings on rules.mk.
* Clean up config.h.
* Modified include header path.
* Modified info.json to adjust 4th row keys y position.
* Separate default keymap and my keymap.
* Modified RGB_LED_* settings on kudox/rev1/config.h.
* Add configurations for Kudox Game Keyboard rev1.
* Modified Kudox Game Keyboard readme and keymap.
* Remove unnecessary codes.
* Set BootLoader caterina.
* Remove wrong settings on rules.mk.
* Clean up config.h.
* Modified MATRIX_ROWS on kudox_game/rev1/config.h.
* Modified RGB_LED_NUM on kudox_game/rev1/config.h.
* new keymap for projectkb alice
* update documentation for resetting PCB
* actually need a grave key more than a tilde
* move DFU_ARGS to top level
* cleanup unused keycodes and others
* align with typical ergo layouts. move enter and keep function layer reachable
* Delete null key
`__` key in keymap.c doesn't actually exist on the physical hardware.
Removed key from keymap.c and removed its argument from the layout macro.
* Delete unused keycode aliases
* Replace layer index definitions with an enum
* Replace redundant numpad keycodes with native aliases
* Use native layer change keycodes instead of aliases
* Visually align the keycodes
It makes the keymap pretty.
* Correct Configurator layout data
* Clean up header files
- convert to pragma once include guard
- remove redundant definitions
- remove commented code blocks
* Delete LAYOUT_kc macro
Was copied from ergotravel; not valid for this keyboard.
* Consolidate rev1 rules.mk settings to keyboard level
Previous codebase enabled Backlight at keyboard level then disabled it at revision level.
* Delete unused rules
* Consolidate config.h settings from keymap level to keyboard level
* Modernize keyboard's config.h file
Aligns the keyboard-level config.h file more closely with the current QMK template for AVR keyboards.
* Added nearly perfect config for AMJ66, only missing top right key.
* Correct the layout macro
* Add layout mock-up to amj66.h
* Update and comment out the backlight definitions in config.h
The backlight pin was found to be D4, but there appears to be a bug in QMK that affects this keyboard.
Commenting out for now.
* Try to make a sensible default keymap
* Add testing keymap for FSund
Include the keymap that was being used for testing.
Don't forget to refactor this later into an actually useful keymap.
* Suggestions by fauxpark
- uncomment the backlight configuration
- fix the default keymap
- remove commented MCU rule
- specify the bootloader
- make mental note to not try to write code at 3:30 in the morning
* Add LAYOUT_66_ansi and LAYOUT_66_iso macros
- include QMK Configurator data
- enable Community Layout support
* Add comments about layout variants to amj66.h
* Add #define BACKLIGHT_ON_STATE 1
Partial fix for backlight breathing.
- Requires #5983 to fix fully (confirmed by FSund and fauxpark)
Co-Authored-By: fauxpark <fauxpark@gmail.com>
Co-Authored-By: Filip Sund <filip.sund@gmail.com>
* DEBOUNCING_DELAY -> DEBOUNCE
* Move AMJ66 files into new AMJKeyboard directory
* Correct Manufacturer in USB Device Descriptor
* Remove comment regarding source fork
* Correct the readme
* Update default keymap to match the details given in its readme
* White-space edit fsund_test keymap
Makes its formatting more consistent with other 66% keymaps. No logic changes.
* Linting info.json
Debug-style linting (one key object per line) and minor edits to key labels.
* Remove fsund_test keymap
* Add FSund as a maintainer in info.json
* removed some debug prints
* removed unnecessary files, tweaked some things
* rotary encoder button now connected into column 0, row 3
* tweaked keymap and moved encoder control into keymap
* tweaks
* added test keymap
* updated some things to make it easier to work with QMK configurator
* updates after merging latest master in
* fixed a few things
* removed test keymap and all related #ifdefs
* changed some dumbpad default keys, added KC_LOCK
* added image to readme
* added link to PCB github repo
* moved lock key to the rotary encoder pushbutton
* making suggested changes from @fauxpark in https://github.com/qmk/qmk_firmware/pull/6452
* adding bootmagic lite since i'm lazy and haven't soldered on the reset button...
* renamed to
* using 7 underscores for KC_TRNS
Currently OLED Dirver only supports LF (\n) character in a string to clear out the rest of the current line and advance to the next line for writing. This PR adds support for CR (\r) character as well to advance to the next line, however not clear out the rest of the current line. This is extremely useful when you want to display a multi-line logo using a single array without wiping out exiting lines and flagging the OLED as dirty unnecessarily.
* personal keymap for the planck with sounds
* need that minus and underscore where I can see them
* remove unused block
* some, shall we call them, minor changes?
* I don't think this is required anymore
* initial commit TGR Jane
* lighting support
* use the default keymap lifted from community layouts for LAYOUT_tkl_ansi
* add information regarding reset key, hardware supported, and hardware availability
* document that it supports v1.1 as well thanks to nickheller's confirmation
* update some verbage in the readme
* add QMK Configurator support
* establish switch matrix for three main layouts
* add community layout support
* readme fixes
* Update keyboards/tgr/jane/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keyboards/tgr/jane/rules.mk
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Update keyboards/tgr/jane/config.h
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Update MODERN_DOLCH_RED color
* Remove unused RAL_LAL tap dance
* Disable Space Cadet on all boards
* Rework SEND_STRING_CLEAN into CLEAN_MODS, fix DST_P_R/DST_N_A
* Disable unnecessary underglow animations
* Rearrange feature flags in rules.mk files
* Change custom colors from structs to defines
* Add some explicit initializers
* Add MODERN_DOLCH_CYAN color
* Add IS_LAYER_ON_STATE()/IS_LAYER_OFF_STATE() macros
* Add led_set_keymap() template function
* Change underglow color based on Caps/Fn state
* Preserve val when changing underglow colors
* Only trigger Fn light for Fn layer
* Refactor fn_light() and caps_light() slightly
* Add comments to fn_light() and caps_light()
* Xulkal changes
Refactor rgb & encoder menu
Hadron Keymap
Refactor oled menu
* Fixing horizontal OLED data display
* Reverting changes to take to separate prs
* Add Sections and MO(layer)/TG(layer) Example
Major changes:
1. Added sub-section headings to the portion before the examples.
2. Added a new Example 6, that allows MO(layer) and TG(layer) functionality to be embedded within tap dance functions.
Minor Changes:
1. Edited some text to better fit with new sub-headings.
* Update feature_tap_dance.md
* Update feature_tap_dance.md
* basic layout v1.0
* changed KC_TRNS to _______
* most symbols are on double tap, except quote, that was cancer
* better formatting and set toggle for game layer
* added colors to layers to make knowing your current layer easy
* have an empty macro working
* enabled unicode
* moved stuff to my folder and removed edits from communal files
* cleanup
* removed the game layer. Never used it
* made changes requested by drashna and vomindoraan
* got rid of some unnecessary code
* got very basic unicode on mac working
* added ctrl_esc
* more changes as requested by noroadsleft
* more leader additions, removed macros because leader stuff replaces that functionality
* removed an old macro I forgot to remove earlier
* final deletion at noroadsleft request
* changed a line to explicitly specify a purple color.
* Fix my Tap Dance issues after I broke them
* Cleanup and organization of userspace documentation
As well as some additional cleanup of functions due to review of documentation.
* Enable Tapdance on Glow and remove more animations
* Revert to Eager PR debouncing
* Add better check for startup animation
* Move where RGB Matrix defines are listed
* Limit RGB Matrix max val
* Update keyboard for Iris Rev 3 conflicts
* Enable encoder support on planck ez
* Remove is_master check from corne\'s OLED code
* Overhaul OLED screens for my Corne
* One last removal
* Show RGB valu On both sides
* Updates for OLED display info
* Fix compile issues for rgb config
* Disabled Space Cadet for all drashna keymaps
* Fix OLED Screen configs
* Minor OLED Tweaks
* Revert some Iris changes
* Fix song include
* Handle MAKE macro for the Corne boards better
* Add super hacky-hack for eeconfig initialization
* Add audio support for Fractal since Elite Cs support it
* Add defines for keycode steps
* Add White layout
* Update Corne RGB info
* Add fun effects to layer indication for RGB Matrix enabled boards
* Use proper define for product name detection
* Update formatting
* Use custom timeout mechanism for OLED timeout
* Fix up OLED screen HSV code for new HSV structure
* Better handle turning off RGB Matrix when sleeping
* Disable MultiSplash Animation
* Change Iris back to using serial
* Why was RGB disabled?!?!?!
* Limit val in rgb_matrix_layer_helper function
* Remove EECONFIG setting for RGB matrix
* Basic Rev 2 implementation
* Updated LED defines and added Extra encoder support
* Fixed rgb pin assignment
* Physically accurate LED positions
* Single Color Band scrolling left to right effects
* Spirals, Pinwheels, and Documentation....Oh My!
* Spiral effect band thickness adjustments
* Fixing animation spin directions
* Full hand LED positions
* Basic Rev 2 implementation
Updated LED defines and added Extra encoder support
Fixed rgb pin assignment
Physically accurate LED positions
Full hand LED positions
Moving rev2 folder
* RGB Center Point LED position update
* Fixing led config commas
* Fixing led config commas
* fix enter key
* fix enter
* Small changes to default
* update default
* typo fix
* update default
* Fixing defines & led config, turned full hand & extra encoders into rules.mk feature
* Refactored rules.mk to have a post_rules.mk
* Forgot to offset the matrix to led map due to the edge led additions
* Updated LED flags and fixed my keymap
* Update keymap.c
include speed controls for RGB
* Fixing more rules.mk and adding keymap like encoders functionality
* Sol Rev 2 Implementation
* Minor fixes
* Keymap fixes
* Fix Colemak, add lock keys
* fix default keymap to not have Q in the 1 position.
* add tsangan hhkb layout
* add a tsangan default keymap
* clean up the default keymap
* add qmk configurator support for new layout
* [Layout] KBP V60 Type R ISO default
* Remove ifdef
* Apply suggestions from code review
@noroadsleft I've accepted your suggestions. Tried locally any everything works as expected.
Thanks again - this if my first keyboard and first time looking at/ using/ contributing to qmk so I appreciate the feedback 👍
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
info.json file had the wrong name for the JSON key; the macro that is normally named LAYOUT_all by convention is named LAYOUT_60_all on the Zeal60.
Bug flagged by drashna for flight505 on QMK Discord.
* Update snagpad.h
White-space changes only. Making this file easier to read.
* Update info.json
Refactor:
- add labels
- debug linting (one key object per line)
- reorder keys for LAYOUT_numpad_5x4 (fixes QMK Configurator assigning keys to incorrect positions)
* Update readme.md
Refactor to conform to QMK template.
Updated link to The Board Podcast (old link was Error 404).
* Refactor splittest to support multiple dev boards
* Refactor splittest to support multiple dev boards - revert change to number of RGB led
* Refactor splittest to support multiple dev boards - update docs
* Refactor splittest to support multiple dev boards - correct docs
* Refactor splittest to support multiple dev boards - update teensy master logic
* Update IS_COMMAND definition in templates to use MOD_MASK_SHIFT
* Update IS_COMMAND in docs
* Update IS_COMMAND default definition in tmk_core
* Update table in Command docs based on suggestion
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add Configurator layout data for LAYOUT_hotswap
* Add LAYOUT_std60_split_num0
Requested by 李小安#9728 on QMK Discord.
Standard 60% ANSI layout for the alphanumeric region, with a split-0 Numpad.
Includes a sample keymap.
* Update Docs links on readme
* Change melody96.h to use #pragma once include guard
* Change config.h to use #pragma once include guard
* Add readme for default_std60_split_num0 keymap
* Update x11.h
The original json file that was given by the designer was incorrect. The Print Screen and Pause button is swapped.
* Update space65.c
Fixing the Caps Lock LED.
* Revert "Update space65.c"
This reverts commit 1f5de1abae.
* Remove the need to set NUM_OF_ENCODERS
Instead, calculate the size of the array, and use that instead
* Add hack for split common support
* Remove NUM_OF_ENCODERS from keyboard config
Can be reverted, if needed
* Update the :bootloader target to pass along correct hardware info
* Update make scripts to properly grab the settings (a big thanks to @yanfali)
* Remove LUFA debug warnings
* Initial conversion of vagrant to use qmkfm/base_container
* Fix vagrant when using docker provider
* Workaround for VirtualBox VM restarts
* Generalise Vagrant docs slightly and add FAQ
* Store backlight breathing state in EEPROM
* Reduce backlight_config.level from 6 bits to 4 (max 15 "on" levels)
* Error out if BACKLIGHT_LEVELS is > 15
* Remove mention of default backlight pin in rules.mk template
* Remove pointless comment
Zeroing out spd in eeconfig_init_quantum
Switched to block read & update
Update tmk_core/common/eeconfig.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Fixing init compile error
Update eeconfig.c
Dead / Missing API cleanup
alignment
* Enable Mousekeys on Corne Keyboard by default
For Tessachka and Configurator support
* ENable for default image too
* Remove most of rules.mk for default keymap
* make sure rgblight is enabled by default
from default keymap
* Add out of bound check for Leader Key sequence array
* A shot at advanced C stuff for Leader Key optimization
* Revert most changes
* Change default back
* Include string.h if compiling for ARM
* Use sizeof instead of a number
* Align sendstring LUTs to 9 characters wide
* Replace 0 with XXXXXXX
* Use decimal 128 for LUT size
* Align heading comments
* Add ASCII table comments
* Add missing AltGr LUTs and adjust keycode LUTs accordingly
* Use pragma once
* Correct a couple more keycodes
* Capitalise "BÉPO"
* Also clean up the default tables
* Tidy up Belgian and Norman LUTs
* Add user-overridable callback for cancelling UCIS input
To clean up things from qk_ucis_start_user() for instance.
* restore lost newline to quantum/process_keycode/process_ucis.c
Co-Authored-By: shinmai <aapo.saaristo@gmail.com>
* Script to generate keymap.c from JSON file.
* Support for keymap.json
* Add a warning about the keymap.c getting overwritten.
* Fix keymap generating
* Install the python deps
* Flesh out more of the python environment
* Remove defunct json2keymap
* Style everything with yapf
* Polish up python support
* Hide json keymap.c into the .build dir
* Polish up qmk-compile-json
* Make milc work with positional arguments
* Fix a couple small things
* Fix some errors and make the CLI more understandable
* Make the qmk wrapper more robust
* Add basic QMK Doctor
* Clean up docstrings and flesh them out as needed
* remove unused compile_firmware() function
* Add support for XD004
Also applying the following suggested edits:
Add hardware availability link in readme
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Enable lite bootmagic
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Remove commented out MCU
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Add more ellaborate keymap
Correcting usage of tap_code_16 for modified key, thanks to @drashna
* Add information about bootloader type
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* add keyboard new macro pad "Kuro"
* change main readme.md
* remove not used code from default/keymap.c
* Remove unnecessary code
* Supports info.json
* removed back slash and not used functions.
* update at product link. add japanese messages.
* Added initial files for the Adron 3-key macro pad
* Refactor of "adron_pad" to "ivy", cleaned up the readme and removed un-needed keymap as well.
* Made suggested changes to commit for PR
* Removed unneeded define block from SUBPROJECT_rev1 as it is redundant (Thanks drashna ;) )
* Add missing TD_RSF_RCT tap dance
* Use standard QMK HSV and RGB structs, fix Godspeed colors
* Move PROGMEM after the type in RGB intervals
* Add MODERN_DOLCH_RED color, use it on KBD6X
* Use 255 instead of RGBLIGHT_LIMIT_VAL in color definitions
* Remove IS_COMMAND override on Whitefox
* Hightlight that sudo may be needed
Also added "dfu-programmer: no device present" in so that anyone searching for that particular error can hopefully find the page.
* Use new style of indicating a warning
* Indicate that the FAQ should be read instead of blindly using sudo
* Switch version incrementing to the command put together by @noroadsleft.
* Update util/travis_compiled_push.sh
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* added files for KeyHive Maypad
* updated maypad files and moved honeycomb inside keyhive dir
* fixed file paths, incorporated changes with fauxpark's suggestions, undid honeycomb move
* updated with fixes from PR
* added new lines to end of honeycomb files to fix compiling
* Updated info.json to match the macro name from maypad.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* reordered layout in info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* removed KEYMAP from maypad.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* removed extraneous keymap files
* pulled qmk/master for honeycomb
* added ortho_5x4 and keymap cleanup
* matched identities in maypad.h
* added bootmagic functionality to maypad
* changed bootmagic to lite
* Clarify the rules.mk setup for Unicode
* code point
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Remove "your"
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Undo a line change
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* dot the comma
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* Update docs/feature_unicode.md
Co-Authored-By: Konstantin Đorđević <vomindoraan@gmail.com>
* added handwired keyboard wulkan
* added info.json for qmk configurator
* fixed spelling
* enum dont need to be assigned to zero
* removed cflag from readme
* updated rules.mk
* removed unneeded rows from config
* moved unicode to keymap conf
* fix adjust layer and comments for keymap
* 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
Using QUANTUM_LIB_SRC prevents the warning when multiple sources add the i2c_master.c file. Boards such as the Ergodox EZ Glow see this warning every time they compile because the board uses the file in general, and because the RGB LED Matrix requires it, as well.
* Add wasdat:konstantin keymap
TODO: Move it to layouts/
* Use HHKB arrow arrangement for mouse keys on KBD6X
* Move KC_APP from Ctrl to M on all boards
* Use RCT_RSF on Melody96
* Set TAP_HOLD_CAPS_DELAY to 50 in userspace
* Use RSF_RCT instead of RCT_RSF
* added iris rev 3 keymap
* stuff
* Update config.h
* Removed personal mapping folder so that I can branch it
* Added personal Iris keymap folder
* added enums, removed break after return, and removed line 3 of keymap.c
* removed process record function
* greenshadowmaker keymap for idobo xd75 massdrop
* remove uneeded config.h
* corrected format to match convention instead of xd75 where I accidentally started from
* fixed errors and added arrows bottom right to match my other layouts
* updated readme
* right arrow fix
* Update keyboards/idobo/keymaps/greenshadowmaker/keymap.c
removing unnecessary part, copied from different keymap
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* added suggested changes
* removed unneded elements
* updates to my iris keymap
* some rational updates to the keymap - let's see how this works
* updates to my iris keymap
* some rational updates to the keymap - let's see how this works
* add mouse keys and remove unused keys and some cleanup
* a little bit more cleanup
* actually enable mousekeys
* fix markdown lint complaints
* fix capitalization
* changes made per suggestions
* initial commit, copied from singa
* default 60_ansi LAYOUT implemented and tested workin
* add rgb underglow support bounded by ifdefs
* edit readme to provide information on reset procedure and on rgb underglow support
* improve the default keymap to have a second layer with function keys and even a RESET
* Add LAYOUT_all macro and discovered that split backspace uses an additional pin on the microcontroller
* fix up last line in readme
* Add QMK Configurator support
* Convert gh60.h to #pragma once include guard
* Lint gh60.h
This commit only changes white space.
* Convert info.json to debug linting
Making this file easier to read.
* Put the label keys first for LAYOUT_60_ansi
* Complete and correct key labels in info.json
* Duplicate LAYOUT as LAYOUT_all
Doing this for backwards compatibility. Has implications for user keymaps.
* Update LAYOUT_all to make sense
The original macro LAYOUT submitted for the GH60 gets a couple of things wrong:
- K49 is placed between Space and Right Alt, when it's actually the right half of a split Backspace
- K3C is assigned before K3D, when K3C is the 1u portion of a 1.75u/1u split Right Shift, and therefore K3D is actually to the left of K3C
The LAYOUT_all macro corrects these issues, but the LAYOUT macro is unchanged, so as to not break user keymaps that depend on it.
This commit also updates the default keymap to use the LAYOUT_all macro, and makes a minor change to the base layer to be more as a user would expect for the corresponding physical layout.
* Correct the layout data for the LAYOUT macro in info.json
Gives proper Configurator rendering.
* Modernize default keymap
Update the default keymap to use more modern QMK conventions.
* Modernize the LED management code
Update the LED management functions to use the GPIO functions, and clean up the led_set_kb() function.
* Update key labels in info.json for LAYOUT_60_ansi_split_rshift
Makes them consistent with the the rest of the file.
* Update Docs links in readme file
* Snowkuma's planck layout.
Heavily influenced by both Planck and SDOTHUMs layouts. I have tried to
implement a comfortable layout with a wide stagger and a minimal set of
key usage.
Still a work in progress, hope it is useful to others.
* Adds simple readme file and images of layout
* Removes unused experimental definitions
* Update readme.md
Adds images of layout to readme.
* Removes accidentally added test keymap .swn .swo .swp files
* Updates config.h replaces include guard
As suggested by @noroadsleft replaces the include guard (ifndef, define
and endif) with just `#pragma once`.
* Replaces two extra KC with inbuilt QMK equivalents
custom_keycodes.h
Replaces `___f___` with the equivalent QMK alias `_______` KC_TRNS
`___x___` with the equivalent QMK alias `XXXXXXX` KC_NO
Updates keymap.c to reflect the changes made.
* Changes keymap.c to include QMK_KEYBOARD_H
Replaces planck.h and action_layer.h includes with the single inclusion
of QMK_KEYBOARD_H which includes action_layer.h automatically.
* Update keyboards/planck/keymaps/snowkuma/keymap.c
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update keymap.c
removes unused Coleman key code from enum planck_keycodes
* Update keymap.c removes COLEMAK key code logic
* Initial keymapping
* Removed unneccessary config files
* Update readme.md
* Updated symbol locations, tap dance on parentheses for brackets.
* Update readme.md
* Fixed layout image inconsistencies
* More quality shift key layer control, swapped enter + shift enter
* Keyap tweaks and config cleanup
* Almost compiling, still has layout reference issues.
* Finally compiling. 2x2u layout (default, not mine) had nonexistent keys on it
* Super minor changes
* Ctrl+Bksp after first tap
* Changed bind so un/lock is explicit to work with remote un/locking
* Added keyboard passwords please don't hate me
* Changed backspace functionality and added em dash
* Changed to send_string because it's preferred for macros
* Minor fixes
* Removed global redefinition and fixed possible issue between 6KRO and NKRO
* Cleanup
* Layer names, password layer is OSL over toggle
* Hopefully now in QMK preferred format.
* Blank passwords.c
I realized with me excluding this it wouldn't compile - so adding a blank one.
* Fixed OSLs not cancelling after tapping term
* Matrix change.
KC_NO instead of repeating.
* Unneeded line.
Co-Authored-By: IsaacElenbaas <34344969+IsaacElenbaas@users.noreply.github.com>
* Fixed return statements to work with after-press functions
* External image host
* Removed image from github
* Removed unneccessary rules.mk lines and fixed tabbing
* Typos
* Fixes upon part arrival.
* Final changes and bug fixes
* Preventing KC_NO from waking monitors.
* Fix to rest of matrices
In response to https://github.com/evillemez/qmk_firmware/issues/1—the rest have the same problem.
The switch of k37 for k36 is just for consistency between that and the 2x2u.
* Workaround for #6214, minor changes, CRLF change in passwords because it won't leave my modified no matter what I do.
* Add Pulse 4k, a macropad by Maxr1998
* Some config tweaks
* Remove image note
* Add license headers
* Fix media keys
* Remove Play/pause again as it doesn't work on Linux
* Initial refactor of onekey to support multiple development boards
* Fixes to get teensy lc && 3.2 working
* Add pin tables
* Add caveats to Teensy boards
* Correct bootloader for Elite-C
* [Keyboard] Modernize the KMAC implementation
This brings the matrix implementation more in line with the current
default matrix code.
It also simplifies the implementation quite a bit.
* [Keyboard] Add layout support to KMAC
* Rename layout macros
The Instant60's info.json was updated in #6157. The intention seems to have been supporting Community Layouts, but that feature was not implemented. After checking that the layouts conform, rename the appropriate layout macros.
- rename LAYOUT_ansi as LAYOUT_60_ansi
- rename LAYOUT_tsangan as LAYOUT_60_tsangan_hhkb
- update `default` and `tsangan` keymaps
* Enable Community Layout support
Supported Community Layouts:
- 60_ansi (Instant60 ANSI version)
- 60_tsangan_hhkb (Instant60 Tsangan version)
* keymap simplification and fancy alt tab behaviour
* move symbols around and try ergo numbers
* mess with symbol positions
* f11 and f12 for volume control (for ease of remapping)
* slack unread navigation
* experiment with mods on home row
* mods on symbol layer
* dedicated tab left and tab right keys
* swap next and prev
* remove hold to shift on a and o
* revert to simpler keymap
* restore readme
* point to keymap image
* cmd + cmd -> cmd + ctrl
* expand readme
* slack unread channel navigation
* Update keyboards/planck/keymaps/callum/keymap.c
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* return true from cmd handling block
* [keyboard] TA-65 by maartenwut
Add ta65 to QMK with 4 layouts
* Simplify config.h
* Simplify keymap
* Update bootloader
- confirmed to be qmk-dfu by maartenwut
* Update keyboards/ta65/readme.md
Co-Authored-By: fauxpark <fauxpark@gmail.com>
* Review feedback
- fauxpark recommendations
- noroadsleft recommendations
* Repair info.json structure
JSON objects were not properly nested according to the QMK specification.
* Switch info.json to "debug linting"
So I can read the file more easily.
* Remove k2c and k31 from LAYOUT_tsangan
k2c was the Non-US Hash position, and k31 was the Non-US Backslash position, but this layout is intended for ANSI.
* Correct LAYOUT_tsangan data in info.json
* Update tsangan keymap to use updated LAYOUT_tsangan macro correctly
* Rename LAYOUT_tsangan to LAYOUT_ansi_tsangan
Increased clarity.
* Rename tsangan keymap as default_ansi_tsangan
Per QMK Keyboard Guidelines.
* Fix object ordering for ISO layouts in info.json
ISO Enter's object was out of sequence in both layouts.
* Rename ISO keymaps per QMK Keyboard Guidelines
- rename iso keymap as default_iso
- rename iso_tsangan keymap as default_iso_tsangan
* Add default_ansi keymap
For user reference.
* Enable Community Layout support
LAYOUT_ansi and LAYOUT_iso conform to the 65_ansi and 65_iso Community Layouts, respectively.
- rename LAYOUT_ansi to LAYOUT_65_ansi
- rename LAYOUT_iso to LAYOUT_65_iso
- update keymaps as appropriate
- add LAYOUTS rule to rules.mk
* Disambiguate key labels in info.json
* Remove trailing white space from info.json
* Update keyboards/ta65/keymaps/maartenwut/config.h
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Add omnikeyish keyboard support.
* remove out of date comment
* PCB Rev 1.1 moved Row5's pin to E6, because the teensy++ hangs an onboard LED off D6.
* Move string.h include to .c file
* Add pcb kicad link.
* Add info.json
* Move macro programming to numlock's keyposition, the most useless key on the post model M layout. Force numlock enabled on host at init time, so you're not stuck without a numpad (hopefully)
* Make the macro blink function toggle LEDs from their previous state.
* Use incorrect but code style compliant opening curly bracing style.
* Make PCB rev 1.1 the default Omnikeyish config, as the author has the only rev 1.0 boards that'll ever be.
* Fix silly spelling error in 3 defines
* First set of review changes.
* Layout macro and keymap defined using it.
* Layout macros for the northgate factory plates.
* minor rearrangements
* ALL the layouts.
* Forgot ultra-t in info.json
* fixed issue with LED indicators
corrected error in info.json
* fixed issue with led indictors
* added fix for key_count to info.json for westfoxtrot/aanzee
* fix to support config.qmk.fm correctly and remove unused key from matrix for westfoxtrot/aanzee
* fix for caps_lock led
* Update readme.md
* Fix breathing always on for soft PWM
* Remove reference to hardware PWM pins in BACKLIGHT_BREATHING description
Now, breathing will only be unsupported when Timers 1 and 3 are both used by Audio
* Document BACKLIGHT_ON_STATE and its purpose
* Move layout macros to revision folders
* Update Planck EZ layout macros
Planck EZ only supports one layout (centered 2u spacebar). Deleted all the other macros.
* Flesh out QMK Configurator support
Give each Planck revision its own info.json file.
* Readme updates
- give each revision its own readme
- add the Planck EZ to the main Planck readme
* Fix layout macro for Planck EZ
Previous matrix didn't compile because the electrical matrix defined a k3b location, which was unused by the physical arguments.
Drashna was kind enough to confirm the Planck EZ's matrix for me.
Co-authored-by: Drashna Jaelre <drashna@live.com>
* Pretend the Planck EZ supports ortho_4x12 layout
The hardware doesn't, but doing so prevents CI errors because the default keymap uses LAYOUT_planck_grid.
Going to pretend LAYOUT_ortho_4x12 is a valid layout for the Planck EZ.
* Update Planck EZ's URL in info.json
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* added keyboard_layout_jopr
* making it compile
* #pragma once instead of #ifndef and #define
* renamed and added keymap
renamed old "default" to "modded_white", added new "default" that resembles an ISO 105-key layout
* reordered keyboards/jopr/info.json to match order o layout array
* implemented most suggestions
* fixed missing ;
* fixed bootloader setting for rules.mk
* adopted standard layout matrix naming convention
* "fixed" commented-out code in keymaps
* changes to keymap layers and LEDs
Turns out adding a layer for ROYA-modified keycodes is more trouble than it's worth and works better by just defining a ROYA key.
Also, LEDs were set up incorrectly.
Lastly, implemented SysReq-Warning LED.
* moved forced NumLock code
just in case either it or the CapsLock & ScrlLock update code wouldn't both work otherwise
* rearranged media keycodes
* replaced Shifted keycodes with basic ones
* Apply suggestions from code review
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* implemented suggestions by noroadsleft
* Apply suggestions from code review
Make ISO-Enter QMK Configurator-friendly
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Update readme.md
* Update keyboards/jopr/info.json
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* moved keyboard to handwired folder
It was said that personal passion projects belong in there, even if they're not actually handwired
* Update readme.md
* added personal CTRL keymap
* added personal dz60rgb keymap
* enabled new rgb effect
* added space cadet shift
* media player track buttons now orange
* updated keymaps with rgb setting and visual HSV setting preview
* fixed source stuff?
* added support for underglow toggle (bugged to all hell)
* everything now behaves as expected when ti comes to RGB toggles, thank god
* removed ifdefs
* changed color of MAS_CRM
* uh, whitespace
* changed rgb positions and modifiers within RGB matrix thing for CTRL and DZ60RGB
* updated keymap to work kindof
* KEYMAP: changed list of rgb effects
* changed CTRL rgb defaults
* KEYMAP: new LED layout for ctrl
* fixed white LED position in indicator
* changed capslock tap timing
* Fix backlight breathing on C6
* Account for ATmega32A's single TIMSK register (MT40)
* Document hardware PWM on D4 for ATmega32A
* Add C6 and D4 to BACKLIGHT_PIN description
* new keymap for the hasu with media keys and mac layout
* switch escape and grave
* switch to the usual default
* with play and stop
* add reset on fn layer
* add mouse buttons, move reset, update copyright
* changes to keymaps
* changes to userspace
* changes to userspace
* removed reference to fc660c keymap which no longer exists from userspace readme
* removed preonic keymap
* Fix typo for RGBLIGHT config values
It doesn't make a difference right now since these are the defaults in
rgblight.h (which I'm just setting explicitly since some of the keyboard
configs change these defaults). However, I'd rather be explicit, so
fixing my typo. :)
* Remove mouse keys layer from Quefrency keymap
It's a fun idea, but I never use it in practice.
* Planck: layout macro refactor
Unified layout macro names across AVR and ARM boards.
Currently certain layout macros are specific to either AVR or ARM when used in the QMK Configurator. If an AVR-specific macro is used for a Planck rev. 6, or an ARM-specific macro on a rev. 5 or earlier, the user receives a compile error.
* Update keyboards/planck/planck.h per @drashna
Changed KC_LAYOUT_ortho_4x12 alias to LAYOUT_kc_ortho_4x12.
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Add KC_KEYMAP alias for LAYOUT_kc macro
per @drashna
Update keyboards/planck/planck.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Fix LAYOUT_planck_1x2uC macro for Planck rev6
Thanks to drashna for testing.
* Fix inline comment regarding revisions
* Add specific info.json file for Planck rev6
* Adding led support for Plaid
* Adding led support for Plaid
* Update readme.md
Fixing bad markdown
* Adding my personal keymap
* Clarifying LED instructions / formatting
* modify oled_driver to support SH1106
also:
- improve mechanism to specify which OLED IC we use
- comment calc_bounds()
- give OLED_COLUMN_OFFSET a default value
- inline comment re: OLED MEMORY_MODE and SH1106
- update docs/feature_oled_driver.h for SH1106 support and related changes
- docs: OLED: note we have tested SSD1306 on ARM boards (per @XScorpion2)
- define out MEMORY_MODE when using SH1106 OLED driver
* document that SSD1306 128x64 on AVR works
Per @XScorpion2: https://github.com/qmk/qmk_firmware/pull/5787#discussion_r291837842
* Add vlukash CrKbd keymap to support trackpad adapter.
The trackpad adapter uses Elite-C board that has five extra pins.
Also SPI pins are taken for trackpad, keymap config updates column data
pins for matrix scan.
* Update vlukash keymap
* Enable pointing devide, configure mouse BTN1
* Set TAPPING_TERM to 300
* Add support for the BlackBerry 8520 trackpad
* Add vlukash keymap for master-right no-trackpad version
* Remap backspace
* Set EXTRAKEY_ENABLE = yes
* Update thumb keys mappings
* Set bootloader to atmel-dfu
* Sync keymap
* Add scrolling support
* Make debug LEDS conditional
* Add support for both flex and no-flex PCBs
* Add readme and rename root folders
* Update readme file with blog link
* Fix readme file formatting
* Remove ADJUST keycode, code cleanup.
* Add Win key to the keymap.
* add calbatr0ss dz60 layout
* add media controls
* add media next/prev controls
* add base layer for windows and macos
* swap right ctrl and menu
* missing bracket
* update gitignore
* niu_mini uses dfu bootloader rather than the afrdude bootloader
modified: readme.md
* Change rules in rules.mk to reflect the bootloader change
modified: keyboards/niu_mini/rules.mk
* Add 60_ansi_split_bs_rshift layout to DZ60
I know there's already a lot of DZ60 layout macros, and #4668 suggests
they should be refactored at some point, but since this is one of the
standard layouts already in QMK that this PCB supports, I figured it was
okay to add so that DZ60 keyboards can share this layout with other
keyboards.
* New 60% ANSI split backspace/right-shift layout
I'm using this on a DZ60, but it should work fine on most 60% PCBs. It's
basically a HHKB layout with a standard ANSI bottom row (3x 1.25U mods,
6.25U spacebar, 4x 1.25U mods).
* martenwuut's original code commit
* delete random directory that is the same as the parent directory
* get this compiling
* update readmes
* add manufacturer
* fix up the keymap error and replace KC_A with KC_1
* add verc support which is basically just at trimmed down verb
* update keymap readme to specify which redscarf it is
* add parent level readme
* fix grammar
* fix up readmes and put in alternative name for PCBs
* add configurator support for the ver.c pcb
* add configurator support for Ver.B (RS78) pcb
* add iso support for Ver.C (RS68)
* change DEBOUNCING_DELAY to just DEBOUNCE
* remove K2C to fit the default layouts
* fix keymap
* fixup configurator layout with split backspace
A delay of 10ms seems sufficient. Otherwise, media keys tapped from the
encoder of my BDN9 macropad only seem to get picked up by the OS
(Windows 10) some of the time.
* Candybar: updated rules.mk
Disabled console and command to get compiled size under flash space limitations.
* Candybar: Enable LINK_TIME_OPTIMIZATION_ENABLE
* [Keymap] iris@nstickney: improve RGB init
Perfecting the rgb backlight initialization with a delay for each
color; also start and stop the animation at the "default layer"
color.
* [Keymap] iris,ergodox@nstickney fix FN on SYMB
The function key was not operational on the SYMB and SYSH layers due
to other keycodes being mapped over MO() on those layers. The
offending keycodes have been moved to other keys.
* [Keymap] add @nstickney's userspace
Pulled common code out to a userspace directory for my iris and
ergodox keymaps.
* [Keymap] iris@nstickney add image to README
Added an image from keyboard-layout-editor.com to meet the README
standard.
* iris@nstickney hue values now `uint8_t` (#6050)
* Remove all Copyrighted Sounds and Songs
This removes any song that has a license/copyright on them.
Additionally, it adds the license information for any song that remains.
* Add removed song list
Can be reverted if we'd rather do that
* Use newer coding conventions
* Fix typo
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* Revert copyright date
* Update quantum/audio/song_list.h
Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>
* faq_general.md to Chinese
faq_general.md to Chinese
faq finished
* custom_quantum_functions.md to Chinese
custom_quantum_functions.md to Chinese
* custom_quantum_functions.md fix
custom_quantum_functions.md fix
* custom_quantum_functions.md fix translate
custom_quantum_functions.md fix translate
* !ver.English! _summary.md bug fix
_summary.md bug fix of English doc. add".md" behind "feature_combo"
* !ver.English! custom_quantum_functions.md fix#5869
custom_quantum_functions.md in English : delete redundant "is" . issue#5869
* !ver.English! how_keyboards_work.md link fix
change
https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
to
https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_input
"#Hexadecimal_code_input" not exist
* !English! how_keyboards_work.md add missing "t"
Tied to a specific OS a a time (need recompilation when changing OS);
change to
Tied to a specific OS at a time (need recompilation when changing OS);
* _summary.md improve translation
_summary.md improve translation
* reference_glossary.md into Chinese
reference_glossary.md into Chinese
术语表翻译,这个术语表英文版似乎不太全,应该补充英文版,并在中文版添加其他具有中国特色的术语。
* Dimple: fix unintended LED behaviour
The LED was always-on if the custom keymap did not call dimple_led_off()
at least once.
* Dimple: LED code fixup
* correct indicator light states.
function of indicator lights was inverted. these changes correct that.
* flesh out keymaps pre production
* Enable extrakey in rules
* 8-Pack Macropad
* Added MANUFACTUTER to config.h
* Fix the mirrored keymaps by creating rev1.1 and rev1.2 layouts, then using them in the keymaps
* fixes from code review comments
* Use revisions to manage the different layouts for rev1.1 and rev1.2
* Add DEFAULT_FOLDER to fix default build failures
* code review comments fixes
* code review comments fixes
I2C timing parameters were seemingly set up for an STM32F303 target MCU, at a specific clock speed. This commit allows specifying the timing parameters via config.h, allowing other STM32 MCUs to be targeted, potentially at different clock frequencies.
Alternate function modes for the I2C pins are now also configurable, allowing for remapping to other pins.
* Generate project, fill in the details
* Repair json
* Separate keymaps to numpad and all-1U
* Apply suggestions from code review
Co-Authored-By: Elliot Powell <32494740+e11i0t23@users.noreply.github.com>
Co-Authored-By: Drashna Jaelre <drashna@live.com>
* Begin work
* Make things a tad easier to read
* Fix spacing
* Get things compiling
* Build a variety of generic keymaps
* Correct RGB pin
* Add configurator json
* Apply suggestions from code review
Co-Authored-By: Elliot Powell <32494740+e11i0t23@users.noreply.github.com>
Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com>
* Remove JJ50 data from YMD96
JJ50 was actually added as its own keyboard when this was added in #2546. It should have been taken out then, but wasn't.
* Update ymd96.h
- use #pragma once include guard
- remove redundant file includes
* Update LAYOUT_iso macro to K<row><col> notation
* Update LAYOUT_custom macro to K<row><col> notation
* Update LAYOUT_default macro to K<row><col> notation
* Refactor default keymap
* Rename readme file to lowercase
* Rename layers enum and default layer
- renamed layers enum to layer_names
- proposed by fauxpark in Issue 5977, and I like the idea
- https://github.com/qmk/qmk_firmware/issues/5977#issuecomment-495924338
- renamed the base layer to _DEFAULT
- I think it looks nicer.
@@ -8,8 +8,17 @@ Our users, contributors, and collaborators are expected to treat each other with
* The use of sexualized language or imagery
* Unwelcome advances, sexual or otherwise
* Deliberate intimidation, stalking, or following
* Insults or derogatory comments, or personal or political attacks
* Publishing others’ private information without explicit permission
* Sustained disruption of talks or other events
* Other conduct which could reasonably be considered inappropriate in a professional setting
* Advocating for, or encouraging, any of the above behaviour
If someone is violating this Code of Conduct you may email hello@qmk.fm to bring your concern to the Members. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
# Reporting
If someone is violating this Code of Conduct, please email hello@qmk.fm or reach out to one of the Collaborators to bring it to our attention. All complaints will be reviewed and investigated.
QMK will seek to use the least punitive means available to resolve an issue. If the circumstances require asking an offender to leave, we will do that.
Reports will be taken and kept in strict confidence. You will not be required to confront an offender directly.
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.
This document marks the inaugural Breaking Change merge. A list of changes follows.
## Core code formatting with clang-format
* All core files (`drivers/`, `quantum/`, `tests/`, and `tmk_core/`) have been formatted with clang-format
* A travis process to reformat PR's on merge has been instituted
* You can use the new CLI command `qmk cformat` to format before submitting your PR if you wish.
## LUFA USB descriptor cleanup
* Some code cleanups related to the USB HID descriptors on AVR keyboards, to make them easier to read and understand
* More information: see https://github.com/qmk/qmk_firmware/pull/4871
* No behaviour changes anticipated and no keymaps modified
## Migrating `ACTION_LAYER_MOMENTARY()` entries in `fn_actions` to `MO()` 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
## Update Atreus to current code conventions
* Duplicate include guards have bypassed the expected header processing behavior
* All keymaps affected are recommended to remove duplication of `<keyboard>/config.h` to `<keyboard>/keymaps/<user>/config.h` and only provide overrides at the keymap level
## Backport changes to keymap language files from ZSA fork
* Fixes an issue in the `keymap_br_abnt2.h` file that includes the wrong source (`keymap_common.h` instead of `keymap.h`)
* Updates the `keymap_swedish.h` file to be specific to swedish, and not just "nordic" in general.
* Any keymaps using this will need to remove `NO_*` and replace it with `SE_*`.
## Update repo to use LUFA as a git submodule
*`/lib/LUFA` removed from the repo
* LUFA set as a submodule, pointing to qmk/lufa
* This should allow more flexibility with LUFA, and allow us to keep the sub-module up to date, a lot more easily. It was ~2 years out of date with no easy path to fix that. This prevents that from being an issue in the future
## Migrating `ACTION_BACKLIGHT_*()` entries in `fn_actions` to `BL_` keycodes
*`fn_actions` is deprecated, and its functionality has been superseded by direct keycodes and `process_record_user()`
* All keymaps using these actions have had the relevant `KC_FN*` keys replaced with the equivalent `BL_*` keys
* If you currently use `KC_FN*` you will need to replace `fn_actions` with the [custom keycode](https://docs.qmk.fm/#/custom_quantum_functions) and [macro](https://docs.qmk.fm/#/feature_macros) features
## Remove `KC_DELT` alias in favor of `KC_DEL`
*`KC_DELT` was a redundant, undocumented alias for `KC_DELETE`
* It has been removed and all its uses replaced with the more common `KC_DEL` alias
* Around 90 keymaps (mostly for ErgoDox boards) have been modified as a result
@@ -6,15 +6,15 @@ This guide is catered towards advance users and assumes you can compile an ARM c
## Installing the software
The main objective here is to get the MCU Eclipse IDE correcly installed on our machine. The necesarry instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide.
The main objective here is to get the MCU Eclipse IDE correctly installed on our machine. The necessary instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide.
### The xPack Manager
This tool is a software package manager and it is used to help us get the necesarry depencencies.
This tool is a software package manager and it is used to help us get the necessary dependencies.
XPM runs using Node.js so grab that form [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the instalation was successful.
XPM runs using Node.js so grab that from [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the installation was successful.
XPM instalation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version.
XPM installation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version.
### The ARM Toolchain
@@ -26,10 +26,10 @@ If you are using windows you need to install this!
Now its the time to install your programer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere.
If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufuturer of your tool.
Now it's time to install your programmer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere.
If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufacturer of your tool.
### OpenOCD
@@ -84,4 +84,4 @@ Reset your keyboard.
Press the bug icon and if all goes well you should soon find yourself in the debug perspective. Here the program counter will pause at the beginning of the main function and way for you to press Play. Most of the features of all debuggers work on ARM MCUs but for exact details google is your friend!
This document describes QMK's Breaking Change process. A Breaking Change is any change which modifies how QMK behaves in a way that in incompatible or potentially dangerous. We limit these changes so that users can have confidence that updating their QMK tree will not break their keymaps.
The breaking change period is when we will merge PR's that change QMK in dangerous or unexpected ways. There is a built-in period of testing so we are confident that any problems caused are rare or unable to be predicted.
## What has been included in past Breaking Changes?
* [2019 Aug 30](ChangeLog/20190830.md)
## When is the next Breaking Change?
The next Breaking Change is scheduled for Nov 29.
### Important Dates
* [x] 2019 Sep 21 - `future` is created. It will be rebased weekly.
* [ ] 2019 Nov 01 - `future` closed to new PR's.
* [ ] 2019 Nov 01 - Call for testers.
* [ ] 2019 Nov 27 - `master` is locked, no PR's merged.
* [ ] 2019 Nov 29 - Merge `future` to `master`.
* [ ] 2019 Nov 30 - `master` is unlocked. PR's can be merged again.
## What changes will be included?
To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `future` is closed, and a PR with that label applied is not guaranteed to be merged.
If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `future` closes. After `future` closes no new breaking changes will be accepted.
Criteria for acceptance:
* PR is complete and ready to merge
* PR has a ChangeLog
# Checklists
This section documents various processes we use when running the Breaking Changes process.
## Rebase `future` from `master`
This is run every Friday while `future` is open.
Process:
```
cd qmk_firmware
git checkout master
git pull --ff-only
git checkout future
git rebase master
git push --force
```
## Creating the `future` branch
This happens immediately after the previous `future` branch is merged.
*`qmk_firmware` git commands
* [ ]`git checkout master`
* [ ]`git pull --ff-only`
* [ ]`git checkout -b future`
* [ ] Edit `readme.md`
* [ ] Add a big notice at the top that this is a testing branch.
* [ ] Include a link to this document
* [ ]`git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ]`git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ]`git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
* [ ]`git push origin future`
* [ ]`git push --tags`
## 4 Weeks Before Merge
*`future` is now closed to new PR's, only fixes for current PR's may be merged
* Post call for testers
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 1 Week Before Merge
* Announce that master will be closed from <2DaysBefore> to <DayofMerge>
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 2 Days Before Merge
* Announce that master is closed for 2 days
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## Day Of Merge
*`qmk_firmware` git commands
* [ ]`git checkout future`
* [ ]`git pull --ff-only`
* [ ]`git rebase origin/master`
* [ ] Edit `readme.md`
* [ ] Remove the notes about `future`
* [ ] Roll up the ChangeLog into one file.
* [ ]`git commit -m 'Merge point for <DATE> Breaking Change'`
This page describes how to setup and use the QMK CLI.
# 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
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)
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
```
brew tap qmk/qmk
brew install qmk
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
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:
```
pip3 install qmk
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
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:
* Follow best practices for your OS when they conflict with these guidelines
* 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 compile`
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm> or compile keymaps in the repo.
**Usage for Configurator Exports**:
```
qmk compile <configuratorExport.json>
```
**Usage for Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
## `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 config`
This command lets you configure the behavior of QMK. For the full `qmk config` documentation see [CLI Configuration](cli_configuration.md).
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.
## Simple Example
As an example let's look at the command `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
There are two command line arguments that could be read from configuration instead:
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
Now I can run `qmk compile` without specifying my keyboard and keymap each time.
## Setting User Defaults
Sometimes you want to share a setting between multiple commands. For example, multiple commands take the argument `--keyboard`. Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument.
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
# CLI Documentation (`qmk config`)
The `qmk config` command is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form:
<subcommand|general|default>[.<key>][=<value>]
## Setting Configuration Values
You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full `<section>.<key>` form.
Example:
```
$ qmk config default.keymap=default
default.keymap: None -> default
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Reading Configuration Values
You can read configuration values for the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value.
### Entire Configuration Example
qmk config
### Whole Section Example
qmk config compile
### Single Key Example
qmk config compile.keyboard
### Multiple Keys Example
qmk config user compile.keyboard compile.keymap
## Deleting Configuration Values
You can delete a configuration value by setting it to the special string `None`.
Example:
```
$ qmk config default.keymap=None
default.keymap: default -> None
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Multiple Operations
You can combine multiple read and write operations into a single command. They will be executed and displayed in order:
This document has useful information for developers wishing to write new `qmk` subcommands.
# Overview
The QMK CLI operates using the subcommand pattern made famous by git. The main `qmk` script is simply there to setup the environment and pick the correct entrypoint to run. Each subcommand is a self-contained module with an entrypoint (decorated by `@cli.subcommand()`) that performs some action and returns a shell returncode, or None.
# Subcommands
[MILC](https://github.com/clueboard/milc) is the CLI framework `qmk` uses to handle argument parsing, configuration, logging, and many other features. It lets you focus on writing your tool without wasting your time writing glue code.
Subcommands in the local CLI are always found in `qmk_firmware/lib/python/qmk/cli`.
Let's start by looking at an example subcommand. This is `lib/python/qmk/cli/hello.py`:
```python
"""QMK Python Hello World
This is an example QMK CLI script.
"""
frommilcimportcli
@cli.argument('-n','--name',default='World',help='Name to greet.')
@cli.subcommand('QMK Hello World.')
defhello(cli):
"""Log a friendly greeting.
"""
cli.log.info('Hello, %s!',cli.config.hello.name)
```
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
# User Interaction
MILC and the QMK CLI have several nice tools for interacting with the user. Using these standard tools will allow you to colorize your text for easier interactions, and allow the user to control when and how that information is displayed and stored.
## Printing Text
There are two main methods for outputting text in a subcommand- `cli.log` and `cli.echo()`. They operate in similar ways but you should prefer to use `cli.log.info()` for most general purpose printing.
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.5/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
You should never use the format operator (`%`) directly, always pass values as arguments.
### Logging (`cli.log`)
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
Sometimes you simply need to print text outside of the log system. This is appropriate if you are outputting fixed data or writing out something that should never be logged. Most of the time you should prefer `cli.log.info()` over `cli.echo`.
### Colorizing Text
You can colorize the output of your text by including color tokens within text. Use color to highlight, not to convey information. Remember that the user can disable color, and your subcommand should still be usable if they do.
You should generally avoid setting the background color, unless it's integral to what you are doing. Remember that users have a lot of preferences when it comes to their terminal color, so you should pick colors that work well against both black and white backgrounds.
Colors prefixed with 'fg' will affect the foreground (text) color. Colors prefixed with 'bg' will affect the background color.
There are also control sequences that can be used to change the behavior of
ANSI output:
| Control Sequences | Description |
|-------------------|-------------|
| {style_bright} | Make the text brighter |
| {style_dim} | Make the text dimmer |
| {style_normal} | Make the text normal (neither `{style_bright}` nor `{style_dim}`) |
| {style_reset_all} | Reset all text attributes to default. (This is automatically added to the end of every string.) |
| {bg_reset} | Reset the background color to the user's default |
| {fg_reset} | Reset the foreground color to the user's default |
# Arguments and Configuration
QMK handles the details of argument parsing and configuration for you. When you add a new argument it is automatically incorporated into the config tree based on your subcommand's name and the long name of the argument. You can access this configuration in `cli.config`, using either attribute-style access (`cli.config.<subcommand>.<argument>`) or dictionary-style access (`cli.config['<subcommand>']['<argument>']`).
Under the hood QMK uses [ConfigParser](https://docs.python.org/3/library/configparser.html) to store configurations. This gives us an easy and straightforward way to represent the configuration in a human-editable way. We have wrapped access to this configuration to provide some nicities that ConfigParser does not normally have.
## Reading Configuration Values
You can interact with `cli.config` in all the ways you'd normally expect. For example the `qmk compile` command gets the keyboard name from `cli.config.compile.keyboard`. It does not need to know whether that value came from the command line, an environment variable, or the configuration file.
You can set configuration values in the usual ways.
Dictionary style:
```
cli.config['<section>']['<key>'] = <value>
```
Attribute style:
```
cli.config.<section>.<key> = <value>
```
## Deleting Configuration Values
You can delete configuration values in the usual ways.
Dictionary style:
```
del(cli.config['<section>']['<key>'])
```
Attribute style:
```
del(cli.config.<section>.<key>)
```
## Writing The Configuration File
The configuration is not written out when it is changed. Most commands do not need to do this. We prefer to have the user change their configuration deliberitely using `qmk config`.
You can use `cli.save_config()` to write out the configuration.
## Excluding Arguments From Configuration
Some arguments should not be propagated to the configuration file. These can be excluded by adding `arg_only=True` when creating the argument.
Example:
```
@cli.argument('-o', '--output', arg_only=True, help='File to write to')
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
* We indent using four (4) spaces (soft tabs)
* We use a modified One True Brace Style
* Opening Brace: At the end of the same line as the statement that opens the block
* Closing Brace: Lined up with the first character of the statement that opens the block
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
* Optional Braces: Always include optional braces.
* Good: if (condition) { return false; }
* Bad: if (condition) return false;
* We encourage use of C style comments: `/* */`
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`)
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
* Do not put whitespace between `#` and `if`.
* When deciding how (or if) to indent directives keep these points in mind:
* Readability is more important than consistency.
* Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
* When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
Here is an example for easy reference:
```c
/* Enums for foo */
enumfoo_state{
FOO_BAR,
FOO_BAZ,
};
/* Returns a value */
intfoo(void){
if(some_condition){
returnFOO_BAR;
}else{
return-1;
}
}
```
# Auto-formatting with clang-format
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) is part of LLVM and can automatically format your code for you, because ain't nobody got time to do it manually. We supply a configuration file for it that applies most of the coding conventions listed above. It will only change whitespace and newlines, so you will still have to remember to include optional braces yourself.
Use the [full LLVM installer](http://llvm.org/builds/) to get clang-format on Windows, or use `sudo apt install clang-format` on Ubuntu.
If you run it from the command-line, pass `-style=file` as an option and it will automatically find the .clang-format configuration file in the QMK root directory.
If you use VSCode, the standard C/C++ plugin supports clang-format, alternatively there is a [separate extension](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) for it.
Some things (like LAYOUT macros) are destroyed by clang-format, so either don't run it on those files, or wrap the sensitive code in `// clang-format off` and `// clang-format on`.
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
* We target Python 3.5 for compatability with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* We require useful docstrings for all functions.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
* Some of our practices conflict with the wider python community to make our codebase more approachable to non-pythonistas.
# YAPF
You can use [yapf](https://github.com/google/yapf) to style your code. We provide a config in [setup.cfg](setup.cfg).
# Imports
We don't have a hard and fast rule for when to use `import ...` vs `from ... import ...`. Understandability and maintainability is our ultimate goal.
Generally we prefer to import specific function and class names from a module to keep code shorter and easier to understand. Sometimes this results in a name that is ambiguous, and in such cases we prefer to import the module instead. You should avoid using the "as" keyword when importing, unless you are importing a compatability module.
Imports should be one line per module. We group import statements together using the standard python rules- system, 3rd party, local.
Do not use `from foo import *`. Supply a list of objects you want to import instead, or import the whole module.
## Import Examples
Good:
```
from qmk import effects
effects.echo()
```
Bad:
```
from qmk.effects import echo
echo() # It's unclear where echo comes from
```
Good:
```
from qmk.keymap import compile_firmware
compile_firmware()
```
OK, but the above is better:
```
import qmk.keymap
qmk.keymap.compile_firmware()
```
# Statements
One statement per line.
Even when allowed (EG `if foo: bar`) we do not combine 2 statements onto a single line.
Function names, variable names, and filenames should be descriptive; eschew abbreviation. In particular, do not use abbreviations that are ambiguous or unfamiliar to readers outside your project, and do not abbreviate by deleting letters within a word.
Always use a .py filename extension. Never use dashes.
## Names to Avoid
* single character names except for counters or iterators. You may use "e" as an exception identifier in try/except statements.
* dashes (-) in any package/module name
* __double_leading_and_trailing_underscore__ names (reserved by Python)
# Docstrings
To maintain consistency with our docstrings we've set out the following guidelines.
* Use markdown formatting
* Always use triple-dquote docstrings with at least one linebreak: `"""\n"""`
* First line is a short (<70char)descriptionofwhatthefunctiondoes
* key combination that allows the use of magic commands (useful for debugging)
*`#define USB_MAX_POWER_CONSUMPTION`
*`#define USB_MAX_POWER_CONSUMPTION 500`
* sets the maximum power (in mA) over USB for the device (default: 500)
*`#define SCL_CLOCK 100000L`
* sets the SCL_CLOCK speed for split keyboards. The default is `100000L` but some boards can be set to `400000L`.
*`#define USB_POLLING_INTERVAL_MS 10`
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
*`#define F_SCL 100000L`
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
## Features That Can Be Disabled
@@ -171,8 +173,8 @@ If you define these options you will enable the associated feature, which may in
* how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined.
*`#define TAP_CODE_DELAY 100`
* Sets the delay between `register_code` and `unregister_code`, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
*`#define TAP_HOLD_CAPS_DELAY 200`
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 200ms if not defined.
*`#define TAP_HOLD_CAPS_DELAY 80`
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPSLOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
## RGB Light Configuration
@@ -222,6 +224,7 @@ There are a few different ways to set handedness for split keyboards (listed in
2. Set `EE_HANDS` and flash `eeprom-lefthand.eep`/`eeprom-righthand.eep` to each half
* For boards with DFU bootloader you can use `:dfu-split-left`/`:dfu-split-right` to flash these EEPROM files
* For boards with Caterina bootloader (like stock Pro Micros), use `:avrdude-split-left`/`:avrdude-split-right`
* For boards with ARM DFU bootloader (like Proton C), use `:dfu-util-split-left`/`:dfu-util-split-right`
3. Set `MASTER_RIGHT`: Half that is plugged into the USB port is determined to be the master and right half (inverse of the default)
4. Default: The side that is plugged into the USB port is the master half and is assumed to be the left half. The slave side is the right half
@@ -248,6 +251,9 @@ There are a few different ways to set handedness for split keyboards (listed in
*`#define MATRIX_COL_PINS_RIGHT { <col pins> }`
* If you want to specify a different pinout for the right half than the left half, you can define `MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT`. Currently, the size of `MATRIX_ROW_PINS` must be the same as `MATRIX_ROW_PINS_RIGHT` and likewise for the definition of columns.
* If you want to specify a different direct pinout for the right half than the left half, you can define `DIRECT_PINS_RIGHT`. Currently, the size of `DIRECT_PINS` must be the same as `DIRECT_PINS_RIGHT`.
*`#define RGBLED_SPLIT { 6, 6 }`
* See [RGB Light Configuration](#rgb-light-configuration)
@@ -261,6 +267,14 @@ There are a few different ways to set handedness for split keyboards (listed in
* 4: about 26kbps
* 5: about 20kbps
*`#define SPLIT_USB_DETECT`
* Detect (with timeout) USB connection when delegating master/slave
* Default behavior for ARM
* Required for AVR Teensy
*`#define SPLIT_USB_TIMEOUT 2500`
* Maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`
# The `rules.mk` File
This is a [make](https://www.gnu.org/software/make/manual/make.html) file that is included by the top-level `Makefile`. It is used to set some information about the MCU that we will be compiling for as well as enabling and disabling certain features.
@@ -289,19 +303,20 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
*`halfkay`
*`caterina`
*`bootloadHID`
*`USBasp`
## 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.
*`BOOTMAGIC_ENABLE`
* Virtual DIP switch configuration(+1000)
* Virtual DIP switch configuration
*`MOUSEKEY_ENABLE`
* Mouse keys(+4700)
* Mouse keys
*`EXTRAKEY_ENABLE`
* Audio control and System control(+450)
* Audio control and System control
*`CONSOLE_ENABLE`
* Console for debug(+400)
* Console for debug
*`COMMAND_ENABLE`
* Commands for debug and configuration
*`COMBO_ENABLE`
@@ -333,7 +348,7 @@ Use these to enable or disable building certain features. The more you have enab
*`NO_USB_STARTUP_CHECK`
* Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master.
*`LINK_TIME_OPTIMIZATION_ENABLE`
= Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
= Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
@@ -54,72 +54,20 @@ Never made an open source contribution before? Wondering how contributions work
# Coding Conventions
Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines:
Most of our style is pretty easy to pick up on. If you are familiar with either C or Python you should not have too much trouble with our local styles.
*We indent using four (4) spaces (soft tabs)
*We use a modified One True Brace Style
* Opening Brace: At the end of the same line as the statement that opens the block
* Closing Brace: Lined up with the first character of the statement that opens the block
* Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line.
* Optional Braces: Always include optional braces.
* Good: if (condition) { return false; }
* Bad: if (condition) return false;
* We encourage use of C style comments: `/* */`
* Think of them as a story describing the feature
* Use them liberally to explain why particular decisions were made.
* Do not write obvious comments
* If you not sure if a comment is obvious, go ahead and include it.
* In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns.
* We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`)
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
* Do not put whitespace between `#` and `if`.
* When deciding how (or if) to indent directives keep these points in mind:
* Readability is more important than consistency.
* Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
* When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
Here is an example for easy reference:
```c
/* Enums for foo */
enumfoo_state{
FOO_BAR,
FOO_BAZ,
};
/* Returns a value */
intfoo(void){
if(some_condition){
returnFOO_BAR;
}else{
return-1;
}
}
```
# Auto-formatting with clang-format
[Clang-format](https://clang.llvm.org/docs/ClangFormat.html) is part of LLVM and can automatically format your code for you, because ain't nobody got time to do it manually. We supply a configuration file for it that applies most of the coding conventions listed above. It will only change whitespace and newlines, so you will still have to remember to include optional braces yourself.
Use the [full LLVM installer](http://llvm.org/builds/) to get clang-format on Windows, or use `sudo apt install clang-format` on Ubuntu.
If you run it from the command-line, pass `-style=file` as an option and it will automatically find the .clang-format configuration file in the QMK root directory.
If you use VSCode, the standard C/C++ plugin supports clang-format, alternatively there is a [separate extension](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat) for it.
Some things (like LAYOUT macros) are destroyed by clang-format, so either don't run it on those files, or wrap the sensitive code in `// clang-format off` and `// clang-format on`.
We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making.
* Separate PR's into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
* Separate PRs into logical units. For example, do not submit one PR covering two separate features, instead submit a separate PR for each feature.
* Check for unnecessary whitespace with `git diff --check` before committing.
* Make sure your code change actually compiles.
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return an error
* Keyboards: Make sure that `make keyboard:all` does not return any errors
* Keymaps: Make sure that `make keyboard:your_new_keymap` does not return any errors.
* Keyboards: Make sure that `make keyboard:all` does not return any errors.
* Core: Make sure that `make all` does not return any errors.
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
@@ -131,6 +79,8 @@ The kerpleplork was intermittently failing with error code 23. The root cause wa
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
```
!> **IMPORTANT:** If you would like to contribute a bugfix or improvement to user code, such as non-default keymaps, userspace and layouts, be sure to tag the original submitter of the code in your PR. Many users, regardless of skill level with Git and GitHub, may be confused or frustrated at their code being modified without their knowledge.
## Documentation
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
@@ -267,7 +267,7 @@ You should use this function if you need custom matrix scanning code. It can als
If the board supports it, it can be "idled", by stopping a number of functions. A good example of this is RGB lights or backlights. This can save on power consumption, or may be better behavior for your keyboard.
This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system is board is idled and when it wakes up, respectively.
This is controlled by two functions: `suspend_power_down_*` and `suspend_wakeup_init_*`, which are called when the system board is idled and when it wakes up, respectively.
### Example suspend_power_down_user() and suspend_wakeup_init_user() Implementation
@@ -297,8 +297,8 @@ This runs code every time that the layers get changed. This can be useful for l
This example shows how to set the [RGB Underglow](feature_rgblight.md) lights based on the layer, using the Planck as an example
The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.
QMK presents itself to the host as a regular HID keyboard device, and as such requires no special drivers. However, in order to flash your keyboard on Windows, the bootloader device that appears when you reset the board often *does*.
There are two notable exceptions: the Caterina bootloader, usually seen on Pro Micros, and the HalfKay bootloader shipped with PJRC Teensys, appear as a serial port and a generic HID device respectively, and so do not require a driver.
We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have set up the development environment with MSYS2 or WSL, the `qmk_install.sh` script will have asked if you want it to install the drivers for you.
## Installation
Put your keyboard into bootloader mode, either by hitting the `RESET` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic](feature_bootmagic.md) docs for more details). Some boards use [Command](feature_command.md) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic Lite](feature_bootmagic.md#bootmagic-lite) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
To put a device in bootloader mode with USBaspLoader, tap the `RESET` button while holding down the `BOOT` button.
Alternatively, hold `BOOT` while inserting the USB cable.
Zadig will automatically detect the bootloader device. You may sometimes need to check **Options → List All Devices**.
- For keyboards with Atmel AVR MCUs, the bootloader will be named something similar to `ATm32U4DFU`, and have a Vendor ID of `03EB`.
- USBasp bootloaders will appear as `USBasp`, with a VID/PID of `16C0:05DC`.
- AVR keyboards flashed with the QMK-DFU bootloader will be named `<keyboard name> Bootloader` and will also have the VID `03EB`.
- For most ARM keyboards, it will be called `STM32 BOOTLOADER`, and have a VID/PID of `0483:DF11`.
!> If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is probably not in bootloader mode. The arrow will be colored orange and you will be asked to confirm modifying a system driver. **Do not** proceed if this is the case!
If the arrow appears green, select the driver, and click **Install Driver**. The `libusb-win32` driver will usually work for AVR, and `WinUSB` for ARM, but if you still cannot flash the board, try installing a different driver from the list. For flashing a USBaspLoader device via command line with msys2, the `libusbk` driver is recommended, otherwise `libusb-win32` will work fine if you are using QMK Toolbox for flashing.

Finally, unplug and replug the keyboard to make sure the new driver has been loaded. If you are using the QMK Toolbox to flash, exit and restart it too, as it can sometimes fail to recognize the driver change.
## Recovering from Installation to Wrong Device
If you find that you can no longer type with the keyboard, you may have accidentally replaced the driver for the keyboard itself instead of for the bootloader. This can happen when the keyboard is not in the bootloader mode. You can easily confirm this in Zadig - a healthy keyboard has the `HidUsb` driver installed on all of its interfaces:

Open the Device Manager and look for a device that looks like your keyboard.

Right-click it and hit **Uninstall device**. Make sure to tick **Delete the driver software for this device** first.

Click **Action → Scan for hardware changes**. At this point, you should be able to type again. Double check in Zadig that the keyboard device(s) are using the `HidUsb` driver. If so, you're all done, and your board should be functional again!
?> A full reboot of your computer may sometimes be necessary at this point, to get Windows to pick up the new driver.
### Serial device is not detected in bootloader mode on Linux
Make sure your kernel has appropriate support for your device. If your device uses USB ACM, such as
Pro Micro (Atmega32u4), make sure to include `CONFIG_USB_ACM=y`. Other devices may require `USB_SERIAL` and any of its sub options.
## Unknown Device for DFU Bootloader
If you're using Windows to flash your keyboard, and you are running into issues, check the Device Manager. If you see an "Unknown Device" when the keyboard is in "bootloader mode", then you may have a driver issue.
Issues encountered when flashing keyboards on Windows are most often due to having the wrong drivers installed for the bootloader, or none at all.
Re-running the installation script for MSYS2 may help (eg run `./util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue.
If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, find the device in question, and select the `WinUSB` option, and hit "Reinstall driver". Once you've done that, try flashing your board, again. If that doesn't work, try all of the options, until one works.
?> There isn't a best option for which driver should be used here. Some options work better on some systems than others. libUSB and WinUSB seem to be the best options here.
If the bootloader doesn't show up in the list for devices, you may need to enable the "List all devices" option in the `Options` menu, and then find the bootloader in question.
Re-running the QMK installation script (`./util/qmk_install.sh` from the `qmk_firmware` directory in MSYS2 or WSL) or reinstalling the QMK Toolbox may fix the issue. Alternatively, you can download and run the [`qmk_driver_installer`](https://github.com/qmk/qmk_driver_installer) package manually.
If that doesn't work, then you may need to download and run Zadig. See [Bootloader Driver Installation with Zadig](driver_installation_zadig.md) for more detailed information.
## WINAVR is Obsolete
It is no longer recommended and may cause some problem.
@@ -140,8 +161,8 @@ For now, you need to rollback avr-gcc to 7 in brew.
```
brew uninstall --force avr-gcc
brew install avr-gcc@7
brew link --force avr-gcc@7
brew install avr-gcc@8
brew link --force avr-gcc@8
```
### I just flashed my keyboard and it does nothing/keypresses don't register - it's also ARM (rev6 planck, clueboard 60, hs60v2, etc...) (Feb 2019)
- EEPROM has around a 100000 write cycle. You shouldn't rewrite the
firmware repeatedly and continually; that'll burn the EEPROM
eventually.
## NKRO Doesn't work
First you have to compile firmware with this build option `NKRO_ENABLE` in **Makefile**.
@@ -183,22 +184,15 @@ Pressing any key during sleep should wake host.
Arduino Leonardo and micro have **ATMega32U4** and can be used for TMK, though Arduino bootloader may be a problem.
## Enabling JTAG
## Using PF4-7 Pins of USB AVR?
You need to set JTD bit of MCUCR yourself to use PF4-7 as GPIO. Those pins are configured to serve JTAG function by default. MCUs like ATMega*U* or AT90USB* are affected with this.
By default, the JTAG debugging interface is disabled as soon as the keyboard starts up. JTAG-capable MCUs come from the factory with the `JTAGEN` fuse set, and it takes over certain pins of the MCU that the board may be using for the switch matrix, LEDs, etc.
If you are using Teensy this isn't needed. Teensy is shipped with JTAGEN fuse bit unprogrammed to disable the function.
If you would like to keep JTAG enabled, just add the following to your `config.h`:
See this code.
```c
#define NO_JTAG_DISABLE
```
// JTAG disable for PORT F. write JTD bit twice within four cycles.
[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).
### Why the Name Quantum?
<!-- FIXME -->
## 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.
@@ -256,10 +256,10 @@ If you press a Mod Tap key, tap another key (press and release) and then release
For Instance:
-`SHFT_T(KC_A)` Down
-`SFT_T(KC_A)` Down
-`KC_X` Down
-`KC_X` Up
-`SHFT_T(KC_A)` 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`).
@@ -279,9 +279,9 @@ Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_
For Instance:
-`SHFT_T(KC_A)` Down
-`SFT_T(KC_A)` Down
-`KC_X` Down
-`SHFT_T(KC_A)` Up
-`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`).
@@ -303,11 +303,11 @@ When the user holds a key after tap, this repeats the tapped key rather to hold
Example:
- SHFT_T(KC_A) Down
- SHFT_T(KC_A) Up
- SHFT_T(KC_A) Down
- SFT_T(KC_A) Down
- SFT_T(KC_A) Up
- SFT_T(KC_A) Down
- wait more than tapping term...
- SHFT_T(KC_A) Up
- 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.
Many keyboards support backlit keys by way of individual LEDs placed through or underneath the keyswitches. QMK is able to control the brightness of these LEDs by switching them on and off rapidly in a certain ratio, a technique known as *Pulse Width Modulation*, or PWM. By altering the duty cycle of the PWM signal, it creates the illusion of dimming.
Many keyboards support backlit keys by way of individual LEDs placed through or underneath the keyswitches. This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously install multiple different single coloured LEDs on a keyboard.
QMK is able to control the brightness of these LEDs by switching them on and off rapidly in a certain ratio, a technique known as *Pulse Width Modulation*, or PWM. By altering the duty cycle of the PWM signal, it creates the illusion of dimming.
The MCU can only supply so much current to its GPIO pins. Instead of powering the backlight directly from the MCU, the backlight pin is connected to a transistor or MOSFET that switches the power to the LEDs.
@@ -12,9 +14,8 @@ Most keyboards have backlighting enabled by default if they support it, but if i
BACKLIGHT_ENABLE= yes
```
You should then be able to use the keycodes below to change the backlight level.
## Keycodes
Once enabled the following keycodes below can be used to change the backlight level.
@@ -26,50 +27,60 @@ You should then be able to use the keycodes below to change the backlight level.
|`BL_DEC` |Decrease the backlight level |
|`BL_BRTG`|Toggle backlight breathing |
## Caveats
## AVR driver
This feature is distinct from both the [RGB underglow](feature_rgblight.md) and [RGB matrix](feature_rgb_matrix.md) features as it usually allows for only a single colour per switch, though you can obviously use multiple different coloured LEDs on a keyboard.
Hardware PWM is only supported on certain pins of the MCU, so if the backlighting is not connected to one of them, a software PWM implementation triggered by hardware timer interrupts will be used.
### Caveats
Hardware PWM is supported according to the following table:
The [audio feature](feature_audio.md) also uses hardware timers. Please refer to the following table to know what hardware timer the software PWM will use depending on the audio configuration:
All other pins will use software PWM. If the [Audio](feature_audio.md) feature is disabled or only using one timer, the backlight PWM can be triggered by a hardware timer:
When all timers are in use for [audio](feature_audio.md), the backlight software PWM will not use a hardware timer, but instead will be triggered during the matrix scan. In this case the backlight doesn't support breathing and might show lighting artifacts (for instance flickering), because the PWM computation might not be called with enough timing precision.
When both timers are in use for Audio, the backlight PWM will not use a hardware timer, but will instead be triggered during the matrix scan. In this case, breathing is not supported, and the backlight might flicker, because the PWM computation may not be called with enough timing precision.
## Configuration
### AVR Configuration
To change the behaviour of the backlighting, `#define` these in your `config.h`:
To change the behavior of the backlighting, `#define` these in your `config.h`:
|`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 15 excluding off) |
|`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 |
|`BACKLIGHT_BREATHING`|*Not defined*|Enable backlight breathing, if supported |
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|`BACKLIGHT_ON_STATE` |`0` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
## Multiple backlight pins
### 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
Most keyboards have only one backlight pin which control all backlight LEDs (especially if the backlight is connected to an hardware PWM pin).
In software PWM, it is possible to define multiple backlight pins. All those pins will be turned on and off at the same time during the PWM duty cycle.
@@ -77,13 +88,13 @@ This feature allows to set for instance the Caps Lock LED (or any other controll
To activate multiple backlight pins, you need to add something like this to your user `config.h`:
~~~c
```c
#define BACKLIGHT_LED_COUNT 2
#undef BACKLIGHT_PIN
#define BACKLIGHT_PINS { F5, B2 }
~~~
```
## Hardware PWM Implementation
### Hardware PWM Implementation
When using the supported pins for backlighting, QMK will use a hardware timer configured to output a PWM signal. This timer will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
The desired brightness is calculated and stored in the `OCRxx` register. When the counter reaches this value, the backlight pin will go low, and is pulled high again when the counter resets.
@@ -92,7 +103,7 @@ In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus th
The breathing effect is achieved by registering an interrupt handler for `TIMER1_OVF_vect` that is called whenever the counter resets, roughly 244 times per second.
In this handler, the value of an incrementing counter is mapped onto a precomputed brightness curve. To turn off breathing, the interrupt handler is simply disabled, and the brightness reset to the level stored in EEPROM.
## Software PWM Implementation
### Software PWM Implementation
When `BACKLIGHT_PIN` is not set to a hardware backlight pin, QMK will use a hardware timer configured to trigger software interrupts. This time will count up to `ICRx` (by default `0xFFFF`) before resetting to 0.
When resetting to 0, the CPU will fire an OVF (overflow) interrupt that will turn the LEDs on, starting the duty cycle.
@@ -101,6 +112,29 @@ In this way `OCRxx` essentially controls the duty cycle of the LEDs, and thus th
The breathing effect is the same as in the hardware PWM implementation.
## ARM Driver
### Caveats
Currently only hardware PWM is supported, and does not provide automatic configuration.
?> STMF072 support is being investigated.
### ARM Configuration
To change the behavior of the backlighting, `#define` these in your `config.h`:
|`BACKLIGHT_PIN` |`B7` |The pin that controls the LEDs. Unless you are designing your own keyboard, you shouldn't need to change this|
|`BACKLIGHT_PWM_DRIVER` |`PWMD4` |The PWM driver to use, see ST datasheets for pin to PWM timer mapping. Unless you are designing your own keyboard, you shouldn't need to change this|
|`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|
|`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 Functions
|Function |Description |
@@ -111,7 +145,8 @@ The breathing effect is the same as in the hardware PWM implementation.
|`backlight_step()` |Cycle through backlight levels |
|`backlight_increase()` |Increase the backlight level |
|`backlight_decrease()` |Decrease the backlight level |
|`backlight_level(x)` |Sets the backlight level to specified level |
|`backlight_level(x)` |Sets the backlight level, from 0 to |
| |`BACKLIGHT_LEVELS` |
|`get_backlight_level()` |Return the current backlight level |
|`is_backlight_enabled()`|Return whether the backlight is currently on |
The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks.
To enable this feature, yu need to add `COMBO_ENABLE = yes` to your `rules.mk`.
To enable this feature, you need to add `COMBO_ENABLE = yes` to your `rules.mk`.
Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using).
@@ -16,36 +16,36 @@ To use Command, hold down the key combination defined by the `IS_COMMAND()` macr
If you would like to change the key assignments for Command, `#define` these in your `config.h` at either the keyboard or keymap level. All keycode assignments here must omit the `KC_` prefix.
Additionally, we support bit mask functions which allow for more complex handling.
```c
voiddip_switch_update_mask_kb(uint32_tstate){
dip_switch_update_mask_user(state);
}
```
or `keymap.c`:
```c
voiddip_switch_update_mask_user(uint32_tstate){
if(state&(1UL<<0)&&state&(1UL<<1)){
layer_on(_ADJUST);// C on esc
}else{
layer_off(_ADJUST);
}
if(state&(1UL<<0)){
layer_on(_TEST_A);// A on ESC
}else{
layer_off(_TEST_A);
}
if(state&(1UL<<1)){
layer_on(_TEST_B);// B on esc
}else{
layer_off(_TEST_B);
}
}
```
## Hardware
One side of the DIP switch should be wired directly to the pin on the MCU, and the other side to ground. It should not matter which side is connected to which, as it should be functionally the same.
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes. This will use about 400 KB of extra space.
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
## Configuration
You will need to configure the pins used by your display and its number of lines and collumn in your keyboards `config.h`.
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`.
Uncomment the section labled HD44780 and change the parameters as needed.
````
@@ -25,7 +26,7 @@ Uncomment the section labled HD44780 and change the parameters as needed.
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
#define LCD_RS_PORT LCD_PORT //< port for RS line
#define LCD_RS_PIN 3 //< pin for RS line
@@ -38,14 +39,14 @@ Uncomment the section labled HD44780 and change the parameters as needed.
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h`
## Usage
## Usage
To initialize your display call lcd_init() with one of these parameters:
To initialize your display, call `lcd_init()` with one of these parameters:
````
LCD_DISP_OFF : display off
LCD_DISP_ON : display on, cursor off
LCD_DISP_ON_CURSOR : display on, cursor on
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
````
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
It is advised to clear the display before use.
@@ -53,4 +54,4 @@ To do so call `lcd_clrsrc()`.
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
There are more posible methods to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
@@ -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](quantum_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](feature_advanced_keycodes.md#one-shot-keys) 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.
128x32 OLED modules using SSD1306 driver IC over I2C. Supported on AVR based keyboards. Possible but untested hardware includes ARM based keyboards and other sized OLED modules using SSD1306 over I2C, such as 128x64.
OLED modules using SSD1306 or SH1106 driver ICs, communicating over I2C.
Tested combinations:
!> Warning: This OLED Driver currently uses the new i2c_master driver from split common code. If your split keyboard uses i2c to communication between sides this driver could cause an address conflict (serial is fine). Please contact your keyboard vendor and ask them to migrate to the latest split common code to fix this.
| SH1106 | 128x64 | AVR | No rotation or scrolling |
Hardware configurations using ARM-based microcontrollers or different sizes of OLED modules may be compatible, but are untested.
!> Warning: This OLED Driver currently uses the new i2c_master driver from split common code. If your split keyboard uses I2C to communicate between sides, this driver could cause an address conflict (serial is fine). Please contact your keyboard vendor and ask them to migrate to the latest split common code to fix this. In addition, the display timeout system to reduce OLED burn-in also uses split common to detect keypresses, so you will need to implement custom timeout logic for non-split common keyboards.
## Usage
@@ -21,7 +31,7 @@ This enables the feature and the `OLED_DRIVER_ENABLE` define. Then in your `keym
|`OLED_DISPLAY_ADDRESS` | `0x3C` | The i2c address of the OLED Display |
|`OLED_FONT_H` | `"glcdfont.c"` | The font code file to use for custom fonts |
|`OLED_FONT_START` | `0` | The starting characer index for custom fonts |
|`OLED_FONT_END` | `224` | The ending characer index for custom fonts |
|`OLED_FONT_WIDTH` | `6` | The font width |
|`OLED_FONT_HEIGHT` | `8` | The font height (untested) |
|`OLED_TIMEOUT` | `60000` | Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
| `OLED_SCROLL_TIMEOUT` | `0` | Scrolls the OLED screen after 0ms of OLED inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
| `OLED_SCROLL_TIMEOUT_RIGHT`| *Not defined* | Scroll timeout direction is right when defined, left when undefined. |
| `OLED_IC` | `OLED_IC_SSD1306` | Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
| `OLED_COLUMN_OFFSET` | `0` | (SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC. |
## 128x64 & Custom sized OLED Displays
@@ -108,16 +120,19 @@ void oled_task_user(void) {
|`OLED_DISPLAY_CUSTOM` |*Not defined* |Changes the display defines for use with custom displays.<br />Requires user to implement the below defines. |
|`OLED_DISPLAY_WIDTH` |`128` |The width of the OLED display. |
|`OLED_DISPLAY_HEIGHT` |`32` |The height of the OLED display. |
|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br />`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`|
|`OLED_BLOCK_TYPE` |`uint16_t` |The unsigned integer type to use for dirty rendering.|
|`OLED_BLOCK_COUNT` |`16` |The number of blocks the display is divided into for dirty rendering.<br />`(sizeof(OLED_BLOCK_TYPE) * 8)`|
|`OLED_BLOCK_SIZE` |`32` |The size of each block for dirty rendering<br />`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`|
|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br />`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`. |
|`OLED_BLOCK_TYPE` |`uint16_t` |The unsigned integer type to use for dirty rendering.|
|`OLED_BLOCK_COUNT` |`16` |The number of blocks the display is divided into for dirty rendering.<br />`(sizeof(OLED_BLOCK_TYPE) * 8)`. |
|`OLED_BLOCK_SIZE` |`32` |The size of each block for dirty rendering<br />`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`. |
|`OLED_COM_PINS` |`COM_PINS_SEQ` |How the SSD1306 chip maps it's memory to display.<br />Options are `COM_PINS_SEQ`, `COM_PINS_ALT`, `COM_PINS_SEQ_LR`, & `COM_PINS_ALT_LR`. |
|`OLED_SOURCE_MAP` |`{ 0, ... N }` |Precalculated source array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
|`OLED_TARGET_MAP` |`{ 24, ... N }`|Precalculated target array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
### 90 Degree Rotation - Technical Mumbo Jumbo
!> Rotation is unsupported on the SH1106.
```C
// OLED Rotation enum values are flags
typedef enum {
@@ -249,6 +264,8 @@ uint8_t oled_max_chars(void);
uint8_t oled_max_lines(void);
```
!> Scrolling and rotation are unsupported on the SH1106.
@@ -42,11 +42,11 @@ Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
constis31_ledg_is31_leds[DRIVER_LED_TOTAL]={
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0,C1_3,C2_3,C3_3},
....
}
@@ -93,11 +93,11 @@ Define these arrays listing all the LEDs in your `<keyboard>.c`:
```C
constis31_ledg_is31_leds[DRIVER_LED_TOTAL]={
/* Refer to IS31 manual for these locations
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
* driver
* | R location
* | | G location
* | | | B location
* | | | | */
{0,B_1,A_1,C_1},
....
}
@@ -374,6 +374,7 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
@@ -43,6 +43,7 @@ By default Space Cadet assumes a US ANSI layout, but if your layout uses differe
|`LAPO_KEYS` |`KC_LALT, KC_LSFT, KC_9` |Send `KC_LALT` when held, the mod `KC_LSFT` with the key `KC_9` when tapped. |
|`RAPC_KEYS` |`KC_RALT, KC_RSFT, KC_0` |Send `KC_RALT` when held, the mod `KC_RSFT` with the key `KC_0` when tapped. |
|`SFTENT_KEYS` |`KC_RSFT, KC_TRNS, SFTENT_KEY` |Send `KC_RSFT` when held, no mod with the key `SFTENT_KEY` when tapped. |
|`SPACE_CADET_MODIFIER_CARRYOVER` |*Not defined* |Store current modifiers before the hold mod is pressed and use them with the tap mod and keycode. Useful for when you frequently release a modifier before triggering Space Cadet. |
Many keyboards in the QMK Firmware repo are "split" keyboards. They use two controllers—one plugging into USB, and the second connected by a serial or an I<sup>2</sup>C connection over a TRRS or similar cable.
Split keyboards can have a lot of benefits, but there is some additional work needed to get them enabled.
QMK Firmware has a generic implementation that is usable by any board, as well as numerous board specific implementations.
For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards.
!> ARM is not yet supported for Split Keyboards. Progress is being made, but we are not quite there, yet.
## Hardware Configuration
This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves.
### Required Hardware
Apart from diodes and key switches for the keyboard matrix in each half, you will need 2x TRRS sockets and 1x TRRS cable.
Alternatively, you can use any sort of cable and socket that has at least 3 wires.
If you want to use I<sup>2</sup>C to communicate between halves, you will need a cable with at least 4 wires and 2x 4.7kΩ pull-up resistors.
#### Considerations
The most commonly used connection is a TRRS cable and jacks. These provide 4 wires, making them very useful for split keyboards, and are easy to find.
However, since one of the wires carries VCC, this means that the boards are not hot pluggable. You should always disconnect the board from USB before unplugging and plugging in TRRS cables, or you can short the controller, or worse.
Another option is to use phone cables (as in, old school RJ-11/RJ-14 cables). Make sure that you use one that actually supports 4 wires/lanes.
However, USB cables, SATA cables, and even just 4 wires have been known to be used for communication between the controllers.
!> Using USB cables for communication between the controllers works just fine, but the connector could be mistaken for a normal USB connection and potentially short out the keyboard, depending on how it's wired. For this reason, they are not recommended for connecting split keyboards.
### Serial Wiring
The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0 (aka PDO or pin 3) between the two Pro Micros.
?> Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below.

### I<sup>2</sup>C Wiring
The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0/pin 3 and PD1/pin 2, respectively) between the two Pro Micros.
The pull-up resistors may be placed on either half. It is also possible to use 4 resistors and have the pull-ups in both halves, but this is unnecessary in simple use cases.

## Firmware Configuration
To enable the split keyboard feature, add the following to your `rules.mk`:
```make
SPLIT_KEYBOARD= yes
```
If you're using a custom transport (communication method), then you will also need to add:
```make
SPLIT_TRANSPORT= custom
```
### Setting Handedness
By default, the firmware does not know which side is which; it needs some help to determine that. There are several ways to do this, listed in order of precedence.
#### Handedness by Pin
You can configure the firmware to read a pin on the controller to determine handedness. To do this, add the following to your `config.h` file:
```c
#define SPLIT_HAND_PIN B7
```
This will read the specified pin. If it's high, then the controller assumes it is the left hand, and if it's low, it's assumed to be the right side.
#### Handedness by EEPROM
This method sets the keyboard's handedness by setting a flag in the persistent storage (`EEPROM`). This is checked when the controller first starts up, and determines what half the keyboard is, and how to orient the keyboard layout.
To enable this method, add the following to your `config.h` file:
```c
#define EE_HANDS
```
However, you'll have to flash the EEPROM files for the correct hand to each controller. You can do this manually, or there are targets for avrdude and dfu to do this, while flashing the firmware:
*`:avrdude-split-left`
*`:avrdude-split-right`
*`:dfu-split-left`
*`:dfu-split-right`
*`:dfu-util-split-left`
*`:dfu-util-split-right`
This setting is not changed when re-initializing the EEPROM using the `EEP_RST` key, or using the `eeconfig_init()` function. However, if you reset the EEPROM outside of the firmware's built in options (such as flashing a file that overwrites the `EEPROM`, like how the [QMK Toolbox]()'s "Reset EEPROM" button works), you'll need to re-flash the controller with the `EEPROM` files.
You can find the `EEPROM` files in the QMK firmware repo, [here](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common).
#### Handedness by `#define`
You can set the handedness at compile time. This is done by adding the following to your `config.h` file:
```c
#define MASTER_RIGHT
```
or
```c
#define MASTER_LEFT
```
If neither are defined, the handedness defaults to `MASTER_LEFT`.
### Communication Options
Because not every split keyboard is identical, there are a number of additional options that can be configured in your `config.h` file.
```c
#define USE_I2C
```
This enables I<sup>2</sup>C support for split keyboards. This isn't strictly for communication, but can be used for OLED or other I<sup>2</sup>C-based devices.
```c
#define SOFT_SERIAL_PIN D0
```
This sets the pin to be used for serial communication. If you're not using serial, you shouldn't need to define this.
However, if you are using serial and I<sup>2</sup>C on the board, you will need to set this, and to something other than D0 and D1 (as these are used for I<sup>2</sup>C communication).
```c
#define SELECT_SOFT_SERIAL_SPEED {#}`
```
If you're having issues with serial communication, you can change this value, as it controls the communication speed for serial. The default is 1, and the possible values are:
* **`0`**: about 189kbps (Experimental only)
* **`1`**: about 137kbps (default)
* **`2`**: about 75kbps
* **`3`**: about 39kbps
* **`4`**: about 26kbps
* **`5`**: about 20kbps
### Hardware Configuration Options
There are some settings that you may need to configure, based on how the hardware is set up.
```c
#define MATRIX_ROW_PINS_RIGHT { <row pins> }
#define MATRIX_COL_PINS_RIGHT { <col pins> }
```
This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency).
This allows you to specify a different set of encoder pins for the right side.
```c
#define RGBLIGHT_SPLIT
```
This option enables synchronization of the RGB Light modes between the controllers of the split keyboard. This is for keyboards that have RGB LEDs that are directly wired to the controller (that is, they are not using the "extra data" option on the TRRS cable).
```c
#define RGBLED_SPLIT { 6, 6 }
```
This sets how many LEDs are directly connected to each controller. The first number is the left side, and the second number is the right side.
?> This setting implies that `RGBLIGHT_SPLIT` is enabled, and will forcibly enable it, if it's not.
```c
#define SPLIT_USB_DETECT
```
This option changes the startup behavior to detect an active USB connection when delegating master/slave. If this operation times out, then the half is assume to be a slave. This is the default behavior for ARM, and required for AVR Teensy boards (due to hardware limitations).
?> This setting will stop the ability to demo using battery packs.
```c
#define SPLIT_USB_TIMEOUT 2500
```
This sets the maximum timeout when detecting master/slave when using `SPLIT_USB_DETECT`.
## Additional Resources
Nicinabox has a [very nice and detailed guide](https://github.com/nicinabox/lets-split-guide) for the Let's Split keyboard, that covers most everything you need to know, including troubleshooting information.
However, the RGB Light section is out of date, as it was written long before the RGB Split code was added to QMK Firmware. Instead, wire each strip up directly to the controller.
<!-- I may port this information later, but for now ... it's very nice, and covers everything -->
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
<!-- FIXME: Break this up into multiple sections -->
## Introduction
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/qmk/qmk_firmware/pull/451). Here's how algernon describes the feature:
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
To make it clear how this is different from `ACTION_FUNCTION_TAP`, let's explore a certain setup! We want one key to send `Space` on single tap, but `Enter` on double-tap.
## Explanatory Comparison with `ACTION_FUNCTION_TAP`
`ACTION_FUNCTION_TAP` can offer similar functionality to Tap Dance, but it's worth noting some important differences. To do this, let's explore a certain setup! We want one key to send `Space` on single-tap, but `Enter` on double-tap.
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if they are typed within `TAPPING_TERM`. With the tap dance feature, that'll come out as `SPC a`, correctly.
With `ACTION_FUNCTION_TAP`, it is quite a rain-dance to set this up, and has the problem that when the sequence is interrupted, the interrupting key will be sent first. Thus, `SPC a` will result in `a SPC` being sent, if `SPC` and `a` are both typed within `TAPPING_TERM`. With the Tap Dance feature, that'll come out correctly as `SPC a` (even if both `SPC` and `a` are typed within the `TAPPING_TERM`.
The implementation hooks into two parts of the system, to achieve this: into`process_record_quantum()`, and the matrix scan. We need the latter to be able to time out a tap sequence even when a key is not being pressed, so`SPC` alone will time out and register after `TAPPING_TERM` time.
To achieve this correct handling of interrupts, the implementation of Tap Dance hooks into two parts of the system:`process_record_quantum()`, and the matrix scan. These two parts are explained below, but for now the point to note is that we need the latter to be able to time out a tap sequence even when a key is not being pressed. That way,`SPC` alone will time out and register after `TAPPING_TERM` time.
But lets start with how to use it, first!
## How to Use Tap Dance
But enough of the generalities; lets look at how to actually use Tap Dance!
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array.
First, you will need `TAP_DANCE_ENABLE=yes` in your `rules.mk`, because the feature is disabled by default. This adds a little less than 1k to the firmware size.
This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
```
#define TAPPING_TERM 175
```
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()` - takes a number, which will later be used as an index into the `tap_dance_actions` array.
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
*`ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
*`ACTION_TAP_DANCE_DUAL_ROLE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
*`ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
* This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality. Both names will work.
*`ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
*`ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
*`ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
*`ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
And that's the bulk of it!
Similar to the first option, the second option is good for simple layer-switching cases.
And now, on to the explanation of how it works!
For more complicated cases, use the third or fourth options (examples of each are listed below).
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM`time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
This means that you have `TAPPING_TERM` time to tap the key again, you do not have to input all the taps within that timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
## Implementation Details
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-dance keys.
Wrap each tapdance keycode in `TD()` when including it in your keymap, e.g. `TD(ALT_LP)`.
### Example 6: Using tap dance for momentary-layer-switch and layer-toggle keys
Tap Dance can be used to mimic MO(layer) and TG(layer) functionality. For this example, we will set up a key to function as `KC_QUOT` on single-tap, as `MO(_MY_LAYER)` on single-hold, and `TG(_MY_LAYER)` on double-tap.
The first step is to include the following code towards the beginning of your `keymap.c`:
```c
typedefstruct{
boolis_press_action;
intstate;
}tap;
//Define a type for as many tap dance states as you need
enum{
SINGLE_TAP=1,
SINGLE_HOLD=2,
DOUBLE_TAP=3
};
enum{
QUOT_LAYR=0//Our custom tap dance key; add any other tap dance keys to this enum
};
//Declare the functions to be used with your tap dance key(s)
The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is( layer )` function which returns `true` if the given `layer` is active.
The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `case:SINGLE_HOLD` works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `case:DOUBLE_TAP` works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
`tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.
> This feature is currently *huge* at 4400 bytes, and should probably only be put on boards with a lot of memory, or for fun.
> This feature is currently *huge*, and should probably only be put on boards with a lot of memory, or for fun.
The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
@@ -56,7 +56,7 @@ Outputs the last 5 commands entered
There are three Unicode keymap definition methods available in QMK:
Unicode characters can be input straight from your keyboard! There are some limitations, however.
## `UNICODE_ENABLE`
QMK has three different methods for enabling Unicode input and defining keycodes:
Supports Unicode up to `0x7FFF`. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji. The keycode function is `UC(c)` in the keymap, where _c_ is the code point's number (preferably hexadecimal, up to 4 digits long). For example: `UC(0x45B)`, `UC(0x30C4)`.
## Basic Unicode
## `UNICODEMAP_ENABLE`
This method supports Unicode code points up to `0x7FFF`. This covers characters for most modern languages, as well as symbols, but it doesn't cover emoji.
Supports Unicode up to `0x10FFFF` (all possible code points). You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(i)`, where _i_ is an array index into the mapping table. The table may contain at most 16384 entries.
Add the following to your `rules.mk`:
You may want to have an enum to make referencing easier. So, you could add something like this to your keymap file:
```make
UNICODE_ENABLE= yes
```
Then add `UC(c)` keycodes to your keymap, where _c_ is the code point (preferably in hexadecimal, up to 4 digits long). For example: `UC(0x45B)`, `UC(0x30C4)`.
## Unicode Map
This method supports all possible code points (up to `0x10FFFF`); however, you need to maintain a separate mapping table in your keymap file, which may contain at most 16384 entries.
Add the following to your `rules.mk`:
```make
UNICODEMAP_ENABLE= yes
```
Then add `X(i)` keycodes to your keymap, where _i_ is an array index into the mapping table:
```c
enumunicode_names{
BANG,
IRONY,
SNEK,
BANG,
IRONY,
SNEK
};
constuint32_tPROGMEMunicode_map[]={
[BANG]=0x203D,// ‽
[IRONY]=0x2E2E,// ⸮
[SNEK]=0x1F40D,// 🐍
[BANG]=0x203D,// ‽
[IRONY]=0x2E2E,// ⸮
[SNEK]=0x1F40D,// 🐍
};
```
@@ -30,27 +46,33 @@ Then you can use `X(BANG)`, `X(SNEK)` etc. in your keymap.
### Lower and Upper Case
Characters often come in lower and upper case pairs, for example: å, Å. To make inputting these characters easier, you can use `XP(i, j)` in your keymap, where _i_ and _j_ are the mapping table indices of the lower and upper case character, respectively. If you're holding down Shift or have Caps Lock turned on when you press the key, the second (upper case) character will be inserted; otherwise, the first (lower case) version will appear.
Characters often come in lower and upper case pairs, such as å and Å. To make inputting these characters easier, you can use `XP(i, j)` in your keymap, where _i_ and _j_ are the mapping table indices of the lower and upper case character, respectively. If you're holding down Shift or have Caps Lock turned on when you press the key, the second (upper case) character will be inserted; otherwise, the first (lower case) version will appear.
This is most useful when creating a keymap for an international layout with special characters. Instead of having to put the lower and upper case versions of a character on separate keys, you can have them both on the same key by using `XP`. This blends Unicode keys in with regular alphas.
This is most useful when creating a keymap for an international layout with special characters. Instead of having to put the lower and upper case versions of a character on separate keys, you can have them both on the same key by using `XP()`. This helps blend Unicode keys in with regular alphas.
Due to keycode size constraints, _i_ and _j_ can each only refer to one of the first 128 characters in your `unicode_map`. In other words, 0 ≤ _i_ ≤ 127 and 0 ≤ _j_ ≤ 127. This is enough for most use cases, but if you'd like to customize the index calculation, you can override the [`unicodemap_index()`](https://github.com/qmk/qmk_firmware/blob/71f640d47ee12c862c798e1f56392853c7b1c1a8/quantum/process_keycode/process_unicodemap.c#L40) function. This also allows you to, say, check Ctrl instead of Shift/Caps.
## `UCIS_ENABLE`
## UCIS
Supports Unicode up to `0x10FFFF` (all possible code points). As with `UNICODEMAP`, you need to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you have to add a keycode or function that calls `qk_ucis_start()`. Once this function has been called, you can type the corresponding mnemonic for your character, then hit Space or Enter to complete it, or Esc to cancel. If the mnemonic matches an entry in your table, the typed text will automatically be erased and the corresponding Unicode character inserted.
This method also supports all possible code points. As with the Unicode Map method, you need to maintain a mapping table in your keymap file. However, there are no built-in keycodes for this feature — you have to create a custom keycode or function that invokes this functionality.
For instance, you could define a table like this in your keymap file:
Add the following to your `rules.mk`:
```make
UCIS_ENABLE= yes
```
Then define a table like this in your keymap file:
To use it, call `qk_ucis_start()`, then type "rofl" and hit Enter. QMK should erase the "rofl" text and insert the laughing emoji.
To use it, call `qk_ucis_start()`. Then, type the mnemonic for the character (such as "rofl"), and hit Space or Enter. QMK should erase the "rofl" text and insert the laughing emoji.
### Customization
@@ -68,7 +90,7 @@ Unicode input in QMK works by inputting a sequence of characters to the OS, sort
The following input modes are available:
* **`UC_OSX`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with `UNICODEMAP`).
* **`UC_OSX`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_OSX`](#input-key-configuration) with another keycode.
@@ -112,7 +134,7 @@ You can also switch the input mode by calling `set_unicode_input_mode(x)` in you
* [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.
@@ -20,12 +24,14 @@ QMK has a staggering number of features for building your keyboard. It can take
* [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.
* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - Sticky Keys, lets hit a key rather than holding it.
* [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.
@@ -33,3 +39,4 @@ QMK has a staggering number of features for building your keyboard. It can take
* [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.
1. Press the `RESET` keycode, or keep the boot pin shorted to GND while quickly shorting RST to GND
2. Wait for the OS to detect the device
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)
## BootloadHID
BootloadHID is a USB bootloader for AVR microcontrollers. The uploader tool requires no kernel level driver on Windows and can therefore be run without installing any DLLs.
To ensure compatibility with the bootloadHID bootloader, make sure this block is present your `rules.mk`:
```make
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER= bootloadHID
```
Compatible flashers:
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) (recommended Windows GUI)
1. Enter the bootloader using any of the following methods:
* Tap the `RESET` keycode (may not work on all devices)
* Hold the salt key while plugging the keyboard in (usually documented within keyboard readme)
2. Wait for the OS to detect the device
3. Flash a .hex file
4. Reset the device into application mode (may be done automatically)
or:
make <keyboard>:<keymap>:bootloadHID
## STM32
All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same.
@@ -146,7 +231,7 @@ Flashing sequence:
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.
*`:dfu-util-wait` - This works like the default command, but it gives you a (configurable) 10 second timeout before it attempts to flash the firmware. You can use `TIME_DELAY=20` from the command line to change the timeout.
*`:dfu-util` - The default command for flashing to STM32 devices.
*`: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.
Quatre fois par an, QMK lance un processus pour fusionner les Breaking Changes. Un Breaking Change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous n'effectuons ces changements que 4 fois par an afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
Ce document présente les fusions de Breaking Change. Voici la liste des changements.
## Formattage de code Core avec clang-format
* Tous les fichiers core (`drivers/`, `quantum/`, `tests/`, et `tmk_core/`) seront formattés avec clang-format
* Un processus travis pour reformatter les PRs lors de la fusion a été mis en place
* Vous pouvez utiliser la nouvelle commande CLI `qmk cformat` afin de formatter avant de soumettre votre PR si vous le souhaitez.
## Nettoyage des descripteurs LUFA USB
* Nettoyage du code lié aux descripteurs USB HID sur les claviers AVR, afin de les rendre plus simple à lire et compréhensibles
* Plus d'information: https://github.com/qmk/qmk_firmware/pull/4871
* Normalement pas de changement de fonctionnement et aucune keymap modifiée.
## Migration des entrées de `ACTION_LAYER_MOMENTARY()` dans `fn_actions` vers des keycodes `MO()`
*`fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
* Supprimer cette fonctionnalité obsolète devrait aboutir à une réduction importante de la taille du firmware et de la complexité du code
* Il est recommandé que toutes les keymaps affectées remplacent `fn_actions` vers les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
## Mise à jour Atreus vers les conventions de codage courantes
* Les doublons include guards ont contourné le comportement de traitement des headers attendu
* Il est recommandé pour toutes les keymaps affectées de supprimer le doublon de `<keyboard>/config.h` et `<keyboard>/keymaps/<user>/config.h` et de ne garder que des surcharges au niveau keymap
## Récupération des changements de fichier keymap langage de la fork ZSA
* Corrige une issue dans le fichier `keymap_br_abnt2.h` qui inclut la mauvaise souce (`keymap_common.h` au lieu de `keymap.h`)
* Met à jour le fichier `keymap_swedish.h` afin d'être spécifique au suédois et plus "nordique" en général.
* Toutes les keymaps qui utilisent ceci devront supprimer `NO_*` et le remplacer par `SE_*`.
## Mise à jour du repo afin d'utiliser LUFA comme un sous-module git
*`/lib/LUFA` supprimé du dépôt
* LUFA, définis comme un sous-module, pointe vers qmk/lufa
* Ceci devrait ajouter plus de flexibilité vers LUFA, et nous permet de garder le sous-module à jour bien plus facilement. Il avait environ 2 ans de retard, sans manière simple de corriger. Ce changement devrait simplifier la mise à jour dans le futur.
## Migration des entrées `ACTION_BACKLIGHT_*()` dans `fn_actions` vers des keycodes `BL_`
*`fn_actions` est déprécié, et ses fonctionnalités ont été remplacées par des keycodes directs et `process_record_user()`
* Toutes les keymaps utilisant ces actions doivent avoir les clés `KC_FN*` remplacées par les clés `BL_*` équivalentes
* Si vous utilisez actuellement `KC_FN*` vous devrez remplacer `fn_actions` avec les fonctionnalités de [keycode custom](https://docs.qmk.fm/#/custom_quantum_functions) et [macro](https://docs.qmk.fm/#/feature_macros)
## Remplacer l'alias `KC_DELT` par `KC_DEL`
*`KC_DELT` était un alias redondant et non documenté pour `KC_DELETE`
* Il a été supprimé et toutes ses utilisations ont été remplacées par l'alias plus courant `KC_DEL`
* Environ 90 keymaps (surtout des boards ErgoDox) ont été modifiées à cette fin
QMK (*Quantum Mechanical Keyboard*) est une communauté open source qui maintient le firmware QMK, la QMK Toolbox (*Boite à outil*), qmk.fm et leurs documentations. QMKFirmware est un firmware dédié aux claviers qui est basé sur [tmk\_keyboard](http://github.com/tmk/tmk_keyboard). Il offre des fonctionnalités très utiles pour les contrôleurs Atmel AVR, et, plus spécifiquement pour [les produits d'OLKB](http://olkb.com), le clavier [ErgoDox EZ](http://www.ergodox-ez.com), et pour les [produits Clueboard](http://clueboard.co/). Il prend désormais aussi en charge les processeurs ARM qui utilisent ChibiOS. Vous pouvez l'utiliser pour contrôler un clavier personnalisé soudé à la main ou alors sur un clavier avec un PCB personnalisé.
## Comment l'obtenir
Si vous souhaitez contribuer à une disposition de clavier (keymap), ou à des fonctionnalités de QMK alors le plus simple est de [forker le dépôt avec Github](https://github.com/qmk/qmk_firmware#fork-destination-box) puis cloner le dépôt localement pour y faire des changements. Vous pourrez pousser vos changements sur github puis ouvrir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) depuis votre fork Github.
Sinon, vous pouvez aussi le télécharger directement en ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), ou le cloner avec git en ssh (`git@github.com:qmk/qmk_firmware.git`), ou https (`https://github.com/qmk/qmk_firmware.git`).
## Comment le compiler
Avant d'être prêt à compiler vous allez devoir [installer un environnement](getting_started_build_tools.md) pour les développements AVR et/ou ARM. Une fois ceci fait, vous pourrez utiliser la commande `make` pour compiler le clavier et la disposition avec une commande de ce type :
make planck/rev4:default
Cette commande compilera la révision `rev4` du clavier `planck` avec la disposition `default`. Notez que tous les claviers n'ont pas forcément de révisions (aussi appelées sous-projects ou dossiers, ou en en Anglais «subprojects» ou «folder»). Cette option peut donc être omise:
make preonic:default
## Comment le personnaliser
QMK a beaucoup de [fonctionnalités](features.md) à explorer, et [une documentation](http://docs.qmk.fm) très abondante que vous pourrez parcourir. La plupart des fonctionnalités vous permettrons de modifier vos [dispositions](keymap.md) (keymaps) et de changer [les codes de caractères](keycodes.md) (keycodes).
Ce document décrit le processus de QMK pour la gestion des breaking changes. Un breaking change est un changement qui modifie la manière dont QMK fonctionne introduisant des incompatibilités ou des comportements dangereux. Nous limitons ces changements afin que les utilisateurs n'aient pas peur de casser leurs keymaps en mettant à jour leur version de QMK.
La période de breaking change est quand nous allons fusionner un PR qui change QMK d'une manière dangereuse ou inattendue. Il y a une période interne de test afin de nous assurer que les problèmes résiduels sont rares ou impossible à prévoir.
## Qu'est-ce qui a été inclus dans des Breaking Changes précédents?
* [30 août 2019](ChangeLog/20190830.md)
## Quand va être le prochain Breaking Change?
Le prochain Breaking Change est planifié pour le 29 novembre.
### Dates importantes
* [x] 21 septembre 2019 - `future` est créé. Il va être rebasé de manière hebdomadaire.
* [ ] 01 novembre 2019 - `future` fermé aux nouveaux PRs.
* [ ] 01 novembre 2019 - Appel aux testeurs.
* [ ] 27 novembre 2019 - `master` est bloqué, pas de PRs fusionnés.
* [ ] 29 novembre 2019 - `future` est fusionné dans `master`.
* [ ] 30 novembre 2019 - `master` est débloqué. Les PRs peuvent à nouveau être fusionnés.
## Quels changements seront inclus?
Pour voir une liste de candidats de breaking changes, vous pouvez regardez la liste des [labels `breaking_change`](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). De nouveaux changements peuvent être ajoutés entre maintenant et lorsque `future` est fermée, et un PR avec ce label n'est pas garanti d'être fusionné.
Si vous souhaitez que votre breaking change soit inclus dans ce tour, vous devez créer un PR avec le label `breaking_change` et faire en sorte qu'il soit accepté avant que `future` ne soit fermé. Une fois `future` fermé, aucun nouveau breaking change sera accepté.
Critère d'acceptation:
* Le PR est complété et prêt à fusionner
* Le PR a un ChangeLog
# Checklists
Cette section documente plusieurs processus que nous utilisons en lançant le processus de Breaking Change.
## Rebase `future` de `master`
Ceci est lancé chaque vendredi tant que `future` est ouvert.
Processus:
```
cd qmk_firmware
git checkout master
git pull --ff-only
git checkout future
git rebase master
git push --force
```
## Créer la branche `future`
Ceci est fait immédiatement après la fusion de la branche `future` précédente.
*`qmk_firmware` git commands
* [ ]`git checkout master`
* [ ]`git pull --ff-only`
* [ ]`git checkout -b future`
* [ ] Modifie `readme.md`
* [ ] Ajoute un message en haut qui indique que c'est une branche de test.
* [ ] Ajoute un lien vers ce document
* [ ]`git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ]`git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ]`git tag <next_version>` # Evite que le label point d'arrêt soit confondu par un incrément de version
* [ ]`git push origin future`
* [ ]`git push --tags`
## 4 Semaines Avant la Fusion
*`future` est maintenant fermé aux nouveaux PRs, seul des correctifs pour les PRs courants peuvent être mergés
* Envoi de l'appel aux testeurs
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 1 Semaine Avant la Fusion
* Annonce que master sera fermée entre <2joursavant> à <Jourdelafusion>
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## 2 Jours Avant la Fusion
* Annonce que master est fermé pour 2 jours
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## Jour de la fusion
*`qmk_firmware` git commands
* [ ]`git checkout future`
* [ ]`git pull --ff-only`
* [ ]`git rebase origin/master`
* [ ] Modifie `readme.md`
* [ ] Supprimer les notes à propos de `future`
* [ ] Regroupe ChangeLog dans un fichier.
* [ ]`git commit -m 'Merge point for <DATE> Breaking Change'`
* [ ]`git push origin future`
* Actions sur Github
* [ ] Crée un PR pour `future`
* [ ] S'assurer que Travis ne relève aucun problème
Cette page décrit comment configurer et utiliser la CLI QMK.
# Vue d'ensemble
La CLI de QMK permet de simplifier la compilation et l'intéraction avec les clavier QMK. Nous avons définis plusieurs commandes pour simplifier et rationaliser les tâches telles qu'obtenir et compiler le firmware QMK, créer de nouvelles keymaps, et plus.
* [CLI globale](#global-cli)
* [CLI locale](#local-cli)
* [Les commandes CLI](#cli-commands)
# Pré-requis
La CLI nécessite Python 3.5 ou plus récent. Nous essayons de limiter le nombre de pré-requis, mais vous allez aussi devoir installer les paquets listés dans le fichier [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt).
# CLI globale
QMK met à disposition une CLI installable qui peut être utilisée pour configurer votre environnement de compilation QMK, fonctionne avec QMK, et qui rend l'utilisation de plusieurs copies de `qmk_firmware` plus simple. Nous recommandons d'installer et de mettre à jour ceci régulièrement.
## Installer en utilisant Homebrew (macOS, quelques Linux)
Si vous avez installé [Homebrew](https://brew.sh) vous pouvez entrer ce qui suit et installer QMK:
```
brew tap qmk/qmk
brew install qmk
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
```
## Installer en utilisant easy_install ou pip
Si votre système n'est pas listé ci-dessus, vous pouvez installer QMK manuellement. Premièrement, vérifiez que vous avez bien installé Python 3.5 (ou plus récent) et pip. Ensuite, installez QMK avec cette commande:
```
pip3 install qmk
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
```
## Paquets pour d'autres systèmes d'exploitation
Nous recherchons des gens pour créer et maintenir un paquet `qmk` pour plus de systèmes d'exploitation. Si vous voulez créer un paquet pour votre système d'exploitation, suivez ces directives:
* Suivez les bonnes pratiques pour votre système d'exploitation lorsqu'elles entrent en conflit avec ces directives
* Documentez pourquoi dans un commentaire lorsque vous ne les suivez pas
* Installez en utilisant un virtualenv
* Expliquez à l'utilisateur de définir la variable d'environnement `QMK_Home` pour "check out" les sources du firmware à un autre endroit que `~/qmk_firmware`.
# CLI locale
Si vous ne voulez pas utiliser la CLI globale, il y a une CLI locale empaquetée avec `qmk_firmware`. Vous pouvez le trouver dans `qmk_firmware/bin/qmk`. Vous pouvez lancer la commande `qmk` depuis n'importe quel répertoire et elle fonctionnera toujours sur cette copie de `qmk_firmware`.
**Exemple**:
```
$ ~/qmk_firmware/bin/qmk hello
Ψ Hello, World!
```
## Limitations de la CLI locale
Il y a quelques limitations à la CLI locale comparé à la globale:
* La CLI locale ne supporte pas `qmk setup` ou `qmk clone`
* La CLI locale n'opère pas sur le même arbre `qmk_firmware`, même si vous avez plusieurs dépôts clonés.
* La CLI locale ne s'exécute pas dans un virtualenv, donc il y a des risques que des dépendances seront en conflit
# Les commandes CLI
## `qmk compile`
Cette commande permet de compiler le firmware de n'importe quel répertoire. Vous pouvez compiler des exports JSON de <https://config.qmk.fm> ou compiler des keymaps du dépôt.
**Utilisation pour les exports de configuration**:
```
qmk compile <configuratorExport.json>
```
**Utilisation pour les Keymaps**:
```
qmk compile -kb <keyboard_name> -km <keymap_name>
```
## `qmk cformat`
Cette commande formatte le code C en utilisant clang-format. Lancez-la sans arguments pour formatter tout le code core, ou passez les noms de fichiers à la ligne de commande pour la lancer sur des fichiers spécifiques.
**Utilisation**:
```
qmk cformat [file1] [file2] [...] [fileN]
```
## `qmk config`
Cette commande vous permet de configurer le comportement de QMK. Pour la documentation complète de `qmk config`, regardez [Configuration de CLI](cli_configuration.md).
Ce document explique comment fonctionne la commande `qmk config`.
# Introduction
La configuration pour QMK CLI est un système clé/valeur. Chaque clé est composée d'une sous-commande et d'un argument séparé par une virgule. Cela permet une traduction simple et directe entre les clés de configuration et l'argument qu'elle définit.
## Exemple simple
Comme exemple, regardons la commande `qmk compile --keyboard clueboard/66/rev4 --keymap default`.
Il y a deux arguments de ligne de commande qui peuvent être lu de la configuration:
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
Maintenant, je peux lancer la commande `qmk compile` sans avoir à spécifier mon clavier et keymap à chaque fois.
## Définir les options par défaut
Parfois, il est utile de partager une configuration entre plusieurs commandes. Par exemple, plusieurs commandes prennent un argument `--keyboard`. Plutôt que de devoir définir cette valeur pour chaque commande, vous pouvez définir une valeur d'utilisateur qui sera utilisée par toutes les commandes qui prennent cet argument.
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
# CLI Documentation (`qmk config`)
La commande `qmk config` est utilisée pour intéragir avec la configuration sous-jacente. Lancée sans argument, elle affiche la configuration courante. Lorsque des arguments sont définis, ils sont considérés comme étant des jetons de configuration, qui sont des chaînes de caractère ne contenant aucun espace avec le format suivant:
<subcommand|general|default>[.<key>][=<value>]
## Définir des valeurs de configuration
Vous pouvez définir des valeurs de configuration en mettant le caractère égal (=) dans votre clé de configuration. La clé doit toujours être dans le format complet `<section>.<key>`.
Exemple:
```
$ qmk config default.keymap=default
default.keymap: None -> default
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Lire des valeurs de configuration
Vous pouvez lire les valeurs de configuration pour la totalité de la configuration, une seule clé, ou une section entière. Vous pouvez aussi spécifier plusieurs clés pour afficher plus d'une valeur.
### Exemple avec la totalité de la configuration
qmk config
### Exemple avec une section entière
qmk config compile
### Exemple avec une clé unique
qmk config compile.keyboard
### Exemple avec plusieurs clés
qmk config user compile.keyboard compile.keymap
## Supprimer des valeurs de configuration
Vous pouvez supprimer une valeur de configuration en la définissant avec la chaîne spéciale `None`.
Exemple:
```
$ qmk config default.keymap=None
default.keymap: default -> None
Ψ Wrote configuration to '/Users/example/Library/Application Support/qmk/qmk.ini'
```
## Plusieurs opérations
Vous pouvez combiner plusieures opérations d'écriture et de lecture en une seule commande. Elle seront exécutées et affichées dans l'ordre:
👍🎉 Premièrement, merci de prendre le temps de lire ceci et de contribuer! 🎉👍
Les contributions de tiers nous aide à améliorer et faire grandir QMK. Nous voulons rendre les pull requests et le processus de contribution utile et simple à la fois pour les contributeurs et les mainteneurs. C'est pourquoi nous avons mis en places des directives pour les contibuteurs afin que votre pull request puisse être accepté sans changement majeur.
* [Aperçu du projet](#project-overview)
* [Conventions de codage](#coding-conventions)
* [Directives générales](#general-guidelines)
* [Que veut dire le code de conduite pour moi?](#what-does-the-code-of-conduct-mean-for-me)
## Je ne veux pas lire tout ce pavé! J'ai juste une question!
Si vous voulez poser une question sur QMK, vous pouvez le faire sur le [sous-reddit OLKB](https://reddit.com/r/olkb) ou sur [Discord](https://discord.gg/Uq7gcHh).
Merci de garder ceci en tête:
* Cela peut prendre plusieurs heures pour que quelqu'un réponde à votre question. Merci d'être patient!
* Tous ceux impliqués avec QMK fait don de son temps et de son énergie. Nous ne sommes pas payés pour travailler sur ou répondre aux questions concernant QMK.
* Essayez de poser vos questions de manière à ce qu'elles soient le plus simple à répondre possible. Si vous n'êtes pas sûrs de savoir comment faire, voici quelques bon guides (en anglais):
QMK est majoritairement écrit en C, avec quelques fonctions et parties spécifiques écrites en C++. Il est destiné aux processeurs intégrés que l'on trouve dans des clavier, particulièrement AVR ([LUFA](http://www.fourwalledcubicle.com/LUFA.php)) et ARM ([ChibiOS](http://www.chibios.com)). Si vous maîtrisez déjà la programmation sur Arduino, vous trouverez beaucoup de concepts et de limitations familiers. Une expérience préalable avec les Arduino n'est pas nécessaire à contribuer avec succès à QMK.
<!-- FIXME: We should include a list of resources for learning C here. -->
# Où trouver de l'aide?
Si vous avez besoin d'aide, vous pouvez [ouvrir une issue](https://github.com/qmk/qmk_firmware/issues) ou [un chat sur Discord](https://discord.gg/Uq7gcHh).
# Comment contribuer?
Vous n'avez encore jamais contribué à un projet open source? Vous vous demandez comment les contributions dans QMK fonctionnent? Voici un aperçu rapide!
0. Enregistrez-vous sur [GitHub](https://github.com).
1. Définissez une keymap à contribuer, [trouvez une issue](https://github.com/qmk/qmk_firmware/issues) que vous souhaitez corriger, ou [une fonction](https://github.com/qmk/qmk_firmware/issues?q=is%3Aopen+is%3Aissue+label%3Afeature) que vous voulez ajouter.
2. Créez un fork sur le dépôt associé avec une issue sur votre compte GitHub. Cela veut dire que vous allez avoir une copie du dépôt sous `votre-login-GitHub/qmk_firmware`.
3. Clonez le dépôt sur votre macine locale en utilisant `git clone https://github.com/login-github/repository-name.git`.
4. Si vous travaillez sur une nouvelle fonctionnalité, pensez à ouvrir une issue pour parler avec nous du travail que vous souhaitez démarrer.
5. Créez une nouvelle branche pour votre correctif en utilisant `git checkout -b nom-de-branche`.
6. Faites les changements nécessaires pour corriger le problème ou ajouter la fonctionnalité.
7. Utilisez `git add chemin-de-fichier` pour ajouter les contenus des fichiers modifiés au "snapshot" que git utilise pour gérer l'état du projet, appelé aussi l'index.
8. Utilisez `git commit -m "Insérez une description courte des changements (en anglais)"` pour enregistrer le contenu de l'index avec un message descriptif.
9. Poussez les changements vers votre dépôt sur GitHub en utilisant `git push origin nom-de-branche`.
10. Créez un pull request sur [QMK Firmware](https://github.com/qmk/qmk_firmware/pull/new/master).
11. Donnez un titre à votre pull request en utilisant une description courte des changements que vous avez fait et ajoutez le numéro de l'issue ou du bug associé avec votre changement. Les commentaires de PR devraient se faire en anglais de préférence. Par exemple, vous pouvez utiliser un titre tel que celui-là: "Added more log outputting to resolve #4352".
12. Dans la description du pull request, expliquez les changements que vous avez fait et tous les problèmes qui existent, selon vous, sur le pull request que vous avez fait. Vous pouvez aussi utiliser la description pour poser des questions au mainteneur. Il n'est pas nécessaire que votre pull request soit parfait (aucun pull request ne l'est), le reviewer sera là pour vous aider à résoudre les problèmes et l'améliorer!
13. Attendez que le pull request soit revu par un mainteneur.
14. Faites des changements au pull request si le mainteneur le recommande.
15. Célébrez votre succès une fois votre pull request fusionné!
# Conventions de codage
La grande majorité de notre style est plutôt simple à comprendre. Si vous connaissez C ou Python, vous ne devriez pas avoir trop de difficulté avec notre style.
* [Conventions de codage - C](coding_conventions_c.md)
* [Conventions de codage - Python](coding_conventions_python.md)
# Directives générales
Nous avons un certain nombre de type de changements dans QMK, chacun nécessitant un niveau de rigueur différent. Nous voulons que vous gardiez les directives suivantes en tête quel que soit le changement que vous êtes en train de faire.
* Séparez les PR dans des unités logiques. Par exemple, ne soumettez pas un PR qui couvre deux fonctionnalités séparées, soumettez plutôt un PR pour chaque fonctionnalité.
* Vérifiez les espaces blancs non nécessaires avec `git diff --check` avant de commit.
* Assurez-vous que votre code compile.
* Keymaps: Assurez-vous que `make keyboard:your_new_keymap` ne renvoie pas d'erreur.
* Claviers: Assurez-vous que `make keyboard:all` ne renvoie pas d'erreur.
* Core: Assurez-vous que `make all` ne renvoie pas d'erreur.
* Assurez-vous que les messages de commit soient compréhensibles d'eux-même. Vous devriez écrire une description simple (pas plus de 70 caractères) sur la première ligne, suivi d'une ligne vide, suivi d'un détail de votre commit, si nécessaire. Exemple:
```
Adjust the fronzlebop for the kerpleplork
The kerpleplork was intermittently failing with error code 23. The root cause was the fronzlebop setting, which causes the kerpleplork to activate every N iterations.
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
```
## Documentation
La documentation est l'une des manière les plus simples de démarrer la contribution sur QMK. Il est simple de trouver des endroits où la documentation est fausse ou incomplète, et il est tout aussi simple de la corriger! Nous avons aussi grandement besoin de quelqu'un pour éditer notre documentation, donc si vous avez des compétences en édition mais que vous n'êtes pas sûr de savoir où aller, n'hésitez pas [demandez de l'aide](#where-can-i-go-for-help)!
Vous trouverez toute notre documentation dans le répertoire `qmk_firmware/docs`, ou si vous préférez utiliser des outils web, vous pouvez cliquer sur le bouton "Suggest An Edit" en haut de chaque page sur http://docs.qmk.fm/.
Lorsque vous donnez des exemples de code dans la documentation, essayez de suivre les conventions de nommage utilisées ailleurs dnas la documentation. Par exemple, standardisez les enums en utilisant `my_layers` ou `my_keycodes` afin de garder une consistance:
```c
enummy_layers{
_FIRST_LAYER,
_SECOND_LAYER
};
enummy_keycodes{
FIRST_LAYER=SAFE_RANGE,
SECOND_LAYER
};
```
## Keymaps
La plupart des contributeurs débutants démarrent avec leurs keymaps personnelles. Nous essayons de garder les standards pour les keymaps pluôt simple (les keymaps reflètent, après tout, la personnalité de leurs créateurs) mais nous demandons que vous suiviez les directives suivantes afin que d'autres puissent découvrir et apprendre de votre keymap.
* Ecrivez un fichier `readme.md` en utilisant [la template](documentation_templates.md).
* Tous les PR de keymaps doivent être "squashés", donc si la manière dont vos commits sont squashés vous est important, vous devez le faire vous-même.
* Ne regroupez pas des fonctionnalités avec votre PR de keymap. Envoyez d'abord votre fonctionnalité, puis créez un second PR pour la keymap.
* N'incluez pas de fichier `Makefile` dans votre dossier de keymap (ils ne sont plus utilisés)
* Mettez à jour les copyrights dans les en-têtes de fichiers (cherchez `%YOUR_NAME%`)
## Claviers
Les claviers sont la raison d'être de QMK. Certains claviers sont maintenus par la communauté, alors que d'autre sont maintenus par les gens responsables de la création du clavier. Le fichier `readme.md` devrait vous informer de qui maintient le clavier. Si vous avez des questions concernant un clavier en particulier, vous pouvez [Ouvrir une issue](https://github.com/qmk/qmk_firmware/issues) et tagger le mainteneur dans votre question.
Nous vous demandons aussi que vous suiviez ces directives:
* Ecrivez un fichier `readme.md` en utilisant [le template](documentation_templates.md).
* Gardez un nombre de commits raisonnable, ou nous squasherons votre PR.
* Ne regroupez pas des fonctionnalités avec le PR pour votre clavier. Envoyez d'abord votre fonctionnalité, puis créez un second PR pour le clavier.
* Appelez les fichiers `.c`/`.h` du nom du dossier parent, par exemple `/keyboards/<kb1>/<kb2>/<kb2>.[ch]`
* N'incluez pas de fichier `Makefile` dans votre dossier de keymap (ils ne sont plus utilisés)
* Mettez à jour les copyrights dans les en-têtes de fichiers (cherchez `%YOUR_NAME%`)
## Quantum/TMK Core
Faites attention d'être sûr d'implémenter votre nouvelle fonctionnalité de la meilleure manière qu'il soit avant d'investir beaucoup de travail à son développement. Vous pouvez apprendre les bases de QMK en lisant [Comprendre QMK](understanding_qmk.md), qui vous donnera une idée du flux du programme QMK. A partir de là, parlez nous afin de définir la meilleure façon d'implémenter votre idée. Il y a deux façons principale de le faire:
* [Chat sur Discord](https://discord.gg/Uq7gcHh)
* [Ouvrir une Issue](https://github.com/qmk/qmk_firmware/issues/new)
Les PR de nouvelles fonctionnalités de de correction de bug affectent tous les claviers. Nous sommes aussi dans un processus de restructuration de QMK. Pour cette raison, il est absolument nécessaire que tout changement important ou significatif soit discuté avant que l'implémentation soit faite. Si vous ouvrez un PR sans nous avoir parlé, préparez vous à faire des refontes significatives si vous changements ne sont pas compatibles avec ce que nous avons planifié.
Voici quelques choses à garder en tête lorsque vous travaillez sur une fonctionnalité ou un bug fix.
* **Désactivé par défaut** - la mémoire est plutôt limitée sur la plupart des puces que QMK supporte, et il est important que les keymaps courantes ne soient pas cassées. S'il vous plaît faites que vos features doivent être **activées** plutôt que désactivées. Si vous pensez qu'elle devrait être activée par défaut, ou que cela réduit la taille du code, parlez-nous en.
* **Compilez localement avant de soumettre** - Cela devrait aller sans dire, mais votre code doit compiler! Notre système Travis devrait relever les problèmes, mais il est généralement plus rapide de compiler quelques claviers en local plutôt que d'attendre le retour des résultats
* **Faites attention aux révisions et différentes bases de puces** - beaucoup de claviers ont des révisions qui permettent des changements de configuration mineurs, voir des bases de chip différentes. Essayez de faire que votre fonctionnalité soit supportée à la fois sur ARM et AVR, ou désactivez-là automatiquement sur les plateformes non supportées.
* **Expliquez votre fonctionnalité** - Documentez-là dans `docs/`, soit dans un nouveau fichier, ou dans une partie d'un fichier existant. Si vous ne la documentez pas, personne ne pourra bénéficier de votre dur labeur.
Nous vous demandons aussi de suivre ces ces directives:
* Gardez un nombre de commits raisonnable, ou nous squasherons votre PR.
* Ne regroupez pas des claviers ou des keymaps avec des changements core. Soumettez vos changements core en premier.
* Ecrivez des [Tests Unitaires](unit_testing.md) pour votre fonctionnalité.
* Suivez le style du fichier que vous modifiez. Si le style n'est pas clair ou qu'il y a un mélange de fichiers, vous devriez vous conformer aux [conventions de codage](#coding-conventions) au dessus.
## Refactoriser
Afin de maintenir une vision claire sur comment les choses sont architectuées dans QMK, nous essayons de planifier des refactorisations en profondeur et qu'un collaborateur fasse le changement. Si vous avez une idée de refactorisation, ou une suggestion, [ouvrez une issue] [open an issue](https://github.com/qmk/qmk_firmware/issues), nous adorons discuter de comment améliorer QMK.
# Que veut dire le code de conduite pour moi?
Note [Code De Conduite](https://github.com/qmk/qmk_firmware/blob/master/CODE_OF_CONDUCT.md) veut dire que vous avez la responsabilité de traiter tout le monde dans le projet avec respect et courtoisie, peut importe leur identité. Si vous êtes victime d'une attitude ou de commentaires inapropriés, tels que décrit dans notre Code de Conduite, nous sommes là pour vous et nous ferons de notre mieux pour nous assurer que le fautif soit réprimandé, tel que décrit dans notre code.
# Instructions pour flasher et informations sur les bootloader
Les claviers utilisent différents types de bootloaders et certains doivent être flashés différement. Heureusement, certains projets comme la [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) ont pour objectifs de permettre de flasher les différents bootloader sans trop se faire de soucis et ça peut importe les manières de les flasher.
Si vous avez un bootloader sélectionné avec la variable `BOOTLOADER` dans votre fichier `rules.mk` alors QMK vas automatiquement calculer si votre fichier .hex n'est pas trop grand pour être flashé sur votre appareil, et il affichera la taille finale du firmware. Pour vérifier la taille manuellement, vous pouvez aussi compiler le firmware avec l'option `check-size`. Exemple : `make planck/rev4:default:check-size`.
## DFU
Le bootloader pour les processeurs Atmel DFU est fourni par défaut sur tous les processeurs atmega32u4. Celui-ci est utilisé par beaucoup de claviers plus vieux que les OLKB et Clueboard qui ont leur propre ICs sur leurs PCBs. D'autres claviers utilisent le bootloader DFU de LUFA (ou son fork QMK), notamment les nouveaux claviers OLKB. Ce dernier ajoute des fonctionnalités spécifiques sur le matériel.
Pour vérifier la compatibilité avec le bootloader DFU, vérifiez que ce bloc de code est présent dans votre fichier `rules.mk`. Parfois il peut être inscrit `lufa-dfu` ou `qmk-dfu` à la place.
1. Pressez le keycode `RESET`, ou appuyez sur le bouton physique RESET ou alors créez un contact entre RST et GND.
2. Attendez que l'OS detecte l'appareil.
3. Éffacez la mémoire, cela peut être fait automatiquement.
4. Flasher le fichier .hex.
5. Redémarrez l'appareil en mode «application», cela peut être fait automatiquement.
Alternativement:
make <keyboard>:<keymap>:dfu
### DFU QMK
QMK a un fork du bootloader LUFA DFU qui vous permet de faire un simple scan de la matrice pour quitter le bootloader et retourner à l'application. En même temps que le flash se produira, il est possible de faire flasher un led ou de produire un son via un haut parleur. Pour activer ces fonctionnalités, vous pouvez utiliser ce bloc dans votre fichier `config.h` (La touche permettant de quitter le bootloader a besoin d'être reliée entre les ports définis en INPUT et OUTPUT ici):
#define QMK_ESC_OUTPUT F1 // usually COL
#define QMK_ESC_INPUT D5 // usually ROW
#define QMK_LED E6
#define QMK_SPEAKER C6
Le fabriquant et le nom du produit proviennent de vos définitions dans fichier `config.h`, et la chaîne de caractère «bootloader» est ajoutée au nom du prodruit.
Pour génerer le bootloader, utilisez la cible `bootloader`. Exemple:`make planck/rev4:default:bootloader`.
Pour génerer un fichier .hex prêt pour la production qui contiendra tant l'application que le bootloader, utilisez la cible `production`. Exemple:`make planck/rev4:default:production`.
### Commandes DFU
Il y a plusieurs commandes DFU que vous pouvez utiliser pour flasher le firmware sur un appareil DFU.
*`:dfu` - C'est l'option normale qui attend qu'un appareil DFU soit disponible et qui flashe le firmware dès que c'est le cas. La vérification sera faite toutes les 5 secondes.
*`:dfu-ee` - Cette option flash un fichier `.eep` à la place d'un fichier `.hex`. Ce cas est plutôt rare.
*`:dfu-split-left` - Cette option flashe le firmware normal comme avec l'option (`:dfu`). Mais cela aussi flash le coté gauche du fichier EEPROM pour les claviers scindés. _C'est l'option idéale pour un clavier scindé basé sur le Elite C_
*`:dfu-split-right` - Cette option flashe le firmware normal comme avec l'option (`:dfu`). Mais cela aussi flash le coté droite du fichier EEPROM pour les claviers scindés. _C'est l'option idéale pour un clavier scindé basé sur le Elite C_
## Caterina
Les cartes arduinos et leurs clones utilisent le [bootloader Caterina](https://github.com/arduino/ArduinoCore-avr/tree/master/bootloaders/caterina) (tous les claviers utilisant un Pro Micro, ou un clone). Ils utilisent aussi le protocole avr109 pour communiquer en virtuellement en série (serial en Anglais). Les bootloaders comme le [A-Star](https://www.pololu.com/docs/0J61/9) sont basés sur Caterina.
Pour vérifier la compatibilité avec un bootloader Caterina, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
1. Pressez la touche avec le keycode `RESET`, ou reliez les ports GND et RST. Vous n'avez que 7 secondes pour flasher une fois que l'opération a été faite.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Attendez que l'appareil redémarre automatiquement.
ou, utilisez:
make <keyboard>:<keymap>:avrdude
ou, si vous vous voulez flasher plusieurs claviers, utilisez la commande suivante:
make <keyboard>:<keymap>:avrdude-loop
Quand vous avez fini de flasher vos claviers, vous aurez besoin d'utiliser Ctrl + C ou alors la touche ayant la fonction similaire sur votre OS pour sortir de la boucle.
## Halfkay
Halfkay est un protocole ultra-simple développé par PJRC qui utilise HID et qui est fourni avec tous les Teensys après le modèle 2.0.
Pour vérifier la compatibilité avec le booloader Halfkay, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
[Teensy Loader en ligne de commande](https://www.pjrc.com/teensy/loader_cli.html) (Outil en ligne de commande recommandé)
Séquence de flash:
1. Pressez la touche du keycode `RESET`, ou reliez les ports RST et GND rapidement. Vous avez ensuite 7 secondes pour réaliser le flash.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
## USBasploader
USBasploader est un bootloader développé par matrixstorm. Il est utilisé sur des processeurs AVR non-USB comme le ATmega328P, qui fonctionne grâce à V-USB.
Pour vérifier la compatibilité avec le booloader USBasploader, vérifiez que ce bloc est présent dans votre fichier `rules.mk`:
1. Pressez la touche du keycode `RESET`, ou reliez le port de boot pendant que RST et GND snt reliés. Cela doit être fait très rapidement.
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
## BootloadHID
BootloadHID est un bootloader pour les microcontroleurs AVR. L'utilitaire de téleversement ne demande pas de drivers au niveau du kernel et peut être lancé sans installer aucune DLLs.
Pour vérifier la compatibilité avec le bootloader bootloadHID, vérifiez que ce bloc existe dans votre fichier `rules.mk` :
```make
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER= bootloadHID
```
Utilitaires de flash compatibles:
* [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash) (Utilitaire avec interface graphique recommandé)
* [bootloadhid Command Line](https://www.obdev.at/products/vusb/bootloadhid.html) / `:BootloadHID` avec QMK (utilitaire en ligne de commande recommandé)
Séquence de flash
1. Entrez dans le bootloader en utilisant l'une de ces méthodes:
* Pressez la touche du keycode `RESET` (Cela ne fonctionnera pas sur certains appareils).
* Verouillez la touche «Salt» tout en branchant le clavier (Géneralement ce principe est documenté dans le fichier readme du clavier)
2. Attendez que l'OS détecte l'appareil.
3. Flasher le fichier .hex.
4. Redémarrez l'appareil en mode «application». Cela peut être fait automatiquement.
Ou alors:
make <keyboard>:<keymap>:bootloadHID
## STM32
Tous les processeurs STM32 contiennent un bootloader installé en usine qui ne peut pas être modifié ou supprimé. Certains processeurs STM32 ont des bootloaders qui ne peuvent pas être programmés par USB (ex:STM32F103) mais le processus reste le même.
Pour le moment, aucune variable `BOOTLOADER` n'est nécessaire dans le fichier `rules.mk`.
* [dfu-util](https://github.com/Stefan-Schmidt/dfu-util) / `:dfu-util` (utilitaire en ligne de commande recommandé)
Séquence pour flasher:
1. Entrez dans le bootloader en utilisant l'une de ces méthodes:
* Utilisez une touche sur laquelle le keycode `RESET` (Cela peut ne pas fonctionner sur les appareils STM32F042)
* Si un circuit de réinitialisation (Reset) est présent alors utilisé le bouton qui lui est dédié.
* Autrement, vous devez réaliser une liaison entre BOOT0 et VCC (en appuyant sur le bouton ou à l'aide d'un pont) puis faire un pont entre RESET et GND et enfin relacher le pont BOOT0.
2. Attendre que l'os détecte l'appareil.
3. Flasher un fichier `.bin`.h
* Vous allez recevoir un avertissement à propos de la signature DFU. Ignorez-la.
4. Réinitialisez l'appareil en mode «application». Cela peut être fait automatiquement.
* Si vous êtes en train de travailler en ligne de commande, par exemple avec un `make planck/rev6:default:dfu-util` alors soyez bien sur que l'argument `:leave` est passé aux argument DFU grâce à la variable `DFU_ARGS` à l'intérieur de votre fichier `rules.mk` (Ex:`DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave`) afin que votre appareil redémarre après avoir été flashé.
### Commandes STM32
Il y a différentes commandes que vous pouvez utiliser pour flasher un firmware dans un appareil STM32:
*`:dfu-util` - La commande par défaut pour flasher un appareil STM32.
*`:dfu-util-split-left` - Permet de flasher un firmware normalement, tout comme l'option précedente mais permet de configurer le coté gauche des paramètres EEPROM sur un clavier scindé.
*`:dfu-util-split-right` - Permet de flasher un firmware normalement, tout comme l'option précedente mais permet de configurer le coté droit des paramètres EEPROM sur un clavier scindé.
*`:st-link-cli` - Cela permet de flasher le firmware avec l'utilitaire en ligne de commande ST-LINK's plutôt que d'utiliser dfu-util.
Il y a beaucoup de ressources pour trouver de l'aide avec QMK.
## Chat temps-réel
Vous trouverez des développeurs QMK et des utilisateurs sur notre [Serveur Discord](https://discord.gg/Uq7gcHh) principal. Il y a des canaux spécifiques dans le serveurs pour discuter des firmware, toolbox, hardware et configurateurs.
## Sous-Reddit OLKB
Le forum officiel de QMK est [/r/olkb](https://reddit.com/r/olkb) sur [reddit.com](https://reddit.com).
## Tickets GitHub
Vous pouvez ouvrir un [ticket sur GitHub](https://github.com/qmk/qmk_firmware/issues). Ceci est spécialement pratique lorsque votre problème demande une discussion long terme ou un débugage.
GitHub peut être un peu compliqué pour ceux qui n'y sont pas familier. Ce guide va vous expliquer chaque étape de "fork", clone et envoi d'un pull request avec QMK.
?> Ce guide part du principe que vous êtes suffisamment à l'aise pour envoyer commandes sur la ligne de commande et que vous avez Git installé sur votre système.
Commencez par la [page GitHub de QMK](https://github.com/qmk/qmk_firmware), et vous verrez un bouton dans le coin en haut à droite qui indique "Fork":

Si vous faites partie d'une organisation, vous aurez besoin de savoir quel compte utiliser pour le fork. Dans la plupart des cas, vous voudrez créer le fork dans votre compte personnel. Une fois le fork complet (cela peut quelque fois prendre un peu de temps), appuyez sur le bouton "Clone or download":

Faites attention à sélectionner "HTTPS", et sélectionnez le liens et copiez-le:

Ensuite, entrez `git clone` dans la ligne de commande, et collez votre lien:
Vous avez maintenant votre fork QMK sur votre machine locale, vous pouvez ajouter votre keymap, la compiler et la flasher sur votre board. Une fois heureux avec vos changements, vous pouvez les ajouter, commit, et pousser vers votre fork comme suit:
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
Vos changements existent maintenant dans votre fork sur GitHub. Si vous allez à cete adresse (`https://github.com/<whoeveryouare>/qmk_firmware`), vous pouvez créer un nouveau "Pull Request" en cliquant sur ce bouton:
Maintenant, vous pourrez voir exactement ce que vous avez commité. Si ça vous semble bien, vous pouvez le finaliser en cliquant sur "Create Pull Request":
Le but de cette page est d'expliquer les informations de base qui vous serons nécessaire pour travailler sur le projet QMK. Il a pour pré-requis que vous soyez familier à la navigation à l'aide d'un shell Unix, mais ne s'attend pas à ce que vous soyez familier avec C ou la compilation en utilisant make.
## Structure de base de QMK
QMK est un fork du projet [tmk_keyboard](https://github.com/tmk/tmk_keyboard) créé par [Jun Wako](https://github.com/tmk). Le code originel de TMK, avec quelques modifications, se trouve dans le dossier `tmk`. Les additions que QMK amène au projet se trouvent dans le dossier `quantum`. Les projets de clavier se trouvent dans les dossiers `handwired` et `keyboard`.
### Structure du Userspace
Dans le dossier `users` se trouve un répertoire pour chaque utilisateur. C'est un endroit où les utilisateurs peuvent mettre du code qui serait partagé entre plusieurs claviers. Merci de lire la documentation [Fonctionnalité Userspace](feature_userspace.md) pour plus d'information.
### Structure du projet clavier
Dans le dossier `keyboards`, son sous-dossier `handwired` et ses sous-dossiers pour les revendeurs et fabriquants (par exemple `clueboard`) se trouve un répertoire pour chaque projet clavier. Par exemple `qmk_firmware/keyboards/clueboard/2x1800`.
A l'intérieur, vous trouverez la structure suivante:
*`keymaps/`: différentes keymaps qui peuvent être compilées
*`rules.mk`: Ce fichier définit les options "make" par défaut. Ne modifiez pas ce fichier directement, utilisez à la place un `rules.mk` spécifique à la keymap.
*`config.h`: Ce fichier définit les options de compilation par défaut. Ne modifiez pas ce fichier directement, utilisez à la place un `config.h` spécifique à la keymap.
*`info.json`: Le fichier utilisé pour définir les options de layout de QMK Configurator. Voyez [Support Configurator](reference_configurator_support.md) pour plus d'information.
*`readme.md`: une brève description du clavier.
*`<keyboardName>.h`: Ce fichier définit le layout du fichier par rapport à la matrice de commutation.
*`<keyboardName>.c`: Ce fichier définit du code custom pour le clavier.
Pour plus d'information sur la structure du projet, voyez [Directives clavier QMK](hardware_keyboard_guidelines.md).
### Structure d'une Keymap
Dans chaque dossier keymap, vous allez trouver les fichiers suivants. Seul le fichier `keymap.c` est nécessaire, et si le reste des fichiers n'existent pas, les options par défaut seront choisies.
*`config.h`: les options de configuration de votre keymap
*`keymap.c`: tout le code de votre keymap, requis
*`rules.mk`: les features de QMK qui sont activées
*`readme.md`: une description de votre keymap, comment d'autres l'utiliseront, et des explications des fonctionnalités. Uploadez les images vers un service comme imgur.
Le système de compilation cherche automatiquement les fichiers de configuration dans l'ordre au dessus. Si vous souhaitez surcharger une configuration définie par un `config.h` précédent, vous devrez d'abord ajouter le code suivant.
```
#pragma once
```
Ensuite, pour surcharger l'option du fichier `config.h` précédent, vous devez `#undef` puis `#define` l'option à nouveau.
Voici à quoi l'ensemble du code resemble une fois regroupé:
QMK est un firmware Open Source pour votre clavier mécanique. Vous pouvez utiliser QMK pour customiser votre clavier de manière simple et puissante. Tout le monde, du débutant complet au développeur avancé, ont utilisé avec succès QMK pour customiser leur clavier. Ce guide vous aidera à faire de même, quelles que soient vos compétences.
Vous voulez savoir si votre clavier peut utiliser QMK? Si c'est un clavier mécanique que vous avez vous-même construit, il y a de bonnes chances que vous pouvez. Nous supportons un [grand nombre de "hobbyist boards"](http://qmk.fr/keyboards), donc même si votre clavier ne peut pas utiliser QMK, vous ne devriez pas avoir trop de problème pour en trouver un qui vous convienne.
## Vue d'ensemble
Il y a 7 sections principales dans ce guide:
* [Pour débuter](fr-FR/newbs_getting_started.md)
* [Compiler votre premier firmware en utilisant la ligne de commande](fr-FR/newbs_building_firmware.md)
* [Compiler votre premier firmware en utilisant l'interface graphique en ligne](fr-FR/newbs_building_firmware_configurator.md)
* [Flasher le Firmware](fr-FR/newbs_flashing.md)
* [Test et Débuggage](fr-FR/newbs_testing_debugging.md)
Ce guide a pour but principal d'aider quelqu'un qui n'a jamais compilé de logiciel avant. Les recommandations et les choix qu'il contient vont donc dans ce sens. Il y a des méthodes alternatives pour beaucoup de ces procédures, et nous supportons la plupart de ces alternatives. Si vous avez un doute sur comment accomplir une tâche, vous pouvez [nous demander de l'aide](fr-FR/getting_started_getting_help.md).
## Ressources additionnelles
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) – Un blog créé par un utilisateur qui couvre les bases de l'utilisation du Firmware QMK, vue d'un point de vue d'un nouvel utilisateur (anglais).
## Ou, "Comment j'ai appris à ne plus m'en faire et aimer Git."
Ce document a pour but d'apprendre aux novices les meilleures solutions pour faciliter la contribution à QMK. Nous allons étudier le processus de contribution à QMK, détaillant quelques moyens de rendre cette tâche plus simple. Nous allons faire quelques erreurs afin de vous apprendre à les résoudre.
Ce document suppose les choses suivantes:
1. Vous avez un compte GitHub, et avez [créé un "fork" pour le dépôt qmk_firmware](fr-FR/getting_started_github.md) avec votre compte.
2. Vous avez [configuré votre environnement de compilation](fr-FR/newbs_getting_started.md?id=environment-setup).
## La branche master de votre fork: Mettre à jour souvent, ne jamais commit
Il est hautement recommandé pour le développement de QMK, peu importe ce qui est fait ou où, de garder votre branche `master` à jour, mais de ne ***jamais*** commit dessus. A la place, faites tous vos changement dans une branche de développement et crééz des "pull requests" de votre branche lorsque vous développez.
Pour réduire les chances de conflits de fusion (merge) — des cas où deux ou plus d'utilisateurs ont édité la même section d'un fichier en parallèle — gardez votre branche `master` relativement à jour et démarrez chaque nouveau développement en créant une nouvelle branche.
### Mettre à jour votre branche master
Pour garder votre branche `master` à jour, il est recommandé d'ajouter le dépôt du firmware QMK comme un dépôt distant (remote) dans git. pour se faire, ouvrez votre interface de ligne de commande Git et entrez:
Maintenant que c'est fait, vous pouvez vérifier les mises à jour au dépôt en lançant `git fetch upstream`. Cela récupère les branches et les tags — appelé de manière générale "refs" — du dépôt QMK, qui a maintenant le surnom `upstream`. Nous pouvons maintenant comparer les données sur notre "fork" `origin` à celles contenues par QMK.
Pour mettre à jour la branche master de votre "fork", lancez les commandes suivantes (en appuyant sur Enter après chaque ligne):
```bash
git checkout master
git fetch upstream
git pull upstream master
git push origin master
```
Cela vous change la branche courante en master, synchronise les données de réferences du dépôt QMK vers votre ordinateur. La commande pull tire les données de réferences vers votre branche courante puis les y téleverse. La commande push permet de pousser la branche courante (master) vers votre fork github.
### Faire des changements
Pour faire des changements, créez une nouvelle branche en entrant:
```bash
git checkout -b dev_branch
git push --set-upstream origin dev_branch
```
Ceci crée une branche nommée `dev_branch`, bascule vers cette branche, et ensuite sauvegarde cette nouvelle branche vers votre fork. L'argument `--set-upstream` demande à git d'utiliser votre fork et la branche `dev_branch` à chaque fois que vous utilisez `git push` ou `git pull` depuis cette branche. Vous ne devez l'utiliser que pour le premier "push", après celà, vous pouvez utiliser simplement `git push` ou `git pull`, sans le reste des arguments.
!> Avec `git push`, vous pouvez utiliser `-u` à la place de `--set-upstream`—`-u` est un alias pour `--set-upstream`.
Vous pouvez appeler votre branche à peu prêt comme vous voulez, toutefois il est recommandé d'utiliser un nom qui est lié aux changements que vous allez faire.
Par défaut, `git checkout -b` va faire de la branche actuelle la branche de base de votre nouvelle branche. Vous pouvez définir la base de votre nouvelle branche comme étant n'importe quelle branche existante qui n'est pas la courante en utilisant la commande:
```bash
git checkout -b dev_branch master
```
Maintenant que vous avez une branche de développement, ouvrez votre éditeur de texte et faites vos changements. Il est recommandé de faire beaucoup de petits commits dans votre branche. Ainsi, un changement qui crée un problème peut être plus facilement retracé et annulé si nécessaire. Pour faire un changement, éditez et sauvez n'importe quel fichier qui doit être mis à jour, ajoutez les à la *zone de staging* de Git, et commitez les vers votre branche:
```bash
git add path/to/updated_file
git commit -m "My commit message."
```
`git add` ajoute les fichiers qui ont été changés dans la *zone de staging* de Git, qui est sa "zone de chargement". Elle contient tous les changements qui vont être *validés* (committed) par `git commit`, qui sauvegarde les changements vers le dépôt. Utilisez des messages de validation descriptifs afin que vous puissiez savoir ce qui a changé d'un coup d'oeil.
!> Si vous changez beaucoup de fichiers, mais tous les fichiers font partie du même changement, vous pouvez utiliser `git add .` pour ajouter tous les fichiers changés dans le répertoire courant, plutôt que d'avoir à ajouter chaque fichiers individuellement.
### Publier Vos Changements
La dernière étape est de pousser vos changements vers votre fork. pour se faire, entrez `git push`. Git publie maintenant l'état courant de `dev_branch` vers votre fork.
## Résoudre Les Conflits De Merge
Parfois, lorsque votre travail sur une branche met beaucoup de temps à se compléter, des changements réalisés par d'autres peuvent entrer en conflit avec les changements que vous avez fait sur votre branche au moment où vous avez ouvert un pull request. Ceci est appelé un *conflit de merge*, et c'est ce qui arrive lorsque plusieurs personnes modifient les mêmes parties de mêmes fichiers.
### Rebaser Vos Changements
Un *rebase* est la manière pour Git de prendre les changements qui ont été faits à un point, les annuler, et les réappliquer sur un autre point. Dans le cas d'un conflit de merge, vous pouvez rebaser votre branche pour récupérer les changements qui ont été faits entre le moment où vous avez créé votre branche et le présent.
La commande `git rev-list` retourne le nombre de commits qui diffère entre la branche courante et la branche master de QMK. Nous lançons `git fetch` en premier afin d'être sûr que les refs qui représentent l'état courant du dépôt upstream soient à jour. Le résultat de la commande `git rev-list` retourne deux nombres:
Le premier nombre représente combien il y a eu de commits sur la branche courante depuis qu'elle a été créée, et le second nombre est combien de commits ont été faits sur la branche `upstream/master` depuis que la branche a été créée et, ainsi, les changements qui ne sont pas enregistrés sur la branche courante.
Maintenant que l'état actuel de la branche courante et la branche upstream sont connus, nous pouvons maintenant démarrer une opération de rebase:
```bash
git rebase upstream/master
```
Ceci dit à Git d'annuler les commits de la branche courrante puis de les réappliquer sur la branche master de QMK.
```bash
$ git rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: Commit #1
Using index info to reconstruct a base tree...
M conflicting_file_1.txt
Falling back to patching base and 3-way merge...
Auto-merging conflicting_file_1.txt
CONFLICT (content): Merge conflict in conflicting_file_1.txt
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 Commit #1
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
```
Ceci nous dit que nous avons un conflit de merge, et nous donne le nom du fichier en conflit. Ouvez le fichier conflictuel dans votre éditeur de texte et, quelque part dans le fichier, vous trouverez quelque chose comme ça:
```bash
<<<<<<< HEAD
<p>For help with any issues, email us at support@webhost.us.</p>
=======
<p>Need help? Email support@webhost.us.</p>
>>>>>>> Commit #1
```
La ligne `<<<<<<< HEAD` montre le début d'un conflit de merge et la ligne `>>>>>>> Commit #1` indique la fin, avec les sections conflictuelles séparées par `=======`. La partie du côté `HEAD` vient de la version du fichier provenant de la branche master de QMK, et la partie marquée avec le numéro du commit provient de la branche courrante.
Parce que Git suis *les changements des fichiers*, plutôt que les contenus des fichiers directement, si Git ne peut pas trouver le texte qu'il y avait dans le fichier avant que le commit soit fait, il ne saura pas comment modifier le fichier. Modifier le fichier à nouveau va résoudre le conflit. Faites votre changement, et sauvez le fichier.
```bash
<p>Need help? Email support@webhost.us.</p>
```
Maintenant, lancez:
```bash
git add conflicting_file_1.txt
git rebase --continue
```
Git enregistre le changement dans le fichier conflictuel, et continue à appliquer les commits depuis votre branche jusqu'à ce qu'il arrive à la fin.
Maintenant que vous avez configuré votre environnement de build, vous être prêts à compiler un firmware customisé. Pour cette section, nous allons utiliser trois programmes différents: votre explorateur de fichier, votre éditeur de texte et votre fenêtre de terminal. Gardez les 3 ouverts jusqu'à ce que vous ayez terminé et soyez content de votre firmware de clavier.
Si vous avez fermé et rouvert votre fenêtre de terminal depuis le démarrage de ce guide, n'oubliez pas de `cd qmk_firmware` afin que votre terminal soit dans le bon répertoire.
## Naviguez vers votre répertoire keymaps
Démarrez par naviguer dans le répertoire `keymaps` de votre clavier.
?> Si vous êtes sous macOS ou Windows, il y a des commandes que vous pouvez utiliser pour facilement ouvrir le dossier keymaps.
?> macOS:
open keyboards/<keyboard_folder>/keymaps
?> Windows:
start .\\keyboards\\<keyboard_folder>\\keymaps
## Créez une copie de la keymap `default`
Une fois le dossier `keymaps` ouvert, créez une copie du répertoire `default`. Nous vous recommandons de nommer ce répertoire de la même manière que votre nom d'utilisateur GitHub. Vous pouvez aussi utiliser le nom que vous voulez, tant qu'il contient uniquement des lettres minuscules, des nombres et le caractère souligné (_).
Afin d'automatiser ce processus, vous avez aussi l'option de lancer le script `new_keymap.sh`.
Naviguez vers le répertoire `qmk_firmware/util` et tapez ce qui suit:
```
./new_keymap.sh <keyboard path> <username>
```
Par exemple, pour un utilisateur s'appeleant John, essayant de créer une nouvelle keymap pour le 1up60hse, il taperait:
```
./new_keymap.sh 1upkeyboards/1up60hse john
```
## Ouvrez `keymap.c` dans votre éditeur de texte préféré
Ouvrez votre fichier `keymap.c`. Dans ce fichier, vous trouverez la structure qui contrôle comment votre clavier se comporte. En haut du fichier `keymap.c` il peut y avoir quelques `defines` et `enums` qui rendent la keymap plus simple à lire. Plus bas, vous trouverez une ligne telle que celle-ci:
Cette ligne indique le début d'une liste de calques (layers). En dessous, vous trouverez des lignes contenant soit `LAYOUT`, soit `KEYMAP` et ces lignes indiquent le début d'un calque. En dessous de cette ligne se trouve la liste des touches qui comprennent ce calque particulier.
!> Lorsque vous éditez votre fichier keymap, faites attention à ne pas ajouter ou enlever une virgule. Si vous le faites, vous aller empêcher votre firmware de compiler et il ne sera pas facile de trouver où la virgule est manquante ou en trop.
## Customisez le layout à votre goût
Libre à vous de choisir comment compléter cette étape. Faites le petit changement qui vous dérange ou retravaillez tout de zéro. Vous pouvez supprimer des calques si vous ne les utilisez pas tous, ou ajouter des calques jusqu'à un maximum de 32. Vérifiez la documentation suivante pour trouver ce que vous pouvez définir ici:
* [Keycodes](keycodes.md)
* [Fonctionnalités](features.md)
* [FAQ](faq.md)
?> Lorsque vous découvrez comment des keymaps fonctionnent, faites de petits changements. De gros changements rendent le débuggage des problèmes éventuels plus difficile.
## Compilez votre firmware
Lorsque les changements de votre keymap sont complets, vous allez devoir compiler le firmware. Pour ce faire, retournez à votre terminal et lancez la commande de compilation:
make <my_keyboard>:<my_keymap>
Par exemple, si votre keymap s'appelle "xyverz" et vous compilez une keymap pour une plank rev5, vous allez utiliser cette commande:
make planck/rev5:xyverz
Durant la compilation, vous allez avoir beaucoup de messages sur l'écran vous informant de quels fichiers sont en train d'être compilés. Il devrait se terminer avec des messages qui ressemblent comme suit:
```
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
```
## Flasher votre firmware
Allez sur la page [Flasher le firmware](fr-FR/newbs_flashing.md) pour apprendre comment écrire votre nouveau firmware sur votre clavier.
Le [Configurateur de QMK](https://config.qmk.fm) est une interface graphique en ligne permettant de générer des fichiers "hex" du firmware de QMK.
?> **S'il vous plaît, suivez les étapes suivantes dans l'ordre.**
Regardez le [Tutoriel vidéo](https://youtu.be/tx54jkRC9ZY)
Le configurateur de QMK fonctionne mieux avec Chrome et Firefox.
!> **Les fichiers d'autres outils, tels que KLE ou kbfirmware ne seront pas compatibles avec le configurateur QMK. Ne les chargez pas, ne les importez pas. Le configurateur QMK est un outil DIFFERENT.**
## Sélectionner votre clavier
Cliquez la boîte déroulante et sélectionnez le clavier pour lequel vous voulez créer une keymap.
?> Si votre clavier a plusieurs versions, faites attention à utiliser la bonne.
Je vais le répéter, parce que c'est important
!> **FAITES ATTENTION A UTILISER LA BONNE VERSION !**
Si votre clavier est annoncé comme fonctionnant grâce à QMK mais n'est pas dans la liste, il y a des chances que le développeur ne l'ait pas encore fait, ou que nous n'avons pas encore eu le temps de le merger. Ajoutez un problème (issue) sur [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) demandant le support de votre clavier, s'il n'y a pas de [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) ouvert pour lui. Il y a aussi des clavier alimentés par QMK qui sont sur le compte GitHub du fabriquant, il est bon de le vérifier aussi.
## Sélectionner la disposition de votre clavier
Choisissez la disposition (layout) qui représente le mieux la keymap que vous voulez créer. Certains clavier n'ont pas encore assez de dispositions ou des dispositions incorrectes. Ils seront supportés dans le future.
## Nom de la Keymap
Appelez cette keymap comme vous voulez.
?> Si vous rencontrez des problèmes lors de la compilation, il peut être utile de changer ce nom, il peut déjà exister dans le dépôt du firmware QMK.
## Créer votre keymap
Entrer un keycode peut s'accomplir de 3 façons différentes.
1. Glisser déposer
2. Cliquer sur un endroit vide sur le layout et cliquer sur le keycode souhaité
3. Cliquer sur un endroit vide sur le layout et appuyer sur une touche physique de votre clavier.
Passez votre souris au dessus d'une touche et un affichage vous dira quel est le rôle du keycode. Pour une version plus verbeuse suivre:
Dans le cas où vous ne trouvez pas une disposition qui supporte votre keymap, par exemple trois places pour une barre d'espace, ou deux places pour retour clavier, ou deux places pour shift, etc. etc. remplissez les TOUTES.
### Exemples
3 places pour la barre d'espace: Remplissez les TOUTES avec la barre d'espace
2 places pour un retour clavier: Remplissez les DEUX avec un retour clavier
2 places pour un shift droit: Remplissez les DEUX avec un shift droit
1 place pour un shift gauche et 1 place pour le support ISO: Remplissez les deux avec un shift gauche
5 places, mais seulement 4 touches: Deviner et vérifier, ou demander à quelqu'un qui l'a déjà fait.
## Sauvez votre keymap pour des éditions futures
Une fois satisfait de votre keymap, ou si vous souhaitez revenir travailler dessus plus tard, appuyez sur le bouton `Export Keymap`. Il vous permettra de sauvegarder votre keymap avec le nom choisi au dessus suivi de .json.
Vous pouvez ensuite charger ce fichier .json à nouveau en appuxant sur le bouton `Import Keymap`.
!> **ATTENTION** Ce n'est pas le même type de fichier .json utilisé pour kbfirmware.com ou n'importe quel autre outil. Si vous essayez d'utiliser ce fichier pour d'autres outil, ou le fichier .json d'autres outils avec le configurateur QMK, il y a des chances que votre clavier **explose**.
## Générer votre fichier firmware
Appuyez sur le bouton `Compile`.
Une fois la compilation terminée, vous pourrez appuyer sur le bouton vert `Download Firmware`.
## Ecrire votre firmware sur votre clavier
Merci de vous référer à [Flasher le Firmware](fr-FR/newbs_flashing.md)
## Dépannage
#### Mon fichier json ne fonctionne pas
Si le fichier .json a été généré par le configurateur QMK, bravo vous avez trouvé un bug. Merci d'ouvrir une issue sur [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
Sinon... vous avez raté mon message écris en gras qui dit de ne pas utiliser d'autres fichiers .json?
#### Il y a des espaces en trop dans mon alyout? Qu'est-ce que je fais?
Si vous voulez dire que vous avez trois places pour une barre d'espace, le mieux est de les remplir tous avec une barre d'espace. Vous pouvez faire de même avec les retour clavier et les shift.
Merci de vérifier les autres dispositions de votre keymap afin d'être sûr qu'il n'y a pas de touches aléatoires.
## Problèmes et Bugs
Nous acceptons toujours les demandes des clients et les rapports de bugs. Merci de les remplirs sur [qmk_configurator](https://github.com/qmk/qmk_configurator/issues)
Maintenant que vous avez compilé un firmware custom, vous allez vouloir le flasher dans votre clavier.
## Flasher votre clavier avec QMK Toolbox
La manière la plus simple de flasher votre clavier est avec [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases).
Toutefois, la QMK Toolbox n'est actuellement disponible que pour Windows et macOS. Si vous utilisez Linux (ou préférez flasher le firmware depuis la ligne de commande), vous devrez utiliser [la métode décrite ci-dessous](newbs_flashing.md#flash-your-keyboard-from-the-command-line).
### Charger le fichier dans QMK Toolbox
Démarrez en ouvrant l'application QMK Toolbox. Cherchez le fichier de firmware dans Finder ou Explorer. Vore firmware de clavier peut être dans un de deux formats `.hex` ou `.bin`. QMK essaye de copier le bon format pour votre clavier du répertoire racine `qmk_firmware`.
?> Si vous êtes sous Windows ou macOS il y a des commandes que vous pouvez utiliser pour facilement ouvrir le répertoire firmware dans Explorer ou Finder.
?> Windows:
start .
?> macOS:
open .
Le fichier firmware suit toujours ce format de nommage:
<keyboard_name>_<keymap_name>.{bin,hex}
Par exemple, le `plank/rev5` avec une keymap `default` aura ce nom de fichier:
planck_rev5_default.hex
Une fois que vous aurez trouvé votre fichier de firmware, glissez le dans la boîte "Local file" sur QMK Toolbox, ou cliquez sur "Open" et naviguez où votre firmware est enregistré.
### Mettez votre clavier en mode DFU (Bootloader)
Afin de flasher votre firmware custom, vous devez mettre votre clavier dans un mode spécial. Lorsqu'il sera dans ce mode, vous ne pourrez pas taper ou utiliser votre clavier. Il est très important que vous ne débranchiez pas votre clavier ou n'arrêtiez pas le processus d'écriture du firmware.
Chaque clavier a une manière différente d'entrer dans ce mode spécial. Si votre clavier tourne actuellement QMK ou TMK et vous n'avez pas reçu d'instruction spécifiques, essayez, dans cet ordre:
* Enfoncez les deux touches shift et appuyez sur `Pause`
* Enfoncez les deux touches shift et appuyez sur `B`
* Débranchez votre clavier, gardez shift la barre d'espace et `B` en même temps, branchez votre clavier et attendez une seconde avant de relâcher les touches.
* Appuyez la touche physique `RESET` en bas du PCB
* Trouvez les pins sur le PCB marquées `BOOT0` ou `RESET`, court circuitez ces pins en branchant votre PCB
Lorsque vous aurez réussi, vous verrez le message suivant dans QMK Toolbox:
## Flashez votre clavier à l'aide de la ligne de commande
La première chose que vous devez savoir c'est quel bootloader utilise votre clavier. Il y a quatre bootloaders principaux. Pro-Micro et les clones, utilisent CATERINA, les Teensy utilisent Halfkay, les OLKB utilisent QMK-DFU et les autres chips atmega32u4 utilisent DFU.
Vous pouvez trouver plus d'information à propos des bootloaders sur la page [Instructions de flash et information sur le Bootloader](flashing.md).
Si vous savez quel bootloader vous utilisez, lorsque vous compilez le firmware, vous pouvez ajouter quelques options à la commande `make` pour automatiser le processus de flash.
### DFU
Pour le bootloader DFU, lorsque vous êtes prêts à compiler et flasher votre firmware, ouvrez votre fenêtre de terminal et lancez la commande de compilation:
make <my_keyboard>:<my_keymap>:dfu
Par exemple, si vous keymap s'appelle "xyverz" et vous compilez une keymap pour une plank rev5, vous utiliserez cette commande:
make planck/rev5:xyverz:dfu
Une fois la compilation terminée, le résultat devrait être le suivant:
```
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
```
Une fois arrivé à ce stade, le script de compilation va checher le bootloader DFU toutes les 5 secondes. Il va répéter les messages suivants jusqu'à ce que l'appareil soit trouvé ou que vous l'annuliez.
dfu-programmer: no device present.
Error: Bootloader not found. Trying again in 5s.
Une fois terminé, vous devrez mettre à zéro le contrôleur. Vous allez voir un résultat similaire à ceci:
```
*** Attempting to flash, please don't remove device
0x5600 bytes written into 0x7000 bytes memory (76.79%).
>>> dfu-programmer atmega32u4 reset
```
?> Si vous avez des soucis concerant ceci - comme par exemple `dfu-programmer: no device present` - merci de regarder [Foires Aux Questions de Compilation](faq_build.md).
#### Commandes DFU
Il y aun certain nombre de commandes du DFU que vous pouvez utiliser pour flasher un firmware sur un device DFU:
* `:dfu` - C'est l'option standard qui attends jusqu'à e qu'un appareil DFU soit disponible, puis flash le firmware. Il va vérifier toutes les 5 secondes, afin de voir si un appareil DFU est apparu.
* `:dfu-ee` - Ceci flash un fichier `eep` à la place du standard hex, peu commun.
* `:dfu-split-left` - Ceci flash le firmware standard, comme la commande standard (`:dfu`). Toutefois, elle flash aussi les fichiers EEPROM du "côté gauche" pour les claviers scindés. _C'est l'option idéale pour les claviers scindés basés sur Elite C._
* `:dfu-split-right` - Ceci flash le firmware standard, comme la commande standard (`:dfu`). Toutefois, elle flash aussi les fichiers EEPROM du "côté droit" pour les claviers scindés. _C'est l'option idéale pour les claviers scindés basés sur Elite C._
### Caterina
Pour les boards Arduino et leurs clones (tel que le SparkFun ProMicro), lorsque vous êtes prêt à compiler et flasher votre firmware, ouvrez votre terminal et lancer la commande de compilation:
make <my_keyboard>:<my_keymap>:avrdude
Par exemple, si votre keymap se nomme "xyverz" et que vous compilez une keymap pour un Lets Split rev2, vous utiliserez la commande suivante:
make lets_split/rev2:xyverz:avrdude
Une fois le firmware compilé, vous aurez le résultat suivant:
```
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..............
```
Une fois ceci fait, réinitialisez votre board et le script va détecter et flasher le firmware. La sortie devrait ressember à quelque chose comme ça:
```
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
avrdude.exe: safemode: Fuses OK (E:CB, H:D8, L:FF)
avrdude.exe done. Thank you.
```
Si vous avez un soucis, essayez de faire ceci:
sudo make <my_keyboard>:<my_keymap>:avrdude
En addition, si vous voulez flasher plusieurs boards, utilisez la commande suivante:
make <keyboard>:<keymap>:avrdude-loop
Une fois que vous avez terminé de flasher des boards, vous devrez appuyer sur Ctrl + C, ou les touches correspondantes pour votre système d'exploitation pour arrêter la boucle.
### HalfKay
Pour les composants PJRC (les Teensy), lorsque vous êtes prêts à compiler et flasher votre firmware, ouvrez votre fenêtre de terminal et lancez la commande de compilation suivante:
make <my_keyboard>:<my_keymap>:teensy
Par exemple, si vous keymap s'appelle "xyverz" et vous compilez une keymap pour un Ergodox ou un Ergodox EZ, vous utiliserez cette commande:
make ergodox_ez:xyverz:teensy
Une fois la compilation du firmware terminée, votre sortie devrait ressembler à ça:
```
Linking: .build/ergodox_ez_xyverz.elf [OK]
Creating load file for flashing: .build/ergodox_ez_xyverz.hex [OK]
Pour les boards basée sur Bootmapper Client(BMC)/bootloadHID/ATmega32A, une fois prêt à compiler et flasher le firmware, ouvrez votre fenêtre de terminal et lancez la commande suivante:
make <my_keyboard>:<my_keymap>:bootloaderHID
Par exemple, si votre keymap s'appelle "xyverz" et que vous compilez une keymap pour un jj40, vous utilisez cette commande:
make jj40:xyverz:bootloaderHID
Une fois le firmware compilé, vous aurez cette sortie:
```
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)
```
A ce stade, le script de build va chercher le bootloader DFU toutes les 5 secondes. Il va répéter la sortie suivante jusqu'à ce que le dispositif soit trouvé ou que vous l'annuliez.
```
Error opening HIDBoot device: The specified device was not found
Trying again in 5s.
```
Une fois ce résultat atteint, réinitialisez le contrôleur. Il devrait afficher le résultat suivant:
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
0x05580 ... 0x05600
```
### STM32 (ARM)
Pour la majorité des boards ARM (incluant les Proton C, Planck Rev 6, et Preonic Rev 3), lorsque vous êtes prêt à compiler et flasher votre firmware,ouvrez la fenêtre de terminal et lancez la commande de compilation:
make <my_keyboard>:<my_keymap>:dfu-util
Par exemple, si votre keymap s'appelle "xyverz" et vous compilez une keymap pour le clavier Plank Revision 6, vous utiliserez cette commande et redémarrerez le clavier vers le bootloader (avant que la compilation soit terminée):
make planck/rev6:xyverz:dfu-util
Une fois le firmware compilé, il va afficher quelque chose comme ça:
```
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]
Il y aun certain nombre de commandes du DFU que vous pouvez utiliser pour flasher un firmware sur un device STM32:
* `:dfu-util` - C'est l'option standard pour flasher un appareil STM32.
* `:dfu-util-wait` - Ceci fonctionne comme la commande standard, mais permet de d'avoir une pause (configurable( de 10 secondes avant de flasher le fimrware. Vous pouvez utiliser `TIME_DELAY=20` à la ligne de commande pour changer le délai.
* `:dfu-util-left` - Ceci flasher le firmware standard, comme la commande standard (`:dfu-util`). Toutefois, elle flasher aussi les fichiers EEPROM du "côté gauche" pour les claviers scindés.
* `:dfu-util-right` - Ceci flash le firmware standard, comme la commande standard (`:dfu-util`). Toutefois, elle flash aussi les fichiers EEPROM du "côté droit" pour les claviers scindés.
## Faites l'essai!
Bravo! Votre firmware customisé a été programmé sur votre clavier!
Essayez-le et vérifiez qu'il fonctionne comme vous le souhaitez. Nous avons écrit [Tester et débugger](newbs_testing_debugging.md) pour compléter le guide du débutant, alors allez voir là-bas pour apprendre comment dépanner vos fonctionnalités custom.
Votre clavier d'ordinateur contient un processeur, proche de celui dans votre ordinateur. Ce processeur exécute un logiciel responsable de détecter les touches appuyées et envoie des rapports à propos de l'état du clavier lorsque les touches sont appuyées et relâchées. QMK prend le rôle de ce logiciel, détectant les appuis des boutons et passant cette information à l'ordinateur hôte. Lorsque vous construisez votre keymap customisée, vous créez l'équivalent d'un programme exécutable pour votre clavier.
QMK essaie de rendre les choses simples faciles, et les choses difficiles possibles. Vous n'avez pas à savoir programmer pour créer des keymaps puissantes - vous devez seulement suivre quelques rêgles de syntaxe simples.
# Guide de démarrage
Avant de pouvoir construire des keymaps, vous devez installer quelques logiciels et configurer votre environnement de compilation. Ceci n'a besoin d'être fait seulement une fois, peu importe le nombre de clavier pour lesquels vous compter compiler un firmware.
Si vous préférez une approche plus proche d'une interface graphique, considérez utiliser l'outil en ligne [QMK Configurator](https://config.qmk.fm). Référez vous à [Construire votre premier firmware en utilisant l'interface graphique en ligne](newbs_building_firmware_configurator.md).
## Logiciels à télécharger
### Editeur de texte
Vous allez avoir besoin d'un programme qui peut éditer et sauvegarder des fichier **plain text**. Si vous êtes sur Windows, vous pouvez utiliser notepad et sur Linux vous pouvez utiliser gedit. Ces deux options sont des éditeurs de texte simples mais fonctionnels. Sur macOS, faites attention avec l'application par défaut TextEdit: elle ne sauvegardera pas les fichiers en mode "plain text" sauf si vous sélectionnez explicitement _Make Plain Text_ à partir du menu _Format_.
Vous pouvez aussi télécharger et installer un éditeur de texte dédié comme [Sublime Text](https://www.sublimetext.com/) ou [VS Code](https://code.visualstudio.com/). C'est probablement la meilleure solution peu importe la plateforme car ce sont des programmes conçus spécifiquement pour éditer du code.
?> Pas sûr de quel éditeur de texte utiliser? Laurence Bradford a écrit une [excellente introduction](https://learntocodewith.me/programming/basics/text-editors/) au sujet.
### QMK Toolbox
QMK Toolbox est un programme graphique optionnel pour Windows et macOS qui permet à la fois de programmer et débugger votre clavier customisé. Il vous sera probablement très utile pour facilement flasher votre clavier et analyser ses messages de débugage.
[Télécharger la dernière version ici.](https://github.com/qmk/qmk_toolbox/releases/latest)
* Pour Windows: `qmk_toolbox.exe` (portable) or `qmk_toolbox_install.exe` (installeur)
* Pour macOS: `QMK.Toolbox.app.zip` (portable) or `QMK.Toolbox.pkg` (installeur)
## Configurez votre environnement
Nous avons essayé de rendre QMK aussi simple que possible à configurer. Vous avez uniquement à préparer votre environnment Linux ou Unix et laisser QMK installer le reste.
?> Si vous n'avez jamais travailé avec la lignde commande Linux/Unix, il y a un certain nombre de concepts basiques et de commandes que vous devriez apprendre. Ces ressources vous apprendrons suffisemment pour travailler avec QMK:<br>
[Commandes Linux à savoir](https://www.guru99.com/must-know-linux-commands.html)<br>
[Commandes Unix de base](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html)
### Windows
Vous devez installer MSYS2 et Git.
* Suivez les instructions d'installation sur la [page de MSYS2](http://www.msys2.org).
* Fermez tous les terminaux MSYS2 éventuellement ouverts et ouvrez un nouveau terminal MSYS2 MinGW 64-bit.
* Installez Git en lançant la commande: `pacman -S git`.
### macOS
Vous devez installer Homebew. Suivez les instructions sur la [page de Homebrew](https://brew.sh).
Une fois Homebrew installé, continuez avec _Configurer QMK_. Dans cete étape, nous lancerons un script qui va installer d'autres paquets.
### Linux
Vous devez installer Git. Il est très probable que vous l'ayez déjà installé, mais sinon, une des commandes suivantes devrait l'installer:
* Debian / Ubuntu / Devuan: `apt-get install git`
* Fedora / Red Hat / CentOS: `yum install git`
* Arch: `pacman -S git`
?> Docker est aussi une option sur toutes les plateformes. [Appuyez ici pour plus de détail.](getting_started_build_tools.md#docker)
## Configurer QMK
Une fois votre environnement Linux/Unix configuré, vous êtes prêt à télécharger QMK. Nous allons le faire en utilisant Git pour "cloner" le dépôt de QMK. Ouvrez un terminal ou une fenêtre MSYS2 MinGW et gardez le ouvert pour le reste de ce guide. Dans ce terminal, lancez ces deux commandes:
?> Si vous savez déjà [comment utiliser GitHub](getting_started_github.md), nous recommandons que vous créez et clonez votre propre fork. Si vous ne savez pas ce que cela veut dire, vous pouvez sans problème ignorer ce message.
QMK vient avec un script pour vous aider à configurer le reste de ce que vous aurez besoin. Vous devez le lancer en tapant la ligne de commande suivante:
util/qmk_install.sh
## Testez votre environnement de compilation
Maintenant que votre environnement de compilation de QMK est configuré, vous pouvez compiler un firmware pour votre clavier. Démarrez en compilant la keymap par défaut du clavier. Vous devriez pouvoir le faire avec une commande de ce format:
make <keyboard>:default
Par exemple, pour compiler un firmware pour une Clueboard 66%, vous utiliserez:
make clueboard/66/rev3:default
Une fois ceci fait, vous devriez avoir beaucoup d'information dans votre sortie qui devrait se terminer par quelque chose de similaire à ça:
Ces ressources permettent de donner aux nouveaux membres de la communauté QMK plus de compréhension aux informations données dans la documentation Newbs.
Une fois votre clavier configuré avec un firmware custom, vous êtes prêt à le tester. Avec un peu de chance, tout fonctionne parfaitement bien, dans le cas contraire, ce document vous aidera à trouver où se trouve le problème.
## Tester
Tester votre clavier est normalement assez simple. Appuyez chaque touche de votre clavier et assurez vous qu'il envoie les touches auquel vous vous attendiez. Il existe même des programmes qui vous aideront à vérifier qu'aucune touche ne soit oubliée.
Note: ces programmes ne sont ni fournis ni approuvés par QMK.
Votre clavier va envoyer des informations de débugage si vous avez `CONSOLE_ENABLE = yes` dans votre fichier `rules.mk`. Par défaut, la sortie est très limitée, mais vous pouvez activer le mode debug pour augmenter la quantité de sortie de débugage. Utilisez le keycode `DEBUG` dans votre keymap, utilisez la fonction [Commande](feature_command.md) pour activer le mode debug ou ajoutez le code suivant à votre keymap.
```c
voidkeyboard_post_init_user(void){
// Customise these values to desired behaviour
debug_enable=true;
debug_matrix=true;
//debug_keyboard=true;
//debug_mouse=true;
}
```
### Débuguer avec QMK Toolbox
Pour les plateformes compatibles, [QMK Toolbox](https://github.com/qmk/qmk_toolbox) peut être utilisé pour afficher les message de débugage pour votre clavier.
### Débuguer avec hid_listen
Vous préférez une solution basée sur le terminal? [hid_listen](https://www.pjrc.com/teensy/hid_listen.html), fourni par PJRC, peut aussi être utilisé pour afficher des messages de débugage. Des versions compilées pour Windows, Linux et MacOS sont disponibles.
<!-- FIXME: Describe the debugging messages here. -->
## Envoyer vos propres messages de débugage
Parfois, il est utile d'afficher des messages de débugage depuis votre [code custom](custom_quantum_functions.md). Le faire est assez simple. Commencez par ajouter `print.h` au début de votre fichier:
#include<print.h>
Une fois fait, vous pouvez utiliser les fonctions print suivantes:
*`print("string")`: Affiche une simple chaîne de caractères.
*`uprintf("%s string", var)`: Affiche une chaîne de caractères formattée.
*`dprint("string")` Affiche une chaîne de caractère simple, mais uniquement lorsque le mode debug est activé.
*`dprintf("%s string", var)`: Affiche une chaîne de caractère formattée, mais uniquement lorsque le mode debug est activé.
## Exemples de debugage
Si dessous se trouve une liste d'exemples réels de débugage. Pour plus d'information, référez-vous à [Débuguer/Dépanner QMK](faq_debug.md).
### A quelle position de la matrice se trouve cette activation de touche?
Lors du portage ou lorsque vous essayez de diagnostiquer un problème de PCB, il est utile de savoir si une activation de touche est enregistrée correctement. Pour activer le log de ce scénario, ajoutez le code suivant à votre fichier keymaps `keymap.c`.
### Combien de temps cela a pris pour une activation de touche?
Lorsque vous testez des problèmes de performance, il peut être utile de savoir à quelle fréquence la matrice est scannée. Pour activer le log dans ce scénario, ajoutez la ligne suivante à votre fichier `config.h` de votre keymaps.
@@ -62,14 +62,14 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands:
brew tap osx-cross/avr
brew tap PX4/homebrew-px4
brew update
brew install avr-gcc@7
brew link --force avr-gcc@7
brew install avr-gcc@8
brew link --force avr-gcc@8
brew install dfu-programmer
brew install dfu-util
brew install gcc-arm-none-eabi
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@7` can take over 20 minutes and exhibit high CPU usage.
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.
@@ -12,11 +12,17 @@ Within the folder `users` is a directory for each user. This is a place for user
### Keyboard Project Structure
Within the folder `keyboards` and its subfolder `handwired` is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard`. Within it you'll find the following structure:
Within the folder `keyboards`, its subfolder `handwired` and its vendor and manufacture subdirectories e.g. `clueboard` is a directory for each keyboard project, for example `qmk_firmware/keyboards/clueboard/2x1800`. Within it, you'll find the following structure:
*`keymaps/`: Different keymaps that can be built
*`rules.mk`: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific `rules.mk`.
*`config.h`: The file that sets the default compile time options. Do not edit this file directly, instead use a keymap specific `config.h`.
*`info.json`: The file used for setting layout for QMK Configurator. See [Configurator Support](reference_configurator_support.md) for more information.
*`readme.md`: A brief overview of the keyboard.
*`<keyboardName>.h`: This file is where the keyboard layout is defined against the keyboard's switch matrix.
*`<keyboardName>.c`: This file is where you can find custom code for the keyboard.
For more information on project structure, see [QMK Keyboard Guidelines](hardware_keyboard_guidelines.md).
@@ -14,7 +14,7 @@ The full syntax of the `make` command is `<keyboard_folder>:<keymap>:<target>`,
The `<target>` means the following
* If no target is given, then it's the same as `all` below
*`all` compiles as many keyboard/revision/keymap combinations as specified. For example, `make planck/rev4:default` will generate a single .hex, while `make planck/rev4:all` will generate a hex for every keymap available to the planck.
*`dfu`, `teensy`, `avrdude` or`dfu-util`, compile and upload the firmware to the keyboard. If the compilation fails, then nothing will be uploaded. The programmer to use depends on the keyboard. For most keyboards it's `dfu`, but for ChibiOS keyboards you should use `dfu-util`, and `teensy` for standard Teensys. To find out which command you should use for your keyboard, check the keyboard specific readme.
*`dfu`, `teensy`, `avrdude`,`dfu-util` or `bootloadHID`, compile and upload the firmware to the keyboard. If the compilation fails, then nothing will be uploaded. The programmer to use depends on the keyboard. For most keyboards it's `dfu`, but for ChibiOS keyboards you should use `dfu-util`, and `teensy` for standard Teensys. To find out which command you should use for your keyboard, check the keyboard specific readme.
* **Note**: some operating systems need root access for these commands to work, so in that case you need to run for example `sudo make planck/rev4:default:dfu`.
*`clean`, cleans the build output folders to make sure that everything is built from scratch. Run this before normal compilation if you have some unexplainable problems.
@@ -41,8 +41,6 @@ Set these variables to `no` to disable them, and `yes` to enable them.
This allows you to hold a key and the salt key (space by default) and have access to a various EEPROM settings that persist over power loss. It's advised you keep this disabled, as the settings are often changed by accident, and produce confusing results that makes it difficult to debug. It's one of the more common problems encountered in help sessions.
Consumes about 1000 bytes.
`MOUSEKEY_ENABLE`
This gives you control over cursor movements and clicks via keycodes/custom functions.
@@ -67,8 +65,6 @@ To see the text, open `hid_listen` and enjoy looking at your printed messages.
**NOTE:** Do not include *uprint* messages in anything other than your keymap code. It must not be used within the QMK system framework. Otherwise, you will bloat other people's .hex files.
Consumes about 400 bytes.
`COMMAND_ENABLE`
This enables magic commands, typically fired with the default magic key combo `LSHIFT+RSHIFT+KEY`. Magic commands include turning on debugging messages (`MAGIC+D`) or temporarily toggling NKRO (`MAGIC+N`).
@@ -83,7 +79,7 @@ This allows the keyboard to tell the host OS that up to 248 keys are held down a
`BACKLIGHT_ENABLE`
This enables your backlight on Timer1 and ports B5, B6, or B7 (for now). You can specify your port by putting this in your `config.h`:
This enables the in-switch LED backlighting. You can specify the backlight pin by putting this in your `config.h`:
#define BACKLIGHT_PIN B7
@@ -125,11 +121,9 @@ Use this to debug changes to variable values, see the [tracing variables](unit_t
This enables using the Quantum SYSEX API to send strings (somewhere?)
This consumes about 5390 bytes.
`KEY_LOCK_ENABLE`
This enables [key lock](feature_key_lock.md). This consumes an additional 260 bytes.
This project includes a Vagrantfile that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
This project includes a `Vagrantfile` that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
## Requirements
Using the `/Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion).
Using the `Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as a supported provider installed:
*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**`vagrant plugin install vagrant-vbguest`
* [VirtualBox](https://www.virtualbox.org/) (Version at least 5.0.12)
* Sold as 'the most accessible platform to use Vagrant'
* [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware)
* The (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion
* [Docker](https://www.docker.com/)
Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
Other than having Vagrant, a suitable provider installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start an environment (either a virtual machine or container) that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
# Flashing the Firmware
## Flashing the Firmware
The "easy" way to flash the firmware is using a tool from your host OS:
@@ -19,3 +23,35 @@ The "easy" way to flash the firmware is using a tool from your host OS:
If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
## Vagrantfile Overview
The development environment is configured to run the QMK Docker image, `qmkfm/base_container`. This not only ensures predictability between systems, it also mirrors the CI environment.
## FAQ
### Why am I seeing issues under Virtualbox?
Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**
```console
vagrant plugin install vagrant-vbguest
```
### How do I remove an existing environment?
Finished with your environment? From anywhere inside the folder where you checked out this project, Execute:
```console
vagrant destory
```
### What if I want to use Docker directly?
Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker:
```console
vagrant up --provider=docker
```
### How do I access the virtual machine instead of the Docker container?
Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image:
This page describes the support for for AVR processors in QMK. AVR processors include the atmega32u4, atmega32u2, at90usb1286, and other processors from Atmel Corporation. AVR processors are 8-bit MCU's that are designed to be easy to work with. The most common AVR processors in keyboards have on-board USB and plenty of GPIO for supporting large keyboard matrices. They are the most popular MCU for use in keyboards today.
This page describes the support for for AVR processors in QMK. AVR processors include the atmega32u4, atmega32u2, at90usb1286, and other processors from Atmel Corporation. AVR processors are 8-bit MCUs that are designed to be easy to work with. The most common AVR processors in keyboards have on-board USB and plenty of GPIO for supporting large keyboard matrices. They are the most popular MCU for use in keyboards today.
If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_guidelines.md) to get a sense of how keyboards fit into QMK.
@@ -78,7 +78,7 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r
#define DESCRIPTION A custom keyboard
```
?> Note: On Windows and macOS the `MANUFACTURER`,`PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. ?> On Linux these values will not be visible in lsusb by default, since Linux takes the information from the list maintained by [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. lsusb will show the information reported by the device when executed with -v option. It is also present in kernel logs after plugging in the device.
?> Windows and macOS will display the `MANUFACTURER` and`PRODUCT` in the list of USB devices. `lsusb` on Linux instead takes these from the list maintained by the [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. `lsusb -v` will show the values reported by the device, and they are also present in kernel logs after plugging it in.
### Keyboard Matrix Configuration
@@ -125,7 +125,7 @@ To configure a keyboard where each switch is connected to a separate pin and gro
### Backlight Configuration
By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are using one of those you can simply enable it here. For more details see the [Backlight Documentation](feature_backlight.md).
QMK supports backlighting on most GPIO pins. A select few of these can be driven by the MCU in hardware. For more details see the [Backlight Documentation](feature_backlight.md).
```c
#define BACKLIGHT_PIN B7
@@ -134,8 +134,6 @@ By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are us
#define BREATHING_PERIOD 6
```
?> You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details.
### Other Configuration Options
There are a lot of features that can be configured or tuned in `config.h`. You should see the [Config Options](config_options.md) page for more details.
@@ -20,7 +20,7 @@ Support for SSD1306 based OLED displays. For more information see the [OLED Driv
## uGFX
You can make use of uGFX within QMK to drive character and graphic LCD's, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
You can make use of uGFX within QMK to drive character and graphic LCDs, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
@@ -67,7 +67,7 @@ The presence of this file means that the folder is a keyboard target and can be
### `<keyboard_name.c>`
This is where you will write custom code for your keyboard. Typically you will write code to initialize and interface with the hardware in your keyboard. If your keyboard consists of only a key matrix with no LEDs, speakers, or other auxillary hardware this file can be blank.
This is where you will write custom code for your keyboard. Typically you will write code to initialize and interface with the hardware in your keyboard. If your keyboard consists of only a key matrix with no LEDs, speakers, or other auxiliary hardware this file can be blank.
The following functions are typically defined in this file:
@@ -33,7 +33,11 @@ The firmware does not send actual letters or characters, but only scancodes.
Thus, by modifying the firmware, you can only modify what scancode is sent over
USB for a given key.
## 3. What the Operating System Does
## 3. What the Event Input/Kernel Does
The *scancode* is mapped to a *keycode* dependent on the keyboard [60-keyboard.hwdb at Master](https://github.com/systemd/systemd/blob/master/hwdb/60-keyboard.hwdb). Without this mapping, the operating system will not receive a valid keycode and will be unable to do anything useful with that key press.
## 4. What the Operating System Does
Once the keycode reaches the operating system, a piece of software has to have
it match an actual character thanks to a keyboard layout. For example, if your
@@ -63,10 +67,10 @@ You may wonder why a keyboard layout containing all of Unicode is not devised th
## How to (Maybe) Enter Unicode Characters
You can have the firmware send *sequences of keys* to use the [software Unicode Input Method](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input) of the target operating system, thus effectively entering characters independently of the layout defined in the OS.
You can have the firmware send *sequences of keys* to use the [software Unicode Input Method](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_input) of the target operating system, thus effectively entering characters independently of the layout defined in the OS.
Yet, it does come with multiple disadvantages:
- Tied to a specific OS a a time (need recompilation when changing OS);
- Tied to a specific OS at a time (need recompilation when changing OS);
- Within a given OS, does not work in all software;
|`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);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. |
|`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. |
@@ -34,7 +34,6 @@ The following defines can be used to configure the I2C master driver.
|`Prescaler` |Divides master clock to aid in I2C clock selection |1 |
AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required.
@@ -65,12 +64,47 @@ By default the I2C1 hardware driver is assumed to be used. If another hardware d
STM32 MCUs allows a variety of pins to be configured as I2C pins depending on the hardware driver used. By default B6 and B7 are set to I2C. You can use these defines to set your i2c pins:
| `I2C1_SCL_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL | `GPIOB` |
| `I2C1_SDA_BANK` | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA | `GPIOB` |
| `I2C1_SCL` | The pin number for the SCL pin (0-9) | `6` |
| `I2C1_SDA` | The pin number for the SDA pin (0-9) | `7` |
| `I2C1_BANK` (deprecated) | The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superceded by `I2C1_SCL_BANK`, `I2C1_SDA_BANK` | `GPIOB` |
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
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 |
|--------------------|------------------|
| `I2C1_OPMODE` | `OPMODE_I2C` |
| `I2C1_CLOCK_SPEED` | `100000` |
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
#### 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 |
|-----------------------|---------|
| `I2C1_TIMINGR_PRESC` | `15U` |
| `I2C1_TIMINGR_SCLDEL` | `4U` |
| `I2C1_TIMINGR_SDADEL` | `2U` |
| `I2C1_TIMINGR_SCLH` | `15U` |
| `I2C1_TIMINGR_SCLL` | `21U` |
STM32 MCUs allow for different "alternate function" modes when configuring GPIO pins. These are required to switch the pins used to I2Cv2 mode. See the respective datasheet for the appropriate values for your MCU.
| Variable | Default |
|---------------------|---------|
| `I2C1_SCL_PAL_MODE` | `4` |
| `I2C1_SDA_PAL_MODE` | `4` |
#### 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:
|`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
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.
|`MAGIC_SWAP_CONTROL_CAPSLOCK` | |Swap Caps Lock and Left Control |
|`MAGIC_CAPSLOCK_TO_CONTROL` | |Treat Caps Lock as Control |
|`MAGIC_SWAP_LCTL_LGUI` | |Swap Left Control and GUI |
|`MAGIC_SWAP_RCTL_RGUI` | |Swap Right Control and GUI |
|`MAGIC_SWAP_LALT_LGUI` | |Swap Left Alt and GUI |
|`MAGIC_SWAP_RALT_RGUI` | |Swap Right Alt and GUI |
|`MAGIC_NO_GUI` | |Disable the GUI key |
|`MAGIC_SWAP_GRAVE_ESC` | |Swap <code>`</code> and Escape |
|`MAGIC_SWAP_BACKSLASH_BACKSPACE`| |Swap `\` and Backspace |
|`MAGIC_HOST_NKRO` | |Force NKRO on |
|`MAGIC_SWAP_ALT_GUI` |`AG_SWAP`|Swap Alt and GUI on both sides |
|`MAGIC_SWAP_CTL_GUI` |`CG_SWAP`|Swap Ctrl and GUI on both sides (for macOS)|
|`MAGIC_UNSWAP_CONTROL_CAPSLOCK` | |Unswap Caps Lock and Left Control |
|`MAGIC_UNCAPSLOCK_TO_CONTROL` | |Stop treating Caps Lock as Control |
|`MAGIC_UNSWAP_LCTL_LGUI` | |Unswap Left Control and GUI |
|`MAGIC_UNSWAP_RCTL_RGUI` | |Unswap Right Control and GUI |
|`MAGIC_UNSWAP_LALT_LGUI` | |Unswap Left Alt and GUI |
|`MAGIC_UNSWAP_RALT_RGUI`||Unswap Right Alt and GUI |
|`MAGIC_UNNO_GUI` | |Enable the GUI key |
|`MAGIC_UNSWAP_GRAVE_ESC` | |Unswap <code>`</code> and Escape |
|`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace |
|`MAGIC_UNHOST_NKRO` | |Force NKRO off |
|`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Alt and GUI on both sides |
|`MAGIC_UNSWAP_CTL_GUI` |`CG_NORM`|Unswap Ctrl and GUI on both sides |
|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Alt and GUI swap on both sides |
|`MAGIC_TOGGLE_CTL_GUI` |`CG_TOGG`|Toggle Ctrl and GUI swap on both sides |
|`MAGIC_TOGGLE_NKRO` | |Turn NKRO on or off |
|`MAGIC_EE_HANDS_LEFT` | |Set "Left Hand" for EE_HANDS handedness |
|`MAGIC_EE_HANDS_RIGHT` | |Set "Right Hand" for EE_HANDS handedness |
## [Bluetooth](feature_bluetooth.md)
@@ -298,7 +307,7 @@ This is a reference only. Each group of keys links to the page documenting their
|`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)`|
|`LT(layer, kc)` |Turn on `layer` when held, `kc` when tapped |
|`TG(layer)` |Toggle `layer` on or off |
|`TO(layer)` |Turn on `layer`when pressed |
|`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 |
@@ -12,23 +12,31 @@ However, the QMK Toolbox is only available for Windows and macOS currently. If
Begin by opening the QMK Toolbox application. You'll want to locate the firmware file in Finder or Explorer. Your keyboard firmware may be in one of two formats- `.hex` or `.bin`. QMK tries to copy the appropriate one for your keyboard into the root `qmk_firmware` directory.
?> If you are on Windows or macOS there are commands you can use to easily open the current firmware folder in Explorer or Finder.
If you are on Windows or macOS there are commands you can use to easily open the current firmware folder in Explorer or Finder.
?> Windows:
#### Windows
start .
```
start .
```
?> macOS:
#### macOS
open .
```
open .
```
The firmware file always follows this naming format:
<keyboard_name>_<keymap_name>.{bin,hex}
```
<keyboard_name>_<keymap_name>.{bin,hex}
```
For example, the `plank/rev5` with a `default` keymap will have this filename:
For example, the `planck/rev5` with a `default` keymap will have this filename:
planck_rev5_default.hex
```
planck_rev5_default.hex
```
Once you have located your firmware file drag it into the "Local file" box in QMK Toolbox, or click "Open" and navigate to where your firmware file is stored.
@@ -109,7 +117,7 @@ After it gets to this point, the build script will look for the DFU bootloader e
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 similiar to this:
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
@@ -127,9 +135,7 @@ Once it does this, you'll want to reset the controller. It should then show out
>>> dfu-programmer atmega32u4 reset
```
If you have any issues with this, you may need to this:
sudo make <my_keyboard>:<my_keymap>:dfu
?> 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
@@ -217,7 +223,7 @@ Additionally, if you want to flash multiple boards, use the following command:
When you're done flashing boards, you'll need to hit Ctrl + C or whatever the correct keystroke is for your operating system to break the loop.
## HalfKay
### 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:
@@ -225,7 +231,7 @@ For the PJRC devices (Teensy's), when you're ready to compile and flash your fir
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 erdogox_ez:xyverz:teensy
make ergodox_ez:xyverz:teensy
Once the firmware finishes compiling, it will output something like this:
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:
Uploading 22016 (0x5600) bytes starting at 0 (0x0)
0x05580 ... 0x05600
```
### 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:
@@ -300,6 +342,16 @@ 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.
* `:dfu-util-wait` - This works like the default command, but it gives you a (configurable) 10 second timeout before it attempts to flash the firmware. You can use `TIME_DELAY=20` from the command line to change the timeout.
* `: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.
## Test It Out!
Congrats! Your custom firmware has been programmed to your keyboard!
@@ -34,7 +34,7 @@ For the `DIODE_DIRECTION`, most hand-wiring guides will instruct you to wire the
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. Currently only B5, B6, and B7 are supported.
`BACKLIGHT_PIN` is the pin that your PWM-controlled backlight (if one exists) is hooked-up to.
`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.
Alternatively, you don't have to immediately "return" the value. This is useful if you want to add multiple tri layers, or if you want to add additional effects.
@@ -89,7 +89,7 @@ Once the layout is as desired, move to the Raw Data tab in KLE, and copy the con
To convert this data into our JSON, go to the [QMK KLE-JSON Converter](https://qmk.fm/converter/), paste the Raw Data into the Input field, and click the Convert button. After a moment, our JSON data will appear in the Output field. Copy the contents to a new text document, and name the document `info.json`, saving it in the same folder that contains `numpad.h`.
Use the `keyboard_name` object to set the name of the keyboard. The `bootloader` object is deprecated, so it can be deleted. For instruction purposes, we will put each key's object on its own line. This is only to make the file more human-readable, and does not affect the Configurator's functionality.
Use the `keyboard_name` object to set the name of the keyboard. For instruction purposes, we will put each key's object on its own line. This is only to make the file more human-readable, and does not affect the Configurator's functionality.
A line of 32-bit MCU's produced by a number of companies, such as Atmel, Cypress, Kinetis, NXP, ST, and TI.
A line of 32-bit MCUs produced by a number of companies, such as Atmel, Cypress, Kinetis, NXP, ST, and TI.
## AVR
A line of 8-bit MCU's produced by [Atmel](http://www.microchip.com/). AVR was the original platform that TMK supported.
A line of 8-bit MCUs produced by [Atmel](http://www.microchip.com/). AVR was the original platform that TMK supported.
## AZERTY
The standard Français (French) keyboard layout. Named for the first 6 keys on the keyboard.
## Backlight
A generic term for lighting on a keyboard. The backlight is typically, but not always, an array of LED's that shine through keycaps and/or switches.
A generic term for lighting on a keyboard. The backlight is typically, but not always, an array of LEDs that shine through keycaps and/or switches.
## Bluetooth
A short range peer to peer wireless protocol. Most common wireless protocol for a keyboard.
@@ -147,7 +147,7 @@ A feature that lets you assign multiple keycodes to the same key based on how ma
A low-cost AVR development board that is commonly used for hand-wired builds. A teensy is often chosen despite costing a few dollars more due to its halfkay bootloader, which makes flashing very simple.
## Underlight
A generic term for LEDs that light the underside of the board. These LED's typically shine away from the bottom of the PCB and towards the surface the keyboard rests on.
A generic term for LEDs that light the underside of the board. These LEDs typically shine away from the bottom of the PCB and towards the surface the keyboard rests on.
## Unicode
In the larger computer world Unicode is a set of encoding schemes for representing characters in any language. As it relates to QMK it means using various OS schemes to send unicode codepoints instead of scancodes.
# How to translate the QMK docs into different languages
All files in the root folder (`docs/`) should be in English - all other languages should be in subfolders with the ISO 639-1 language codes, followed by `-` and the country code where relevant. [A list of common ones can be found here](https://www.andiamo.co.uk/resources/iso-language-codes/). If this folder doesn't exist, you may create it. Each of the translated files should have the same name as the English version, so things can fall back successfully.
A `_summary.md` file should exist in this folder with a list of links to each file, with a translated name, and link preceded by the language folder:
* [QMK简介](zh-cn/getting_started_introduction.md)
Once you've finished translating a new language, you'll also need to modify the following files:
@@ -22,7 +22,7 @@ This section of code is called "The Main Loop" because it's responsible for loop
keyboard_task();
```
This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/keyboard.c#L216), and it is responsible for detecting changes in the matrix and turning status LED's on and off.
This is where all the keyboard specific functionality is dispatched. The source code for `keyboard_task()` can be found in [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/keyboard.c#L216), and it is responsible for detecting changes in the matrix and turning status LEDs on and off.
Within `keyboard_task()` you'll find code to handle:
@@ -30,7 +30,7 @@ Within `keyboard_task()` you'll find code to handle:
* Mouse Handling
* Serial Link(s)
* Visualizer
* Keyboard status LED's (Caps Lock, Num Lock, Scroll Lock)
* Keyboard status LEDs (Caps Lock, Num Lock, Scroll Lock)
#### Matrix Scanning
@@ -175,7 +175,7 @@ FIXME: This needs to be written
FIXME: This needs to be written
#### Keyboard state LED's (Caps Lock, Num Lock, Scroll Lock)
#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock)
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.