Compare commits

...

154 Commits

Author SHA1 Message Date
Nick Brassel
3d6d899666 qmk cformat (#9500) 2020-06-22 11:21:48 +10:00
MechMerlin
cb13dd0a33 Enable NKRO on 1up's boards (#9434)
* enable NKRO and keep consistent with bootmagic set to lite

* Update keyboards/1upkeyboards/1up60hse/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-21 23:47:41 +01:00
Gregorio
af4bc251f9 Updates on Mixi default keymaps and fixes on configuration (#9467) 2020-06-21 22:59:43 +01:00
shela
e79fb2c26e [Docs] fix indentation (#9491) 2020-06-21 20:03:35 +01:00
Takeshi ISHII
3e0f8f9c8b update docs/ja/feature_bootmagic.md (#9459) 2020-06-21 21:56:06 +09:00
Takeshi ISHII
b0a31f0bf3 update ja/hardware_keyboard_guidelines.md (#9457) 2020-06-21 21:49:43 +09:00
Takeshi ISHII
a91034b802 [Update] Change Original TAGs of Japanese translations (#9453)
* The TAGs of the original document has been updated to facilitate future verification.

 * docs/ja/driver_installation_zadig.md
 * docs/ja/feature_audio.md
 * docs/ja/feature_auto_shift.md
 * docs/ja/feature_bluetooth.md
 * docs/ja/hardware_avr.md
 * docs/ja/hardware_drivers.md
 * docs/ja/getting_started_make_guide.md

* The TAG of the original document has been updated to facilitate future verification.

* The TAG of the original document has been updated to facilitate future verification.

* update docs/ja/feature_tap_dance.md
2020-06-21 21:45:27 +09:00
Takeshi ISHII
2f85f6fbff [Docs] Japanese translation of breaking_changes*.md (#8576)
* add japanese translation 'docs/ja/breaking_changes.md'

Note: this is cherry-pick from umi-umi's translation in PR #7248

* update ja/breaking_changes.md

* update ja/breaking_changes.md, add ja/breaking_changes_instructions.md

* translating ja/breaking_changes_instructions.md

* translating ja/breaking_changes_instructions.md

* translated ja/breaking_changes_instructions.md

* update ja/breaking_changes.md, ja/breaking_changes_instructions.md

Breaking change の訳語を「破壊的な変更」から「互換性を破る変更」に変更。
ただし、文中の用語としては、Breaking change をそのまま使用するむねドキュメントの導入部で
訳注でしめし、文中では、原語のまま使用する。

* update docs/ja/_summary.md

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

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

* Update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

* Update docs/ja/breaking_changes_instructions.md

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

* Update docs/ja/breaking_changes_instructions.md

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

* update docs/ja/breaking_changes.md

* Update docs/ja/breaking_changes_instructions.md

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

* Update docs/ja/breaking_changes_instructions.md

* Update docs/ja/breaking_changes_instructions.md

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

* update docs/ja/breaking_changes_instructions.md

* update docs/ja/breaking_changes_instructions.md

* The base of the translation of docs/ja/breaking_changes_instructions.md was changed to 0.9.0.

* The base of the translation of docs/ja/breaking_changes.md was changed to 0.9.0.

* Update docs/ja/breaking_changes.md

Co-authored-by: s-show <s1shimz@gmail.com>

* update docs/ja/breaking_changes.md

* Update docs/ja/breaking_changes_instructions.md

Co-authored-by: shela <shelaf@users.noreply.github.com>

* update docs/ja/breaking_changes.md

* update docs/ja/breaking_changes.md

Co-authored-by: umi-umi <57262844+umi-umi@users.noreply.github.com>
Co-authored-by: shela <shelaf@users.noreply.github.com>
Co-authored-by: s-show <s1shimz@gmail.com>
2020-06-21 20:17:16 +09:00
Ryan
32340e14fb Update newbs MSYS2 pacman instructions (#9445) 2020-06-21 10:54:53 +01:00
AlexOConnorHub
b7da69ec85 Adding information to feature_encoders.md (#9486)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-21 17:10:01 +10:00
cole smith
f36112e957 added keyboard 5x12 to boardsource folder (#9438)
* added keyboard 5x12 to boardsource folder

* Apply suggestions from code review

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-20 23:13:43 +01:00
Drashna Jaelre
30cdf9331a Change led variable in rgb_matrix_drivers to avoid conflicts (#9412)
* Change `led` to `led_matrix` in rgb_matrix_drivers

Is a minor change that only affects the driver file. 

However, this will allow somebody to run rgblight along side rgb matrix
using the ws2812 driver, as well.  Specifically, so you can use the
custom driver for rgblight to set a different pin (barring a change to
the `ws2812_setleds` function).  

Courtesy of discord conversion:
https://discordapp.com/channels/440868230475677696/568161140534935572/721555623191248906

* Change name to be super specific

* Update rgb_matrix_drivers.c
2020-06-20 23:07:26 +01:00
stanrc85
8252f378d9 Add velocikey to alice keymap (#9476) 2020-06-20 22:57:33 +01:00
siano
d7f9e6fcf1 Added missing RGB controls on layer 1. (#9481) 2020-06-20 22:47:09 +01:00
Joshua Diamond
5c07363054 spidey3 userspace: GUI F-Key lock was affecting some non-F-keys (#9469) 2020-06-20 22:39:45 +01:00
Joel Challis
b6e9ef8dd1 CI: Run 'qmk info' on keyboard changes (#9212) 2020-06-20 22:19:56 +01:00
Thorsten
e58ab6d326 update shell.nix (#8910)
* now uses gcc 8.4
* fixes building boards with adafruit feather (in my case pancake)
2020-06-20 22:03:06 +01:00
Konstantin Đorđević
02781979d6 [Docs] Improve Unicode documentation (#8676) 2020-06-20 21:58:48 +01:00
Ryan
69b484600f Remove more useless code (#9475) 2020-06-20 21:51:50 +01:00
MechMerlin
de79d55187 New Keyboard: E8.5 TKL (#9447)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-20 21:47:50 +01:00
Takeshi ISHII
580cb2c1df [Update] Files with Japanese translations related to #8822 (#9455)
* The TAG of the original document has been updated to facilitate future verification.

* The TAG of the original document has been updated to facilitate future verification.

* The TAG of the original document has been updated to facilitate future verification.
2020-06-20 21:02:16 +09:00
MelGeek
d9eae3ef03 Support IS31FL3741 and IS31FL3741A. (#9201) 2020-06-20 14:49:15 +10:00
James Young
05e6cc2655 Enable Mousekeys for Keebio Quefrency rev1 (#9478) 2020-06-20 13:45:25 +10:00
QMK Bot
8b572de523 format code according to conventions [skip ci] 2020-06-20 03:37:04 +00:00
Joshua Diamond
18e561b82c Fix incorrect delay when setting WS2812 (and similar) leds (#9302)
* Fix incorrect delay when setting WS2812 (and similar) leds

* Add documentation for WS2812_DELAY_MICROSECONDS

* Remove improper cast to uint8_t

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Remove unneeded cast to uint8_t and correct math

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* microseconds -> µs

Co-authored-by: Ryan <fauxpark@gmail.com>

* Make documentation better match the spec sheet.

Co-authored-by: Ryan <fauxpark@gmail.com>

* Rename macro to match spec sheet

* Further correction to the delay maths for the SPI case.

Co-authored-by: Joel Challis <git@zvecr.com>

* Move ws2812_common.h to the drivers directory

* Revert "Further correction to the delay maths for the SPI case."

This reverts commit e61b56a2cfc7dfec9992a7a3af92afa50e5b8ec0.

* Remove ws2812_setleds_pin(); consolidate ws2812.h

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2020-06-20 12:59:28 +10:00
Xelus22
c785148445 STM32 WS2812 Open Drain Configuration (#9414)
* update docs stm32 only and applies  to all 3 driver
* cformat
2020-06-20 08:35:32 +10:00
Rossman360
b43bdc1c69 rebound rev4, consolodated switch matrix from 5x12 to 7x8 (#9314) 2020-06-20 08:27:27 +10:00
Ryan
5a5ecd7dd9 Remove rules.mk for gboards/engine and gboards/g (#9444) 2020-06-19 15:51:50 +10:00
AlisGraveNil
60be8d9f24 [Keyboard] GameBuddy macropad (#9391)
* GameBuddy macropad

* Update config.h

* Update keyboards/clawsome/gamebuddy/config.h

* Update keyboards/clawsome/gamebuddy/readme.md

* Update keyboards/clawsome/gamebuddy/readme.md

* Update keyboards/clawsome/gamebuddy/readme.md

* Update readme.md

* Update keyboards/clawsome/gamebuddy/rules.mk

* Update keyboards/clawsome/gamebuddy/readme.md
2020-06-18 20:31:51 -07:00
Ryan
3f85e90126 Fix Eon87 info.json (#9460)
* Fix Eon87 info.json

* Adjust bottom row sizes
2020-06-18 20:16:57 -07:00
Niclas
3eefe31a54 Keymap: Add custom keymap for Planck (#9417)
* Keymap: Add custom keymap for Planck

* Fixup buffet's planck keymap
2020-06-18 18:32:27 -07:00
Rozakiin
7be65f2cd0 Add VIA support to Noxary 220 and Update Noxary 280 for readability (#9348)
* Update noxary 220 readme.md

* Update Noxary 280 readme.md 

add heading and spelling

* Update spelling of Noxary 280 keymap copyright

* Update Noxary 280 config.h

change product ID and product name, remove commented code

* Change  MCU name and disable Mousekey

* Update Noxary 220 config.h

Change vendor ID, Product ID, Product name and desc, remove commented code

* Update 220.h

change LAYOUT_ortho_6x4 to LAYOUT, change copyrght to Rozakiin

* Change LED indicator function

update copyright to Rozakiin

* Add via keymap

* Update  Noxary 220 default keymap for readability and numpad codes

* Update all Noxary 220 readme.md to conform to QMK templates

* Update Noxary 280 readme.md to conform to QMK template

* Disable console and command, and enable link time optimisation for VIA

* Update Noxary 280 keymaps for better readability

* Update keyboards/noxary/220/keymaps/default/keymap.c

* Update keyboards/noxary/220/220.h

* Update keyboards/noxary/220/keymaps/default/keymap.c

* Update keyboards/noxary/220/keymaps/default/keymap.c

* Update keyboards/noxary/220/keymaps/via/rules.mk

* Update keyboards/noxary/280/keymaps/default/keymap.c

* Update keyboards/noxary/280/keymaps/via/rules.mk

* Update keyboards/noxary/220/rules.mk

* Update keyboards/noxary/280/keymaps/via/keymap.c

* Update keyboards/noxary/220/keymaps/default/keymap.c

* Update keyboards/noxary/220/keymaps/default/keymap.c

* Update keyboards/noxary/220/keymaps/via/keymap.c

* Update keyboards/noxary/220/keymaps/via/keymap.c

* Update keyboards/noxary/220/keymaps/via/keymap.c

* Update keyboards/noxary/220/keymaps/via/keymap.c

* Update keyboards/noxary/220/keymaps/via/keymap.c

* Update keyboards/noxary/280/config.h

* Update keyboards/noxary/220/rules.mk

* Update keyboards/noxary/220/config.h

* Update keyboards/noxary/280/readme.md

Change layout links to ones with background removed
2020-06-18 13:14:09 -07:00
Takeshi ISHII
016b4be751 Update docs/ja/feature_backlight.md: apply #9043's change (#9454) 2020-06-19 04:53:16 +09:00
Ryan
db80209e69 Parse version better in qmk doctor GCC version checks (#9324) 2020-06-18 19:37:47 +01:00
Brad Arnett
716924de3e [Keyboard] Added ymdk split64 based on walston's work (#9183)
* Added ymdk split64 based on walson's work

* Commented out features on walston's keymap as it was too big to compile

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/keymaps/daed/keymap.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* keymap changes

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/matrix.c

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/readme.md

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/config.h

* Update keyboards/ymdk_sp64/rules.mk

* Update keyboards/ymdk_sp64/ymdk_sp64.c

* Update keyboards/ymdk_sp64/keymaps/walston/rules.mk

* Update keyboards/ymdk_sp64/readme.md

* Made requested changes and moved keyboard under ymdk directory

* Update keyboards/ymdk/ymdk_sp64/keymaps/walston/keymap.c

* Update keyboards/ymdk/ymdk_sp64/config.h

* Update keyboards/ymdk/ymdk_sp64/config.h

* Update keyboards/ymdk/ymdk_sp64/keymaps/default/keymap.c

* Update keyboards/ymdk/ymdk_sp64/keymaps/default/keymap.c

* updated changes for pr 9183

* updated changes for pr 9183

* updated changes for pr 9183

* Removed redundant "QMK_KEYBOARD_H" include
2020-06-18 03:01:22 -07:00
James Young
d88dca3ca7 YMD75: move MCU/Bootloader rules to revision level (#9452)
Work-around for an issue with QMK Configurator's API.
2020-06-18 00:15:22 -07:00
Joshua Diamond
9c1097e768 Fix for One Shot Layer not being cleaned up after some actions (#8832) 2020-06-18 08:07:48 +01:00
Jason Laqua
f7eb030e91 Standardize how unicode is processed (fixes #8768) (#8770)
Co-authored-by: Konstantin Đorđević <vomindoraan@gmail.com>
2020-06-18 08:07:34 +01:00
Yasha Mostofi
aae1814319 [Keyboard] Add Via support for Let's Split v2 (#9448)
* initial let's split with rgb

* Revert default

* Add Via keymap

* Remove my keymap

* Remove trailing slashes
2020-06-18 00:06:11 -07:00
Dan
78fdd40622 [Keymap] Dcompact for iris (#9406)
Co-authored-by: Dan Herrera <sonarius@shew.io>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-17 22:20:45 -07:00
Pierre Chevalier
43b6f031b1 [Keymap] Add pierrec83's Kyria keymap (#9401) 2020-06-17 22:18:16 -07:00
yiancar
3e27ceee42 [Keyboard] Nebula12 keyboard (#9397)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-06-17 22:16:26 -07:00
unicorn855
67f374029d [Keyboard] added VIA support for HotDox (#9377)
* added VIA support for HotDox

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

Thank you drashna :)

Co-authored-by: Drashna Jaelre <drashna@live.com>

Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-06-17 21:52:33 -07:00
Gregorio
30fd69886d [Keyboard] Add Mixi (#9364)
* [Keyboard] Add Mixi

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-17 21:39:16 -07:00
Maarten Dekkers
ed528403fd [Keyboard] Add Eon87 (#9337)
Co-authored-by: Maarten Dekkers <maartenn2001@gmail.com>
2020-06-17 21:30:34 -07:00
Ryan
faae375ccd Fix error_log complaint about Preonic layouts (#9443) 2020-06-17 21:23:09 -07:00
James Young
b0fd064491 Fix Kudox Columner Configurator key ordering (#9427) 2020-06-17 20:47:52 -07:00
James Young
abf466e57d Add Configurator layout support for westfoxtrot/prophet (#9428) 2020-06-17 20:47:25 -07:00
KgOfHedgehogs
157319fbd0 [Keyboard] Jian keyboard (#8914)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-06-17 19:17:30 -07:00
Dan
39ff121d73 Implement game mode layer for dcompact on planck (#9402) 2020-06-17 18:53:36 -07:00
Hybrid
8018f4db2d [Keymap] new keymap for XD75 (#8675)
Co-authored-by: grousselle <grousselle@WX-OR6215570.ad.francetelecom.fr>
2020-06-17 18:32:02 -07:00
Ryan
1a159a38ed Clean up Tap Dance docs (#9372)
* Clean up Tap Dance docs

* Add heading IDs for translation
2020-06-17 17:10:35 -07:00
Erovia
a0bf235644 CLI: Add ATmega328 and ATtiny85 to supported CPUs (#9371)
* CLI: Add ATmega328 to supported CPUs

Support for ATmega328 was added in #9043.

* Update lib/python/qmk/constants.py
2020-06-17 15:45:53 -07:00
Ryan
f420741f9b Fix error_log complaint about clueboard/66_hotswap/gen1 layout macro (#9400)
* Fix error_log complaint about clueboard/66_hotswap/gen1 layout macro

* Remove gen1 info.json in favour of higher level file

* Split into revision-specific info.json
2020-06-17 00:30:54 -07:00
yiancar
0b7b74f56a Nebula65 (#9368)
* Initial nebula65 commit

* Use PWM driver

* Polishing

* Remove random rgblight settings

* Spelling fix

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

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/nebula65/keymaps/via/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/nebula65/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/nebula65/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Clean includes in .h file

* Update keyboards/nebula65/readme.md

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Further cleanup

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-06-16 14:02:01 -07:00
cole smith
80b2b710da added 4x12 (#9411)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-06-16 20:08:30 +01:00
MURAMATSU Atshshi
3814dacf27 [Keymap] Add froggy keymap with 106/109 (JP) settings for helix keyboard (#8967)
* initial commit for froggy 106 key mode

* add mode indicator on OLED

* use #pragma once instead of include guard

* remove unusable codes

* remove audio codes, because helix rev.2 has no audio feature

* use set_single_persistent_default_layer

* remove eeprom update check
2020-06-15 21:46:12 -07:00
csc027
7576f6162e [Keymap] csc027/keymap-updates (#9420) 2020-06-15 03:48:21 -07:00
Thomas Lim
e8a02afc8c Add VIA support to keebio/nyquist (#9399) 2020-06-15 20:45:56 +10:00
Drashna Jaelre
357a888d80 [Keymap] Drashna's Keymap Update - Display Edition (#9282)
OLED Display fixes
Add support for RGBLIGHT Layers
Add gaming layer to corn and kyria
RGBLight Startup Animation fixes and improvements (uses matrix_scan now!)
Pimoroni Trackball support added (IT'S RGB!!!)
Fix issues due to code changes
2020-06-15 03:41:28 -07:00
William Lindvall
7f5656996c [Keymap] Add "shwilliam" Preonic keymap (#9409)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-15 03:26:58 -07:00
James Young
b008a9afe6 HID Liberation Device Refactor and Configurator layout support (#9394) 2020-06-15 03:11:19 -07:00
James Young
d8e3294aea [Keyboard] Fix Configurator layout data for handwired/1800fl (#9393) 2020-06-15 03:10:15 -07:00
James Young
a8d073368f [Keyboard] Fix Configurator layout data for acheron/elongate (#9392) 2020-06-15 03:09:48 -07:00
Ryan
44d93285d1 Change ?= to = in keyboard rules.mk (#9390) 2020-06-15 03:06:10 -07:00
Reed
8e0af2f5ba [Docs] Fix link to mod_tap.md in the one_shot_keys.md file (#9380) 2020-06-15 02:55:00 -07:00
Josh Johnson
da76734fe0 [Keyboard] Hub16 keymap bugfix (#9345) 2020-06-15 02:17:30 -07:00
Maarten Dekkers
c029c5b187 [Keyboard] Add Eon75 (#9333)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Maarten Dekkers <maartenn2001@gmail.com>
2020-06-15 02:09:24 -07:00
jems-lee
294cfd8d33 Delete trailing period in documentation (#9416) 2020-06-15 02:49:36 +10:00
George Mao
622e94c6cd [Keyboard] Add S7 Elephant Rev2 Support (#9398)
* Add S7 Elephant Rev2 Support

* Apply suggestions from code review

I tested the changes on my board as well, thanks for the suggestions!

* Added a default folder in the makefile so that this would no longer be a breaking change
2020-06-13 23:45:47 -07:00
cole smith
ba7f52aaeb Boardsource 3x4 info json fix (#9266)
* added bordsource 3x4 macro pad

* added bordsource 3x4 macro pad

* Update keyboards/boardsource/3x4/3x4.h

* Update keyboards/boardsource/3x4/3x4.c

* Update keyboards/boardsource/3x4/config.h

* Update keyboards/boardsource/3x4/config.h

* Update keyboards/boardsource/3x4/config.h

* Update keyboards/boardsource/3x4/config.h

* added link to readme

* Update keyboards/boardsource/3x4/keymaps/default/keymap.c

* Apply suggestions from code review

* changed the layout to refelect the keyboard

* Update keyboards/boardsource/3x4/info.json

Oh your right my bad. In the future is there an easier way for me to test the info.json and the confiscator before doing my pr?

* Apply suggestions from code review

* got 3x4 building again

* Apply suggestions from code review

* applied requested change on readme

* Update keyboards/boardsource/3x4/readme.md

* Apply suggestions from code review
2020-06-13 12:08:54 -07:00
Sid Carter
307013a2f8 [Keymap] Personal keymaps for Prime_E, Corne, Space65 and updates (#9234)
* initial draft maps

* updates to the keymap to enable LED

* does one still have to do these shenanigans?

* update keymap with lights

* update OLED stuff

* update corne config

* update singav3 pcb config

* update ilpse config and map

* update prime keymap as well

* update the keymap for prime_e

* update tapping term and keymap

* switch numbers to the raise layer

* move nav to lower

* add mousekeys as well

* some fixes

* update keymap

* add my layout for space65

* update map

* update keymap

* add grave key

* update  config for my keymap

* update keymap

* switch to newer mechanisms

* grave on capslock

* cleanup

* udpate config

* update keymap

* Update keyboards/gray_studio/space65/keymaps/madhatter/rules.mk

* Update keyboards/gray_studio/space65/keymaps/madhatter/keymap.c

* Update keyboards/crkbd/keymaps/madhatter/rules.mk

* Update keyboards/crkbd/keymaps/madhatter/rules.mk

* Update keyboards/gray_studio/space65/keymaps/madhatter/keymap.c

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/primekb/prime_e/keymaps/madhatter/config.h

* Update keyboards/gray_studio/space65/keymaps/madhatter/config.h

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/wilba_tech/wt75_b/keymaps/madhatter/config.h

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/gray_studio/space65/keymaps/madhatter/config.h

* Update keyboards/primekb/prime_e/keymaps/madhatter/config.h

* Update keyboards/wilba_tech/wt75_b/keymaps/madhatter/config.h

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/crkbd/keymaps/madhatter/keymap.c

* Update keyboards/primekb/prime_e/keymaps/madhatter/keymap.c

* Update keyboards/crkbd/keymaps/madhatter/readme.md

* remove file I don't use
2020-06-13 12:03:11 -07:00
QMK Bot
f68abbf6c8 format code according to conventions [skip ci] 2020-06-13 18:51:08 +00:00
qunguyentk
897c4cd175 [Keyboard] Add Batpad 2x4 PCB (#9295)
* Add files via upload

* Update config.h

* Update config.h

* Update keyboards/Yncognito/batpad/batpad.c

* Update batpad.c

* Update keyboards/Yncognito/batpad/keymaps/default/keymap.c

* Update keyboards/Yncognito/batpad/batpad.h

* Update keyboards/Yncognito/batpad/keymaps/default/keymap.c

* Update keyboards/Yncognito/batpad/keymaps/default/keymap.c

* Update keyboards/Yncognito/batpad/keymaps/via/keymap.c

* Update keyboards/Yncognito/batpad/keymaps/via/keymap.c

* Update keyboards/Yncognito/batpad/keymaps/via/keymap.c

* Update keyboards/Yncognito/batpad/batpad.c

* Rename keyboards/Yncognito/batpad/rules.mk to keyboards/yncognito/batpad/rules.mk

* Rename keyboards/Yncognito/batpad/readme.md to keyboards/yncognito/batpad/readme.md

* Rename keyboards/Yncognito/batpad/info.json to keyboards/yncognito/batpad/info.json

* Rename keyboards/Yncognito/batpad/config.h to keyboards/yncognito/batpad/config.h

* Rename keyboards/Yncognito/batpad/batpad.h to keyboards/yncognito/batpad/batpad.h

* Rename keyboards/Yncognito/batpad/batpad.c to keyboards/yncognito/batpad/batpad.c

* Rename keyboards/Yncognito/batpad/keymaps/default/readme.md to keyboards/yncognito/batpad/keymaps/default/readme.md

* Rename keyboards/Yncognito/batpad/keymaps/default/keymap.c to keyboards/yncognito/batpad/keymaps/default/keymap.c

* Rename keyboards/Yncognito/batpad/keymaps/default/config.h to keyboards/yncognito/batpad/keymaps/default/config.h

* Rename keyboards/Yncognito/batpad/keymaps/via/rules.mk to keyboards/yncognito/batpad/keymaps/via/rules.mk

* Rename keyboards/Yncognito/batpad/keymaps/via/keymap.c to keyboards/yncognito/batpad/keymaps/via/keymap.c

* Rename keyboards/Yncognito/batpad/keymaps/via/config.h to keyboards/yncognito/batpad/keymaps/via/config.h

* Update keyboards/yncognito/batpad/readme.md

* Update keyboards/yncognito/batpad/readme.md

* Update keyboards/yncognito/batpad/rules.mk

* Delete config.h

* Delete config.h

* Update readme.md

* Update keyboards/yncognito/batpad/batpad.c

* Update keyboards/yncognito/batpad/readme.md

* Update keyboards/yncognito/batpad/keymaps/via/keymap.c

* Update keyboards/yncognito/batpad/info.json

* Update keyboards/yncognito/batpad/batpad.h
2020-06-13 11:48:48 -07:00
elmo-space
1f2807c2de Add ANSI and ISO layout for KBD67mkII soldered PCB (#9340)
* add ansi and iso layouts

* fix iso map mistake

* fix mistake again...

* Update keyboards/kbdfans/kbd67/mkii_soldered/keymaps/iso/keymap.c

* rename layout macros to the blocker variants and add ansi_split_bs

* Apply suggestions from code review
2020-06-13 11:45:03 -07:00
mechlovin
b160913309 [Keyboard] Add new PCB Infinity87 (#9287)
* Add new PCB Infinity87

* Update keymap.c

* Update readme.md

* Update rules.mk

* update

* Update info.json
2020-06-13 11:43:04 -07:00
Maarten Dekkers
867fded980 [Keyboard] Add OmronTKL (#9346)
* Add OmronTKL

* Fix column pins
2020-06-13 11:41:53 -07:00
Callum Oakley
d1730ec760 [keymap] upstreaming a minor keymap update (#9366) 2020-06-13 21:11:28 +10:00
Gautham Yerroju
4057d44989 [Keymap] Add Kyria keymap (#9224)
* Add Kyria keymap

* clean split hand detection code

* rename "joystick" to "thumbstick"

* thumbstick overhaul

* removed angle correction, seems buggy

* save some memory

* Remove deprecated config option

* Use the correct types for getting host led states

* Fix include path

* Made .h files for encoder and oled code

* Increase speed cap on thumbstick
2020-06-13 01:24:13 -07:00
Gautham Yerroju
2bfcb6bfc5 [Keymap] Add custom corne keymap (#9283)
* Add custom corne keymap

* Clean up rules.mk

* Clean up base layer on keymap.c

* Clean up lower layer on keymap.c

* Clean up raise layer on keymap.c

* Clean up adjust layer in keymap.c
2020-06-13 01:18:33 -07:00
mcarni
1f42071238 dz60 iso split - cleaned up the readme and replaced normal key with numpad key on numpad layer (#9339)
* README cleanup

* replaced "normal" numbers with "keypad" numbers:
KC_P4 replaced by KC_KP_P4

* replaced "normal" keys on Numpad Layer with the "KeyPad" keys
KC_1 replaced by KC_P1 etc.
2020-06-13 00:29:22 -07:00
MechMerlin
400423d10b VIA Support: Noxary 260 (#9349)
* add VIA support to noxary 260

* change the layout macro to be 60_ansi as thats going to be the base VIA layout

* update readme
2020-06-13 00:16:07 -07:00
Andrew Kannan
54ef02dead Fix project alice indicators (#9342) 2020-06-13 00:06:38 -07:00
umi
044b4aaf01 [Docs] Japanese translation of docs/feature_split_keyboard.md (#9031)
* add feature_split_keyboard.md translation

* add header for git

* update based on comment

* update based on comment
2020-06-12 23:50:19 -07:00
Catriel Müller
ccb4b81b3f Fix my personal keymap // Custom keymap for Kbdfans/kbd67/rev2 with improvements on Accessibility (#9207)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-11 22:39:56 +10:00
Adrian
e269977387 Murcielago: improve default keymap (#9363)
* Squashed new default keymap for murcielago
2020-06-11 04:45:53 -07:00
Sergey Vlasov
0cb4da2c74 Really fix Ubuntu/Debian setup when $PATH contains spaces (#9370)
PR #9307 fixed the immediately visible problem (the command that was
added to $HOME/.bashrc was incorrect because of missing quotes around
paths with spaces).  However, the modified command is still wrong - it
captures the value of $PATH at the setup time, and the resulting command
written out to $HOME/.bashrc will overwrite $PATH with that captured
value, ignoring any changes in the environment.  This may be especially
important for WSL, where the initial value of $PATH in Linux includes
everything which has been added to %PATH% on the Windows side; after
adding that command to $HOME/.bashrc the WSL environment will no longer
pick up any changes made by newly installed Windows software.

Instead of that, use single quotes around the command, so that the
environment variables are not expanded at the setup time, and the
command that is added to $HOME/.bashrc becomes exactly this:

    PATH="$HOME/.local/bin:$PATH"

This command will use the $HOME and $PATH environment variable values at
the time the command is executed, not at the time the QMK setup is
performed, so any further updates to $PATH are taken into account.
Double quotes also ensure that the command is safe even if the values of
those environment variables contain spaces.
2020-06-11 12:26:10 +01:00
James Young
9b0c734733 Fix Configurator layout data for clueboard/2x1800/2019 (#9373) 2020-06-11 12:07:15 +01:00
George Mao
fffee6ade1 Fixing Iron165 VIA Keymap (#9298)
* Fixing via issues

* Fixing whitespace issues on the keymap

* Fixed the default via layer 1 keymap, was a little weird before

* Removing redundant declarations in via/rules.mk
2020-06-11 00:12:53 +01:00
neon4272
97ddc7ea18 Fix Ubuntu/Debian setup when $PATH contains spaces (#9307)
* Change `echo` to `export`

* Add `export` as a note under the `echo` command

* Remove note from last commit

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update docs/newbs_getting_started.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update docs/newbs_getting_started.md

Add 1 line of whitespace under note

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 23:46:13 +01:00
Nick Brassel
3afd2d81b8 Add documentation for selecting an Arm MCU (#9046)
* Initial doco write-up.

* Update docs/platformdev_selecting_arm_mcu.md

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

* Apply suggestions from code review

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 23:32:58 +01:00
precondition
2543bad250 [Docs] Fixed the hyperlink to /users/_example/. (#9326) 2020-06-10 15:27:25 -07:00
MechMerlin
a056d94561 [keyboard] Project Keyboard Signature 87 (#9062)
* preliminary check in, basically a copy from 159's github with a few additions to get it to compile

* update readme

* fixup the LAYOUT macro labels to be more reasonable

* add tkl_ansi LAYOUT macro for community layout support

* clean up rules.mk, add community layout suport, and add in bootloader

* add a tsangan layout macro

* spruce up readme

* add VIA keymap

* add qmk configurator support

* Update keyboards/projectkb/signature87/rules.mk

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/projectkb/signature87/rules.mk

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/projectkb/signature87/rules.mk

Co-authored-by: Joel Challis <git@zvecr.com>

* remove unneeded file

* Update keyboards/projectkb/signature87/config.h

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/projectkb/signature87/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/projectkb/signature87/config.h

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 23:26:21 +01:00
Drashna Jaelre
573d1fbb92 Include pointing_device_send in docs (#9185) 2020-06-10 23:18:53 +01:00
Tsan-Kuang Lee
437446ba8f Fix one shot swaphands compiler error when NO_ACTION_ONESHOT is defined (#9296)
* init

* add RETRO_TAP; tap anyway after TAP_TERM, if no interruption

* RETRO_TAP works for other types of taps

* revert to upstream/master

* explain this fork in readme

* use one readme.md file instaed

* fix the error if NO_ACTION_ONESHOT is defined

* restore readme.md to upstream master

Co-authored-by: Tsan-Kuang Lee <tsan.kuang.lee@gmail.com>
2020-06-10 22:40:17 +01:00
James Incandenza
8640b43214 [Keymap] WPM-responsive OLED animation in personal keymap (#9264)
Using the wpm feature, I create a responsive OLED animation that changes based on how fast the user types. As written there are three phases (It's bongo cat!) but can easily be reconfigured and replaced with other images.

Multiple byte arrays consume considerable space so choose your usage wisely. When customized, the smaller the byte array used, the better, due to space limitations on most microcontrollers.

I made this with no prior knowledge of C, so I'm looking forward to any and all suggested improvements.

Credit is owed to obosob for laying the foundation for this little script as well to /u/pixelbenny for graciously providing the bongocat artwork I adapted for the animation.

The config.h includes a tweak to the Kyria's LED mapping, so that the order now reflects their physical positions, making animations smoother.

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Simon Schuster <SimonSchuster@Simons-MacBook-Pro-2.local>
Co-authored-by: James Incandenza <james@ij.net>
2020-06-10 14:39:07 -07:00
yfuku
09fc6cab34 Add bat43 rev2 (#9319)
* add rev2

* Update keyboards/bat43/rev1/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/bat43/rev2/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 22:38:11 +01:00
elmo-space
7e8dc2e570 [Keymap] Add dual layer keymap for xd002 macropad (#9222)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-06-10 14:33:26 -07:00
Keebz Dot Net
263536586d [Keyboard] Wazowski 23-19 PCB Support (#9198)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Chris Figueroa <chrisfigueroa16@gmail.com>
2020-06-10 14:32:03 -07:00
itsnoteasy
7aa4cc9603 adds support for the atmega328 (#9043)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 22:23:11 +01:00
Chandler
e26bc21d14 fix rgb mode selection and lighting increments for the 1894 (#9336) 2020-06-10 21:32:19 +01:00
Danny
5c2b46dc47 Add Sinc keyboard (#8986)
* Add Sinc (WIP)

* Rename layouts, add keymaps

* Set EEPROM VIA layout value

* Update QMK Configurator json

* Update VIA layout value

* Add default folder

* Add PR suggestions

* Fix keyboard name
2020-06-10 20:12:02 +01:00
fluffactually
713d34cda4 Add new iris keymap 'fluffactually' (#9325)
* Add new iris keymap 'fluffactually'

* Keymap suggested changes - layer_state_t
2020-06-10 18:45:22 +01:00
Sergey Vlasov
cce301ae83 kbdfans/kbd67/rev2: Fix ISO layout macro (#9329)
A user in Discord reported that the right bracket and ISO hash keys on
KBD67 rev2 using LAYOUT_65_iso were swapped.  When comparing
LAYOUT_65_iso with LAYOUT_65_ansi, the problem with a wrong assignment
of the right bracket key is obvious — that key is K1D in the ANSI layout
macro, but the ISO layout macro had K1E there, and K1D at the position
of the ISO hash key.

Fix the LAYOUT_65_iso macro by swapping those arguments (and also align
the K1D argument for the right bracket key properly).
2020-06-10 18:43:09 +01:00
James Young
08e08b660c Add VIA support to KC60 (#9351)
* Add VIA support to KC60

* enable Bootmagic Lite
2020-06-10 17:34:18 +01:00
Adrian
cff3c3bf28 Fixed slave-side keyboard half unresponsiveness (#9360)
* Fixed slave-side keyboard half unresponsiveness
due to how LUFA handles USB_Disable()

* changes to formatting

Co-authored-by: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-06-10 17:25:45 +01:00
umi
b7cb4111ea [Docs] Japanese translation of docs/feature_wpm.md (#9254)
* add feature_wpm.md translation

* update based on comment

* update based on comment

* update based on comment
2020-06-10 21:04:39 +09:00
Danny
184c362324 Add BDN9 rev2 (#9017) 2020-06-09 22:32:46 -04:00
James Young
1d1c0503b6 Gami Studio Lex60: Configurator Layout support (#7726)
* Gami Studio Lex60: Configurator Layout support

* correct key sizes on bottom row per lukelex

* add LAYOUT_60_ansi

To test, run `make gami_studio/lex60:default_60_ansi` and flash.

* add 60_ansi keymap

To test, run `make gami_studio/lex60:60_ansi` and flash.

* remove data for 60_ansi layout
2020-06-09 19:22:33 -07:00
AlisGraveNil
01e74b0ac6 Sidekick/qmk firmware (#9229)
* 5/28/20

* Create readme 2.md

* Revert inadvertently changed files

* Update keyboards/clawsome/sidekick/config.h

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Update keyboards/clawsome/sidekick/rules.mk

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Update keyboards/clawsome/sidekick/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/sidekick/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/sidekick/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/sidekick/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/sidekick/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/sidekick/rules.mk

Co-authored-by: Nick Brassel <nick@tzarc.org>

Co-authored-by: Nick Brassel <nick@tzarc.org>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 11:04:02 +10:00
Rolf Don
c0cb2ab1c1 Adding extra supported Boardwalk layout (#9341)
* Added ortho layout with 2x2u spacebars
2020-06-09 17:22:28 -07:00
clanghans
7281e86e98 XD75 clanghans layout (#9313)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-10 05:11:01 +10:00
Maarten Dekkers
86812f22e4 [Keyboard] Add nt660 PCB (#9042)
* Upload nt660 files

* Apply suggestions from code review

* Apply suggestions from code review
2020-06-09 12:10:00 -07:00
Cable Car Designs
b83fb9eb71 [Keyboard] add prophet support (#9275)
* add prophet support

* Update keyboards/westfoxtrot/prophet/config.h

* Update keyboards/westfoxtrot/prophet/rules.mk

* Update keyboards/westfoxtrot/prophet/config.h

* Update keyboards/westfoxtrot/prophet/prophet.c

* Update keyboards/westfoxtrot/prophet/readme.md

* Update keyboards/westfoxtrot/prophet/readme.md

* Update keyboards/westfoxtrot/prophet/keymaps/default/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/default/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* remove bootloader_defs
fixed via keymap

* Update keyboards/westfoxtrot/prophet/prophet.h

* Update keyboards/westfoxtrot/prophet/keymaps/default/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/default/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* Update keyboards/westfoxtrot/prophet/keymaps/via/keymap.c

* changed vendor id

* changed prophet.c
2020-06-09 11:37:41 -07:00
Ryan
3736db6081 Add OS compatibility matrix for basic keycodes (#8557) 2020-06-09 12:28:36 +01:00
Takeshi ISHII
b19187c62c [Update] Japanese translation of newbs_learn_more_resources.md (#9288)
* Updated the Japanese translation of newbs_learn_more_resources.md

Updated the Japanese translation of newbs_learn_more_resources.md to 0.9.0.

* update docs/ja/newbs_learn_more_resources.md

* update ja/newbs_learn_more_resources.md
2020-06-09 00:04:14 +09:00
Takeshi ISHII
4a7725b3ee [Update] Japanese translation of docs/newbs_testing_debugging.md. (#9286)
* Updated the Japanese translation of newbs_testing_debugging.md.

Updated the Japanese translation of newbs_testing_debugging.md to 0.9.0.

* Update docs/ja/newbs_testing_debugging.md

Co-authored-by: s-show <s1shimz@gmail.com>

* Update docs/ja/newbs_testing_debugging.md

Co-authored-by: shela <shelaf@users.noreply.github.com>

* Update docs/ja/newbs_testing_debugging.md

Co-authored-by: shela <shelaf@users.noreply.github.com>

Co-authored-by: s-show <s1shimz@gmail.com>
Co-authored-by: shela <shelaf@users.noreply.github.com>
2020-06-09 00:02:32 +09:00
Maarten Dekkers
93a1c5ca16 [Keyboard] Add VIA support for Eon40 (#9330)
Co-authored-by: Maarten Dekkers <maartenn2001@gmail.com>
2020-06-07 23:57:49 -07:00
Ryan
407d6a2b67 [Keyboard] Fix error_log complaint about handwired/onekey layout macro (#9263) 2020-06-07 22:49:18 -07:00
umi
d7523c1260 [Docs] Japanese translation of docs/feature_ps2_mouse.md (#9030)
* add feature_ps2_mouse.md translation

* update based on comment

* update based on comment

* update based on comment

* update based on comment
2020-06-08 02:26:30 +09:00
umi
a7f093b40c [Docs] Japanese translation of docs/feature_terminal.md (#9033)
* add feature_terminal.md translation

* add header for git

* update based on comment
2020-06-08 02:24:35 +09:00
Pete Johanson
b9a38487f3 [Docs] Update udev rules to use TAG+="uaccess". (#8750) 2020-06-07 09:06:55 +01:00
umi
9f400794c0 [Docs] Japanese translation of docs/feature_swap_hands.md (#9032)
* add feature_swap_hands.md translation

* update based on comment

* back to original translation
2020-06-07 03:08:24 +09:00
Frothy
12efb28e13 [Keyboard] Add Via config for Clueboard 66 (#9010)
* Added Via config for Clueboard 66

* Update keyboards/clueboard/66/keymaps/via/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Enabled MouseKeys

This required enabling LINK_TIME_OPTIMIZATION_ENABLE

* Added 4th layer as per tzarc's recommendation on another PR

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-06 08:56:59 -07:00
Takeshi ISHII
3972978c8d The TAGs of the original document has been updated to facilitate future verification. (#9285) 2020-06-05 21:49:34 +09:00
Derek
b327d20402 [Keyboard] add Juliet (#9240)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Derek <sevinty7@gmail.com>
2020-06-05 02:13:31 -07:00
Chandler
ca451c5aa0 [Keyboard] add 1894 support to qmk (#9238) 2020-06-05 02:12:07 -07:00
Jeremy Bernhardt
7a75af8342 [Keyboard] Gboards common - TOGG()/inject.h (#9236) 2020-06-05 02:06:58 -07:00
Joshua Diamond
d03bc3a9c1 Major enhancements to spidey3 keymaps and userspace (#9261)
* Add Chrome OS specific keys to 75_ansi/spidey3

* Clean up duplicative settings in rules.mk

* Refactor spidey3 userspace to use rgb layer blink

* Blink green on wakeup

* Improve _FN layer indicator

* Glyph transformation modes: wide, script, fraktur, and enclosed characters

* Add spider unicode glyph

* Fix compile error when NO_ACTION_ONESHOT

* Add a few more emoji

* Further refinement of lighting layer usage

* Fix reversed yes/no ack

* Lighting layers override RGB off

* Fix missing wide and incorrect script numbers

* Add LOL and surprise emoji

* Add missing break in switch statement

* Trim firmware size

* Use usage ID definitions in report.h

* Some minor whitespace cleanup

* Disable some unused features to reduce firmware size

* Print version on startup

* Seed rand() on first keystroke

* Add a key to immediately sleep CrOS

* Switch to Bootmagic Lite

* Trim down firmware size a little bit more

* Make RGBLIGHT_MODE_TWINKLE+4 my default

* Scan rate debug / fix version printing

Delay printing version on startup (console may not be ready)
Better scan rate reporting

* Disable locking caps, etc. to save more space

* Enable LTO

* Better seed for rand()

* Set MAX_LAYER for some performance improvement

* Another scan rate improvement

* Set manufacturer

* New startup animation

* Add GUI lock for F-keys (for CrOS)

* Add visual indication for glyph replacement and F-keys GUI lock

* Some cleanup; run cformat on spidey3 userspace

* Cycle between debug verbosity options

* Fix disable RGB Lighting after wakeup on Mac
2020-06-05 02:01:47 -07:00
MakotoKurauchi
c12e429da2 [Keymap] add keymap for meishi2 (#9270)
* add keymap "led_status"

* modified readme

* Update keyboards/meishi2/keymaps/led_status/keymap.c

* I modified the code to be simple.

* Update keyboards/meishi2/keymaps/led_status/keymap.c
2020-06-05 01:49:16 -07:00
Abi Shalom
9219f9e724 Changes to abishalom Tada68 keymap (#9278)
* Changes to abishalom Tada68 keymap

* Update keyboards/tada68/keymaps/abishalom/rules.mk
2020-06-05 01:46:28 -07:00
Leon Anavi
f4ff225c00 [Keyboard] keyboards/anavi: Add ANAVI Macro Pad 8 (#9164)
ANAVI Macro Pad 8 is an open source mini mechanical keyboard with
8 keys, backlit, addressable RGB WS2812B LED strip on the back and
mini OLED display. Powered by ATmega 32U4 microcontroller and with
microUSB connector.

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Signed-off-by: Leon Anavi <leon@anavi.org>
2020-06-05 00:48:58 -07:00
itsnoteasy
a68b0ed9a2 [Keyboard] Add ortho5by12 keyboard (#9141)
* Add files via upload

* Update keyboards/ortho5by12/rules.mk

* Add files via upload

* Add files via upload

* Update keyboards/ortho5by12/ortho5by12.h

* Update keyboards/ortho5by12/ortho5by12.h

* Add files via upload

* Add files via upload

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/readme.md

* Update keyboards/ortho5by12/info.json

* Update keyboards/ortho5by12/ortho5by12.h

* Apply suggestions from code review

* Update rules.mk

* Update config.h

* Update config.h

* Update config.h

* Delete rules.mk

* Delete config.h

* Delete info.json

* Delete ortho5by12.c

* Delete ortho5by12.h

* Delete readme.md

* Delete keymap.c
2020-06-04 23:55:39 -07:00
Joel Challis
a2dee4494d Fix mechlovin/pisces Configurator config (#9290)
* Fix mechlovin/pisces Configurator config

* Update keyboards/mechlovin/pisces/info.json
2020-06-04 17:33:35 -07:00
Josh Hinnebusch
6cfc3cd940 [Keyboard] add hineybush/h10 pcb (#9036)
* initial h10 commit

* update h10

* update files, add via keymap

* edit h10 readme

* update per PR requests

* add copyright (i think this is what fauxpark wants)

* fix comment

* remove config.h files

* update per PR requests

* Update keyboards/hineybush/h10/info.json

* Update keyboards/hineybush/h10/info.json
2020-06-04 16:56:04 -07:00
Frothy
e84e9a2004 Add Via support for Percent Canoe (#9276)
* Add Via support for Percent Canoe

* Removed unnecessary flags from rules.mk

* Changes as per PR

 * Added 2 additional empty layers (for a total of 4)
 * Set a unique vendor id for all percent studio boards
 * Set a unique product id for the canoe

* Fixed formatting, removed trailing comma

* Fixed PS/PT typo for vendor id

* Removed unnecessary variables

* Removed unnecessary slashes

* Fixed missing layer name
2020-06-04 09:22:29 -07:00
Joel Challis
232b9dabbe Fix 'does not have a readme.md' warnings (#9294) 2020-06-04 02:07:37 -07:00
Joel Challis
7b2c09de59 Fix handwired/novem Configurator config (#9291) 2020-06-04 01:57:37 -07:00
Joel Challis
e571f53ae9 Fix wt60_d and rama_works_u80_a Configurator config (#9292) 2020-06-04 01:45:35 -07:00
Jesse Leventhal
6fc4f1eddd [keyboard] Add two new The Mad Noodle Keypads (#8934)
* Adding support for two new The Mad Noodle Keypads (Revised..Again)

* Adding support for two new The Mad Noodle Keypads (Revised..Again)

* Update keyboards/themadnoodle/ncc1701kbv2/ncc1701kbv2.h

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

* Update keyboards/themadnoodle/noodlepad/noodlepad.h

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

* Update keyboards/themadnoodle/ncc1701kbv2/rules.mk

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

* Update keyboards/themadnoodle/noodlepad/rules.mk

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

* Update keyboards/themadnoodle/noodlepad/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/noodlepad/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/noodlepad/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/noodlepad/keymaps/default/keymap.c

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

* Requested Changes to all files

* Revert "Requested Changes to all files"

This reverts commit 7f6c708da8.

* Update keyboards/themadnoodle/ncc1701kbv2/info.json

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

* Update keyboards/themadnoodle/ncc1701kbv2/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/ncc1701kbv2/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/ncc1701kbv2/keymaps/default/keymap.c

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

* Update keyboards/themadnoodle/noodlepad/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/themadnoodle/ncc1701kbv2/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/themadnoodle/ncc1701kb/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/themadnoodle/ncc1701kbv2/keymaps/default/keymap.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* rework ncc1701kb v1 to vendor/keyboard/revision structure

* rework ncc1701kb v2 to vendor/keyboard/revision structure

* Update keyboards/themadnoodle/ncc1701kb/v2/rules.mk

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

* Update keyboards/themadnoodle/noodlepad/config.h

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

* Update keyboards/themadnoodle/noodlepad/info.json

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

* Update keyboards/themadnoodle/noodlepad/noodlepad.h

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

* Update keyboards/themadnoodle/noodlepad/rules.mk

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

* checkedout folder and removed v1 as requested

* Update keyboards/themadnoodle/noodlepad/config.h

Co-authored-by: Joel Challis <git@zvecr.com>

* Update keyboards/themadnoodle/ncc1701kb/v2/config.h

Co-authored-by: Joel Challis <git@zvecr.com>

* Updated Noodle Pad Readme

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2020-06-04 00:25:59 +01:00
MechMerlin
be73820f7b [Keyboard] New Keyboard: Duck TC-V3 (#8265)
Co-Authored-By: Ryan <fauxpark@gmail.com>
Co-Authored-By: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-Authored-By: Drashna Jaelre <drashna@live.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-06-02 21:59:13 -07:00
MechMerlin
81a2113cbd VIA Support: Waldo 60 (#9151)
* pick a sane VID

* add the VIA Keymap

* update copyright notice

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

Co-authored-by: Ryan <fauxpark@gmail.com>

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

Co-authored-by: Ryan <fauxpark@gmail.com>

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

Co-authored-by: Ryan <fauxpark@gmail.com>

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

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/waldo/keymaps/via/readme.md

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

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-06-03 01:07:18 +01:00
Joel Challis
d17572b125 Move encoder_read to common location (#9003) 2020-06-03 00:54:53 +01:00
Joel Challis
517d607fa4 [Keyboard] Add zvecr/zv48 (#9227)
* Add zv48 keyboard

* tidy up rules

* correct product name
2020-06-03 00:49:52 +01:00
Drashna Jaelre
1110fe6c6f Move dip switch init to back of the init process (#9233) 2020-06-03 00:32:02 +01:00
Dan Hertz
eefc05e078 Update canoe:dhertz to use new post-init functions (#9257)
* Update to use new post-init functions

* Update readme so I don't forget reset key again
2020-06-03 06:38:56 +10:00
Eduardo Lourenço Pinto Neto
f1e09dd388 Update keymap.c (#9265)
Add Insert on Fn+Del and fix TG to TO for layer switching
2020-06-03 06:33:27 +10:00
jotix
0def9ed528 jotix ortho_4x12 layout (#9209)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-06-02 21:51:24 +10:00
Ryan
c73125eea7 Void Linux: Switch to cross-arm-none-eabi toolchain (#9228) 2020-06-02 18:53:38 +10:00
mechlovin
306d02aa93 Adelais: Fix indicator LED pinout (#9241)
* Fix indicator LED pinout

Fix indicator LED pinout, active some function
2020-06-01 17:31:14 -07:00
umi
b8ddfd34ec [Docs] Japanese translation of docs/feature_mouse_keys.md (#8992)
* add feature_mouse_keys.md translation

* update based on comment

* update based on comment

* update based on comment

* update based on comment

* update based on comment
2020-06-01 17:28:41 -07:00
goranzarkovic
14eccef7bf Fixing the PRODUCT_ID to match the liminal.json on VIA repo (#9232) 2020-06-01 17:23:25 -07:00
mechlovin
aab5c44c7d Infinity CE PCB: Update rules.mk (#9235)
* Update rules.mk 

Actice NKRO function
2020-06-01 17:19:56 -07:00
zvecr
406dc2fb2d Move encoder_read to common location 2020-05-02 22:44:36 +01:00
750 changed files with 44751 additions and 3600 deletions

49
.github/workflows/info.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
name: PR Lint keyboards
on:
pull_request:
paths:
- 'keyboards/**'
jobs:
info:
runs-on: ubuntu-latest
container: qmkfm/base_container
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Print info
run: |
git rev-parse --short HEAD
echo ${{ github.event.pull_request.base.sha }}
git diff --name-only ${{ github.event.pull_request.base.sha }}...
- name: Run qmk info
shell: 'bash {0}'
run: |
QMK_CHANGES=$(git diff --name-only ${{ github.event.pull_request.base.sha }}...)
QMK_KEYBOARDS=$(qmk list-keyboards)
exit_code=0
for KB in $QMK_KEYBOARDS; do
KEYBOARD_CHANGES=$(echo "$QMK_CHANGES" | grep -E '^(keyboards/'${KB}'/)')
if [[ -z "$KEYBOARD_CHANGES" ]]; then
# skip as no changes for this keyboard
continue
fi
KEYMAP_ONLY=$(echo "$KEYBOARD_CHANGES" | grep -cv /keymaps/)
if [[ $KEYMAP_ONLY -gt 0 ]]; then
echo "linting ${KB}"
# TODO: info info always returns 0 - right now the only way to know failure is to inspect log lines
qmk info -kb ${KB} 2>&1 | tee /tmp/$$
!(grep -cq ☒ /tmp/$$)
: $((exit_code = $exit_code + $?))
fi
done
exit $exit_code

View File

@@ -144,7 +144,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
endif
endif
VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 IS31FL3737 WS2812 custom
VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 WS2812 custom
LED_MATRIX_ENABLE ?= no
ifneq ($(strip $(LED_MATRIX_ENABLE)), no)
@@ -205,6 +205,13 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3737)
QUANTUM_LIB_SRC += i2c_master.c
endif
ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3741)
OPT_DEFS += -DIS31FL3741 -DSTM32_I2C -DHAL_USE_I2C=TRUE
COMMON_VPATH += $(DRIVER_PATH)/issi
SRC += is31fl3741.c
QUANTUM_LIB_SRC += i2c_master.c
endif
ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
OPT_DEFS += -DWS2812
WS2812_DRIVER_REQUIRED := yes

View File

@@ -145,6 +145,7 @@
* Hardware Platform Development
* Arm/ChibiOS
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
* [Early initialization](platformdev_chibios_earlyinit.md)
* QMK Reference

View File

@@ -22,7 +22,7 @@ Then place this include at the top of your code:
### AVR
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328P|
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328/P|
|-------|-------------|-------------|---------|----------|
|0 |`F0` |`F0` |`A0` |`C0` |
|1 |`F1` |`F1` |`A1` |`C1` |
@@ -39,7 +39,7 @@ Then place this include at the top of your code:
|12 | |`B5` | | |
|13 | |`B6` | | |
<sup>\* The ATmega328P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
<sup>\* The ATmega328/P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
### ARM

View File

@@ -14,6 +14,7 @@ Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/
* [ATmega32A](https://www.microchip.com/wwwproducts/en/ATmega32A)
* [ATmega328P](https://www.microchip.com/wwwproducts/en/ATmega328P)
* [ATmega328](https://www.microchip.com/wwwproducts/en/ATmega328)
## ARM

View File

@@ -28,33 +28,30 @@ sudo udevadm trigger
**/etc/udev/rules.d/50-atmel-dfu.rules:**
```
# Atmel ATMega32U4
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", TAG+="uaccess", RUN{builtin}+="uaccess"
# Atmel USBKEY AT90USB1287
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", TAG+="uaccess", RUN{builtin}+="uaccess"
# Atmel ATMega32U2
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", TAG+="uaccess", RUN{builtin}+="uaccess"
```
**/etc/udev/rules.d/52-tmk-keyboard.rules:**
```
# tmk keyboard products https://github.com/tmk/tmk_keyboard
SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
```
**/etc/udev/rules.d/54-input-club-keyboard.rules:**
```
# Input Club keyboard bootloader
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b007", TAG+="uaccess", RUN{builtin}+="uaccess"
```
**/etc/udev/rules.d/55-caterina.rules:**
```
# ModemManager should ignore the following devices
ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0036", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0036", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9205", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9203", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
```
**Note:** ModemManager filtering only works when not in strict mode, the following commands can update that settings:
**Note:** With older (before 1.12) ModemManager, filtering only works when not in strict mode, the following commands can update that settings:
```console
sudo sed -i 's/--filter-policy=strict/--filter-policy=default/' /lib/systemd/system/ModemManager.service
sudo systemctl daemon-reload
@@ -64,15 +61,15 @@ sudo systemctl restart ModemManager
**/etc/udev/rules.d/56-dfu-util.rules:**
```
# stm32duino
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", TAG+="uaccess", RUN{builtin}+="uaccess"
# Generic stm32
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", TAG+="uaccess", RUN{builtin}+="uaccess"
```
**/etc/udev/rules.d/57-bootloadhid.rules:**
```
# bootloadHID
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", MODE:="0666"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", TAG+="uaccess", RUN{builtin}+="uaccess"
```
### Serial device is not detected in bootloader mode on Linux

View File

@@ -89,7 +89,7 @@ BACKLIGHT_DRIVER = pwm
Hardware PWM is supported according to the following table:
|Backlight Pin|AT90USB64/128|ATmega16/32U4|ATmega16/32U2|ATmega32A|ATmega328P|
|Backlight Pin|AT90USB64/128|ATmega16/32U4|ATmega16/32U2|ATmega32A|ATmega328/P|
|-------------|-------------|-------------|-------------|---------|----------|
|`B1` | | | | |Timer 1 |
|`B2` | | | | |Timer 1 |

View File

@@ -26,7 +26,7 @@ If your encoder's clockwise directions are incorrect, you can swap the A & B pad
#define ENCODER_DIRECTION_FLIP
```
Additionally, the resolution can be specified in the same file (the default & suggested is 4):
Additionally, the resolution, which defines how many pulses the encoder registers between each detent, can be defined with:
```c
#define ENCODER_RESOLUTION 4

View File

@@ -5,7 +5,7 @@ If you've ever used Vim, you know what a Leader key is. If not, you're about to
That's what `KC_LEAD` does. Here's an example:
1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else.
2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low. .
2. Include the line `#define LEADER_TIMEOUT 300` in your `config.h`. This sets the timeout for the `KC_LEAD` key. Specifically, when you press the `KC_LEAD` key, you only have a certain amount of time to complete the Leader Key sequence. The `300` here sets that to 300ms, and you can increase this value to give you more time to hit the sequence. But any keys pressed during this timeout are intercepted and not sent, so you may want to keep this value low.
* By default, this timeout is how long after pressing `KC_LEAD` to complete your entire sequence. This may be very low for some people. So you may want to increase this timeout. Optionally, you may want to enable the `LEADER_PER_KEY_TIMING` option, which resets the timeout after each key is tapped. This allows you to maintain a low value here, but still be able to use the longer sequences. To enable this option, add `#define LEADER_PER_KEY_TIMING` to your `config.h`.
3. Within your `matrix_scan_user` function, add something like this:

View File

@@ -6,34 +6,34 @@ Macros allow you to send multiple keystrokes when pressing just one key. QMK has
## The New Way: `SEND_STRING()` & `process_record_user`
Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string (i.e. a sequence of characters) for you. All ASCII characters that are easily translated to a keycode are supported (e.g. `\n\t`).
Sometimes you want a key to type out words or phrases. For the most common situations, we've provided `SEND_STRING()`, which will type out a string (i.e. a sequence of characters) for you. All ASCII characters that are easily translatable to a keycode are supported (e.g. `qmk 123\n\t`).
Here is an example `keymap.c` for a two-key keyboard:
```c
enum custom_keycodes {
QMKBEST = SAFE_RANGE,
QMKBEST = SAFE_RANGE,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
switch (keycode) {
case QMKBEST:
if (record->event.pressed) {
// when keycode QMKBEST is pressed
SEND_STRING("QMK is the best thing ever!");
} else {
// when keycode QMKBEST is released
}
break;
}
return true;
if (record->event.pressed) {
// when keycode QMKBEST is pressed
SEND_STRING("QMK is the best thing ever!");
} else {
// when keycode QMKBEST is released
}
break;
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{QMKBEST, KC_ESC}
}
[0] = {
{QMKBEST, KC_ESC},
// ...
},
};
```
@@ -49,42 +49,45 @@ You can do that by adding another keycode and adding another case to the switch
```c
enum custom_keycodes {
QMKBEST = SAFE_RANGE,
QMKURL,
MY_OTHER_MACRO
QMKBEST = SAFE_RANGE,
QMKURL,
MY_OTHER_MACRO,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
switch (keycode) {
case QMKBEST:
if (record->event.pressed) {
// when keycode QMKBEST is pressed
SEND_STRING("QMK is the best thing ever!");
} else {
// when keycode QMKBEST is released
}
break;
if (record->event.pressed) {
// when keycode QMKBEST is pressed
SEND_STRING("QMK is the best thing ever!");
} else {
// when keycode QMKBEST is released
}
break;
case QMKURL:
if (record->event.pressed) {
// when keycode QMKURL is pressed
SEND_STRING("https://qmk.fm/\n");
} else {
// when keycode QMKURL is released
}
break;
if (record->event.pressed) {
// when keycode QMKURL is pressed
SEND_STRING("https://qmk.fm/\n");
} else {
// when keycode QMKURL is released
}
break;
case MY_OTHER_MACRO:
if (record->event.pressed) {
SEND_STRING(SS_LCTL("ac")); // selects all and copies
}
break;
}
return true;
if (record->event.pressed) {
SEND_STRING(SS_LCTL("ac")); // selects all and copies
}
break;
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = {
{MY_CUSTOM_MACRO, MY_OTHER_MACRO}
}
[0] = {
{MY_CUSTOM_MACRO, MY_OTHER_MACRO},
// ...
},
};
```

View File

@@ -21,7 +21,11 @@ Keep in mind that a report_mouse_t (here "mouseReport") has the following proper
* `mouseReport.h` - this is a signed int from -127 to 127 (not 128, this is defined in USB HID spec) representing horizontal scrolling (+ right, - left).
* `mouseReport.buttons` - this is a uint8_t in which the last 5 bits are used. These bits represent the mouse button state - bit 3 is mouse button 5, and bit 7 is mouse button 1.
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in "pointing_device_send()", which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
Once you have made the necessary changes to the mouse report, you need to send it:
* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report.
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
In the following example, a custom key is used to click the mouse and scroll 127 units vertically and horizontally, then undo all of that when released - because that's a totally useful function. Listen, this is an example:
@@ -38,6 +42,7 @@ case MS_SPECIAL:
currentReport.buttons &= ~MOUSE_BTN1;
}
pointing_device_set_report(currentReport);
pointing_device_send();
break;
```

View File

@@ -1,31 +1,24 @@
# Tap Dance: A Single Key Can Do 3, 5, or 100 Different Things
## Introduction
## Introduction :id=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.
## 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.
## How to Use Tap Dance :id=how-to-use
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`.
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.
## 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.
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.
Optionally, you might want to set a custom `TAPPING_TERM` time by adding something like this in you `config.h`:
```
```c
#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.
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.
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that 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:
@@ -43,11 +36,12 @@ The first option is enough for a lot of cases, that just want dual roles. For ex
Similar to the first option, the second option is good for simple layer-switching cases.
For more complicated cases, use the third or fourth options (examples of each are listed below).
For more complicated cases, use the third or fourth options (examples of each are listed below).
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.
## Implementation Details
## Implementation Details :id=implementation
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.
@@ -58,9 +52,9 @@ Our next stop is `matrix_scan_tap_dance()`. This handles the timeout of tap-danc
For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros.
# Examples
## Examples :id=examples
## Simple Example
### Simple Example :id=simple-example
Here's a simple example for a single definition:
@@ -69,23 +63,26 @@ Here's a simple example for a single definition:
3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
```c
//Tap Dance Declarations
// Tap Dance declarations
enum {
TD_ESC_CAPS = 0
TD_ESC_CAPS,
};
//Tap Dance Definitions
// Tap Dance definitions
qk_tap_dance_action_t tap_dance_actions[] = {
//Tap once for Esc, twice for Caps Lock
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS)
// Other declarations would go here, separated by commas, if you have them
// Tap once for Escape, twice for Caps Lock
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
};
//In Layer declaration, add tap dance item in place of a key code
TD(TD_ESC_CAPS)
// Add tap dance item in place of a key code
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ...
TD(TD_ESC_CAPS)
// ...
};
```
## Complex Examples
### Complex Examples :id=complex-examples
This section details several complex tap dance examples.
All the enums used in the examples are declared like this:
@@ -93,104 +90,105 @@ All the enums used in the examples are declared like this:
```c
// Enums defined for all examples:
enum {
CT_SE = 0,
CT_CLN,
CT_EGG,
CT_FLSH,
X_TAP_DANCE
CT_SE,
CT_CLN,
CT_EGG,
CT_FLSH,
X_TAP_DANCE
};
```
### Example 1: Send `:` on Single Tap, `;` on Double Tap
#### Example 1: Send `:` on Single Tap, `;` on Double Tap :id=example-1
```c
void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code (KC_RSFT);
register_code (KC_SCLN);
} else {
register_code (KC_SCLN);
}
void dance_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code16(KC_COLN);
} else {
register_code(KC_SCLN);
}
}
void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_RSFT);
unregister_code (KC_SCLN);
} else {
unregister_code (KC_SCLN);
}
void dance_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code16(KC_COLN);
} else {
unregister_code(KC_SCLN);
}
}
//All tap dance functions would go here. Only showing this one.
// All tap dance functions would go here. Only showing this one.
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
};
```
### Example 2: Send "Safety Dance!" After 100 Taps
#### Example 2: Send "Safety Dance!" After 100 Taps :id=example-2
```c
void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 100) {
SEND_STRING ("Safety dance!");
reset_tap_dance (state);
}
void dance_egg(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 100) {
SEND_STRING("Safety dance!");
reset_tap_dance(state);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
};
```
### Example 3: Turn LED Lights On Then Off, One at a Time
#### Example 3: Turn LED Lights On Then Off, One at a Time :id=example-3
```c
// on each tap, light up one led, from right to left
// on the forth tap, turn them off from right to left
// On each tap, light up one LED, from right to left
// On the fourth tap, turn them off from right to left
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_1_on();
break;
case 4:
ergodox_right_led_3_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_1_off();
}
switch (state->count) {
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_1_on();
break;
case 4:
ergodox_right_led_3_off();
wait_ms(50);
ergodox_right_led_2_off();
wait_ms(50);
ergodox_right_led_1_off();
}
}
// on the fourth tap, set the keyboard on flash state
// On the fourth tap, set the keyboard on flash state
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 4) {
reset_keyboard();
reset_tap_dance(state);
}
if (state->count >= 4) {
reset_keyboard();
}
}
// if the flash state didn't happen, then turn off LEDs, left to right
// If the flash state didn't happen, then turn off LEDs, left to right
void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_1_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_3_off();
ergodox_right_led_1_off();
wait_ms(50);
ergodox_right_led_2_off();
wait_ms(50);
ergodox_right_led_3_off();
}
//All tap dances now put together. Example 3 is "CT_FLASH"
// All tap dances now put together. Example 3 is "CT_FLASH"
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
[CT_SE] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT),
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
};
```
### Example 4: 'Quad Function Tap-Dance'
#### Example 4: 'Quad Function Tap-Dance' :id=example-4
By [DanielGGordon](https://github.com/danielggordon)
@@ -201,40 +199,37 @@ Below is a specific example:
* Double Tap = Send `Escape`
* Double Tap and Hold = Send `Alt`
## Setup
You will need a few things that can be used for 'Quad Function Tap-Dance'.
You'll need to add these to the top of your `keymap.c` file, before your keymap.
```c
typedef struct {
bool is_press_action;
int state;
bool is_press_action;
uint8_t state;
} tap;
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send two single taps
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7
SINGLE_TAP = 1,
SINGLE_HOLD,
DOUBLE_TAP,
DOUBLE_HOLD,
DOUBLE_SINGLE_TAP, // Send two single taps
TRIPLE_TAP,
TRIPLE_HOLD
};
//Tap dance enums
// Tap dance enums
enum {
X_CTL = 0,
SOME_OTHER_DANCE
X_CTL,
SOME_OTHER_DANCE
};
int cur_dance (qk_tap_dance_state_t *state);
//for the x tap dance. Put it here so it can be used in any keymap
void x_finished (qk_tap_dance_state_t *state, void *user_data);
void x_reset (qk_tap_dance_state_t *state, void *user_data);
uint8_t cur_dance(qk_tap_dance_state_t *state);
// For the x tap dance. Put it here so it can be used in any keymap
void x_finished(qk_tap_dance_state_t *state, void *user_data);
void x_reset(qk_tap_dance_state_t *state, void *user_data);
```
Now, at the bottom of your `keymap.c` file, you'll need to add the following:
@@ -267,65 +262,62 @@ Now, at the bottom of your `keymap.c` file, you'll need to add the following:
* For the third point, there does exist the 'DOUBLE_SINGLE_TAP', however this is not fully tested
*
*/
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) return SINGLE_TAP;
//key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'.
else return SINGLE_HOLD;
}
else if (state->count == 2) {
/*
* DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
* action when hitting 'pp'. Suggested use case for this return value is when you want to send two
* keystrokes of the key, and not the 'double tap' action/macro.
*/
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
//Assumes no one is trying to type the same letter three times (at least not quickly).
//If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
//an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
if (state->count == 3) {
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
}
else return 8; //magic number. At some point this method will expand to work for more presses
uint8_t cur_dance(qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) return SINGLE_TAP;
// Key has not been interrupted, but the key is still held. Means you want to send a 'HOLD'.
else return SINGLE_HOLD;
} else if (state->count == 2) {
// DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
// action when hitting 'pp'. Suggested use case for this return value is when you want to send two
// keystrokes of the key, and not the 'double tap' action/macro.
if (state->interrupted) return DOUBLE_SINGLE_TAP;
else if (state->pressed) return DOUBLE_HOLD;
else return DOUBLE_TAP;
}
// Assumes no one is trying to type the same letter three times (at least not quickly).
// If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
// an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
if (state->count == 3) {
if (state->interrupted || !state->pressed) return TRIPLE_TAP;
else return TRIPLE_HOLD;
} else return 8; // Magic number. At some point this method will expand to work for more presses
}
//instanalize an instance of 'tap' for the 'x' tap dance.
// Create an instance of 'tap' for the 'x' tap dance.
static tap xtap_state = {
.is_press_action = true,
.state = 0
.is_press_action = true,
.state = 0
};
void x_finished (qk_tap_dance_state_t *state, void *user_data) {
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP: register_code(KC_X); break;
case SINGLE_HOLD: register_code(KC_LCTRL); break;
case DOUBLE_TAP: register_code(KC_ESC); break;
case DOUBLE_HOLD: register_code(KC_LALT); break;
case DOUBLE_SINGLE_TAP: register_code(KC_X); unregister_code(KC_X); register_code(KC_X);
//Last case is for fast typing. Assuming your key is `f`:
//For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
//In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
}
void x_finished(qk_tap_dance_state_t *state, void *user_data) {
xtap_state.state = cur_dance(state);
switch (xtap_state.state) {
case SINGLE_TAP: register_code(KC_X); break;
case SINGLE_HOLD: register_code(KC_LCTRL); break;
case DOUBLE_TAP: register_code(KC_ESC); break;
case DOUBLE_HOLD: register_code(KC_LALT); break;
// Last case is for fast typing. Assuming your key is `f`:
// For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
// In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
case DOUBLE_SINGLE_TAP: tap_code(KC_X); register_code(KC_X);
}
}
void x_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (xtap_state.state) {
case SINGLE_TAP: unregister_code(KC_X); break;
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
case DOUBLE_TAP: unregister_code(KC_ESC); break;
case DOUBLE_HOLD: unregister_code(KC_LALT);
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
}
xtap_state.state = 0;
void x_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (xtap_state.state) {
case SINGLE_TAP: unregister_code(KC_X); break;
case SINGLE_HOLD: unregister_code(KC_LCTRL); break;
case DOUBLE_TAP: unregister_code(KC_ESC); break;
case DOUBLE_HOLD: unregister_code(KC_LALT);
case DOUBLE_SINGLE_TAP: unregister_code(KC_X);
}
xtap_state.state = 0;
}
qk_tap_dance_action_t tap_dance_actions[] = {
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,x_finished, x_reset)
[X_CTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished, x_reset)
};
```
@@ -335,90 +327,91 @@ If you want to implement this in your userspace, then you may want to check out
> In this configuration "hold" takes place **after** tap dance timeout (see `ACTION_TAP_DANCE_FN_ADVANCED_TIME`). To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys
#### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5
Tap dance can be used to emulate `MT()` and `LT()` behavior when the tapped code is not a basic keycode. This is useful to send tapped keycodes that normally require `Shift`, such as parentheses or curly braces—or other modified keycodes, such as `Control + X`.
Below your layers and custom keycodes, add the following:
```c
// tapdance keycodes
// Tap Dance keycodes
enum td_keycodes {
ALT_LP // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
ALT_LP // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance.
};
// define a type containing as many tapdance states as you need
// Define a type containing as many tapdance states as you need
typedef enum {
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_SINGLE_TAP
SINGLE_TAP,
SINGLE_HOLD,
DOUBLE_SINGLE_TAP
} td_state_t;
// create a global instance of the tapdance state type
// Create a global instance of the tapdance state type
static td_state_t td_state;
// declare your tapdance functions:
// Declare your tapdance functions:
// function to determine the current tapdance state
int cur_dance (qk_tap_dance_state_t *state);
// Function to determine the current tapdance state
uint8_t cur_dance(qk_tap_dance_state_t *state);
// `finished` and `reset` functions for each tapdance keycode
void altlp_finished (qk_tap_dance_state_t *state, void *user_data);
void altlp_reset (qk_tap_dance_state_t *state, void *user_data);
void altlp_finished(qk_tap_dance_state_t *state, void *user_data);
void altlp_reset(qk_tap_dance_state_t *state, void *user_data);
```
Below your `LAYOUT`, define each of the tapdance functions:
```c
// determine the tapdance state to return
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
else { return SINGLE_HOLD; }
}
if (state->count == 2) { return DOUBLE_SINGLE_TAP; }
else { return 3; } // any number higher than the maximum state value you return above
}
// handle the possible states for each tapdance keycode you define:
// Determine the tapdance state to return
uint8_t cur_dance(qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted || !state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
}
void altlp_finished (qk_tap_dance_state_t *state, void *user_data) {
td_state = cur_dance(state);
switch (td_state) {
case SINGLE_TAP:
register_code16(KC_LPRN);
break;
case SINGLE_HOLD:
register_mods(MOD_BIT(KC_LALT)); // for a layer-tap key, use `layer_on(_MY_LAYER)` here
break;
case DOUBLE_SINGLE_TAP: // allow nesting of 2 parens `((` within tapping term
tap_code16(KC_LPRN);
register_code16(KC_LPRN);
}
if (state->count == 2) return DOUBLE_SINGLE_TAP;
else return 3; // Any number higher than the maximum state value you return above
}
void altlp_reset (qk_tap_dance_state_t *state, void *user_data) {
switch (td_state) {
case SINGLE_TAP:
unregister_code16(KC_LPRN);
break;
case SINGLE_HOLD:
unregister_mods(MOD_BIT(KC_LALT)); // for a layer-tap key, use `layer_off(_MY_LAYER)` here
break;
case DOUBLE_SINGLE_TAP:
unregister_code16(KC_LPRN);
}
// Handle the possible states for each tapdance keycode you define:
void altlp_finished(qk_tap_dance_state_t *state, void *user_data) {
td_state = cur_dance(state);
switch (td_state) {
case SINGLE_TAP:
register_code16(KC_LPRN);
break;
case SINGLE_HOLD:
register_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_on(_MY_LAYER)` here
break;
case DOUBLE_SINGLE_TAP: // Allow nesting of 2 parens `((` within tapping term
tap_code16(KC_LPRN);
register_code16(KC_LPRN);
}
}
// define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
void altlp_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (td_state) {
case SINGLE_TAP:
unregister_code16(KC_LPRN);
break;
case SINGLE_HOLD:
unregister_mods(MOD_BIT(KC_LALT)); // For a layer-tap key, use `layer_off(_MY_LAYER)` here
break;
case DOUBLE_SINGLE_TAP:
unregister_code16(KC_LPRN);
}
}
// Define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
qk_tap_dance_action_t tap_dance_actions[] = {
[ALT_LP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
[ALT_LP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altlp_finished, altlp_reset)
};
```
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
#### Example 6: Using tap dance for momentary-layer-switch and layer-toggle keys :id=example-6
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.
@@ -426,97 +419,92 @@ The first step is to include the following code towards the beginning of your `k
```c
typedef struct {
bool is_press_action;
int state;
bool is_press_action;
uint8_t state;
} tap;
//Define a type for as many tap dance states as you need
// Define a type for as many tap dance states as you need
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3
SINGLE_TAP = 1,
SINGLE_HOLD,
DOUBLE_TAP
};
enum {
QUOT_LAYR = 0 //Our custom tap dance key; add any other tap dance keys to this enum
QUOT_LAYR, // 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)
// Declare the functions to be used with your tap dance key(s)
//Function associated with all tap dances
int cur_dance (qk_tap_dance_state_t *state);
// Function associated with all tap dances
uint8_t cur_dance(qk_tap_dance_state_t *state);
//Functions associated with individual tap dances
void ql_finished (qk_tap_dance_state_t *state, void *user_data);
void ql_reset (qk_tap_dance_state_t *state, void *user_data);
// Functions associated with individual tap dances
void ql_finished(qk_tap_dance_state_t *state, void *user_data);
void ql_reset(qk_tap_dance_state_t *state, void *user_data);
```
Towards the bottom of your `keymap.c`, include the following code:
```c
//Determine the current tap dance state
int cur_dance (qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (!state->pressed) {
return SINGLE_TAP;
} else {
return SINGLE_HOLD;
}
} else if (state->count == 2) {
return DOUBLE_TAP;
}
else return 8;
// Determine the current tap dance state
uint8_t cur_dance(qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (!state->pressed) return SINGLE_TAP;
else return SINGLE_HOLD;
} else if (state->count == 2) return DOUBLE_TAP;
else return 8;
}
//Initialize tap structure associated with example tap dance key
// Initialize tap structure associated with example tap dance key
static tap ql_tap_state = {
.is_press_action = true,
.state = 0
.is_press_action = true,
.state = 0
};
//Functions that control what our tap dance key does
void ql_finished (qk_tap_dance_state_t *state, void *user_data) {
ql_tap_state.state = cur_dance(state);
switch (ql_tap_state.state) {
case SINGLE_TAP:
tap_code(KC_QUOT);
break;
case SINGLE_HOLD:
layer_on(_MY_LAYER);
break;
case DOUBLE_TAP:
//check to see if the layer is already set
if (layer_state_is(_MY_LAYER)) {
//if already set, then switch it off
// Functions that control what our tap dance key does
void ql_finished(qk_tap_dance_state_t *state, void *user_data) {
ql_tap_state.state = cur_dance(state);
switch (ql_tap_state.state) {
case SINGLE_TAP:
tap_code(KC_QUOT);
break;
case SINGLE_HOLD:
layer_on(_MY_LAYER);
break;
case DOUBLE_TAP:
// Check to see if the layer is already set
if (layer_state_is(_MY_LAYER)) {
// If already set, then switch it off
layer_off(_MY_LAYER);
} else {
// If not already set, then switch the layer on
layer_on(_MY_LAYER);
}
break;
}
}
void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
// If the key was held down and now is released then switch off the layer
if (ql_tap_state.state == SINGLE_HOLD) {
layer_off(_MY_LAYER);
} else {
//if not already set, then switch the layer on
layer_on(_MY_LAYER);
}
break;
}
}
ql_tap_state.state = 0;
}
void ql_reset (qk_tap_dance_state_t *state, void *user_data) {
//if the key was held down and now is released then switch off the layer
if (ql_tap_state.state==SINGLE_HOLD) {
layer_off(_MY_LAYER);
}
ql_tap_state.state = 0;
}
//Associate our tap dance key with its functionality
// Associate our tap dance key with its functionality
qk_tap_dance_action_t tap_dance_actions[] = {
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
};
```
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 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)`.
The `case:SINGLE_TAP` in `ql_finished` is similar to the above examples. The `SINGLE_HOLD` case 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 `DOUBLE_TAP` case 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.
`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[]`.

View File

@@ -2,11 +2,25 @@
Unicode characters can be input straight from your keyboard! There are some limitations, however.
QMK has three different methods for enabling Unicode input and defining keycodes:
In order to enable Unicode support on your keyboard, you will need to do the following:
## Basic Unicode
1. Choose one of three supported Unicode implementations: [Basic Unicode](#basic-unicode), [Unicode Map](#unicode-map), [UCIS](#ucis).
2. Find which [input mode](#input-modes) is the best match for your operating system and setup.
3. [Set](#setting-the-input-mode) the appropriate input mode (or modes) in your configuration.
4. Add Unicode keycodes to your keymap.
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.
## 1. Methods :id=methods
QMK supports three different methods for enabling Unicode input and adding Unicode characters to your keymap. Each has its pros and cons in terms of flexibility and ease of use. Choose the one that best fits your use case.
The Basic method should be enough for most users. However, if you need a wider range of supported characters (including emoji, rare symbols etc.), you should use Unicode Map.
<br>
### 1.1. Basic Unicode :id=basic-unicode
The easiest to use method, albeit somewhat limited. It stores Unicode characters as keycodes in the keymap itself, so it only supports code points up to `0x7FFF`. This covers characters for most modern languages (including East Asian), as well as symbols, but it doesn't cover emoji.
Add the following to your `rules.mk`:
@@ -14,11 +28,13 @@ Add the following to your `rules.mk`:
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)`.
Then add `UC(c)` keycodes to your keymap, where _c_ is the code point of the desired character (preferably in hexadecimal, up to 4 digits long). For example, `UC(0x40B)` will output [Ћ](https://unicode-table.com/en/040B/), and `UC(0x30C4)` will output [](https://unicode-table.com/en/30C4).
## Unicode Map
<br>
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.
### 1.2. Unicode Map :id=unicode-map
In addition to standard character ranges, this method also covers emoji, ancient scripts, rare symbols etc. In fact, all possible code points (up to `0x10FFFF`) are supported. Here, Unicode characters are stored in a separate mapping table. You need to maintain a `unicode_map` array in your keymap file, which may contain at most 16384 entries.
Add the following to your `rules.mk`:
@@ -26,7 +42,7 @@ Add the following to your `rules.mk`:
UNICODEMAP_ENABLE = yes
```
Then add `X(i)` keycodes to your keymap, where _i_ is an array index into the mapping table:
Then add `X(i)` keycodes to your keymap, where _i_ is the desired character's index in the mapping table. This can be a numeric value, but it's recommended to keep the indices in an enum and access them by name.
```c
enum unicode_names {
@@ -44,15 +60,17 @@ const uint32_t PROGMEM unicode_map[] = {
Then you can use `X(BANG)`, `X(SNEK)` etc. in your keymap.
### Lower and Upper Case
#### Lower and Upper Case
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 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.
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#L36) function. This also allows you to, say, check Ctrl instead of Shift/Caps.
## UCIS
<br>
### 1.3. UCIS :id=ucis
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.
@@ -66,15 +84,18 @@ Then define a table like this in your keymap file:
```c
const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE(
UCIS_SYM("poop", 0x1F4A9), // 💩
UCIS_SYM("rofl", 0x1F923), // 🤣
UCIS_SYM("kiss", 0x1F619) // 😙
UCIS_SYM("poop", 0x1F4A9), // 💩
UCIS_SYM("rofl", 0x1F923), // 🤣
UCIS_SYM("cuba", 0x1F1E8, 0x1F1FA), // 🇨🇺
UCIS_SYM("look", 0x0CA0, 0x005F, 0x0CA0), // ಠ_ಠ
);
```
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.
By default, each table entry may be up to 3 code points long. This number can be changed by adding `#define UCIS_MAX_CODE_POINTS n` to your `config.h` file.
### Customization
To use UCIS input, call `qk_ucis_start()`. Then, type the mnemonic for the character (such as "rofl") and hit Space, Enter or Esc. QMK should erase the "rofl" text and insert the laughing emoji.
#### Customization
There are several functions that you can define in your keymap to customize the functionality of this feature.
@@ -84,63 +105,77 @@ There are several functions that you can define in your keymap to customize the
You can find the default implementations of these functions in [`process_ucis.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_ucis.c).
## Input Modes
## 2. Input Modes :id=input-modes
Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like a macro. Unfortunately, the way this is done differs for each platform. Specifically, each platform requires a different combination of keys to trigger Unicode input. Therefore, a corresponding input mode has to be set in QMK.
The following input modes are available:
* **`UC_MAC`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
* **`UC_MAC`**: macOS built-in Unicode hex input. Supports code points up to `0x10FFFF` (all possible code points).
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_MAC`](#input-key-configuration) with another keycode.
By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_MAC`](#input-key-configuration) with a different keycode.
!> Using the _Unicode Hex Input_ input source may disable some Option based shortcuts, such as Option + Left Arrow and Option + Right Arrow.
!> Using the _Unicode Hex Input_ input source may disable some Option-based shortcuts, such as Option+Left and Option+Right.
!> `UC_OSX` is a deprecated alias of `UC_MAC` that will be removed in a future version of QMK.
!> `UC_OSX` is a deprecated alias of `UC_MAC` that will be removed in future versions of QMK. All new keymaps should use `UC_MAC`.
* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with another keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
By default, this mode uses Ctrl+Shift+U (`LCTL(LSFT(KC_U))`) to start Unicode input, but this can be changed by defining [`UNICODE_KEY_LNX`](#input-key-configuration) with a different keycode. This might be required for IBus versions ≥1.5.15, where Ctrl+Shift+U behavior is consolidated into Ctrl+Shift+E.
* **`UC_WIN`**: _(not recommended)_ Windows built-in hex numpad Unicode input. Supports code points up to `0xFFFF`.
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
To enable, create a registry key under `HKEY_CURRENT_USER\Control Panel\Input Method` of type `REG_SZ` called `EnableHexNumpad` and set its value to `1`. This can be done from the Command Prompt by running `reg add "HKCU\Control Panel\Input Method" -v EnableHexNumpad -t REG_SZ -d 1` with administrator privileges. Reboot afterwards.
This mode is not recommended because of reliability and compatibility issues; use the `UC_WINC` mode instead.
* **`UC_BSD`**: _(non implemented)_ Unicode input under BSD. Not implemented at this time. If you're a BSD user and want to help add support for it, please [open an issue on GitHub](https://github.com/qmk/qmk_firmware/issues).
* **`UC_WINC`**: Windows Unicode input using [WinCompose](https://github.com/samhocevar/wincompose). As of v0.9.0, supports code points up to `0x10FFFF` (all possible code points).
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. Works reliably under all version of Windows supported by the app.
By default, this mode uses right Alt (`KC_RALT`) as the Compose key, but this can be changed in the WinCompose settings and by defining [`UNICODE_KEY_WINC`](#input-key-configuration) with another keycode.
To enable, install the [latest release](https://github.com/samhocevar/wincompose/releases/latest). Once installed, WinCompose will automatically run on startup. This mode works reliably under all version of Windows supported by the app.
By default, this mode uses right Alt (`KC_RALT`) as the Compose key, but this can be changed in the WinCompose settings and by defining [`UNICODE_KEY_WINC`](#input-key-configuration) with a different keycode.
### Switching Input Modes
There are two ways to set the input mode for Unicode: by keycode or by function. Keep in mind that both methods write to persistent storage (EEPROM), and are loaded each time the keyboard starts. So once you've set it the first time, you don't need to set it again unless you want to change it, or you've reset the EEPROM settings.
## 3. Setting the Input Mode :id=setting-the-input-mode
You can switch the input mode at any time by using one of the following keycodes. The easiest way is to add the ones you use to your keymap.
|Keycode |Alias |Input Mode |Description |
|----------------------|---------|------------|--------------------------------------------------------------|
|`UNICODE_MODE_FORWARD`|`UC_MOD` |Next in list|[Cycle](#input-mode-cycling) through selected modes |
|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Prev in list|[Cycle](#input-mode-cycling) through selected modes in reverse|
|`UNICODE_MODE_MAC` |`UC_M_MA`|`UC_MAC` |Switch to macOS input |
|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input |
|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input |
|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input (not implemented) |
|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose |
You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`). Since the function only needs to be called once, it's recommended that you do it in `eeconfig_init_user()` (or a similar function). For example:
To set your desired input mode, add the following define to your `config.h`:
```c
void eeconfig_init_user(void) {
set_unicode_input_mode(UC_LNX);
}
#define UNICODE_SELECTED_MODES UC_LNX
```
### Audio Feedback
This example sets the board's default input mode to `UC_LNX`. You can replace this with `UC_MAC`, `UC_WINC`, or any of the other modes listed [above](#input-modes). The board will automatically use the selected mode on startup, unless you manually switch to another mode (see [below](#keycodes)).
You can also select multiple input modes, which allows you to easily cycle through them using the `UC_MOD`/`UC_RMOD` keycodes.
```c
#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX, UC_WINC
```
Note that the values are separated by commas. The board will remember the last used input mode and will continue using it on next power-up. You can disable this and force it to always start with the first mode in the list by adding `#define UNICODE_CYCLE_PERSIST false` to your `config.h`.
#### Keycodes
You can switch the input mode at any time by using the following keycodes. Adding these to your keymap allows you to quickly switch to a specific input mode, including modes not listed in `UNICODE_SELECTED_MODES`.
|Keycode |Alias |Input Mode |Description |
|----------------------|---------|------------|-----------------------------------------------------------------------------|
|`UNICODE_MODE_FORWARD`|`UC_MOD` |Next in list|Cycle through selected modes, reverse direction when Shift is held |
|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Prev in list|Cycle through selected modes in reverse, forward direction when Shift is held|
|`UNICODE_MODE_MAC` |`UC_M_MA`|`UC_MAC` |Switch to macOS input |
|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input |
|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input |
|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input _(not implemented)_ |
|`UNICODE_MODE_WINC` |`UC_M_WC`|`UC_WINC` |Switch to Windows input using WinCompose |
You can also switch the input mode by calling `set_unicode_input_mode(x)` in your code, where _x_ is one of the above input mode constants (e.g. `UC_LNX`).
?> Using `UNICODE_SELECTED_MODES` is preferable to calling `set_unicode_input_mode()` in `matrix_init_user()` or similar functions, since it's better integrated into the Unicode system and has the added benefit of avoiding unnecessary writes to EEPROM.
#### Audio Feedback
If you have the [Audio feature](feature_audio.md) enabled on the board, you can set melodies to be played when you press the above keys. That way you can have some audio feedback when switching input modes.
@@ -154,20 +189,21 @@ For instance, you can add these definitions to your `config.h` file:
#define UNICODE_SONG_WINC UNICODE_WINDOWS
```
### Additional Customization
## Additional Customization
Because Unicode is a large and versatile feature, there are a number of options you can customize to make it work better on your system.
#### Start and Finish Input Functions
### Start and Finish Input Functions
The functions for starting and finishing Unicode input on your platform can be overridden locally. Possible uses include customizing input mode behavior if you don't use the default keys, or adding extra visual/audio feedback to Unicode input.
* `void unicode_input_start(void)` This sends the initial sequence that tells your platform to enter Unicode input mode. For example, it presses Ctrl+Shift+U on Linux and holds the Option key on macOS.
* `void unicode_input_finish(void)` This is called to exit Unicode input mode, for example by pressing Space or releasing the Option key.
* `void unicode_input_start(void)` This sends the initial sequence that tells your platform to enter Unicode input mode. For example, it holds the left Alt key followed by Num+ on Windows, and presses the `UNICODE_KEY_LNX` combination (default: Ctrl+Shift+U) on Linux.
* `void unicode_input_finish(void)` This is called to exit Unicode input mode, for example by pressing Space or releasing the Alt key.
You can find the default implementations of these functions in [`process_unicode_common.c`](https://github.com/qmk/qmk_firmware/blob/master/quantum/process_keycode/process_unicode_common.c).
#### Input Key Configuration
### Input Key Configuration
You can customize the keys used to trigger Unicode input for macOS, Linux and WinCompose by adding corresponding defines to your `config.h`. The default values match the platforms' default settings, so you shouldn't need to change this unless Unicode input isn't working, or you want to use a different key (e.g. in order to free up left or right Alt).
@@ -177,54 +213,47 @@ You can customize the keys used to trigger Unicode input for macOS, Linux and Wi
|`UNICODE_KEY_LNX` |`uint16_t`|`LCTL(LSFT(KC_U))`|`#define UNICODE_KEY_LNX LCTL(LSFT(KC_E))`|
|`UNICODE_KEY_WINC`|`uint8_t` |`KC_RALT` |`#define UNICODE_KEY_WINC KC_RGUI` |
#### Input Mode Cycling
You can choose which input modes are available for cycling through. By default, this is disabled. If you want to enable it, limiting it to just the modes you use makes sense. Note that the values in the list are comma-delimited.
## Sending Unicode Strings
```c
#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX, UC_WIN, UC_WINC
```
QMK provides several functions that allow you to send Unicode input to the host programmatically:
You can cycle through the selected modes by using the `UC_MOD`/`UC_RMOD` keycodes, or by calling `cycle_unicode_input_mode(offset)` in your code (`offset` is how many modes to move forward by, so +1 corresponds to `UC_MOD`).
### `send_unicode_string()`
By default, when the keyboard boots, it will initialize the input mode to the last one you used. You can disable this and make it start with the first mode in the list every time by adding the following to your `config.h`:
```c
#define UNICODE_CYCLE_PERSIST false
```
!> Using `UNICODE_SELECTED_MODES` means you don't have to initially set the input mode in `matrix_init_user()` (or a similar function); the Unicode system will do that for you on startup. This has the added benefit of avoiding unnecessary writes to EEPROM.
## `send_unicode_string()`
This function is much like `send_string()` but allows you to input UTF-8 characters directly, and supports all code points (provided the selected input method also supports it). Make sure your `keymap.c` is formatted in UTF-8 encoding.
This function is much like `send_string()`, but it allows you to input UTF-8 characters directly. It supports all code points, provided the selected input mode also supports it. Make sure your `keymap.c` file is formatted using UTF-8 encoding.
```c
send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
```
## `send_unicode_hex_string()`
Example uses include sending Unicode strings when a key is pressed, as described in [Macros](feature_macros.md).
Similar to `send_unicode_string()`, but the characters are represented by their code point values in ASCII, separated by spaces. For example, the table flip above would be achieved with:
### `send_unicode_hex_string()`
Similar to `send_unicode_string()`, but the characters are represented by their Unicode code points, written in hexadecimal and separated by spaces. For example, the table flip above would be achieved with:
```c
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
```
An easy way to convert your Unicode string to this format is by using [this site](https://r12a.github.io/app-conversion/), and taking the result in the "Hex/UTF-32" section.
An easy way to convert your Unicode string to this format is to use [this site](https://r12a.github.io/app-conversion/) and take the result in the "Hex/UTF-32" section.
## Additional Language Support
In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware.
In `quantum/keymap_extras`, you'll see various language files these work the same way as the ones for alternative layouts such as Colemak or BÉPO. When you include one of these language headers, you gain access to keycodes specific to that language / national layout. Such keycodes are defined by a 2-letter country/language code, followed by an underscore and a 4-letter abbreviation of the character to which the key corresponds. For example, including `keymap_french.h` and using `FR_UGRV` in your keymap will output `ù` when typed on a system with a native French AZERTY layout.
If the primary system layout you use on your machine is different from US ANSI, using these language-specific keycodes can help your QMK keymaps better match what will actually be output on the screen. However, keep in mind that these keycodes are just aliases for the corresponding default US keycodes under the hood, and that the HID protocol used by keyboards is itself inherently based on US ANSI.
## International Characters on Windows
### AutoHotkey allows Windows users to create custom hotkeys among others.
### AutoHotkey
The method does not require Unicode support in the keyboard itself but depends instead of [AutoHotkey](https://autohotkey.com) running in the background.
The method does not require Unicode support in the keyboard itself but instead depends on [AutoHotkey](https://autohotkey.com) running in the background.
First you need to select a modifier combination that is not in use by any of your programs.
CtrlAltWin is not used very widely and should therefore be perfect for this.
Ctrl+Alt+Win is not used very widely and should therefore be perfect for this.
There is a macro defined for a mod-tab combo `LCAG_T`.
Add this mod-tab combo to a key on your keyboard, e.g.: `LCAG_T(KC_TAB)`.
This makes the key behave like a tab key if pressed and released immediately but changes it to the modifier if used with another key.
@@ -239,8 +268,5 @@ AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
### US International
If you enable the US International layout on the system, it will use punctuation to accent the characters.
For instance, typing "\`a" will result in à.
If you enable the US International layout on the system, it will use punctuation to accent the characters. For instance, typing "\`a" will result in à.
You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout).

View File

@@ -111,7 +111,7 @@ This is ideal for when you want ensure everything compiles successfully when pre
## Examples
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna).
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example).
For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace.

View File

@@ -106,7 +106,7 @@
* [Velocikey](ja/feature_velocikey.md)
* QMK の開発
* 破壊的な変更
* 互換性を破る変更/Breaking changes
* [概要](ja/breaking_changes.md)
* [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
* 履歴

120
docs/ja/breaking_changes.md Normal file
View File

@@ -0,0 +1,120 @@
# Breaking changes/互換性を破る変更
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: 0.9.0:docs/breaking_changes.md
git diff 0.9.0 HEAD -- docs/breaking_changes.md | cat
-->
このドキュメントは QMK の互換性を破る変更(Breaking change) のプロセスについて説明します。
互換性を破る変更とは、互換性がなかったり潜在的な危険が生じるように QMK の動作を変える変更を指します。
ユーザが QMK ツリーを更新しても自分のキーマップが壊れない事を確信できるように、これらの変更を制限します。(訳注:以後、原文のまま Breaking change を用語として使用します。)
Breaking change ピリオドとは、危険な変更、または予想外の変更を QMK へ行なう PR をマージする時のことです。
付随するテスト期間があるため、問題が起きることはまれか、有りえないと確信しています。
## 過去の Breaking change には何が含まれますか?
* [2020年5月30日](ja/ChangeLog/20200530.md)
* [2020年2月29日](ja/ChangeLog/20200229.md)
* [2019年8月30日](ja/ChangeLog/20190830.md)
## 次の Breaking change はいつですか?
次の Breaking change は2020年8月29日に予定されています。
### 重要な日付
* [x] 2020年 5月30日 - `develop` が作成されました。毎週リベースされます。
* [ ] 2020年 8月 1日 - `develop` は新しいPRを取り込みません。
* [ ] 2020年 8月 1日 - テスターの募集。
* [ ] 2020年 8月27日 - `master`がロックされ、PR はマージされません。
* [ ] 2020年 8月29日 - `develop``master` にマージします。
* [ ] 2020年 8月29日 - `master` のロックが解除されます。PR を再びマージすることができます。
## どのような変更が含まれますか?
最新の Breaking change 候補を見るには、[`breaking_change` ラベル](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr)を参照してください。
現在から `develop` が閉じられるまでの間に新しい変更が追加される可能性があり、そのラベルが適用された PR はマージされることは保証されていません。
このラウンドに、あなたの Breaking change を含めたい場合は、`breaking_change` ラベルを持つ PR を作成し、`develop` が閉じる前に承認してもらう必要があります。
`develop` が閉じた後は、新しい Breaking change は受け付けられません。
受け入れの基準:
* PR が完了し、マージの準備ができている
* PR が ChangeLog を持つ
# チェックリスト
ここでは、Breaking change プロセスを実行する時に使用する様々なプロセスについて説明します。
## `master` から `develop` をリベースします
これは `develop` が開いている間、毎週金曜日に実行されます。
プロセス:
```
cd qmk_firmware
git checkout master
git pull --ff-only
git checkout develop
git rebase master
git push --force
```
## `develop` ブランチの作成
以前の `develop` ブランチがマージされた直後に、これが発生します。
* `qmk_firmware` git commands
* [ ] `git checkout master`
* [ ] `git pull --ff-only`
* [ ] `git checkout -b develop`
* [ ] Edit `readme.md`
* [ ] これがテストブランチであることを上部に大きな通知で追加します。
* [ ] このドキュメントへのリンクを含めます
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ] `git tag <next_version>` # ブレーキング ポイント タグがバージョンの増分を混乱させないようにします
* [ ] `git push origin develop`
* [ ] `git push --tags`
## マージの 4 週間前
* `develop` は新しい PR に対して閉じられ、現在の PR の修正のみがマージされる可能性があります。
* テスターの呼び出しを投稿します
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## マージの 1 週間前
* master が < 2 日前> から <マージの日> まで閉じられることを発表します
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## マージの 2 日前
* master が 2 日間閉じられることを発表します
* [ ] Discord
* [ ] GitHub PR
* [ ] https://reddit.com/r/olkb
## マージの日
* `qmk_firmware` git commands
* [ ] `git checkout develop`
* [ ] `git pull --ff-only`
* [ ] `git rebase origin/master`
* [ ] Edit `readme.md`
* [ ] `develop` についてのメモを削除
* [ ] ChangeLog を 1 つのファイルにまとめます。
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
* [ ] `git push origin develop`
* GitHub Actions
* [ ] `develop`の PR を作成します
* [ ] travis がクリーンに戻ったことを確認します
* [ ] `develop` PR をマージします

View File

@@ -0,0 +1,51 @@
# breaking changes/互換性を破る変更: プルリクエストにフラグが付けられた
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: 0.9.0:docs/breaking_changes_instructions.md
git diff 0.9.0 HEAD -- docs/breaking_changes_instructions.md | cat
-->
QMK のメンバーがあなたのプルリクエストに返信し、あなたの提出したものは Breaking change (互換性を破る変更) であると述べている場合があります。メンバーの判断では、あなたが提案した変更は QMK やその利用者にとってより大きな影響を持つと考えられます。
プルリクエストにフラグが立てられる原因となるものには、以下のようなものがあります:
- **ユーザーのキーマップに対する編集**
ユーザーが自分のキーマップを QMK に提出した後、しばらくしてさらに更新してプルリクエストを開いたところ、それが `qmk/qmk_firmware` リポジトリで編集されていたためにマージできなかったことに気づくことがあるかもしれません。すべてのユーザーが Git や GitHub を使いこなせるわけではないので、ユーザー自身で問題を修正できないことに気づくかもしれません。
- **期待される動作の変更**
QMK の動作を変更すると、既存の QMK 機能への変更を組み込んだ新しいファームウェアをフラッシュした場合、ユーザはハードウェアまたは QMK が壊れていると考え、希望する動作を復元する手段がないことに気付くことがあります。
- **ユーザーのアクションを必要とする変更**
変更には、ツールチェインを更新したり、Git で何らかのアクションを取るなど、ユーザーがアクションを行う必要がある場合もあります。
- **精査が必要な変更**
時には、投稿がプロジェクトとしての QMK に影響を与えることもあります。これは、著作権やライセンスの問題、コーディング規約、大規模な機能のオーバーホール、コミュニティによるより広範なテストを必要とする「リスクの高い」変更、あるいは全く別のものである可能性があります。
- **エンドユーザーとのコミュニケーションを必要とする変更**
これには、将来の非推奨化への警告、時代遅れの慣習、その他伝えなければならないが上記のカテゴリのどれかに当てはまらないものが含まれます。
## 何をすればいいのか?
提出したものが Breaking change だと判断された場合、手続きをスムーズに進めるためにできることがいくつかあります。
### PR を分割することを検討する
あなたがコアコードを投稿していて、それが Breaking change プロセスを経る必要がある唯一の理由が、あなたの変更に合わせてキーマップを更新していることである場合、古いキーマップが機能し続けるような方法であなたの機能を投稿できるかどうかを検討してください。
そののち、Breaking change プロセスを経て古いコードを削除する別の PR を提出してください。
### ChangeLog エントリの提供
Breaking change プロセスを経て提出する際には、変更ログのエントリを含めることを我々は要請します。
エントリーは、あなたのプルリクエストが行う変更の短い要約としてください &ndash; [ここの各セクションは changelog として開始されました](ja/ChangeLog/20190830.md "n.b. This should link to the 2019 Aug 30 Breaking Changes doc - @noroadsleft")。
変更ログは `docs/ChangeLog/YYYYMMDD/PR####.md` に置いてください。
ここで、`YYYYMMDD` は QMK の breaking change ブランチ &ndash; 通常は `develop` という名称 &ndash;`master` ブランチにマージされる日付、`####` はプルリクエストの番号です。
ユーザー側でのアクションを必要とする場合、あなたの変更ログは、どのようなアクションを取らなければならないかをユーザーに指示するか、そのようなアクションを指示する場所にリンクする必要があります。
### 変更点を文書化する
提出物の目的を理解し、それが必要とする可能性のある意味合いやアクションを理解することで、レビュープロセスをより簡単にすることができます。この目的のためには変更履歴で十分かもしれませんが、より広範囲の変更を行う場合には、変更履歴には不向きな詳細レベルが必要になるかもしれません。
あなたのプルリクエストにコメントしたり、質問やコメント、変更要求に対応したりすることは、非常にありがたいことです。
### 助けを求める
あなたの提出物にフラグが立ったことで、あなたはびっくりしてしまったかもしれません。もし、あなた自身が脅されたり、圧倒されたりしていると感じたら、私たちに知らせてください。プルリクエストにコメントするか、[Discord で QMK チームに連絡を取ってください](https://discord.gg/Uq7gcHh)。

View File

@@ -1,8 +1,8 @@
# QMK CLI 設定
<!---
original document: d598f01cb:docs/cli_configuration.md
git diff d598f01cb HEAD -- docs/cli_configuration.md | cat
original document: 0.9.0:docs/cli_configuration.md
git diff 0.9.0 HEAD -- docs/cli_configuration.md | cat
-->
このドキュメントは `qmk config` がどのように動作するかを説明します。

View File

@@ -1,8 +1,8 @@
# Zadig を使ったブートローダドライバのインストール
<!---
original document: d598f01cb:docs/driver_installation_zadig.md
git diff d598f01cb HEAD -- docs/driver_installation_zadig.md | cat
original document: 0.9.0:docs/driver_installation_zadig.md
git diff 0.9.0 HEAD -- docs/driver_installation_zadig.md | cat
-->
QMK はホストにたいして通常の HID キーボードデバイスとして振る舞うため特別なドライバは必要ありません。しかし、Windows でのキーボードへの書き込みは、多くの場合、キーボードをリセットした時に現れるブートローダデバイスで*行います*。

View File

@@ -1,8 +1,8 @@
# デバッグの FAQ
<!---
original document: 376419a4f:docs/faq_debug.md
git diff 376419a4f HEAD -- docs/faq_debug.md | cat
original document: 0.9.10:docs/faq_debug.md
git diff 0.9.10 HEAD -- docs/faq_debug.md | cat
-->
このページは、キーボードのトラブルシューティングについての様々な一般的な質問を説明します。

View File

@@ -1,8 +1,8 @@
# オーディオ
<!---
original document: 5d5ff80:docs/feature_audio.md
git diff 5d5ff80 HEAD -- docs/feature_audio.md | cat
original document: 0.9.0:docs/feature_audio.md
git diff 0.9.0 HEAD -- docs/feature_audio.md | cat
-->
キーボードは音を出すことができますPlanck、Preonic あるいは特定の PWM 対応ピンにアクセスできる AVR キーボードがある場合は、単純なスピーカーを接続してビープ音を鳴らすことができます。これらのビープ音を使ってレイヤーの変化、モディファイア、特殊キーを示したり、あるいは単にイカした8ビットの曲を鳴らすことができます。

View File

@@ -1,8 +1,8 @@
# 自動シフト: なぜシフトキーが必要ですか?
<!---
original document: 5d5ff80:docs/feature_auto_shift.md
git diff 5d5ff80 HEAD -- docs/feature_auto_shift.md | cat
original document: 0.9.0:docs/feature_auto_shift.md
git diff 0.9.0 HEAD -- docs/feature_auto_shift.md | cat
-->
キーをタップすると、その文字を取得します。キーをタップするが、*わずかに*長く押し続けると、シフト状態になります。ほら!シフトキーは必要ありません!

View File

@@ -1,8 +1,8 @@
# バックライト
<!---
original document: 5d5ff80:docs/feature_backlight.md
git diff 5d5ff80 HEAD -- docs/feature_backlight.md | cat
original document: 0.9.10:docs/feature_backlight.md
git diff 0.9.10 HEAD -- docs/feature_backlight.md | cat
-->
多くのキーボードは、キースイッチを貫通して配置されたり、キースイッチの下に配置された個々の LED によって、バックライトキーをサポートします。この機能は通常スイッチごとに単一の色しか使用できないため、[RGB アンダーグロー](ja/feature_rgblight.md)および [RGB マトリックス](ja/feature_rgb_matrix.md)機能のどちらとも異なりますが、キーボードに複数の異なる単一色の LED を取り付けることは当然可能です。
@@ -94,29 +94,29 @@ BACKLIGHT_DRIVER = pwm
ハードウェア PWM は以下の表に従ってサポートされます:
| バックライトピン | AT90USB64/128 | ATmega16/32U4 | ATmega16/32U2 | ATmega32A | ATmega328P |
| バックライトピン | AT90USB64/128 | ATmega16/32U4 | ATmega16/32U2 | ATmega32A | ATmega328/P |
|-------------|-------------|-------------|-------------|---------|----------|
| `B1` | | | | | Timer 1 |
| `B2` | | | | | Timer 1 |
| `B5` | Timer 1 | Timer 1 | | | |
| `B6` | Timer 1 | Timer 1 | | | |
| `B7` | Timer 1 | Timer 1 | Timer 1 | | |
| `C4` | Timer 3 | | | | |
| `C5` | Timer 3 | | Timer 1 | | |
| `C6` | Timer 3 | Timer 3 | Timer 1 | | |
| `D4` | | | | Timer 1 | |
| `D5` | | | | Timer 1 | |
| `B1` | | | | | Timer 1 |
| `B2` | | | | | Timer 1 |
| `B5` | Timer 1 | Timer 1 | | | |
| `B6` | Timer 1 | Timer 1 | | | |
| `B7` | Timer 1 | Timer 1 | Timer 1 | | |
| `C4` | Timer 3 | | | | |
| `C5` | Timer 3 | | Timer 1 | | |
| `C6` | Timer 3 | Timer 3 | Timer 1 | | |
| `D4` | | | | Timer 1 | |
| `D5` | | | | Timer 1 | |
他の全てのピンはソフトウェア PWM を使います。[オーディオ](ja/feature_audio.md)機能が無効あるいは1つのタイマだけを使っている場合は、ハードウェアタイマによってバックライト PWM を引き起こすことができます:
| オーディオピン | オーディオタイマ | ソフトウェア PWM タイマ |
|---------|-----------|------------------|
| `C4` | Timer 3 | Timer 1 |
| `C5` | Timer 3 | Timer 1 |
| `C6` | Timer 3 | Timer 1 |
| `B5` | Timer 1 | Timer 3 |
| `B6` | Timer 1 | Timer 3 |
| `B7` | Timer 1 | Timer 3 |
| `C4` | Timer 3 | Timer 1 |
| `C5` | Timer 3 | Timer 1 |
| `C6` | Timer 3 | Timer 1 |
| `B5` | Timer 1 | Timer 3 |
| `B6` | Timer 1 | Timer 3 |
| `B7` | Timer 1 | Timer 3 |
両方のタイマーがオーディオのために使われている場合、バックライト PWM はハードウェアタイマを使いませんが、代わりにマトリックススキャンの間に引き起こされます。この場合、PWM の計算は十分なタイミングの精度で呼ばれないかもしれないため、バックライトの明滅はサポートされず、バックライトもちらつくかもしれません。
@@ -126,13 +126,13 @@ BACKLIGHT_DRIVER = pwm
| 定義 | デフォルト | 説明 |
|---------------------|-------------|--------------------------------------------------------------------------------------------------------------|
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
| `BACKLIGHT_ON_STATE` | `1` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
| `BACKLIGHT_ON_STATE` | `1` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
### バックライトオン状態
@@ -192,10 +192,10 @@ BACKLIGHT_DRIVER = pwm
| 定義 | デフォルト | 説明 |
|------------------------|-------------|-------------------------------------------------------------------------------------------------------------|
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PWM_DRIVER` | `PWMD4` | 使用する PWM ドライバ。ピンから PWM タイマへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PWM_CHANNEL` | `3` | 使用する PWM チャンネル。ピンから PWM チャンネルへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PAL_MODE` | `2` | 使用するピンの代替機能。ピンの AF マッピングについては ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PWM_DRIVER` | `PWMD4` | 使用する PWM ドライバ。ピンから PWM タイマへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PWM_CHANNEL` | `3` | 使用する PWM チャンネル。ピンから PWM チャンネルへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PAL_MODE` | `2` | 使用するピンの代替機能。ピンの AF マッピングについては ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
## Software PWM Driver :id=software-pwm-driver
@@ -210,7 +210,7 @@ BACKLIGHT_DRIVER = software
| 定義 | デフォルト | 説明 |
|-----------------|-------------|-------------------------------------------------------------------------------------------------------------|
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
### 複数のバックライトピン

View File

@@ -1,8 +1,8 @@
# Bluetooth
<!---
original document: 5d5ff80:docs/feature_bluetooth.md
git diff 5d5ff80 HEAD -- docs/feature_bluetooth.md | cat
original document: 0.9.0:docs/feature_bluetooth.md
git diff 0.9.0 HEAD -- docs/feature_bluetooth.md | cat
-->
## Bluetooth の既知のサポートハードウェア

View File

@@ -1,8 +1,8 @@
# ブートマジック
<!---
original document: 5d5ff80:docs/feature_bootmagic.md
git diff 5d5ff80 HEAD -- docs/feature_bootmagic.md | cat
original document: 0.9.0:docs/feature_bootmagic.md
git diff 0.9.0 HEAD -- docs/feature_bootmagic.md | cat
-->
再書き込みせずにキーボードの挙動を変更することができる、3つの独立した関連する機能があります。それぞれは似たような機能を持ちますが、キーボードがどのように設定されているかによって異なる方法でアクセスされます。
@@ -149,6 +149,17 @@ BOOTMAGIC_ENABLE = lite
!> ブートマジックライトを使用すると、EEPROM を**常にリセットします**。つまり保存された全ての設定は失われます。
## 分割キーボード
`SPLIT_HAND_PIN` のようなオプションで、左右の設定があらかじめ決められている場合は、キーボードの左右で別のキーを設定する必要があるかもしれません。これを行うには、`config.h` ファイルに以下のエントリを追加します。
```c
#define BOOTMAGIC_LITE_ROW_RIGHT 4
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
```
デフォルトでは、これらの値は設定されていません。
## 高度なブートマジックライト
`bootmagic_lite` 関数は必要に応じてコード内で置き換えることができるように、弱く定義されています。これの良い例は Zeal60 キーボードで、追加の処理が必要です。

View File

@@ -0,0 +1,127 @@
# マウスキー
<!---
original document: 0.8.141:docs/feature_mouse_keys.md
git diff 0.8.141 HEAD -- docs/feature_mouse_keys.md | cat
-->
マウスキーは、キーボードを使ってマウスをエミュレートできる機能です。様々な速度でポインタを移動し、5つのボタンを押し、8方向にスクロールすることができます。
## キーボードにマウスキーを追加
マウスキーを使うためには、少なくともマウスキーサポートを有効にし、マウスアクションをキーボードのキーにマップする必要があります。
### マウスキーを有効にする
マウスキーを有効にするには、キーマップの `rules.mk` に以下の行を追加します:
```c
MOUSEKEY_ENABLE = yes
```
### マウスアクションのマッピング
キーマップでキー押下をマウスアクションにマップするために、以下のキーコードを使うことができます:
| キー | エイリアス | 説明 |
|----------------|---------|-----------------|
| `KC_MS_UP` | `KC_MS_U` | カーソルを上に移動 |
| `KC_MS_DOWN` | `KC_MS_D` | カーソルを下に移動 |
| `KC_MS_LEFT` | `KC_MS_L` | カーソルを左に移動 |
| `KC_MS_RIGHT` | `KC_MS_R` | カーソルを右に移動 |
| `KC_MS_BTN1` | `KC_BTN1` | ボタン1を押す |
| `KC_MS_BTN2` | `KC_BTN2` | ボタン2を押す |
| `KC_MS_BTN3` | `KC_BTN3` | ボタン3を押す |
| `KC_MS_BTN4` | `KC_BTN4` | ボタン4を押す |
| `KC_MS_BTN5` | `KC_BTN5` | ボタン5を押す |
| `KC_MS_WH_UP` | `KC_WH_U` | ホイールを向こう側に回転 |
| `KC_MS_WH_DOWN` | `KC_WH_D` | ホイールを手前側に回転 |
| `KC_MS_WH_LEFT` | `KC_WH_L` | ホイールを左に倒す |
| `KC_MS_WH_RIGHT` | `KC_WH_R` | ホイールを右に倒す |
| `KC_MS_ACCEL0` | `KC_ACL0` | 速度を0に設定 |
| `KC_MS_ACCEL1` | `KC_ACL1` | 速度を1に設定 |
| `KC_MS_ACCEL2` | `KC_ACL2` | 速度を2に設定 |
## マウスキーの設定
マウスキーはカーソルを移動するための2つの異なるモードをサポートします:
* **加速 (デフォルト):** 移動キーを押したままにすると、カーソルが最大速度に達するまでカーソルを加速します。
* **定速:** 移動キーを押したままにすると、カーソルを一定の速度で移動します。
同じ原則がスクロールにも適用されます。
時間、間隔、遅延の設定オプションは、ミリ秒で指定されます。スクロール速度はデフォルトスクロールステップの倍数として渡されます。例えば、スクロール速度8は、各スクロールアクションがオペレーティングシステムまたはアプリケーションで定義されるデフォルトのスクロールステップの8倍の距離進むことを意味します。
### 加速モード
これはデフォルトのモードです。キーマップの `config.h` ファイルの以下の設定を使ってカーソルとスクロールの加速を調整することができます:
| 定義 | デフォルト | 説明 |
|----------------------------|-------|---------------------------------------------------------|
| `MOUSEKEY_DELAY` | 300 | 移動キーを押してからカーソルが移動するまでの遅延 |
| `MOUSEKEY_INTERVAL` | 50 | カーソル移動間の時間 |
| `MOUSEKEY_MAX_SPEED` | 10 | 加速が停止する最大のカーソル速度 |
| `MOUSEKEY_TIME_TO_MAX` | 20 | 最大カーソル速度に達するまでの時間 |
| `MOUSEKEY_WHEEL_DELAY` | 300 | ホイールキーを押してからホイールが動くまでの遅延 |
| `MOUSEKEY_WHEEL_INTERVAL` | 100 | ホイールの動きの間の時間 |
| `MOUSEKEY_WHEEL_MAX_SPEED` | 8 | スクロールアクションごとのスクロールステップの最大数 |
| `MOUSEKEY_WHEEL_TIME_TO_MAX` | 40 | 最大スクロール速度に達するまでの時間 |
ヒント:
* `MOUSEKEY_DELAY` の設定が低すぎるとカーソルが応答しなくなります。設定が高すぎると小さな動きが難しくなります。
* カーソルの動きをスムーズにするには、`MOUSEKEY_INTERVAL` の値を低くします。ディスプレイのリフレッシュレートが60Hzの場合、`16` (1/60) に設定することができます。これによりカーソルの速度が大幅に向上するため、`MOUSEKEY_MAX_SPEED` を下げた方が良いかもしれません。
* `MOUSEKEY_TIME_TO_MAX` または `MOUSEKEY_WHEEL_TIME_TO_MAX``0` に設定すると、それぞれカーソルの速度またはスクロールの加速が無効になります。この方法では、一方を加速しながら他方を一定にすることができますが、これは定速モードでは不可能です。
* `MOUSEKEY_WHEEL_INTERVAL` の設定が低すぎるとスクロールがとても速くなります。設定が高すぎるとホイールキーを押したままにした時にスクロールがとても遅くなります
カーソルの加速は、X Window System MouseKeysAccel 機能と同じアルゴリズムを使います。詳細については [Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys) をご覧ください。
### 定速モード
このモードでは、カーソルおよびマウスホイールの両方について複数の異なる速度を定義することができます。加速はありません。`KC_ACL0``KC_ACL1` および `KC_ACL2` は、カーソルとスクロールの速度をそれぞれの設定に変更します。
速度の選択は、一時的とタップ選択のどちらかを選べます:
* **一時的:** 選択された速度は、それぞれのキーを押している間のみアクティブになります。キーを放すと、マウスキーは変更される前の速度に戻ります。
* **タップ選択:** それぞれのキーを押すと選択された速度がアクティブになり、キーを放した後もアクティブのままになります。デフォルトの速度は `KC_ACL1` です。未変更の速度はありません。
最も遅い速度から最も速い速度までのデフォルトの速度は以下の通りです:
* **一時的:** `KC_ACL0` < `KC_ACL1` < *変更無し* < `KC_ACL2`
* **タップ選択:** `KC_ACL0` < `KC_ACL1` < `KC_ACL2`
定速モードを使うには少なくともキーマップの keymaps ディレクトリの `config.h` ファイルに `MK_3_SPEED` を定義する必要があります
```c
#define MK_3_SPEED
```
一時的モードを有効にするには`MK_MOMENTARY_ACCEL` も定義します:
```c
#define MK_MOMENTARY_ACCEL
```
カーソル移動あるいはスクロールを調整する場合は以下の設定を使います:
| 定義 | デフォルト | 説明 |
|---------------------|-------------|-------------------------------------------|
| `MK_3_SPEED` | *定義なし* | 定速カーソルを有効にする |
| `MK_MOMENTARY_ACCEL` | *定義なし* | 一時的モードを有効にする |
| `MK_C_OFFSET_UNMOD` | 16 | 移動ごとのカーソルオフセット (変更無し) |
| `MK_C_INTERVAL_UNMOD` | 16 | カーソルの移動間の時間 (変更無し) |
| `MK_C_OFFSET_0` | 1 | 移動ごとのカーソルオフセット (`KC_ACL0`) |
| `MK_C_INTERVAL_0` | 32 | カーソル移動間の時間 (`KC_ACL0`) |
| `MK_C_OFFSET_1` | 4 | 移動ごとのカーソルオフセット (`KC_ACL1`) |
| `MK_C_INTERVAL_1` | 16 | カーソル移動間の時間 (`KC_ACL1`) |
| `MK_C_OFFSET_2` | 32 | 移動ごとのカーソルオフセット (`KC_ACL2`) |
| `MK_C_INTERVAL_2` | 16 | カーソル移動間の時間 (`KC_ACL2`) |
| `MK_W_OFFSET_UNMOD` | 1 | スクロールアクションごとのスクロールステップ (変更無し) |
| `MK_W_INTERVAL_UNMOD` | 40 | スクロールステップ間の時間 (変更無し) |
| `MK_W_OFFSET_0` | 1 | スクロールアクションごとのスクロールステップ (`KC_ACL0`) |
| `MK_W_INTERVAL_0` | 360 | スクロールステップ間の時間 (`KC_ACL0`) |
| `MK_W_OFFSET_1` | 1 | スクロールアクションごとのスクロールステップ (`KC_ACL1`) |
| `MK_W_INTERVAL_1` | 120 | スクロールステップ間の時間 (`KC_ACL1`) |
| `MK_W_OFFSET_2` | 1 | スクロールアクションごとのスクロールステップ (`KC_ACL2`) |
| `MK_W_INTERVAL_2` | 20 | スクロールステップ間の時間 (`KC_ACL2`) |

View File

@@ -32,7 +32,7 @@ report_mouse_t (ここでは "mouseReport") が以下のプロパティを持つ
```c
case MS_SPECIAL:
report_mouse_t currentReport = pointing_device_get_report();
report_mouse_t currentReport = pointing_device_get_report();
if (record->event.pressed) {
currentReport.v = 127;
currentReport.h = 127;
@@ -42,7 +42,7 @@ case MS_SPECIAL:
currentReport.h = -127;
currentReport.buttons &= ~MOUSE_BTN1;
}
pointing_device_set_report(currentReport);
pointing_device_set_report(currentReport);
break;
```

View File

@@ -0,0 +1,293 @@
# PS/2 マウスサポート :id=ps2-mouse-support
<!---
original document: 0.8.147:docs/feature_ps2_mouse.md
git diff 0.8.147 HEAD -- docs/feature_ps2_mouse.md | cat
-->
PS/2 マウス (例えばタッチパッドあるいはトラックポイント)を複合デバイスとしてキーボードに接続することができます。
トラックポイントを接続するには、トラックポイントモジュールを入手し (つまり、Thinkpad キーボードから部品を取って)、モジュールの各ピンの機能を特定し、コントローラとトラックポイントモジュールの間に必要な回路を作成する必要があります。詳細については、Deskthority Wiki の[トラックポイントハードウェア](https://deskthority.net/wiki/TrackPoint_Hardware)ページを参照してください。
PS/2 デバイスの接続は、USART(最善)、割り込み(次善)、 または busywait(非推奨)の3つのやり方が有ります。
## トラックポイントとコントローラ間の回路 :id=the-circuitry-between-trackpoint-and-controller
動作させるには、DATA と CLK のふたつのラインを 4.7k の抵抗で 5V にプルアップしてやる必要があります。
```
DATA ----------+--------- PIN
|
4.7K
|
MODULE 5+ --------+--+--------- PWR CONTROLLER
|
4.7K
|
CLK ------+------------ PIN
```
## Busywait バージョン :id=busywait-version
注意: これは非推奨です。ギクシャクした動きや、未送信の入力が発生するかもしれません。可能であれば、割り込みまたは USART バージョンを使ってください。
rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_BUSYWAIT = yes
```
キーボードの config.h で:
```c
#ifdef PS2_USE_BUSYWAIT
# define PS2_CLOCK_PORT PORTD
# define PS2_CLOCK_PIN PIND
# define PS2_CLOCK_DDR DDRD
# define PS2_CLOCK_BIT 1
# define PS2_DATA_PORT PORTD
# define PS2_DATA_PIN PIND
# define PS2_DATA_DDR DDRD
# define PS2_DATA_BIT 2
#endif
```
## 割り込みバージョン :id=interrupt-version
以下の例はクロックのために D2 を、データのために D5 を使います。クロックには任意の INT あるいは PCINT ピンを、データには任意のピンを使うことができます。
rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
```
キーボードの config.h で:
```c
#ifdef PS2_USE_INT
#define PS2_CLOCK_PORT PORTD
#define PS2_CLOCK_PIN PIND
#define PS2_CLOCK_DDR DDRD
#define PS2_CLOCK_BIT 2
#define PS2_DATA_PORT PORTD
#define PS2_DATA_PIN PIND
#define PS2_DATA_DDR DDRD
#define PS2_DATA_BIT 5
#define PS2_INT_INIT() do { \
EICRA |= ((1<<ISC21) | \
(0<<ISC20)); \
} while (0)
#define PS2_INT_ON() do { \
EIMSK |= (1<<INT2); \
} while (0)
#define PS2_INT_OFF() do { \
EIMSK &= ~(1<<INT2); \
} while (0)
#define PS2_INT_VECT INT2_vect
#endif
```
## USART バージョン :id=usart-version
ATMega32u4 で USART を使うには、クロックのために PD5 を、データのために PD2 を使う必要があります。それらのいずれかが利用できない場合は、割り込みバージョンを使う必要があります。
rules.mk で:
```makefile
PS2_MOUSE_ENABLE = yes
PS2_USE_USART = yes
```
キーボードの config.h で:
```c
#ifdef PS2_USE_USART
#define PS2_CLOCK_PORT PORTD
#define PS2_CLOCK_PIN PIND
#define PS2_CLOCK_DDR DDRD
#define PS2_CLOCK_BIT 5
#define PS2_DATA_PORT PORTD
#define PS2_DATA_PIN PIND
#define PS2_DATA_DDR DDRD
#define PS2_DATA_BIT 2
/* 同期、奇数パリティ、1-bit ストップ、8-bit データ、立ち下がりエッジでサンプル */
/* CLOCK の DDR を入力としてスレーブに設定 */
#define PS2_USART_INIT() do { \
PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); \
PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); \
UCSR1C = ((1 << UMSEL10) | \
(3 << UPM10) | \
(0 << USBS1) | \
(3 << UCSZ10) | \
(0 << UCPOL1)); \
UCSR1A = 0; \
UBRR1H = 0; \
UBRR1L = 0; \
} while (0)
#define PS2_USART_RX_INT_ON() do { \
UCSR1B = ((1 << RXCIE1) | \
(1 << RXEN1)); \
} while (0)
#define PS2_USART_RX_POLL_ON() do { \
UCSR1B = (1 << RXEN1); \
} while (0)
#define PS2_USART_OFF() do { \
UCSR1C = 0; \
UCSR1B &= ~((1 << RXEN1) | \
(1 << TXEN1)); \
} while (0)
#define PS2_USART_RX_READY (UCSR1A & (1<<RXC1))
#define PS2_USART_RX_DATA UDR1
#define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
#define PS2_USART_RX_VECT USART1_RX_vect
#endif
```
## 追加の設定 :id=additional-settings
### PS/2 マウス機能 :id=ps2-mouse-features
以下の PS/2 マウスプロトコルによってサポートされる設定を有効にします。
```c
/* デフォルトのストリームモードの代わりにリモートモードを使います (リンクを見てください) */
#define PS2_MOUSE_USE_REMOTE_MODE
/* マウスあるいはタッチパッドでスクロールホイールあるいはスクロールジェスチャーを有効にします */
#define PS2_MOUSE_ENABLE_SCROLLING
/* 一部のマウスでは、スクロールマスクを設定する必要があります。デフォルトは 0xFF です。*/
#define PS2_MOUSE_SCROLL_MASK 0x0F
/* ホストに送信する前に、動きに変換を適用します (リンクを見てください) */
#define PS2_MOUSE_USE_2_1_SCALING
/* ps2ホストを初期化した後の待機時間 */
#define PS2_MOUSE_INIT_DELAY 1000 /* Default */
```
ps2_mouse.h をインクルードして、以下の関数を呼び出すこともできます。
```c
void ps2_mouse_disable_data_reporting(void);
void ps2_mouse_enable_data_reporting(void);
void ps2_mouse_set_remote_mode(void);
void ps2_mouse_set_stream_mode(void);
void ps2_mouse_set_scaling_2_1(void);
void ps2_mouse_set_scaling_1_1(void);
void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
```
### 細かい調整 :id=fine-control
マウスの感度と速度を変更するには以下の定義を使います。
注意: 同じ効果のために `ps2_mouse_set_resolution` も使うことができます (ほとんどのタッチパッドではサポートされません)。
```c
#define PS2_MOUSE_X_MULTIPLIER 3
#define PS2_MOUSE_Y_MULTIPLIER 3
#define PS2_MOUSE_V_MULTIPLIER 1
```
### スクロールボタン :id=scroll-button
トラックポイントを使っている場合は、スクロールのためにそれを使えるようにしたいでしょう。
押された時にマウスを移動させる代わりにスクロールさせる「スクロールボタン」を有効にすることができます。
この機能を有効にするには、以下のようにスクロールボタンマスクを設定する必要があります:
```c
#define PS2_MOUSE_SCROLL_BTN_MASK (1<<PS2_MOUSE_BUTTON_MIDDLE) /* Default */
```
スクロールボタン機能を無効にするには:
```c
#define PS2_MOUSE_SCROLL_BTN_MASK 0
```
利用可能なボタンは:
```c
#define PS2_MOUSE_BTN_LEFT 0
#define PS2_MOUSE_BTN_RIGHT 1
#define PS2_MOUSE_BTN_MIDDLE 2
```
ボタン定数を `|` で結合したマスクでボタンを組み合わせることができます。
スクロールボタンマスクを設定したら、スクロールボタンの送信間隔を設定する必要があります。
これは、スクロールボタンが離された場合に、スクロールボタンがホストに送信されるまでの間隔です。
この時間が経過すると、マウスはスクロールして送信されなくなります。
```c
#define PS2_MOUSE_SCROLL_BTN_SEND 300 /* Default */
```
スクロールボタンの送信を無効にするには:
```c
#define PS2_MOUSE_SCROLL_BTN_SEND 0
```
以下の定義でスクロールの細かい制御がサポートされます:
```c
#define PS2_MOUSE_SCROLL_DIVISOR_H 2
#define PS2_MOUSE_SCROLL_DIVISOR_V 2
```
### マウスとスクロールの軸の反転 :id=invert-mouse-and-scroll-axes
X 軸と Y 軸を反転するには、以下を config.h に配置します:
```c
#define PS2_MOUSE_INVERT_X
#define PS2_MOUSE_INVERT_Y
```
スクロールの軸を逆にするには、以下を config.h に配置します:
```c
#define PS2_MOUSE_INVERT_H
#define PS2_MOUSE_INVERT_V
```
### マウスの軸の回転 :id=rotate-mouse-axes
デバイスの出力を時計回りに 90 か 180 か 270 度変換します。
デバイスの向きを補正する場合は、出力を逆の方向に同じ量だけ回転します。例えば、通常のデバイスの向きが北向きの場合、以下のように補正します:
```c
#define PS2_MOUSE_ROTATE 270 /* 東向きのデバイスの向きの補正*/
```
```c
#define PS2_MOUSE_ROTATE 180 /* 南向きのデバイスの向きの補正*/
```
```c
#define PS2_MOUSE_ROTATE 90 /* 西向きのデバイスの向きの補正*/
```
### デバッグ設定 :id=debug-settings
マウスをデバッグするには、`debug_mouse = true` を追加するか、ブートマジックを使って有効にします。
```c
/* マウスレポートをデバッグするには */
#define PS2_MOUSE_DEBUG_HID
#define PS2_MOUSE_DEBUG_RAW
```

View File

@@ -0,0 +1,232 @@
# 分割キーボード
<!---
original document:0.9.5:docs/feature_split_keyboard.md
git diff 0.9.5 HEAD -- docs/feature_split_keyboard.md | cat
-->
QMK ファームウェアリポジトリの多くのキーボードは、"分割"キーボードです。それらは2つのコントローラを使います — 1つは USB に接続し、もう1つは TRRS または同様のケーブルを介してシリアルまたは I<sup>2</sup>C 接続で接続します。
分割キーボードには多くの利点がありますが、有効にするには追加の作業が必要です。
QMK ファームウェアには、任意のキーボードで使用可能な一般的な実装と、多くのキーボード固有の実装があります。
このため、主に Let's Split とその他のキーボードで使われる一般的な実装について説明します。
!> ARM はまだ完全には分割キーボードをサポートしておらず、様々な制限があります。進捗はしていますが、機能の100%にはまだ達していません。
## 互換性の概要
| Transport | AVR | ARM |
|------------------------------|--------------------|--------------------|
| ['serial'](serial_driver.md) | :heavy_check_mark: | :white_check_mark: <sup>1</sup> |
| I2C | :heavy_check_mark: | |
注意:
1. ハードウェアとソフトウェアの両方の制限は、[ドライバーのドキュメント](serial_driver.md)の中で説明されます。
## ハードウェア設定
2つの Pro Micro 互換のコントローラを使っており、キーボードの左右を接続するために TRRS ジャックを使っていることを前提とします。
### ハードウェア要件
左右それぞれのキーボードマトリックスのためのダイオードとスイッチとは別に、2個の TRRS ソケットと 1本の TRRS ケーブルが必要です。
あるいは、少なくとも3本のワイヤがあるケーブルとソケットを使うことができます。
キーボードの左右間で通信するために I<sup>2</sup>C を使いたい場合は、少なくとも4本のワイヤを備えたケーブルと 2個の 4.7kΩ プルアップ抵抗が必要です。
#### 考慮事項
最も一般的に使われる接続は、TRRS ケーブルとジャックです。これらは4本のワイヤを提供し、分割キーボードに非常に有用で、簡単に見つけることができます。
ただし、ワイヤのうちの1本が Vcc を供給するため、キーボードはホットプラグ不可能です。TRRS ケーブルを抜き差しする前に、必ずキーボードのUSB接続をはずす必要があります。そうしなければ、コントローラを短絡させたり、もっと悪いことが起こるかもしれません。
別のオプションは電話ケーブルを使うことです (例えば、旧式の RJ-11/RJ-14 ケーブル)。実際に4本のワイヤ/レーンをサポートするものを使うようにしてください。
ただし、USB ケーブル、SATA ケーブル、そして単に4本の電線でもコントローラ間の通信に使用できることがわかっています。
!> コントローラ間の通信に USB ケーブルを使っても問題ありませんが、コネクタは通常の USB 接続と間違えられるかもしれず、配線方法によってはキーボードが短絡する可能性があります。このため、分割キーボードの接続のためにはお勧めできません。
### シリアル配線
2つの Pro Micro 間で GND、Vcc、D0 (別名 PDO あるいは pin 3) を TRS/TRRS ケーブルの3本のワイヤで接続します。
?> ここで使われるピンは実際には以下の `SOFT_SERIAL_PIN` によって設定されることに注意してください。
![シリアル配線](https://i.imgur.com/C3D1GAQ.png)
### I<sup>2</sup>C 配線
2つの Pro Micro 間で GND、Vcc、さらに SCL と SDA (それぞれ 別名 PD0/ピン3 および PD1/ピン2) を TRRS ケーブルの4本のワイヤで接続します。
プルアップ抵抗はキーボードの左右どちら側にも配置することができます。もし各側を単独で使いたい場合は、4つの抵抗を使い、両側にプルアップ抵抗を配置することもできます。
![I2C 配線](https://i.imgur.com/Hbzhc6E.png)
## ファームウェア設定
分割キーボード機能を有効にするには、以下を `rules.mk` に追加してください:
```make
SPLIT_KEYBOARD = yes
```
カスタムトランスポート (通信メソッド)を使っている場合は、以下を追加する必要もあります:
```make
SPLIT_TRANSPORT = custom
```
### 左右の設定
デフォルトでは、ファームウェアはどちら側がどちらであるかを認識しません; 決定するには幾つかの助けが必要です。これを行うには幾つかの方法があり、以下に優先順に列挙します。
#### ピンによる左右の設定
左右を決定するためにコントローラ上のピンを読むようにファームウェアを設定することができます。これを行うには、以下を `config.h` ファイルに追加します:
```c
#define SPLIT_HAND_PIN B7
```
これは指定されたピンを読み込みます。high の場合、コントローラはそれを左側だと仮定し、low の場合、それは右側であると仮定します。
#### EEPROM による左右の設定
このメソッドは永続ストレージ(`EEPROM`)のフラグを設定することで、キーボードの左右を設定します。これはコントローラが最初に起動する時にチェックされ、キーボードのどちら側であるかとキーボードのレイアウトの向きを決定します。
このメソッドを有効にするには、以下を `config.h` ファイルに追加します:
```c
#define EE_HANDS
```
ただし、各コントローラに正しい側の EEPROM ファイルを書き込む必要があります。これを手動で行うこともできますが、ファームウェアを書き込む時にこれを行う avrdude および dfu のターゲットが存在します。
* `:avrdude-split-left`
* `:avrdude-split-right`
* `:dfu-split-left`
* `:dfu-split-right`
* `:dfu-util-split-left`
* `:dfu-util-split-right`
この設定は、`EEP_RST` キーや `eeconfig_init()` 関数を使って EEPROM を再初期化する時には変更されません。ただし、ファームウェアの組み込みオプション以外で EEPROM をリセット([QMK Toolbox]() の "Reset EEPROM" ボタンの動作のように、`EEPROM` を上書きするファイルを書きこむなど)した場合、`EEPROM` ファイルを再書き込みする必要があります。
`EEPROM` ファイルは、QMK ファームウェアのリポジトリ内の[ここ](https://github.com/qmk/qmk_firmware/tree/master/quantum/split_common)にあります。
#### `#define` による左右の設定
コンパイル時に左右を設定することができます。これは以下を `config.h` ファイルに追加することで行うことができます:
```c
#define MASTER_RIGHT
```
あるいは
```c
#define MASTER_LEFT
```
どちらも定義されていない場合、左右のデフォルトは `MASTER_LEFT` になります。
### 通信オプション
全ての分割キーボードが同一であるとは限らないため、`config.h` ファイル内で設定することができる多くの追加のオプションがあります。
```c
#define USE_I2C
```
これは分割キーボードの I<sup>2</sup>C サポートを有効にします。これは厳密には通信用ではありませんが、OLED あるいは I<sup>2</sup>C ベースのデバイスに使うことができます。
```c
#define SOFT_SERIAL_PIN D0
```
これはシリアル通信用に使われるピンを設定します。シリアルを使っていない場合は、これを定義する必要はありません。
ただし、キーボード上でシリアルおよび I<sup>2</sup>C を使っている場合は、これを設定し、D0 および D1 以外の値に設定する必要があります (これらは I<sup>2</sup>C 通信のために使われます)。
```c
#define SELECT_SOFT_SERIAL_SPEED {#}`
```
シリアル通信に問題がある場合は、この値を変更して、シリアル用の通信速度を制御することができます。デフォルトは1で、可能な値は以下の通りです:
* **`0`**: 約189kbps (実験用途専用)
* **`1`**: 約137kbps (デフォルト)
* **`2`**: 約75kbps
* **`3`**: 約39kbps
* **`4`**: 約26kbps
* **`5`**: 約20kbps
### ハードウェア設定オプション
ハードウェアのセットアップ方法に基づいて、設定する必要のある設定が幾つかあります。
```c
#define MATRIX_ROW_PINS_RIGHT { <row pins> }
#define MATRIX_COL_PINS_RIGHT { <col pins> }
```
これにより、右側のマトリックスに異なるピンのセットを指定することができます。これは、左右の形が違うキーボード (Keebio の Quefrency など)で、左右で別の構成が必要な場合に便利です。
```c
#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }
```
これにより右側のための異なる直接ピンのセットを指定することができます。
```c
#define ENCODERS_PAD_A_RIGHT { encoder1a, encoder2a }
#define ENCODERS_PAD_B_RIGHT { encoder1b, encoder2b }
```
これにより右側のための異なるエンコーダピンのセットを指定することができます。
```c
#define RGBLIGHT_SPLIT
```
このオプションは、分割キーボードのコントローラ間で RGB ライトモードの同期を有効にします。これはコントローラに直接配線されている RGB LED を持つキーボード用です (つまり、それらは TRRS ケーブルで "追加データ"オプションを使っていません)。
```c
#define RGBLED_SPLIT { 6, 6 }
```
これは各コントローラに直接接続されている LED の数を設定します。最初の数は左側、2番目の数は右側です。
?> この設定は `RGBLIGHT_SPLIT` が有効になっていることを意味し、有効になっていない場合は強制的に有効にします。
```c
#define SPLIT_USB_DETECT
```
このオプションは、スタートアップの挙動を変更して、マスタ/スレーブの決定時にアクティブな USB 接続を検出します。このオプションがタイムアウトになった場合、その片側はスレーブと見なされます。これは ARM のデフォルトの挙動で、AVR Teensy ボードに必要です (ハードウェアの制限のため)。
?> この設定はバッテリパックを使ったデモの機能を停止します。
```c
#define SPLIT_USB_TIMEOUT 2000
```
これは、`SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合の最大タイムアウトを設定します。
```c
#define SPLIT_USB_TIMEOUT_POLL 10
```
これは `SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合のポーリング頻度を設定します
## 追加のリソース(英語)
Nicinabox には Let's Split キーボードのための[非常に優れた詳細なガイド](https://github.com/nicinabox/lets-split-guide)があり、トラブルシューティング情報を含む知っておくべきほとんど全てをカバーします。
ただし、RGB ライトセクションは、RGB Split コードが QMK ファームウェアに追加されるずっと前に書かれたため、古くなっています。ガイドに従う代わりに、各 LED テーブ(訳注: LED strip とも呼びます)を直接コントローラに配線します。
<!-- I may port this information later, but for now ... it's very nice, and covers everything -->

View File

@@ -0,0 +1,36 @@
# スワップハンドアクション
<!---
original document: 0.8.177:docs/feature_swap_hands.md
git diff 0.8.177 HEAD -- docs/feature_swap_hands.md | cat
-->
スワップハンドアクションにより、別のレイヤーを必要とせずに片手入力をサポートします。Makefile に `SWAP_HANDS_ENABLE` を設定し、キーマップに `hand_swap_config` エントリを定義します。これで `ACTION_SWAP_HANDS` コマンドキーが押されるたびにキーボードがミラーされます。例えば、QWERTY で "Hello, World" を入力するには、`^Ge^s^s^w^c W^wr^sd` を入力します。
## 設定
設定テーブルは列/行から新しい列/行にマップするための単純な2次元配列です。Planck の `hand_swap_config` の例:
```C
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
{{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
{{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
{{11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},
{{11, 3}, {10, 3}, {9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}},
};
```
配列のインデックスはマトリックスと同様に逆になり、値の型は `{col, row}` である `keypos_t` で、全ての値はゼロベースであることに注意してください。上の例では、`hand_swap_config[2][4]` (第3行, 第5列)は `{7, 2}` (第3行, 第8列) を返します。はい。紛らわしいです。
## キーコードの入れ替え
| キー | 説明 |
|-----------|-------------------------------------------------------------------------|
| `SH_T(key)` | タップで `key` を送信する。押している時の一時的な入れ替え。 |
| `SH_ON` | 入れ替えをオンにして、そのままにする。 |
| `SH_OFF` | 入れ替えをオフにして、そのままにする。既知の状態に戻るのに適しています。 |
| `SH_MON` | 押すとスワップハンドし、放すと通常に戻る (一時的)。 |
| `SH_MOFF` | 一時的に入れ替えをオフする。 |
| `SH_TG` | キーを押すたびに入れ替えのオンとオフを切り替える。 |
| `SH_TT` | タップで切り替える。押されている時の一時的なもの。 |
| `SH_OS` | ワンショットスワップハンド: 押されている時あるいは次のキーを押すまで切り替える。 |

View File

@@ -1,8 +1,8 @@
# タップダンス: 1つのキーが3つ、5つまたは100の異なる動作をします
<!---
original document: 634b277b0:docs/feature_tap_dance.md
git diff 634b277b0 HEAD -- docs//feature_tap_dance.md | cat
original document: 0.9.0:docs/feature_tap_dance.md
git diff 0.9.0 HEAD -- docs/feature_tap_dance.md | cat
-->
## イントロダクション

112
docs/ja/feature_terminal.md Normal file
View File

@@ -0,0 +1,112 @@
# ターミナル
<!---
original document: 0.8.147:docs/feature_terminal.md
git diff 0.8.147 HEAD -- docs/feature_terminal.md | cat
-->
> この機能は現在のところ*巨大*であり、おそらく大量のメモリを搭載したキーボード、または楽しみのためにのみ配置する必要があります。
ターミナル機能はテキストエディタを介してキーストロークで通信するように設計されたコマンドラインのようなインタフェースです。エディタで自動インデント機能をオフにすることは有益です。
有効にするには、以下を `rules.mk` または `Makefile` に貼り付けます:
TERMINAL_ENABLE = yes
そして、オンまたはオフにするために、`TERM_ON` および `TERM_OFF` キーコードを使います。
有効な場合、`> ` プロンプトが現れ、ここでコマンドやバックスペース(オーディオが有効な場合は、先頭に到達するとベルが鳴ります)を入力することができ、エンターを入力するとコマンドを送信します。矢印キーは現在のところ無効なため、混乱することはありません。マウスでカーソルを移動することはお勧めしません。
`#define TERMINAL_HELP` は、このページでは実際には必要のない他の出力ヘルパーを有効にします。
"上矢印" および "下矢印" により、過去に入力した5つのコマンドを順に切り替えることができます。
## 今後のアイデア
* キーボード/ユーザ拡張可能なコマンド
* より小さなフットプリント
* 矢印キーのサポート
* コマンド履歴 - 完了
* SD カードのサポート
* バッファディスプレイのための LCD サポート
* キーコード -> 名称の対応表
* レイヤー状態
* *アナログ/デジタル ポートの読み込み/書き込み*
* RGB モード関連機能
* マクロ定義
* EEPROM の読み込み/書き込み
* オーディオ制御
## 現在のコマンド
### `about`
現在の QMK のバージョンとビルドした日の出力:
```
> about
QMK Firmware
v0.5.115-7-g80ed73-dirty
Built: 2017-08-29-20:24:44
```
### `print-buffer`
最後に入力した5つのコマンドの出力
```
> print-buffer
0. print-buffer
1. help
2. about
3. keymap 0
4. help
5. flush-buffer
```
### `flush-buffer`
コマンドバッファをクリア
```
> flush-buffer
Buffer cleared!
```
### `help`
利用可能なコマンドの出力:
```
> help
commands available:
about help keycode keymap exit print-buffer flush-buffer
```
### `keycode <layer> <row> <col>`
特定のレイヤー、行および列のキーコード値の出力:
```
> keycode 0 1 0
0x29 (41)
```
### `keymap <layer>`
特定のレイヤーの全てのキーマップの出力
```
> keymap 0
0x002b, 0x0014, 0x001a, 0x0008, 0x0015, 0x0017, 0x001c, 0x0018, 0x000c, 0x0012, 0x0013, 0x002a,
0x0029, 0x0004, 0x0016, 0x0007, 0x0009, 0x000a, 0x000b, 0x000d, 0x000e, 0x000f, 0x0033, 0x0034,
0x00e1, 0x001d, 0x001b, 0x0006, 0x0019, 0x0005, 0x0011, 0x0010, 0x0036, 0x0037, 0x0038, 0x0028,
0x5cd6, 0x00e0, 0x00e2, 0x00e3, 0x5cd4, 0x002c, 0x002c, 0x5cd5, 0x0050, 0x0051, 0x0052, 0x004f,
>
```
### `exit`
ターミナルの終了 - `TERM_OFF` と同じ。

24
docs/ja/feature_wpm.md Normal file
View File

@@ -0,0 +1,24 @@
# Word Per Minute (WPM) の計算
<!---
original document: 0.9.0:docs/feature_wpm.md
git diff 0.9.0 HEAD -- docs/feature_wpm.md | cat
-->
WPM 機能は、キーストローク間の時間から1分あたりの平均移動平均単語数を計算し、様々な用途で利用できるようにします。
`rules.mk` に以下を追加することで WPM システムを有効にします:
WPM_ENABLE = yes
ソフトシリアルを使っている分割キーボードについては、計算された WPM スコアがマスター側とスレーブ側で利用可能です。
## 公開関数
`uint8_t get_current_wpm(void);`
この関数は符号なし整数で現在の WPM を返します。
## WPM 計算のためのカスタマイズ化されたキー
デフォルトでは、WPM スコアは文字、空白、およびいくつかの句読点のみを含みます。WPM の計算に含むとみなす文字セットを変更したい場合は、`wpm_keycode_user(uint16_t keycode)` を実装し、計算に含めたい文字について true を返し、計算しない特定のキーコードに false を返すようにします。

View File

@@ -1,8 +1,8 @@
# 書き込みの手順とブートローダ情報
<!---
original document: 0.8.62:docs/flashing.md
git diff 0.8.62 HEAD -- docs/flashing.md | cat
original document: 0.9.10:docs/flashing.md
git diff 0.9.10 HEAD -- docs/flashing.md | cat
-->
キーボードが使用するブートローダにはかなり多くの種類があり、ほぼ全てが異なる書き込みの方法を使います。幸いなことに、[QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) のようなプロジェクトは、あまり深く考える必要無しに様々なタイプと互換性を持つことを目指していますが、この文章では様々なタイプのブートローダとそれらを書き込むために利用可能な方法について説明します。

View File

@@ -1,8 +1,8 @@
# より詳細な `make` 手順
<!---
original document: 5f35203d1:docs/getting_started_make_guide.md
git diff 5f35203d1 HEAD -- docs/getting_started_make_guide.md | cat
original document: 0.9.0:docs/getting_started_make_guide.md
git diff 0.9.0 HEAD -- docs/getting_started_make_guide.md | cat
-->
`make` コマンドの完全な構文は `<keyboard_folder>:<keymap>:<target>` です:

View File

@@ -1,8 +1,8 @@
# Vagrant クイックスタート
<!---
original document: 7494490d6:docs/getting_started_vagrant.md
git diff 7494490d6 HEAD -- docs/getting_started_vagrant.md | cat
original document: 0.9.10:docs/getting_started_vagrant.md
git diff 0.9.10 HEAD -- docs/getting_started_vagrant.md | cat
-->
このプロジェクトは、プライマリオペレーティングシステムに大きな変更を加えることなくキーボードの新しいファームウェアを非常に簡単に構築することができる `Vagrantfile` を含みます。これは、あなたがプロジェクトをクローンしビルドを実行した時に、ビルドのために Vagrantfile を使っている他のユーザと全く同じ環境を持つことも保証します。これにより、人々はあなたが遭遇した問題の解決をより簡単に行えるようになります。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: c9e3fa6f7:docs/hardware_avr.md
git diff c9e3fa6f7 HEAD -- docs/hardware_avr.md | cat
original document: 0.9.0:docs/hardware_avr.md
git diff 0.9.0 HEAD -- docs/hardware_avr.md | cat
-->
このページでは QMK における AVR マイコンのサポートについて説明します。AVR マイコンには、Atmel 社製の atmega32u4、atmega32u2、at90usb1286 やその他のマイコンを含みます。AVR マイコンは、簡単に動かせるよう設計された8ビットの MCU です。キーボードでよく使用される AVR マイコンには USB 機能や大きなキーボードマトリックスのためのたくさんの GPIO を搭載しています。これらは、現在、キーボードで使われる最も一般的な MCU です。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: c9e3fa6f7:docs/hardware_drivers.md
git diff c9e3fa6f7 HEAD -- docs/hardware_drivers.md | cat
original document: 0.9.0:docs/hardware_drivers.md
git diff 0.9.0 HEAD -- docs/hardware_drivers.md | cat
-->
QMK はたくさんの異なるハードウェアで使われています。最も一般的な MCU とマトリックス構成をサポートしていますが、キーボードへ他のハードウェアを追加し制御するためのドライバーもいくつか用意されています。例えば、マウスやポインティングデバイス、分割キーボード用の IO エキスパンダ、Bluetooth モジュール、LCD、OLED、TFT 液晶などがあります。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: c9e3fa6f7:docs/hardware_keyboard_guidelines.md
git diff c9e3fa6f7 HEAD -- docs/hardware_keyboard_guidelines.md | cat
original document: 0.9.0:docs/hardware_keyboard_guidelines.md
git diff 0.9.0 HEAD -- docs/hardware_keyboard_guidelines.md | cat
-->
QMK は開始以来、コミュニティにおけるキーボードの作成や保守に貢献しているあなたのような人たちのおかげで飛躍的に成長しました。私たちが成長するにつれて、うまくやるためのいくつかのパターンを発見しました。他の人たちがあなたの苦労の恩恵を受けやすくするため、それにあわせてもらえるようお願いします。
@@ -66,10 +66,77 @@ Clueboard は、サブフォルダをまとめるためとキーボードのリ
全てのプロジェクトには、マトリックスサイズ、製品名、USB VID/PID、説明、その他の設定などが含まれた `config.h` ファイルが必要です。一般に、このファイルを使用して常に機能するキーボードの重要な情報やデフォルトを設定します。
また、`config.h` ファイルはサブフォルダにも置くことができ、その読み込み順は以下の通りです。
* `keyboards/top_folder/config.h`
* `keyboards/top_folder/sub_1/config.h`
* `keyboards/top_folder/sub_1/sub_2/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/config.h`
* `users/a_user_folder/config.h`
* `keyboards/top_folder/keymaps/a_keymap/config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/post_config.h`
* `keyboards/top_folder/sub_1/sub_2/sub_3/post_config.h`
* `keyboards/top_folder/sub_1/sub_2/post_config.h`
* `keyboards/top_folder/sub_1/post_config.h`
* `keyboards/top_folder/post_config.h`
`post_config.h` ファイルは、`config.h` ファイルで指定された内容に応じて、追加の後処理を行うために使用することができます。
例えば、キーマップレベルの `config.h` ファイルで `IOS_DEVICE_ENABLE` マクロを以下のように定義すると、`post_config.h` ファイルでより詳細な設定を行うことができます。
* `keyboards/top_folder/keymaps/a_keymap/config.h`
```c
#define IOS_DEVICE_ENABLE
```
* `keyboards/top_folder/post_config.h`
```c
#ifndef IOS_DEVICE_ENABLE
// USB_MAX_POWER_CONSUMPTION value for this keyboard
#define USB_MAX_POWER_CONSUMPTION 400
#else
// fix iPhone and iPad power adapter issue
// iOS device need lessthan 100
#define USB_MAX_POWER_CONSUMPTION 100
#endif
#ifdef RGBLIGHT_ENABLE
#ifndef IOS_DEVICE_ENABLE
#define RGBLIGHT_LIMIT_VAL 200
#define RGBLIGHT_VAL_STEP 17
#else
#define RGBLIGHT_LIMIT_VAL 35
#define RGBLIGHT_VAL_STEP 4
#endif
#ifndef RGBLIGHT_HUE_STEP
#define RGBLIGHT_HUE_STEP 10
#endif
#ifndef RGBLIGHT_SAT_STEP
#define RGBLIGHT_SAT_STEP 17
#endif
#endif
```
?> 上記の例のように `post_config.h` でオプションを定義する場合、キーボードやユーザレベルの `config.h` で同じオプションを定義してはいけません。
### `rules.mk`
このファイルが存在するということは、フォルダがキーボードであり、`make` コマンドで使用できることを意味します。ここでキーボードのビルド環境を構築し、デフォルトの機能を設定します。
`rules.mk` ファイルはサブフォルダにも置くことができ、その読み込み順は以下の通りです。
* `keyboards/top_folder/rules.mk`
* `keyboards/top_folder/sub_1/rules.mk`
* `keyboards/top_folder/sub_1/sub_2/rules.mk`
* `keyboards/top_folder/sub_1/sub_2/sub_3/rules.mk`
* `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/rules.mk`
* `keyboards/top_folder/keymaps/a_keymap/rules.mk`
* `users/a_user_folder/rules.mk`
* `common_features.mk`
`rules.mk` ファイルに書かれた多くの設定は `common_features.mk` によって解釈され、必要なソースファイルやコンパイラのオプションが設定されます。
?> 詳しくは `build_keyboard.mk` と `common_features.mk` を見てください。
### `<keyboard_name.c>`
ここではキーボードのカスタマイズされたコードを記述します。通常、初期化してキーボードのハードウェアを制御するコードを記述します。キーボードが LED やスピーカー、その他付属ハードウェアのないキーマトリックスのみで構成されている場合は空にできます。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: adf4acf59:docs/newbs_git_best_practices.md
git diff adf4acf59 HEAD -- docs/newbs_git_best_practices.md | cat
original document: 0.9.0:docs/newbs_git_best_practices.md
git diff 0.9.0 HEAD -- docs/newbs_git_best_practices.md | cat
-->
## または、"如何にして私は心配することをやめて Git を愛することを学んだか。"

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: adf4acf59:docs/newbs_git_resolving_merge_conflicts.md
git diff adf4acf59 HEAD -- docs/newbs_git_resolving_merge_conflicts.md | cat
original document: 0.9.0:docs/newbs_git_resolving_merge_conflicts.md
git diff 0.9.0 HEAD -- docs/newbs_git_resolving_merge_conflicts.md | cat
-->
ブランチでの作業の完了に時間がかかる場合、他の人が行った変更が、プルリクエストを開いたときにブランチに加えた変更と競合することがあります。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: adf4acf59:docs/newbs_git_resynchronize_a_branch.md
git diff adf4acf59 HEAD -- docs/newbs_git_resynchronize_a_branch.md | cat
original document: 0.9.0:docs/newbs_git_resynchronize_a_branch.md
git diff 0.9.0 HEAD -- docs/newbs_git_resynchronize_a_branch.md | cat
-->
仮にあなたの `master` ブランチにあなたのコミットを行い、そしてあなたの QMK リポジトリの更新が必要になったとします。

View File

@@ -2,8 +2,8 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: adf4acf59:docs/newbs_git_using_your_master_branch.md
git diff adf4acf59 HEAD -- docs/newbs_git_using_your_master_branch.md | cat
original document: 0.9.0:docs/newbs_git_using_your_master_branch.md
git diff 0.9.0 HEAD -- docs/newbs_git_using_your_master_branch.md | cat
-->
QMK の開発では、何がどこで行われているかにかかわらず、`master` ブランチを最新の状態に保つことを強くお勧めします、しかし `master` ブランチには***絶対に直接コミットしないでください***。

View File

@@ -2,35 +2,44 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: ed0575fc8:docs/newbs_learn_more_resources.md
git diff ed0575fc8 HEAD -- docs/newbs_learn_more_resources.md | cat
original document: 0.9.0:docs/newbs_learn_more_resources.md
git diff 0.9.0 HEAD -- docs/newbs_learn_more_resources.md | cat
-->
これらのリソースは、QMK コミュニティの新しいメンバーに、初心者向けドキュメントで提供されている情報に対する理解を深めることを目的としています。
## Git に関するリース:
## QMK に関するリース:
### 英語
### 英語 :id=english-resources-qmk
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)
* [Git Resources to Learn More About GitHub](getting_started_github.md)
* [Git Resources Aimed Specifically toward QMK](contributing.md)
* [Thomas Baart's QMK Basics Blog](https://thomasbaart.nl/category/mechanical-keyboards/firmware/qmk/qmk-basics/) 新規ユーザーの視点から見た QMK ファームウェアの使い方の基本を網羅した、ユーザー作成のブログ。
### 日本語
### 日本語 :id=japanese-resources-qmk
_日本語のリソース情報を募集中です。_
* [Git Game To Learn From Examples(日本語対応有り)](https://learngitbranching.js.org/)
* [QMK で GitHub を使う方法](ja/getting_started_github.md)
* [貢献方法](ja/contributing.md)
## コマンドラインに関するリソース:
### 英語
### 英語 :id=english-resources-cli
* [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line)
### 日本語
### 日本語 :id=japanese-resources-cli
_日本語のリソース情報を募集中です。_
## Git に関するリソース:
### 英語 :id=english-resources-git
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
* [Flight Rules For Git](https://github.com/k88hudson/git-flight-rules)
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)
### 日本語 :id=japanese-resources-git
_日本語のリソース情報を募集中です。_
* [Git Game To Learn From Examples(日本語対応有り)](https://learngitbranching.js.org/)
git のブランチの作り方、マージの仕方などがビジュアルに学べます。
* [QMK で GitHub を使う方法](ja/getting_started_github.md)

View File

@@ -2,27 +2,21 @@
<!---
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
original document: ed0575fc8:docs/newbs_testing_debugging.md
git diff ed0575fc8 HEAD -- docs/newbs_testing_debugging.md | cat
original document: 0.9.0:docs/newbs_testing_debugging.md
git diff 0.9.0 HEAD -- docs/newbs_testing_debugging.md | cat
-->
カスタムファームウェアをキーボードへ書き込んだら、テストする準備が整います。運が良ければ全て問題なく動作しているはずですが、もしそうでなければこのドキュメントがどこが悪いのか調べるのに役立ちます。
## テスト
通常、キーボードをテストするのは非常に簡単です。全てのキーをひとつずつ押して、期待されるキーが送信されていることを確認します。キーを押したことを見逃さないためのプログラムもあります。
通常、キーボードをテストするのは非常に簡単です。
全てのキーをひとつずつ押して、期待されるキーが送信されていることを確認します。
QMK を実行していなくても、[QMK Configurator](https://config.qmk.fm/#/test/) のテストモードを使ってキーボードを確認することができます。
メモ: これらのプログラムは QMK によって提供・承認されたものではありません。
## デバッグ :id=debugging
* [QMK Configurator](https://config.qmk.fm/#/test/) (Web Based)
* [Switch Hitter](https://web.archive.org/web/20190413233743/https://elitekeyboards.com/switchhitter.php) (Windows Only)
* [Keyboard Viewer](https://www.imore.com/how-use-keyboard-viewer-your-mac) (Mac Only)
* [Keyboard Tester](http://www.keyboardtester.com) (Web Based)
* [Keyboard Checker](http://keyboardchecker.com) (Web Based)
## デバッグ
`rules.mk``CONSOLE_ENABLE = yes`の設定をするとキーボードはデバッグ情報を出力します。デフォルトの出力は非常に限られたものですが、デバッグモードをオンにすることでデバッグ情報の量を増やすことが出来ます。キーマップの`DEBUG`キーコードを使用するか、デバッグモードを有効にする [Command](ja/feature_command.md) 機能を使用するか、以下のコードをキーマップに追加します。
`rules.mk``CONSOLE_ENABLE = yes`の設定をするとキーボードはデバッグ情報を出力します。デフォルトの出力は非常に限られたものですが、デバッグモードをオンにすることでデバッグ情報の量を増やすことが出来ます。キーマップの`DEBUG`キーコードを使用するか、デバッグモードを有効にする [コマンド](ja/feature_command.md) 機能を使用するか、以下のコードをキーマップに追加します。
```c
void keyboard_post_init_user(void) {
@@ -34,6 +28,10 @@ void keyboard_post_init_user(void) {
}
```
## デバッグツール :id=debugging-tools
キーボードのデバッグに使えるツールは2つあります。
### QMK Toolboxを使ったデバッグ
互換性のある環境では、[QMK Toolbox](https://github.com/qmk/qmk_toolbox)を使うことでキーボードからのデバッグメッセージを表示できます。
@@ -42,7 +40,6 @@ void keyboard_post_init_user(void) {
ターミナルベースの方法がお好みですかPJRC が提供する[hid_listen](https://www.pjrc.com/teensy/hid_listen.html)もデバッグメッセージの表示に使用できます。ビルド済みの実行ファイルは Windows, Linux, MacOS 用が用意されています。
<!-- FIXME: Describe the debugging messages here. -->
## 独自のデバッグメッセージを送信する

View File

@@ -8,205 +8,212 @@ This is a reference only. Each group of keys links to the page documenting their
See also: [Basic Keycodes](keycodes_basic.md)
|Key |Aliases |Description |
|-----------------------|------------------------------|-----------------------------------------------|
|`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) |
|`KC_TRANSPARENT` |`KC_TRNS`, `_______` |Use the next lowest non-transparent key |
|`KC_A` | |`a` and `A` |
|`KC_B` | |`b` and `B` |
|`KC_C` | |`c` and `C` |
|`KC_D` | |`d` and `D` |
|`KC_E` | |`e` and `E` |
|`KC_F` | |`f` and `F` |
|`KC_G` | |`g` and `G` |
|`KC_H` | |`h` and `H` |
|`KC_I` | |`i` and `I` |
|`KC_J` | |`j` and `J` |
|`KC_K` | |`k` and `K` |
|`KC_L` | |`l` and `L` |
|`KC_M` | |`m` and `M` |
|`KC_N` | |`n` and `N` |
|`KC_O` | |`o` and `O` |
|`KC_P` | |`p` and `P` |
|`KC_Q` | |`q` and `Q` |
|`KC_R` | |`r` and `R` |
|`KC_S` | |`s` and `S` |
|`KC_T` | |`t` and `T` |
|`KC_U` | |`u` and `U` |
|`KC_V` | |`v` and `V` |
|`KC_W` | |`w` and `W` |
|`KC_X` | |`x` and `X` |
|`KC_Y` | |`y` and `Y` |
|`KC_Z` | |`z` and `Z` |
|`KC_1` | |`1` and `!` |
|`KC_2` | |`2` and `@` |
|`KC_3` | |`3` and `#` |
|`KC_4` | |`4` and `$` |
|`KC_5` | |`5` and `%` |
|`KC_6` | |`6` and `^` |
|`KC_7` | |`7` and `&` |
|`KC_8` | |`8` and `*` |
|`KC_9` | |`9` and `(` |
|`KC_0` | |`0` and `)` |
|`KC_ENTER` |`KC_ENT` |Return (Enter) |
|`KC_ESCAPE` |`KC_ESC` |Escape |
|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |
|`KC_TAB` | |Tab |
|`KC_SPACE` |`KC_SPC` |Spacebar |
|`KC_MINUS` |`KC_MINS` |`-` and `_` |
|`KC_EQUAL` |`KC_EQL` |`=` and `+` |
|`KC_LBRACKET` |`KC_LBRC` |`[` and `{` |
|`KC_RBRACKET` |`KC_RBRC` |`]` and `}` |
|`KC_BSLASH` |`KC_BSLS` |`\` and `\|` |
|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` and `~` |
|`KC_SCOLON` |`KC_SCLN` |`;` and `:` |
|`KC_QUOTE` |`KC_QUOT` |`'` and `"` |
|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>&#96;</code> and `~`, JIS Zenkaku/Hankaku|
|`KC_COMMA` |`KC_COMM` |`,` and `<` |
|`KC_DOT` | |`.` and `>` |
|`KC_SLASH` |`KC_SLSH` |`/` and `?` |
|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS` |Caps Lock |
|`KC_F1` | |F1 |
|`KC_F2` | |F2 |
|`KC_F3` | |F3 |
|`KC_F4` | |F4 |
|`KC_F5` | |F5 |
|`KC_F6` | |F6 |
|`KC_F7` | |F7 |
|`KC_F8` | |F8 |
|`KC_F9` | |F9 |
|`KC_F10` | |F10 |
|`KC_F11` | |F11 |
|`KC_F12` | |F12 |
|`KC_PSCREEN` |`KC_PSCR` |Print Screen |
|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD` |Scroll Lock, Brightness Down (macOS) |
|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, Brightness Up (macOS) |
|`KC_INSERT` |`KC_INS` |Insert |
|`KC_HOME` | |Home |
|`KC_PGUP` | |Page Up |
|`KC_DELETE` |`KC_DEL` |Forward Delete |
|`KC_END` | |End |
|`KC_PGDOWN` |`KC_PGDN` |Page Down |
|`KC_RIGHT` |`KC_RGHT` |Right Arrow |
|`KC_LEFT` | |Left Arrow |
|`KC_DOWN` | |Down Arrow |
|`KC_UP` | |Up Arrow |
|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear |
|`KC_KP_SLASH` |`KC_PSLS` |Keypad `/` |
|`KC_KP_ASTERISK` |`KC_PAST` |Keypad `*` |
|`KC_KP_MINUS` |`KC_PMNS` |Keypad `-` |
|`KC_KP_PLUS` |`KC_PPLS` |Keypad `+` |
|`KC_KP_ENTER` |`KC_PENT` |Keypad Enter |
|`KC_KP_1` |`KC_P1` |Keypad `1` and End |
|`KC_KP_2` |`KC_P2` |Keypad `2` and Down Arrow |
|`KC_KP_3` |`KC_P3` |Keypad `3` and Page Down |
|`KC_KP_4` |`KC_P4` |Keypad `4` and Left Arrow |
|`KC_KP_5` |`KC_P5` |Keypad `5` |
|`KC_KP_6` |`KC_P6` |Keypad `6` and Right Arrow |
|`KC_KP_7` |`KC_P7` |Keypad `7` and Home |
|`KC_KP_8` |`KC_P8` |Keypad `8` and Up Arrow |
|`KC_KP_9` |`KC_P9` |Keypad `9` and Page Up |
|`KC_KP_0` |`KC_P0` |Keypad `0` and Insert |
|`KC_KP_DOT` |`KC_PDOT` |Keypad `.` and Delete |
|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` and `\|` |
|`KC_APPLICATION` |`KC_APP` |Application (Windows Menu Key) |
|`KC_POWER` | |System Power (macOS) |
|`KC_KP_EQUAL` |`KC_PEQL` |Keypad `=` |
|`KC_F13` | |F13 |
|`KC_F14` | |F14 |
|`KC_F15` | |F15 |
|`KC_F16` | |F16 |
|`KC_F17` | |F17 |
|`KC_F18` | |F18 |
|`KC_F19` | |F19 |
|`KC_F20` | |F20 |
|`KC_F21` | |F21 |
|`KC_F22` | |F22 |
|`KC_F23` | |F23 |
|`KC_F24` | |F24 |
|`KC_EXECUTE` |`KC_EXEC` |Execute |
|`KC_HELP` | |Help |
|`KC_MENU` | |Menu |
|`KC_SELECT` |`KC_SLCT` |Select |
|`KC_STOP` | |Stop |
|`KC_AGAIN` |`KC_AGIN` |Again |
|`KC_UNDO` | |Undo |
|`KC_CUT` | |Cut |
|`KC_COPY` | |Copy |
|`KC_PASTE` |`KC_PSTE` |Paste |
|`KC_FIND` | |Find |
|`KC__MUTE` | |Mute (macOS) |
|`KC__VOLUP` | |Volume Up (macOS) |
|`KC__VOLDOWN` | |Volume Down (macOS) |
|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |
|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |
|`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock |
|`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` |
|`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards |
|`KC_INT1` |`KC_RO` |JIS `\` and `_` |
|`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana |
|`KC_INT3` |`KC_JYEN` |JIS `¥` and `\|` |
|`KC_INT4` |`KC_HENK` |JIS Henkan |
|`KC_INT5` |`KC_MHEN` |JIS Muhenkan |
|`KC_INT6` | |JIS Numpad `,` |
|`KC_INT7` | |International 7 |
|`KC_INT8` | |International 8 |
|`KC_INT9` | |International 9 |
|`KC_LANG1` |`KC_HAEN` |Hangul/English |
|`KC_LANG2` |`KC_HANJ` |Hanja |
|`KC_LANG3` | |JIS Katakana |
|`KC_LANG4` | |JIS Hiragana |
|`KC_LANG5` | |JIS Zenkaku/Hankaku |
|`KC_LANG6` | |Language 6 |
|`KC_LANG7` | |Language 7 |
|`KC_LANG8` | |Language 8 |
|`KC_LANG9` | |Language 9 |
|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase |
|`KC_SYSREQ` | |SysReq/Attention |
|`KC_CANCEL` | |Cancel |
|`KC_CLEAR` |`KC_CLR` |Clear |
|`KC_PRIOR` | |Prior |
|`KC_RETURN` | |Return |
|`KC_SEPARATOR` | |Separator |
|`KC_OUT` | |Out |
|`KC_OPER` | |Oper |
|`KC_CLEAR_AGAIN` | |Clear/Again |
|`KC_CRSEL` | |CrSel/Props |
|`KC_EXSEL` | |ExSel |
|`KC_LCTRL` |`KC_LCTL` |Left Control |
|`KC_LSHIFT` |`KC_LSFT` |Left Shift |
|`KC_LALT` |`KC_LOPT` |Left Alt (Option) |
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |Left GUI (Windows/Command/Meta key) |
|`KC_RCTRL` |`KC_RCTL` |Right Control |
|`KC_RSHIFT` |`KC_RSFT` |Right Shift |
|`KC_RALT` |`KC_ROPT`, `KC_ALGR` |Right Alt (Option/AltGr) |
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |Right GUI (Windows/Command/Meta key) |
|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |
|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake |
|`KC_AUDIO_MUTE` |`KC_MUTE` |Mute |
|`KC_AUDIO_VOL_UP` |`KC_VOLU` |Volume Up |
|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |Volume Down |
|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |Next Track |
|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |Previous Track |
|`KC_MEDIA_STOP` |`KC_MSTP` |Stop Track (Windows) |
|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |Play/Pause Track |
|`KC_MEDIA_SELECT` |`KC_MSEL` |Launch Media Player (Windows) |
|`KC_MEDIA_EJECT` |`KC_EJCT` |Eject (macOS) |
|`KC_MAIL` | |Launch Mail (Windows) |
|`KC_CALCULATOR` |`KC_CALC` |Launch Calculator (Windows) |
|`KC_MY_COMPUTER` |`KC_MYCM` |Launch My Computer (Windows) |
|`KC_WWW_SEARCH` |`KC_WSCH` |Browser Search (Windows) |
|`KC_WWW_HOME` |`KC_WHOM` |Browser Home (Windows) |
|`KC_WWW_BACK` |`KC_WBAK` |Browser Back (Windows) |
|`KC_WWW_FORWARD` |`KC_WFWD` |Browser Forward (Windows) |
|`KC_WWW_STOP` |`KC_WSTP` |Browser Stop (Windows) |
|`KC_WWW_REFRESH` |`KC_WREF` |Browser Refresh (Windows) |
|`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites (Windows) |
|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track (macOS) |
|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track (macOS) |
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |
|Key |Aliases |Description |Windows |macOS |Linux<sup>1</sup>|
|-----------------------|------------------------------|-----------------------------------------------|-------------|-------------|-----------------|
|`KC_NO` |`XXXXXXX` |Ignore this key (NOOP) |*N/A* |*N/A* |*N/A* |
|`KC_TRANSPARENT` |`KC_TRNS`, `_______` |Use the next lowest non-transparent key |*N/A* |*N/A* |*N/A* |
|`KC_A` | |`a` and `A` |✔ |✔ |✔ |
|`KC_B` | |`b` and `B` |✔ |✔ |✔ |
|`KC_C` | |`c` and `C` |✔ |✔ |✔ |
|`KC_D` | |`d` and `D` |✔ |✔ |✔ |
|`KC_E` | |`e` and `E` |✔ |✔ |✔ |
|`KC_F` | |`f` and `F` |✔ |✔ |✔ |
|`KC_G` | |`g` and `G` |✔ |✔ |✔ |
|`KC_H` | |`h` and `H` |✔ |✔ |✔ |
|`KC_I` | |`i` and `I` |✔ |✔ |✔ |
|`KC_J` | |`j` and `J` |✔ |✔ |✔ |
|`KC_K` | |`k` and `K` |✔ |✔ |✔ |
|`KC_L` | |`l` and `L` |✔ |✔ |✔ |
|`KC_M` | |`m` and `M` |✔ |✔ |✔ |
|`KC_N` | |`n` and `N` |✔ |✔ |✔ |
|`KC_O` | |`o` and `O` |✔ |✔ |✔ |
|`KC_P` | |`p` and `P` |✔ |✔ |✔ |
|`KC_Q` | |`q` and `Q` |✔ |✔ |✔ |
|`KC_R` | |`r` and `R` |✔ |✔ |✔ |
|`KC_S` | |`s` and `S` |✔ |✔ |✔ |
|`KC_T` | |`t` and `T` |✔ |✔ |✔ |
|`KC_U` | |`u` and `U` |✔ |✔ |✔ |
|`KC_V` | |`v` and `V` |✔ |✔ |✔ |
|`KC_W` | |`w` and `W` |✔ |✔ |✔ |
|`KC_X` | |`x` and `X` |✔ |✔ |✔ |
|`KC_Y` | |`y` and `Y` |✔ |✔ |✔ |
|`KC_Z` | |`z` and `Z` |✔ |✔ |✔ |
|`KC_1` | |`1` and `!` |✔ |✔ |✔ |
|`KC_2` | |`2` and `@` |✔ |✔ |✔ |
|`KC_3` | |`3` and `#` |✔ |✔ |✔ |
|`KC_4` | |`4` and `$` |✔ |✔ |✔ |
|`KC_5` | |`5` and `%` |✔ |✔ |✔ |
|`KC_6` | |`6` and `^` |✔ |✔ |✔ |
|`KC_7` | |`7` and `&` |✔ |✔ |✔ |
|`KC_8` | |`8` and `*` |✔ |✔ |✔ |
|`KC_9` | |`9` and `(` |✔ |✔ |✔ |
|`KC_0` | |`0` and `)` |✔ |✔ |✔ |
|`KC_ENTER` |`KC_ENT` |Return (Enter) |✔ |✔ |✔ |
|`KC_ESCAPE` |`KC_ESC` |Escape |✔ |✔ |✔ |
|`KC_BSPACE` |`KC_BSPC` |Delete (Backspace) |✔ |✔ |✔ |
|`KC_TAB` | |Tab |✔ |✔ |✔ |
|`KC_SPACE` |`KC_SPC` |Spacebar |✔ |✔ |✔ |
|`KC_MINUS` |`KC_MINS` |`-` and `_` |✔ |✔ |✔ |
|`KC_EQUAL` |`KC_EQL` |`=` and `+` |✔ |✔ |✔ |
|`KC_LBRACKET` |`KC_LBRC` |`[` and `{` |✔ |✔ |✔ |
|`KC_RBRACKET` |`KC_RBRC` |`]` and `}` |✔ |✔ |✔ |
|`KC_BSLASH` |`KC_BSLS` |`\` and `\|` |✔ |✔ |✔ |
|`KC_NONUS_HASH` |`KC_NUHS` |Non-US `#` and `~` |✔ |✔ |✔ |
|`KC_SCOLON` |`KC_SCLN` |`;` and `:` |✔ |✔ |✔ |
|`KC_QUOTE` |`KC_QUOT` |`'` and `"` |✔ |✔ |✔ |
|`KC_GRAVE` |`KC_GRV`, `KC_ZKHK` |<code>&#96;</code> and `~`, JIS Zenkaku/Hankaku|✔ |✔ |✔ |
|`KC_COMMA` |`KC_COMM` |`,` and `<` |✔ |✔ |✔ |
|`KC_DOT` | |`.` and `>` |✔ |✔ |✔ |
|`KC_SLASH` |`KC_SLSH` |`/` and `?` |✔ |✔ |✔ |
|`KC_CAPSLOCK` |`KC_CLCK`, `KC_CAPS` |Caps Lock |✔ |✔ |✔ |
|`KC_F1` | |F1 |✔ |✔ |✔ |
|`KC_F2` | |F2 |✔ |✔ |✔ |
|`KC_F3` | |F3 |✔ |✔ |✔ |
|`KC_F4` | |F4 |✔ |✔ |✔ |
|`KC_F5` | |F5 |✔ |✔ |✔ |
|`KC_F6` | |F6 |✔ |✔ |✔ |
|`KC_F7` | |F7 |✔ |✔ |✔ |
|`KC_F8` | |F8 |✔ |✔ |✔ |
|`KC_F9` | |F9 |✔ |✔ |✔ |
|`KC_F10` | |F10 |✔ |✔ |✔ |
|`KC_F11` | |F11 |✔ |✔ |✔ |
|`KC_F12` | |F12 |✔ |✔ |✔ |
|`KC_PSCREEN` |`KC_PSCR` |Print Screen |✔ |✔<sup>2</sup>|✔ |
|`KC_SCROLLLOCK` |`KC_SLCK`, `KC_BRMD` |Scroll Lock, Brightness Down (macOS) |✔ |✔<sup>2</sup>|✔ |
|`KC_PAUSE` |`KC_PAUS`, `KC_BRK`, `KC_BRMU`|Pause, Brightness Up (macOS) |✔ |✔<sup>2</sup>|✔ |
|`KC_INSERT` |`KC_INS` |Insert |✔ | |✔ |
|`KC_HOME` | |Home |✔ |✔ |✔ |
|`KC_PGUP` | |Page Up |✔ |✔ |✔ |
|`KC_DELETE` |`KC_DEL` |Forward Delete |✔ |✔ |✔ |
|`KC_END` | |End |✔ |✔ |✔ |
|`KC_PGDOWN` |`KC_PGDN` |Page Down |✔ |✔ |✔ |
|`KC_RIGHT` |`KC_RGHT` |Right Arrow |✔ |✔ |✔ |
|`KC_LEFT` | |Left Arrow |✔ |✔ |✔ |
|`KC_DOWN` | |Down Arrow |✔ |✔ |✔ |
|`KC_UP` | |Up Arrow |✔ |✔ |✔ |
|`KC_NUMLOCK` |`KC_NLCK` |Keypad Num Lock and Clear |✔ |✔ |✔ |
|`KC_KP_SLASH` |`KC_PSLS` |Keypad `/` |✔ |✔ |✔ |
|`KC_KP_ASTERISK` |`KC_PAST` |Keypad `*` |✔ |✔ |✔ |
|`KC_KP_MINUS` |`KC_PMNS` |Keypad `-` |✔ |✔ |✔ |
|`KC_KP_PLUS` |`KC_PPLS` |Keypad `+` |✔ |✔ |✔ |
|`KC_KP_ENTER` |`KC_PENT` |Keypad Enter |✔ |✔ |✔ |
|`KC_KP_1` |`KC_P1` |Keypad `1` and End |✔ |✔ |✔ |
|`KC_KP_2` |`KC_P2` |Keypad `2` and Down Arrow |✔ |✔ |✔ |
|`KC_KP_3` |`KC_P3` |Keypad `3` and Page Down |✔ |✔ |✔ |
|`KC_KP_4` |`KC_P4` |Keypad `4` and Left Arrow |✔ |✔ |✔ |
|`KC_KP_5` |`KC_P5` |Keypad `5` |✔ |✔ |✔ |
|`KC_KP_6` |`KC_P6` |Keypad `6` and Right Arrow |✔ |✔ |✔ |
|`KC_KP_7` |`KC_P7` |Keypad `7` and Home |✔ |✔ |✔ |
|`KC_KP_8` |`KC_P8` |Keypad `8` and Up Arrow |✔ |✔ |✔ |
|`KC_KP_9` |`KC_P9` |Keypad `9` and Page Up |✔ |✔ |✔ |
|`KC_KP_0` |`KC_P0` |Keypad `0` and Insert |✔ |✔ |✔ |
|`KC_KP_DOT` |`KC_PDOT` |Keypad `.` and Delete |✔ |✔ |✔ |
|`KC_NONUS_BSLASH` |`KC_NUBS` |Non-US `\` and `\|` |✔ |✔ |✔ |
|`KC_APPLICATION` |`KC_APP` |Application (Windows Context Menu Key) |✔ | |✔ |
|`KC_POWER` | |System Power | |✔<sup>3</sup>|✔ |
|`KC_KP_EQUAL` |`KC_PEQL` |Keypad `=` |✔ |✔ |✔ |
|`KC_F13` | |F13 |✔ |✔ |✔ |
|`KC_F14` | |F14 |✔ |✔ |✔ |
|`KC_F15` | |F15 |✔ |✔ |✔ |
|`KC_F16` | |F16 |✔ |✔ |✔ |
|`KC_F17` | |F17 |✔ |✔ |✔ |
|`KC_F18` | |F18 |✔ |✔ |✔ |
|`KC_F19` | |F19 |✔ |✔ |✔ |
|`KC_F20` | |F20 |✔ | |✔ |
|`KC_F21` | |F21 |✔ | |✔ |
|`KC_F22` | |F22 |✔ | |✔ |
|`KC_F23` | |F23 |✔ | |✔ |
|`KC_F24` | |F24 |✔ | |✔ |
|`KC_EXECUTE` |`KC_EXEC` |Execute | | |✔ |
|`KC_HELP` | |Help | | |✔ |
|`KC_MENU` | |Menu | | |✔ |
|`KC_SELECT` |`KC_SLCT` |Select | | |✔ |
|`KC_STOP` | |Stop | | |✔ |
|`KC_AGAIN` |`KC_AGIN` |Again | | |✔ |
|`KC_UNDO` | |Undo | | |✔ |
|`KC_CUT` | |Cut | | |✔ |
|`KC_COPY` | |Copy | | |✔ |
|`KC_PASTE` |`KC_PSTE` |Paste | | |✔ |
|`KC_FIND` | |Find | | |✔ |
|`KC__MUTE` | |Mute | |✔ |✔ |
|`KC__VOLUP` | |Volume Up | |✔ |✔ |
|`KC__VOLDOWN` | |Volume Down | |✔ |✔ |
|`KC_LOCKING_CAPS` |`KC_LCAP` |Locking Caps Lock |✔ |✔ | |
|`KC_LOCKING_NUM` |`KC_LNUM` |Locking Num Lock |✔ |✔ | |
|`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock |✔ |✔ | |
|`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` | | |✔ |
|`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards | | | |
|`KC_INT1` |`KC_RO` |JIS `\` and `_` |✔ | |✔ |
|`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana |✔ | |✔ |
|`KC_INT3` |`KC_JYEN` |JIS `¥` and `\|` |✔ | |✔ |
|`KC_INT4` |`KC_HENK` |JIS Henkan |✔ | |✔ |
|`KC_INT5` |`KC_MHEN` |JIS Muhenkan |✔ | |✔ |
|`KC_INT6` | |JIS Numpad `,` | | |✔ |
|`KC_INT7` | |International 7 | | | |
|`KC_INT8` | |International 8 | | | |
|`KC_INT9` | |International 9 | | | |
|`KC_LANG1` |`KC_HAEN` |Hangul/English | | |✔ |
|`KC_LANG2` |`KC_HANJ` |Hanja | | |✔ |
|`KC_LANG3` | |JIS Katakana | | |✔ |
|`KC_LANG4` | |JIS Hiragana | | |✔ |
|`KC_LANG5` | |JIS Zenkaku/Hankaku | | |✔ |
|`KC_LANG6` | |Language 6 | | | |
|`KC_LANG7` | |Language 7 | | | |
|`KC_LANG8` | |Language 8 | | | |
|`KC_LANG9` | |Language 9 | | | |
|`KC_ALT_ERASE` |`KC_ERAS` |Alternate Erase | | | |
|`KC_SYSREQ` | |SysReq/Attention | | | |
|`KC_CANCEL` | |Cancel | | | |
|`KC_CLEAR` |`KC_CLR` |Clear | | |✔ |
|`KC_PRIOR` | |Prior | | | |
|`KC_RETURN` | |Return | | | |
|`KC_SEPARATOR` | |Separator | | | |
|`KC_OUT` | |Out | | | |
|`KC_OPER` | |Oper | | | |
|`KC_CLEAR_AGAIN` | |Clear/Again | | | |
|`KC_CRSEL` | |CrSel/Props | | | |
|`KC_EXSEL` | |ExSel | | | |
|`KC_LCTRL` |`KC_LCTL` |Left Control |✔ |✔ |✔ |
|`KC_LSHIFT` |`KC_LSFT` |Left Shift |✔ |✔ |✔ |
|`KC_LALT` |`KC_LOPT` |Left Alt (Option) |✔ |✔ |✔ |
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |Left GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|`KC_RCTRL` |`KC_RCTL` |Right Control |✔ |✔ |✔ |
|`KC_RSHIFT` |`KC_RSFT` |Right Shift |✔ |✔ |✔ |
|`KC_RALT` |`KC_ROPT`, `KC_ALGR` |Right Alt (Option/AltGr) |✔ |✔ |✔ |
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |Right GUI (Windows/Command/Meta key) |✔ |✔ |✔ |
|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |✔ |✔<sup>3</sup>|✔ |
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |✔ |✔<sup>3</sup>|✔ |
|`KC_SYSTEM_WAKE` |`KC_WAKE` |System Wake | |✔<sup>3</sup>|✔ |
|`KC_AUDIO_MUTE` |`KC_MUTE` |Mute |✔ |✔ |✔ |
|`KC_AUDIO_VOL_UP` |`KC_VOLU` |Volume Up |✔ |✔<sup>4</sup>|✔ |
|`KC_AUDIO_VOL_DOWN` |`KC_VOLD` |Volume Down |✔ |✔<sup>4</sup>|✔ |
|`KC_MEDIA_NEXT_TRACK` |`KC_MNXT` |Next Track |✔ |✔<sup>5</sup>|✔ |
|`KC_MEDIA_PREV_TRACK` |`KC_MPRV` |Previous Track |✔ |✔<sup>5</sup>|✔ |
|`KC_MEDIA_STOP` |`KC_MSTP` |Stop Track |✔ | |✔ |
|`KC_MEDIA_PLAY_PAUSE` |`KC_MPLY` |Play/Pause Track |✔ |✔ |✔ |
|`KC_MEDIA_SELECT` |`KC_MSEL` |Launch Media Player |✔ | |✔ |
|`KC_MEDIA_EJECT` |`KC_EJCT` |Eject | |✔ |✔ |
|`KC_MAIL` | |Launch Mail |✔ | |✔ |
|`KC_CALCULATOR` |`KC_CALC` |Launch Calculator |✔ | |✔ |
|`KC_MY_COMPUTER` |`KC_MYCM` |Launch My Computer |✔ | |✔ |
|`KC_WWW_SEARCH` |`KC_WSCH` |Browser Search |✔ | |✔ |
|`KC_WWW_HOME` |`KC_WHOM` |Browser Home |✔ | |✔ |
|`KC_WWW_BACK` |`KC_WBAK` |Browser Back |✔ | |✔ |
|`KC_WWW_FORWARD` |`KC_WFWD` |Browser Forward |✔ | |✔ |
|`KC_WWW_STOP` |`KC_WSTP` |Browser Stop |✔ | |✔ |
|`KC_WWW_REFRESH` |`KC_WREF` |Browser Refresh |✔ | |✔ |
|`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites |✔ | |✔ |
|`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track |✔ |✔<sup>5</sup>|✔ |
|`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track |✔<sup>6</sup>|✔<sup>5</sup>|✔ |
|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up |✔ |✔ |✔ |
|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down |✔ |✔ |✔ |
<sup>1. The Linux kernel HID driver recognizes [nearly all keycodes](https://github.com/torvalds/linux/blob/master/drivers/hid/hid-input.c), but the default bindings depend on the DE/WM.</sup><br/>
<sup>2. Treated as F13-F15.</sup><br/>
<sup>3. Must be held for about three seconds, and will display a prompt instead.</sup><br/>
<sup>4. Holding Shift+Option allows for finer control of volume level.</sup><br/>
<sup>5. Skips the entire track in iTunes when tapped, seeks within the current track when held.</sup><br/>
<sup>6. WMP does not recognize the Rewind key, but both alter playback speed in VLC.</sup>
## Quantum Keycodes :id=quantum-keycodes

View File

@@ -41,16 +41,11 @@ We've tried to make QMK as easy to set up as possible. You only have to prepare
You will need to install MSYS2, Git, and the QMK CLI.
* Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org).
* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal. NOTE: This is **not** the same as the MSYS terminal that opens when installation is completed.
Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org). Close any open MSYS terminals and open a new MinGW 64-bit terminal. **NOTE: This is *not* the same as the MSYS terminal that opens when installation is completed.**
After opening a new MSYS2 MinGW 64-bit terminal, make sure `pacman` is up to date with:
Then, run the following:
pacman -Syu
You may be asked to close and reopen the window. Do this and keep running the above command until it says `there is nothing to do`. Then run the following:
pacman -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
python3 -m pip install qmk
### macOS
@@ -97,7 +92,7 @@ In most situations you will want to answer Yes to all of the prompts.
It's possible, that you will get an error saying something like: `bash: qmk: command not found`.
This is due to a [bug](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839155) Debian introduced with their Bash 4.4 release, which removed `$HOME/.local/bin` from the PATH. This bug was later fixed on Debian and Ubuntu.
Sadly, Ubuntu reitroduced this bug and is [yet to fix it](https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1588562).
Luckily, the fix is easy. Run this as your user: `echo "PATH=$HOME/.local/bin:$PATH" >> $HOME/.bashrc && source $HOME/.bashrc`
Luckily, the fix is easy. Run this as your user: `echo 'PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc && source $HOME/.bashrc`
?>**Note on FreeBSD**:
It is suggested to run `qmk setup` as a non-`root` user to start with, but this will likely identify packages that need to be installed to your

View File

@@ -15,7 +15,7 @@ You can control the behavior of one shot keys by defining these in `config.h`:
#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */
```
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes.
* `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](mod_tap.md), not the `KC_*` codes.
* `OSL(layer)` - momentary switch to *layer*.
Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine.

View File

@@ -0,0 +1,58 @@
# Choosing an Arm MCU :id=choose-arm-mcu
This page outlines the selection criteria to ensure compatibility with Arm/ChibiOS.
QMK uses the Hardware Abstraction Layer of ChibiOS in order to run on Arm devices. ChibiOS in general is best supported on STM32 devices, both in the perspective of base MCU support, as well as on-MCU peripheral support. As an extension to the core ChibiOS MCU support, QMK also utilises ChibiOS-Contrib (which includes the Kinetis MCU support layer, as an example), but it does not provide as great a level of peripheral support or general testing for supported devices.
Adding support for new MCU families must go through ChibiOS or ChibiOS-Contrib -- QMK does not have the bandwidth, resources, nor the inclination to maintain long-term MCU support for your board of choice.
To be clear: this also includes commercial boards -- unless agreed upon by all parties, QMK will not take over maintenance of a bespoke MCU support package. Even if MCU support is upstreamed into ChibiOS/ChibiOS-Contrib, QMK reserves the right to deprecate and/or remove keyboards utilising support packages that aren't kept up to date with upstream ChibiOS itself.
## Selecting an already-supported MCU :id=selecting-already-supported-mcu
### STM32 families
As outlined earlier, STM32 is the preferred option to ensure greatest compatibility with the subsystems already implemented in QMK. Not all subsystems are compatible yet, but for the most widely-used support is already present.
The simplest solution to determine if an STM32 MCU is compatible is to navigate to the list of supported STM32 ports in QMK's [ChibiOS fork](https://github.com/qmk/ChibiOS/tree/master/os/hal/ports/STM32). Inside this directory, each of the supported STM32 families will be listed, and inside each family a file called `stm32_registry.h` will be present. Scanning through these files will show `#define`s such as the following, which can be used to determine if ChibiOS supports a particular MCU:
```c
#if defined(STM32F303xC) || defined(__DOXYGEN__)
```
The example shows that STM32F303xC devices are supported by ChibiOS.
The next step is to ensure that USB is supported on those devices by ChibiOS -- you can confirm this by checking inside the same section guarded by the `#define` above, specifically for the following to be `TRUE`:
```c
#define STM32_HAS_USB TRUE
```
or one of the following being `TRUE`:
```c
#define STM32_HAS_OTG1 TRUE
#define STM32_HAS_OTG2 TRUE
```
For the most part, this is the bare minimum to be able to have a high confidence that QMK will be able to run on your MCU. After that, it's all up to configuration.
### Non-STM32 families
ChibiOS does have support for a handful of non-STM32 devices, and the list can be found in QMK's [ChibiOS fork](https://github.com/qmk/ChibiOS/tree/master/os/hal/ports) and [ChibiOS-Contrib fork](https://github.com/qmk/ChibiOS-Contrib/tree/master/os/hal/ports). Non-STM32 support is likely out of date, and only supports ancient MCUs -- whilst it might be possible to use these, it's not recommended.
Do note that there are sometimes licensing restrictions with respect to redistribution. As an example, binaries built for nRF5 are not able to be redistributed via QMK Configurator, due to the licensing of their board support package.
## Adding support for a new STM32 MCU (for an existing family) :id=add-new-stm32-mcu
Usually, one can "masquerade" as an existing MCU of the same family, especially if the only difference is RAM or Flash size. As an example, some MCUs within the same family are virtually identical, with the exception of adding a cryptographic peripheral -- STM32L072 vs. STM32L082 for instance. Given the unlikely use of the cryptographic peripheral, L082 chips can actually run as if they're an L072, and can be targeted accordingly.
Adding proper support for new MCUs within an existing STM32 family should ideally be upstreamed to ChibiOS. In general, this will require modifications of the `stm32_registry.h` file, providing correct responses for the same `#define`s provided for the other MCUs in that family.
## Adding support for a new STM32 Family :id=add-new-stm32-family
If this is a requirement, this needs to go through upstream ChibiOS before QMK would consider accepting boards targeting the new family. More information for porting should be sought by approaching ChibiOS directly, rather than through QMK.
## Adding support for a new MCU Family :id=add-new-mcu-family
As stated earlier, in order for a new MCU family to be supported by QMK, it needs to be upstreamed into ChibiOS-Contrib before QMK will consider accepting boards using it. The same principle applies for development -- you're best approaching the ChibiOS-Contrib maintainers to get a bit more of an idea on what's involved with upstreaming your contribution.

View File

@@ -11,7 +11,7 @@ No special setup is required - just connect the `SS`, `SCK`, `MOSI` and `MISO` p
|ATMega16/32U2/4|`B0`|`B1` |`B2` |`B3` |
|AT90USB64/128 |`B0`|`B1` |`B2` |`B3` |
|ATmega32A |`B4`|`B7` |`B5` |`B6` |
|ATmega328P |`B2`|`B5` |`B3` |`B4` |
|ATmega328/P |`B2`|`B5` |`B3` |`B4` |
You may use more than one slave select pin, not just the `SS` pin. This is useful when you have multiple devices connected and need to communicate with them individually.
`SPI_SS_PIN` can be passed to `spi_start()` to refer to `SS`.

View File

@@ -19,6 +19,15 @@ These LEDs are called "addressable" because instead of using a wire per color, e
## Driver configuration
### All drivers
Different versions of the addressable LEDs have differing requirements for the T<sub>RST</sub> period between frames.
The default setting is 280 µs, which should work for most cases, but this can be overridden in your config.h. e.g.:
```c
#define WS2812_TRST_US 80
```
### Bitbang
Default driver, the absence of configuration assumes this driver. To configure it, add this to your rules.mk:
@@ -99,3 +108,14 @@ While not an exhaustive list, the following table provides the scenarios that ha
| f401/f411 | :heavy_check_mark: |
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
### Push Pull and Open Drain Configuration
The default configuration is a push pull on the defined pin.
This can be configured for bitbang, PWM and SPI.
Note: This only applies to STM32 boards.
To configure the `RGB_DI_PIN` to open drain configuration add this to your config.h file:
```c
#define WS2812_EXTERNAL_PULLUP
```

View File

@@ -38,7 +38,7 @@ int16_t analogRead(uint8_t pin) {
// clang-format on
if (pin >= 12) return 0;
return adc_read(pgm_read_byte(pin_to_mux + pin));
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega328P__)
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
if (pin >= 8) return 0;
return adc_read(pin);
#else
@@ -85,7 +85,7 @@ uint8_t pinToMux(pin_t pin) {
case A6: return _BV(MUX2) | _BV(MUX1); // ADC6
case A7: return _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // ADC7
default: return _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0); // 0V
#elif defined(__AVR_ATmega328P__)
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
case C0: return 0; // ADC0
case C1: return _BV(MUX0); // ADC1
case C2: return _BV(MUX1); // ADC2

View File

@@ -28,7 +28,7 @@
# define SPI_SCK_PIN B7
# define SPI_MOSI_PIN B5
# define SPI_MISO_PIN B6
#elif defined(__AVR_ATmega328P__)
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
# define SPI_SCK_PIN B5
# define SPI_MOSI_PIN B3
# define SPI_MISO_PIN B4

View File

@@ -25,7 +25,7 @@ typedef int16_t spi_status_t;
# define SPI_SS_PIN B0
#elif defined(__AVR_ATmega32A__)
# define SPI_SS_PIN B4
#elif defined(__AVR_ATmega328P__)
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
# define SPI_SS_PIN B2
#endif

View File

@@ -36,25 +36,15 @@
static inline void ws2812_sendarray_mask(uint8_t *data, uint16_t datlen, uint8_t masklo, uint8_t maskhi);
// Setleds for standard RGB
void inline ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
// wrap up usage of RGB_DI_PIN
ws2812_setleds_pin(ledarray, number_of_leds, RGB_DI_PIN);
}
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
DDRx_ADDRESS(RGB_DI_PIN) |= pinmask(RGB_DI_PIN);
void ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pin) {
DDRx_ADDRESS(RGB_DI_PIN) |= pinmask(pin);
uint8_t masklo = ~(pinmask(pin)) & PORTx_ADDRESS(pin);
uint8_t maskhi = pinmask(pin) | PORTx_ADDRESS(pin);
uint8_t masklo = ~(pinmask(RGB_DI_PIN)) & PORTx_ADDRESS(RGB_DI_PIN);
uint8_t maskhi = pinmask(RGB_DI_PIN) | PORTx_ADDRESS(RGB_DI_PIN);
ws2812_sendarray_mask((uint8_t *)ledarray, number_of_leds * sizeof(LED_TYPE), masklo, maskhi);
#ifdef RGBW
_delay_us(80);
#else
_delay_us(50);
#endif
_delay_us(WS2812_TRST_US);
}
/*

View File

@@ -14,6 +14,14 @@
# endif
#endif
// Push Pull or Open Drain Configuration
// Default Push Pull
#ifndef WS2812_EXTERNAL_PULLUP
# define WS2812_OUTPUT_MODE PAL_MODE_OUTPUT_PUSHPULL
#else
# define WS2812_OUTPUT_MODE PAL_MODE_OUTPUT_OPENDRAIN
#endif
#define NUMBER_NOPS 6
#define CYCLES_PER_SEC (STM32_SYSCLK / NUMBER_NOPS * NOP_FUDGE)
#define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED since we want to be able to check for negative values of derivatives
@@ -43,7 +51,7 @@
// The reset gap can be 6000 ns, but depending on the LED strip it may have to be increased
// to values like 600000 ns. If it is too small, the pixels will show nothing most of the time.
#define RES 10000 // Width of the low gap between bits to cause a frame to latch
#define RES (1000 * WS2812_TRST_US) // Width of the low gap between bits to cause a frame to latch
void sendByte(uint8_t byte) {
// WS2812 protocol wants most significant bits first
@@ -66,7 +74,7 @@ void sendByte(uint8_t byte) {
}
}
void ws2812_init(void) { setPinOutput(RGB_DI_PIN); }
void ws2812_init(void) { palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE); }
// Setleds for standard RGB
void ws2812_setleds(LED_TYPE *ledarray, uint16_t leds) {

View File

@@ -1,16 +0,0 @@
#pragma once
#include "quantum/color.h"
/* User Interface
*
* Input:
* ledarray: An array of GRB data describing the LED colors
* number_of_leds: The number of LEDs to write
*
* The functions will perform the following actions:
* - Set the data-out pin as output
* - Send out the LED data
* - Wait 50us to reset the LEDs
*/
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);

View File

@@ -24,6 +24,22 @@
# define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP
#endif
// Push Pull or Open Drain Configuration
// Default Push Pull
#ifndef WS2812_EXTERNAL_PULLUP
# if defined(USE_GPIOV1)
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL
# else
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_PWM_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_FLOATING
# endif
#else
# if defined(USE_GPIOV1)
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
# else
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_PWM_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_FLOATING
# endif
#endif
#ifndef WS2812_PWM_TARGET_PERIOD
//# define WS2812_PWM_TARGET_PERIOD 800000 // Original code is 800k...?
# define WS2812_PWM_TARGET_PERIOD 80000 // TODO: work out why 10x less on f303/f4x1
@@ -37,11 +53,10 @@
/**
* @brief Number of bit-periods to hold the data line low at the end of a frame
*
* The reset period for each frame must be at least 50 uS; so we add in 50 bit-times
* of zeroes at the end. (50 bits)*(1.25 uS/bit) = 62.5 uS, which gives us some
* slack in the timing requirements
* The reset period for each frame is defined in WS2812_TRST_US.
* Calculate the number of zeroes to add at the end assuming 1.25 uS/bit:
*/
#define WS2812_RESET_BIT_N (50)
#define WS2812_RESET_BIT_N (1000 * WS2812_TRST_US / 1250)
#define WS2812_COLOR_BIT_N (RGBLED_NUM * 24) /**< Number of data bits */
#define WS2812_BIT_N (WS2812_COLOR_BIT_N + WS2812_RESET_BIT_N) /**< Total number of bits in a frame */
@@ -142,11 +157,7 @@ void ws2812_init(void) {
for (i = 0; i < WS2812_COLOR_BIT_N; i++) ws2812_frame_buffer[i] = WS2812_DUTYCYCLE_0; // All color bits are zero duty cycle
for (i = 0; i < WS2812_RESET_BIT_N; i++) ws2812_frame_buffer[i + WS2812_COLOR_BIT_N] = 0; // All reset bits are zero
#if defined(USE_GPIOV1)
palSetLineMode(RGB_DI_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
#else
palSetLineMode(RGB_DI_PIN, PAL_MODE_ALTERNATE(WS2812_PWM_PAL_MODE) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUPDR_FLOATING);
#endif
palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE);
// PWM Configuration
//#pragma GCC diagnostic ignored "-Woverride-init" // Turn off override-init warning for this struct. We use the overriding ability to set a "default" channel config

View File

@@ -16,11 +16,27 @@
# define WS2812_SPI_MOSI_PAL_MODE 5
#endif
// Push Pull or Open Drain Configuration
// Default Push Pull
#ifndef WS2812_EXTERNAL_PULLUP
# if defined(USE_GPIOV1)
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_PUSHPULL
# else
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL
# endif
#else
# if defined(USE_GPIOV1)
# define WS2812_OUTPUT_MODE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
# else
# define WS2812_OUTPUT_MODE PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN
# endif
#endif
#define BYTES_FOR_LED_BYTE 4
#define NB_COLORS 3
#define BYTES_FOR_LED (BYTES_FOR_LED_BYTE * NB_COLORS)
#define DATA_SIZE (BYTES_FOR_LED * RGBLED_NUM)
#define RESET_SIZE 200
#define RESET_SIZE (1000 * WS2812_TRST_US / (2 * 1250))
#define PREAMBLE_SIZE 4
static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE] = {0};
@@ -52,11 +68,7 @@ static void set_led_color_rgb(LED_TYPE color, int pos) {
}
void ws2812_init(void) {
#if defined(USE_GPIOV1)
palSetLineMode(RGB_DI_PIN, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
#else
palSetLineMode(RGB_DI_PIN, PAL_MODE_ALTERNATE(WS2812_SPI_MOSI_PAL_MODE) | PAL_STM32_OTYPE_PUSHPULL);
#endif
palSetLineMode(RGB_DI_PIN, WS2812_OUTPUT_MODE);
// TODO: more dynamic baudrate
static const SPIConfig spicfg = {

288
drivers/issi/is31fl3741.c Normal file
View File

@@ -0,0 +1,288 @@
/* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar
* Copyright 2020 MelGeek
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "wait.h"
#include "is31fl3741.h"
#include <string.h>
#include "i2c_master.h"
#include "progmem.h"
// This is a 7-bit address, that gets left-shifted and bit 0
// set to 0 for write, 1 for read (as per I2C protocol)
// The address will vary depending on your wiring:
// 00 <-> GND
// 01 <-> SCL
// 10 <-> SDA
// 11 <-> VCC
// ADDR1 represents A1:A0 of the 7-bit address.
// ADDR2 represents A3:A2 of the 7-bit address.
// The result is: 0b101(ADDR2)(ADDR1)
#define ISSI_ADDR_DEFAULT 0x60
#define ISSI_COMMANDREGISTER 0xFD
#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE
#define ISSI_INTERRUPTMASKREGISTER 0xF0
#define ISSI_INTERRUPTSTATUSREGISTER 0xF1
#define ISSI_IDREGISTER 0xFC
#define ISSI_PAGE_PWM0 0x00 // PG0
#define ISSI_PAGE_PWM1 0x01 // PG1
#define ISSI_PAGE_SCALING_0 0x02 // PG2
#define ISSI_PAGE_SCALING_1 0x03 // PG3
#define ISSI_PAGE_FUNCTION 0x04 // PG4
#define ISSI_REG_CONFIGURATION 0x00 // PG4
#define ISSI_REG_GLOBALCURRENT 0x01 // PG4
#define ISSI_REG_PULLDOWNUP 0x02 // PG4
#define ISSI_REG_RESET 0x3F // PG4
#ifndef ISSI_TIMEOUT
# define ISSI_TIMEOUT 100
#endif
#ifndef ISSI_PERSISTENCE
# define ISSI_PERSISTENCE 0
#endif
#define ISSI_MAX_LEDS 351
// Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20] = {0xFF};
// These buffers match the IS31FL3741 and IS31FL3741A PWM registers.
// The scaling buffers match the PG2 and PG3 LED On/Off registers.
// Storing them like this is optimal for I2C transfers to the registers.
// We could optimize this and take out the unused registers from these
// buffers and the transfers in IS31FL3741_write_pwm_buffer() but it's
// probably not worth the extra complexity.
uint8_t g_pwm_buffer[DRIVER_COUNT][ISSI_MAX_LEDS];
bool g_pwm_buffer_update_required = false;
bool g_scaling_registers_update_required[DRIVER_COUNT] = {false};
uint8_t g_scaling_registers[DRIVER_COUNT][ISSI_MAX_LEDS];
uint32_t IS31FL3741_get_cw_sw_position(uint8_t cs, uint8_t sw) {
uint32_t pos = 0;
if (cs < 31) {
if (sw < 7) {
pos = (sw - 1) * 30 + (cs - 1);
} else {
pos = 0xB4 + (sw - 7) * 30 + (cs - 1);
}
} else {
pos = 0xB4 + 0x5A + (sw - 1) * 9 + (cs - 31);
}
return pos;
}
void IS31FL3741_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
g_twi_transfer_buffer[0] = reg;
g_twi_transfer_buffer[1] = data;
#if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) break;
}
#else
i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT);
#endif
}
bool IS31FL3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
// unlock the command register and select PG2
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM0);
for (int i = 0; i < 342; i += 18) {
g_twi_transfer_buffer[0] = i % 180;
if (i == 180) {
// unlock the command register and select PG2
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM1);
}
memcpy(g_twi_transfer_buffer + 1, pwm_buffer + i, 18);
#if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 19, ISSI_TIMEOUT) != 0) {
return false;
}
}
#else
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 19, ISSI_TIMEOUT) != 0) {
return false;
}
#endif
}
// transfer the left cause the total number is 351
g_twi_transfer_buffer[0] = 162;
memcpy(g_twi_transfer_buffer + 1, pwm_buffer + 342, 9);
#if ISSI_PERSISTENCE > 0
for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 10, ISSI_TIMEOUT) != 0) {
return false;
}
}
#else
if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 10, ISSI_TIMEOUT) != 0) {
return false;
}
#endif
return true;
}
void IS31FL3741_init(uint8_t addr) {
// In order to avoid the LEDs being driven with garbage data
// in the LED driver's PWM registers, shutdown is enabled last.
// Set up the mode and other settings, clear the PWM registers,
// then disable software shutdown.
// Unlock the command register.
// Unlock the command register.
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
// Select PG4
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
// Set to Normal operation
IS31FL3741_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
// Set Golbal Current Control Register
IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Set Pull up & Down for SWx CSy
IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, 0x77);
// IS31FL3741_update_led_scaling_registers(addr, 0xFF, 0xFF, 0xFF);
// Wait 10ms to ensure the device has woken up.
wait_ms(10);
}
void IS31FL3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
if (index >= 0 && index < DRIVER_LED_TOTAL) {
is31_led led = g_is31_leds[index];
uint32_t rp = 0, gp = 0, bp = 0;
rp = IS31FL3741_get_cw_sw_position(led.rcs, led.rsw);
gp = IS31FL3741_get_cw_sw_position(led.gcs, led.gsw);
bp = IS31FL3741_get_cw_sw_position(led.bcs, led.bsw);
g_pwm_buffer[led.driver][rp] = red;
g_pwm_buffer[led.driver][gp] = green;
g_pwm_buffer[led.driver][bp] = blue;
g_pwm_buffer_update_required = true;
}
}
void IS31FL3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
IS31FL3741_set_color(i, red, green, blue);
}
}
void IS31FL3741_set_led_control_register(uint8_t index, bool red, bool green, bool blue) {
is31_led led = g_is31_leds[index];
uint32_t scaling_register_r = IS31FL3741_get_cw_sw_position(led.rcs, led.rsw);
uint32_t scaling_register_g = IS31FL3741_get_cw_sw_position(led.gcs, led.gsw);
uint32_t scaling_register_b = IS31FL3741_get_cw_sw_position(led.bcs, led.bsw);
if (red) {
g_scaling_registers[led.driver][scaling_register_r] = 0xFF;
} else {
g_scaling_registers[led.driver][scaling_register_r] = 0x00;
}
if (green) {
g_scaling_registers[led.driver][scaling_register_g] = 0xFF;
} else {
g_scaling_registers[led.driver][scaling_register_g] = 0x00;
}
if (blue) {
g_scaling_registers[led.driver][scaling_register_b] = 0xFF;
} else {
g_scaling_registers[led.driver][scaling_register_b] = 0x00;
}
g_scaling_registers_update_required[led.driver] = true;
}
void IS31FL3741_update_pwm_buffers(uint8_t addr1, uint8_t addr2) {
if (g_pwm_buffer_update_required) {
IS31FL3741_write_pwm_buffer(addr1, g_pwm_buffer[0]);
}
g_pwm_buffer_update_required = false;
}
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
uint32_t rp = 0, gp = 0, bp = 0;
rp = IS31FL3741_get_cw_sw_position(pled->rcs, pled->rsw);
gp = IS31FL3741_get_cw_sw_position(pled->gcs, pled->gsw);
bp = IS31FL3741_get_cw_sw_position(pled->bcs, pled->bsw);
g_pwm_buffer[pled->driver][rp] = red;
g_pwm_buffer[pled->driver][gp] = green;
g_pwm_buffer[pled->driver][bp] = blue;
g_pwm_buffer_update_required = true;
}
void IS31FL3741_update_led_control_registers(uint8_t addr, uint8_t index) {
if (g_scaling_registers_update_required[index]) {
// unlock the command register and select PG2
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_0);
for (int i = 0; i < 180; ++i) {
IS31FL3741_write_register(addr, i, g_scaling_registers[0][i]);
}
// unlock the command register and select PG3
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
IS31FL3741_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_SCALING_1);
for (int i = 0; i < 171; ++i) {
IS31FL3741_write_register(addr, i, g_scaling_registers[0][180 + i]);
}
}
}
void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue) {
uint32_t rp = 0, gp = 0, bp = 0;
rp = IS31FL3741_get_cw_sw_position(pled->rcs, pled->rsw);
gp = IS31FL3741_get_cw_sw_position(pled->gcs, pled->gsw);
bp = IS31FL3741_get_cw_sw_position(pled->bcs, pled->bsw);
g_scaling_registers[pled->driver][rp] = red;
g_scaling_registers[pled->driver][gp] = green;
g_scaling_registers[pled->driver][bp] = blue;
}

55
drivers/issi/is31fl3741.h Normal file
View File

@@ -0,0 +1,55 @@
/* Copyright 2017 Jason Williams
* Copyright 2018 Jack Humbert
* Copyright 2018 Yiancar
* Copyright 2020 MelGeek
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include <stdbool.h>
typedef struct is31_led {
uint8_t driver : 2;
uint8_t rcs;
uint8_t rsw;
uint8_t gcs;
uint8_t gsw;
uint8_t bcs;
uint8_t bsw;
} __attribute__((packed)) is31_led;
extern const is31_led g_is31_leds[DRIVER_LED_TOTAL];
extern const is31_led g_is31_indicator_leds[DRIVER_INDICATOR_LED_TOTAL];
void IS31FL3741_init(uint8_t addr);
void IS31FL3741_write_register(uint8_t addr, uint8_t reg, uint8_t data);
bool IS31FL3741_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
void IS31FL3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3741_set_led_control_register(uint8_t index, bool red, bool green, bool blue);
// This should not be called from an interrupt
// (eg. from a timer interrupt).
// Call this while idle (in between matrix scans).
// If the buffer is dirty, it will update the driver with the buffer.
void IS31FL3741_update_pwm_buffers(uint8_t addr1, uint8_t addr2);
void IS31FL3741_update_led_control_registers(uint8_t addr1, uint8_t addr2);
void IS31FL3741_set_scaling_registers(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);
void IS31FL3741_set_pwm_buffer(const is31_led *pled, uint8_t red, uint8_t green, uint8_t blue);

View File

@@ -1,11 +1,4 @@
/*
* light weight WS2812 lib include
*
* Version 2.3 - Nev 29th 2015
* Author: Tim (cpldcpu@gmail.com)
*
* Please do not change this file! All configuration is handled in "ws2812_config.h"
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
@@ -24,12 +17,20 @@
#include "quantum/color.h"
/*
* Older WS2812s can handle a reset time (TRST) of 50us, but recent
* component revisions require a minimum of 280us.
*/
#if !defined(WS2812_TRST_US)
# define WS2812_TRST_US 280
#endif
/* User Interface
*
* Input:
* ledarray: An array of GRB data describing the LED colors
* number_of_leds: The number of LEDs to write
* pin (optional): A pin_t definition for the line to drive
*
* The functions will perform the following actions:
* - Set the data-out pin as output
@@ -37,4 +38,3 @@
* - Wait 50us to reset the LEDs
*/
void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
void ws2812_setleds_pin(LED_TYPE *ledarray, uint16_t number_of_leds, uint8_t pin);

View File

@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
@@ -22,8 +22,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support
UNICODE_ENABLE = no # Unicode

View File

@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug

View File

@@ -11,16 +11,6 @@ MCU = atmega32u4
# ATmega328P USBasp
BOOTLOADER = atmel-dfu
# If you don't know the bootloader type, then you can specify the
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
# Otherwise, delete this section
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
# OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# change yes to no to disable
#
@@ -39,7 +29,5 @@ MIDI_ENABLE = no # MIDI support
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
ENCODER_ENABLE = yes
RGBLIGHT_ENABLE = yes
# EXTRAFLAGS += -flto

View File

@@ -5,7 +5,7 @@
"width": 15.5,
"height": 4.25,
"layouts": {
"LAYOUT_all": {
"LAYOUT": {
"layout": [
{"label":"Tab", "x":0, "y":0},
{"label":"Q", "x":1, "y":0},
@@ -33,7 +33,7 @@
{"label":"J", "x":7.25, "y":1},
{"label":"K", "x":8.25, "y":1},
{"label":"L", "x":9.25, "y":1},
{"label":"Enter", "x":10.25, "y":1.75},
{"label":"Enter", "x":10.25, "y":1, "w":1.75},
{"label":"4", "x":12.5, "y":1},
{"label":"5", "x":13.5, "y":1},
{"label":"6", "x":14.5, "y":1},
@@ -47,7 +47,7 @@
{"label":"N", "x":6.75, "y":2},
{"label":"M", "x":7.75, "y":2},
{"label":"<", "x":8.75, "y":2},
{"label":"Fn1", "x":9.75, "y":2},
{"label":"Fn1", "x":9.75, "y":2, "w":1.25},
{"label":"Up", "x":11.25, "y":2.25},
{"label":"1", "x":12.5, "y":2},
{"label":"2", "x":13.5, "y":2},

View File

@@ -14,13 +14,13 @@ BOOTLOADER = atmel-dfu
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE ?= no # Mouse keys
EXTRAKEY_ENABLE ?= yes # Audio control and System control
CONSOLE_ENABLE ?= no # Console for debug
COMMAND_ENABLE ?= no # Commands for debug and configuration
SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend
NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
AUDIO_ENABLE ?= no
RGBLIGHT_ENABLE ?= yes
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = yes

View File

@@ -14,15 +14,15 @@ BOOTLOADER = atmel-dfu
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration
MOUSEKEY_ENABLE ?= no # Mouse keys
EXTRAKEY_ENABLE ?= yes # Audio control and System control
CONSOLE_ENABLE ?= yes # Console for debug
COMMAND_ENABLE ?= yes # Commands for debug and configuration
NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE ?= yes # Enable keyboard underlight functionality
BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality
MIDI_ENABLE ?= no # MIDI controls
AUDIO_ENABLE ?= no
UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID

View File

@@ -0,0 +1,72 @@
/*
Copyright 2020 Leon Anavi <leon@anavi.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCEEB
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER ANAVI
#define PRODUCT Macro Pad 8
#define DESCRIPTION 8-key mechanical keyboard/keypad/macropad with backlit, mini OLED display and RGB LED strip
/* key matrix size */
#define MATRIX_ROWS 2
#define MATRIX_COLS 4
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
* NO_DIODE = switches are directly connected to AVR pins
*
*/
#define DIRECT_PINS { \
{ D4, F6, B5, E6 }, \
{ F5, F7, B4, C6 } \
}
#define BACKLIGHT_PIN D7
#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
#define RGBLIGHT_SLEEP
#define UNUSED_PINS
/* ws2812B RGB LED */
#ifdef RGBLIGHT_ENABLE
# define RGB_DI_PIN F4
# define RGBLIGHT_ANIMATIONS
# define RGBLED_NUM 4
# define RGBLIGHT_HUE_STEP 10
# define RGBLIGHT_SAT_STEP 17
# define RGBLIGHT_VAL_STEP 17
# define RGBLIGHT_LIMIT_VAL 255
#endif
#ifdef OLED_DRIVER_ENABLE
# define OLED_DISPLAY_128X64
# define OLED_TIMEOUT 60000
# define OLED_FONT_H "keyboards/anavi/macropad8/glcdfont.c"
#endif

View File

@@ -0,0 +1,232 @@
#include "progmem.h"
// Corne 8x6 font with QMK Firmware Logo
// Online editor: https://helixfonteditor.netlify.com/
// clang-format off
const unsigned char font[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0,
0xF0, 0xF8, 0xF8, 0x18, 0x00, 0xC0,
0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0,
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0,
0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80,
0x00, 0x00, 0x00, 0xE0, 0xE0, 0xC0,
0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00,
0x00, 0xE0, 0xE0, 0xC0, 0xC0, 0xE0,
0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80,
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0,
0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE,
0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x1F, 0x07, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x81, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
0xC3, 0xC3, 0xC3, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0x9D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
0x1C, 0x9D, 0xDF, 0xDF, 0xDF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F,
0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F,
0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F,
0x3F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7C, 0x78, 0x78, 0x38, 0x1C,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x03, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
0x01, 0x03, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x03, 0x01,
0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0x07, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x07,
0x07, 0x00, 0x00, 0x00, 0x01, 0x03,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x03, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

View File

@@ -0,0 +1,12 @@
{
"keyboard_name": "ANAVI Macro Pad 8",
"url": "",
"maintainer": "leon-anavi",
"width": 4,
"height": 2,
"layouts": {
"LAYOUT_ortho_2x4": {
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}]
}
}
}

View File

@@ -0,0 +1,61 @@
#include QMK_KEYBOARD_H
#define _MAIN 0
#define _FN 1
#define KC_X0 LT(_FN, KC_ESC)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = LAYOUT_ortho_2x4(
G(KC_D), KC_UP, C(KC_C), C(KC_V),
KC_LEFT, KC_DOWN, KC_RGHT, MO(_FN)
),
[_FN] = LAYOUT_ortho_2x4(
RGB_TOG, RGB_MOD, RGB_M_R, RGB_M_SN,
BL_TOGG, BL_STEP, BL_BRTG, _______
)
};
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_ln_P(PSTR("ANAVI Macro Pad 8"), false);
oled_write_P(PSTR("Active layer:"), false);
switch (get_highest_layer(layer_state)) {
case _MAIN:
oled_write_ln_P(PSTR("Main"), false);
break;
case _FN:
oled_write_ln_P(PSTR("FN"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("N/A"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(PSTR("Num Lock: "), false);
oled_write_ln_P(led_state.num_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Caps Lock: "), false);
oled_write_ln_P(led_state.caps_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Scroll Lock: "), false);
oled_write_ln_P(led_state.scroll_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Backlit: "), false);
oled_write_ln_P(is_backlight_enabled() ? PSTR("On") : PSTR("Off"), false);
#ifdef RGBLIGHT_ENABLE
static char rgbStatusLine1[26] = {0};
snprintf(rgbStatusLine1, sizeof(rgbStatusLine1), "RGB Mode: %d", rgblight_get_mode());
oled_write_ln(rgbStatusLine1, false);
static char rgbStatusLine2[26] = {0};
snprintf(rgbStatusLine2, sizeof(rgbStatusLine2), "h:%d s:%d v:%d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
oled_write_ln(rgbStatusLine2, false);
#endif
}
#endif

View File

@@ -0,0 +1,68 @@
#include QMK_KEYBOARD_H
#define _MAIN 0
#define _FN 1
#define KC_X0 LT(_FN, KC_ESC)
#ifdef RGBLIGHT_ENABLE
// How long (in ms) to wait between animation steps for the rainbow mode
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {60, 30, 15};
// How long (in milliseconds) to wait between animation steps for each of the "Swirling rainbow" animations
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 10, 4};
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = LAYOUT_ortho_2x4(
KC_ESC, KC_UP, KC_ENTER, KC_X,
KC_LEFT, KC_DOWN, KC_RIGHT, MO(_FN)
),
[_FN] = LAYOUT_ortho_2x4(
RGB_TOG, RGB_MOD, RGB_M_R, RGB_M_SN,
BL_TOGG, BL_STEP, BL_BRTG, _______
)
};
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_ln_P(PSTR("ANAVI Macro Pad 8"), false);
oled_write_P(PSTR("Active layer:"), false);
switch (get_highest_layer(layer_state)) {
case _MAIN:
oled_write_ln_P(PSTR("Main"), false);
break;
case _FN:
oled_write_ln_P(PSTR("FN"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("N/A"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(PSTR("Num Lock: "), false);
oled_write_ln_P(led_state.num_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Caps Lock: "), false);
oled_write_ln_P(led_state.caps_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Scroll Lock: "), false);
oled_write_ln_P(led_state.scroll_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Backlit: "), false);
oled_write_ln_P(is_backlight_enabled() ? PSTR("On") : PSTR("Off"), false);
#ifdef RGBLIGHT_ENABLE
static char rgbStatusLine1[26] = {0};
snprintf(rgbStatusLine1, sizeof(rgbStatusLine1), "RGB Mode: %d", rgblight_get_mode());
oled_write_ln(rgbStatusLine1, false);
static char rgbStatusLine2[26] = {0};
snprintf(rgbStatusLine2, sizeof(rgbStatusLine2), "h:%d s:%d v:%d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
oled_write_ln(rgbStatusLine2, false);
#endif
}
#endif

View File

@@ -0,0 +1 @@
#include "macropad8.h"

View File

@@ -0,0 +1,11 @@
#pragma once
#include "quantum.h"
#define LAYOUT_ortho_2x4( \
k01, k02, k03, k04, \
k05, k06, k07, k08 \
) { \
{ k01, k02, k03, k04 }, \
{ k05, k06, k07, k08 } \
}

View File

@@ -0,0 +1,18 @@
# ANAVI Macro Pad 8
ANAVI Macro Pad 8 is an open source mini mechanical keyboard with 8 keys, backlit, addressable RGB WS2812B LED strip on the back and mini OLED display. Powered by ATmega32U4 microcontroller and with microUSB connector.
* Keyboard Maintainer: [Leon Anavi](https://github.com/leon-anavi)
* Hardware Supported: ANAVI Macro Pad 8
* Hardware Availability: [PCB Files](https://github.com/AnaviTechnology/anavi-macro-pad-8)
Make example for this keyboard (after setting up your build environment):
qmk compile -kb anavi/macropad8 -km default
Flash to ANAVI Macro Pad 8:
qmk flash -kb anavi/macropad8 -km default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@@ -0,0 +1,32 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = yes # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
OLED_DRIVER_ENABLE = yes # Enable Support for SSD1306 or SH1106 OLED Displays; Communicating over I2C
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

View File

@@ -1,4 +1,4 @@
/* Copyright 2019 Sebastian Williams
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -13,4 +13,4 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "smd_milk.h"
#include "1894.h"

View File

@@ -0,0 +1,86 @@
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* This a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT_all( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K212, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \
K400, K401, K402, K404, K406, K408, K410, K411, K412, K413 \
) \
{ \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \
{ K400, K401, K402, KC_NO, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413 } \
}
#define LAYOUT_60_ansi( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K213, \
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \
K400, K401, K402, K406, K410, K411, K412, K413 \
) \
{ \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, KC_NO, K213 }, \
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO}, \
{ K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413 } \
}
#define LAYOUT_60_ansi_split_bs_rshift( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K212, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K213, \
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \
K400, K401, K402, K406, K410, K411, K412, K413 \
) \
{ \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \
{ K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413 } \
}
#define LAYOUT_60_tsangan_hhkb( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K212, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K213, \
K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \
K400, K401, K402, K406, K411, K412, K413 \
) \
{ \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \
{ K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \
{ K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, K412, K413 } \
}

View File

@@ -0,0 +1,169 @@
/*
Copyright 2019 Ryota Goto
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x5458 // TX
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER atxkb
#define PRODUCT 1894
#define DESCRIPTION atxkb 1894
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { B1, B2, B3, F0, F1 }
#define MATRIX_COL_PINS { F4, F7, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, D5, D3 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define BACKLIGHT_PIN B7
#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 5
#define RGB_DI_PIN D2
#ifdef RGB_DI_PIN
#define RGBLED_NUM 14
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
// #define RGBLIGHT_LIMIT_VAL 200 /* The maximum brightness level */
#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
/*== all animations enable ==*/
#define RGBLIGHT_ANIMATIONS
// /*== or choose animations ==*/
// #define RGBLIGHT_EFFECT_BREATHING
// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
// #define RGBLIGHT_EFFECT_SNAKE
// #define RGBLIGHT_EFFECT_KNIGHT
// #define RGBLIGHT_EFFECT_CHRISTMAS
// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
// #define RGBLIGHT_EFFECT_RGB_TEST
// #define RGBLIGHT_EFFECT_ALTERNATING
// /*== customize breathing effect ==*/
// /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
// #define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
// /*==== use exp() and sin() ====*/
// #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
// #define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
#endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
/* defined by default; to change, uncomment and set to the combination you want */
// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP H
//#define MAGIC_KEY_HELP_ALT SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER0_ALT GRAVE
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER B
//#define MAGIC_KEY_BOOTLOADER_ALT ESC
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
// #define BOOTMAGIC_LITE_COLUMN 0

View File

@@ -0,0 +1,277 @@
{
"keyboard_name": "1894",
"url": "https://atxkb.com",
"maintainer": "austexcn",
"width": 15,
"height": 5,
"layouts": {
"LAYOUT_all": {
"layout": [
{"label":"~", "x":0, "y":0},
{"label":"!", "x":1, "y":0},
{"label":"@", "x":2, "y":0},
{"label":"#", "x":3, "y":0},
{"label":"$", "x":4, "y":0},
{"label":"%", "x":5, "y":0},
{"label":"^", "x":6, "y":0},
{"label":"&", "x":7, "y":0},
{"label":"*", "x":8, "y":0},
{"label":"(", "x":9, "y":0},
{"label":")", "x":10, "y":0},
{"label":"_", "x":11, "y":0},
{"label":"+", "x":12, "y":0},
{"label":"Backspace", "x":13, "y":0},
{"label":"Delete", "x":14, "y":0},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
{"label":"W", "x":2.5, "y":1},
{"label":"E", "x":3.5, "y":1},
{"label":"R", "x":4.5, "y":1},
{"label":"T", "x":5.5, "y":1},
{"label":"Y", "x":6.5, "y":1},
{"label":"U", "x":7.5, "y":1},
{"label":"I", "x":8.5, "y":1},
{"label":"O", "x":9.5, "y":1},
{"label":"P", "x":10.5, "y":1},
{"label":"{", "x":11.5, "y":1},
{"label":"}", "x":12.5, "y":1},
{"label":"|", "x":13.5, "y":1, "w":1.5},
{"label":"Caps Lock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
{"label":"S", "x":2.75, "y":2},
{"label":"D", "x":3.75, "y":2},
{"label":"F", "x":4.75, "y":2},
{"label":"G", "x":5.75, "y":2},
{"label":"H", "x":6.75, "y":2},
{"label":"J", "x":7.75, "y":2},
{"label":"K", "x":8.75, "y":2},
{"label":"L", "x":9.75, "y":2},
{"label":":", "x":10.75, "y":2},
{"label":"\"", "x":11.75, "y":2},
{"label":"Enter", "x":12.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":1.25},
{"label":"|", "x":1.25, "y":3},
{"label":"Z", "x":2.25, "y":3},
{"label":"X", "x":3.25, "y":3},
{"label":"C", "x":4.25, "y":3},
{"label":"V", "x":5.25, "y":3},
{"label":"B", "x":6.25, "y":3},
{"label":"N", "x":7.25, "y":3},
{"label":"M", "x":8.25, "y":3},
{"label":"<", "x":9.25, "y":3},
{"label":">", "x":10.25, "y":3},
{"label":"?", "x":11.25, "y":3},
{"label":"Shift", "x":12.25, "y":3, "w":1.75},
{"label":"Print Screen", "x":14, "y":3},
{"label":"Ctrl", "x":0, "y":4, "w":1.25},
{"label":"Win", "x":1.25, "y":4, "w":1.25},
{"label":"Alt", "x":2.5, "y":4, "w":1.25},
{"x":3.75, "y":4, "w":2.25},
{"x":6, "y":4, "w":1.25},
{"x":7.25, "y":4, "w":2.75},
{"label":"Alt", "x":10, "y":4, "w":1.25},
{"label":"Win", "x":11.25, "y":4, "w":1.25},
{"label":"Menu", "x":12.5, "y":4, "w":1.25},
{"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
]
},
"LAYOUT_60_ansi": {
"layout": [
{"label":"~", "x":0, "y":0},
{"label":"!", "x":1, "y":0},
{"label":"@", "x":2, "y":0},
{"label":"#", "x":3, "y":0},
{"label":"$", "x":4, "y":0},
{"label":"%", "x":5, "y":0},
{"label":"^", "x":6, "y":0},
{"label":"&", "x":7, "y":0},
{"label":"*", "x":8, "y":0},
{"label":"(", "x":9, "y":0},
{"label":")", "x":10, "y":0},
{"label":"_", "x":11, "y":0},
{"label":"+", "x":12, "y":0},
{"label":"Backspace", "x":13, "y":0, "w":2},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
{"label":"W", "x":2.5, "y":1},
{"label":"E", "x":3.5, "y":1},
{"label":"R", "x":4.5, "y":1},
{"label":"T", "x":5.5, "y":1},
{"label":"Y", "x":6.5, "y":1},
{"label":"U", "x":7.5, "y":1},
{"label":"I", "x":8.5, "y":1},
{"label":"O", "x":9.5, "y":1},
{"label":"P", "x":10.5, "y":1},
{"label":"{", "x":11.5, "y":1},
{"label":"}", "x":12.5, "y":1},
{"label":"|", "x":13.5, "y":1, "w":1.5},
{"label":"Caps Lock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
{"label":"S", "x":2.75, "y":2},
{"label":"D", "x":3.75, "y":2},
{"label":"F", "x":4.75, "y":2},
{"label":"G", "x":5.75, "y":2},
{"label":"H", "x":6.75, "y":2},
{"label":"J", "x":7.75, "y":2},
{"label":"K", "x":8.75, "y":2},
{"label":"L", "x":9.75, "y":2},
{"label":":", "x":10.75, "y":2},
{"label":"\"", "x":11.75, "y":2},
{"label":"Enter", "x":12.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":2.25},
{"label":"Z", "x":2.25, "y":3},
{"label":"X", "x":3.25, "y":3},
{"label":"C", "x":4.25, "y":3},
{"label":"V", "x":5.25, "y":3},
{"label":"B", "x":6.25, "y":3},
{"label":"N", "x":7.25, "y":3},
{"label":"M", "x":8.25, "y":3},
{"label":"<", "x":9.25, "y":3},
{"label":">", "x":10.25, "y":3},
{"label":"?", "x":11.25, "y":3},
{"label":"Shift", "x":12.25, "y":3, "w":2.75},
{"label":"Ctrl", "x":0, "y":4, "w":1.25},
{"label":"Win", "x":1.25, "y":4, "w":1.25},
{"label":"Alt", "x":2.5, "y":4, "w":1.25},
{"x":3.75, "y":4, "w":6.25},
{"label":"Alt", "x":10, "y":4, "w":1.25},
{"label":"Win", "x":11.25, "y":4, "w":1.25},
{"label":"Menu", "x":12.5, "y":4, "w":1.25},
{"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
]
},
"LAYOUT_60_ansi_split_bs_rshift": {
"layout": [
{"label":"~", "x":0, "y":0},
{"label":"!", "x":1, "y":0},
{"label":"@", "x":2, "y":0},
{"label":"#", "x":3, "y":0},
{"label":"$", "x":4, "y":0},
{"label":"%", "x":5, "y":0},
{"label":"^", "x":6, "y":0},
{"label":"&", "x":7, "y":0},
{"label":"*", "x":8, "y":0},
{"label":"(", "x":9, "y":0},
{"label":")", "x":10, "y":0},
{"label":"_", "x":11, "y":0},
{"label":"+", "x":12, "y":0},
{"label":"Backspace", "x":13, "y":0},
{"label":"Delete", "x":14, "y":0},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
{"label":"W", "x":2.5, "y":1},
{"label":"E", "x":3.5, "y":1},
{"label":"R", "x":4.5, "y":1},
{"label":"T", "x":5.5, "y":1},
{"label":"Y", "x":6.5, "y":1},
{"label":"U", "x":7.5, "y":1},
{"label":"I", "x":8.5, "y":1},
{"label":"O", "x":9.5, "y":1},
{"label":"P", "x":10.5, "y":1},
{"label":"{", "x":11.5, "y":1},
{"label":"}", "x":12.5, "y":1},
{"label":"|", "x":13.5, "y":1, "w":1.5},
{"label":"Caps Lock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
{"label":"S", "x":2.75, "y":2},
{"label":"D", "x":3.75, "y":2},
{"label":"F", "x":4.75, "y":2},
{"label":"G", "x":5.75, "y":2},
{"label":"H", "x":6.75, "y":2},
{"label":"J", "x":7.75, "y":2},
{"label":"K", "x":8.75, "y":2},
{"label":"L", "x":9.75, "y":2},
{"label":":", "x":10.75, "y":2},
{"label":"\"", "x":11.75, "y":2},
{"label":"Enter", "x":12.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":2.25},
{"label":"Z", "x":2.25, "y":3},
{"label":"X", "x":3.25, "y":3},
{"label":"C", "x":4.25, "y":3},
{"label":"V", "x":5.25, "y":3},
{"label":"B", "x":6.25, "y":3},
{"label":"N", "x":7.25, "y":3},
{"label":"M", "x":8.25, "y":3},
{"label":"<", "x":9.25, "y":3},
{"label":">", "x":10.25, "y":3},
{"label":"?", "x":11.25, "y":3},
{"label":"Shift", "x":12.25, "y":3, "w":1.75},
{"label":"Print Screen", "x":14, "y":3},
{"label":"Ctrl", "x":0, "y":4, "w":1.25},
{"label":"Win", "x":1.25, "y":4, "w":1.25},
{"label":"Alt", "x":2.5, "y":4, "w":1.25},
{"x":3.75, "y":4, "w":6.25},
{"label":"Alt", "x":10, "y":4, "w":1.25},
{"label":"Win", "x":11.25, "y":4, "w":1.25},
{"label":"Menu", "x":12.5, "y":4, "w":1.25},
{"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
]
},
"LAYOUT_60_tsangan_hhkb": {
"layout": [
{"label":"~", "x":0, "y":0},
{"label":"!", "x":1, "y":0},
{"label":"@", "x":2, "y":0},
{"label":"#", "x":3, "y":0},
{"label":"$", "x":4, "y":0},
{"label":"%", "x":5, "y":0},
{"label":"^", "x":6, "y":0},
{"label":"&", "x":7, "y":0},
{"label":"*", "x":8, "y":0},
{"label":"(", "x":9, "y":0},
{"label":")", "x":10, "y":0},
{"label":"_", "x":11, "y":0},
{"label":"+", "x":12, "y":0},
{"label":"Backspace", "x":13, "y":0},
{"label":"Delete", "x":14, "y":0},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
{"label":"W", "x":2.5, "y":1},
{"label":"E", "x":3.5, "y":1},
{"label":"R", "x":4.5, "y":1},
{"label":"T", "x":5.5, "y":1},
{"label":"Y", "x":6.5, "y":1},
{"label":"U", "x":7.5, "y":1},
{"label":"I", "x":8.5, "y":1},
{"label":"O", "x":9.5, "y":1},
{"label":"P", "x":10.5, "y":1},
{"label":"{", "x":11.5, "y":1},
{"label":"}", "x":12.5, "y":1},
{"label":"|", "x":13.5, "y":1, "w":1.5},
{"label":"Caps Lock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
{"label":"S", "x":2.75, "y":2},
{"label":"D", "x":3.75, "y":2},
{"label":"F", "x":4.75, "y":2},
{"label":"G", "x":5.75, "y":2},
{"label":"H", "x":6.75, "y":2},
{"label":"J", "x":7.75, "y":2},
{"label":"K", "x":8.75, "y":2},
{"label":"L", "x":9.75, "y":2},
{"label":":", "x":10.75, "y":2},
{"label":"\"", "x":11.75, "y":2},
{"label":"Enter", "x":12.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":2.25},
{"label":"Z", "x":2.25, "y":3},
{"label":"X", "x":3.25, "y":3},
{"label":"C", "x":4.25, "y":3},
{"label":"V", "x":5.25, "y":3},
{"label":"B", "x":6.25, "y":3},
{"label":"N", "x":7.25, "y":3},
{"label":"M", "x":8.25, "y":3},
{"label":"<", "x":9.25, "y":3},
{"label":">", "x":10.25, "y":3},
{"label":"?", "x":11.25, "y":3},
{"label":"Shift", "x":12.25, "y":3, "w":1.75},
{"label":"Print Screen", "x":14, "y":3},
{"label":"Ctrl", "x":0, "y":4, "w":1.5},
{"label":"Win", "x":1.5, "y":4},
{"label":"Alt", "x":2.5, "y":4, "w":1.5},
{"x":4, "y":4, "w":7},
{"label":"Alt", "x":11, "y":4, "w":1.5},
{"label":"Win", "x":12.5, "y":4},
{"label":"Ctrl", "x":13.5, "y":4, "w":1.5}
]
}
}
}

View File

@@ -0,0 +1,39 @@
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all( /* Base */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_DEL,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL
),
[_FN] = LAYOUT_all( /* FN */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_BSPC,
_______, _______, KC_PGUP, _______, _______, _______, _______, _______, KC_UP, _______, KC_MPRV, KC_MPLY, KC_MNXT, BL_STEP,
_______, KC_HOME, KC_PGDN, KC_END, _______, KC_VOLD, KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
_______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, KC_PSCR, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,3 @@
# The default keymap for 1894
Fits just about everything on two layers.

View File

@@ -0,0 +1,38 @@
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_60_tsangan_hhkb( /* Base */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_DEL,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[_FN] = LAYOUT_60_tsangan_hhkb( /* FN */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_BSPC,
_______, _______, KC_PGUP, _______, _______, _______, _______, _______, KC_UP, _______, KC_MPRV, KC_MPLY, KC_MNXT, BL_STEP,
_______, KC_HOME, KC_PGDN, KC_END, _______, KC_VOLD, KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
_______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, KC_PSCR, _______,
_______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,3 @@
# The default_ansi_tsangan keymap for 1894
Simplified down to the basic ANSI Tsangan layouts for ease of configuration.

View File

@@ -0,0 +1,55 @@
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_FN,
_EXTRA_ONE,
_EXTRA_TWO
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_all( /* Base */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_DEL,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RALT, KC_RGUI, KC_RCTL
),
[_FN] = LAYOUT_all( /* FN */
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_BSPC,
_______, _______, _______, KC_PGUP, _______, _______, _______, _______, KC_UP, _______, _______, _______, _______, BL_STEP,
_______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
_______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_PSCR, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_EXTRA_ONE] = LAYOUT_all( /* Layer 3 */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_EXTRA_TWO] = LAYOUT_all( /* Layer 3 */
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};

View File

@@ -0,0 +1,3 @@
# The via keymap for 1894
For via configurator use

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,15 @@
# atxkb 1894
![atxkb 1894](https://i.imgur.com/epXYdPA.jpg)
1894 is a keyboard PCB supporting 60% layouts. It is a revised version of the [Voyager60](https://github.com/ai03-2725/Voyager60) pcb by [ai03](https://github.com/ai03-2725) that supports a JST connector instead of usb-c and has perimeter cutouts for gasket support. The Voyager60 and therefore the 1894 is compatible with ai03's [polaris](https://github.com/austexcn/qmk_firmware/tree/master/keyboards/ai03/polaris) QMK implementation and as such this is just a copy with edits to update the name.
* Keyboard Maintainer: [austexcn](https://github.com/austexcn)
* Hardware Supported: atxkb Moontower
* Hardware Availability: [atxkb](https://atxkb.com)
Make example for this keyboard (after setting up your build environment):
make atxkb/1894:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View File

@@ -0,0 +1,34 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
LTO_ENABLE = yes
LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_tsangan_hhkb

View File

@@ -0,0 +1,3 @@
# atxkb
Website: [atxkb](https://atxkb.com)

View File

@@ -1,46 +1,10 @@
/* Copyright 2020 yfuku
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#ifdef KEYBOARD_bat43_rev1
#include "rev1.h"
#endif
#ifdef KEYBOARD_bat43_rev2
#include "rev2.h"
#endif
#include "quantum.h"
/* This is a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
k10, k11, k12, k13, k14, k15, k30, k50, k51, k52, k53, k54, k55, \
k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
k33, k34, k35, k70, k71, k72, \
k74, k75, k73, k31, k32 \
) { \
{ k00, k01, k02, k03, k04, k05 }, \
{ k10, k11, k12, k13, k14, k15 }, \
{ k20, k21, k22, k23, k24, k25 }, \
{ k30, k31, k32, k33, k34, k35 }, \
{ k40, k41, k42, k43, k44, k45 }, \
{ k50, k51, k52, k53, k54, k55 }, \
{ k60, k61, k62, k63, k64, k65 }, \
{ k70, k71, k72, k73, k74, k75 }, \
}

View File

@@ -0,0 +1,17 @@
/* Copyright 2020 yfuku
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "rev1.h"

View File

@@ -0,0 +1,46 @@
/* Copyright 2020 yfuku
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* This is a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
k10, k11, k12, k13, k14, k15, k30, k50, k51, k52, k53, k54, k55, \
k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
k33, k34, k35, k70, k71, k72, \
k74, k75, k73, k31, k32 \
) { \
{ k00, k01, k02, k03, k04, k05 }, \
{ k10, k11, k12, k13, k14, k15 }, \
{ k20, k21, k22, k23, k24, k25 }, \
{ k30, k31, k32, k33, k34, k35 }, \
{ k40, k41, k42, k43, k44, k45 }, \
{ k50, k51, k52, k53, k54, k55 }, \
{ k60, k61, k62, k63, k64, k65 }, \
{ k70, k71, k72, k73, k74, k75 }, \
}

View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1,71 @@
{
"keyboard_name": "bat43",
"url": "",
"maintainer": "yfuku",
"width": 15,
"height": 5.1,
"layouts": {
"LAYOUT": {
"layout": [
{"label":"k00", "x":0, "y":1.43},
{"label":"k01", "x":1, "y":1.11},
{"label":"k02", "x":2, "y":0.38},
{"label":"k03", "x":3, "y":0},
{"label":"k04", "x":4, "y":0.05},
{"label":"k05", "x":5, "y":0.16},
{"label":"k40", "x":9, "y":0.16},
{"label":"k41", "x":10, "y":0.05},
{"label":"k42", "x":11, "y":0},
{"label":"k43", "x":12, "y":0.38},
{"label":"k44", "x":13, "y":1.11},
{"label":"k45", "x":14, "y":1.43},
{"label":"k10", "x":0, "y":2.43},
{"label":"k11", "x":1, "y":2.11},
{"label":"k12", "x":2, "y":1.38},
{"label":"k13", "x":3, "y":1},
{"label":"k14", "x":4, "y":1.05},
{"label":"k15", "x":5, "y":1.16},
{"label":"k30", "x":7, "y":1.16},
{"label":"k50", "x":9, "y":1.16},
{"label":"k51", "x":10, "y":1.05},
{"label":"k52", "x":11, "y":1},
{"label":"k53", "x":12, "y":1.38},
{"label":"k54", "x":13, "y":2.11},
{"label":"k55", "x":14, "y":2.43},
{"label":"k20", "x":0, "y":3.43},
{"label":"k21", "x":1, "y":3.11},
{"label":"k22", "x":2, "y":2.38},
{"label":"k23", "x":3, "y":2},
{"label":"k24", "x":4, "y":2.05},
{"label":"k25", "x":5, "y":2.16},
{"label":"k60", "x":9, "y":2.16},
{"label":"k61", "x":10, "y":2.05},
{"label":"k62", "x":11, "y":2},
{"label":"k63", "x":12, "y":2.38},
{"label":"k64", "x":13, "y":3.11},
{"label":"k65", "x":14, "y":3.43},
{"label":"k33", "x":4, "y":3.3},
{"label":"k34", "x":5, "y":3.3},
{"label":"k35", "x":6, "y":3.3},
{"label":"k70", "x":8, "y":3.3},
{"label":"k71", "x":9, "y":3.3},
{"label":"k72", "x":10, "y":3.3},
{"label":"k75", "x":5.1, "y":4.3, "w":0.8, "h":0.8},
{"label":"k74", "x":6.1, "y":4.3, "w":0.8, "h":0.8},
{"label":"k73", "x":8.1, "y":4.3, "w":0.8, "h":0.8},
{"label":"k31", "x":9.1, "y":4.3, "w":0.8, "h":0.8},
{"label":"k32", "x":10.1, "y":4.3, "w":0.8, "h":0.8}
]
}
}
}

View File

@@ -0,0 +1,17 @@
/* Copyright 2020 yfuku
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "rev2.h"

View File

@@ -0,0 +1,46 @@
/* Copyright 2020 yfuku
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
/* This is a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \
k10, k11, k12, k13, k14, k15, k30, k50, k51, k52, k53, k54, k55, \
k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \
k33, k34, k35, k70, k71, k72, \
k75, k74, k73, k31, k32 \
) { \
{ k00, k01, k02, k03, k04, k05 }, \
{ k10, k11, k12, k13, k14, k15 }, \
{ k20, k21, k22, k23, k24, k25 }, \
{ k30, k31, k32, k33, k34, k35 }, \
{ k40, k41, k42, k43, k44, k45 }, \
{ k50, k51, k52, k53, k54, k55 }, \
{ k60, k61, k62, k63, k64, k65 }, \
{ k70, k71, k72, k73, k74, k75 }, \
}

View File

@@ -0,0 +1 @@

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