summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/ChangeLog/20200829.md148
-rw-r--r--docs/_summary.md1
-rw-r--r--docs/adc_driver.md39
-rw-r--r--docs/breaking_changes.md15
-rw-r--r--docs/config_options.md8
-rw-r--r--docs/faq_build.md135
-rw-r--r--docs/faq_debug.md14
-rw-r--r--docs/feature_advanced_keycodes.md33
-rw-r--r--docs/feature_auto_shift.md2
-rw-r--r--docs/feature_backlight.md2
-rw-r--r--docs/feature_bluetooth.md12
-rw-r--r--docs/feature_debounce_type.md146
-rw-r--r--docs/feature_joystick.md147
-rw-r--r--docs/feature_oled_driver.md45
-rw-r--r--docs/feature_rgb_matrix.md22
-rw-r--r--docs/feature_rgblight.md35
-rw-r--r--docs/feature_split_keyboard.md7
-rw-r--r--docs/feature_tap_dance.md4
-rw-r--r--docs/flashing.md1
-rw-r--r--docs/getting_started_make_guide.md4
-rw-r--r--docs/hardware_keyboard_guidelines.md2
-rw-r--r--docs/ja/api_development_environment.md8
-rw-r--r--docs/ja/api_development_overview.md49
-rw-r--r--docs/ja/api_docs.md73
-rw-r--r--docs/ja/api_overview.md20
-rw-r--r--docs/ja/config_options.md8
-rw-r--r--docs/ja/faq_build.md2
-rw-r--r--docs/ja/faq_general.md2
-rw-r--r--docs/ja/faq_keymap.md2
-rw-r--r--docs/ja/feature_bluetooth.md8
-rw-r--r--docs/ja/feature_split_keyboard.md15
-rw-r--r--docs/ja/getting_started_make_guide.md4
-rw-r--r--docs/ja/how_a_matrix_works.md2
-rw-r--r--docs/ja/quantum_keycodes.md20
-rw-r--r--docs/ja/ref_functions.md122
-rw-r--r--docs/ja/reference_configurator_support.md202
-rw-r--r--docs/ja/reference_glossary.md173
-rw-r--r--docs/ja/reference_info_json.md78
-rw-r--r--docs/ja/reference_keymap_extras.md88
-rw-r--r--docs/ja/serial_driver.md75
-rw-r--r--docs/ja/support.md22
-rw-r--r--docs/ja/syllabus.md75
-rw-r--r--docs/ja/tap_hold.md195
-rw-r--r--docs/ja/translating.md60
-rw-r--r--docs/ja/understanding_qmk.md195
-rw-r--r--docs/mod_tap.md35
-rw-r--r--docs/other_vscode.md2
-rw-r--r--docs/platformdev_chibios_earlyinit.md19
-rw-r--r--docs/pr_checklist.md69
-rw-r--r--docs/ref_functions.md6
-rw-r--r--docs/reference_info_json.md2
-rw-r--r--docs/tap_hold.md42
-rw-r--r--docs/ws2812_driver.md3
53 files changed, 2191 insertions, 307 deletions
diff --git a/docs/ChangeLog/20200829.md b/docs/ChangeLog/20200829.md
new file mode 100644
index 0000000000..00e0bd1a28
--- /dev/null
+++ b/docs/ChangeLog/20200829.md
@@ -0,0 +1,148 @@
+# QMK Breaking Change - 2020 Aug 29 Changelog
+
+Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
+
+
+## Changes Requiring User Action :id=changes-requiring-user-action
+
+### Relocated Keyboards :id-relocated-keyboards
+
+#### The Key Company project consolidation ([#9547](https://github.com/qmk/qmk_firmware/pull/9547))
+#### relocating boards by flehrad to flehrad/ folder ([#9635](https://github.com/qmk/qmk_firmware/pull/9635))
+
+Keyboards released by The Key Company and keyboards designed by flehrad have moved to vendor folders. If you own any of the keyboards listed below, please use the new names to compile your firmware moving forward.
+
+Old Name | New Name
+:--------------------- | :------------------
+candybar/lefty | tkc/candybar/lefty
+candybar/righty | tkc/candybar/righty
+m0lly | tkc/m0lly
+tkc1800 | tkc/tkc1800
+bigswitch | flehrad/bigswitch
+handwired/downbubble | flehrad/downbubble
+handwired/numbrero | flehrad/numbrero
+snagpad | flehrad/snagpad
+handwired/tradestation | flehrad/tradestation
+
+### Updated Keyboard Codebases :id=keyboard-updates
+
+#### Keebio RGB wiring update ([#7754](https://github.com/qmk/qmk_firmware/pull/7754))
+
+This pull request changes the configuration for Keebio split boards to use the same RGB strip wiring for each half, which provides the following improvements:
+
+* Easier wiring due to one fewer wire needed (the wire between left DOut to extra data pin) and the fact that wiring is the same for both halves.
+* RGB LEDs can be controlled by each half now instead of just master half.
+* Extra data line is freed up to allow for I2C usage instead of serial.
+
+If you have customized the value of `RGBLED_SPLIT` for your keymap, you will need to undefine it using `#undef RGBLED_SPLIT` before defining it to your customized value.
+
+This change affects:
+
+* BFO-9000
+* Fourier
+* Iris rev2
+* Levinson, revs. 1 and 2
+* Nyquist, revs. 1 and 2
+* Quefrency rev1
+* Viterbi, revs. 1 and 2
+
+### Changes to Core Functionality :id=core-updates
+
+* Bigger Combo index ([#9318](https://github.com/qmk/qmk_firmware/pull/9318))
+
+Allows the Combo feature to support more than 256 combos.
+
+Any fork that uses `process_combo_event` needs to update the function's first argument to `uint16_t`:
+
+* Old function: `void process_combo_event(uint8_t combo_index, bool pressed)`
+* New function: `void process_combo_event(uint16_t combo_index, bool pressed)`
+
+
+## Core Changes :id=core-changes
+
+### Fixes :id=core-fixes
+
+* Mousekeys: scrolling acceleration is no longer coupled to mouse movement acceleration ([#9174](https://github.com/qmk/qmk_firmware/pull/9174))
+* Keymap Extras: correctly assign Question Mark in Czech layout ([#9987](https://github.com/qmk/qmk_firmware/pull/9987))
+
+### Additions and Enhancements :id=core-additions
+
+* allow for WS2812 PWM to work on DMAMUX-capable devices ([#9471](https://github.com/qmk/qmk_firmware/pull/9471))
+ * Newer STM32 MCUs have a DMAMUX peripheral, which allows mapping of DMAs to different DMA streams, rather than hard-defining the target streams in silicon.
+ * Affects STM32L4+ devices, as well as the soon-to-be-supported-by-QMK STM32G4/H7 families.
+ * Tested on F303/Proton C (ChibiOS v19, non-DMAMUX), G474 (ChibiOS v20, with DMAMUX).
+* dual-bank STM32 bootloader support ([#8778](https://github.com/qmk/qmk_firmware/pull/8778) and [#9738](https://github.com/qmk/qmk_firmware/pull/9738))
+ * Adds support for STM32 dual-bank flash bootloaders, by toggling a GPIO during early init in order to charge an RC circuit attached to `BOOT0`.
+ * The main rationale behind this is that dual-bank STM32 devices unconditionally execute user-mode code, regardless of whether or not the user-mode code jumps to the bootloader. If either flash bank is valid (and `BOOT0` is low), then the built-in bootloader will skip any sort of DFU.
+ * This PR allows for the initialisation sequencing to charge the RC circuit based on the example circuit posted on Discord, effectively pulling `BOOT0` high before issuing the system reset. As the RC circuit takes a while to discharge, the system reset executes the ROM bootloader which subsequently sees `BOOT0` high, and starts executing the DFU routines.
+ * Tested with STM32L082 (with current QMK+current ChibiOS), and STM32G474 (against ChibiOS 20.x).
+* update Space Cadet and Tap Dance features to use Custom Tapping Term when appropriate ([#6259](https://github.com/qmk/qmk_firmware/pull/6259))
+ * For the Tap Dance feature, this completely removes the need for the `ACTION_TAP_DANCE_FN_ADVANCED_TIME` dance.
+* HID Joystick Interface ([#4226](https://github.com/qmk/qmk_firmware/pull/4226) and [#9949](https://github.com/qmk/qmk_firmware/pull/9949 "Fix Joystick Compile Issues"))
+ * This implements a joystick feature, including a joystick_task function called from TMK, specific keycodes for joystick buttons and a USB HID interface.
+ * Tested on V-USB backend and Proton C; compiles but untested on LUFA.
+ * In order to test, you have to add `JOYSTICK_ENABLE = yes` to your `rules.mk` and
+ ```c
+ #define JOYSTICK_BUTTON_COUNT 8
+ #define JOYSTICK_AXES_COUNT 2
+ ```
+ in your config.h.
+* Christmas RGB Underglow animation now fades between green and red ([#7648](https://github.com/qmk/qmk_firmware/pull/7648))
+ * `RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL` has been greatly decreased; please check your animation if you have customized this value.
+* layer state now initializes on startup ([#8318](https://github.com/qmk/qmk_firmware/pull/8318))
+ * This should produce more consistent behavior between the two functions and layer masks.
+* added support for HSV->RGB conversion without using CIE curve ([#9856](https://github.com/qmk/qmk_firmware/pull/9856))
+* added NOEEPROM functions for RGB Matrix ([#9487](https://github.com/qmk/qmk_firmware/pull/9487))
+ * Added eeprom_helpers for toggle, mode, sethsv, speed, similar to rgblight versions.
+ * Added set_speed function.
+ * Added helper functions, similar to those in rgblight, in order to add NOEEPROM versions of toggle, step, hue, sat, val, and speed.
+ * Minor: spelling correction for EEPROM in a debug message.
+* flashing firmware using `st-flash` utility from [STLink Tools](https://github.com/stlink-org/stlink) is now supported ([#9964](https://github.com/qmk/qmk_firmware/pull/9964))
+* add ability to dump all makefile variables for the specified target ([#8256](https://github.com/qmk/qmk_firmware/pull/8256))
+ * Adds a new subtarget to builds, `dump_vars`, which allows for printing out all the variables that make knows about, after all substitutions occur.
+ * Example: `make handwired/onekey/proton_c:default:dump_vars`
+* add ability to change the Auto Shift timeout in real time ([#8441](https://github.com/qmk/qmk_firmware/pull/8441))
+* added a timer implementation for backlight on ChibiOS ([#8291](https://github.com/qmk/qmk_firmware/pull/8291))
+* added a third endpoint to V-USB keyboards ([#9020](https://github.com/qmk/qmk_firmware/pull/9020))
+* added a method to read the OLED display buffer from user space ([#8777](https://github.com/qmk/qmk_firmware/pull/8777))
+* K-Type refactor ([#9864](https://github.com/qmk/qmk_firmware/pull/9864))
+ * The K-Type has been refactored to use QMK's native matrix scanning routine, and now has partial support for the RGB Matrix feature.
+* Joysticks can now be used without defining analog pins ([#10169](https://github.com/qmk/qmk_firmware/pull/10169))
+
+### Clean-ups and Optimizations :id=core-optimizations
+
+* iWRAP protocol removed ([#9284](https://github.com/qmk/qmk_firmware/pull/9284))
+* work begun for consolidation of ChibiOS platform files ([#8327](https://github.com/qmk/qmk_firmware/pull/8327) and [#9315](https://github.com/qmk/qmk_firmware/pull/9315))
+ * Start of the consolidation work to move the ChibiOS board definitions as well as the default set of configuration files for existing board definitions used by keyboards.
+ * Uses `/platforms/chibios` as previously discussed on discord.
+ * Consolidates the Proton C configs into the generic F303 definitions.
+ * Allows for defining a default set of `chconf.h`, `halconf.h`, and `mcuconf.h` files within the platform definition, which is able to be overridden by the keyboard directly, though include path ordering.
+ * Adds template `chconf.h`, `halconf.h`, `mcuconf.h`, and `board.h` that can be dropped into a keyboard directory, in order to override rather than replace the entire contents of the respective files.
+ * Removed Proton C QMK board definitions, falling back to ChibiOS board definitions with QMK overrides.
+* Various tidy-ups for USB descriptor code ([#9005](https://github.com/qmk/qmk_firmware/pull/9005))
+ * Renamed `keyboard_led_stats` in lufa.c and ChibiOS usb_main.c to `keyboard_led_state`, as well as `vusb_keyboard_leds`, for consistency
+ * Formatted CDC and MIDI descriptors better
+ * Removed `ENDPOINT_CONFIG` macro, it seems pointless and removes the need for endpoint address defines in the middle of the endpoint numbering enum
+ * Fixed (possibly?) V-USB `GET_REPORT` request handling. Not sure about this one, but the existing code appears to always return an empty report - now `send_keyboard` sets this variable to the current report, matching what the LUFA code does.
+* converted `CONSUMER2BLUEFRUIT()` and `CONSUMER2RN42()` macros to static inline functions ([#9055](https://github.com/qmk/qmk_firmware/pull/9055))
+* Additional cleanups for V-USB code ([#9310](https://github.com/qmk/qmk_firmware/pull/9310))
+ * Removing the UART stuff entirely, now that we have Console support. Also fixing up various other things; switching some `debug()` calls to `dprintf()`, moved `raw_hid_report` out of the way so that we can implement the shared endpoint stuff.
+* removed inclusion of `adafruit_ble.h` from `ssd1306.c` ([#9355](https://github.com/qmk/qmk_firmware/pull/9355))
+* `outputselect.c` is no longer compiled if Bluetooth is disabled ([#9356](https://github.com/qmk/qmk_firmware/pull/9356))
+* `analogRead()` deprecated in favor of `analogReadPin()` ([#9023](https://github.com/qmk/qmk_firmware/pull/9023))
+* forcibly disable NKRO on V-USB controllers ([#9054](https://github.com/qmk/qmk_firmware/pull/9054))
+* removed warning if running backlight on STM32F072 ([#10040](https://github.com/qmk/qmk_firmware/pull/10040))
+* removed unused CORTEX_VTOR_INIT rules.mk option ([#10053](https://github.com/qmk/qmk_firmware/pull/10053))
+* improved handling for enabling Link Time Optimization ([#9832](https://github.com/qmk/qmk_firmware/pull/9832))
+* streamline rules for supporting Kiibohd bootloader ([#10129](https://github.com/qmk/qmk_firmware/pull/10129))
+* Define `STM32_DMA_REQUIRED` when using DMA-based WS2812 driver on STM32 ([#10127](https://github.com/qmk/qmk_firmware/pull/10127))
+* fix DMA stream ID calculation in ws2812_pwm ([#10008](https://github.com/qmk/qmk_firmware/pull/10008))
+* remove support for Adafruit EZ Key Bluetooth controller ([#10103](https://github.com/qmk/qmk_firmware/pull/10103))
+
+
+## QMK Infrastructure and Internals :id=qmk-internals
+
+* Attempt to fix CI for non-master branches. ([#9308](https://github.com/qmk/qmk_firmware/pull/9308))
+ * Actually fetch the branch we're attempting to compare against.
+* Run `qmk cformat` on `develop` branch ([#9501](https://github.com/qmk/qmk_firmware/pull/9501))
+* minor refactor of Bluetooth API ([#9905](https://github.com/qmk/qmk_firmware/pull/9905))
diff --git a/docs/_summary.md b/docs/_summary.md
index 9ed55a3d06..0c43712159 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -103,6 +103,7 @@
* [DIP Switch](feature_dip_switch.md)
* [Encoders](feature_encoders.md)
* [Haptic Feedback](feature_haptic_feedback.md)
+ * [Joystick](feature_joystick.md)
* [Proton C Conversion](proton_c_conversion.md)
* [PS/2 Mouse](feature_ps2_mouse.md)
* [Split Keyboard](feature_split_keyboard.md)
diff --git a/docs/adc_driver.md b/docs/adc_driver.md
index f8fb94094e..6e3d513863 100644
--- a/docs/adc_driver.md
+++ b/docs/adc_driver.md
@@ -45,9 +45,9 @@ Then place this include at the top of your code:
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
-Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-based, whereas the F3 has 4 ADCs and the channels are 1 based. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
+Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-indexed, whereas the F3 has 4 ADCs and the channels are 1-indexed. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
-|ADC|Channel|STM32F0XX|STM32F3XX|
+|ADC|Channel|STM32F0xx|STM32F3xx|
|---|-------|---------|---------|
|1 |0 |`A0` | |
|1 |1 |`A1` |`A0` |
@@ -122,32 +122,29 @@ Also note that the F0 and F3 use different numbering schemes. The F0 has a singl
|Function |Description |
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
-|`analogRead(pin)` |Reads the value from the specified Arduino pin, eg. `4` for ADC6 on the ATmega32U4. |
-|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `F6` for ADC6 on the ATmega32U4. |
-|`pinToMux(pin)` |Translates a given QMK pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
+|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `F6` for ADC6 on the ATmega32U4. |
+|`pinToMux(pin)` |Translates a given pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
### ARM
-Note that care was taken to match all of the functions used for AVR devices, however complications in the ARM platform prevent that from always being possible. For example, the `STM32` chips do not have assigned Arduino pins. We could use the default pin numbers, but those numbers change based on the package type of the device. For this reason, please specify your target pins with their identifiers (`A0`, `F3`, etc.). Also note that there are some variants of functions that accept the target ADC for the pin. Some pins can be used for multiple ADCs, and this specified can help you pick which ADC will be used to interact with that pin.
-
-|Function |Description |
-|----------------------------|--------------------------------------------------------------------------------------------------------------------|
-|`analogReadPin(pin)` |Reads the value from the specified QMK pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
-|`analogReadPinAdc(pin, adc)`|Reads the value from the specified QMK pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function.|
-|`pinToMux(pin)` |Translates a given QMK pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)".|
-|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and adc combination. See your MCU's datasheet for more information.|
+|Function |Description |
+|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
+|`analogReadPinAdc(pin, adc)`|Reads the value from the specified pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function. |
+|`pinToMux(pin)` |Translates a given pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)". |
+|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and ADC combination. See your MCU's datasheet for more information. |
## Configuration
## ARM
-The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates.
+The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.
-|`#define` |Type |Default |Description|
-|-------------------|------|---------------------|-----------|
-|ADC_CIRCULAR_BUFFER|`bool`|`false` |If `TRUE`, then the implementation will use a circular buffer.|
-|ADC_NUM_CHANNELS |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`.|
-|ADC_BUFFER_DEPTH |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to `2` bytes so we can contain our one value. This could be set to 1 if you opt for a 8-bit or lower result.|
-|ADC_SAMPLING_RATE |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
-|ADC_RESOLUTION |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.|
+|`#define` |Type |Default |Description |
+|---------------------|------|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |If `true`, then the implementation will use a circular buffer. |
+|`ADC_NUM_CHANNELS` |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`. |
+|`ADC_BUFFER_DEPTH` |`int` |`2` |Sets the depth of each result. Since we are only getting a 12-bit result by default, we set this to 2 bytes so we can contain our one value. This could be set to 1 if you opt for an 8-bit or lower result.|
+|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. |
+|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_12BIT`|The resolution of your result. We choose 12 bit by default, but you can opt for 12, 10, 8, or 6 bit. |
diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md
index 154695ddac..abace81648 100644
--- a/docs/breaking_changes.md
+++ b/docs/breaking_changes.md
@@ -6,22 +6,23 @@ The breaking change period is when we will merge PR's that change QMK in dangero
## What has been included in past Breaking Changes?
+* [2020 Aug 29](ChangeLog/20200829.md)
* [2020 May 30](ChangeLog/20200530.md)
* [2020 Feb 29](ChangeLog/20200229.md)
* [2019 Aug 30](ChangeLog/20190830.md)
## When is the next Breaking Change?
-The next Breaking Change is scheduled for Aug 29, 2020.
+The next Breaking Change is scheduled for November 28, 2020.
### Important Dates
-* [x] 2020 May 30 - `develop` is created. It will be rebased weekly.
-* [ ] 2020 Aug 1 - `develop` closed to new PR's.
-* [ ] 2020 Aug 1 - Call for testers.
-* [ ] 2020 Aug 27 - `master` is locked, no PR's merged.
-* [ ] 2020 Aug 29 - Merge `develop` to `master`.
-* [ ] 2020 Aug 29 - `master` is unlocked. PR's can be merged again.
+* [x] 2020 Aug 29 - `develop` is created. It will be rebased weekly.
+* [ ] 2020 Oct 31 - `develop` closed to new PR's.
+* [ ] 2020 Oct 31 - Call for testers.
+* [ ] 2020 Nov 26 - `master` is locked, no PR's merged.
+* [ ] 2020 Nov 28 - Merge `develop` to `master`.
+* [ ] 2020 Nov 28 - `master` is unlocked. PR's can be merged again.
## What changes will be included?
diff --git a/docs/config_options.md b/docs/config_options.md
index 81a3b4b61c..f9b1cc6578 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -324,11 +324,9 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
```
* `LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
-* `LINK_TIME_OPTIMIZATION_ENABLE`
+* `LTO_ENABLE`
* Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
However, this will automatically disable the legacy TMK Macros and Functions features, as these break when LTO is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`. (Note: This does not affect QMK [Macros](feature_macros.md) and [Layers](feature_layers.md).)
-* `LTO_ENABLE`
- * Has the same meaning as `LINK_TIME_OPTIMIZATION_ENABLE`. You can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
## AVR MCU Options
* `MCU = atmega32u4`
@@ -373,10 +371,8 @@ Use these to enable or disable building certain features. The more you have enab
* MIDI controls
* `UNICODE_ENABLE`
* Unicode
-* `BLUETOOTH_ENABLE`
- * Legacy option to Enable Bluetooth with the Adafruit EZ-Key HID. See BLUETOOTH
* `BLUETOOTH`
- * Current options are AdafruitEzKey, AdafruitBLE, RN42
+ * Current options are AdafruitBLE, RN42
* `SPLIT_KEYBOARD`
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
* `CUSTOM_MATRIX`
diff --git a/docs/faq_build.md b/docs/faq_build.md
index e2d0f9b27a..131844a2b7 100644
--- a/docs/faq_build.md
+++ b/docs/faq_build.md
@@ -13,63 +13,74 @@ An example of using `sudo`, when your controller is ATMega32u4:
or just:
- $ sudo make <keyboard>:<keymap>:dfu
+ $ sudo make <keyboard>:<keymap>:flash
Note that running `make` with `sudo` is generally ***not*** a good idea, and you should use one of the former methods, if possible.
### Linux `udev` Rules
-On Linux, you'll need proper privileges to access the MCU. You can either use
-`sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`. Once added run the following:
-```console
-sudo udevadm control --reload-rules
-sudo udevadm trigger
-```
-**/etc/udev/rules.d/50-atmel-dfu.rules:**
-```
-# Atmel ATMega32U4
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", TAG+="uaccess", RUN{builtin}+="uaccess"
-# Atmel USBKEY AT90USB1287
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", TAG+="uaccess", RUN{builtin}+="uaccess"
-# Atmel ATMega32U2
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", TAG+="uaccess", RUN{builtin}+="uaccess"
+On Linux, you'll need proper privileges to communicate with the bootloader device. You can either use `sudo` when flashing firmware, or place this file in `/etc/udev/rules.d/`:
+
+**/etc/udev/rules.d/50-qmk.rules:**
```
+# Atmel DFU
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FEF", TAG+="uaccess", RUN{builtin}+="uaccess" # ATmega16U2
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FF0", TAG+="uaccess", RUN{builtin}+="uaccess" # ATmega32U2
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FF3", TAG+="uaccess", RUN{builtin}+="uaccess" # ATmega16U4
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FF4", TAG+="uaccess", RUN{builtin}+="uaccess" # ATmega32U4
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FF9", TAG+="uaccess", RUN{builtin}+="uaccess" # AT90USB64
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="2FFB", TAG+="uaccess", RUN{builtin}+="uaccess" # AT90USB128
-**/etc/udev/rules.d/54-input-club-keyboard.rules:**
+# Input Club
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1C11", ATTRS{idProduct}=="B007", TAG+="uaccess", RUN{builtin}+="uaccess"
-```
-# Input Club keyboard bootloader
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b007", TAG+="uaccess", RUN{builtin}+="uaccess"
-```
+# STM32duino
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1EAF", ATTRS{idProduct}=="0003", TAG+="uaccess", RUN{builtin}+="uaccess"
+# STM32 DFU
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="DF11", TAG+="uaccess", RUN{builtin}+="uaccess"
-**/etc/udev/rules.d/55-caterina.rules:**
-```
-# ModemManager should ignore the following devices
-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"
-```
+# BootloadHID
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="16C0", ATTRS{idProduct}=="05DF", TAG+="uaccess", RUN{builtin}+="uaccess"
-**Note:** With older (before 1.12) ModemManager, filtering only works when not in strict mode, the following commands can update that settings:
-```console
-printf '[Service]\nExecStart=\nExecStart=/usr/sbin/ModemManager --filter-policy=default' | sudo tee /etc/systemd/system/ModemManager.service.d/policy.conf
-sudo systemctl daemon-reload
-sudo systemctl restart ModemManager
-```
+# USBAspLoader
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="16C0", ATTRS{idProduct}=="05DC", TAG+="uaccess", RUN{builtin}+="uaccess"
+
+# ModemManager should ignore the following devices
+# Atmel SAM-BA (Massdrop)
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="03EB", ATTRS{idProduct}=="6124", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"
+
+# Caterina (Pro Micro)
+# Spark Fun Electronics
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1B4F", ATTRS{idProduct}=="9203", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Pro Micro 3V3/8MHz
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1B4F", ATTRS{idProduct}=="9205", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Pro Micro 5V/16MHz
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1B4F", ATTRS{idProduct}=="9207", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # LilyPad 3V3/8MHz (and some Pro Micro clones)
+# Pololu Electronics
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="1FFB", ATTRS{idProduct}=="0101", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # A-Star 32U4
+# Arduino SA
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0036", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Leonardo
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0037", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Micro
+# Adafruit Industries LLC
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="239A", ATTRS{idProduct}=="000C", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Feather 32U4
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="239A", ATTRS{idProduct}=="000D", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # ItsyBitsy 32U4 3V3/8MHz
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="239A", ATTRS{idProduct}=="000E", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # ItsyBitsy 32U4 5V/16MHz
+# dog hunter AG
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2A03", ATTRS{idProduct}=="0036", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Leonardo
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="2A03", ATTRS{idProduct}=="0037", TAG+="uaccess", RUN{builtin}+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" # Micro
+```
+
+Once added, run the following:
-**/etc/udev/rules.d/56-dfu-util.rules:**
```
-# stm32duino
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", TAG+="uaccess", RUN{builtin}+="uaccess"
-# Generic stm32
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", TAG+="uaccess", RUN{builtin}+="uaccess"
+sudo udevadm control --reload-rules
+sudo udevadm trigger
```
-**/etc/udev/rules.d/57-bootloadhid.rules:**
+**Note:** With older versions of ModemManager (< 1.12), filtering only works when not in strict mode. The following commands can update that setting:
+
```
-# bootloadHID
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", TAG+="uaccess", RUN{builtin}+="uaccess"
+printf '[Service]\nExecStart=\nExecStart=/usr/sbin/ModemManager --filter-policy=default' | sudo tee /etc/systemd/system/ModemManager.service.d/policy.conf
+sudo systemctl daemon-reload
+sudo systemctl restart ModemManager
```
### Serial device is not detected in bootloader mode on Linux
@@ -96,46 +107,6 @@ You can buy a really unique VID:PID here. I don't think you need this for person
- http://www.obdev.at/products/vusb/license.html
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
-## BOOTLOADER_SIZE for AVR
-Note that Teensy2.0++ bootloader size is 2048byte. Some Makefiles may have wrong comment.
-
-```
-# Boot Section Size in *bytes*
-# Teensy halfKay 512
-# Teensy++ halfKay 2048
-# Atmel DFU loader 4096 (TMK Alt Controller)
-# LUFA bootloader 4096
-# USBaspLoader 2048
-OPT_DEFS += -DBOOTLOADER_SIZE=2048
-```
-
-## `avr-gcc: internal compiler error: Abort trap: 6 (program cc1)` on MacOS
-
-This is an issue with updating on brew, causing symlinks that avr-gcc depend on getting mangled.
-
-The solution is to remove and reinstall all affected modules.
-
-```
-brew rm avr-gcc avr-gcc@8 dfu-programmer dfu-util gcc-arm-none-eabi arm-gcc-bin@8 avrdude qmk
-brew install qmk/qmk/qmk
-brew link --force avr-gcc@8
-brew link --force arm-gcc-bin@8
-```
-
-### `avr-gcc` and LUFA
-
-If you updated your `avr-gcc` and you see errors involving LUFA, for example:
-
-`lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h:380:5: error: 'const' attribute on function returning 'void'`
-
-For now, you need to rollback `avr-gcc` to 8 in Homebrew.
-
-```
-brew uninstall --force avr-gcc
-brew install avr-gcc@8
-brew link --force avr-gcc@8
-```
-
### I just flashed my keyboard and it does nothing/keypresses don't register - it's also ARM (rev6 planck, clueboard 60, hs60v2, etc...) (Feb 2019)
Due to how EEPROM works on ARM based chips, saved settings may no longer be valid. This affects the default layers, and *may*, under certain circumstances we are still figuring out, make the keyboard unusable. Resetting the EEPROM will correct this.
diff --git a/docs/faq_debug.md b/docs/faq_debug.md
index 08c84fe4fd..7d5473678b 100644
--- a/docs/faq_debug.md
+++ b/docs/faq_debug.md
@@ -31,20 +31,6 @@ Check:
- try using 'print' function instead of debug print. See **common/print.h**.
- disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
-## Linux or UNIX Like System Requires Super User Privilege
-Just use 'sudo' to execute *hid_listen* with privilege.
-```
-$ sudo hid_listen
-```
-
-Or add an *udev rule* for TMK devices with placing a file in rules directory. The directory may vary on each system.
-
-File: /etc/udev/rules.d/52-tmk-keyboard.rules(in case of Ubuntu)
-```
-# tmk keyboard products https://github.com/tmk/tmk_keyboard
-SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
-```
-
***
# Miscellaneous
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index b8664074a7..745308b29e 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -2,21 +2,24 @@
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
-|Key |Aliases |Description |
-|----------|-------------------------------|----------------------------------------------------|
-|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
-|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
-|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
-|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
-|`RCTL(kc)`| |Hold Right Control and press `kc` |
-|`RSFT(kc)`| |Hold Right Shift and press `kc` |
-|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
-|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
-|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
-|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
-|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
-|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
-|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`|
+|Key |Aliases |Description |
+|----------|-------------------------------|------------------------------------------------------|
+|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
+|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
+|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
+|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
+|`RCTL(kc)`| |Hold Right Control and press `kc` |
+|`RSFT(kc)`| |Hold Right Shift and press `kc` |
+|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
+|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI and press `kc` |
+|`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)` |Hold Left Shift and GUI and press `kc` |
+|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
+|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
+|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` |
+|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
+|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
+|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
+|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` |
You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
diff --git a/docs/feature_auto_shift.md b/docs/feature_auto_shift.md
index f0b507bc61..b21a7690d9 100644
--- a/docs/feature_auto_shift.md
+++ b/docs/feature_auto_shift.md
@@ -139,7 +139,7 @@ completely normal and with no intention of shifted keys.
`KC_ASRP`. The keyboard will type by itself the value of your
`AUTO_SHIFT_TIMEOUT`.
7. Update `AUTO_SHIFT_TIMEOUT` in your `config.h` with the value reported.
-8. Remove `AUTO_SHIFT_SETUP` from your `config.h`.
+8. Add `AUTO_SHIFT_NO_SETUP` to your `config.h`.
9. Remove the key bindings `KC_ASDN`, `KC_ASUP` and `KC_ASRP`.
10. Compile and upload your new firmware.
diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md
index 9e467c708a..6bb2bbed84 100644
--- a/docs/feature_backlight.md
+++ b/docs/feature_backlight.md
@@ -160,8 +160,6 @@ See the ST datasheet for your particular MCU to determine these values. Unless y
Currently only hardware PWM is supported, not timer assisted, and does not provide automatic configuration.
-?> Backlight support for STM32F072 has had limited testing, so YMMV. If unsure, set `BACKLIGHT_ENABLE = no` in your `rules.mk`.
-
### Software PWM Driver :id=software-pwm-driver
In this mode, PWM is "emulated" while running other keyboard tasks. It offers maximum hardware compatibility without extra platform configuration. The tradeoff is the backlight might jitter when the keyboard is busy. To enable, add this to your `rules.mk`:
diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md
index 6cd5c3c6cf..08e5f24ac5 100644
--- a/docs/feature_bluetooth.md
+++ b/docs/feature_bluetooth.md
@@ -2,11 +2,10 @@
## Bluetooth Known Supported Hardware
-Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules and the Bluefruit EZ-Key, the latter of which is not produced anymore. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
+Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QMK has support for RN-42 modules. For more recent BLE protocols, currently only the Adafruit Bluefruit SPI Friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support mouse input.
|Board |Bluetooth Protocol |Connection Type |rules.mk |Bluetooth Chip|
|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------|
-|[Adafruit EZ-Key HID](https://www.adafruit.com/product/1535) |Bluetooth Classic | UART |`BLUETOOTH = AdafruitEZKey` | |
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART |`BLUETOOTH = RN42` | RN-42 |
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI |`BLUETOOTH = AdafruitBLE` | nRF51822 |
@@ -24,16 +23,15 @@ Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
-## Adafruit EZ-Key hid
-This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will.
-
<!-- FIXME: Document bluetooth support more completely. -->
## Bluetooth Rules.mk Options
-Use only one of these
+
+The currently supported Bluetooth chipsets do not support [N-Key Rollover (NKRO)](reference_glossary.md#n-key-rollover-nkro), so `rules.mk` must contain `NKRO_ENABLE = no`.
+
+Use only one of these to enable Bluetooth:
* BLUETOOTH_ENABLE = yes (Legacy Option)
* BLUETOOTH = RN42
-* BLUETOOTH = AdafruitEZKey
* BLUETOOTH = AdafruitBLE
## Bluetooth Keycodes
diff --git a/docs/feature_debounce_type.md b/docs/feature_debounce_type.md
index 65b4ea1e53..83ebafe60e 100644
--- a/docs/feature_debounce_type.md
+++ b/docs/feature_debounce_type.md
@@ -1,43 +1,151 @@
-# Debounce algorithm
+# Contact bounce / contact chatter
-QMK supports multiple debounce algorithms through its debounce API.
+Mechanical switches often don't have a clean single transition between pressed and unpressed states.
+
+In an ideal world, when you press a switch, you would expect the digital pin to see something like this:
+(X axis showing time
+```
+voltage +----------------------
+ ^ |
+ | |
+ | ------------------+
+ ----> time
+```
+
+However in the real world you will actually see contact bounce, which will look like multiple 1->0 and 0->1 transitions,
+until the value finally settles.
+```
+ +-+ +--+ +-------------
+ | | | | |
+ | | | | |
++-----------------+ +-+ +-+
+```
+The time it takes for the switch to settle might vary with switch type, age, and even pressing technique.
+
+If the device chooses not to mitigate contact bounce, then often actions that happen when the switch is pressed are repeated
+multiple times.
+
+There are many ways to handle contact bounce ("Debouncing"). Some include employing additional hardware, for example an RC filter,
+while there are various ways to do debouncing in software too, often called debounce algorithms. This page discusses software
+debouncing methods available in QMK.
+
+While technically not considered contact bounce/contact chatter, some switch technologies are susceptible to noise, meaning,
+while the key is not changing state, sometimes short random 0->1 or 1->0 transitions might be read by the digital circuit, for example:
+```
+ +-+
+ | |
+ | |
++-----------------+ +--------------------
+```
+
+Many debounce methods (but not all) will also make the device resistant to noise. If you are working with a technology that is
+susceptible to noise, you must choose a debounce method that will also mitigate noise for you.
+
+## Types of debounce algorithms
-The logic for which debounce method called is below. It checks various defines that you have set in rules.mk
+1) Unit of time: Timestamp (milliseconds) vs Cycles (scans)
+ * Debounce algorithms often have a 'debounce time' parameter, that specifies the maximum settling time of the switch contacts.
+ This time might be measured in various units:
+ * Cycles-based debouncing waits n cycles (scans), decreasing count by one each matrix_scan
+ * Timestamp-based debouncing stores the millisecond timestamp a change occurred, and does substraction to figure out time elapsed.
+ * Timestamp-based debouncing is usually superior, especially in the case of noise-resistant devices because settling times of physical
+ switches is specified in units of time, and should not depend on the matrix scan-rate of the keyboard.
+ * Cycles-based debouncing is sometimes considered inferior, because the settling time that it is able to compensate for depends on the
+ performance of the matrix scanning code. If you use cycles-based debouncing, and you significantly improve the performance of your scanning
+ code, you might end up with less effective debouncing. A situation in which cycles-based debouncing might be preferable is when
+ noise is present, and the scanning algorithm is slow, or variable speed. Even if your debounce algorithm is fundamentally noise-resistant,
+ if the scanning is slow, and you are using a timestamp-based algorithm, you might end up making a debouncing decision based on only two
+ sampled values, which will limit the noise-resistance of the algorithm.
+ * Currently all built-in debounce algorithms support timestamp-based debouncing only. In the future we might
+ implement cycles-based debouncing, and it will be selectable via a ```config.h``` macro.
+
+2) Symmetric vs Asymmetric
+ * Symmetric - apply the same debouncing algorithm, to both key-up and key-down events.
+ * Recommended naming convention: ```sym_*```
+ * Asymmetric - apply different debouncing algorithms to key-down and key-up events. E.g. Eager key-down, Defer key-up.
+ * Recommended naming convention: ```asym_*``` followed by details of the type of algorithm in use, in order, for key-down and then key-up
+
+3) Eager vs Defer
+ * Eager - any key change is reported immediately. All further inputs for DEBOUNCE ms are ignored.
+ * Eager algorithms are not noise-resistant.
+ * Recommended naming conventions:
+ * ```sym_eager_*```
+ * ```asym_eager_*_*```: key-down is using eager algorithm
+ * ```asym_*_eager_*```: key-up is using eager algorithm
+ * Defer - wait for no changes for DEBOUNCE ms before reporting change.
+ * Defer algorithms are noise-resistant
+ * Recommended naming conventions:
+ * ```sym_defer_*```
+ * ```asym_defer_*_*```: key-down is using eager algorithm
+ * ```asym_*_defer_*```: key-up is using eager algorithm
+
+4) Global vs Per-Key vs Per-Row
+ * Global - one timer for all keys. Any key change state affects global timer
+ * Recommended naming convention: ```*_g```
+ * Per-key - one timer per key
+ * Recommended naming convention: ```*_pk```
+ * Per-row - one timer per row
+ * Recommended naming convention: ```*_pr```
+ * Per-key and per-row algorithms consume more resources (in terms of performance,
+ and ram usage), but fast typists might prefer them over global.
+
+## Debounce algorithms supported by QMK
+
+QMK supports multiple debounce algorithms through its debounce API.
+The logic for which debounce method called is below. It checks various defines that you have set in ```rules.mk```
```
DEBOUNCE_DIR:= $(QUANTUM_DIR)/debounce
-DEBOUNCE_TYPE?= sym_g
+DEBOUNCE_TYPE?= sym_defer_g
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
QUANTUM_SRC += $(DEBOUNCE_DIR)/$(strip $(DEBOUNCE_TYPE)).c
endif
```
-# Debounce selection
+### Debounce selection
| DEBOUNCE_TYPE | Description | What else is needed |
| ------------- | --------------------------------------------------- | ----------------------------- |
-| Not defined | Use the default algorithm, currently sym_g | Nothing |
+| Not defined | Use the default algorithm, currently sym_defer_g | Nothing |
| custom | Use your own debounce code | ```SRC += debounce.c``` add your own debounce.c and implement necessary functions |
-| anything_else | Use another algorithm from quantum/debounce/* | Nothing |
+| Anything Else | Use another algorithm from quantum/debounce/* | Nothing |
**Regarding split keyboards**:
The debounce code is compatible with split keyboards.
-# Use your own debouncing code
-* Set ```DEBOUNCE_TYPE = custom```.
-* Add ```SRC += debounce.c```
+### Selecting an included debouncing method
+Keyboards may select one of the already implemented debounce methods, by adding to ```rules.mk``` the following line:
+```
+DEBOUNCE_TYPE = <name of algorithm>
+```
+Where name of algorithm is one of:
+* ```sym_defer_g``` - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE``` milliseconds of no changes has occurred, all input changes are pushed.
+ * This is the current default algorithm. This is the highest performance algorithm with lowest memory usage, and it's also noise-resistant.
+* ```sym_eager_pr``` - debouncing per row. On any state change, response is immediate, followed by locking the row ```DEBOUNCE``` milliseconds of no further input for that row.
+For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
+appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
+* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
+* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
+
+### A couple algorithms that could be implemented in the future:
+* ```sym_defer_pr```
+* ```sym_eager_g```
+* ```asym_eager_defer_pk```
+
+### Use your own debouncing code
+You have the option to implement you own debouncing algorithm. To do this:
+* Set ```DEBOUNCE_TYPE = custom``` in ```rules.mk```.
+* Add ```SRC += debounce.c``` in ```rules.mk```
* Add your own ```debounce.c```. Look at current implementations in ```quantum/debounce``` for examples.
* Debouncing occurs after every raw matrix scan.
* Use num_rows rather than MATRIX_ROWS, so that split keyboards are supported correctly.
+* If the algorithm might be applicable to other keyboards, please consider adding it to ```quantum/debounce```
-# Changing between included debouncing methods
-You can either use your own code, by including your own debounce.c, or switch to another included one.
-Included debounce methods are:
-* eager_pr - debouncing per row. On any state change, response is immediate, followed by locking the row ```DEBOUNCE``` milliseconds of no further input for that row.
-For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
-appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
-* eager_pk - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
-* sym_g - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE``` milliseconds of no changes has occured, all input changes are pushed.
-* sym_pk - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occured on that key, the key status change is pushed.
+### Old names
+The following old names for existing algorithms will continue to be supported, however it is recommended to use the new names instead.
+* sym_g - old name for sym_defer_g
+* eager_pk - old name for sym_eager_pk
+* sym_pk - old name for sym_defer_pk
+* eager_pr - old name for sym_eager_pr
diff --git a/docs/feature_joystick.md b/docs/feature_joystick.md
new file mode 100644
index 0000000000..be3c781f6c
--- /dev/null
+++ b/docs/feature_joystick.md
@@ -0,0 +1,147 @@
+## Joystick
+
+The keyboard can be made to be recognized as a joystick HID device by the operating system.
+
+This is enabled by adding `JOYSTICK_ENABLE` to `rules.mk`. You can set this value to `analog`, `digital`, or `no`.
+
+!> Joystick support is not currently available on V-USB devices.
+
+The joystick feature provides two services:
+ * reading analog input devices (eg. potentiometers)
+ * sending gamepad HID reports
+
+Both services can be used without the other, depending on whether you just want to read a device but not send gamepad reports (for volume control for instance)
+or send gamepad reports based on values computed by the keyboard.
+
+### Analog Input
+
+To use analog input you must first enable it in `rules.mk`:
+
+```makefile
+JOYSTICK_ENABLE = analog
+```
+
+An analog device such as a potentiometer found on a gamepad's analog axes is based on a [voltage divider](https://en.wikipedia.org/wiki/Voltage_divider).
+It is composed of three connectors linked to the ground, the power input and power output (usually the middle one). The power output holds the voltage that varies based on the position of the cursor,
+which value will be read using your MCU's [ADC](https://en.wikipedia.org/wiki/Analog-to-digital_converter).
+Depending on which pins are already used by your keyboard's matrix, the rest of the circuit can get a little bit more complicated,
+feeding the power input and ground connection through pins and using diodes to avoid bad interactions with the matrix scanning procedures.
+
+### Configuring the Joystick
+
+By default, two axes and eight buttons are defined. This can be changed in your `config.h`:
+
+```c
+// Max 32
+#define JOYSTICK_BUTTON_COUNT 16
+// Max 6: X, Y, Z, Rx, Ry, Rz
+#define JOYSTICK_AXES_COUNT 3
+```
+
+When defining axes for your joystick, you have to provide a definition array. You can do this from your keymap.c file.
+A joystick will either be read from an input pin that allows the use of the ADC, or can be virtual, so that its value is provided by your code.
+You have to define an array of type ''joystick_config_t'' and of proper size.
+
+There are three ways for your circuit to work with the ADC, that relies on the use of 1, 2 or 3 pins of the MCU:
+ * 1 pin: your analog device is directly connected to your device GND and VCC. The only pin used is the ADC pin of your choice.
+ * 2 pins: your analog device is powered through a pin that allows toggling it on or off. The other pin is used to read the input value through the ADC.
+ * 3 pins: both the power input and ground are connected to pins that must be set to a proper state before reading and restored afterwards.
+
+The configuration of each axis is performed using one of four macros:
+ * `JOYSTICK_AXIS_VIRTUAL`: no ADC reading must be performed, that value will be provided by keyboard/keymap-level code
+ * `JOYSTICK_AXIS_IN(INPUT_PIN, LOW, REST, HIGH)`: a voltage will be read on the provided pin, which must be an ADC-capable pin.
+ * `JOYSTICK_AXIS_IN_OUT(INPUT_PIN, OUTPUT_PIN, LOW, REST, HIGH)`: the provided `OUTPUT_PIN` will be set high before `INPUT_PIN` is read.
+ * `JOYSTICK_AXIS_IN_OUT_GROUND(INPUT_PIN, OUTPUT_PIN, GROUND_PIN, LOW, REST, HIGH)`: the `OUTPUT_PIN` will be set high and `GROUND_PIN` will be set low before reading from `INPUT_PIN`.
+
+In any case where an ADC reading takes place (when `INPUT_PIN` is provided), additional `LOW`, `REST` and `HIGH` parameters are used.
+These implement the calibration of the analog device by defining the range of read values that will be mapped to the lowest, resting position and highest possible value for the axis (-127 to 127).
+In practice, you have to provide the lowest/highest raw ADC reading, and the raw reading at resting position, when no deflection is applied. You can provide inverted `LOW` and `HIGH` to invert the axis.
+
+For instance, an axes configuration can be defined in the following way:
+
+```c
+//joystick config
+joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
+ [0] = JOYSTICK_AXIS_IN_OUT_GROUND(A4, B0, A7, 900, 575, 285),
+ [1] = JOYSTICK_AXIS_VIRTUAL
+};
+```
+
+When the ADC reads 900 or higher, the returned axis value will be -127, whereas it will be 127 when the ADC reads 285 or lower. Zero is returned when 575 is read.
+
+In this example, the first axis will be read from the `A4` pin while `B0` is set high and `A7` is set low, using `analogReadPin()`, whereas the second axis will not be read.
+
+In order to give a value to the second axis, you can do so in any customizable entry point: as an action, in `process_record_user()` or in `matrix_scan_user()`, or even in `joystick_task()` which is called even when no key has been pressed.
+You assign a value by writing to `joystick_status.axes[axis_index]` a signed 8-bit value (ranging from -127 to 127). Then it is necessary to assign the flag `JS_UPDATED` to `joystick_status.status` in order for an updated HID report to be sent.
+
+The following example writes two axes based on keypad presses, with `KC_P5` as a precision modifier:
+
+```c
+#ifdef ANALOG_JOYSTICK_ENABLE
+static uint8_t precision_val = 70;
+static uint8_t axesFlags = 0;
+enum axes {
+ Precision = 1,
+ Axis1High = 2,
+ Axis1Low = 4,
+ Axis2High = 8,
+ Axis2Low = 16
+};
+#endif
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch(keycode) {
+#ifdef ANALOG_JOYSTICK_ENABLE
+ // virtual joystick
+# if JOYSTICK_AXES_COUNT > 1
+ case KC_P8:
+ if (record->event.pressed) {
+ axesFlags |= Axis2Low;
+ } else {
+ axesFlags &= ~Axis2Low;
+ }
+ joystick_status.status |= JS_UPDATED;
+ break;
+ case KC_P2:
+ if (record->event.pressed) {
+ axesFlags |= Axis2High;
+ } else {
+ axesFlags &= ~Axis2High;
+ }
+ joystick_status.status |= JS_UPDATED;
+ break;
+# endif
+ case KC_P4:
+ if (record->event.pressed) {
+ axesFlags |= Axis1Low;
+ } else {
+ axesFlags &= ~Axis1Low;
+ }
+ joystick_status.status |= JS_UPDATED;
+ break;
+ case KC_P6:
+ if (record->event.pressed) {
+ axesFlags |= Axis1High;
+ } else {
+ axesFlags &= ~Axis1High;
+ }
+ joystick_status.status |= JS_UPDATED;
+ break;
+ case KC_P5:
+ if (record->event.pressed) {
+ axesFlags |= Precision;
+ } else {
+ axesFlags &= ~Precision;
+ }
+ joystick_status.status |= JS_UPDATED;
+ break;
+#endif
+ }
+ return true;
+}
+```
+
+### Triggering Joystick Buttons
+
+Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
+To trigger a joystick button, just add the corresponding keycode to your keymap.
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index 5f3095198f..9e33a321ce 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -72,6 +72,43 @@ static void render_logo(void) {
}
```
+## Buffer Read Example
+For some purposes, you may need to read the current state of the OLED display
+buffer. The `oled_read_raw` function can be used to safely read bytes from the
+buffer.
+
+In this example, calling `fade_display` in the `oled_task_user` function will
+slowly fade away whatever is on the screen by turning random pixels black over
+time.
+```c
+//Setup some mask which can be or'd with bytes to turn off pixels
+const uint8_t single_bit_masks[8] = {127, 191, 223, 239, 247, 251, 253, 254};
+
+static void fade_display(void) {
+ //Define the reader structure
+ oled_buffer_reader_t reader;
+ uint8_t buff_char;
+ if (random() % 30 == 0) {
+ srand(timer_read());
+ // Fetch a pointer for the buffer byte at index 0. The return structure
+ // will have the pointer and the number of bytes remaining from this
+ // index position if we want to perform a sequential read by
+ // incrementing the buffer pointer
+ reader = oled_read_raw(0);
+ //Loop over the remaining buffer and erase pixels as we go
+ for (uint16_t i = 0; i < reader.remaining_element_count; i++) {
+ //Get the actual byte in the buffer by dereferencing the pointer
+ buff_char = *reader.current_element;
+ if (buff_char != 0) {
+ oled_write_raw_byte(buff_char & single_bit_masks[rand() % 8], i);
+ }
+ //increment the pointer to fetch a new byte during the next loop
+ reader.current_element++;
+ }
+ }
+}
+```
+
## Other Examples
In split keyboards, it is very common to have two OLED displays that each render different content and are oriented or flipped differently. You can do this by switching which content to render by using the return value from `is_keyboard_master()` or `is_keyboard_left()` found in `split_util.h`, e.g:
@@ -238,6 +275,10 @@ void oled_write_P(const char *data, bool invert);
// Remapped to call 'void oled_write_ln(const char *data, bool invert);' on ARM
void oled_write_ln_P(const char *data, bool invert);
+// Returns a pointer to the requested start index in the buffer plus remaining
+// buffer length as struct
+oled_buffer_reader_t oled_read_raw(uint16_t start_index);
+
// Writes a string to the buffer at current cursor position
void oled_write_raw(const char *data, uint16_t size);
@@ -259,6 +300,10 @@ bool oled_on(void);
// Returns true if the screen was off or turns off
bool oled_off(void);
+// Returns true if the oled is currently on, false if it is
+// not
+bool is_oled_on(void);
+
// Basically it's oled_render, but with timeout management and oled_task_user calling!
void oled_task(void);
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 2cde3ec569..b70a5fcba0 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -129,7 +129,7 @@ Configure the hardware via your `config.h`:
From this point forward the configuration is the same for all the drivers. The `led_config_t` struct provides a key electrical matrix to led index lookup table, what the physical position of each LED is on the board, and what type of key or usage the LED if the LED represents. Here is a brief example:
```c
-const led_config_t g_led_config = { {
+led_config_t g_led_config = { {
// Key Matrix to LED Index
{ 5, NO_LED, NO_LED, 0 },
{ NO_LED, NO_LED, NO_LED, NO_LED },
@@ -422,8 +422,8 @@ Where `28` is an unused index from `eeconfig.h`.
|`rgb_matrix_toggle_noeeprom()` |Toggle effect range LEDs between on and off (not written to EEPROM) |
|`rgb_matrix_enable()` |Turn effect range LEDs on, based on their previous state |
|`rgb_matrix_enable_noeeprom()` |Turn effect range LEDs on, based on their previous state (not written to EEPROM) |
-|`rgb_matrix_disable()` |Turn effect range LEDs off |
-|`rgb_matrix_disable_noeeprom()` |Turn effect range LEDs off (not written to EEPROM) |
+|`rgb_matrix_disable()` |Turn effect range LEDs off, based on their previous state |
+|`rgb_matrix_disable_noeeprom()` |Turn effect range LEDs off, based on their previous state (not written to EEPROM) |
### Change Effect Mode :id=change-effect-mode
|Function |Description |
@@ -431,19 +431,31 @@ Where `28` is an unused index from `eeconfig.h`.
|`rgb_matrix_mode(mode)` |Set the mode, if RGB animations are enabled |
|`rgb_matrix_mode_noeeprom(mode)` |Set the mode, if RGB animations are enabled (not written to EEPROM) |
|`rgb_matrix_step()` |Change the mode to the next RGB animation in the list of enabled RGB animations |
+|`rgb_matrix_step_noeeprom()` |Change the mode to the next RGB animation in the list of enabled RGB animations (not written to EEPROM) |
|`rgb_matrix_step_reverse()` |Change the mode to the previous RGB animation in the list of enabled RGB animations |
-|`rgb_matrix_increase_speed()` |Increases the speed of the animations |
-|`rgb_matrix_decrease_speed()` |Decreases the speed of the animations |
+|`rgb_matrix_step_reverse_noeeprom()` |Change the mode to the previous RGB animation in the list of enabled RGB animations (not written to EEPROM) |
+|`rgb_matrix_increase_speed()` |Increase the speed of the animations |
+|`rgb_matrix_increase_speed_noeeprom()` |Increase the speed of the animations (not written to EEPROM) |
+|`rgb_matrix_decrease_speed()` |Decrease the speed of the animations |
+|`rgb_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
+|`rgb_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
+|`rgb_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
### Change Color :id=change-color
|Function |Description |
|--------------------------------------------|-------------|
|`rgb_matrix_increase_hue()` |Increase the hue for effect range LEDs. This wraps around at maximum hue |
+|`rgb_matrix_increase_hue_noeeprom()` |Increase the hue for effect range LEDs. This wraps around at maximum hue (not written to EEPROM) |
|`rgb_matrix_decrease_hue()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue |
+|`rgb_matrix_decrease_hue_noeeprom()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue (not written to EEPROM) |
|`rgb_matrix_increase_sat()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation |
+|`rgb_matrix_increase_sat_noeeprom()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation (not written to EEPROM) |
|`rgb_matrix_decrease_sat()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation |
+|`rgb_matrix_decrease_sat_noeeprom()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation (not written to EEPROM) |
|`rgb_matrix_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
+|`rgb_matrix_increase_val_noeeprom()` |Increase the value for effect range LEDs. This wraps around at maximum value (not written to EEPROM) |
|`rgb_matrix_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
+|`rgb_matrix_decrease_val_noeeprom()` |Decrease the value for effect range LEDs. This wraps around at minimum value (not written to EEPROM) |
|`rgb_matrix_sethsv(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgb_matrix_sethsv_noeeprom(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index a81b50e828..23b2886edb 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -126,19 +126,19 @@ Use these defines to add or remove animations from the firmware. When you are ru
The following options are used to tweak the various animations:
-|Define |Default |Description |
-|------------------------------------|-------------|-------------------------------------------------------------------------------------|
+|Define |Default |Description |
+|------------------------------------|-------------|-----------------------------------------------------------------------------------------------|
|`RGBLIGHT_EFFECT_BREATHE_CENTER` |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
-|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
-|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000` |How long to wait between light changes for the "Christmas" animation, in milliseconds|
-|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
-|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
-|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
-|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
-|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
-|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
-|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
-|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
+|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
+|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`40` |How long (in milliseconds) to wait between animation steps for the "Christmas" animation |
+|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
+|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
+|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
+|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
+|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
+|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
+|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
+|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
### Example Usage to Reduce Memory Footprint
1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
@@ -377,6 +377,17 @@ rgblight_sethsv(HSV_GREEN, 2); // led 2
|`rgblight_sethsv(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
|`rgblight_sethsv_noeeprom(h, s, v)` |Set effect range LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
+#### Speed functions
+|Function |Description |
+|--------------------------------------------|-------------|
+|`rgblight_increase_speed()` |Increases the animation speed |
+|`rgblight_increase_speed_noeeprom()` |Increases the animation speed (not written to EEPROM) |
+|`rgblight_decrease_speed()` |Decreases the animation speed |
+|`rgblight_decrease_speed_noeeprom()` |Decreases the animation speed (not written to EEPROM) |
+|`rgblight_set_speed()` |Sets the speed. Value is between 0 and 255 |
+|`rgblight_set_speed_noeeprom()` |Sets the speed. Value is between 0 and 255 (not written to EEPROM) |
+
+
#### layer functions
|Function |Description |
|--------------------------------------------|-------------|
diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md
index ce470b9964..f054f365b6 100644
--- a/docs/feature_split_keyboard.md
+++ b/docs/feature_split_keyboard.md
@@ -48,11 +48,12 @@ However, USB cables, SATA cables, and even just 4 wires have been known to be us
### Serial Wiring
-The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0 (aka PDO or pin 3) between the two Pro Micros.
+The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and D0/D1/D2/D3 (aka PD0/PD1/PD2/PD3) between the two Pro Micros.
?> Note that the pin used here is actually set by `SOFT_SERIAL_PIN` below.
-![serial wiring](https://i.imgur.com/C3D1GAQ.png)
+<img alt="sk-pd0-connection-mono" src="https://user-images.githubusercontent.com/2170248/92296488-28e9ad80-ef70-11ea-98be-c40cb48a0319.JPG" width="48%"/>
+<img alt="sk-pd2-connection-mono" src="https://user-images.githubusercontent.com/2170248/92296490-2d15cb00-ef70-11ea-801f-5ace313013e6.JPG" width="48%"/>
### I<sup>2</sup>C Wiring
@@ -60,7 +61,7 @@ The 4 wires of the TRRS cable need to connect GND, VCC, and SCL and SDA (aka PD0
The pull-up resistors may be placed on either half. If you wish to use the halves independently, it is also possible to use 4 resistors and have the pull-ups in both halves.
-![I2C wiring](https://i.imgur.com/Hbzhc6E.png)
+<img alt="sk-i2c-connection-mono" src="https://user-images.githubusercontent.com/2170248/92297182-92b98580-ef77-11ea-9d7d-d6033914af43.JPG" width="50%"/>
## Firmware Configuration
diff --git a/docs/feature_tap_dance.md b/docs/feature_tap_dance.md
index 877c37336e..d2da39ad2b 100644
--- a/docs/feature_tap_dance.md
+++ b/docs/feature_tap_dance.md
@@ -28,7 +28,9 @@ After this, you'll want to use the `tap_dance_actions` array to specify what act
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
-* `ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
+* ~~`ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`~~: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
+ * This is deprecated in favor of the Per Key Tapping Term functionality, as outlined [here](custom_quantum_functions.md#Custom_Tapping_Term). You'd want to check for the specific `TD()` macro that you want to use (such as `TD(TD_ESC_CAPS)`) instead of using this specific Tap Dance function.
+
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
diff --git a/docs/flashing.md b/docs/flashing.md
index 1f71c253c3..5c245c5675 100644
--- a/docs/flashing.md
+++ b/docs/flashing.md
@@ -239,3 +239,4 @@ There are a number of DFU commands that you can use to flash firmware to a STM32
* `:dfu-util-split-left` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Left Side" EEPROM setting for split keyboards.
* `:dfu-util-split-right` - This flashes the normal firmware, just like the default option (`:dfu-util`). However, this also configures the "Right Side" EEPROM setting for split keyboards.
* `:st-link-cli` - This allows you to flash the firmware via ST-LINK's CLI utility, rather than dfu-util.
+* `:st-flash` - This allows you to flash the firmware via the `st-flash` utility from [STLink Tools](https://github.com/stlink-org/stlink), rather than dfu-util.
diff --git a/docs/getting_started_make_guide.md b/docs/getting_started_make_guide.md
index df82a001f0..a89dc73d01 100644
--- a/docs/getting_started_make_guide.md
+++ b/docs/getting_started_make_guide.md
@@ -101,10 +101,6 @@ This allows you to send Unicode characters by inputting a mnemonic corresponding
For further details, as well as limitations, see the [Unicode page](feature_unicode.md).
-`BLUETOOTH_ENABLE`
-
-This allows you to interface with a Bluefruit EZ-key to send keycodes wirelessly. It uses the D2 and D3 pins.
-
`AUDIO_ENABLE`
This allows you output audio on the C6 pin (needs abstracting). See the [audio page](feature_audio.md) for more information.
diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md
index a862bc0ca8..d49d0d0928 100644
--- a/docs/hardware_keyboard_guidelines.md
+++ b/docs/hardware_keyboard_guidelines.md
@@ -192,7 +192,7 @@ When developing your keyboard, keep in mind that all warnings will be treated as
## Copyright Blurb
-If you're adapting your keyboard's setup from another project, but not using the same code, but sure to update the copyright header at the top of the files to show your name, in this format:
+If you're adapting your keyboard's setup from another project, but not using the same code, be sure to update the copyright header at the top of the files to show your name, in this format:
Copyright 2017 Your Name <your@email.com>
diff --git a/docs/ja/api_development_environment.md b/docs/ja/api_development_environment.md
new file mode 100644
index 0000000000..8dce1ba2fd
--- /dev/null
+++ b/docs/ja/api_development_environment.md
@@ -0,0 +1,8 @@
+# 開発環境ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—
+
+<!---
+ original document: 0.9.50:docs/api_development_environment.md
+ git diff 0.9.50 HEAD -- docs/api_development_environment.md | cat
+-->
+
+開発環境をセットアップã™ã‚‹ã«ã¯ã€[qmk_web_stack](https://github.com/qmk/qmk_web_stack) ã«è¡Œã£ã¦ãã ã•ã„。
diff --git a/docs/ja/api_development_overview.md b/docs/ja/api_development_overview.md
new file mode 100644
index 0000000000..0612507b4d
--- /dev/null
+++ b/docs/ja/api_development_overview.md
@@ -0,0 +1,49 @@
+# QMK コンパイラ開発ガイド
+
+<!---
+ original document: 0.9.50:docs/api_development_overview.md
+ git diff 0.9.50 HEAD -- docs/api_development_overview.md | cat
+-->
+
+ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€é–‹ç™ºè€…ã« QMK コンパイラを紹介ã—よã†ã¨æ€ã„ã¾ã™ã€‚コードを読ã¾ãªã‘ã‚Œã°ãªã‚‰ãªã„よã†ãªæ ¸å¿ƒã¨ãªã‚‹è©³ç´°ã«ç«‹ã¡å…¥ã£ã¦èª¿ã¹ã‚‹ã“ã¨ã¯ã—ã¾ã›ã‚“。ã“ã“ã§å¾—られるもã®ã¯ã€ã‚³ãƒ¼ãƒ‰ã‚’読んã§ç†è§£ã‚’æ·±ã‚ã‚‹ãŸã‚ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã§ã™ã€‚
+
+# 概è¦
+
+QMK Compile API ã¯ã€ã„ãã¤ã‹ã®å¯å‹•éƒ¨åˆ†ã‹ã‚‰ã§ãã¦ã„ã¾ã™:
+
+![構造図](https://raw.githubusercontent.com/qmk/qmk_api/master/docs/architecture.svg)
+
+API クライアント㯠API サービスã¨æŽ’ä»–çš„ã«ã‚„ã‚Šã¨ã‚Šã‚’ã—ã¾ã™ã€‚ã“ã“ã§ã‚¸ãƒ§ãƒ–をサブミットã—ã€çŠ¶æ…‹ã‚’調ã¹ã€çµæžœã‚’ダウンロードã—ã¾ã™ã€‚API サービスã¯ã‚³ãƒ³ãƒ‘イルジョブを [Redis Queue](https://python-rq.org) ã«æŒ¿å…¥ã—ã€ãれらã®ã‚¸ãƒ§ãƒ–ã®çµæžœã«ã¤ã„㦠RQ 㨠S3 ã®ä¸¡æ–¹ã‚’調ã¹ã¾ã™ã€‚
+
+ワーカー㯠RQ ã‹ã‚‰æ–°ã—ã„コンパイルジョブをå–り出ã—ã€ã‚½ãƒ¼ã‚¹ã¨ãƒã‚¤ãƒŠãƒªã‚’ S3 互æ›ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¨ãƒ³ã‚¸ãƒ³ã«ã‚¢ãƒƒãƒ—ロードã—ã¾ã™ã€‚
+
+# ワーカー
+
+QMK コンパイラワーカーã¯å®Ÿéš›ã®ãƒ“ルド作業ã«è²¬ä»»ã‚’æŒã¡ã¾ã™ã€‚ワーカー㯠RQ ã‹ã‚‰ã‚¸ãƒ§ãƒ–ã‚’å–り出ã—ã€ã‚¸ãƒ§ãƒ–を完了ã™ã‚‹ãŸã‚ã«ã„ãã¤ã‹ã®äº‹ã‚’è¡Œã„ã¾ã™:
+
+* æ–°ã—ã„ qmk_firmware ã®ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã‚’作æˆã™ã‚‹
+* 指定ã•ã‚ŒãŸãƒ¬ã‚¤ãƒ¤ãƒ¼ã¨ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’使ã£ã¦ `keymap.c` をビルドã™ã‚‹
+* ファームウェアをビルドã™ã‚‹
+* ソースã®ã‚³ãƒ”ーを zip å½¢å¼ã§åœ§ç¸®ã™ã‚‹
+* ファームウェアã€ã‚½ãƒ¼ã‚¹ã® zip ファイルã€ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ S3 ã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹
+* ジョブã®çŠ¶æ…‹ã‚’ RQ ã«é€ä¿¡ã™ã‚‹
+
+# API サービス
+
+API サービスã¯æ¯”較的å˜ç´”㪠Flask アプリケーションã§ã™ã€‚ç†è§£ã—ã¦ãŠãã¹ãã“ã¨ãŒå¹¾ã¤ã‹ã‚ã‚Šã¾ã™ã€‚
+
+## @app.route('/v1/compile', methods=['POST'])
+
+ã“れ㯠API ã®ä¸»ãªã‚¨ãƒ³ãƒˆãƒªãƒ¼ãƒã‚¤ãƒ³ãƒˆã§ã™ã€‚クライアントã¨ã®ã‚„ã‚Šã¨ã‚Šã¯ã“ã“ã‹ã‚‰é–‹å§‹ã•ã‚Œã¾ã™ã€‚クライアントã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’表㙠JSON ドキュメントを POST ã—ã€API ã¯ã‚³ãƒ³ãƒ‘イルジョブをサブミットã™ã‚‹å‰ã«ã„ãらã‹ã®(ã¨ã¦ã‚‚)基本的ãªæ¤œè¨¼ã‚’è¡Œã„ã¾ã™ã€‚
+
+## @app.route('/v1/compile/&lt;string:job_id&gt;', methods=['GET'])
+
+ã“ã‚Œã¯æœ€ã‚‚よã呼ã°ã‚Œã‚‹ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã§ã™ã€‚ジョブã®è©³ç´°ãŒ redis ã‹ã‚‰åˆ©ç”¨å¯èƒ½ã§ã‚ã‚Œã°ãれをå–り出ã—ã€ãã†ã§ãªã‘れ㰠S3 ã‹ã‚‰ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸã‚¸ãƒ§ãƒ–ã®è©³ç´°ã‚’å–り出ã—ã¾ã™ã€‚
+
+## @app.route('/v1/compile/&lt;string:job_id&gt;/download', methods=['GET'])
+
+ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚ˆã‚Šãƒ¦ãƒ¼ã‚¶ã¯ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## @app.route('/v1/compile/&lt;string:job_id&gt;/source', methods=['GET'])
+
+ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã‚ˆã‚Šãƒ¦ãƒ¼ã‚¶ã¯ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã®ã‚½ãƒ¼ã‚¹ã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
diff --git a/docs/ja/api_docs.md b/docs/ja/api_docs.md
new file mode 100644
index 0000000000..b483c045e6
--- /dev/null
+++ b/docs/ja/api_docs.md
@@ -0,0 +1,73 @@
+# QMK API
+
+<!---
+ original document: 0.9.50:docs/api_docs.md
+ git diff 0.9.50 HEAD -- docs/api_docs.md | cat
+-->
+
+ã“ã®ãƒšãƒ¼ã‚¸ã¯ QMK API ã®ä½¿ã„方を説明ã—ã¾ã™ã€‚ã‚‚ã—ã‚ãªãŸãŒã‚¢ãƒ—リケーション開発者ã§ã‚ã‚Œã°ã€å…¨ã¦ã® [QMK](https://qmk.fm) キーボードã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’コンパイルã™ã‚‹ãŸã‚ã«ã€ã“ã® API を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## 概è¦
+
+ã“ã®ã‚µãƒ¼ãƒ“スã¯ã€ã‚«ã‚¹ã‚¿ãƒ ã‚­ãƒ¼ãƒžãƒƒãƒ—をコンパイルã™ã‚‹ãŸã‚ã®éžåŒæœŸ API ã§ã™ã€‚API 㫠何らã‹ã® JSON ã‚’ POST ã—ã€å®šæœŸçš„ã«çŠ¶æ…‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã€ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã®ã‚³ãƒ³ãƒ‘イルãŒå®Œäº†ã—ã¦ã„ã‚Œã°ã€çµæžœã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã¨(ã‚‚ã—希望ã™ã‚Œã°)ãã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’ダウンロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+#### JSON ペイロードã®ä¾‹:
+
+```json
+{
+ "keyboard": "clueboard/66/rev2",
+ "keymap": "my_awesome_keymap",
+ "layout": "LAYOUT_all",
+ "layers": [
+ ["KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_GRV","KC_BSPC","KC_PGUP","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_PGDN","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_LSFT","KC_NUBS","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_RO","KC_RSFT","KC_UP","KC_LCTL","KC_LGUI","KC_LALT","KC_MHEN","KC_SPC","KC_SPC","KC_HENK","KC_RALT","KC_RCTL","MO(1)","KC_LEFT","KC_DOWN","KC_RIGHT"],
+ ["KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_TRNS","KC_DEL","BL_STEP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","_______","KC_TRNS","KC_PSCR","KC_SLCK","KC_PAUS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PGUP","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_LEFT","KC_PGDN","KC_RGHT"],
+ ["KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","RESET","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(2)","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","MO(1)","KC_TRNS","KC_TRNS","KC_TRNS"]
+ ]
+}
+```
+
+ã”覧ã®ã¨ãŠã‚Šã€ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰ã«ã¯ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’作æˆãŠã‚ˆã³ç”Ÿæˆã™ã‚‹ãŸã‚ã«å¿…è¦ãªã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å…¨ã¦ã®å´é¢ã‚’記述ã—ã¾ã™ã€‚å„レイヤー㯠QMK キーコードã®1ã¤ã®ãƒªã‚¹ãƒˆã§ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã® `LAYOUT` マクロã¨åŒã˜é•·ã•ã§ã™ã€‚ã‚‚ã—キーボードãŒè¤‡æ•°ã® `LAYOUT` マクロをサãƒãƒ¼ãƒˆã™ã‚‹å ´åˆã€ã©ã®ãƒžã‚¯ãƒ­ã‚’使ã†ã‹ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## コンパイルジョブã®ã‚µãƒ–ミット
+
+キーマップをファームウェアã«ã‚³ãƒ³ãƒ‘イルã™ã‚‹ã«ã¯ã€å˜ç´”ã« JSON ã‚’ `/v1/compile` エンドãƒã‚¤ãƒ³ãƒˆã« POST ã—ã¾ã™ã€‚以下ã®ä¾‹ã§ã¯ã€JSON ペイロードを `json_data` ã¨ã„ã†åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é…ç½®ã—ã¦ã„ã¾ã™ã€‚
+
+```
+$ curl -H "Content-Type: application/json" -X POST -d "$(< json_data)" http://api.qmk.fm/v1/compile
+{
+ "enqueued": true,
+ "job_id": "ea1514b3-bdfc-4a7b-9b5c-08752684f7f6"
+}
+```
+
+## 状態ã®ãƒã‚§ãƒƒã‚¯
+
+キーマップをサブミットã—ãŸå¾Œã§ã€ç°¡å˜ãª HTTP GET 呼ã³å‡ºã—を使ã£ã¦çŠ¶æ…‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+```
+$ curl http://api.qmk.fm/v1/compile/ea1514b3-bdfc-4a7b-9b5c-08752684f7f6
+{
+ "created_at": "Sat, 19 Aug 2017 21:39:12 GMT",
+ "enqueued_at": "Sat, 19 Aug 2017 21:39:12 GMT",
+ "id": "f5f9b992-73b4-479b-8236-df1deb37c163",
+ "status": "running",
+ "result": null
+}
+```
+
+ã“ã‚Œã¯ã€ã‚¸ãƒ§ãƒ–をキューã«å…¥ã‚Œã‚‹ã“ã¨ã«æˆåŠŸã—ã€ç¾åœ¨å®Ÿè¡Œä¸­ã§ã‚ã‚‹ã“ã¨ã‚’示ã—ã¦ã„ã¾ã™ã€‚5ã¤ã®çŠ¶æ…‹ãŒã‚ã‚Šãˆã¾ã™:
+
+* **failed**: ãªã‚“らã‹ã®ç†ç”±ã§ã‚³ãƒ³ãƒ‘イルサービスãŒå¤±æ•—ã—ã¾ã—ãŸã€‚
+* **finished**: コンパイルãŒå®Œäº†ã—ã€çµæžœã‚’見るã«ã¯ `result` ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+* **queued**: キーマップã¯ã‚³ãƒ³ãƒ‘イルサーãƒãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚
+* **running**: コンパイルãŒé€²è¡Œä¸­ã§ã€ã¾ã‚‚ãªã完了ã™ã‚‹ã¯ãšã§ã™ã€‚
+* **unknown**: 深刻ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã€[ãƒã‚°ã‚’報告](https://github.com/qmk/qmk_compiler/issues)ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+## 完了ã—ãŸçµæžœã‚’検証
+
+コンパイルジョブãŒå®Œäº†ã—ãŸã‚‰ã€`result` キーをãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ã“ã®ã‚­ãƒ¼ã®å€¤ã¯å¹¾ã¤ã‹ã®æƒ…報をå«ã‚€ãƒãƒƒã‚·ãƒ¥ã§ã™:
+
+* `firmware_binary_url`: 書ãè¾¼ã¿å¯èƒ½ãªãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã® URL ã®ãƒªã‚¹ãƒˆ
+* `firmware_keymap_url`: `keymap.c` ã® URL ã®ãƒªã‚¹ãƒˆ
+* `firmware_source_url`: ファームウェアã®å®Œå…¨ãªã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã® URL ã®ãƒªã‚¹ãƒˆ
+* `output`: ã“ã®ã‚³ãƒ³ãƒ‘イルジョブ㮠stdout 㨠stderr。エラーã¯ã“ã“ã§è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
diff --git a/docs/ja/api_overview.md b/docs/ja/api_overview.md
new file mode 100644
index 0000000000..18b8eae10f
--- /dev/null
+++ b/docs/ja/api_overview.md
@@ -0,0 +1,20 @@
+# QMK API
+
+<!---
+ original document: 0.9.50:docs/api_overview.md
+ git diff 0.9.50 HEAD -- docs/api_overview.md | cat
+-->
+
+QMK API ã¯ã€Web 㨠GUI ツール㌠[QMK](http://qmk.fm/) ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã‚‹ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ç”¨ã®ä»»æ„ã®ã‚­ãƒ¼ãƒžãƒƒãƒ—をコンパイルã™ã‚‹ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã‚‹ã€éžåŒæœŸ API ã‚’æä¾›ã—ã¾ã™ã€‚標準ã®ã‚­ãƒ¼ãƒžãƒƒãƒ—テンプレートã¯ã€C コードã®ã‚µãƒãƒ¼ãƒˆã‚’å¿…è¦ã¨ã—ãªã„å…¨ã¦ã® QMK キーコードをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚キーボードã®ãƒ¡ãƒ³ãƒ†ãƒŠã¯ç‹¬è‡ªã®ã‚«ã‚¹ã‚¿ãƒ ãƒ†ãƒ³ãƒ—レートをæä¾›ã—ã¦ã€ã‚ˆã‚Šå¤šãã®æ©Ÿèƒ½ã‚’実ç¾ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## アプリケーション開発者
+
+ã‚‚ã—ã‚ãªãŸãŒã‚¢ãƒ—リケーションã§ã“ã® API を使ã†ã“ã¨ã«èˆˆå‘³ãŒã‚るアプリケーション開発者ã§ã‚ã‚Œã°ã€[API ã®ä½¿ç”¨](ja/api_docs.md) ã«è¡Œãã¹ãã§ã™ã€‚
+
+## キーボードã®ãƒ¡ãƒ³ãƒ†ãƒŠ
+
+ã‚‚ã— QMK Compiler API ã§ã®ã‚ãªãŸã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ã‚µãƒãƒ¼ãƒˆã‚’強化ã—ãŸã„å ´åˆã¯ã€[キーボードサãƒãƒ¼ãƒˆ](ja/reference_configurator_support.md) ã®ç¯€ã«è¡Œãã¹ãã§ã™ã€‚
+
+## ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰é–‹ç™ºè€…
+
+ã‚‚ã— API 自体ã«å–り組むã“ã¨ã«èˆˆå‘³ãŒã‚ã‚‹å ´åˆã¯ã€[開発環境](ja/api_development_environment.md)ã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã‹ã‚‰å§‹ã‚ã€ãã‚Œã‹ã‚‰ [API ã®ãƒãƒƒã‚­ãƒ³ã‚°](ja/api_development_overview.md) を調ã¹ã‚‹ã¹ãã§ã™ã€‚
diff --git a/docs/ja/config_options.md b/docs/ja/config_options.md
index b4cf3c888c..2a64f2ba2a 100644
--- a/docs/ja/config_options.md
+++ b/docs/ja/config_options.md
@@ -322,11 +322,9 @@ QMK ã§ã®å…¨ã¦ã®åˆ©ç”¨å¯èƒ½ãªè¨­å®šã«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãŒã‚ã‚Šã¾ã™ã€‚ã
```
* `LAYOUTS`
* ã“ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹[レイアウト](ja/feature_layouts.md)ã®ãƒªã‚¹ãƒˆ
-* `LINK_TIME_OPTIMIZATION_ENABLE`
+* `LTO_ENABLE`
* キーボードをコンパイルã™ã‚‹æ™‚ã«ã€Link Time Optimization (LTO) を有効ã«ã—ã¾ã™ã€‚ã“ã‚Œã¯å‡¦ç†ã«æ™‚é–“ãŒæŽ›ã‹ã‚Šã¾ã™ãŒã€ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã‚µã‚¤ã‚ºã‚’大幅ã«æ¸›ã‚‰ã—ã¾ã™ (ãã—ã¦ã€ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ãŒå°ã•ã„ãŸã‚ã€è¿½åŠ ã®æ™‚é–“ã¯åˆ†ã‹ã‚‰ãªã„ãらã„ã§ã™)。
ãŸã ã—ã€LTO ãŒæœ‰åŠ¹ãªå ´åˆã€å¤ã„ TMK ã®ãƒžã‚¯ãƒ­ã¨é–¢æ•°ã®æ©Ÿèƒ½ãŒå£Šã‚Œã‚‹ãŸã‚ã€è‡ªå‹•çš„ã«ã“れらã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™ã€‚ã“れ㯠`NO_ACTION_MACRO` 㨠`NO_ACTION_FUNCTION` を自動的ã«å®šç¾©ã™ã‚‹ã“ã¨ã§è¡Œã‚ã‚Œã¾ã™ã€‚(メモ: ã“れ㯠QMK ã® [マクロ](ja/feature_macros.md) 㨠[レイヤー](ja/feature_layers.md) ã«ã¯å½±éŸ¿ã‚’与ãˆã¾ã›ã‚“。)
-* `LTO_ENABLE`
- * LINK_TIME_OPTIMIZATION_ENABLE ã¨åŒã˜æ„味ã§ã™ã€‚`LINK_TIME_OPTIMIZATION_ENABLE` ã®ä»£ã‚ã‚Šã« `LTO_ENABLE` を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
## AVR MCU オプション
* `MCU = atmega32u4`
@@ -371,10 +369,8 @@ QMK ã§ã®å…¨ã¦ã®åˆ©ç”¨å¯èƒ½ãªè¨­å®šã«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãŒã‚ã‚Šã¾ã™ã€‚ã
* MIDI 制御
* `UNICODE_ENABLE`
* Unicode
-* `BLUETOOTH_ENABLE`
- * Adafruit EZ-Key HID 㧠Bluetooth を有効ã«ã™ã‚‹ãƒ¬ã‚¬ã‚·ãƒ¼ã‚ªãƒ—ション。BLUETOOTH を見ã¦ãã ã•ã„
* `BLUETOOTH`
- * ç¾åœ¨ã®ã‚ªãƒ—ションã¯ã€AdafruitEzKeyã€AdafruitBLEã€RN42
+ * ç¾åœ¨ã®ã‚ªãƒ—ションã¯ã€AdafruitBLEã€RN42
* `SPLIT_KEYBOARD`
* 分割キーボード (let's split ã‚„ bakingpy ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ã‚ˆã†ãªãƒ‡ãƒ¥ã‚¢ãƒ« MCU) ã®ã‚µãƒãƒ¼ãƒˆã‚’有効ã«ã—ã€quantum/split_common ã«ã‚ã‚‹å…¨ã¦ã®å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚’インクルードã—ã¾ã™
* `CUSTOM_MATRIX`
diff --git a/docs/ja/faq_build.md b/docs/ja/faq_build.md
index 97e1bd8cf7..62c36f2497 100644
--- a/docs/ja/faq_build.md
+++ b/docs/ja/faq_build.md
@@ -145,4 +145,4 @@ ARM ベースã®ãƒãƒƒãƒ—上ã§ã® EEPROM ã®å‹•ä½œã«ã‚ˆã£ã¦ã€ä¿å­˜ã•ã‚Œã
[Planck rev6 reset EEPROM](https://cdn.discordapp.com/attachments/473506116718952450/539284620861243409/planck_rev6_default.bin) を使ã£ã¦ eeprom ã®ãƒªã‚»ãƒƒãƒˆã‚’強制ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’書ã込んã å¾Œã§ã€é€šå¸¸ã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’書ã込むã¨ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãŒ_通常_ ã®å‹•ä½œé †åºã«å¾©å…ƒã•ã‚Œã¾ã™ã€‚
[Preonic rev3 reset EEPROM](https://cdn.discordapp.com/attachments/473506116718952450/537849497313738762/preonic_rev3_default.bin)
-ã„ãšã‚Œã‹ã®å½¢å¼ã§ãƒ–ートマジックãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã¯ã€ã“れも実行ã§ãã‚‹ã¯ãšã§ã™ (実行方法ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€[ブートマジックドキュメント](feature_bootmagic.md)ã¨ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰æƒ…報を見ã¦ãã ã•ã„)。
+ã„ãšã‚Œã‹ã®å½¢å¼ã§ãƒ–ートマジックãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã¯ã€ã“れも実行ã§ãã‚‹ã¯ãšã§ã™ (実行方法ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€[ブートマジックドキュメント](ja/feature_bootmagic.md)ã¨ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰æƒ…報を見ã¦ãã ã•ã„)。
diff --git a/docs/ja/faq_general.md b/docs/ja/faq_general.md
index a365e380b3..83d1a557bd 100644
--- a/docs/ja/faq_general.md
+++ b/docs/ja/faq_general.md
@@ -51,7 +51,7 @@ OKã€å•é¡Œã‚ã‚Šã¾ã›ã‚“。[GitHub 㧠issue ã‚’é–‹ã](https://github.com/qmk
TMK 㯠[Jun Wako](https://github.com/tmk) ã«ã‚ˆã£ã¦è¨­è¨ˆã•ã‚Œå®Ÿè£…ã•ã‚Œã¾ã—ãŸã€‚QMK 㯠[Jack Humbert](https://github.com/jackhumbert) ã® Planck 用 TMK ã®ãƒ•ã‚©ãƒ¼ã‚¯ã¨ã—ã¦å§‹ã¾ã‚Šã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã€Jack ã®ãƒ•ã‚©ãƒ¼ã‚¯ã¯ TMK ã‹ã‚‰ã‹ãªã‚Šåˆ†å²ã—ã€2015å¹´ã« Jack ã¯ãƒ•ã‚©ãƒ¼ã‚¯ã‚’ QMK ã«åå‰ã‚’変ãˆã‚‹ã“ã¨ã«ã—ã¾ã—ãŸã€‚
-技術的ãªè¦³ç‚¹ã‹ã‚‰ã€QMK ã¯å¹¾ã¤ã‹ã®æ–°ã—ã„機能を追加ã—㟠TMK ã«åŸºã¥ã„ã¦ã„ã¾ã™ã€‚最も注目ã™ã¹ãã“ã¨ã¯ã€QMK ã¯åˆ©ç”¨å¯èƒ½ãªã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®æ•°ã‚’増やã—ã€`S()`ã€`LCTL()` ãŠã‚ˆã³ `MO()` ãªã©ã®é«˜åº¦ãªæ©Ÿèƒ½ã‚’実装ã™ã‚‹ãŸã‚ã«ã“れらを使ã£ã¦ã„ã¾ã™ã€‚[キーコード](keycodes.md)ã§ã“れらã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®å®Œå…¨ãªãƒªã‚¹ãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚
+技術的ãªè¦³ç‚¹ã‹ã‚‰ã€QMK ã¯å¹¾ã¤ã‹ã®æ–°ã—ã„機能を追加ã—㟠TMK ã«åŸºã¥ã„ã¦ã„ã¾ã™ã€‚最も注目ã™ã¹ãã“ã¨ã¯ã€QMK ã¯åˆ©ç”¨å¯èƒ½ãªã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®æ•°ã‚’増やã—ã€`S()`ã€`LCTL()` ãŠã‚ˆã³ `MO()` ãªã©ã®é«˜åº¦ãªæ©Ÿèƒ½ã‚’実装ã™ã‚‹ãŸã‚ã«ã“れらを使ã£ã¦ã„ã¾ã™ã€‚[キーコード](ja/keycodes.md)ã§ã“れらã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®å®Œå…¨ãªãƒªã‚¹ãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚
プロジェクトã¨ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ç®¡ç†ã®è¦³ç‚¹ã‹ã‚‰ã€TMK ã¯å…¬å¼ã«ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’自分ã§ç®¡ç†ã—ã¦ãŠã‚Šã€ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã®ã‚µãƒãƒ¼ãƒˆã‚‚å°‘ã—å—ã‘ã¦ã„ã¾ã™ã€‚ä»–ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ç”¨ã«åˆ¥å€‹ã®ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãŒç¶­æŒã™ã‚‹ãƒ•ã‚©ãƒ¼ã‚¯ãŒå­˜åœ¨ã™ã‚‹ã‹ã€ä½œæˆã§ãã¾ã™ã€‚デフォルトã§ã¯å°‘æ•°ã®ã‚­ãƒ¼ãƒžãƒƒãƒ—ã®ã¿ãŒæä¾›ã•ã‚Œã‚‹ãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ã¯ä¸€èˆ¬çš„ã«ãŠäº’ã„ã«ã‚­ãƒ¼ãƒžãƒƒãƒ—を共有ã—ã¾ã›ã‚“。QMK ã¯é›†ä¸­ç®¡ç†ã•ã‚ŒãŸãƒªãƒã‚¸ãƒˆãƒªã‚’介ã—ã¦ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã¨ã‚­ãƒ¼ãƒžãƒƒãƒ—ã®ä¸¡æ–¹ã‚’共有ã™ã‚‹ã“ã¨ã‚’奨励ã—ã¦ãŠã‚Šã€å“質基準ã«æº–æ‹ ã™ã‚‹å…¨ã¦ã®ãƒ—ルリクエストをå—ã‘付ã‘ã¾ã™ã€‚ã“れらã¯ã»ã¨ã‚“ã©ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã§ç®¡ç†ã•ã‚Œã¾ã™ãŒã€å¿…è¦ãªå ´åˆã¯ QMK ãƒãƒ¼ãƒ ã‚‚支æ´ã—ã¾ã™ã€‚
diff --git a/docs/ja/faq_keymap.md b/docs/ja/faq_keymap.md
index 2726e18728..311ebe0e42 100644
--- a/docs/ja/faq_keymap.md
+++ b/docs/ja/faq_keymap.md
@@ -128,7 +128,7 @@ https://github.com/tekezo/Karabiner/issues/403
## å˜ä¸€ã®ã‚­ãƒ¼ã§ã® Esc ã¨<code>&#96;</code>
-[Grave Escape](feature_grave_esc.md) 機能を見ã¦ãã ã•ã„。
+[Grave Escape](ja/feature_grave_esc.md) 機能を見ã¦ãã ã•ã„。
## Mac OSX ã§ã® Eject
`KC_EJCT` キーコード㯠OSX ã§å‹•ä½œã—ã¾ã™ã€‚https://github.com/tmk/tmk_keyboard/issues/250
diff --git a/docs/ja/feature_bluetooth.md b/docs/ja/feature_bluetooth.md
index 4443a4e3ea..f7835dd548 100644
--- a/docs/ja/feature_bluetooth.md
+++ b/docs/ja/feature_bluetooth.md
@@ -7,11 +7,10 @@
## Bluetooth ã®æ—¢çŸ¥ã®ã‚µãƒãƒ¼ãƒˆãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢
-ç¾åœ¨ã®ã¨ã“ã‚ Bluetooth ã®ã‚µãƒãƒ¼ãƒˆã¯ AVR ベースã®ãƒãƒƒãƒ—ã«é™ã‚‰ã‚Œã¾ã™ã€‚Bluetooth 2.1 ã«ã¤ã„ã¦ã¯ã€QMK 㯠RN-42 モジュールã¨ã€Bluefruit EZ-Key をサãƒãƒ¼ãƒˆã—ã¾ã™ãŒã€å¾Œè€…ã¯ã‚‚ã†ç”Ÿç”£ã•ã‚Œã¦ã„ã¾ã›ã‚“。より最近㮠BLE プロトコルã«ã¤ã„ã¦ã¯ã€ç¾åœ¨ã®ã¨ã“ã‚ Adafruit Bluefruit SPI Friend ã®ã¿ãŒç›´æŽ¥ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚iOS デãƒã‚¤ã‚¹ã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã€BLE ãŒå¿…è¦ã§ã™ã€‚iOS ã¯ãƒžã‚¦ã‚¹å…¥åŠ›ã‚’サãƒãƒ¼ãƒˆã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+ç¾åœ¨ã®ã¨ã“ã‚ Bluetooth ã®ã‚µãƒãƒ¼ãƒˆã¯ AVR ベースã®ãƒãƒƒãƒ—ã«é™ã‚‰ã‚Œã¾ã™ã€‚Bluetooth 2.1 ã«ã¤ã„ã¦ã¯ã€QMK 㯠RN-42 モジュールをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚より最近㮠BLE プロトコルã«ã¤ã„ã¦ã¯ã€ç¾åœ¨ã®ã¨ã“ã‚ Adafruit Bluefruit SPI Friend ã®ã¿ãŒç›´æŽ¥ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚iOS デãƒã‚¤ã‚¹ã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã€BLE ãŒå¿…è¦ã§ã™ã€‚iOS ã¯ãƒžã‚¦ã‚¹å…¥åŠ›ã‚’サãƒãƒ¼ãƒˆã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
| ボード | Bluetooth プロトコル | 接続タイプ | rules.mk | Bluetooth ãƒãƒƒãƒ— |
|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------|
-| [Adafruit EZ-Key HID](https://www.adafruit.com/product/1535) | Bluetooth Classic | UART | `BLUETOOTH = AdafruitEZKey` | |
| Roving Networks RN-42 (Sparkfun Bluesmirf) | Bluetooth Classic | UART | `BLUETOOTH = RN42` | RN-42 |
| [Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633) | Bluetooth Low Energy | SPI | `BLUETOOTH = AdafruitBLE` | nRF51822 |
@@ -29,16 +28,11 @@
Bluefruit UART friend 㯠SPI friend ã«å¤‰æ›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ã“ã‚Œã«ã¯MDBT40 ãƒãƒƒãƒ—ã¸ã®ç›´æŽ¥ã®å†æ›¸ãè¾¼ã¿ã¨ã¯ã‚“ã ä»˜ã‘ãŒ[å¿…è¦ã§ã™](https://github.com/qmk/qmk_firmware/issues/2274)。
-## Adafruit EZ-Key hid
-ã“ã‚Œã«ã¯[ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®å¤‰æ›´](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts)ãŒå¿…è¦ã§ã™ãŒã€Makefile を使ã£ã¦æœ‰åŠ¹ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ファームウェアã¯å¼•ã続ã USB 経由ã§æ–‡å­—を出力ã™ã‚‹ãŸã‚ã€ã‚³ãƒ³ãƒ”ュータ経由ã§å……é›»ã™ã‚‹å ´åˆã¯æ³¨æ„ã—ã¦ãã ã•ã„。任æ„ã«ã‚ªãƒ•ã«ã™ã‚‹ãŸã‚ã« Bluefruit 上ã«ã‚¹ã‚¤ãƒƒãƒã‚’æŒã¤ã“ã¨ã¯ç†ã«ã‹ãªã£ã¦ã„ã¾ã™ã€‚
-
-
<!-- FIXME: Document bluetooth support more completely. -->
## Bluetooth 㮠Rules.mk オプション
ã“れらã®ã†ã¡ã®1ã¤ã ã‘を使ã£ã¦ãã ã•ã„
* BLUETOOTH_ENABLE = yes (レガシーオプション)
* BLUETOOTH = RN42
-* BLUETOOTH = AdafruitEZKey
* BLUETOOTH = AdafruitBLE
## Bluetooth キーコード
diff --git a/docs/ja/feature_split_keyboard.md b/docs/ja/feature_split_keyboard.md
index 74b62310fb..3bdf96d1c7 100644
--- a/docs/ja/feature_split_keyboard.md
+++ b/docs/ja/feature_split_keyboard.md
@@ -1,8 +1,8 @@
# 分割キーボード
<!---
- original document:0.9.43:docs/feature_split_keyboard.md
- git diff 0.9.43 HEAD -- docs/feature_split_keyboard.md | cat
+ original document:0.10.8:docs/feature_split_keyboard.md
+ git diff 0.10.8 HEAD -- docs/feature_split_keyboard.md | cat
-->
QMK ファームウェアリãƒã‚¸ãƒˆãƒªã®å¤šãã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã¯ã€"分割"キーボードã§ã™ã€‚ãれらã¯2ã¤ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã‚’使ã„ã¾ã™ — 1ã¤ã¯ USB ã«æŽ¥ç¶šã—ã€ã‚‚ã†1ã¤ã¯ TRRS ã¾ãŸã¯åŒæ§˜ã®ã‚±ãƒ¼ãƒ–ルを介ã—ã¦ã‚·ãƒªã‚¢ãƒ«ã¾ãŸã¯ I<sup>2</sup>C 接続ã§æŽ¥ç¶šã—ã¾ã™ã€‚
@@ -20,12 +20,12 @@ QMK ファームウェアã«ã¯ã€ä»»æ„ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§ä½¿ç”¨å¯èƒ½ãªä¸€è
| Transport | AVR | ARM |
|------------------------------|--------------------|--------------------|
-| ['serial'](serial_driver.md) | :heavy_check_mark: | :white_check_mark: <sup>1</sup> |
+| ['serial'](ja/serial_driver.md) | :heavy_check_mark: | :white_check_mark: <sup>1</sup> |
| I2C | :heavy_check_mark: | |
注æ„:
-1. ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã¨ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ä¸¡æ–¹ã®åˆ¶é™ã¯ã€[ドライãƒãƒ¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ](serial_driver.md)ã®ä¸­ã§èª¬æ˜Žã•ã‚Œã¾ã™ã€‚
+1. ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã¨ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ä¸¡æ–¹ã®åˆ¶é™ã¯ã€[ドライãƒãƒ¼ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ](ja/serial_driver.md)ã®ä¸­ã§èª¬æ˜Žã•ã‚Œã¾ã™ã€‚
## ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢è¨­å®š
@@ -53,11 +53,12 @@ QMK ファームウェアã«ã¯ã€ä»»æ„ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§ä½¿ç”¨å¯èƒ½ãªä¸€è
### シリアルé…ç·š
-2ã¤ã® Pro Micro 間㧠GNDã€Vccã€D0 (別å PDO ã‚ã‚‹ã„㯠pin 3) ã‚’ TRS/TRRS ケーブルã®3本ã®ãƒ¯ã‚¤ãƒ¤ã§æŽ¥ç¶šã—ã¾ã™ã€‚
+2ã¤ã® Pro Micro 間㧠GNDã€Vccã€D0/D1/D2/D3 (別å PD0/PD1/PD2/PD3) ã‚’ TRS/TRRS ケーブルã®3本ã®ãƒ¯ã‚¤ãƒ¤ã§æŽ¥ç¶šã—ã¾ã™ã€‚
?> ã“ã“ã§ä½¿ã‚れるピンã¯å®Ÿéš›ã«ã¯ä»¥ä¸‹ã® `SOFT_SERIAL_PIN` ã«ã‚ˆã£ã¦è¨­å®šã•ã‚Œã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
-![シリアルé…ç·š](https://i.imgur.com/C3D1GAQ.png)
+<img alt="sk-pd0-connection-mono" src="https://user-images.githubusercontent.com/2170248/92296488-28e9ad80-ef70-11ea-98be-c40cb48a0319.JPG" width="48%"/>
+<img alt="sk-pd2-connection-mono" src="https://user-images.githubusercontent.com/2170248/92296490-2d15cb00-ef70-11ea-801f-5ace313013e6.JPG" width="48%"/>
### I<sup>2</sup>C é…ç·š
@@ -65,7 +66,7 @@ QMK ファームウェアã«ã¯ã€ä»»æ„ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§ä½¿ç”¨å¯èƒ½ãªä¸€è
プルアップ抵抗ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å·¦å³ã©ã¡ã‚‰å´ã«ã‚‚é…ç½®ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã‚‚ã—å„å´ã‚’å˜ç‹¬ã§ä½¿ã„ãŸã„å ´åˆã¯ã€4ã¤ã®æŠµæŠ—を使ã„ã€ä¸¡å´ã«ãƒ—ルアップ抵抗をé…ç½®ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
-![I2C é…ç·š](https://i.imgur.com/Hbzhc6E.png)
+<img alt="sk-i2c-connection-mono" src="https://user-images.githubusercontent.com/2170248/92297182-92b98580-ef77-11ea-9d7d-d6033914af43.JPG" width="50%"/>
## ファームウェア設定
diff --git a/docs/ja/getting_started_make_guide.md b/docs/ja/getting_started_make_guide.md
index 0d39583a1d..cbc824de8b 100644
--- a/docs/ja/getting_started_make_guide.md
+++ b/docs/ja/getting_started_make_guide.md
@@ -106,10 +106,6 @@ make コマンド自体ã«ã‚‚ã„ãã¤ã‹ã®è¿½åŠ ã‚ªãƒ—ションãŒã‚ã‚Šã¾ã™
詳細ã¨åˆ¶é™ã«ã¤ã„ã¦ã¯ã€[Unicode ページ](ja/feature_unicode.md) を見ã¦ãã ã•ã„。
-`BLUETOOTH_ENABLE`
-
-ã“ã‚Œã«ã‚ˆã‚Šã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’ワイヤレスã§é€ä¿¡ã™ã‚‹ãŸã‚ã« Bluefruit EZ-key ã¨é€£å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚D2 㨠D3 ピンを使ã„ã¾ã™ã€‚
-
`AUDIO_ENABLE`
C6 ピン(抽象化ãŒå¿…è¦)ã§ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªå‡ºåŠ›ã§ãã¾ã™ã€‚詳細ã¯[オーディオページ](ja/feature_audio.md)を見ã¦ãã ã•ã„。
diff --git a/docs/ja/how_a_matrix_works.md b/docs/ja/how_a_matrix_works.md
index ff4fbb115d..b6ded186ba 100644
--- a/docs/ja/how_a_matrix_works.md
+++ b/docs/ja/how_a_matrix_works.md
@@ -101,4 +101,4 @@
- [Deskthority ã®è¨˜äº‹](https://deskthority.net/wiki/Keyboard_matrix)
- [Dave Dribin ã«ã‚ˆã‚‹ Keyboard Matrix Help (2000)](https://www.dribin.org/dave/keyboard/one_html/)
- [PCBheaven ã«ã‚ˆã‚‹ How Key Matrices Works](http://pcbheaven.com/wikipages/How_Key_Matrices_Works/) (アニメーションã®ä¾‹)
-- [キーボードã®ä»•çµ„ã¿ - QMK ドキュメント](how_keyboards_work.md)
+- [キーボードã®ä»•çµ„ã¿ - QMK ドキュメント](ja/how_keyboards_work.md)
diff --git a/docs/ja/quantum_keycodes.md b/docs/ja/quantum_keycodes.md
new file mode 100644
index 0000000000..ffcc494460
--- /dev/null
+++ b/docs/ja/quantum_keycodes.md
@@ -0,0 +1,20 @@
+# Quantum キーコード
+
+<!---
+ original document: 0.9.55:docs/quantum_keycodes.md
+ git diff 0.9.55 HEAD -- docs/quantum_keycodes.md | cat
+-->
+
+Quantum キーコードã«ã‚ˆã‚Šã€ã‚«ã‚¹ã‚¿ãƒ ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’定義ã™ã‚‹ã“ã¨ãªãã€åŸºæœ¬çš„ãªã‚‚ã®ãŒæä¾›ã™ã‚‹ã‚‚ã®ã‚ˆã‚Šç°¡å˜ã«ã‚­ãƒ¼ãƒžãƒƒãƒ—をカスタマイズã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+quantum 内ã®å…¨ã¦ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã¯ `0x0000` 㨠`0xFFFF` ã®é–“ã®æ•°å€¤ã§ã™ã€‚`keymap.c` ã®ä¸­ã§ã¯ã€é–¢æ•°ã‚„ãã®ä»–ã®ç‰¹åˆ¥ãªå ´åˆãŒã‚るよã†ã«è¦‹ãˆã¾ã™ãŒã€æœ€çµ‚çš„ã«ã¯ C プリプロセッサã«ã‚ˆã£ã¦ãれらã¯å˜ä¸€ã®4ãƒã‚¤ãƒˆæ•´æ•°ã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚QMK ã¯æ¨™æº–çš„ãªã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®ãŸã‚ã« `0x0000` ã‹ã‚‰ `0x00FF` を予約ã—ã¦ã„ã¾ã™ã€‚ã“れらã¯ã€`KC_A`ã€`KC_1` ãŠã‚ˆã³ `KC_LCTL` ã®ã‚ˆã†ãªã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã€USB HID 仕様ã§å®šç¾©ã•ã‚ŒãŸåŸºæœ¬çš„ãªã‚­ãƒ¼ã§ã™ã€‚
+
+ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€é«˜åº¦ãª quantum 機能を実装ã™ã‚‹ãŸã‚ã«ä½¿ã‚れる `0x00FF` 㨠`0xFFFF` ã®é–“ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’説明ã—ã¾ã™ã€‚独自ã®ã‚«ã‚¹ã‚¿ãƒ ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’定義ã™ã‚‹å ´åˆã¯ã€ãれらもã“ã®ç¯„囲ã«é…ç½®ã•ã‚Œã¾ã™ã€‚
+
+## QMK キーコード :id=qmk-keycodes
+
+| キー | エイリアス | 説明 |
+|----------------|------------|--------------------------------------------------------|
+| `RESET` | | 書ãè¾¼ã¿ã®ãŸã‚ã«ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’ bootloader モードã«ã™ã‚‹ |
+| `DEBUG` | | デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã®åˆ‡ã‚Šæ›¿ãˆ |
+| `EEPROM_RESET` | `EEP_RST` | キーボード㮠EEPROM (永続化メモリ) ã‚’å†åˆæœŸåŒ–ã™ã‚‹ |
diff --git a/docs/ja/ref_functions.md b/docs/ja/ref_functions.md
new file mode 100644
index 0000000000..e9c45fdecc
--- /dev/null
+++ b/docs/ja/ref_functions.md
@@ -0,0 +1,122 @@
+# キーボードをより良ãã™ã‚‹ãŸã‚ã®ä¾¿åˆ©ãªã‚³ã‚¢é–¢æ•°ã®ãƒªã‚¹ãƒˆ
+
+<!---
+ original document: 0.9.47:docs/ref_functions.md
+ git diff 0.9.47 HEAD -- docs/ref_functions.md | cat
+-->
+
+QMK ã«ã¯ã€ä¿¡ã˜ã‚‰ã‚Œãªã„ã»ã©ä¾¿åˆ©ãªã€ã¾ãŸã¯ã‚ãªãŸãŒæœ›ã‚“ã§ã„ãŸæ©Ÿèƒ½ã‚’å°‘ã—追加ã™ã‚‹ã€éš ã•ã‚ŒãŸé–¢æ•°ãŒãŸãã•ã‚“ã‚ã‚Šã¾ã™ã€‚特定ã®æ©Ÿèƒ½ã«å›ºæœ‰ã®é–¢æ•°ã¯ãã‚Œãžã‚Œã®æ©Ÿèƒ½ã®ãƒšãƒ¼ã‚¸ã«ã‚ã‚‹ãŸã‚ã€ã“ã“ã«ã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。
+
+## (OLKB) トライレイヤー :id=olkb-tri-layers
+
+目的ã«å¿œã˜ã¦ã€å®Ÿéš›ã«ä½¿ã†ã“ã¨ãŒã§ãる別個ã®é–¢æ•°ãŒã‚ã‚Šã¾ã™ã€‚
+
+### `update_tri_layer(x, y, z)`
+
+最åˆã¯ `update_tri_layer(x, y, z)` 関数ã§ã™ã€‚ã“ã®é–¢æ•°ã¯ãƒ¬ã‚¤ãƒ¤ãƒ¼ `x` 㨠`y` ã®ä¸¡æ–¹ãŒã‚ªãƒ³ã«ãªã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’調ã¹ã¾ã™ã€‚両方ã¨ã‚‚オンã®å ´åˆã¯ã€ãƒ¬ã‚¤ãƒ¤ãƒ¼ `z` ãŒã‚ªãƒ³ã«ãªã‚Šã¾ã™ã€‚ãれ以外ã®å ´åˆã€`x` 㨠`y` ã®ä¸¡æ–¹ãŒã‚ªãƒ³ã§ã¯ãªã„(一方ã®ã¿ãŒã‚ªãƒ³ã€ã¾ãŸã¯ã©ã¡ã‚‰ã‚‚オンã§ãªã„)å ´åˆã¯ã€ãƒ¬ã‚¤ãƒ¤ãƒ¼ `z` をオフã«ã—ã¾ã™ã€‚
+
+ã“ã®é–¢æ•°ã¯ã€ã“ã®æ©Ÿèƒ½ã‚’æŒã¤ç‰¹å®šã®ã‚­ãƒ¼ã‚’作æˆã—ãŸã„ãŒã€ä»–ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ãã†ã—ãŸããªã„å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚
+
+#### 例
+
+```c
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ }
+ return true;
+}
+```
+
+### `update_tri_layer_state(state, x, y, z)`
+ã‚‚ã†1ã¤ã®é–¢æ•°ã¯ `update_tri_layer_state(state, x, y, z)` ã§ã™ã€‚ã“ã®é–¢æ•°ã¯ [`layer_state_set_*` 関数](ja/custom_quantum_functions.md#layer-change-code)ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ã‚’æ„図ã—ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’使ã£ã¦ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚’変更ã™ã‚‹ãŸã³ã«ã€ã“ã‚ŒãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€`LT(layer, kc)` を使ã£ã¦ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚’変更ã™ã‚‹ã¨ã€åŒã˜ãƒ¬ã‚¤ãƒ¤ãƒ¼ãƒã‚§ãƒƒã‚¯ãŒå¼•ãèµ·ã“ã•ã‚Œã¾ã™ã€‚
+
+ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®æ³¨æ„点ã¯ã€`x` ãŠã‚ˆã³ `y` レイヤーをオンã«ã—ãªã„ã¨ã€`z` レイヤーã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã“ã¨ã§ã™ã€‚レイヤー `z` ã®ã¿ã‚’アクティブã«ã—よã†ã¨ã™ã‚‹ã¨ã€ã“ã®ã‚³ãƒ¼ãƒ‰ãŒå®Ÿè¡Œã•ã‚Œã€ä½¿ç”¨å‰ã«ãƒ¬ã‚¤ãƒ¤ãƒ¼ `z` ãŒã‚ªãƒ•ã«ãªã‚‹ã‹ã‚‰ã§ã™ã€‚
+
+#### 例
+
+```c
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
+```
+
+ã‚ã‚‹ã„ã¯ã€ã™ãã«å€¤ã‚’「返ã™ã€å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。複数ã®ãƒˆãƒ©ã‚¤ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚’追加ã€ã‚ã‚‹ã„ã¯è¿½åŠ ã®åŠ¹æžœã‚’追加ã™ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚
+
+```c
+layer_state_t layer_state_set_user(layer_state_t state) {
+ state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+ state = update_tri_layer_state(state, _RAISE, _SYMB, _SPECIAL);
+ return state;
+}
+```
+
+## 永続的ãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¬ã‚¤ãƒ¤ãƒ¼ã®è¨­å®š
+
+デフォルトレイヤーを設定ã—ã¦ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’å–り外ã—ã¦ã‚‚ä¿æŒã•ã‚Œã‚‹ã‚ˆã†ã«ã—ãŸã„ã§ã™ã‹ï¼Ÿãã†ã§ã‚ã‚Œã°ã€ã“ã‚ŒãŒãã®ãŸã‚ã®é–¢æ•°ã§ã™ã€‚
+
+ã“れを使ã†ã«ã¯ã€`set_single_persistent_default_layer(layer)` を使ã„ã¾ã™ã€‚レイヤーã«åå‰ãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ä»£ã‚ã‚Šã«ãれを使ã†ã“ã¨ãŒã§ãã¾ã™ (_QWERTYã€_DVORAKã€_COLEMAK ãªã©)。
+
+ã“ã‚Œã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚’設定ã—ã€æ°¸ç¶šè¨­å®šãŒæ›´æ–°ã•ã‚Œã€ã‚‚ã— [オーディオ](ja/feature_audio.md) ãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§æœ‰åŠ¹ã§ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¬ã‚¤ãƒ¤ãƒ¼ã®éŸ³ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€æ›²ã‚’å†ç”Ÿã—ã¾ã™ã€‚
+
+デフォルトレイヤーã®éŸ³ã‚’設定ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« `config.h` ファイルã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+```c
+#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
+ SONG(COLEMAK_SOUND), \
+ SONG(DVORAK_SOUND) \
+ }
+```
+
+
+?> [quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) ã«ä½¿ç”¨ã§ãる多ãã®å®šç¾©æ¸ˆã¿ã®æ›²ãŒã‚ã‚Šã¾ã™ã€‚
+
+## キーボードã®ãƒªã‚»ãƒƒãƒˆ
+
+使用ã§ãã‚‹ `RESET` quantum キーコードãŒã‚ã‚Šã¾ã™ã€‚ãŸã ã—ã€ã‚­ãƒ¼ã‚’個別ã«æŠ¼ã™ã®ã§ã¯ãªãマクロã®ä¸€éƒ¨ã¨ã—ã¦ãƒªã‚»ãƒƒãƒˆã—ãŸã„å ´åˆã¯ã€ãã†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ãã®ãŸã‚ã«ã¯ã€`reset_keyboard()` を関数ã¾ãŸã¯ãƒžã‚¯ãƒ­ã«è¿½åŠ ã™ã‚‹ã¨ã€ãƒ–ートローダãŒãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚
+
+## EEPROM (永続ストレージ)ã®æ¶ˆåŽ»
+
+オーディオã€RGB アンダーグローã€ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆã€ã‚­ãƒ¼ã®å‹•ä½œã«å•é¡ŒãŒã‚ã‚‹å ´åˆã¯ã€EEPROM (永続的ãªè¨­å®šã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸)をリセットã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ブートマジックã¯ã“れを行ã†æ–¹æ³•ã®1ã¤ã§ã™ãŒã€æœ‰åŠ¹ã«ãªã£ã¦ã„ãªã„å ´åˆã¯ã‚«ã‚¹ã‚¿ãƒ ãƒžã‚¯ãƒ­ã‚’使ã£ã¦è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+EEPROM を消去ã™ã‚‹ã«ã¯ã€é–¢æ•°ã¾ãŸã¯ãƒžã‚¯ãƒ­ã‹ã‚‰ `eeconfig_init()` を実行ã—ã€ã»ã¨ã‚“ã©ã®è¨­å®šã‚’デフォルトã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚
+
+## タップランダムキー
+
+ランダムãªæ–‡å­—をホストコンピュータã«é€ä¿¡ã™ã‚‹å ´åˆã¯ã€`tap_random_base64()` 関数を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã¯[疑似乱数的ã«](https://en.wikipedia.org/wiki/Pseudorandom_number_generator)0ã‹ã‚‰63ã®æ•°å­—ã‚’é¸æŠžã—ã€ãã®é¸æŠžã«åŸºã¥ã„ã¦ã‚­ãƒ¼æŠ¼ä¸‹ã‚’é€ä¿¡ã—ã¾ã™ã€‚(0–25 㯠`A`–`Z`ã€26–51 㯠`a`–`z`ã€52–61 㯠`0`–`9`ã€62 㯠`+`ã€63 㯠`/`)。
+
+?> 言ã†ã¾ã§ã‚‚ãªã„ã§ã™ãŒã€ã“ã‚Œã¯ãƒ©ãƒ³ãƒ€ãƒ ã« Base64 キーã‚ã‚‹ã„ã¯ãƒ‘スワードを生æˆã™ã‚‹æš—å·çš„ã«å®‰å…¨ãªæ–¹æ³•ã§ã¯ _ã‚ã‚Šã¾ã›ã‚“_。
+
+## ソフトウェアタイマー
+
+タイマーを開始ã—ã€æ™‚間固有ã®ã‚¤ãƒ™ãƒ³ãƒˆã®å€¤ã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚以下ã¯ä¾‹ã§ã™:
+
+```c
+static uint16_t key_timer;
+key_timer = timer_read();
+
+if (timer_elapsed(key_timer) < 100) {
+ // 経éŽæ™‚間㌠100ms 未満ã®å ´åˆã«ä½•ã‹ã‚’è¡Œã†
+} else {
+ // 経éŽæ™‚間㌠100ms 以上ã®å ´åˆã«ä½•ã‹ã‚’è¡Œã†
+}
+```
diff --git a/docs/ja/reference_configurator_support.md b/docs/ja/reference_configurator_support.md
new file mode 100644
index 0000000000..0151731e99
--- /dev/null
+++ b/docs/ja/reference_configurator_support.md
@@ -0,0 +1,202 @@
+# QMK Configurator ã§ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ã‚µãƒãƒ¼ãƒˆ
+
+<!---
+ original document: 0.9.46:docs/reference_configurator_support.md
+ git diff 0.9.46 HEAD -- docs/reference_configurator_support.md | cat
+-->
+
+ã“ã®ãƒšãƒ¼ã‚¸ã¯ [QMK Configurator](https://config.qmk.fm/) ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’é©åˆ‡ã«ã‚µãƒãƒ¼ãƒˆã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚
+
+
+## Configurator ãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’ç†è§£ã™ã‚‹æ–¹æ³•
+
+Configurator ãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’ã©ã®ã‚ˆã†ã«ç†è§£ã™ã‚‹ã‹ã‚’ç†è§£ã™ã‚‹ã«ã¯ã€æœ€åˆã«ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãƒžã‚¯ãƒ­ã‚’ç†è§£ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ¼”ç¿’ã§ã¯ã€17キーã®ãƒ†ãƒ³ã‚­ãƒ¼ PCB を想定ã—ã¾ã™ã€‚ã“れを `numpad` ã¨å‘¼ã³ã¾ã™ã€‚
+
+```
+|---------------|
+|NLk| / | * | - |
+|---+---+---+---|
+|7 |8 |9 | + |
+|---+---+---| |
+|4 |5 |6 | |
+|---+---+---+---|
+|1 |2 |3 |Ent|
+|-------+---| |
+|0 | . | |
+|---------------|
+```
+
+?> レイアウトマクロã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€[QMK ã®ç†è§£: マトリックススキャン](ja/understanding_qmk.md?id=matrix-scanning) 㨠[QMK ã®ç†è§£: マトリックスã‹ã‚‰ç‰©ç†ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¸ã®ãƒžãƒƒãƒ—](ja/understanding_qmk.md?id=matrix-to-physical-layout-map) を見ã¦ãã ã•ã„。
+
+Configurator ã® API ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã® `.h` ファイルを `qmk_firmware/keyboards/<keyboard>/<keyboard>.h` ã‹ã‚‰èª­ã¿å–ã‚Šã¾ã™ã€‚numpad ã®å ´åˆã€ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ `qmk_firmware/keyboards/numpad/numpad.h` ã§ã™:
+
+```c
+#pragma once
+
+#define LAYOUT( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, \
+ k30, k31, k32, k33, \
+ k40, k42 \
+ ) { \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, KC_NO }, \
+ { k30, k31, k32, k33 }, \
+ { k40, KC_NO, k42, KC_NO } \
+}
+```
+
+QMK 㯠`KC_NO` を使ã£ã¦ã€ã‚¹ã‚¤ãƒƒãƒãƒžãƒˆãƒªãƒƒã‚¯ã‚¹å†…ã®ã‚¹ã‚¤ãƒƒãƒãŒãªã„場所を指定ã—ã¾ã™ã€‚デãƒãƒƒã‚°ãŒå¿…è¦ãªå ´åˆã«ã€ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’読ã¿ã‚„ã™ãã™ã‚‹ãŸã‚ã«ã€`XXX`ã€`___`ã€`____` を略記ã¨ã—ã¦ä½¿ã†ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚通常㯠`.h` ファイルã®å…ˆé ­è¿‘ãã§å®šç¾©ã•ã‚Œã¾ã™:
+
+```c
+#pragma once
+
+#define XXX KC_NO
+
+#define LAYOUT( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, \
+ k30, k31, k32, k33, \
+ k40, k42 \
+ ) { \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, XXX }, \
+ { k30, k31, k32, k33 }, \
+ { k40, XXX, k42, XXX } \
+}
+```
+
+!> ã“ã®ä½¿ç”¨æ–¹æ³•ã¯ã‚­ãƒ¼ãƒžãƒƒãƒ—マクロã¨ç•°ãªã‚Šã¾ã™ã€‚キーマップマクロã¯ã»ã¨ã‚“ã©å¸¸ã«`KC_NO`ã«ã¤ã„ã¦ã¯`XXXXXXX` (7ã¤ã®å¤§æ–‡å­—ã® X) ã‚’ã€`KC_TRNS` ã«ã¤ã„ã¦ã¯ `_______` (7ã¤ã®ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢)を使ã„ã¾ã™ã€‚
+
+!> ユーザã®æ··ä¹±ã‚’防ããŸã‚ã«ã€`KC_NO` を使ã†ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+
+レイアウトマクロã¯ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«17個ã®ã‚­ãƒ¼ãŒã‚ã‚Šã€4列ãã‚Œãžã‚ŒãŒ5è¡Œã«é…ç½®ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’ Configurator ã«ä¼ãˆã¾ã™ã€‚スイッãƒã®ä½ç½®ã¯ã€0ã‹ã‚‰å§‹ã¾ã‚‹ `k<row><column>` ã¨ã„ã†åå‰ãŒä»˜ã‘られã¦ã„ã¾ã™ã€‚キーマップã‹ã‚‰ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å—ã‘å–る上部セクションã¨ã€ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹å†…ã®å„キーã®ä½ç½®ã‚’指定ã™ã‚‹ä¸‹éƒ¨ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¨ãŒä¸€è‡´ã™ã‚‹é™ã‚Šã€åå‰è‡ªä½“ã¯å®Ÿéš›ã«ã¯å•é¡Œã§ã¯ã‚ã‚Šã¾ã›ã‚“。
+
+物ç†çš„ãªã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«ä¼¼ãŸå½¢ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’表示ã™ã‚‹ã«ã¯ã€ãã‚Œãžã‚Œã®ã‚­ãƒ¼ã®ç‰©ç†çš„ãªä½ç½®ã¨ã‚µã‚¤ã‚ºã‚’スイッãƒãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã«çµã³ã¤ã‘ã‚‹ã“ã¨ã‚’ Configurator ã«ä¼ãˆã‚‹ JSON ファイルを作æˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+## JSON ファイルã®ãƒ“ルド
+
+JSON ファイルをビルドã™ã‚‹æœ€ã‚‚ç°¡å˜ãªæ–¹æ³•ã¯ã€[Keyboard Layout Editor](http://www.keyboard-layout-editor.com/) ("KLE") ã§ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’作æˆã™ã‚‹ã“ã¨ã§ã™ã€‚ã“ã® Raw Data ã‚’ QMK tool ã«å…¥ã‚Œã¦ã€Configurator ãŒèª­ã¿å‡ºã—ã¦ä½¿ç”¨ã™ã‚‹ JSON ファイルã«å¤‰æ›ã—ã¾ã™ã€‚KLE 㯠numpad レイアウトをデフォルトã§é–‹ããŸã‚ã€Getting Started ã®èª¬æ˜Žã‚’削除ã—ã€æ®‹ã‚Šã‚’使ã„ã¾ã™ã€‚
+
+レイアウトãŒæœ›ã¿é€šã‚Šã®ã‚‚ã®ã«ãªã£ãŸã‚‰ã€KLE ã® Raw Data タブã«ç§»å‹•ã—ã€å†…容をコピーã—ã¾ã™:
+
+```
+["Num Lock","/","*","-"],
+["7\nHome","8\n↑","9\nPgUp",{h:2},"+"],
+["4\nâ†","5","6\n→"],
+["1\nEnd","2\n↓","3\nPgDn",{h:2},"Enter"],
+[{w:2},"0\nIns",".\nDel"]
+```
+
+ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’ JSON ã«å¤‰æ›ã™ã‚‹ã«ã¯ã€[QMK KLE-JSON Converter](https://qmk.fm/converter/) ã«ç§»å‹•ã—ã€Raw Data ã‚’ Input フィールド ã«è²¼ã‚Šä»˜ã‘ã€Convert ボタンをクリックã—ã¾ã™ã€‚ã—ã°ã‚‰ãã™ã‚‹ã¨ã€JSON データ㌠Output フィールドã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚内容を新ã—ã„テキストドキュメントã«ã‚³ãƒ”ーã—ã€ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã« `info.json` ã¨ã„ã†åå‰ã‚’付ã‘ã€`numpad.h` ã‚’å«ã‚€åŒã˜ãƒ•ã‚©ãƒ«ãƒ€ã«ä¿å­˜ã—ã¾ã™ã€‚
+
+`keyboard_name` オブジェクトを使ã£ã¦ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®åå‰ã‚’設定ã—ã¾ã™ã€‚説明ã®ãŸã‚ã«ã€å„キーã®ã‚ªãƒ–ジェクトをå„è¡Œã«é…ç½®ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’人間ãŒèª­ã¿ã‚„ã™ã„ã‚‚ã®ã«ã™ã‚‹ãŸã‚ã®ã‚‚ã®ã§ã€Configurator ã®æ©Ÿèƒ½ã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。
+
+```json
+{
+ "keyboard_name": "Numpad",
+ "url": "",
+ "maintainer": "qmk",
+ "tags": {
+ "form_factor": "numpad"
+ },
+ "width": 4,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Num Lock", "x":0, "y":0},
+ {"label":"/", "x":1, "y":0},
+ {"label":"*", "x":2, "y":0},
+ {"label":"-", "x":3, "y":0},
+ {"label":"7", "x":0, "y":1},
+ {"label":"8", "x":1, "y":1},
+ {"label":"9", "x":2, "y":1},
+ {"label":"+", "x":3, "y":1, "h":2},
+ {"label":"4", "x":0, "y":2},
+ {"label":"5", "x":1, "y":2},
+ {"label":"6", "x":2, "y":2},
+ {"label":"1", "x":0, "y":3},
+ {"label":"2", "x":1, "y":3},
+ {"label":"3", "x":2, "y":3},
+ {"label":"Enter", "x":3, "y":3, "h":2},
+ {"label":"0", "x":0, "y":4, "w":2},
+ {"label":".", "x":2, "y":4}
+ ]
+ }
+ }
+}
+```
+
+`layouts` オブジェクトã«ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ç‰©ç†ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’表ã™ãƒ‡ãƒ¼ã‚¿ãŒå«ã¾ã‚Œã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã«ã¯ `LAYOUT` ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã‚ã‚Šã€ã“ã®ã‚ªãƒ–ジェクトå㯠`numpad.h` ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãƒžã‚¯ãƒ­ã®åå‰ã¨ä¸€è‡´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚`LAYOUT` オブジェクト自体ã«ã¯ `layout` ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ç‰©ç†ã‚­ãƒ¼ã”ã¨ã« 1ã¤ã® JSON オブジェクトãŒä»¥ä¸‹ã®å½¢å¼ã§å«ã¾ã‚Œã¦ã„ã¾ã™:
+
+```
+ キーã®åå‰ã€‚Configurator ã§ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。
+ |
+ | キーボードã®å·¦ç«¯ã‹ã‚‰ã®ã‚­ãƒ¼å˜ä½ã§ã®
+ | | キー㮠X 軸ã®ä½ç½®ã€‚
+ | |
+ | | キーボードã®ä¸Šç«¯(奥å´)ã‹ã‚‰ã®ã‚­ãƒ¼å˜ä½ã§ã®
+ | | | キー㮠Y 軸ä½ç½®ã€‚
+ ↓ ↓ ↓
+{"label":"Num Lock", "x":0, "y":0},
+```
+
+一部ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãã‚Œãžã‚Œã‚­ãƒ¼ã®å¹…ã¨é«˜ã•ã‚’表㙠`"w"` 属性キー㨠`"h"` 属性キーãŒã‚ã‚Šã¾ã™ã€‚
+
+?> `info.json` ファイルã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€[`info.json` å½¢å¼](ja/reference_info_json.md) ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
+
+
+## Configurator ãŒã‚­ãƒ¼ã‚’プログラムã™ã‚‹æ–¹æ³•
+
+Configurator ã® API ã¯ã€æŒ‡å®šã•ã‚ŒãŸãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãƒžã‚¯ãƒ­ã¨ JSON ファイルを使ã£ã¦ã€ç‰¹å®šã®ã‚­ãƒ¼ã«é–¢é€£ä»˜ã‘られãŸå„ビジュアルオブジェクトを順番ã«æŒã¤ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ãƒ“ジュアル表ç¾ã‚’作æˆã—ã¾ã™:
+
+| レイアウトマクロã®ã‚­ãƒ¼ | 使用ã•ã‚Œã‚‹ JSON オブジェクト |
+:---: | :----
+| k00 | {"label":"Num Lock", "x":0, "y":0} |
+| k01 | {"label":"/", "x":1, "y":0} |
+| k02 | {"label":"*", "x":2, "y":0} |
+| k03 | {"label":"-", "x":3, "y":0} |
+| k10 | {"label":"7", "x":0, "y":1} |
+| k11 | {"label":"8", "x":1, "y":1} |
+| k12 | {"label":"9", "x":2, "y":1} |
+| k13 | {"label":"+", "x":3, "y":1, "h":2} |
+| k20 | {"label":"4", "x":0, "y":2} |
+| k21 | {"label":"5", "x":1, "y":2} |
+| k22 | {"label":"6", "x":2, "y":2} |
+| k30 | {"label":"1", "x":0, "y":3} |
+| k31 | {"label":"2", "x":1, "y":3} |
+| k32 | {"label":"3", "x":2, "y":3} |
+| k33 | {"label":"Enter", "x":3, "y":3, "h":2} |
+| k40 | {"label":"0", "x":0, "y":4, "w":2} |
+| k42 | {"label":".", "x":2, "y":4} |
+
+ユーザ㌠Configurator ã§å·¦ä¸Šã®ã‚­ãƒ¼ã‚’é¸æŠžã—ã€Num Lock を割り当ã¦ã‚‹ã¨ã€Configurator ã¯æœ€åˆã®ã‚­ãƒ¼ã¨ã—㦠`KC_NLCK` ã‚’æŒã¤ã‚­ãƒ¼ãƒžãƒƒãƒ—を作æˆã—ã€åŒæ§˜ã«ã‚­ãƒ¼ãƒžãƒƒãƒ—ãŒä½œæˆã•ã‚Œã¾ã™ã€‚`label` キーã¯ä½¿ã‚ã‚Œã¾ã›ã‚“; ãれら㯠`info.json` ファイルをデãƒãƒƒã‚°ã™ã‚‹æ™‚ã«ç‰¹å®šã®ã‚­ãƒ¼ã‚’識別ã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ã®å‚ç…§ã®ãŸã‚ã ã‘ã®ã‚‚ã®ã§ã™ã€‚
+
+
+## å•é¡Œã¨å±é™º
+
+ç¾åœ¨ã®ã¨ã“ã‚ã€Configurator ã¯ã‚­ãƒ¼ã®å›žè»¢ã¾ãŸã¯ ISO Enter ãªã©ã®é•·æ–¹å½¢ã§ã¯ãªã„キーをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“。ã•ã‚‰ã«ã€"è¡Œ"ã‹ã‚‰åž‚ç›´æ–¹å‘ã«ãšã‚Œã¦ã„るキーã€&mdash; é¡•è‘—ãªä¾‹ã¨ã—㦠[TKC1800](https://github.com/qmk/qmk_firmware/tree/4ac48a61a66206beaf2fdd5f2939d8bbedd0004c/keyboards/tkc1800/) ã®ã‚ˆã†ãª1800レイアウト上ã®çŸ¢å°ã‚­ãƒ¼ &mdash; ã¯ã€ `info.json` ファイルã®æ供者ã«ã‚ˆã£ã¦èª¿æ•´ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€KLE-to-JSON コンãƒãƒ¼ã‚¿ã‚’æ··ä¹±ã•ã›ã¾ã™ã€‚
+
+### 回é¿ç­–
+
+#### 長方形ã§ã¯ãªã„キー
+
+ISO Enter キーã«ã¤ã„ã¦ã¯ã€QMK custom ã¯å¹… 1.25uã€é«˜ã• 2u ã®é•·æ–¹å½¢ã®ã‚­ãƒ¼ã¨ã—ã¦è¡¨ç¤ºã—ã€å³ç«¯ãŒè‹±æ•°å­—キーブロックã®å³ç«¯ã«æƒã†ã‚ˆã†ã«é…ç½®ã•ã‚Œã¾ã™ã€‚
+
+![](https://i.imgur.com/JKngtTw.png)
+*QMK Configurator ã«ã‚ˆã£ã¦æç”»ã•ã‚Œã‚‹æ¨™æº– ISO レイアウトã®60%キーボード。*
+
+#### åž‚ç›´æ–¹å‘ã«ãšã‚ŒãŸã‚­ãƒ¼
+
+åž‚ç›´æ–¹å‘ã«ãšã‚ŒãŸã‚­ãƒ¼ã«ã¤ã„ã¦ã¯ã€ãšã‚Œã¦ã„ãªã„ã‹ã®ã‚ˆã†ã« KLE ã§é…ç½®ã—ã€å¤‰æ›ã•ã‚ŒãŸ JSON ファイルã§å¿…è¦ã«å¿œã˜ã¦ Y 値を編集ã—ã¾ã™ã€‚
+
+![](https://i.imgur.com/fmDvDzR.png)
+*矢å°ã‚­ãƒ¼ã«é©ç”¨ã•ã‚Œã‚‹åž‚ç›´æ–¹å‘ã®ãšã‚Œã®ãªã„ã€Keyboard Layout Editor ã§æç”»ã•ã‚ŒãŸ1800レイアウトã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã€‚*
+
+![](https://i.imgur.com/8beYMBR.png)
+*キーボード㮠JSON ファイルã§çŸ¢å°ã‚­ãƒ¼ã‚’åž‚ç›´æ–¹å‘ã«ãšã‚‰ã™ãŸã‚ã«å¿…è¦ãªå¤‰æ›´ã‚’示ã™ã€Unix ã® diff ファイル。*
diff --git a/docs/ja/reference_glossary.md b/docs/ja/reference_glossary.md
new file mode 100644
index 0000000000..19791206f1
--- /dev/null
+++ b/docs/ja/reference_glossary.md
@@ -0,0 +1,173 @@
+# QMK 用語集
+
+<!---
+ original document: 0.9.46:docs/reference_glossary.md
+ git diff 0.9.46 HEAD -- docs/reference_glossary.md | cat
+-->
+
+## ARM
+Atmelã€Cypressã€Kinetisã€NXPã€STã€TI ãªã©å¤šãã®ä¼æ¥­ãŒç”Ÿç”£ã™ã‚‹ 32 ビット MCU ã®ãƒ©ã‚¤ãƒ³ã€‚
+
+## AVR
+[Atmel](http://www.microchip.com/) ãŒç”Ÿç”£ã™ã‚‹ 8 ビット MCU ã®ãƒ©ã‚¤ãƒ³ã€‚AVR 㯠TMK ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãŸå…ƒã®ãƒ—ラットフォームã§ã—ãŸã€‚
+
+## AZERTY
+標準的㪠Français (フランス) キーボードレイアウト。キーボードã®æœ€åˆã®6ã¤ã®ã‚­ãƒ¼ã‹ã‚‰å‘½åã•ã‚Œã¾ã—ãŸã€‚
+
+## ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆ
+キーボードã®ãƒ©ã‚¤ãƒˆã®ç·ç§°ã€‚ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆãŒä¸€èˆ¬çš„ã§ã™ãŒã€ãã‚Œã ã‘ã§ã¯ãªãã€ã‚­ãƒ¼ã‚­ãƒ£ãƒƒãƒ—ã‚ã‚‹ã„ã¯ã‚¹ã‚¤ãƒƒãƒã‚’通ã—ã¦å…‰ã‚‹ LED ã®é…列。
+
+## Bluetooth
+短è·é›¢ã®ãƒ”アツーピア無線プロトコル。キーボード用ã®ã‚‚ã£ã¨ã‚‚一般的ãªãƒ¯ã‚¤ãƒ¤ãƒ¬ã‚¹ãƒ—ロトコル。
+
+## ブートローダ
+MCU ã®ä¿è­·é ˜åŸŸã«æ›¸ãè¾¼ã¾ã‚Œã‚‹ç‰¹åˆ¥ãªãƒ—ログラムã§ã€MCU ãŒç‹¬è‡ªã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’通常㯠USB 経由ã§ã‚¢ãƒƒãƒ—グレードã§ãるよã†ã«ã—ã¾ã™ã€‚
+
+## ブートマジック
+よãã‚るキーã®äº¤æ›ã‚ã‚‹ã„ã¯ç„¡åŠ¹åŒ–ãªã©ã€æ§˜ã€…ãªã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®æŒ™å‹•ã®å¤‰æ›´ã‚’ãã®å ´ã§å®Ÿè¡Œã§ãる機能。
+
+## C
+システムコードã«é©ã—ãŸä½Žãƒ¬ãƒ™ãƒ«ãƒ—ログラミング言語。QMK ã®ã»ã¨ã‚“ã©ã®ã‚³ãƒ¼ãƒ‰ã¯ C ã§æ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚
+
+## Colemak
+人気ãŒå‡ºå§‹ã‚ã¦ã„る代替キーボードレイアウト。
+
+## コンパイル
+人間ãŒèª­ã‚るコードを MCU ãŒå®Ÿè¡Œã§ãるマシンコードã«å¤‰æ›ã™ã‚‹ãƒ—ロセス。
+
+## Dvorak
+1930年代㫠Dr. August Dvorak ã«ã‚ˆã£ã¦é–‹ç™ºã•ã‚ŒãŸä»£æ›¿ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€‚Dvorak Simplified Keyboard ã®çŸ­ç¸®å½¢ã€‚
+
+## 動的マクロ
+キーボードã«è¨˜éŒ²ã•ã‚ŒãŸãƒžã‚¯ãƒ­ã§ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ãƒ—ラグを抜ãã‹ã€ã‚³ãƒ³ãƒ”ュータをå†èµ·å‹•ã™ã‚‹ã¨å¤±ã‚ã‚Œã¾ã™ã€‚
+
+* [動的マクロドキュメント](ja/feature_dynamic_macros.md)
+
+## Eclipse
+多ãã® C 開発者ã«äººæ°—ã®ã‚ã‚‹ IDE。
+
+* [Eclipse セットアップ手順](ja/other_eclipse.md)
+
+## ファームウェア
+MCU を制御ã™ã‚‹ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢
+
+## git
+コマンドラインã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢
+
+## GitHub
+QMK プロジェクトã®ã»ã¨ã‚“ã©ã‚’ホストã™ã‚‹ Web サイト。gitã€èª²é¡Œç®¡ç†ã€ãŠã‚ˆã³ QMK ã®å®Ÿè¡Œã«å½¹ç«‹ã¤ãã®ä»–ã®æ©Ÿèƒ½ã‚’çµ±åˆã—ã¦æä¾›ã—ã¾ã™ã€‚
+
+## ISP
+インシステムプログラミング。外部ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã¨ JTAG ピンを使ã£ã¦ AVR ãƒãƒƒãƒ—をプログラミングã™ã‚‹æ–¹æ³•ã€‚
+
+## hid_listen
+キーボードã‹ã‚‰ãƒ‡ãƒãƒƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹ãŸã‚ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã€‚[QMK Flasher](https://github.com/qmk/qmk_flasher) ã‚ã‚‹ã„㯠[PJRC ã® hid_listen](https://www.pjrc.com/teensy/hid_listen.html) を使ã£ã¦ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## キーコード
+特定ã®ã‚­ãƒ¼ã‚’表ã™2ãƒã‚¤ãƒˆã®æ•°å€¤ã€‚`0x00`-`0xFF` ã¯[基本キーコード](ja/keycodes_basic.md)ã«ä½¿ã‚ã‚Œã€`0x100`-`0xFFFF` 㯠[Quantum キーコード](ja/quantum_keycodes.md) ã«ä½¿ã‚ã‚Œã¾ã™ã€‚
+
+## キーダウン
+キーãŒæŠ¼ã•ã‚ŒãŸæ™‚ã«ç™ºç”Ÿã—ã€ã‚­ãƒ¼ãŒæ”¾ã•ã‚Œã‚‹å‰ã«å®Œäº†ã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆã€‚
+
+## キーアップ
+キーãŒæ”¾ã•ã‚ŒãŸæ™‚ã«ç™ºç”Ÿã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆã€‚
+
+## キーマップ
+物ç†çš„ãªã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«ãƒžãƒƒãƒ—ã•ã‚ŒãŸã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®é…列。キーã®æŠ¼ä¸‹ãŠã‚ˆã³ãƒªãƒªãƒ¼ã‚¹æ™‚ã«å‡¦ç†ã•ã‚Œã¾ã™ã€‚
+
+## レイヤー
+1ã¤ã®ã‚­ãƒ¼ãŒè¤‡æ•°ã®ç›®çš„ã‚’æžœãŸã™ãŸã‚ã«ä½¿ã‚れる抽象化。最上ä½ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒå„ªå…ˆã•ã‚Œã¾ã™ã€‚
+
+## リーダーキー
+リーダーキーã«ç¶šã‘ã¦1, 2 ã‚ã‚‹ã„ã¯3ã¤ã®ã‚­ãƒ¼ã‚’タップã™ã‚‹ã“ã¨ã§ã€ã‚­ãƒ¼ã®æŠ¼ä¸‹ã‚ã‚‹ã„ã¯ä»–ã® quantum 機能をアクティブã«ã™ã‚‹æ©Ÿèƒ½ã€‚
+
+* [リーダーキードキュメント](ja/feature_leader_key.md)
+
+## LED
+発光ダイオード。キーボードã®è¡¨ç¤ºã«ä½¿ã‚れる最も一般的ãªãƒ‡ãƒã‚¤ã‚¹ã€‚
+
+## Make
+å…¨ã¦ã®ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コンパイルã™ã‚‹ãŸã‚ã«ä½¿ã‚れるソフトウェアパッケージ。キーボードファームウェアをコンパイルã™ã‚‹ãŸã‚ã«ã€æ§˜ã€…ãªã‚ªãƒ—ションを指定ã—㦠`make` を実行ã—ã¾ã™ã€‚
+
+## マトリックス
+MCU ãŒã‚ˆã‚Šå°‘ãªã„ピン数ã§ã‚­ãƒ¼æŠ¼ä¸‹ã‚’検出ã§ãるよã†ã«ã™ã‚‹åˆ—ã¨è¡Œã®é…線パターン。マトリックスã«ã¯å¤šãã®å ´åˆã€NKRO ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã®ãƒ€ã‚¤ã‚ªãƒ¼ãƒ‰ãŒçµ„ã¿è¾¼ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+
+## マクロ
+å˜ä¸€ã®ã‚­ãƒ¼ã®ã¿ã‚’押ã—ãŸå¾Œã§ã€è¤‡æ•°ã®ã‚­ãƒ¼æŠ¼ä¸‹ã‚¤ãƒ™ãƒ³ãƒˆ (HID レãƒãƒ¼ãƒˆ) ã‚’é€ä¿¡ã§ãる機能。
+
+* [マクロドキュメント](ja/feature_macros.md)
+
+## MCU
+マイクロコントロールユニット。キーボードを動ã‹ã™ãƒ—ロセッサ。
+
+## モディファイア
+別ã®ã‚­ãƒ¼ã‚’入力ã™ã‚‹é–“押ã—ãŸã¾ã¾ã«ã—ã¦ã€ãã®ã‚­ãƒ¼ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’変更ã™ã‚‹ã‚­ãƒ¼ã€‚例ã¨ã—ã¦ã€Ctrlã€Alt ãŠã‚ˆã³ Shift ãŒã‚ã‚Šã¾ã™ã€‚
+(訳注:モディファイヤã€ãƒ¢ãƒ‡ã‚£ãƒ•ã‚¡ã‚¤ãƒ¤ã‚­ãƒ¼ã€ä¿®é£¾ã‚­ãƒ¼ãªã©ã€è¨³èªžãŒçµ±ä¸€ã•ã‚Œã¦ã„ã¾ã›ã‚“ãŒåŒã˜ã‚‚ã®ã§ã™)
+
+## マウスキー
+キーボードã‹ã‚‰ãƒžã‚¦ã‚¹ã‚«ãƒ¼ã‚½ãƒ«ã‚’制御ã—ã€ã‚¯ãƒªãƒƒã‚¯ã§ãる機能。
+
+* [マウスキードキュメント](ja/feature_mouse_keys.md)
+
+## N キーロールオーãƒãƒ¼ (NKRO)
+一度ã«ä»»æ„ã®æ•°ã®ã‚­ãƒ¼ã®æŠ¼ä¸‹ã‚’é€ä¿¡ã§ãるキーボードã«å½“ã¦ã¯ã¾ã‚‹ç”¨èªžã€‚
+
+## ワンショットモディファイア
+別ã®ã‚­ãƒ¼ãŒæ”¾ã•ã‚Œã‚‹ã¾ã§æŠ¼ã•ã‚Œã¦ã„ã‚‹ã‹ã®ã‚ˆã†ã«æ©Ÿèƒ½ã™ã‚‹ãƒ¢ãƒ‡ã‚£ãƒ•ã‚¡ã‚¤ã‚¢ã€‚キーを押ã—ã¦ã„ã‚‹é–“ã« mod を押ã—続ã‘ã‚‹ã®ã§ã¯ãªãã€mod を押ã—ã¦ã‹ã‚‰ã‚­ãƒ¼ã‚’押ã™ã“ã¨ãŒã§ãã¾ã™ã€‚スティッキーキーã¾ãŸã¯ãƒ‡ãƒƒãƒ‰ã‚­ãƒ¼ã¨ã‚‚呼ã³ã¾ã™ã€‚
+
+## ProMicro
+低コスト㮠AVR 開発ボード。ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã®ã‚¯ãƒ­ãƒ¼ãƒ³ã¯ ebay ã§éžå¸¸ã«å®‰ä¾¡(5ドル未満)ã«è¦‹ã¤ã‹ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ãŒã€å¤šãã®å ´åˆ pro micro ã®æ›¸ãè¾¼ã¿ã«è‹¦åŠ´ã—ã¾ã™ã€‚
+
+## プルリクエスト
+QMK ã«ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã™ã‚‹ãƒªã‚¯ã‚¨ã‚¹ãƒˆã€‚å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒå€‹äººã®ã‚­ãƒ¼ãƒžãƒƒãƒ—ã®ãƒ—ルリクエストをé€ä¿¡ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚
+
+## QWERTY
+標準ã®è‹±èªžã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€‚多ãã®å ´åˆã€ä»–ã®è¨€èªžã®æ¨™æº–レイアウトã¸ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã€‚キーボードã®æœ€åˆã®6文字ã‹ã‚‰å‘½åã•ã‚Œã¾ã—ãŸã€‚
+
+## QWERTZ
+標準的㪠Deutsche (ドイツ語) キーボードレイアウト。キーボードã®æœ€åˆã®6文字ã‹ã‚‰å‘½åã•ã‚Œã¾ã—ãŸã€‚
+
+## ロールオーãƒãƒ¼
+キーãŒæ—¢ã«æŠ¼ã•ã‚Œã¦ã„ã‚‹é–“ã«ã‚­ãƒ¼ã‚’押ã™ã“ã¨ã‚’指ã™ç”¨èªžã€‚ä¼¼ãŸã‚‚ã®ã« 2KROã€6KROã€NKRO ãŒå«ã¾ã‚Œã¾ã™ã€‚
+
+## スキャンコード
+å˜ä¸€ã®ã‚­ãƒ¼ã‚’表㙠USB 経由㮠HID レãƒãƒ¼ãƒˆã®ä¸€éƒ¨ã¨ã—ã¦é€ä¿¡ã•ã‚Œã‚‹1ãƒã‚¤ãƒˆã®æ•°å€¤ã€‚ã“れらã®å€¤ã¯ã€[USB-IF](http://www.usb.org/) ãŒç™ºè¡Œã™ã‚‹ [HID Usage Tables](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) ã«è¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚
+
+## スペースカデットシフト
+å·¦ã¾ãŸã¯å³ shift ã‚’1回以上タップã™ã‚‹ã“ã¨ã§ã€æ§˜ã€…ãªã‚¿ã‚¤ãƒ—ã®æ‹¬å¼§ã‚’入力ã§ãる特別㪠shift キーã®ã‚»ãƒƒãƒˆã€‚
+
+* [スペースカデットシフトドキュメント](ja/feature_space_cadet_shift.md)
+
+## タップ
+キーを押ã—ã¦æ”¾ã™ã€‚状æ³ã«ã‚ˆã£ã¦ã¯ã‚­ãƒ¼ãƒ€ã‚¦ãƒ³ã‚¤ãƒ™ãƒ³ãƒˆã¨ã‚­ãƒ¼ã‚¢ãƒƒãƒ—イベントを区別ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€ã‚¿ãƒƒãƒ—ã¯å¸¸ã«ä¸¡æ–¹ã‚’一度ã«æŒ‡ã—ã¾ã™ã€‚
+
+## タップダンス
+押ã™å›žæ•°ã«åŸºã¥ã„ã¦ã€åŒã˜ã‚­ãƒ¼ã«è¤‡æ•°ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ãる機能。
+
+* [タップダンスドキュメント](ja/feature_tap_dance.md)
+
+## Teensy
+手é…ç·šã§ã®çµ„ã¿ç«‹ã¦ã«ã‚ˆã用ã„られる低コスト㮠AVR 開発ボード。halfkay ブートローダã«ã‚ˆã£ã¦æ›¸ãè¾¼ã¿ãŒéžå¸¸ã«ç°¡å˜ã«ãªã‚‹ãŸã‚ã«ã€æ•°ãƒ‰ãƒ«é«˜ã„ã«ã‚‚ã‹ã‹ã‚ら㚠teensy ãŒã—ã°ã—ã°é¸æŠžã•ã‚Œã¾ã™ã€‚
+
+## アンダーライト
+キーボードã®ä¸‹å´ã‚’照ら㙠LED ã®ç·ç§°ã€‚ã“れら㮠LED ã¯é€šå¸¸ PCB ã®åº•é¢ã‹ã‚‰ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãŒç½®ã‹ã‚Œã¦ã„る表é¢ã«å‘ã‘ã¦ç…§ã‚‰ã—ã¾ã™ã€‚
+
+## ユニコード
+大è¦æ¨¡ãªã‚³ãƒ³ãƒ”ュータã®ä¸–ç•Œã§ã¯ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰ã¯ä»»æ„ã®è¨€èªžã§æ–‡å­—を表ç¾ã™ã‚‹ãŸã‚ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰æ–¹å¼ã®ã‚»ãƒƒãƒˆã§ã™ã€‚QMK ã«é–¢ã—ã¦ã¯ã€æ§˜ã€…㪠OS スキームを使ã£ã¦ã‚¹ã‚­ãƒ£ãƒ³ã‚³ãƒ¼ãƒ‰ã®ä»£ã‚ã‚Šã«ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰ã‚³ãƒ¼ãƒ‰ãƒã‚¤ãƒ³ãƒˆã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
+
+* [ユニコードドキュメント](ja/feature_unicode.md)
+
+## å˜ä½“テスト
+QMK ã«å¯¾ã—ã¦è‡ªå‹•ãƒ†ã‚¹ãƒˆã‚’実行ã™ã‚‹ãŸã‚ã®ãƒ•ãƒ¬ãƒ¼ãƒ ãƒ¯ãƒ¼ã‚¯ã€‚å˜ä½“テストã¯ã€å¤‰æ›´ãŒä½•ã‚‚壊ã•ãªã„ã“ã¨ã‚’確信ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚
+
+* [å˜ä½“テストドキュメント](ja/unit_testing.md)
+
+## USB
+ユニãƒãƒ¼ã‚µãƒ«ã‚·ãƒªã‚¢ãƒ«ãƒã‚¹ã€‚キーボード用ã®æœ€ã‚‚一般的ãªæœ‰ç·šã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã€‚
+
+## USB ホスト (ã‚ã‚‹ã„ã¯å˜ã«ãƒ›ã‚¹ãƒˆ)
+USB ホストã¯ã€ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ュータã€ã¾ãŸã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãŒå·®ã—è¾¼ã¾ã‚Œã¦ã„るデãƒã‚¤ã‚¹ã®ã“ã¨ã§ã™ã€‚
+
+# 探ã—ã¦ã„る用語ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã‹ï¼Ÿ
+
+質å•ã«ã¤ã„ã¦ã® [issue ã‚’é–‹ã„ã¦](https://github.com/qmk/qmk_firmware/issues) ã€è³ªå•ã—ãŸç”¨èªžã«ã¤ã„ã¦ã“ã“ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã•ã‚‰ã«è‰¯ã„ã®ã¯ã€å®šç¾©ã«ã¤ã„ã¦ã®ãƒ—ルリクエストを開ãã“ã¨ã§ã™ã€‚:)
diff --git a/docs/ja/reference_info_json.md b/docs/ja/reference_info_json.md
new file mode 100644
index 0000000000..0fa1f9d3fe
--- /dev/null
+++ b/docs/ja/reference_info_json.md
@@ -0,0 +1,78 @@
+# `info.json`
+
+<!---
+ original document: 0.9.46:docs/reference_info_json.md
+ git diff 0.9.46 HEAD -- docs/reference_info_json.md | cat
+-->
+
+ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ [QMK API](https://github.com/qmk/qmk_api) ã«ã‚ˆã£ã¦ä½¿ã‚ã‚Œã¾ã™ã€‚ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ [QMK Configurator](https://config.qmk.fm/) ãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ç”»åƒã‚’表示ã™ã‚‹ãŸã‚ã«å¿…è¦ãªæƒ…報をå«ã‚“ã§ã„ã¾ã™ã€‚ã“ã“ã«ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+
+ã“ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’指定ã™ã‚‹ãŸã‚ã«ã€`qmk_firmware/keyboards/<name>` ã®ä¸‹ã®å…¨ã¦ã®ãƒ¬ãƒ™ãƒ«ã§ `info.json` を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯çµåˆã•ã‚Œã€ã‚ˆã‚Šå…·ä½“çš„ãªãƒ•ã‚¡ã‚¤ãƒ«ãŒãã†ã§ã¯ãªã„ファイルã®ã‚­ãƒ¼ã‚’上書ãã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿æƒ…報を複製ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。例ãˆã°ã€`qmk_firmware/keyboards/clueboard/info.json` 㯠`manufacturer` ãŠã‚ˆã³ `maintainer` を指定ã—ã€`qmk_firmware/keyboards/clueboard/66/info.json` 㯠Clueboard 66% ã«ã¤ã„ã¦ã®ã‚ˆã‚Šå…·ä½“çš„ãªæƒ…報を指定ã—ã¾ã™ã€‚
+
+## `info.json` ã®å½¢å¼
+
+`info.json` ファイルã¯è¨­å®šå¯èƒ½ãªä»¥ä¸‹ã®ã‚­ãƒ¼ã‚’æŒã¤ JSON å½¢å¼ã®è¾žæ›¸ã§ã™ã€‚å…¨ã¦ã‚’設定ã™ã‚‹å¿…è¦ã¯ãªãã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«é©ç”¨ã™ã‚‹ã‚­ãƒ¼ã ã‘を設定ã—ã¾ã™ã€‚
+
+* `keyboard_name`
+ * キーボードを説明ã™ã‚‹è‡ªç”±å½¢å¼ã®ãƒ†ã‚­ã‚¹ãƒˆæ–‡å­—列。
+ * 例: `Clueboard 66%`
+* `url`
+ * キーボードã®è£½å“ページã€[QMK.fm/keyboards](https://qmk.fm/keyboards) ã®ãƒšãƒ¼ã‚¸ã€ã‚ã‚‹ã„ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«é–¢ã™ã‚‹æƒ…報を説明ã™ã‚‹ä»–ã®ãƒšãƒ¼ã‚¸ã® URL。
+* `maintainer`
+ * メンテナ㮠GitHub ã®ãƒ¦ãƒ¼ã‚¶åã€ã‚ã‚‹ã„ã¯ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ãŒç®¡ç†ã™ã‚‹ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å ´åˆã¯ `qmk`
+* `width`
+ * キーå˜ä½ã§ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å¹…
+* `height`
+ * キーå˜ä½ã§ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®é«˜ã•
+* `layouts`
+ * 物ç†çš„ãªãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆè¡¨ç¾ã€‚詳細ã¯ä»¥ä¸‹ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’見ã¦ãã ã•ã„。
+
+### レイアウトã®å½¢å¼
+
+`info.json` ファイル内ã®è¾žæ›¸ã® `layouts` 部分ã¯ã€å¹¾ã¤ã‹ã®å…¥ã‚Œå­ã«ãªã£ãŸè¾žæ›¸ã‚’å«ã¿ã¾ã™ã€‚外å´ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã¯ QMK レイアウトマクロã§æ§‹æˆã•ã‚Œã¾ã™ã€‚例ãˆã°ã€`LAYOUT_ansi` ã‚ã‚‹ã„㯠`LAYOUT_iso`。å„レイアウトマクロ内ã«ã¯ã€`width`〠`height`ã€`key_count` ã®ã‚­ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚ã“れらã¯è‡ªæ˜Žã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
+
+* `width`
+ * オプション: キーå˜ä½ã§ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®å¹…
+* `height`
+ * オプション: キーå˜ä½ã§ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®é«˜ã•
+* `key_count`
+ * オプション: ã“ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®ã‚­ãƒ¼ã®æ•°
+* `layout`
+ * 物ç†ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’説明ã™ã‚‹ã‚­ãƒ¼è¾žæ›¸ã®ãƒªã‚¹ãƒˆã€‚詳細ã¯æ¬¡ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’見ã¦ãã ã•ã„。
+
+### キー辞書形å¼
+
+レイアウトã®å„キー辞書ã¯ã€ã‚­ãƒ¼ã®ç‰©ç†ãƒ—ロパティを記述ã—ã¾ã™ã€‚<http://keyboard-layout-editor.com> ã® Raw Code ã«ç²¾é€šã—ã¦ã„ã‚‹å ´åˆã€å¤šãã®æ¦‚念ãŒåŒã˜ã§ã‚ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚å¯èƒ½ãªé™ã‚ŠåŒã˜ã‚­ãƒ¼åã¨ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®é¸æŠžã‚’å†åˆ©ç”¨ã—ã¾ã™ãŒã€keyboard-layout-editor ã¨ã¯ç•°ãªã£ã¦å„キーã¯ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¬ã‚¹ã§ã€å‰ã®ã‚­ãƒ¼ã‹ã‚‰ãƒ—ロパティを継承ã—ã¾ã›ã‚“。
+
+å…¨ã¦ã®ã‚­ãƒ¼ã®ä½ç½®ã¨å›žè»¢ã¯ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å·¦ä¸Šã¨ã€å„キーã®å·¦ä¸Šã‚’基準ã«ã—ã¦æŒ‡å®šã•ã‚Œã¾ã™ã€‚
+
+* `x`
+ * **å¿…é ˆ**: 水平軸ã§ã®ã‚­ãƒ¼ã®çµ¶å¯¾ä½ç½®(キーå˜ä½)。
+* `y`
+ * **å¿…é ˆ**: 垂直軸ã§ã®ã‚­ãƒ¼ã®çµ¶å¯¾ä½ç½®(キーå˜ä½)。
+* `w`
+ * キーå˜ä½ã§ã®ã‚­ãƒ¼ã®å¹…。`ks` ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト: `1`
+* `h`
+ * キーå˜ä½ã§ã®ã‚­ãƒ¼ã®é«˜ã•ã€‚`ks` ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト: `1`
+* `r`
+ * キーを回転ã•ã›ã‚‹æ™‚計回りã®è§’度。
+* `rx`
+ * キーを回転ã•ã›ã‚‹ç‚¹ã®æ°´å¹³è»¸ã«ãŠã‘る絶対ä½ç½®ã€‚デフォルト: `x`
+* `ry`
+ * キーを回転ã•ã›ã‚‹ç‚¹ã®åž‚直軸ã«ãŠã‘る絶対ä½ç½®ã€‚デフォルト: `y`
+* `ks`
+ * キー形状: キーå˜ä½ã§é ‚点を列挙ã™ã‚‹ã“ã¨ã§ãƒãƒªã‚´ãƒ³ã‚’定義ã—ã¾ã™ã€‚
+ * **é‡è¦**: ã“れらã¯ã‚­ãƒ¼ã®å·¦ä¸Šã‹ã‚‰ã®ç›¸å¯¾ä½ç½®ã§ã€çµ¶å¯¾ä½ç½®ã§ã¯ã‚ã‚Šã¾ã›ã‚“。
+ * ISO Enter ã®ä¾‹: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
+* `label`
+ * マトリックス内ã®ã“ã®ä½ç½®ã«ã¤ã‘ã‚‹åå‰ã€‚
+ * ã“ã‚Œã¯é€šå¸¸ PCB 上ã§ã“ã®ä½ç½®ã«ã‚·ãƒ«ã‚¯ã‚¹ã‚¯ãƒªãƒ¼ãƒ³å°åˆ·ã•ã‚Œã‚‹ã‚‚ã®ã¨åŒã˜åå‰ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
+
+## メタデータã¯ã©ã®ã‚ˆã†ã«å…¬é–‹ã•ã‚Œã¾ã™ã‹ï¼Ÿ
+
+ã“ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¯ä¸»ã«2ã¤ã®æ–¹æ³•ã§ä½¿ã‚ã‚Œã¾ã™:
+
+* Web ベース㮠configurator ãŒå‹•çš„ã« UI を生æˆã§ãるよã†ã«ã™ã‚‹ã€‚
+* æ–°ã—ã„ `make keyboard:keymap:qmk` ターゲットをサãƒãƒ¼ãƒˆã™ã‚‹ã€‚ã“ã‚Œã¯ã€ã“ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ファームウェアã«ãƒãƒ³ãƒ‰ãƒ«ã—㦠QMK Toolbox をよりスマートã«ã—ã¾ã™ã€‚
+
+Configurator ã®ä½œæˆè€…ã¯ã€JSON API ã®ä½¿ç”¨ã«é–¢ã™ã‚‹è©³ç´°ã«ã¤ã„ã¦ã€[QMK Compiler](https://docs.api.qmk.fm/using-the-api) ドキュメントをå‚ç…§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
diff --git a/docs/ja/reference_keymap_extras.md b/docs/ja/reference_keymap_extras.md
new file mode 100644
index 0000000000..e8104e5f3e
--- /dev/null
+++ b/docs/ja/reference_keymap_extras.md
@@ -0,0 +1,88 @@
+# 言語固有ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰
+
+<!---
+ original document: 0.9.55:docs/reference_keymap_extras.md
+ git diff 0.9.55 HEAD -- docs/reference_keymap_extras.md | cat
+-->
+
+キーボードã¯å¤šãã®è¨€èªžã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ãれらã¯ã‚­ãƒ¼ã‚’押ã—ãŸã“ã¨ã§ç”Ÿæˆã•ã‚Œã‚‹å®Ÿéš›ã®æ–‡å­—ã‚’é€ä¿¡ã—ã¾ã›ã‚“ - 代ã‚ã‚Šã«æ•°å­—ã®ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã—ã¾ã™ã€‚USB HID ã®ä»•æ§˜ã§ã¯ãれら㯠"usages" ã¨å‘¼ã°ã‚Œã¾ã™ãŒã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®æ–‡è„ˆã§ã¯ã€Œã‚¹ã‚­ãƒ£ãƒ³ã‚³ãƒ¼ãƒ‰ã€ã‚ã‚‹ã„ã¯ã€Œã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã€ã¨å‘¼ã°ã‚Œã‚‹ã“ã¨ãŒå¤šã„ã§ã™ã€‚
+HID Keyboard/Keypad usage ページã§ã¯ 256 未満㮠usage ãŒå®šç¾©ã•ã‚Œã¦ãŠã‚Šã€ãれらã®ä¸€éƒ¨ã¯ç¾åœ¨ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。ã§ã¯ã€ã“ã®è¨€èªžã®ã‚µãƒãƒ¼ãƒˆã¯ã©ã®ã‚ˆã†ã«ã—ã¦å®Ÿç¾ã•ã‚Œã‚‹ã®ã§ã—ょã†ã‹ï¼Ÿ
+
+ç°¡å˜ã«è¨€ã†ã¨ã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ¦ãƒ¼ã‚¶ãŒè¨­å®šã—ãŸã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«åŸºã¥ã„ã¦å—ã‘å–ã£ãŸ usage ã‚’é©åˆ‡ãªæ–‡å­—ã«ãƒžãƒƒãƒ—ã—ã¾ã™ã€‚例ãˆã°ã€ã‚¹ã‚¦ã‚§ãƒ¼ãƒ‡ãƒ³äººãŒã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã® `Ã¥` ã¨ã„ã†æ–‡å­—ãŒåˆ»å°ã•ã‚ŒãŸã‚­ãƒ¼ã‚’押ã™ã¨ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã¯ *実際ã«ã¯* `[` ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã—ã¾ã™ã€‚
+
+明らã‹ã«ã“ã‚Œã¯æ··ä¹±ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€QMK ã¯å¤šãã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®ãŸã‚ã«è¨€èªžå›ºæœ‰ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®ã‚¨ã‚¤ãƒªã‚¢ã‚¹ã‚’æä¾›ã—ã¾ã™ã€‚ã“れらã¯ãã‚Œã ã‘ã§ã¯ä½•ã‚‚ã—ã¾ã›ã‚“ - ã•ã‚‰ã« OS ã®è¨­å®šã§å¯¾å¿œã™ã‚‹ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ãれらをキーマップã®ã‚­ãƒ¼ã‚­ãƒ£ãƒƒãƒ—ラベルã¨è€ƒãˆã¦ãã ã•ã„。
+
+ã“れらを使ã†ã«ã¯ã€`keymap.c` ã§å¯¾å¿œã™ã‚‹ [ヘッダファイル](https://github.com/qmk/qmk_firmware/tree/master/quantum/keymap_extras) ã‚’ `#include` ã—ã€ãれらã§å®šç¾©ã•ã‚Œã¦ã„るキーコードを `KC_` プリフィクスã®ä»£ã‚ã‚Šã«è¿½åŠ ã—ã¾ã™:
+
+| レイアウト | ヘッダファイル |
+|-----------------------------|----------------------------------|
+| Canadian Multilingual (CSA) | `keymap_canadian_multilingual.h` |
+| Croatian | `keymap_croatian.h` |
+| Czech | `keymap_czech.h` |
+| Danish | `keymap_danish.h` |
+| Dutch (Belgium) | `keymap_belgian.h` |
+| English (Ireland) | `keymap_irish.h` |
+| English (UK) | `keymap_uk.h` |
+| English (US International) | `keymap_us_international.h` |
+| Estonian | `keymap_estonian.h` |
+| Finnish | `keymap_finnish.h` |
+| French | `keymap_french.h` |
+| French (AFNOR) | `keymap_french_afnor.h` |
+| French (BÉPO) | `keymap_bepo.h` |
+| French (Belgium) | `keymap_belgian.h` |
+| French (Switzerland) | `keymap_fr_ch.h` |
+| French (macOS, ISO) | `keymap_french_osx.h` |
+| German | `keymap_german.h` |
+| German (Switzerland) | `keymap_german_ch.h` |
+| German (macOS) | `keymap_german_osx.h` |
+| German (Neo2)* | `keymap_neo2.h` |
+| Greek* | `keymap_greek.h` |
+| Hebrew* | `keymap_hebrew.h` |
+| Hungarian | `keymap_hungarian.h` |
+| Icelandic | `keymap_icelandic.h` |
+| Italian | `keymap_italian.h` |
+| Italian (macOS, ANSI) | `keymap_italian_osx_ansi.h` |
+| Italian (macOS, ISO) | `keymap_italian_osx_iso.h` |
+| Japanese | `keymap_jp.h` |
+| Korean | `keymap_korean.h` |
+| Latvian | `keymap_latvian.h` |
+| Lithuanian (ĄŽERTY) | `keymap_lithuanian_azerty.h` |
+| Lithuanian (QWERTY) | `keymap_lithuanian_qwerty.h` |
+| Norwegian | `keymap_norwegian.h` |
+| Polish | `keymap_polish.h` |
+| Portuguese | `keymap_portuguese.h` |
+| Portuguese (Brazil) | `keymap_br_abnt2.h` |
+| Romanian | `keymap_romanian.h` |
+| Russian* | `keymap_russian.h` |
+| Serbian* | `keymap_serbian.h` |
+| Serbian (Latin) | `keymap_serbian_latin.h` |
+| Slovak | `keymap_slovak.h` |
+| Slovenian | `keymap_slovenian.h` |
+| Spanish | `keymap_spanish.h` |
+| Spanish (Dvorak) | `keymap_spanish_dvorak.h` |
+| Swedish | `keymap_swedish.h` |
+| Turkish (F) | `keymap_turkish_f.h` |
+| Turkish (Q) | `keymap_turkish_q.h` |
+
+言語固有ã§ãªã„ã‚‚ã®ã‚‚ã‚ã‚Šã¾ã™ãŒã€QWERTY レイアウトを使ã£ã¦ã„ãªã„å ´åˆã«å½¹ç«‹ã¡ã¾ã™:
+
+| レイアウト | ヘッダファイル |
+|---------------------|--------------------------|
+| Colemak | `keymap_colemak.h` |
+| Dvorak | `keymap_dvorak.h` |
+| Dvorak (French) | `keymap_dvorak_fr.h` |
+| Dvorak (Programmer) | `keymap_dvp.h` |
+| Norman | `keymap_norman.h` |
+| Plover* | `keymap_plover.h` |
+| Plover (Dvorak)* | `keymap_plover_dvorak.h` |
+| Steno* | `keymap_steno.h` |
+| Workman | `keymap_workman.h` |
+| Workman (ZXCVM) | `keymap_workman_zxcvm.h` |
+
+## Sendstring サãƒãƒ¼ãƒˆ
+
+デフォルトã§ã¯ã€`SEND_STRING()` 㯠US ANSI キーボードレイアウトãŒè¨­å®šã•ã‚ŒãŸã¨è¦‹ãªã—ã¾ã™ã€‚別ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’使ã£ã¦ã„ã‚‹å ´åˆã¯ã€ã‚­ãƒ¼ãƒžãƒƒãƒ—ã§(上記ã®ã‚ˆã†ã«)`#include "sendstring_*.h"` ã—ã¦ã€ASCII 文字をキーコードã«ãƒžãƒƒãƒ”ングã™ã‚‹ãŸã‚ã«ä½¿ã‚れるルックアップテーブルを上書ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã“ã“ã§æ³¨æ„ã™ã¹ãé‡è¦ãªç‚¹ã¯ã€`SEND_STRING()` 㯠[ASCII 文字](https://en.wikipedia.org/wiki/ASCII#Character_set) ã§ã®ã¿æ©Ÿèƒ½ã™ã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã“ã‚Œã¯ã€ãƒ¦ãƒ‹ã‚³ãƒ¼ãƒ‰æ–‡å­—ã‚’å«ã‚€æ–‡å­—列を渡ã™ã“ã¨ãŒã§ããªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ - 残念ãªãŒã‚‰ã€ã“ã‚Œã«ã¯å¸Œæœ›ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«å­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ã®ã‚るアクセント付ã文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+多ãã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§ã¯ã€Grave ã¾ãŸã¯ Tilde ãªã©ã®ç‰¹å®šã®æ–‡å­—ã‚’[デッドキー](https://en.wikipedia.org/wiki/Dead_key)ã¨ã—ã¦ã®ã¿ä½¿ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚ãã®ãŸã‚ã€ãƒ‡ãƒƒãƒ‰ã‚­ãƒ¼ãŒæ¬¡ã®æ–‡å­—ã¨æ½œåœ¨çš„ã«çµåˆã•ã‚Œã‚‹ã“ã¨ã‚’防ããŸã‚ã«ã¯ã€é€ä¿¡ã—ãŸã„文字列ã®ä¸­ã®ãƒ‡ãƒƒãƒ‰ã‚­ãƒ¼ã®ã™ã後ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’追加ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+ラテン語由æ¥ã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‚’使ã‚ãªã„(例ãˆã°ã€ã‚®ãƒªã‚·ãƒ£èªžã‚„ロシア語ã®ã‚ˆã†ãª)ä»–ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«ã¯ã€Sendstring ヘッダーãŒã‚ã‚Šã¾ã›ã‚“。従ã£ã¦ ASCII 文字セットã®ã»ã¨ã‚“ã©ã‚’入力ã™ã‚‹æ–¹æ³•ãŒã‚ã‚Šã¾ã›ã‚“。ã“れらã¯ä¸Šè¨˜ã§ `*` ã§ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚
diff --git a/docs/ja/serial_driver.md b/docs/ja/serial_driver.md
new file mode 100644
index 0000000000..72071f4f7e
--- /dev/null
+++ b/docs/ja/serial_driver.md
@@ -0,0 +1,75 @@
+# 'シリアル' ドライãƒ
+
+<!---
+ original document: 0.9.51:docs/serial_drive.md
+ git diff 0.9.51 HEAD -- docs/serial_drive.md | cat
+-->
+
+ã“ã®ãƒ‰ãƒ©ã‚¤ãƒã¯[分割キーボード](ja/feature_split_keyboard.md) 機能ã«ä½¿ã„ã¾ã™ã€‚
+
+?> ã“ã®æ–‡ç« ã§ã®ã‚·ãƒªã‚¢ãƒ«ã¯ã€UART/USART/RS485/RS232 è¦æ ¼ã®å®Ÿè£…ã§ã¯ãªãã€**一度ã«1ビットã®æƒ…報をé€ä¿¡ã™ã‚‹ã‚‚ã®**ã¨ã—ã¦èª­ã¾ã‚Œã‚‹ã¹ãã§ã™ã€‚
+
+ã“ã®ã‚«ãƒ†ã‚´ãƒªã®å…¨ã¦ã®ãƒ‰ãƒ©ã‚¤ãƒã«ã¯ä»¥ä¸‹ã®ç‰¹å¾´ãŒã‚ã‚Šã¾ã™:
+* 1本ã®ç·šä¸Šã§ãƒ‡ãƒ¼ã‚¿ã¨ä¿¡å·ã‚’æä¾›
+* シングルマスタã€ã‚·ãƒ³ã‚°ãƒ«ã‚¹ãƒ¬ãƒ¼ãƒ–ã«é™å®š
+
+## サãƒãƒ¼ãƒˆã•ã‚Œã‚‹ãƒ‰ãƒ©ã‚¤ãƒã®ç¨®é¡ž
+
+| | AVR | ARM |
+|-------------------|--------------------|--------------------|
+| bit bang | :heavy_check_mark: | :heavy_check_mark: |
+| USART Half-duplex | | :heavy_check_mark: |
+
+## ドライãƒè¨­å®š
+
+### Bitbang
+デフォルトã®ãƒ‰ãƒ©ã‚¤ãƒã€‚設定ãŒãªã„å ´åˆã¯ã“ã®ãƒ‰ãƒ©ã‚¤ãƒãŒæƒ³å®šã•ã‚Œã¾ã™ã€‚設定ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã‚’ rules.mk ã«è¿½åŠ ã—ã¾ã™:
+
+```make
+SERIAL_DRIVER = bitbang
+```
+
+config.h を介ã—ã¦ãƒ‰ãƒ©ã‚¤ãƒã‚’設定ã—ã¾ã™:
+```c
+#define SOFT_SERIAL_PIN D0 // ã¾ãŸã¯ D1, D2, D3, E6
+#define SELECT_SOFT_SERIAL_SPEED 1 // ã¾ãŸã¯ 0, 2, 3, 4, 5
+ // 0: ç´„ 189kbps (実験目的ã®ã¿)
+ // 1: 約 137kbps (デフォルト)
+ // 2: ç´„ 75kbps
+ // 3: ç´„ 39kbps
+ // 4: ç´„ 26kbps
+ // 5: ç´„ 20kbps
+```
+
+#### ARM
+
+!> bitbang ドライãƒã¯ bitbang WS2812 ドライãƒã¨æŽ¥ç¶šã®å•é¡ŒãŒã‚ã‚Šã¾ã™
+
+上記ã®ä¸€èˆ¬çš„ãªã‚ªãƒ—ションã«åŠ ãˆã¦ã€halconf.h 㧠`PAL_USE_CALLBACKS` 機能もオンã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+### USART Half-duplex
+通信㌠USART ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ‡ãƒã‚¤ã‚¹ã«é€ä¿¡ã•ã‚Œã‚‹ STM32 ボードãŒå¯¾è±¡ã§ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šé«˜é€Ÿã§æ­£ç¢ºãªã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’æä¾›ã§ãã‚‹ã“ã¨ãŒåˆ©ç‚¹ã§ã™ã€‚ã“ã®ãƒ‰ãƒ©ã‚¤ãƒã® `SOFT_SERIAL_PIN` ã¯ã€è¨­å®šã•ã‚ŒãŸ USART TX ピンã§ã™ã€‚**TX ピンã«é©åˆ‡ãªãƒ—ルアップ抵抗ãŒå¿…è¦ã§ã™**。設定ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã‚’ rules.mk ã«è¿½åŠ ã—ã¾ã™:
+
+```make
+SERIAL_DRIVER = usart
+```
+
+config.h を介ã—ã¦ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’設定ã—ã¾ã™:
+```c
+#define SOFT_SERIAL_PIN B6 // USART TX ピン
+#define SELECT_SOFT_SERIAL_SPEED 1 // ã¾ãŸã¯ 0, 2, 3, 4, 5
+ // 0: 約 460800 ボー
+ // 1: 約 230400 ボー (デフォルト)
+ // 2: 約 115200 ボー
+ // 3: 約 57600 ボー
+ // 4: 約 38400 ボー
+ // 5: 約 19200 ボー
+#define SERIAL_USART_DRIVER SD1 // TX ピン㮠USART ドライãƒã€‚デフォルト㯠SD1
+#define SERIAL_USART_TX_PAL_MODE 7 // 「代替機能〠ピン。MCU ã®é©åˆ‡ãªå€¤ã«ã¤ã„ã¦ã¯ã€ãã‚Œãžã‚Œã®ãƒ‡ãƒ¼ã‚¿ã‚·ãƒ¼ãƒˆã‚’見ã¦ãã ã•ã„。デフォルト㯠7
+```
+
+ã¾ãŸã€ChibiOS `SERIAL` 機能を有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:
+* キーボード㮠halconf.h: `#define HAL_USE_SERIAL TRUE`
+* キーボード㮠mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (ã“ã“ã§ã€'n' 㯠MCU ã§é¸æŠžã—㟠USART ã®ãƒšãƒªãƒ•ã‚§ãƒ©ãƒ«ç•ªå·ã¨ä¸€è‡´)
+
+å¿…è¦ãªæ§‹æˆã¯ã€`UART` 周辺機器ã§ã¯ãªãã€`SERIAL` 周辺機器ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
diff --git a/docs/ja/support.md b/docs/ja/support.md
new file mode 100644
index 0000000000..01c2d41d19
--- /dev/null
+++ b/docs/ja/support.md
@@ -0,0 +1,22 @@
+# 助ã‘ã‚’å¾—ã‚‹
+
+<!---
+ original document: 0.9.51:docs/support.md
+ git diff 0.9.51 HEAD -- docs/support.md | cat
+-->
+
+QMK ã«é–¢ã—ã¦åŠ©ã‘ã‚’å¾—ã‚‹ãŸã‚ã®å¤šãã®ãƒªã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã™ã€‚
+
+コミュニティスペースã«å‚加ã™ã‚‹å‰ã«[行動è¦ç¯„](https://qmk.fm/coc/)を読んã§ãã ã•ã„。
+
+## リアルタイムãƒãƒ£ãƒƒãƒˆ
+
+何ã‹ã«ã¤ã„ã¦åŠ©ã‘ãŒå¿…è¦ãªå ´åˆã¯ã€è¿…速ãªã‚µãƒãƒ¼ãƒˆã‚’å—ã‘ã‚‹ãŸã‚ã®æœ€è‰¯ã®å ´æ‰€ã¯ã€[Discord Server](https://discord.gg/Uq7gcHh) ã§ã™ã€‚通常ã¯èª°ã‹ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã€éžå¸¸ã«åŠ©ã‘ã«ãªã‚‹å¤šãã®äººãŒã„ã¾ã™ã€‚
+
+## OLKB Subreddit
+
+å…¬å¼ã® QMK フォーラム㯠[reddit.com](https://reddit.com) ã® [/r/olkb](https://reddit.com/r/olkb) ã§ã™ã€‚
+
+## GitHub Issues
+
+[GitHub 㧠issue](https://github.com/qmk/qmk_firmware/issues) ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã™ã€‚issue ã¯é•·æœŸçš„ãªè­°è«–ã‚ã‚‹ã„ã¯ãƒ‡ãƒãƒƒã‚°ã‚’å¿…è¦ã¨ã™ã‚‹å ´åˆã¯ã€ç‰¹ã«ä¾¿åˆ©ã§ã™ã€‚
diff --git a/docs/ja/syllabus.md b/docs/ja/syllabus.md
new file mode 100644
index 0000000000..14e743ee9c
--- /dev/null
+++ b/docs/ja/syllabus.md
@@ -0,0 +1,75 @@
+# QMK シラãƒã‚¹
+
+<!---
+ original document: 0.9.51:docs/syllabus.md
+ git diff 0.9.51 HEAD -- docs/syllabus.md | cat
+-->
+
+ã“ã®ãƒšãƒ¼ã‚¸ã¯æœ€åˆã«åŸºæœ¬ã‚’紹介ã—ã€ãã—ã¦ã€QMK ã«ç¿’熟ã™ã‚‹ãŸã‚ã«å¿…è¦ãªå…¨ã¦ã®æ¦‚念をç†è§£ã™ã‚‹ã‚ˆã†ã«å°Žãã“ã¨ã§ã€QMK ã®çŸ¥è­˜ã‚’構築ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚
+
+# åˆç´šãƒˆãƒ”ック
+
+ä»–ã«ä½•ã‚‚読んã§ã„ãªã„å ´åˆã¯ã€ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’読んã§ãã ã•ã„。[QMK åˆå¿ƒè€…ガイド](ja/newbs.md)を読ã¿çµ‚ã‚ã‚‹ã¨ã€åŸºæœ¬çš„ãªã‚­ãƒ¼ãƒžãƒƒãƒ—を作æˆã—ã€ãれをコンパイルã—ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«æ›¸ãè¾¼ã¿ã§ãるよã†ã«ãªã£ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚残りã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¯ã“れらã®åŸºæœ¬çš„ãªçŸ¥è­˜ã‚’具体的ã«è‚‰ä»˜ã‘ã—ã¾ã™ã€‚
+
+* **QMK Tools ã®ä½¿ã„方を学ã¶**
+ * [QMK åˆå¿ƒè€…ガイド](ja/newbs.md)
+ * [CLI](ja/cli.md)
+ * [Git](ja/newbs_git_best_practices.md)
+* **キーマップã«ã¤ã„ã¦å­¦ã¶**
+ * [レイヤー](ja/feature_layers.md)
+ * [キーコード](ja/keycodes.md)
+ * 使用ã§ãるキーコードã®å®Œå…¨ãªãƒªã‚¹ãƒˆã€‚中級ã¾ãŸã¯ä¸Šç´šãƒˆãƒ”ックã«ã‚る知識ãŒå¿…è¦ãªå ´åˆã‚‚ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+* **IDE ã®è¨­å®š** - オプション
+ * [Eclipse](ja/other_eclipse.md)
+ * [VS Code](ja/other_vscode.md)
+
+# 中級トピック
+
+ã“れらã®ãƒˆãƒ”ックã§ã¯ã€QMK ãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹å¹¾ã¤ã‹ã®æ©Ÿèƒ½ã«ã¤ã„ã¦æŽ˜ã‚Šä¸‹ã’ã¾ã™ã€‚ã“れらã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å…¨ã¦èª­ã‚€å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ã“れらã®ä¸€éƒ¨ã‚’スキップã™ã‚‹ã¨ã€ä¸Šç´šãƒˆãƒ”ックã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ä¸€éƒ¨ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆãŒæ„味をãªã•ãªããªã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+* **機能ã®è¨­å®šæ–¹æ³•ã‚’å­¦ã¶**
+ <!-- * Configuration Overview FIXME(skullydazed/anyone): write this document -->
+ * [オーディオ](ja/feature_audio.md)
+ * 電飾
+ * [ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆ](ja/feature_backlight.md)
+ * [LED マトリックス](ja/feature_led_matrix.md)
+ * [RGB ライト](ja/feature_rgblight.md)
+ * [RGB マトリックス](ja/feature_rgb_matrix.md)
+ * [タップホールド設定](ja/tap_hold.md)
+* **キーマップã«ã¤ã„ã¦ã•ã‚‰ã«å­¦ã¶**
+ * [キーマップ](ja/keymap.md)
+ * [カスタム関数ã¨ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰](ja/custom_quantum_functions.md)
+ * マクロ
+ * [動的マクロ](ja/feature_dynamic_macros.md)
+ * [コンパイル済ã¿ã®ãƒžã‚¯ãƒ­](ja/feature_macros.md)
+ * [タップダンス](ja/feature_tap_dance.md)
+ * [コンボ](ja/feature_combo.md)
+ * [ユーザスペース](ja/feature_userspace.md)
+
+# 上級トピック
+
+以下ã®å…¨ã¦ã¯å¤šãã®åŸºç¤ŽçŸ¥è­˜ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚高度ãªæ©Ÿèƒ½ã‚’使ã£ã¦ã‚­ãƒ¼ãƒžãƒƒãƒ—を作æˆã§ãã‚‹ã“ã¨ã«åŠ ãˆã¦ã€`config.h` 㨠`rules.mk` ã®ä¸¡æ–¹ã‚’使ã£ã¦ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ã‚ªãƒ—ションを設定ã™ã‚‹ã“ã¨ã«æ…£ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+* **QMK 内ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ä¿å®ˆ**
+ * [キーボードã®æ‰‹é…ç·š](ja/hand_wire.md)
+ * [キーボードガイドライン](ja/hardware_keyboard_guidelines.md)
+ * [info.json リファレンス](ja/reference_info_json.md)
+ * [デãƒã‚¦ãƒ³ã‚¹ API](ja/feature_debounce_type.md)
+* **高度ãªæ©Ÿèƒ½**
+ * [ユニコード](ja/feature_unicode.md)
+ * [API](ja/api_overview.md)
+ * [ブートマジック](ja/feature_bootmagic.md)
+* **ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢**
+ * [キーボードãŒã©ã®ã‚ˆã†ã«å‹•ä½œã™ã‚‹ã‹](ja/how_keyboards_work.md)
+ * [キーボードマトリックスã®ä»•çµ„ã¿](ja/how_a_matrix_works.md)
+ * [分割キーボード](ja/feature_split_keyboard.md)
+ * [速記](ja/feature_stenography.md)
+ * [ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°ãƒ‡ãƒã‚¤ã‚¹](ja/feature_pointing_device.md)
+* **コア開発**
+ * [コーディングè¦ç´„](ja/coding_conventions_c.md)
+ * [互æ›æ€§ã®ã‚るマイクロコントローラ](ja/compatible_microcontrollers.md)
+ * [カスタムマトリックス](ja/custom_matrix.md)
+ * [QMK ã‚’ç†è§£ã™ã‚‹](ja/understanding_qmk.md)
+* **CLI 開発**
+ * [コーディングè¦ç´„](ja/coding_conventions_python.md)
+ * [CLI 開発ã®æ¦‚è¦](ja/cli_development.md)
diff --git a/docs/ja/tap_hold.md b/docs/ja/tap_hold.md
new file mode 100644
index 0000000000..a0f0897628
--- /dev/null
+++ b/docs/ja/tap_hold.md
@@ -0,0 +1,195 @@
+# タップホールド設定オプション
+
+<!---
+ original document: 0.9.51:docs/tap_hold.md
+ git diff 0.9.51 HEAD -- docs/tap_hold.md | cat
+-->
+
+タップホールドオプションã¯ç´ æ™´ã‚‰ã—ã„ã‚‚ã®ã§ã™ãŒã€å•é¡ŒãŒç„¡ã„ã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。デフォルト設定をé©åˆ‡ãªã‚‚ã®ã«ã—よã†ã¨ã—ã¾ã—ãŸãŒã€ä¸€éƒ¨ã®äººã«ã¨ã£ã¦ã¾ã å•é¡Œã‚’引ãèµ·ã“ã™ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+次ã®ã‚ªãƒ—ションã«ã‚ˆã‚Šã‚¿ãƒƒãƒ—ホールドキーã®æŒ™å‹•ã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## タッピング時間
+
+以下ã®æ©Ÿèƒ½ã®å…¨ã¦ã®æ ¸å¿ƒã¯ã€ã‚¿ãƒƒãƒ”ング時間ã®è¨­å®šã§ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ä½•ã‚’タップã¨ã—ã€ä½•ã‚’ホールドã¨ã™ã‚‹ã‹ãŒæ±ºã¾ã‚Šã¾ã™ã€‚ã“ã‚ŒãŒè‡ªç„¶ã«æ„Ÿã˜ã‚‰ã‚Œã‚‹ã´ã£ãŸã‚Šã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã¯ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã”ã¨ã€ã‚¹ã‚¤ãƒƒãƒã”ã¨ã€ã‚ã‚‹ã„ã¯ã‚­ãƒ¼ã”ã¨ã«ç•°ã‚‹ã“ã¨ã‚‚ã‚ã‚Šãˆã¾ã™ã€‚
+
+`config.h` ã«ä»¥ä¸‹ã®è¨­å®šã‚’追加ã™ã‚‹ã“ã¨ã§ã€ã“ã®æ™‚間を全体的ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+```c
+#define TAPPING_TERM 200
+```
+
+ã“ã®è¨­å®šã¯ãƒŸãƒªç§’ã§å®šç¾©ã•ã‚Œã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¯ 200ms ã§ã™ã€‚ã“ã‚Œã¯å¤§å¤šæ•°ã®äººã«ã¨ã£ã¦ã®é©åˆ‡ãªå¹³å‡å€¤ã§ã™ã€‚
+
+ã“ã®æ©Ÿèƒ½ã‚’より細ã‹ã制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+```c
+#define TAPPING_TERM_PER_KEY
+```
+
+ãã—ã¦ã€ä»¥ä¸‹ã®é–¢æ•°ã‚’キーマップã«è¿½åŠ ã—ã¾ã™:
+
+```c
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return TAPPING_TERM + 1250;
+ case LT(1, KC_GRV):
+ return 130;
+ default:
+ return TAPPING_TERM;
+ }
+}
+```
+
+
+## 許容ホールド
+
+[PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/) 以é™ã€æ–°ã—ã„ `config.h` オプションãŒã‚ã‚Šã¾ã™:
+
+```c
+#define PERMISSIVE_HOLD
+```
+
+ã“ã‚Œã¯é«˜é€Ÿãªã‚¿ã‚¤ãƒ”ストや高ㄠ`TAPPING_TERM` 設定ã«å¯¾ã—ã¦ã€ã‚¿ãƒƒãƒ—ã¨ãƒ›ãƒ¼ãƒ«ãƒ‰ã‚­ãƒ¼(モッドタップã®ã‚ˆã†ãª)ã®å‹•ä½œã‚’å‘上ã•ã›ã¾ã™ã€‚
+
+モッドタップキーを押ã—ã€ä»–ã®ã‚­ãƒ¼ã‚’タップ(押ã—ã¦æ”¾ã™)ã—ã¦ã€ãƒ¢ãƒƒãƒ‰ã‚¿ãƒƒãƒ—キーを放ã™ã¨ã„ã†å‹•ä½œã®å…¨ã¦ã‚’タッピング時間内ã«è¡Œã†ã¨ã€ä¸¡æ–¹ã®ã‚­ãƒ¼ã®ã€Œã‚¿ãƒƒãƒ”ングã€æ©Ÿèƒ½ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚
+
+例ãˆã°:
+
+- `SFT_T(KC_A)` を押ã™
+- `KC_X` を押ã™
+- `KC_X` を放ã™
+- `SFT_T(KC_A)` を放ã™
+
+通常ã€ã“れら全ã¦ã‚’ `TAPPING_TERM` (デフォルト: 200ms) 内ã§è¡Œã†ã¨ã€ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã¨ãƒ›ã‚¹ãƒˆã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ `ax` ã¨ã—ã¦ç™»éŒ²ã•ã‚Œã¾ã™ã€‚許容ホールドを有効ã«ã™ã‚‹ã¨ã€åˆ¥ã®ã‚­ãƒ¼ãŒã‚¿ãƒƒãƒ—ã•ã‚ŒãŸå ´åˆã«ãƒ¢ãƒƒãƒ‰ã‚¿ãƒƒãƒ—キーを修飾キーã¨è¦‹ãªã™ã‚ˆã†ã«å‡¦ç†ã‚’変更ã—〠`X` (`SHIFT`+`x`) ã¨ç™»éŒ²ã•ã‚Œã¾ã™ã€‚
+
+?> `モッドタップ割り込ã¿ã®ç„¡è¦–`を有効ã«ã—ã¦ã„ã‚‹å ´åˆã€ã“ã‚Œã«ã‚ˆã‚Šä¸¡æ–¹ã®å‹•ããŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚通常ã®ã‚­ãƒ¼ã«ã¯ã€æœ€åˆã®ã‚­ãƒ¼ãŒæœ€åˆã«æ”¾ã•ã‚ŒãŸå ´åˆã€ã‚ã‚‹ã„ã¯ä¸¡æ–¹ã®ã‚­ãƒ¼ãŒ `TAPPING_TERM` より長ãホールドã•ã‚ŒãŸå ´åˆã«ã€ä¿®é£¾ã‚­ãƒ¼ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚
+
+ã“ã®æ©Ÿèƒ½ã‚’より細ã‹ã制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+```c
+#define PERMISSIVE_HOLD_PER_KEY
+```
+
+ãã—ã¦ã€ä»¥ä¸‹ã®é–¢æ•°ã‚’キーマップã«è¿½åŠ ã—ã¾ã™:
+
+```c
+bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LT(1, KC_BSPC):
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
+## モッドタップ割り込ã¿ã®ç„¡è¦–
+
+ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã«ã¯ã€ã“れを `config.h` ã«è¿½åŠ ã—ã¦ãã ã•ã„:
+
+```c
+#define IGNORE_MOD_TAP_INTERRUPT
+```
+
+許容ホールドã¨åŒæ§˜ã«ã€ã“ã‚Œã¯é«˜é€Ÿãªã‚¿ã‚¤ãƒ”ストã®ãŸã‚ã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã®å‡¦ç†æ–¹æ³•ã‚’変更ã—ã¾ã™ã€‚モッドタップキーを押ã—ã€ä»–ã®ã‚­ãƒ¼ã‚’押ã—ã€ãƒ¢ãƒƒãƒ‰ã‚¿ãƒƒãƒ—キーを放ã—ã€é€šå¸¸ã®ã‚­ãƒ¼ã‚’放ã™ã¨ã€é€šå¸¸ã¯ä¸¡æ–¹ã®ã‚­ãƒ¼ã®ã€Œã‚¿ãƒƒãƒ”ングã€æ©Ÿèƒ½ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ãƒ­ãƒ¼ãƒªãƒ³ã‚°ã‚³ãƒ³ãƒœã‚­ãƒ¼ã«ã¯æœ›ã¾ã—ããªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+`モッドタップ割り込ã¿ã®ç„¡è¦–`を設定ã™ã‚‹ã«ã¯ã€ä¸¡æ–¹ã®ã‚­ãƒ¼ã‚’ `TAPPING_TERM` ã®é–“ホールドã™ã‚‹ã¨ã€(ãã®ä¿®é£¾ã‚­ãƒ¼ã®)ホールド機能を実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+例ãˆã°:
+
+- `SFT_T(KC_A)` を押ã™
+- `KC_X` を押ã™
+- `SFT_T(KC_A)` を放ã™
+- `KC_X` を放ã™
+
+通常ã€ã“れ㯠`X` (`SHIFT`+`x`) ã‚’é€ä¿¡ã—ã¾ã™ã€‚`モッドタップ割り込ã¿ã®ç„¡è¦–` を有効ã«ã™ã‚‹ã¨ã€ãƒ›ãƒ¼ãƒ«ãƒ‰ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’登録ã™ã‚‹ã«ã¯ã€ä¸¡æ–¹ã®ã‚­ãƒ¼ã‚’ `TAPPING_TERM` ã®é–“ホールドã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€ç´ æ—©ã„タップ㯠`ax` ã‚’é€ä¿¡ã—ã¾ã™ãŒã€ä¸¡æ–¹ã‚’ホールドã™ã‚‹ã¨ã€`X` (`SHIFT`+`x`) を出力ã—ã¾ã™ã€‚
+
+
+?> __注æ„__: ã“ã‚Œã¯ãƒ¢ãƒ‡ã‚£ãƒ•ã‚¡ã‚¤ã‚¢ã«ã®ã¿é–¢ä¿‚ã—ã€ãƒ¬ã‚¤ãƒ¤ãƒ¼åˆ‡ã‚Šæ›¿ãˆã‚­ãƒ¼ã«ã¯é–¢ä¿‚ã—ã¾ã›ã‚“。
+
+?> `許容ホールド`を有効ã«ã™ã‚‹ã¨ã€ã“ã‚Œã¯ä¸¡æ–¹ãŒã©ã®ã‚ˆã†ã«å‹•ä½œã™ã‚‹ã‹ã‚’変更ã—ã¾ã™ã€‚通常ã®ã‚­ãƒ¼ã«ã¯ã€æœ€åˆã®ã‚­ãƒ¼ãŒæœ€åˆã«æ”¾ã•ã‚ŒãŸå ´åˆã€ã‚ã‚‹ã„ã¯ä¸¡æ–¹ã®ã‚­ãƒ¼ãŒ `TAPPING_TERM` より長ãホールドã•ã‚ŒãŸå ´åˆã«ã€ä¿®é£¾ã‚­ãƒ¼ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚
+
+ã“ã®æ©Ÿèƒ½ã‚’より細ã‹ã制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+```c
+#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
+```
+
+ãã—ã¦ã€ä»¥ä¸‹ã®é–¢æ•°ã‚’キーマップã«è¿½åŠ ã—ã¾ã™:
+
+```c
+bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
+## タッピング強制ホールド
+
+`タッピング強制ホールド` を有効ã«ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã—ã¾ã™:
+
+```c
+#define TAPPING_FORCE_HOLD
+```
+
+タップã®å¾Œã§ãƒ¦ãƒ¼ã‚¶ãŒã‚­ãƒ¼ã‚’ホールドã™ã‚‹ã¨ã€ã“ã‚Œã¯ä¿®é£¾ã‚­ãƒ¼ã‚’ホールドã™ã‚‹ã‹ã‚ã‚Šã«ã‚¿ãƒƒãƒ—ã•ã‚ŒãŸã‚­ãƒ¼ã‚’ç¹°ã‚Šè¿”ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ã‚¿ãƒƒãƒ—ã•ã‚ŒãŸã‚­ãƒ¼ã®ãŸã‚ã«è‡ªå‹•ç¹°ã‚Šè¿”ã—を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+例:
+
+- SFT_T(KC_A) を押ã™
+- SFT_T(KC_A) を放ã™
+- SFT_T(KC_A) を押ã™
+- タッピング時間より長ãå¾…ã¡ã¾ã™...
+- SFT_T(KC_A) を放ã™
+
+デフォルトã®è¨­å®šã§ã¯ã€æœ€åˆã«æ”¾ã—ãŸã¨ãã« `a` ãŒé€ä¿¡ã•ã‚Œã€2回目ã®æŠ¼ä¸‹ã§ `a` ãŒé€ä¿¡ã•ã‚Œã€ã‚³ãƒ³ãƒ”ュータã«è‡ªå‹•ãƒªãƒ”ート機能を作動ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+`TAPPING_FORCE_HOLD` を使ã†ã¨ã€2回目ã®æŠ¼ä¸‹ã¯ Shift ã¨ã—ã¦è§£é‡ˆã•ã‚Œã€ãれをタップã—ã¦ä½¿ã£ãŸå¾Œã§ã™ãã«ä¿®é£¾ã‚­ãƒ¼ã¨ã—ã¦ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+!> `TAPPING_FORCE_HOLD` ã¯ã‚¿ãƒƒãƒ”ングトグル(`TT` レイヤーキーコードã€ãƒ¯ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚¿ãƒƒãƒ”ングトグルãªã©)を使ã†ã‚‚ã®ã‚’ã™ã¹ã¦ç ´å£Šã—ã¾ã™ã€‚
+
+ã“ã®æ©Ÿèƒ½ã‚’より細ã‹ã制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+```c
+#define TAPPING_FORCE_HOLD_PER_KEY
+```
+
+ãã—ã¦ã€ä»¥ä¸‹ã®é–¢æ•°ã‚’キーマップã«è¿½åŠ ã—ã¾ã™:
+
+```c
+bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LT(1, KC_BSPC):
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
+## レトロタッピング
+
+`レトロタッピング`を有効ã«ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã‚’ `config.h` ã«è¿½åŠ ã—ã¦ãã ã•ã„:
+
+```c
+#define RETRO_TAPPING
+```
+
+ä»–ã®ã‚­ãƒ¼ã‚’押ã•ãšã«ãƒ‡ãƒ¥ã‚¢ãƒ«ãƒ•ã‚¡ãƒ³ã‚¯ã‚·ãƒ§ãƒ³ã‚­ãƒ¼ã‚’押ã—ã¦æ”¾ã—ã¦ã‚‚何も起ã“ã‚Šã¾ã›ã‚“。レトロタッピングを有効ã«ã™ã‚‹ã¨ã€ä»–ã®ã‚­ãƒ¼ã‚’押ã•ãšã«ã‚­ãƒ¼ã‚’放ã™ã¨ã€å…ƒã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒã‚¿ãƒƒãƒ”ング時間外ã§ã‚ã£ã¦ã‚‚é€ä¿¡ã•ã‚Œã¾ã™ã€‚
+
+例ãˆã°ã€ä»–ã®ã‚­ãƒ¼ã‚’押ã™ã“ã¨ãªã `LT(2, KC_SPACE)` を押ã—ãŸã‚Šæ”¾ã—ãŸã‚Šã—ã¦ã‚‚何も起ã“ã‚Šã¾ã›ã‚“。ã“れを有効ã«ã™ã‚‹ã¨ã€ä»£ã‚ã‚Šã« `KC_SPACE` ã‚’é€ä¿¡ã—ã¾ã™ã€‚
+
+## キー別ã®é–¢æ•°ã«ã‚­ãƒ¼ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚ã‚‹ã®ã¯ãªãœã§ã™ã‹ï¼Ÿ
+
+「キー別ã€ã®é–¢æ•°å…¨ã¦ã«ã‚­ãƒ¼ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚“ã§ã„ã‚‹ã“ã¨ã«æ°—付ã„ãŸã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ãã—ã¦ãªãœãã†ã—ãŸã®ã‹ä¸æ€è­°ã«æ€ã£ã¦ã„ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+ã¾ãã€ãã‚Œã¯å˜ç´”ã«æœ¬å½“ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã®ãŸã‚ã§ã™ã€‚ãŸã ã—ã€å…·ä½“çš„ã«ã¯ã€ãã‚Œã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®é…線方法ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚例ãˆã°ã€å„è¡ŒãŒå®Ÿéš›ã«ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®1行を使ã£ã¦ã„ã‚‹å ´åˆã€ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰å…¨ä½“ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ä»£ã‚ã‚Šã«ã€`if (record->event.row == 3)` を使ã†ã»ã†ãŒç°¡å˜ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ã“ã‚Œã¯ã€ãƒ›ãƒ¼ãƒ ã‚­ãƒ¼è¡Œã§ã‚¿ãƒƒãƒ—ホールドタイプã®ã‚­ãƒ¼ã‚’使ã£ã¦ã„る人ã«ã¨ã£ã¦ç‰¹ã«ä¾¿åˆ©ã§ã™ã€‚ãã®ãŸã‚ã€é€šå¸¸ã®ã‚¿ã‚¤ãƒ”ングを妨ã’ãªã„よã†ã«å¾®èª¿æ•´ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã¯ãªã„ã§ã—ょã†ã‹ã€‚
+
+## `*_kb` ã‚„ `*_user` 関数ãŒç„¡ã„ã®ã¯ãªãœã§ã™ã‹ï¼Ÿ
+
+QMK ã«ã‚ã‚‹ä»–ã®å¤šãã®é–¢æ•°ã¨ã¯ç•°ãªã‚Šã€quantum ã‚ã‚‹ã„ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ¬ãƒ™ãƒ«ã®é–¢æ•°ã‚’æŒã¤å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“ (ã¾ãŸã¯ç†ç”±ã•ãˆã‚ã‚Šã¾ã›ã‚“)。ã“ã“ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¬ãƒ™ãƒ«ã®é–¢æ•°ã ã‘ãŒæœ‰ç”¨ãªãŸã‚ã€ãã®ã‚ˆã†ã«ãƒžãƒ¼ã‚¯ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。
diff --git a/docs/ja/translating.md b/docs/ja/translating.md
new file mode 100644
index 0000000000..f7a273308a
--- /dev/null
+++ b/docs/ja/translating.md
@@ -0,0 +1,60 @@
+# QMK ドキュメントを翻訳ã™ã‚‹
+
+<!---
+ original document: 0.9.51:docs/translating.md
+ git diff 0.9.51 HEAD -- docs/translating.md | cat
+-->
+
+ルートフォルダ (`docs/`) ã«ã‚ã‚‹å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯è‹±èªžã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ - ä»–ã®å…¨ã¦ã®è¨€èªžã¯ã€ISO 639-1 言語コードã¨ã€ãã‚Œã«ç¶šã`-`ã¨é–¢é€£ã™ã‚‹å›½ã‚³ãƒ¼ãƒ‰ã®ã‚µãƒ–フォルダã«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚[一般的ãªã‚‚ã®ã®ãƒªã‚¹ãƒˆã¯ã“ã“ã§è¦‹ã¤ã‹ã‚Šã¾ã™](https://www.andiamo.co.uk/resources/iso-language-codes/)。ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãŒå­˜åœ¨ã—ãªã„å ´åˆã€ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚翻訳ã•ã‚ŒãŸå„ファイルã¯è‹±èªžãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨åŒã˜åå‰ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ãã†ã™ã‚‹ã“ã¨ã§ã€æ­£å¸¸ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã§ãã¾ã™ã€‚
+
+`_summary.md` ファイルã¯ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã®ä¸­ã«å­˜åœ¨ã—ã€å„ファイルã¸ã®ãƒªãƒ³ã‚¯ã®ãƒªã‚¹ãƒˆã€ç¿»è¨³ã•ã‚ŒãŸåå‰ã€è¨€èªžãƒ•ã‚©ãƒ«ãƒ€ã«ç¶šãリンクãŒå«ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+```markdown
+ * [QMK简介](zh-cn/getting_started_introduction.md)
+```
+
+ä»–ã® docs ページã¸ã®å…¨ã¦ã®ãƒªãƒ³ã‚¯ã«ã‚‚ã€è¨€èªžã®ãƒ•ã‚©ãƒ«ãƒ€ãŒå‰ã«ä»˜ã„ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã—リンクãŒãƒšãƒ¼ã‚¸ã®ç‰¹å®šã®éƒ¨åˆ†(例ãˆã°ã€ç‰¹å®šã®è¦‹å‡ºã—)ã¸ã®å ´åˆã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¦‹å‡ºã—ã«è‹±èªžã® ID を使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™:
+
+```markdown
+[建立你的环境](zh-cn/newbs-getting-started.md#set-up-your-environment)
+
+## 建立你的环境 :id=set-up-your-environment
+```
+
+æ–°ã—ã„言語ã®ç¿»è¨³ãŒå®Œäº†ã—ãŸã‚‰ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚修正ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:
+
+* [`docs/_langs.md`](https://github.com/qmk/qmk_firmware/blob/master/docs/_langs.md)
+å„è¡Œã¯ã€[GitHub emoji shortcode](https://github.com/ikatyang/emoji-cheat-sheet/blob/master/README.md#country-flag) ã®å½¢å¼ã§å›½ãƒ•ãƒ©ã‚°ã¨ã€ãã‚Œã«ç¶šã言語ã§è¡¨ã•ã‚Œã‚‹åå‰ã‚’å«ã‚€å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+ ```markdown
+ - [:cn: 中文](/zh-cn/)
+ ```
+
+* [`docs/index.html`](https://github.com/qmk/qmk_firmware/blob/master/docs/index.html)
+`placeholder` 㨠`noData` ã®ä¸¡æ–¹ã®ã‚ªãƒ–ジェクトã¯ã€æ–‡å­—列ã§è¨€èªžãƒ•ã‚©ãƒ«ãƒ€ã®è¾žæ›¸ã‚¨ãƒ³ãƒˆãƒªãŒå¿…è¦ã§ã™:
+
+ ```js
+ '/zh-cn/': '没有结果!',
+ ```
+
+ サイドãƒãƒ¼ã®ã€ŒQMK ファームウェアã€ã®è¦‹å‡ºã—リンクを設定ã™ã‚‹ãŸã‚ã«ã€`nameLink` オブジェクトも以下ã®ã‚ˆã†ã«è¿½åŠ ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:
+
+ ```js
+ '/zh-cn/': '/#/zh-cn/',
+ ```
+
+ ã¾ãŸã€`fallbackLanguages` リストã«è¨€èªžãƒ•ã‚©ãƒ«ãƒ€ã‚’追加ã—ã¦ã€404 ã§ã¯ãªã英語ã«é©åˆ‡ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„:
+
+ ```js
+ fallbackLanguages: [
+ // ...
+ 'zh-cn',
+ // ...
+ ],
+ ```
+
+## 翻訳ã®ãƒ—レビュー
+
+ドキュメントã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’セットアップã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€[ドキュメントã®ãƒ—レビュー](ja/contributing.md#previewing-the-documentation)を見ã¦ãã ã•ã„ - å³ä¸Šã® "Translations" メニューã‹ã‚‰æ–°ã—ã„言語をé¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã¯ãšã§ã™ã€‚
+
+作業ã«æº€è¶³ã—ãŸã‚‰ã€é æ…®ãªãプルリクエストを開ã„ã¦ãã ã•ã„ï¼
diff --git a/docs/ja/understanding_qmk.md b/docs/ja/understanding_qmk.md
new file mode 100644
index 0000000000..74b37398f8
--- /dev/null
+++ b/docs/ja/understanding_qmk.md
@@ -0,0 +1,195 @@
+# QMK ã®ã‚³ãƒ¼ãƒ‰ã®ç†è§£
+
+<!---
+ original document: 0.9.55:docs/understanding_qmk.md
+ git diff 0.9.55 HEAD -- docs/understanding_qmk.md | cat
+-->
+
+ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã§ã¯ã€QMK ファームウェアãŒã©ã®ã‚ˆã†ã«æ©Ÿèƒ½ã™ã‚‹ã‹ã‚’éžå¸¸ã«é«˜ã„レベルã‹ã‚‰èª¬æ˜Žã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚基本的ãªãƒ—ログラミングã®æ¦‚念をç†è§£ã—ã¦ã„ã‚‹ã“ã¨ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ãŒã€(実例を示ã™å¿…è¦ãŒã‚ã‚‹å ´åˆã‚’除ã) C ã«ç²¾é€šã—ã¦ã„ã‚‹ã“ã¨ã‚’å‰æã«ã¯ã—ã¦ã„ã¾ã›ã‚“。以下ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®åŸºæœ¬çš„ãªçŸ¥è­˜ãŒã‚ã‚‹ã“ã¨ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ã€‚
+
+* [入門](ja/getting_started_introduction.md)
+* [キーボードãŒã©ã®ã‚ˆã†ã«å‹•ä½œã™ã‚‹ã‹](ja/how_keyboards_work.md)
+* [FAQ](ja/faq.md)
+
+## スタートアップ
+
+QMK ã¯ä»–ã®ã‚³ãƒ³ãƒ”ュータプログラムã¨ä½•ã‚‰å¤‰ã‚ã‚Šãªã„ã¨è€ƒãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚開始ã•ã‚Œã€ã‚¿ã‚¹ã‚¯ã‚’実行ã—ã€ãã—ã¦çµ‚了ã—ã¾ã™ã€‚プログラムã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ãƒã‚¤ãƒ³ãƒˆã¯ã€ä»–ã® C プログラムã¨åŒæ§˜ã«ã€`main()` 関数ã§ã™ã€‚ãŸã ã—ã€QMK ã‚’åˆã‚ã¦è§¦ã‚‹äººã¯ã€`main()` 関数ãŒè¤‡æ•°ã®å ´æ‰€ã«ç¾ã‚Œã‚‹ãŸã‚ã€æ··ä¹±ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ã¾ãŸã€ã©ã‚Œã‚’見れã°ã‚ˆã„ã‹åˆ†ã‹ã‚Šã«ãã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+複数ã‚ã‚‹ç†ç”±ã¯ã€QMK ã¯æ§˜ã€…ãªãƒ—ラットフォームをサãƒãƒ¼ãƒˆã™ã‚‹ã‹ã‚‰ã§ã™ã€‚最も一般的ãªãƒ—ラットフォーム㯠`lufa` ã§ã™ã€‚ã“れ㯠atmega32u4 ã®ã‚ˆã†ãª AVR プロセッサ上ã§å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚ã¾ãŸã€`chibios` ãŠã‚ˆã³ `vusb` もサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
+
+ã“ã“ã§ã¯ AVR プロセッサã«ç„¦ç‚¹ã‚’当ã¦ã¾ã™ã€‚ã“れ㯠`lufa` プラットフォームを使ã„ã¾ã™ã€‚`main()` 関数㯠[tmk_core/protocol/lufa/lufa.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1028) ã«ã‚ã‚Šã¾ã™ã€‚関数ã«ã–ã£ã¨ç›®ã‚’通ã™ã¨ã€(ホストã¸ã® USB ã‚‚å«ã‚ã¦)設定ã•ã‚ŒãŸå…¨ã¦ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒåˆæœŸåŒ–ã•ã‚Œã€ãƒ—ログラムã®ã‚³ã‚¢éƒ¨åˆ†ãŒ [`while(1)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/protocol/lufa/lufa.c#L1069) ã§é–‹å§‹ã•ã‚Œã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚ã“ã‚ŒãŒ[メインループ](#the-main-loop)ã§ã™ã€‚
+
+## メインループ
+
+コードã®ã“ã®éƒ¨åˆ†ã¯ã€åŒã˜å‘½ä»¤ã‚»ãƒƒãƒˆã‚’永久ã«ãƒ«ãƒ¼ãƒ—処ç†ã™ã‚‹ãŸã‚ã€ã€Œãƒ¡ã‚¤ãƒ³ãƒ«ãƒ¼ãƒ—ã€ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ã“ã“ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«å¿…è¦ãªã“ã¨ã‚’実行ã•ã›ã‚‹é–¢æ•°ã‚’ QMK ãŒå‘¼ã³å‡ºã™å ´æ‰€ã§ã™ã€‚一見ã€å¤šãã®æ©Ÿèƒ½ã‚’æŒã¤ã‚ˆã†ã«è¦‹ãˆã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€å¤§æŠµã®å ´åˆã€ã‚³ãƒ¼ãƒ‰ã¯ `#define` ã«ã‚ˆã£ã¦ç„¡åŠ¹ã«ã•ã‚Œã¾ã™ã€‚
+
+```
+ keyboard_task();
+```
+
+ã“ã“ã§ã€å…¨ã¦ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®å›ºæœ‰ã®æ©Ÿèƒ½ãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚`keyboard_task()` ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯ [tmk_core/common/keyboard.c](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/keyboard.c#L216) ã«ã‚ã‚Šã€ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®å¤‰åŒ–を検知ã—ã€LED ã®çŠ¶æ…‹ã‚’オンオフã™ã‚‹è²¬ä»»ãŒã‚ã‚Šã¾ã™ã€‚
+
+`keyboard_task()` ã«ä»¥ä¸‹ã‚’処ç†ã™ã‚‹ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã¾ã™:
+
+* [マトリックスã®ã‚¹ã‚­ãƒ£ãƒ³](#matrix-scanning)
+* マウスã®å‡¦ç†
+* シリアルリンク
+* ビジュアライザ
+* キーボードã®çŠ¶æ…‹ã® LED (Caps Lock, Num Lock, Scroll Lock)
+
+#### マトリックスã®ã‚¹ã‚­ãƒ£ãƒ³
+
+マトリックスã®ã‚¹ã‚­ãƒ£ãƒ³ã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã®ã‚³ã‚¢ã®æ©Ÿèƒ½ã§ã™ã€‚ã“ã‚Œã¯ä»Šã©ã®ã‚­ãƒ¼ãŒæŠ¼ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’検知ã™ã‚‹ãƒ—ロセスã§ã‚ã‚Šã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã¯ã“ã®æ©Ÿèƒ½ã‚’1秒間ã«ä½•åº¦ã‚‚何度も実行ã—ã¾ã™ã€‚ファームウェア㮠CPU 時間㮠99% ã¯ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®ã‚¹ã‚­ãƒ£ãƒ³ã«è²»ã‚„ã•ã‚Œã¦ã„ã‚‹ã¨è¨€ã£ã¦ã‚‚éŽè¨€ã§ã¯ã‚ã‚Šã¾ã›ã‚“。
+
+実際ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®æ¤œçŸ¥ã«ã¯æ§˜ã€…ãªæ–¹æ³•ãŒã‚ã‚Šã¾ã™ãŒã€ãã‚Œã¯ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®å¯¾è±¡å¤–ã§ã™ã€‚マトリックスã®ã‚¹ã‚­ãƒ£ãƒ³ã‚’ブラックボックスã¨ã—ã¦æ‰±ã£ã¦ã‚‚å•é¡Œã‚ã‚Šã¾ã›ã‚“。マトリックスã®ç¾åœ¨ã®çŠ¶æ…‹ã‚’求ã‚ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ãªãƒ‡ãƒ¼ã‚¿æ§‹é€ ã‚’å–å¾—ã—ã¾ã™:
+
+
+```
+{
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0}
+}
+```
+
+ã“れ㯠4è¡Œx5列ã®ãƒ†ãƒ³ã‚­ãƒ¼(訳注: 5è¡Œx4列ã®é–“é•ã„ã¨æ€ã‚ã‚Œã¾ã™)ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚’表ã™ç›´æŽ¥çš„ãªè¡¨ç¾ã®ãƒ‡ãƒ¼ã‚¿æ§‹é€ ã§ã™ã€‚キーãŒæŠ¼ã•ã‚Œã‚‹ã¨ã€ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹å†…ã®ãã®ã‚­ãƒ¼ã®ä½ç½®ãŒã€ `0` ã§ã¯ãªã `1` ã¨ã—ã¦è¿”ã•ã‚Œã¾ã™ã€‚
+
+マトリックスã®ã‚¹ã‚­ãƒ£ãƒ³ã¯1秒間ã«ä½•åº¦ã‚‚実行ã•ã‚Œã¾ã™ã€‚正確ãªãƒ¬ãƒ¼ãƒˆã¯æ§˜ã€…ã§ã™ãŒã€çŸ¥è¦šã§ãるよã†ãªé…延をé¿ã‘ã‚‹ãŸã‚ã«ã€ç§’é–“ã«å°‘ãªãã¨ã‚‚10回実行ã—ã¾ã™ã€‚
+
+##### マトリックスã‹ã‚‰ç‰©ç†çš„ãªãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¸ã®ãƒžãƒƒãƒ—
+
+キーボード上ã®å„スイッãƒã®çŠ¶æ…‹ãŒåˆ†ã‹ã‚‹ã¨ã€ãれをキーコードã¸ãƒžãƒƒãƒ—ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚QMK ã§ã¯ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã¸ã®ãƒžãƒƒãƒ—㯠C マクロを使ã†ã“ã¨ã§è¡Œã‚ã‚Œã€C マクロã«ã‚ˆã‚Šç‰©ç†çš„ãªãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®å®šç¾©ã¯ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®å®šç¾©ã‹ã‚‰åˆ†é›¢ã•ã‚Œã¦ã„ã¾ã™ã€‚(訳注:「キーコードã®å®šç¾©ã€ã¯ã€Œã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã®ãƒžãƒˆãƒªã‚¯ã‚¹é…列ã«ã‚ˆã‚‹å®šç¾©ã€ã¨æ€ã‚れる)
+
+キーボードレベルã§ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚’物ç†ã‚­ãƒ¼ã«ãƒžãƒƒãƒ—ã™ã‚‹ C マクロ (一般的ã«ã¯ã€`LAYOUT()` ã¨ã„ã†åå‰)を定義ã—ã¾ã™ã€‚マトリックスã«ã‚¹ã‚¤ãƒƒãƒãŒãªã„場所ãŒã‚ã‚‹å ´åˆã€ã“ã®ãƒžã‚¯ãƒ­ã‚’使ã£ã¦ KC_NO を事å‰ã«åŸ‹ã‚込むã“ã¨ãŒã§ãã€ã‚­ãƒ¼ãƒžãƒƒãƒ—ã®å®šç¾©ã‚’扱ã„ã‚„ã™ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚以下ã¯ã€ãƒ†ãƒ³ã‚­ãƒ¼ç”¨ã® `LAYOUT()` マクロã§ã™:
+
+```c
+#define LAYOUT( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, \
+ k30, k31, k32, k33, \
+ k40, k42 \
+) { \
+ { k00, k01, k02, k03, }, \
+ { k10, k11, k12, k13, }, \
+ { k20, k21, k22, KC_NO, }, \
+ { k30, k31, k32, k33, }, \
+ { k40, KC_NO, k42, KC_NO } \
+}
+```
+
+`LAYOUT()` マクロã®2ã¤ç›®ã®ãƒ–ロックãŒã€ä¸Šè¨˜ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³é…列ã¨ã©ã®ã‚ˆã†ã«ä¸€è‡´ã—ã¦ã„ã‚‹ã‹ã«æ³¨ç›®ã—ã¦ãã ã•ã„。ã“ã®ãƒžã‚¯ãƒ­ã¯ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®ã‚¹ã‚­ãƒ£ãƒ³é…列をキーコードã«ãƒžãƒƒãƒ—ã™ã‚‹ã‚‚ã®ã§ã™ã€‚ãŸã ã—ã€17キーã®ãƒ†ãƒ³ã‚­ãƒ¼ã‚’見るã¨ã€ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã«ã¯ã‚¹ã‚¤ãƒƒãƒãŒç½®ã‘ã‚‹ãŒã€ã‚­ãƒ¼ãŒå¤§ãã„ãŸã‚ã«å®Ÿéš›ã«ã¯ã‚¹ã‚¤ãƒƒãƒãŒç„¡ã„箇所ãŒ3ã¤ã‚ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚ã“れらã®ã‚¹ãƒšãƒ¼ã‚¹ã« `KC_NO` を設定ã—ãŸã®ã§ã€ã‚­ãƒ¼ãƒžãƒƒãƒ—定義ã«ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。
+
+ã“ã®ãƒžã‚¯ãƒ­ã‚’使ã£ã¦ã€å°‘ã—変ã‚ã£ãŸãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€ä¾‹ãˆã° [Clueboard rev 2](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/66/rev2/rev2.h) を扱ã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ãã®èª¬æ˜Žã¯ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®ç¯„囲外ã§ã™ã€‚
+
+##### キーコードã®å‰²ã‚Šå½“ã¦
+
+キーマップレã¹ãƒ«ã§ã¯ã€ä¸Šè¨˜ã® `LAYOUT()` マクロを使ã£ã¦ã€ç‰©ç†çš„ãªå ´æ‰€ã‹ã‚‰ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®å ´æ‰€ã«ãƒžãƒƒãƒ”ングã—ã¾ã™ã€‚以下ã®ã‚ˆã†ã«ãªã‚Šã¾ã™:
+
+```
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
+ KC_P7, KC_P8, KC_P9, KC_PPLS, \
+ KC_P4, KC_P5, KC_P6, \
+ KC_P1, KC_P2, KC_P3, KC_PENT, \
+ KC_P0, KC_PDOT)
+}
+```
+
+ã“れら全ã¦ã®å¼•æ•°ãŒã€å‰ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã® `LAYOUT()` マクロã®å‰åŠã¨ã©ã®ã‚ˆã†ã«ä¸€è‡´ã—ã¦ã„ã‚‹ã‹ã«ã¤ã„ã¦æ³¨ç›®ã—ã¦ãã ã•ã„。ã“ã®ã‚ˆã†ã«ã—ã¦ã€ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã—ã¦ã€ãれをå‰è¿°ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ã«ãƒžãƒƒãƒ—ã—ã¾ã™ã€‚
+
+##### 状態変更ã®æ¤œçŸ¥
+
+上記ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ã¯ã‚る時点ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã®çŠ¶æ…‹ã‚’ä¼ãˆã¾ã™ãŒã€ã‚³ãƒ³ãƒ”ュータã¯å¤‰æ›´ã®ã¿ã‚’知りãŸã„ã ã‘ã§ã€ç¾åœ¨ã®çŠ¶æ…‹ã‚’æ°—ã«ã—ã¾ã›ã‚“。QMK ã¯æœ€å¾Œã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ã®çµæžœã‚’æ ¼ç´ã—ã€ã“ã®ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹ã‹ã‚‰çµæžœã‚’比較ã—ã¦ã€ã„ã¤ã‚­ãƒ¼ãŒæŠ¼ã•ã‚ŒãŸã‹æ”¾ã•ã‚ŒãŸã‹ã‚’決定ã—ã¾ã™ã€‚
+
+例を見ã¦ã¿ã¾ã—ょã†ã€‚キーボードスキャンループã®é€”中ã«ç§»å‹•ã—ã¦ã€å‰ã®ã‚¹ã‚­ãƒ£ãƒ³ãŒä»¥ä¸‹ã®ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã“ã¨ãŒã‚ã‹ã£ãŸã¨ã—ã¾ã™:
+
+```
+{
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0}
+}
+```
+
+ç¾åœ¨ã®ã‚¹ã‚­ãƒ£ãƒ³ãŒå®Œäº†ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¦‹ãˆã‚‹ã¨ã—ã¾ã™:
+
+```
+{
+ {1,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0},
+ {0,0,0,0}
+}
+```
+
+キーマップã¨æ¯”較ã™ã‚‹ã¨ã€æŠ¼ã•ã‚ŒãŸã‚­ãƒ¼ãŒ KC_NLCK ã§ã‚ã‚‹ã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚ã“ã“ã‹ã‚‰ã€`process_record` 関数群を呼ã³å‡ºã—ã¾ã™ã€‚
+
+<!-- FIXME: Magic happens between here and process_record -->
+
+##### Process Record
+
+`process_record()` 関数自体ã¯ä¸€è¦‹ç°¡å˜ã«è¦‹ãˆã¾ã™ãŒã€ãã®å†…部㯠QMK ã®æ§˜ã€…ãªãƒ¬ãƒ™ãƒ«ã§æ©Ÿèƒ½ã‚’上書ãã™ã‚‹ãŸã‚ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ãŒéš ã•ã‚Œã¦ã„ã¾ã™ã€‚キーボード/キーマップレベルã®æ©Ÿèƒ½ã«ã¤ã„ã¦èª¿ã¹ã‚‹å¿…è¦ãŒã‚ã‚‹ã¨ãã¯ã€ä»¥ä¸‹ã«åˆ—挙ã—ãŸä¸€é€£ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚’手引帳ã¨ã—ã¦ä½¿ã„ã¾ã™ã€‚`rules.mk` ã¾ãŸã¯ã»ã‹ã®å ´æ‰€ã§è¨­å®šã•ã‚ŒãŸã‚ªãƒ—ションã«å¿œã˜ã¦ã€æœ€çµ‚çš„ãªãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã«ä»¥ä¸‹ã®é–¢æ•°ã®ã‚µãƒ–セットã®ã¿ãŒå«ã¾ã‚Œã¾ã™ã€‚
+
+* [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/tmk_core/common/action.c#L172)
+ * [`bool process_record_quantum(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L206)
+ * [ã“ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’キーコードã«ãƒžãƒƒãƒ—ã™ã‚‹](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L226)
+ * [`void velocikey_accelerate(void)`](https://github.com/qmk/qmk_firmware/blob/c1c5922aae7b60b7c7d13d3769350eed9dda17ab/quantum/velocikey.c#L27)
+ * [`void preprocess_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L119)
+ * [`bool process_key_lock(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_key_lock.c#L62)
+ * [`bool process_clicky(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_clicky.c#L79)
+ * [`bool process_haptic(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/2cee371bf125a6ec541dd7c5a809573facc7c456/drivers/haptic/haptic.c#L216)
+ * [`bool process_record_kb(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/card.c#L20)
+ * [`bool process_record_user(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/keyboards/clueboard/card/keymaps/default/keymap.c#L58)
+ * [`bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/rgb_matrix.c#L139)
+ * [`bool process_midi(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_midi.c#L81)
+ * [`bool process_audio(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_audio.c#L19)
+ * [`bool process_steno(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_steno.c#L160)
+ * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_music.c#L114)
+ * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_tap_dance.c#L141)
+ * [`bool process_unicode_common(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode_common.c#L169) ã¯ã€ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã‚’呼ã³å‡ºã—ã¾ã™:
+ * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicode.c#L20)
+ * [`bool process_unicodemap(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_unicodemap.c#L46)
+ * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_ucis.c#L95)
+ * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_leader.c#L51)
+ * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
+ * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
+ * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
+ * [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
+ * [Quantum 固有ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’識別ã—ã¦å‡¦ç†ã™ã‚‹](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
+
+ã“ã®ä¸€é€£ã®ã‚¤ãƒ™ãƒ³ãƒˆã®ä¸­ã®ä»»æ„ã®ã‚¹ãƒ†ãƒƒãƒ—㧠(`process_record_kb()` ã®ã‚ˆã†ãª)関数㯠`false` ã‚’è¿”ã—ã¦ã€ä»¥é™ã®å‡¦ç†ã‚’åœæ­¢ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã“ã®å‘¼ã³å‡ºã—ã®å¾Œã§ã€`post_process_record()` ãŒå‘¼ã°ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒé€šå¸¸å‡¦ç†ã•ã‚ŒãŸå¾Œã«å®Ÿè¡Œã™ã‚‹å¿…è¦ãŒã‚る追加ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—を処ç†ã™ã‚‹ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+* [`void post_process_record(keyrecord_t *record)`]()
+ * [`void post_process_record_quantum(keyrecord_t *record)`]()
+ * [ã“ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’キーコードã«ãƒžãƒƒãƒ—ã™ã‚‹]()
+ * [`void post_process_clicky(uint16_t keycode, keyrecord_t *record)`]()
+ * [`void post_process_record_kb(uint16_t keycode, keyrecord_t *record)`]()
+ * [`void post_process_record_user(uint16_t keycode, keyrecord_t *record)`]()
+
+<!--
+#### Mouse Handling
+
+FIXME: This needs to be written
+
+#### Serial Link(s)
+
+FIXME: This needs to be written
+
+#### Visualizer
+
+FIXME: This needs to be written
+
+#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock)
+
+FIXME: This needs to be written
+
+-->
diff --git a/docs/mod_tap.md b/docs/mod_tap.md
index ced0beba99..1217b47f92 100644
--- a/docs/mod_tap.md
+++ b/docs/mod_tap.md
@@ -27,22 +27,25 @@ This key would activate Left Control and Left Shift when held, and send Escape w
For convenience, QMK includes some Mod-Tap shortcuts to make common combinations more compact in your keymap:
-|Key |Aliases |Description |
-|------------|-----------------------------------------------------------------|-------------------------------------------------------|
-|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
-|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
-|`LALT_T(kc)`|`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
-|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
-|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
-|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
-|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
-|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
-|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
-|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
-|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
-|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
-|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
-|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped|
+|Key |Aliases |Description |
+|------------|-----------------------------------------------------------------|--------------------------------------------------------------|
+|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
+|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
+|`LALT_T(kc)`|`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
+|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
+|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
+|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
+|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
+|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
+|`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped |
+|`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped |
+|`LSA_T(kc)` | |Left Shift and Alt when held, `kc` when tapped |
+|`RSA_T(kc)` |`SAGR_T(kc)` |Right Shift and Right Alt (AltGr) when held, `kc` when tapped |
+|`RCS_T(kc)` | |Right Control and Right Shift when held, `kc` when tapped |
+|`LCAG_T(kc)`| |Left Control, Alt and GUI when held, `kc` when tapped |
+|`RCAG_T(kc)`| |Right Control, Alt and GUI when held, `kc` when tapped |
+|`C_S_T(kc)` | |Left Control and Shift when held, `kc` when tapped |
+|`MEH_T(kc)` | |Left Control, Shift and Alt when held, `kc` when tapped |
|`HYPR_T(kc)`|`ALL_T(kc)` |Left Control, Shift, Alt and GUI when held, `kc` when tapped - more info [here](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)|
## Caveats
diff --git a/docs/other_vscode.md b/docs/other_vscode.md
index d98b96bdf1..d132afaab6 100644
--- a/docs/other_vscode.md
+++ b/docs/other_vscode.md
@@ -48,7 +48,7 @@ This part is super simple. However, there is some configuration that we need to
### Configuring VS Code
-First, we need to set up IntelliSense. This isn't strictly required, but it will make your life a LOT easier. To do this, we need to create the `.vscode/c_cpp_properies.json` file in the QMK Firmware folder, You can do this all manually, but I've done most of the work already.
+First, we need to set up IntelliSense. This isn't strictly required, but it will make your life a LOT easier. To do this, we need to create the `.vscode/c_cpp_properties.json` file in the QMK Firmware folder, You can do this all manually, but I've done most of the work already.
Grab [this file](https://gist.github.com/drashna/48e2c49ce877be592a1650f91f8473e8) and save it. You may need to edit this file, if you didn't install MSYS2 to the default location, or are using WSL/LxSS.
diff --git a/docs/platformdev_chibios_earlyinit.md b/docs/platformdev_chibios_earlyinit.md
index 699c223771..5fd78bb336 100644
--- a/docs/platformdev_chibios_earlyinit.md
+++ b/docs/platformdev_chibios_earlyinit.md
@@ -4,17 +4,28 @@ This page describes a part of QMK that is a somewhat advanced concept, and is on
QMK uses ChibiOS as the underlying layer to support a multitude of Arm-based devices. Each ChibiOS-supported keyboard has a low-level board definition which is responsible for initializing hardware peripherals such as the clocks, and GPIOs.
-Older QMK revisions required duplication of these board definitions inside your keyboard's directory in order to override such early initialization points; this is now abstracted into the following APIs, and allows usage of the board definitions supplied with ChibiOS itself. Check `<qmk_firmware>/lib/chibios/os/hal/boards` for the list of official definitions. If your keyboard needs extra initialization at a very early stage, consider providing keyboard-level overrides of the following APIs:
+Older QMK revisions required duplication of these board definitions inside your keyboard's directory in order to override such early initialization points; this is now abstracted into the following APIs, and allows usage of the board definitions supplied with ChibiOS itself. Check `<qmk_firmware>/lib/chibios/os/hal/boards` for the list of official definitions. If your keyboard needs extra initialization at a very early stage, consider providing keyboard-level overrides of the following APIs instead of duplicating the board definitions:
## `early_hardware_init_pre()` :id=early-hardware-init-pre
The function `early_hardware_init_pre` is the earliest possible code that can be executed by a keyboard firmware. This is intended as a replacement for the ChibiOS board definition's `__early_init` function, and is the equivalent of executing at the start of the function.
-This is executed before RAM gets cleared, and before clocks or GPIOs are configured; any delays or preparation using GPIOs is not likely to work at this point. After executing this function, RAM on the MCU may be zero'ed. Assigning values to variables during execution of this function may be overwritten.
+This is executed before RAM gets cleared, and before clocks or GPIOs are configured; for example, ChibiOS delays are not likely to work at this point. After executing this function, RAM on the MCU may be zero'ed. Assigning values to variables during execution of this function may be overwritten.
-As such, if you wish to override this API consider limiting use to writing to low-level registers. The default implementation of this function can be configured to jump to bootloader if a `RESET` key was pressed, by ensuring `#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE` is in the keyboard's `config.h` file.
+As such, if you wish to override this API consider limiting use to writing to low-level registers. The default implementation of this function can be configured to jump to bootloader if a `RESET` key was pressed:
-To implement your own version of this function, in your keyboard's source files:
+| `config.h` override | Description | Default |
+|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
+| `#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP` | Whether or not bootloader is to be executed during the early initialisation code of QMK. | `FALSE` |
+| `#define STM32_BOOTLOADER_ADDRESS` | Relevant for single-bank STM32 MCUs, signifies the memory address to jump to bootloader. Consult [AN2606](https://www.st.com/content/st_com/en/search.html#q=an2606-t=resources-page=1) for the _System Memory_ address for your MCU. This value should be of the format `0x11111111`. | `<none>` |
+| `#define STM32_BOOTLOADER_DUAL_BANK` | Relevant for dual-bank STM32 MCUs, signifies that a GPIO is to be toggled in order to enter bootloader mode. | `FALSE` |
+| `#define STM32_BOOTLOADER_DUAL_BANK_GPIO` | Relevant for dual-bank STM32 MCUs, the pin to toggle when attempting to enter bootloader mode, e.g. `B8` | `<none>` |
+| `#define STM32_BOOTLOADER_DUAL_BANK_POLARITY` | Relevant for dual-bank STM32 MCUs, the value to set the pin to in order to trigger charging of the RC circuit. e.g. `0` or `1`. | `0` |
+| `#define STM32_BOOTLOADER_DUAL_BANK_DELAY` | Relevant for dual-bank STM32 MCUs, an arbitrary measurement of time to delay before resetting the MCU. Increasing number increases the delay. | `100000` |
+
+Kinetis MCUs have no configurable options.
+
+Alternatively, to implement your own version of this function, in your keyboard's source files:
```c
void early_hardware_init_pre(void) {
diff --git a/docs/pr_checklist.md b/docs/pr_checklist.md
index 8755552b9d..22e8a3fe1a 100644
--- a/docs/pr_checklist.md
+++ b/docs/pr_checklist.md
@@ -1,39 +1,42 @@
# PR checklists
-This is a non-exhaustive checklist of what the QMK collaborators will be checking when reviewing submitted PRs.
+This is a non-exhaustive checklist of what the QMK Collaborators will be checking when reviewing submitted PRs.
-If there are any inconsistencies with these recommendations, you're best off [creating an issue](https://github.com/qmk/qmk_firmware/issues/new) against this document, or getting in touch with a QMK Collaborator on Discord.
+If there are any inconsistencies with these recommendations, you're best off [creating an issue](https://github.com/qmk/qmk_firmware/issues/new) against this document, or getting in touch with a QMK Collaborator on [Discord](https://discord.gg/Uq7gcHh).
## General PRs
- PR should be submitted using a non-`master` branch on the source repository
- - This does not mean you target a different branch for your PR, rather that you're not working out of your own master branch
- - If submitter _does_ use their own `master` branch, they'll be given a link to the ["how to git"](https://docs.qmk.fm/#/newbs_git_using_your_master_branch) page after merging -- (end of this document will contain the contents of the message)
-- Newly-added directories and filenames must be lowercase
- - This rule may be relaxed if upstream sources originally had uppercase characters (e.g. ChibiOS, or imported files from other repositories etc.)
- - If there is enough justification (i.e. consistency with existing core files etc.) this can be relaxed
+ - this does not mean you target a different branch for your PR, rather that you're not working out of your own master branch
+ - if submitter _does_ use their own `master` branch, they'll be given a link to the ["how to git"](https://docs.qmk.fm/#/newbs_git_using_your_master_branch) page after merging -- (end of this document will contain the contents of the message)
+- newly-added directories and filenames must be lowercase
+ - this rule may be relaxed if upstream sources originally had uppercase characters (e.g. ChibiOS, or imported files from other repositories etc.)
+ - if there is enough justification (i.e. consistency with existing core files etc.) this can be relaxed
- a board designer naming their keyboard with uppercase letters is not enough justification
-- Valid license headers on all `*.c` and `*.h` source files
+- valid license headers on all `*.c` and `*.h` source files
- GPL2/GPL3 recommended for consistency
- - Other licenses are permitted, however they must be GPL-compatible and must allow for redistribution. Using a different license will almost certainly delay a PR getting merged.
-- QMK codebase "best practices" followed
- - This is not an exhaustive list, and will likely get amended as time goes by
+ - other licenses are permitted, however they must be GPL-compatible and must allow for redistribution. Using a different license will almost certainly delay a PR getting merged.
+- QMK Codebase "best practices" followed
+ - this is not an exhaustive list, and will likely get amended as time goes by
- `#pragma once` instead of `#ifndef` include guards in header files
- - No "old-school" GPIO/I2C/SPI functions used -- must use QMK abstractions unless justifiable (and laziness is not valid justification)
- - Timing abstractions should be followed too:
+ - no "old-school" GPIO/I2C/SPI functions used -- must use QMK abstractions unless justifiable (and laziness is not valid justification)
+ - timing abstractions should be followed too:
- `wait_ms()` instead of `_delay_ms()` (remove `#include <util/delay.h>` too)
- `timer_read()` and `timer_read32()` etc. -- see [timer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/timer.h) for the timing APIs
- - If you think a new abstraction is useful, you're encouraged to:
+ - if you think a new abstraction is useful, you're encouraged to:
- prototype it in your own keyboard until it's feature-complete
- discuss it with QMK Collaborators on Discord
- refactor it as a separate core change
- remove your specific copy in your board
+- rebase and fix all merge conflicts before opening the PR (in case you need help or advice, reach out to QMK Collaborators on Discord)
-## Core PRs
+## Keymap PRs
-- Must now target `develop` branch, which will subsequently be merged back to `master` on the breaking changes timeline
-- Other notes TBD
- - Core is a lot more subjective given the breadth of posted changes
+- `#include QMK_KEYBOARD_H` preferred to including specific board files
+- prefer layer `enum`s to `#define`s
+- require custom keycode `enum`s to `#define`s, first entry must have ` = SAFE_RANGE`
+- terminating backslash (`\`) in lines of LAYOUT macro parameters is superfluous
+- some care with spacing (e.g., alignment on commas or first char of keycodes) makes for a much nicer-looking keymap
## Keyboard PRs
@@ -48,12 +51,14 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- standard template should be present
- flash command has `:flash` at end
- valid hardware availability link (unless handwired) -- private groupbuys are okay, but one-off prototypes will be questioned. If open-source, a link to files should be provided.
+ - clear instructions on how to reset the board into bootloader mode
+ - a picture about the keyboard and preferably about the PCB, too
- `rules.mk`
- removed `MIDI_ENABLE`, `FAUXCLICKY_ENABLE` and `HD44780_ENABLE`
- modified `# Enable Bluetooth with the Adafruit EZ-Key HID` -> `# Enable Bluetooth`
- - No `(-/+size)` comments related to enabling features
- - Remove the list of alternate bootloaders if one has been specified
- - No re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/quantum/mcu_selection.mk)
+ - no `(-/+size)` comments related to enabling features
+ - remove the list of alternate bootloaders if one has been specified
+ - no re-definitions of the default MCU parameters if same value, when compared to the equivalent MCU in [mcu_selection.mk](https://github.com/qmk/qmk_firmware/blob/master/quantum/mcu_selection.mk)
- keyboard `config.h`
- don't repeat `MANUFACTURER` in the `PRODUCT` value
- no `#define DESCRIPTION`
@@ -71,12 +76,12 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- `keyboard.h`
- `#include "quantum.h"` appears at the top
- `LAYOUT` macros should use standard definitions if applicable
- - Use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
+ - use the Community Layout macro names where they apply (preferred above `LAYOUT`/`LAYOUT_all`)
- keymap `config.h`
- no duplication of `rules.mk` or `config.h` from keyboard
- `keymaps/default/keymap.c`
- `QMKBEST`/`QMKURL` removed (sheesh)
- - If using `MO(_LOWER)` and `MO(_RAISE)` keycodes or equivalent, and the keymap has an adjust layer when holding both keys -- if the keymap has no "direct-to-adjust" keycode (such as `MO(_ADJUST)`) then you should prefer to write...
+ - if using `MO(_LOWER)` and `MO(_RAISE)` keycodes or equivalent, and the keymap has an adjust layer when holding both keys -- if the keymap has no "direct-to-adjust" keycode (such as `MO(_ADJUST)`) then you should prefer to write...
```
layer_state_t layer_state_set_user(layer_state_t state) {
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
@@ -90,22 +95,20 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- submitters can also have a "manufacturer-matching" keymap that mirrors existing functionality of the commercial product, if porting an existing board
Also, specific to ChibiOS:
-- **Strong** preference to using existing ChibiOS board definitions.
- - A lot of the time, an equivalent Nucleo board can be used with a different flash size or slightly different model in the same family
- - Example: For an STM32L082KZ, given the similarity to an STM32L073RZ, you can use `BOARD = ST_NUCLEO64_L073RZ` in rules.mk
+- **strong** preference to using existing ChibiOS board definitions.
+ - a lot of the time, an equivalent Nucleo board can be used with a different flash size or slightly different model in the same family
+ - example: For an STM32L082KZ, given the similarity to an STM32L073RZ, you can use `BOARD = ST_NUCLEO64_L073RZ` in rules.mk
- QMK is migrating to not having custom board definitions if at all possible, due to the ongoing maintenance burden when upgrading ChibiOS
-- If a board definition is unavoidable, `board.c` must have a standard `__early_init()` (as per normal ChibiOS board defs) and an empty `boardInit()`:
+- if a board definition is unavoidable, `board.c` must have a standard `__early_init()` (as per normal ChibiOS board defs) and an empty `boardInit()`:
- see Arm/ChibiOS [early initialization](https://docs.qmk.fm/#/platformdev_chibios_earlyinit?id=board-init)
- `__early_init()` should be replaced by either `early_hardware_init_pre()` or `early_hardware_init_post()` as appropriate
- `boardInit()` should be migrated to `board_init()`
-## Keymap PRs
+## Core PRs
-- `#include QMK_KEYBOARD_H` preferred to including specific board files
-- Prefer layer `enum`s to `#define`s
-- Require custom keycode `enum`s to `#define`s, first entry must have ` = SAFE_RANGE`
-- Terminating backslash (`\`) in lines of LAYOUT macro parameters is superfluous
-- Some care with spacing (e.g., alignment on commas or first char of keycodes) makes for a much nicer-looking keymap
+- must now target `develop` branch, which will subsequently be merged back to `master` on the breaking changes timeline
+- other notes TBD
+ - core is a lot more subjective given the breadth of posted changes
---
diff --git a/docs/ref_functions.md b/docs/ref_functions.md
index 997c3fa2ee..176095070b 100644
--- a/docs/ref_functions.md
+++ b/docs/ref_functions.md
@@ -43,7 +43,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
### `update_tri_layer_state(state, x, y, z)`
The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from the [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check.
-The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it.
+There are a couple of caveats to this method:
+1. You cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it.
+2. Because layers are processed from the highest number `z` should be a higher layer than `x` and `y` or you may not be able to access it.
#### Example
@@ -97,7 +99,7 @@ To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset m
## Tap random key
-If you want to send a random character to the host computer, you can use the `tap_random_base64()` function. This [pseudorandomly](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) selects a number between 0 and 63, and then sends a key press based on that selection. (0–25 is `A`–`Z`, 26–51 is `a`–`z`, 52–61 is `0`–`9`, 62 is `+` and 63 is `/`).
+If you want to send a random character to the host computer, you can use the `tap_random_base64()` function. This [pseudorandomly](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) selects a number between 0 and 63, and then sends a key press based on that selection. (0–25 is `A`–`Z`, 26–51 is `a`–`z`, 52–61 is `0`–`9`, 62 is `+` and 63 is `/`).
?> Needless to say, but this is _not_ a cryptographically secure method of generating random Base64 keys or passwords.
diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md
index badfabd912..3ca62c719e 100644
--- a/docs/reference_info_json.md
+++ b/docs/reference_info_json.md
@@ -31,7 +31,7 @@ Within our `info.json` file the `layouts` portion of the dictionary contains sev
* `height`
* Optional: The height of the layout in Key Units
* `key_count`
- * **Required**: The number of keys in this layout
+ * Optional: The number of keys in this layout
* `layout`
* A list of Key Dictionaries describing the physical layout. See the next section for more details.
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index 589ec31816..9ffbfde8fc 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -1,22 +1,22 @@
# Tap-Hold Configuration Options
-While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonable defaults, but that may still cause issues for some people.
+While Tap-Hold options are fantastic, they are not without their issues. We have tried to configure them with reasonable defaults, but that may still cause issues for some people.
These options let you modify the behavior of the Tap-Hold keys.
## Tapping Term
-The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
+The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
-You can set the global time for this by adding the following setting to your `config.h`:
+You can set the global time for this by adding the following setting to your `config.h`:
```c
#define TAPPING_TERM 200
```
-This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
+This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
-For more granular control of this feature, you can add the following to your `config.h`:
+For more granular control of this feature, you can add the following to your `config.h`:
```c
#define TAPPING_TERM_PER_KEY
```
@@ -45,9 +45,9 @@ As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new
#define PERMISSIVE_HOLD
```
-This makes tap and hold keys (like Mod Tap) work better for fast typists, or for high `TAPPING_TERM` settings.
+This makes tap and hold keys (like Mod Tap) work better for fast typists, or for high `TAPPING_TERM` settings.
-If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys.
+If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the tapping function for both keys.
For Instance:
@@ -56,7 +56,7 @@ For Instance:
- `KC_X` Up
- `SFT_T(KC_A)` Up
-Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`).
+Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`).
?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
@@ -87,7 +87,7 @@ To enable this setting, add this to your `config.h`:
#define IGNORE_MOD_TAP_INTERRUPT
```
-Similar to Permissive Hold, this alters how the firmware processes inputs for fast typists. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys.
+Similar to Permissive Hold, this alters how the firmware processes inputs for fast typists. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the tapping function for both keys. This may not be desirable for rolling combo keys.
Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod).
@@ -126,27 +126,27 @@ bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
## Tapping Force Hold
-To enable `tapping force hold`, add the following to your `config.h`:
+To enable `tapping force hold`, add the following to your `config.h`:
```c
#define TAPPING_FORCE_HOLD
```
-When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key.
+When the user holds a key after tapping it, the tapping function is repeated by default, rather than activating the hold function. This allows keeping the ability to auto-repeat the tapping function of a dual-role key. `TAPPING_FORCE_HOLD` removes that ability to let the user activate the hold function instead, in the case of holding the dual-role key after having tapped it.
Example:
-- SFT_T(KC_A) Down
-- SFT_T(KC_A) Up
-- SFT_T(KC_A) Down
-- wait more than tapping term...
-- SFT_T(KC_A) Up
+- `SFT_T(KC_A)` Down
+- `SFT_T(KC_A)` Up
+- `SFT_T(KC_A)` Down
+- wait until the tapping term expires...
+- `SFT_T(KC_A)` Up
With default settings, `a` will be sent on the first release, then `a` will be sent on the second press allowing the computer to trigger its auto repeat function.
With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allowing to use it as a modifier shortly after having used it as a tap.
-!> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tapping Toggle).
+!> `TAPPING_FORCE_HOLD` will break anything that uses tapping toggles (Such as the `TT` layer keycode, and the One Shot Tap Toggle).
For more granular control of this feature, you can add the following to your `config.h`:
@@ -169,7 +169,7 @@ bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
## Retro Tapping
-To enable `retro tapping`, add the following to your `config.h`:
+To enable `retro tapping`, add the following to your `config.h`:
```c
#define RETRO_TAPPING
@@ -179,11 +179,11 @@ Holding and releasing a dual function key without pressing another key will resu
For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
-## Why do we include the key record for the per key functions?
+## Why do we include the key record for the per key functions?
-One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
+One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
-Well, it's simply really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
+Well, it's simple really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
## Why is there no `*_kb` or `*_user` functions?!
diff --git a/docs/ws2812_driver.md b/docs/ws2812_driver.md
index 941e1bde08..c1b96329e9 100644
--- a/docs/ws2812_driver.md
+++ b/docs/ws2812_driver.md
@@ -92,6 +92,7 @@ Configure the hardware via your config.h:
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
```
You must also turn on the PWM feature in your halconf.h and mcuconf.h
@@ -117,5 +118,5 @@ 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
+#define WS2812_EXTERNAL_PULLUP
```