aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/_summary.md1
-rw-r--r--docs/audio_driver.md14
-rw-r--r--docs/chibios_upgrade_instructions.md23
-rw-r--r--docs/cli_commands.md75
-rw-r--r--docs/cli_development.md2
-rw-r--r--docs/compatible_microcontrollers.md8
-rw-r--r--docs/configurator_default_keymaps.md4
-rw-r--r--docs/contributing.md2
-rw-r--r--docs/custom_matrix.md2
-rw-r--r--docs/custom_quantum_functions.md2
-rw-r--r--docs/de/cli.md19
-rw-r--r--docs/driver_installation_zadig.md1
-rw-r--r--docs/es/hardware_drivers.md4
-rw-r--r--docs/es/hardware_keyboard_guidelines.md2
-rw-r--r--docs/faq_debug.md4
-rw-r--r--docs/faq_misc.md2
-rw-r--r--docs/feature_backlight.md12
-rw-r--r--docs/feature_bluetooth.md25
-rw-r--r--docs/feature_digitizer.md2
-rw-r--r--docs/feature_haptic_feedback.md19
-rw-r--r--docs/feature_joystick.md2
-rw-r--r--docs/feature_layouts.md2
-rw-r--r--docs/feature_led_matrix.md7
-rw-r--r--docs/feature_midi.md2
-rw-r--r--docs/feature_oled_driver.md11
-rw-r--r--docs/feature_pointing_device.md2
-rw-r--r--docs/feature_programmable_button.md74
-rw-r--r--docs/feature_ps2_mouse.md40
-rw-r--r--docs/feature_rawhid.md4
-rw-r--r--docs/feature_rgb_matrix.md73
-rw-r--r--docs/feature_stenography.md2
-rw-r--r--docs/feature_swap_hands.md2
-rw-r--r--docs/feature_userspace.md4
-rw-r--r--docs/flashing_bootloadhid.md2
-rw-r--r--docs/fr-fr/cli.md19
-rw-r--r--docs/fr-fr/getting_started_github.md1
-rw-r--r--docs/getting_started_docker.md10
-rw-r--r--docs/getting_started_github.md1
-rw-r--r--docs/getting_started_make_guide.md4
-rw-r--r--docs/getting_started_vagrant.md8
-rw-r--r--docs/hardware_drivers.md4
-rw-r--r--docs/hardware_keyboard_guidelines.md30
-rw-r--r--docs/he-il/getting_started_github.md1
-rw-r--r--docs/how_keyboards_work.md2
-rw-r--r--docs/i2c_driver.md65
-rw-r--r--docs/ja/compatible_microcontrollers.md1
-rw-r--r--docs/ja/feature_haptic_feedback.md7
-rw-r--r--docs/ja/feature_ps2_mouse.md31
-rw-r--r--docs/ja/getting_started_github.md1
-rw-r--r--docs/ja/hardware_drivers.md4
-rw-r--r--docs/ja/hardware_keyboard_guidelines.md2
-rw-r--r--docs/ja/i2c_driver.md11
-rw-r--r--docs/ja/understanding_qmk.md4
-rw-r--r--docs/keycodes.md40
-rw-r--r--docs/newbs_git_resynchronize_a_branch.md16
-rw-r--r--docs/ru-ru/getting_started_github.md1
-rw-r--r--docs/understanding_qmk.md5
-rw-r--r--docs/unit_testing.md6
-rw-r--r--docs/zh-cn/getting_started_github.md1
59 files changed, 424 insertions, 301 deletions
diff --git a/docs/_summary.md b/docs/_summary.md
index 2f6309e41..4b528d996 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -72,6 +72,7 @@
72 * [Mod-Tap](mod_tap.md) 72 * [Mod-Tap](mod_tap.md)
73 * [Macros](feature_macros.md) 73 * [Macros](feature_macros.md)
74 * [Mouse Keys](feature_mouse_keys.md) 74 * [Mouse Keys](feature_mouse_keys.md)
75 * [Programmable Button](feature_programmable_button.md)
75 * [Space Cadet Shift](feature_space_cadet.md) 76 * [Space Cadet Shift](feature_space_cadet.md)
76 * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md) 77 * [US ANSI Shifted Keys](keycodes_us_ansi_shifted.md)
77 78
diff --git a/docs/audio_driver.md b/docs/audio_driver.md
index 7cd5a98d9..81c339007 100644
--- a/docs/audio_driver.md
+++ b/docs/audio_driver.md
@@ -57,14 +57,14 @@ This driver needs one Timer per enabled/used DAC channel, to trigger conversion;
57 57
58Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8: 58Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
59 59
60``` c 60```c
61//halconf.h: 61//halconf.h:
62#define HAL_USE_DAC TRUE 62#define HAL_USE_DAC TRUE
63#define HAL_USE_GPT TRUE 63#define HAL_USE_GPT TRUE
64#include_next <halconf.h> 64#include_next <halconf.h>
65``` 65```
66 66
67``` c 67```c
68// mcuconf.h: 68// mcuconf.h:
69#include_next <mcuconf.h> 69#include_next <mcuconf.h>
70#undef STM32_DAC_USE_DAC1_CH1 70#undef STM32_DAC_USE_DAC1_CH1
@@ -93,14 +93,14 @@ only needs one timer (GPTD6, Tim6) to trigger the DAC unit to do a conversion; t
93 93
94Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6: 94Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
95 95
96``` c 96```c
97//halconf.h: 97//halconf.h:
98#define HAL_USE_DAC TRUE 98#define HAL_USE_DAC TRUE
99#define HAL_USE_GPT TRUE 99#define HAL_USE_GPT TRUE
100#include_next <halconf.h> 100#include_next <halconf.h>
101``` 101```
102 102
103``` c 103```c
104// mcuconf.h: 104// mcuconf.h:
105#include_next <mcuconf.h> 105#include_next <mcuconf.h>
106#undef STM32_DAC_USE_DAC1_CH1 106#undef STM32_DAC_USE_DAC1_CH1
@@ -153,7 +153,7 @@ This driver uses the ChibiOS-PWM system to produce a square-wave on specific out
153The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function. 153The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function.
154 154
155A configuration example for the STM32F103C8 would be: 155A configuration example for the STM32F103C8 would be:
156``` c 156```c
157//halconf.h: 157//halconf.h:
158#define HAL_USE_PWM TRUE 158#define HAL_USE_PWM TRUE
159#define HAL_USE_PAL TRUE 159#define HAL_USE_PAL TRUE
@@ -161,7 +161,7 @@ A configuration example for the STM32F103C8 would be:
161#include_next <halconf.h> 161#include_next <halconf.h>
162``` 162```
163 163
164``` c 164```c
165// mcuconf.h: 165// mcuconf.h:
166#include_next <mcuconf.h> 166#include_next <mcuconf.h>
167#undef STM32_PWM_USE_TIM1 167#undef STM32_PWM_USE_TIM1
@@ -177,7 +177,7 @@ If we now target pin A8, looking through the data-sheet of the STM32F103C8, for
177- TIM1_CH4 = PA11 177- TIM1_CH4 = PA11
178 178
179with all this information, the configuration would contain these lines: 179with all this information, the configuration would contain these lines:
180``` c 180```c
181//config.h: 181//config.h:
182#define AUDIO_PIN A8 182#define AUDIO_PIN A8
183#define AUDIO_PWM_DRIVER PWMD1 183#define AUDIO_PWM_DRIVER PWMD1
diff --git a/docs/chibios_upgrade_instructions.md b/docs/chibios_upgrade_instructions.md
index 40c2faafc..b0a71142a 100644
--- a/docs/chibios_upgrade_instructions.md
+++ b/docs/chibios_upgrade_instructions.md
@@ -14,10 +14,10 @@ ChibiOS and ChibiOS-Contrib need to be updated in tandem -- the latter has a bra
14 * First time around this will take several hours 14 * First time around this will take several hours
15 * Subsequent updates will be incremental only 15 * Subsequent updates will be incremental only
16* Tagging example (work out which version first!): 16* Tagging example (work out which version first!):
17 * `git tag -a ver20.3.3 -m ver20.3.3 svn/tags/ver20.3.3` 17 * `git tag -a ver20.3.4 -m ver20.3.4 svn/tags/ver20.3.4`
18 * `git push qmk ver20.3.3` 18 * `git push qmk ver20.3.4`
19 * `git tag -a breaking_YYYY_qN -m breaking_YYYY_qN svn/tags/ver20.3.3` 19 * `git tag -a develop_YYYY_qN -m develop_YYYY_qN svn/tags/ver20.3.4`
20 * `git push qmk breaking_YYYY_qN` 20 * `git push qmk develop_YYYY_qN`
21 21
22## Getting ChibiOS-Contrib 22## Getting ChibiOS-Contrib
23 23
@@ -30,8 +30,8 @@ ChibiOS and ChibiOS-Contrib need to be updated in tandem -- the latter has a bra
30 * `git checkout chibios-20.3.x` 30 * `git checkout chibios-20.3.x`
31 * `git pull --ff-only` 31 * `git pull --ff-only`
32 * `git push origin chibios-20.3.x` 32 * `git push origin chibios-20.3.x`
33 * `git tag -a breaking_YYYY_qN -m breaking_YYYY_qN chibios-20.3.x` 33 * `git tag -a develop_YYYY_qN -m develop_YYYY_qN chibios-20.3.x`
34 * `git push origin breaking_YYYY_qN` 34 * `git push origin develop_YYYY_qN`
35 35
36## Updating submodules 36## Updating submodules
37 37
@@ -42,15 +42,18 @@ ChibiOS and ChibiOS-Contrib need to be updated in tandem -- the latter has a bra
42 * `git checkout -b chibios-version-bump` 42 * `git checkout -b chibios-version-bump`
43 * `cd lib/chibios` 43 * `cd lib/chibios`
44 * `git fetch --all --tags --prune` 44 * `git fetch --all --tags --prune`
45 * `git checkout breaking_YYYY_qN` 45 * `git checkout develop_YYYY_qN`
46 * `cd ../chibios-contrib` 46 * `cd ../chibios-contrib`
47 * `git fetch --all --tags --prune` 47 * `git fetch --all --tags --prune`
48 * `git checkout breaking_YYYY_qN` 48 * `git checkout develop_YYYY_qN`
49* Update ChibiOS configs within QMK
50 * `cd $QMK_FIRMWARE`
51 * `./util/chibios_conf_updater.sh`
49* Build everything 52* Build everything
50 * `cd $QMK_FIRMWARE` 53 * `cd $QMK_FIRMWARE`
51 * `qmk multibuild -j4` 54 * `qmk multibuild -j4`
52 * Make sure there are no errors 55 * Make sure there are no errors
53* Push to the repo 56* Push to the repo
54 * `git commit -am 'Update ChibiOS to XXXXXXXXX'` 57 * `git commit -am 'Update ChibiOS to 99.9.9'`
55 * `git push --set-upstream origin chibios-version-bump` 58 * `git push --set-upstream origin chibios-version-bump`
56* Make a PR to qmk_firmware with the new branch \ No newline at end of file 59* Make a PR to qmk_firmware with the new branch
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index 8fa7ad41d..1427b592f 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -118,54 +118,6 @@ This command lets you configure the behavior of QMK. For the full `qmk config` d
118qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN] 118qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
119``` 119```
120 120
121## `qmk console`
122
123This command lets you connect to keyboard consoles to get debugging messages. It only works if your keyboard firmware has been compiled with `CONSOLE_ENABLE=yes`.
124
125**Usage**:
126
127```
128qmk console [-d <pid>:<vid>[:<index>]] [-l] [-n] [-t] [-w <seconds>]
129```
130
131**Examples**:
132
133Connect to all available keyboards and show their console messages:
134
135```
136qmk console
137```
138
139List all devices:
140
141```
142qmk console -l
143```
144
145Show only messages from clueboard/66/rev3 keyboards:
146
147```
148qmk console -d C1ED:2370
149```
150
151Show only messages from the second clueboard/66/rev3:
152
153```
154qmk console -d C1ED:2370:2
155```
156
157Show timestamps and VID:PID instead of names:
158
159```
160qmk console -n -t
161```
162
163Disable bootloader messages:
164
165```
166qmk console --no-bootloaders
167```
168
169## `qmk doctor` 121## `qmk doctor`
170 122
171This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to. 123This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
@@ -368,6 +320,33 @@ qmk format-c
368qmk format-c -b branch_name 320qmk format-c -b branch_name
369``` 321```
370 322
323## `qmk generate-compilation-database`
324
325**Usage**:
326
327```
328qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
329```
330
331Creates a `compile_commands.json` file.
332
333Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! The qmk tool can build this for you.
334
335This command needs to know which keyboard and keymap to build. It uses the same configuration options as the `qmk compile` command: arguments, current directory, and config files.
336
337**Example:**
338
339```
340$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
341$ qmk generate-compilation-database
342Ψ Making clean
343Ψ Gathering build instructions from make -n gh60/satan:colemak
344Ψ Found 50 compile commands
345Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
346```
347
348Now open your dev environment and live a squiggly-free life.
349
371## `qmk docs` 350## `qmk docs`
372 351
373This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936. 352This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
diff --git a/docs/cli_development.md b/docs/cli_development.md
index 0f4f401b3..62be3b3d8 100644
--- a/docs/cli_development.md
+++ b/docs/cli_development.md
@@ -14,7 +14,7 @@ If you intend to maintain keyboards and/or contribute to QMK, you can enable the
14 14
15This will allow you to see all available subcommands. 15This will allow you to see all available subcommands.
16**Note:** You will have to install additional requirements: 16**Note:** You will have to install additional requirements:
17```bash 17```
18python3 -m pip install -r requirements-dev.txt 18python3 -m pip install -r requirements-dev.txt
19``` 19```
20 20
diff --git a/docs/compatible_microcontrollers.md b/docs/compatible_microcontrollers.md
index 2bf3b0ebb..39e9061c2 100644
--- a/docs/compatible_microcontrollers.md
+++ b/docs/compatible_microcontrollers.md
@@ -27,6 +27,7 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
27 * [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html) 27 * [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
28 * [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html) 28 * [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
29 * [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html) 29 * [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
30 * [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
30 * [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html) 31 * [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
31 * [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html) 32 * [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
32 * [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html) 33 * [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
@@ -42,7 +43,14 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
42 * [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x) 43 * [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
43 * [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50) 44 * [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
44 * [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72) 45 * [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
46 * [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
45 47
46## Atmel ATSAM 48## Atmel ATSAM
47 49
48There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). 50There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop).
51
52## RISC-V
53
54### GigaDevice
55
56[ChibiOS-Contrib](https://github.com/ChibiOS/ChibiOS-Contrib) has support for the GigaDevice [GD32VF103 series](https://www.gigadevice.com/products/microcontrollers/gd32/risc-v/mainstream-line/gd32vf103-series/) microcontrollers and provides configurations for the [SiPeed Longan Nano](https://longan.sipeed.com/en/) development board that uses this microcontroller. It is largely pin and feature compatible with STM32F103 and STM32F303 microcontrollers. \ No newline at end of file
diff --git a/docs/configurator_default_keymaps.md b/docs/configurator_default_keymaps.md
index 30f9fa72f..c52342cf1 100644
--- a/docs/configurator_default_keymaps.md
+++ b/docs/configurator_default_keymaps.md
@@ -20,7 +20,7 @@ Keymaps in this directory require four key-value pairs:
20 20
21Additionally, most keymaps contain a `commit` key. This key is not consumed by the API that back-stops QMK Configurator, but is used by Configurator's maintainers to tell which version of a keymap was used to create the JSON keymap in this repository. The value is the SHA of the last commit to modify a board's default `keymap.c` in the `qmk_firmware` repository. The SHA is found by checking out [the `master` branch of the `qmk/qmk_firmware` repository](https://github.com/qmk/qmk_firmware/tree/master/) and running `git log -1 --pretty=oneline -- keyboards/<keyboard>/keymaps/default/keymap.c` (use `keymap.json` if the keyboard in question has this file instead), which should return something similar to: 21Additionally, most keymaps contain a `commit` key. This key is not consumed by the API that back-stops QMK Configurator, but is used by Configurator's maintainers to tell which version of a keymap was used to create the JSON keymap in this repository. The value is the SHA of the last commit to modify a board's default `keymap.c` in the `qmk_firmware` repository. The SHA is found by checking out [the `master` branch of the `qmk/qmk_firmware` repository](https://github.com/qmk/qmk_firmware/tree/master/) and running `git log -1 --pretty=oneline -- keyboards/<keyboard>/keymaps/default/keymap.c` (use `keymap.json` if the keyboard in question has this file instead), which should return something similar to:
22 22
23```shell 23```
24f14629ed1cd7c7ec9089604d64f29a99981558e8 Remove/migrate action_get_macro()s from default keymaps (#5625) 24f14629ed1cd7c7ec9089604d64f29a99981558e8 Remove/migrate action_get_macro()s from default keymaps (#5625)
25``` 25```
26 26
@@ -31,7 +31,7 @@ In this example, `f14629ed1cd7c7ec9089604d64f29a99981558e8` is the value that sh
31 31
32If one wished to add a default keymap for the H87a by Hineybush, one would run the `git log` command above against the H87a's default keymap in `qmk_firmware`: 32If one wished to add a default keymap for the H87a by Hineybush, one would run the `git log` command above against the H87a's default keymap in `qmk_firmware`:
33 33
34```shell 34```
35user ~/qmk_firmware (master) 35user ~/qmk_firmware (master)
36$ git log -1 --pretty=oneline master -- keyboards/hineybush/h87a/keymaps/default/keymap.c 36$ git log -1 --pretty=oneline master -- keyboards/hineybush/h87a/keymaps/default/keymap.c
37ef8878fba5d3786e3f9c66436da63a560cd36ac9 Hineybush h87a lock indicators (#8237) 37ef8878fba5d3786e3f9c66436da63a560cd36ac9 Hineybush h87a lock indicators (#8237)
diff --git a/docs/contributing.md b/docs/contributing.md
index 1d68d22d9..eb033d167 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -105,7 +105,7 @@ enum my_keycodes {
105 105
106Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder: 106Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:
107 107
108 ./bin/qmk docs 108 qmk docs
109 109
110or if you only have Python 3 installed: 110or if you only have Python 3 installed:
111 111
diff --git a/docs/custom_matrix.md b/docs/custom_matrix.md
index cfa900a33..8f6878f94 100644
--- a/docs/custom_matrix.md
+++ b/docs/custom_matrix.md
@@ -15,7 +15,7 @@ The reasons to use this feature include:
15Implementing custom matrix usually involves compilation of an additional source file. It is recommended that for consistency, this file is called `matrix.c`. 15Implementing custom matrix usually involves compilation of an additional source file. It is recommended that for consistency, this file is called `matrix.c`.
16 16
17Add a new file to your keyboard directory: 17Add a new file to your keyboard directory:
18```text 18```
19keyboards/<keyboard>/matrix.c 19keyboards/<keyboard>/matrix.c
20``` 20```
21 21
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 463366ff7..798c346e6 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -149,7 +149,7 @@ This is useful for setting up stuff that you may need elsewhere, but isn't hardw
149* GPIO pin initialisation: `void matrix_init_pins(void)` 149* GPIO pin initialisation: `void matrix_init_pins(void)`
150 * This needs to perform the low-level initialisation of all row and column pins. By default this will initialise the input/output state of each of the GPIO pins listed in `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`, based on whether or not the keyboard is set up for `ROW2COL`, `COL2ROW`, or `DIRECT_PINS`. Should the keyboard designer override this function, no initialisation of pin state will occur within QMK itself, instead deferring to the keyboard's override. 150 * This needs to perform the low-level initialisation of all row and column pins. By default this will initialise the input/output state of each of the GPIO pins listed in `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`, based on whether or not the keyboard is set up for `ROW2COL`, `COL2ROW`, or `DIRECT_PINS`. Should the keyboard designer override this function, no initialisation of pin state will occur within QMK itself, instead deferring to the keyboard's override.
151* `COL2ROW`-based row reads: `void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)` 151* `COL2ROW`-based row reads: `void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)`
152* `ROW2COL`-based column reads: `void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)` 152* `ROW2COL`-based column reads: `void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col, matrix_row_t row_shifter)`
153* `DIRECT_PINS`-based reads: `void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)` 153* `DIRECT_PINS`-based reads: `void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)`
154 * These three functions need to perform the low-level retrieval of matrix state of relevant input pins, based on the matrix type. Only one of the functions should be implemented, if needed. By default this will iterate through `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`, configuring the inputs and outputs based on whether or not the keyboard is set up for `ROW2COL`, `COL2ROW`, or `DIRECT_PINS`. Should the keyboard designer override this function, no manipulation of matrix GPIO pin state will occur within QMK itself, instead deferring to the keyboard's override. 154 * These three functions need to perform the low-level retrieval of matrix state of relevant input pins, based on the matrix type. Only one of the functions should be implemented, if needed. By default this will iterate through `MATRIX_ROW_PINS` and `MATRIX_COL_PINS`, configuring the inputs and outputs based on whether or not the keyboard is set up for `ROW2COL`, `COL2ROW`, or `DIRECT_PINS`. Should the keyboard designer override this function, no manipulation of matrix GPIO pin state will occur within QMK itself, instead deferring to the keyboard's override.
155 155
diff --git a/docs/de/cli.md b/docs/de/cli.md
index 7dc02d505..259aeecf7 100644
--- a/docs/de/cli.md
+++ b/docs/de/cli.md
@@ -51,25 +51,6 @@ Wir suchen nach Freiwilligen, die ein `qmk`-Package für weitere Betriebssysteme
51* Installiere mit einem [virtualenv](https://virtualenv.pypa.io/en/latest/). 51* Installiere mit einem [virtualenv](https://virtualenv.pypa.io/en/latest/).
52* Weise den User an, die Umgebungs-Variable `QMK_HOME` zu setzen, um die Firmware-Quelle anders einzustellen als `~/qmk_firmware`. 52* Weise den User an, die Umgebungs-Variable `QMK_HOME` zu setzen, um die Firmware-Quelle anders einzustellen als `~/qmk_firmware`.
53 53
54# Lokale CLI
55
56Wenn Du die globale CLI nicht verwenden möchtest, beinhaltet `qmk_firmware` auch eine lokale CLI. Du kannst sie hier finden: `qmk_firmware/bin/qmk`. Du kannst den `qmk`-Befehl aus irgendeinem Datei-Verzeichnis ausführen und es wird immer auf dieser Kopie von `qmk_firmware` arbeiten.
57
58**Beispiel**:
59
60```
61$ ~/qmk_firmware/bin/qmk hello
62Ψ Hello, World!
63```
64
65## Einschränkungen der lokalen CLI
66
67Hier ein Vergleich mit der globalen CLI:
68
69* Die lokale CLI unterstützt kein `qmk setup` oder `qmk clone`.
70* Die lokale CLI arbeitet immer innerhalb der selben `qmk_firmware`-Verzeichnisstruktur, auch wenn Du mehrere Repositories geklont hast.
71* Die lokale CLI läuft nicht in einer virtualenv. Daher ist es möglich, dass Abhängigkeiten (dependencies) miteinander in Konflikt kommen/stehen.
72
73# CLI-Befehle 54# CLI-Befehle
74 55
75## `qmk compile` 56## `qmk compile`
diff --git a/docs/driver_installation_zadig.md b/docs/driver_installation_zadig.md
index 9155e56e3..003629ba9 100644
--- a/docs/driver_installation_zadig.md
+++ b/docs/driver_installation_zadig.md
@@ -93,6 +93,7 @@ The device name here is the name that appears in Zadig, and may not be what the
93|`usbasploader`|USBasp |`16C0:05DC` |libusbK| 93|`usbasploader`|USBasp |`16C0:05DC` |libusbK|
94|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB | 94|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB |
95|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB | 95|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB |
96|`gd32v-dfu` |GD32V BOOTLOADER |`28E9:0189` |WinUSB |
96|`kiibohd` |Kiibohd DFU Bootloader |`1C11:B007` |WinUSB | 97|`kiibohd` |Kiibohd DFU Bootloader |`1C11:B007` |WinUSB |
97|`stm32duino` |Maple 003 |`1EAF:0003` |WinUSB | 98|`stm32duino` |Maple 003 |`1EAF:0003` |WinUSB |
98|`qmk-hid` |(keyboard name) Bootloader |`03EB:2067` |HidUsb | 99|`qmk-hid` |(keyboard name) Bootloader |`03EB:2067` |HidUsb |
diff --git a/docs/es/hardware_drivers.md b/docs/es/hardware_drivers.md
index e0a973606..788de2c5e 100644
--- a/docs/es/hardware_drivers.md
+++ b/docs/es/hardware_drivers.md
@@ -18,10 +18,6 @@ Soporte para direccionar pines en el ProMicro por su nombre Arduino en lugar de
18 18
19Soporte para pantallas OLED basadas en SSD1306. Para obtener más información consulta la página de [Característica de Controlador OLED](feature_oled_driver.md). 19Soporte para pantallas OLED basadas en SSD1306. Para obtener más información consulta la página de [Característica de Controlador OLED](feature_oled_driver.md).
20 20
21## uGFX
22
23Puedes hacer uso de uGFX dentro de QMK para manejar LCDs de caracteres y gráficos, matrices de LED, OLED, TFT, y otras tecnologías de visualización. Esto necesita ser mejor documentado. Si estás tratando de hacer esto y leer el código no ayuda por favor [abre una issue](https://github.com/qmk/qmk_firmware/issues/new) y podemos ayudarte por el proceso.
24
25## WS2812 (Solo AVR) 21## WS2812 (Solo AVR)
26 22
27Soporte para LEDs WS2811/WS2812{a,b,c}. Para obtener más información consulta la página de [Luz RGB](feature_rgblight.md). 23Soporte para LEDs WS2811/WS2812{a,b,c}. Para obtener más información consulta la página de [Luz RGB](feature_rgblight.md).
diff --git a/docs/es/hardware_keyboard_guidelines.md b/docs/es/hardware_keyboard_guidelines.md
index a505cc5ce..298a3b7ce 100644
--- a/docs/es/hardware_keyboard_guidelines.md
+++ b/docs/es/hardware_keyboard_guidelines.md
@@ -142,8 +142,6 @@ El año debe ser el primer año en que se crea el archivo. Si el trabajo se hizo
142 142
143El núcleo de QMC está licenciado bajo la [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). Si estás enviando binarios para los procesadores AVR puedes elegir cualquiera [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) o [GPLv3](https://www.gnu.org/licenses/gpl.html). Si estás enviando binarios para ARM procesadores debes elegir [GPL Versión 3](https://www.gnu.org/licenses/gpl.html) para cumplir con los [ChibiOS](https://www.chibios.org) licencia GPLv3. 143El núcleo de QMC está licenciado bajo la [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). Si estás enviando binarios para los procesadores AVR puedes elegir cualquiera [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) o [GPLv3](https://www.gnu.org/licenses/gpl.html). Si estás enviando binarios para ARM procesadores debes elegir [GPL Versión 3](https://www.gnu.org/licenses/gpl.html) para cumplir con los [ChibiOS](https://www.chibios.org) licencia GPLv3.
144 144
145Si tu teclado hace uso de la [uGFX](https://gfx.io) características dentro de QMK debes cumplir con la [Licencia de uGFX](https://ugfx.io/license.html), que requiere una licencia comercial separada antes de vender un dispositivo que contiene uGFX.
146
147## Detalles técnicos 145## Detalles técnicos
148 146
149Si estás buscando más información sobre cómo hacer que su teclado funcione con QMK, [echa un vistazo a la sección hardware](hardware.md)! 147Si estás buscando más información sobre cómo hacer que su teclado funcione con QMK, [echa un vistazo a la sección hardware](hardware.md)!
diff --git a/docs/faq_debug.md b/docs/faq_debug.md
index 1afa38a62..28b8c8175 100644
--- a/docs/faq_debug.md
+++ b/docs/faq_debug.md
@@ -62,7 +62,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
62``` 62```
63 63
64Example output 64Example output
65```text 65```
66Waiting for device:....... 66Waiting for device:.......
67Listening: 67Listening:
68KL: kc: 169, col: 0, row: 0, pressed: 1 68KL: kc: 169, col: 0, row: 0, pressed: 1
@@ -82,7 +82,7 @@ When testing performance issues, it can be useful to know the frequency at which
82``` 82```
83 83
84Example output 84Example output
85```text 85```
86 > matrix scan frequency: 315 86 > matrix scan frequency: 315
87 > matrix scan frequency: 313 87 > matrix scan frequency: 313
88 > matrix scan frequency: 316 88 > matrix scan frequency: 316
diff --git a/docs/faq_misc.md b/docs/faq_misc.md
index 9ab2b69a8..41d17906b 100644
--- a/docs/faq_misc.md
+++ b/docs/faq_misc.md
@@ -36,7 +36,7 @@ Size after:
36 can retry, loading that one 36 can retry, loading that one
37 - Some of the options you might specify in your keyboard's Makefile 37 - Some of the options you might specify in your keyboard's Makefile
38 consume extra memory; watch out for BOOTMAGIC_ENABLE, 38 consume extra memory; watch out for BOOTMAGIC_ENABLE,
39 MOUSEKEY_ENABLE, EXTRAKEY_ENABLE, CONSOLE_ENABLE, API_SYSEX_ENABLE 39 MOUSEKEY_ENABLE, EXTRAKEY_ENABLE, CONSOLE_ENABLE
40- DFU tools do /not/ allow you to write into the bootloader (unless 40- DFU tools do /not/ allow you to write into the bootloader (unless
41 you throw in an extra fruit salad of options), so there is little risk 41 you throw in an extra fruit salad of options), so there is little risk
42 there. 42 there.
diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md
index d47ecc682..79782cf56 100644
--- a/docs/feature_backlight.md
+++ b/docs/feature_backlight.md
@@ -8,7 +8,7 @@ The MCU can only supply so much current to its GPIO pins. Instead of powering th
8 8
9Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following: 9Most keyboards have backlighting enabled by default if they support it, but if it is not working for you, check that your `rules.mk` includes the following:
10 10
11```makefile 11```make
12BACKLIGHT_ENABLE = yes 12BACKLIGHT_ENABLE = yes
13``` 13```
14 14
@@ -54,7 +54,7 @@ If backlight breathing is enabled (see below), the following functions are also
54 54
55To select which driver to use, configure your `rules.mk` with the following: 55To select which driver to use, configure your `rules.mk` with the following:
56 56
57```makefile 57```make
58BACKLIGHT_DRIVER = software 58BACKLIGHT_DRIVER = software
59``` 59```
60 60
@@ -87,7 +87,7 @@ This functionality is configured at the keyboard level with the `BACKLIGHT_ON_ST
87 87
88The `pwm` driver is configured by default, however the equivalent setting within `rules.mk` would be: 88The `pwm` driver is configured by default, however the equivalent setting within `rules.mk` would be:
89 89
90```makefile 90```make
91BACKLIGHT_DRIVER = pwm 91BACKLIGHT_DRIVER = pwm
92``` 92```
93 93
@@ -143,7 +143,7 @@ The breathing effect is the same as in the hardware PWM implementation.
143 143
144While still in its early stages, ARM backlight support aims to eventually have feature parity with AVR. The `pwm` driver is configured by default, however the equivalent setting within `rules.mk` would be: 144While still in its early stages, ARM backlight support aims to eventually have feature parity with AVR. The `pwm` driver is configured by default, however the equivalent setting within `rules.mk` would be:
145 145
146```makefile 146```make
147BACKLIGHT_DRIVER = pwm 147BACKLIGHT_DRIVER = pwm
148``` 148```
149 149
@@ -167,7 +167,7 @@ Currently only hardware PWM is supported, not timer assisted, and does not provi
167 167
168In 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`: 168In 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`:
169 169
170```makefile 170```make
171BACKLIGHT_DRIVER = software 171BACKLIGHT_DRIVER = software
172``` 172```
173 173
@@ -188,7 +188,7 @@ To activate multiple backlight pins, add something like this to your `config.h`,
188 188
189If none of the above drivers apply to your board (for example, you are using a separate IC to control the backlight), you can implement a custom backlight driver using this simple API provided by QMK. To enable, add this to your `rules.mk`: 189If none of the above drivers apply to your board (for example, you are using a separate IC to control the backlight), you can implement a custom backlight driver using this simple API provided by QMK. To enable, add this to your `rules.mk`:
190 190
191```makefile 191```make
192BACKLIGHT_DRIVER = custom 192BACKLIGHT_DRIVER = custom
193``` 193```
194 194
diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md
index 08e5f24ac..fdf19c107 100644
--- a/docs/feature_bluetooth.md
+++ b/docs/feature_bluetooth.md
@@ -4,10 +4,10 @@
4 4
5Currently 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. 5Currently 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.
6 6
7|Board |Bluetooth Protocol |Connection Type |rules.mk |Bluetooth Chip| 7|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
8|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------| 8|----------------------------------------------------------------|--------------------|---------------|--------------------------------|--------------|
9|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART |`BLUETOOTH = RN42` | RN-42 | 9|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = RN42` |RN-42 |
10|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI |`BLUETOOTH = AdafruitBLE` | nRF51822 | 10|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = AdafruitBLE`|nRF51822 |
11 11
12Not Supported Yet but possible: 12Not Supported Yet but possible:
13* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514) 13* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
@@ -17,22 +17,23 @@ Not Supported Yet but possible:
17 17
18### Adafruit BLE SPI Friend 18### Adafruit BLE SPI Friend
19Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines: 19Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
20* #define AdafruitBleResetPin D4 20* `#define ADAFRUIT_BLE_RST_PIN D4`
21* #define AdafruitBleCSPin B4 21* `#define ADAFRUIT_BLE_CS_PIN B4`
22* #define AdafruitBleIRQPin E6 22* `#define ADAFRUIT_BLE_IRQ_PIN E6`
23 23
24A 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. 24A 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.
25 25
26
27<!-- FIXME: Document bluetooth support more completely. --> 26<!-- FIXME: Document bluetooth support more completely. -->
28## Bluetooth Rules.mk Options 27## Bluetooth Rules.mk Options
29 28
30The 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`. 29The 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`.
31 30
32Use only one of these to enable Bluetooth: 31Add the following to your `rules.mk`:
33* BLUETOOTH_ENABLE = yes (Legacy Option) 32
34* BLUETOOTH = RN42 33```make
35* BLUETOOTH = AdafruitBLE 34BLUETOOTH_ENABLE = yes
35BLUETOOTH_DRIVER = AdafruitBLE # or RN42
36```
36 37
37## Bluetooth Keycodes 38## Bluetooth Keycodes
38 39
diff --git a/docs/feature_digitizer.md b/docs/feature_digitizer.md
index 9b6aeddba..ac2d64f97 100644
--- a/docs/feature_digitizer.md
+++ b/docs/feature_digitizer.md
@@ -4,7 +4,7 @@ The digitizer HID interface allows setting the mouse cursor position at absolute
4 4
5To enable the digitizer interface, add the following line to your rules.mk: 5To enable the digitizer interface, add the following line to your rules.mk:
6 6
7```makefile 7```make
8DIGITIZER_ENABLE = yes 8DIGITIZER_ENABLE = yes
9``` 9```
10 10
diff --git a/docs/feature_haptic_feedback.md b/docs/feature_haptic_feedback.md
index 1f36f5b05..159296a29 100644
--- a/docs/feature_haptic_feedback.md
+++ b/docs/feature_haptic_feedback.md
@@ -4,9 +4,22 @@
4 4
5The following options are currently available for haptic feedback in `rules.mk`: 5The following options are currently available for haptic feedback in `rules.mk`:
6 6
7`HAPTIC_ENABLE += DRV2605L` 7```
8HAPTIC_ENABLE = yes
9
10HAPTIC_DRIVER += DRV2605L
11HAPTIC_DRIVER += SOLENOID
12```
13
14The following `config.h` settings are available for all types of haptic feedback:
8 15
9`HAPTIC_ENABLE += SOLENOID` 16| Settings | Default | Description |
17|--------------------------------------|---------------|---------------------------------------------------------------------------------------------------------------|
18|`HAPTIC_ENABLE_PIN` | *Not defined* |Configures a pin to enable a boost converter for some haptic solution, often used with solenoid drivers. |
19|`HAPTIC_ENABLE_PIN_ACTIVE_LOW` | *Not defined* |If defined then the haptic enable pin is active-low. |
20|`HAPTIC_ENABLE_STATUS_LED` | *Not defined* |Configures a pin to reflect the current enabled/disabled status of haptic feedback. |
21|`HAPTIC_ENABLE_STATUS_LED_ACTIVE_LOW` | *Not defined* |If defined then the haptic status led will be active-low. |
22|`HAPTIC_OFF_IN_LOW_POWER` | `0` |If set to `1`, haptic feedback is disabled before the device is configured, and while the device is suspended. |
10 23
11## Known Supported Hardware 24## Known Supported Hardware
12 25
@@ -45,6 +58,7 @@ First you will need a build a circuit to drive the solenoid through a mosfet as
45| Settings | Default | Description | 58| Settings | Default | Description |
46|----------------------------|----------------------|-------------------------------------------------------| 59|----------------------------|----------------------|-------------------------------------------------------|
47|`SOLENOID_PIN` | *Not defined* |Configures the pin that the Solenoid is connected to. | 60|`SOLENOID_PIN` | *Not defined* |Configures the pin that the Solenoid is connected to. |
61|`SOLENOID_PIN_ACTIVE_LOW` | *Not defined* |If defined then the solenoid trigger pin is active low.|
48|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the solenoid. | 62|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the solenoid. |
49|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. | 63|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
50|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. | 64|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
@@ -172,6 +186,7 @@ With the entry of `#define NO_HAPTIC_MOD` in config.h, the following keys will n
172 186
173* Usual modifier keys such as Control/Shift/Alt/Gui (For example `KC_LCTRL`) 187* Usual modifier keys such as Control/Shift/Alt/Gui (For example `KC_LCTRL`)
174* `MO()` momentary keys. See also [Layers](feature_layers.md). 188* `MO()` momentary keys. See also [Layers](feature_layers.md).
189* `LM()` momentary keys with mod active.
175* `LT()` layer tap keys, when held to activate a layer. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. 190* `LT()` layer tap keys, when held to activate a layer. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered.
176* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered. 191* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered.
177* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md). 192* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md).
diff --git a/docs/feature_joystick.md b/docs/feature_joystick.md
index 95702d6a2..fe33517a1 100644
--- a/docs/feature_joystick.md
+++ b/docs/feature_joystick.md
@@ -15,7 +15,7 @@ or send gamepad reports based on values computed by the keyboard.
15 15
16To use analog input you must first enable it in `rules.mk`: 16To use analog input you must first enable it in `rules.mk`:
17 17
18```makefile 18```make
19JOYSTICK_ENABLE = yes 19JOYSTICK_ENABLE = yes
20JOYSTICK_DRIVER = analog # or 'digital' 20JOYSTICK_DRIVER = analog # or 'digital'
21``` 21```
diff --git a/docs/feature_layouts.md b/docs/feature_layouts.md
index b34fd442d..93d040b55 100644
--- a/docs/feature_layouts.md
+++ b/docs/feature_layouts.md
@@ -25,7 +25,7 @@ The `layouts/default/` and `layouts/community/` are two examples of layout "repo
25 25
26Each layout folder is named (`[a-z0-9_]`) after the physical aspects of the layout, in the most generic way possible, and contains a `readme.md` with the layout to be defined by the keyboard: 26Each layout folder is named (`[a-z0-9_]`) after the physical aspects of the layout, in the most generic way possible, and contains a `readme.md` with the layout to be defined by the keyboard:
27 27
28```md 28```markdown
29# 60_ansi 29# 60_ansi
30 30
31 LAYOUT_60_ansi 31 LAYOUT_60_ansi
diff --git a/docs/feature_led_matrix.md b/docs/feature_led_matrix.md
index ed92bffd9..d4b20b9aa 100644
--- a/docs/feature_led_matrix.md
+++ b/docs/feature_led_matrix.md
@@ -49,6 +49,8 @@ Here is an example using 2 drivers.
49 49
50!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`. 50!> Note the parentheses, this is so when `LED_DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
51 51
52For split keyboards using `LED_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
53
52Define these arrays listing all the LEDs in your `<keyboard>.c`: 54Define these arrays listing all the LEDs in your `<keyboard>.c`:
53 55
54```c 56```c
@@ -219,7 +221,7 @@ static bool my_cool_effect(effect_params_t* params) {
219 for (uint8_t i = led_min; i < led_max; i++) { 221 for (uint8_t i = led_min; i < led_max; i++) {
220 led_matrix_set_value(i, 0xFF); 222 led_matrix_set_value(i, 0xFF);
221 } 223 }
222 return led_max < DRIVER_LED_TOTAL; 224 return led_matrix_check_finished_leds(led_max);
223} 225}
224 226
225// e.g: A more complex effect, relying on external methods and state, with 227// e.g: A more complex effect, relying on external methods and state, with
@@ -233,8 +235,7 @@ static bool my_cool_effect2_complex_run(effect_params_t* params) {
233 for (uint8_t i = led_min; i < led_max; i++) { 235 for (uint8_t i = led_min; i < led_max; i++) {
234 led_matrix_set_value(i, some_global_state++); 236 led_matrix_set_value(i, some_global_state++);
235 } 237 }
236 238 return led_matrix_check_finished_leds(led_max);
237 return led_max < DRIVER_LED_TOTAL;
238} 239}
239static bool my_cool_effect2(effect_params_t* params) { 240static bool my_cool_effect2(effect_params_t* params) {
240 if (params->init) my_cool_effect2_complex_init(params); 241 if (params->init) my_cool_effect2_complex_init(params);
diff --git a/docs/feature_midi.md b/docs/feature_midi.md
index ab29d89db..3da5c4940 100644
--- a/docs/feature_midi.md
+++ b/docs/feature_midi.md
@@ -4,7 +4,7 @@
4 4
5First, enable MIDI by adding the following to your `rules.mk`: 5First, enable MIDI by adding the following to your `rules.mk`:
6 6
7```makefile 7```make
8MIDI_ENABLE = yes 8MIDI_ENABLE = yes
9``` 9```
10 10
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index 6d82aa0f5..0c926f674 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -38,7 +38,7 @@ Then in your `keymap.c` file, implement the OLED task call. This example assumes
38 38
39```c 39```c
40#ifdef OLED_ENABLE 40#ifdef OLED_ENABLE
41void oled_task_user(void) { 41bool oled_task_user(void) {
42 // Host Keyboard Layer Status 42 // Host Keyboard Layer Status
43 oled_write_P(PSTR("Layer: "), false); 43 oled_write_P(PSTR("Layer: "), false);
44 44
@@ -62,6 +62,8 @@ void oled_task_user(void) {
62 oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false); 62 oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
63 oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false); 63 oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
64 oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false); 64 oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
65
66 return false;
65} 67}
66#endif 68#endif
67``` 69```
@@ -133,13 +135,14 @@ oled_rotation_t oled_init_user(oled_rotation_t rotation) {
133 return rotation; 135 return rotation;
134} 136}
135 137
136void oled_task_user(void) { 138bool oled_task_user(void) {
137 if (is_keyboard_master()) { 139 if (is_keyboard_master()) {
138 render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) 140 render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
139 } else { 141 } else {
140 render_logo(); // Renders a static logo 142 render_logo(); // Renders a static logo
141 oled_scroll_left(); // Turns on scrolling 143 oled_scroll_left(); // Turns on scrolling
142 } 144 }
145 return false;
143} 146}
144#endif 147#endif
145``` 148```
@@ -242,6 +245,7 @@ bool oled_init(oled_rotation_t rotation);
242// Called at the start of oled_init, weak function overridable by the user 245// Called at the start of oled_init, weak function overridable by the user
243// rotation - the value passed into oled_init 246// rotation - the value passed into oled_init
244// Return new oled_rotation_t if you want to override default rotation 247// Return new oled_rotation_t if you want to override default rotation
248oled_rotation_t oled_init_kb(oled_rotation_t rotation);
245oled_rotation_t oled_init_user(oled_rotation_t rotation); 249oled_rotation_t oled_init_user(oled_rotation_t rotation);
246 250
247// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering 251// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering
@@ -333,7 +337,8 @@ uint8_t oled_get_brightness(void);
333void oled_task(void); 337void oled_task(void);
334 338
335// Called at the start of oled_task, weak function overridable by the user 339// Called at the start of oled_task, weak function overridable by the user
336void oled_task_user(void); 340bool oled_task_kb(void);
341bool oled_task_user(void);
337 342
338// Set the specific 8 lines rows of the screen to scroll. 343// Set the specific 8 lines rows of the screen to scroll.
339// 0 is the default for start, and 7 for end, which is the entire 344// 0 is the default for start, and 7 for end, which is the entire
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index 905c2a8f9..badeadc12 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -4,7 +4,7 @@ Pointing Device is a generic name for a feature intended to be generic: moving t
4 4
5To enable Pointing Device, uncomment the following line in your rules.mk: 5To enable Pointing Device, uncomment the following line in your rules.mk:
6 6
7```makefile 7```make
8POINTING_DEVICE_ENABLE = yes 8POINTING_DEVICE_ENABLE = yes
9``` 9```
10 10
diff --git a/docs/feature_programmable_button.md b/docs/feature_programmable_button.md
new file mode 100644
index 000000000..b1ef555d1
--- /dev/null
+++ b/docs/feature_programmable_button.md
@@ -0,0 +1,74 @@
1## Programmable Button
2
3Programmable button is a feature that can be used to send keys that have no
4predefined meaning.
5This means they can be processed on the host side by custom software without
6colliding without the operating system trying to interpret these keys.
7
8The keycodes are emitted according to the HID usage
9"Telephony Device Page" (0x0B), "Programmable button usage" (0x07).
10On Linux (> 5.14) they are handled automatically and translated to `KEY_MACRO#`
11keycodes.
12(Up to `KEY_MACRO30`)
13
14### Enabling Programmable Button support
15
16To enable Programmable Button, add the following line to your keymap’s `rules.mk`:
17
18```c
19PROGRAMMABLE_BUTTON_ENABLE = yes
20```
21
22### Mapping
23
24In your keymap you can use the following keycodes to map key presses to Programmable Buttons:
25
26|Key |Description |
27|------------------------|----------------------|
28|`PROGRAMMABLE_BUTTON_1` |Programmable button 1 |
29|`PROGRAMMABLE_BUTTON_2` |Programmable button 2 |
30|`PROGRAMMABLE_BUTTON_3` |Programmable button 3 |
31|`PROGRAMMABLE_BUTTON_4` |Programmable button 4 |
32|`PROGRAMMABLE_BUTTON_5` |Programmable button 5 |
33|`PROGRAMMABLE_BUTTON_6` |Programmable button 6 |
34|`PROGRAMMABLE_BUTTON_7` |Programmable button 7 |
35|`PROGRAMMABLE_BUTTON_8` |Programmable button 8 |
36|`PROGRAMMABLE_BUTTON_9` |Programmable button 9 |
37|`PROGRAMMABLE_BUTTON_10`|Programmable button 10|
38|`PROGRAMMABLE_BUTTON_11`|Programmable button 11|
39|`PROGRAMMABLE_BUTTON_12`|Programmable button 12|
40|`PROGRAMMABLE_BUTTON_13`|Programmable button 13|
41|`PROGRAMMABLE_BUTTON_14`|Programmable button 14|
42|`PROGRAMMABLE_BUTTON_15`|Programmable button 15|
43|`PROGRAMMABLE_BUTTON_16`|Programmable button 16|
44|`PROGRAMMABLE_BUTTON_17`|Programmable button 17|
45|`PROGRAMMABLE_BUTTON_18`|Programmable button 18|
46|`PROGRAMMABLE_BUTTON_19`|Programmable button 19|
47|`PROGRAMMABLE_BUTTON_20`|Programmable button 20|
48|`PROGRAMMABLE_BUTTON_21`|Programmable button 21|
49|`PROGRAMMABLE_BUTTON_22`|Programmable button 22|
50|`PROGRAMMABLE_BUTTON_23`|Programmable button 23|
51|`PROGRAMMABLE_BUTTON_24`|Programmable button 24|
52|`PROGRAMMABLE_BUTTON_25`|Programmable button 25|
53|`PROGRAMMABLE_BUTTON_26`|Programmable button 26|
54|`PROGRAMMABLE_BUTTON_27`|Programmable button 27|
55|`PROGRAMMABLE_BUTTON_28`|Programmable button 28|
56|`PROGRAMMABLE_BUTTON_29`|Programmable button 29|
57|`PROGRAMMABLE_BUTTON_30`|Programmable button 30|
58|`PROGRAMMABLE_BUTTON_31`|Programmable button 31|
59|`PROGRAMMABLE_BUTTON_32`|Programmable button 32|
60|`PB_1` to `PB_32` |Aliases for keymaps |
61
62### API
63
64You can also use a dedicated API defined in `programmable_button.h` to interact with this feature:
65
66```
67void programmable_button_clear(void);
68void programmable_button_send(void);
69void programmable_button_on(uint8_t code);
70void programmable_button_off(uint8_t code);
71bool programmable_button_is_on(uint8_t code);
72uint32_t programmable_button_get_report(void);
73void programmable_button_set_report(uint32_t report);
74```
diff --git a/docs/feature_ps2_mouse.md b/docs/feature_ps2_mouse.md
index 776a33150..c980705ae 100644
--- a/docs/feature_ps2_mouse.md
+++ b/docs/feature_ps2_mouse.md
@@ -30,7 +30,7 @@ Note: This is not recommended, you may encounter jerky movement or unsent inputs
30 30
31In rules.mk: 31In rules.mk:
32 32
33```makefile 33```make
34PS2_MOUSE_ENABLE = yes 34PS2_MOUSE_ENABLE = yes
35PS2_USE_BUSYWAIT = yes 35PS2_USE_BUSYWAIT = yes
36``` 36```
@@ -39,14 +39,8 @@ In your keyboard config.h:
39 39
40```c 40```c
41#ifdef PS2_USE_BUSYWAIT 41#ifdef PS2_USE_BUSYWAIT
42# define PS2_CLOCK_PORT PORTD 42# define PS2_CLOCK_PIN D1
43# define PS2_CLOCK_PIN PIND 43# define PS2_DATA_PIN D2
44# define PS2_CLOCK_DDR DDRD
45# define PS2_CLOCK_BIT 1
46# define PS2_DATA_PORT PORTD
47# define PS2_DATA_PIN PIND
48# define PS2_DATA_DDR DDRD
49# define PS2_DATA_BIT 2
50#endif 44#endif
51``` 45```
52 46
@@ -56,7 +50,7 @@ The following example uses D2 for clock and D5 for data. You can use any INT or
56 50
57In rules.mk: 51In rules.mk:
58 52
59```makefile 53```make
60PS2_MOUSE_ENABLE = yes 54PS2_MOUSE_ENABLE = yes
61PS2_USE_INT = yes 55PS2_USE_INT = yes
62``` 56```
@@ -65,14 +59,8 @@ In your keyboard config.h:
65 59
66```c 60```c
67#ifdef PS2_USE_INT 61#ifdef PS2_USE_INT
68#define PS2_CLOCK_PORT PORTD 62#define PS2_CLOCK_PIN D2
69#define PS2_CLOCK_PIN PIND 63#define PS2_DATA_PIN D5
70#define PS2_CLOCK_DDR DDRD
71#define PS2_CLOCK_BIT 2
72#define PS2_DATA_PORT PORTD
73#define PS2_DATA_PIN PIND
74#define PS2_DATA_DDR DDRD
75#define PS2_DATA_BIT 5
76 64
77#define PS2_INT_INIT() do { \ 65#define PS2_INT_INIT() do { \
78 EICRA |= ((1<<ISC21) | \ 66 EICRA |= ((1<<ISC21) | \
@@ -102,8 +90,8 @@ PS2_USE_INT = yes
102In your keyboard config.h: 90In your keyboard config.h:
103 91
104```c 92```c
105#define PS2_CLOCK A8 93#define PS2_CLOCK_PIN A8
106#define PS2_DATA A9 94#define PS2_DATA_PIN A9
107``` 95```
108 96
109And in the chibios specifig halconf.h: 97And in the chibios specifig halconf.h:
@@ -118,7 +106,7 @@ To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data.
118 106
119In rules.mk: 107In rules.mk:
120 108
121```makefile 109```make
122PS2_MOUSE_ENABLE = yes 110PS2_MOUSE_ENABLE = yes
123PS2_USE_USART = yes 111PS2_USE_USART = yes
124``` 112```
@@ -127,14 +115,8 @@ In your keyboard config.h:
127 115
128```c 116```c
129#ifdef PS2_USE_USART 117#ifdef PS2_USE_USART
130#define PS2_CLOCK_PORT PORTD 118#define PS2_CLOCK_PIN D5
131#define PS2_CLOCK_PIN PIND 119#define PS2_DATA_PIN D2
132#define PS2_CLOCK_DDR DDRD
133#define PS2_CLOCK_BIT 5
134#define PS2_DATA_PORT PORTD
135#define PS2_DATA_PIN PIND
136#define PS2_DATA_DDR DDRD
137#define PS2_DATA_BIT 2
138 120
139/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ 121/* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */
140/* set DDR of CLOCK as input to be slave */ 122/* set DDR of CLOCK as input to be slave */
diff --git a/docs/feature_rawhid.md b/docs/feature_rawhid.md
index 4a688fcba..558a23a80 100644
--- a/docs/feature_rawhid.md
+++ b/docs/feature_rawhid.md
@@ -15,7 +15,7 @@ RAW_ENABLE = yes
15 15
16In your `keymap.c` include `"raw_hid.h"` and implement the following: 16In your `keymap.c` include `"raw_hid.h"` and implement the following:
17 17
18```C 18```c
19void raw_hid_receive(uint8_t *data, uint8_t length) { 19void raw_hid_receive(uint8_t *data, uint8_t length) {
20 // Your code goes here. data is the packet received from host. 20 // Your code goes here. data is the packet received from host.
21} 21}
@@ -23,7 +23,7 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
23 23
24The `"raw_hid.h"` header also declares `void raw_hid_send(uint8_t *data, uint8_t length);` which allows sending packets from keyboard to host. As an example, it can also be used for debugging when building your host application by returning all data back to the host. 24The `"raw_hid.h"` header also declares `void raw_hid_send(uint8_t *data, uint8_t length);` which allows sending packets from keyboard to host. As an example, it can also be used for debugging when building your host application by returning all data back to the host.
25 25
26```C 26```c
27void raw_hid_receive(uint8_t *data, uint8_t length) { 27void raw_hid_receive(uint8_t *data, uint8_t length) {
28 raw_hid_send(data, length); 28 raw_hid_send(data, length);
29} 29}
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 2dbd32fbd..6370c637a 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -10,7 +10,7 @@ If you want to use single color LED's you should use the [LED Matrix Subsystem](
10 10
11There is basic support for addressable RGB matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`: 11There is basic support for addressable RGB matrix lighting with the I2C IS31FL3731 RGB controller. To enable it, add this to your `rules.mk`:
12 12
13```makefile 13```make
14RGB_MATRIX_ENABLE = yes 14RGB_MATRIX_ENABLE = yes
15RGB_MATRIX_DRIVER = IS31FL3731 15RGB_MATRIX_DRIVER = IS31FL3731
16``` 16```
@@ -21,6 +21,7 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `DRIVER_ADDR_<N>` de
21|----------|-------------|---------| 21|----------|-------------|---------|
22| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | 22| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
23| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | 23| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
24| `ISSI_3731_DEGHOST` | (Optional) Set this define to enable de-ghosting by halving Vcc during blanking time | |
24| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | 25| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
25| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | 26| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
26| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | 27| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
@@ -49,6 +50,8 @@ Here is an example using 2 drivers.
49 50
50!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`. 51!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
51 52
53For split keyboards using `RGB_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
54
52Define these arrays listing all the LEDs in your `<keyboard>.c`: 55Define these arrays listing all the LEDs in your `<keyboard>.c`:
53 56
54```c 57```c
@@ -71,7 +74,7 @@ Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet]
71 74
72There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`: 75There is basic support for addressable RGB matrix lighting with the I2C IS31FL3733 RGB controller. To enable it, add this to your `rules.mk`:
73 76
74```makefile 77```make
75RGB_MATRIX_ENABLE = yes 78RGB_MATRIX_ENABLE = yes
76RGB_MATRIX_DRIVER = IS31FL3733 79RGB_MATRIX_DRIVER = IS31FL3733
77``` 80```
@@ -82,6 +85,9 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
82|----------|-------------|---------| 85|----------|-------------|---------|
83| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | 86| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
84| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | 87| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
88| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
89| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
90| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
85| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | 91| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
86| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | 92| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
87| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | 93| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
@@ -93,6 +99,18 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
93| `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 | 99| `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 |
94| `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 | 100| `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 |
95 101
102The IS31FL3733 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
103
104| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
105|----------------------|-------------|
106| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
107| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
108| `PUR_3KR` | The 3k Ohm resistor used at all times |
109| `PUR_4KR` | The 4k Ohm resistor used at all times |
110| `PUR_8KR` | The 8k Ohm resistor used at all times |
111| `PUR_16KR` | The 16k Ohm resistor used at all times |
112| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
113
96Here is an example using 2 drivers. 114Here is an example using 2 drivers.
97 115
98```c 116```c
@@ -141,7 +159,7 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
141 159
142There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`: 160There is basic support for addressable RGB matrix lighting with the I2C IS31FL3737 RGB controller. To enable it, add this to your `rules.mk`:
143 161
144```makefile 162```make
145RGB_MATRIX_ENABLE = yes 163RGB_MATRIX_ENABLE = yes
146RGB_MATRIX_DRIVER = IS31FL3737 164RGB_MATRIX_DRIVER = IS31FL3737
147``` 165```
@@ -153,11 +171,25 @@ Configure the hardware via your `config.h`:
153|----------|-------------|---------| 171|----------|-------------|---------|
154| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | 172| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
155| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | 173| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
174| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
175| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
156| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | 176| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
157| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | 177| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
158| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | | 178| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
159| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | | 179| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
160 180
181The IS31FL3737 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
182
183| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
184|----------------------|-------------|
185| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
186| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
187| `PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
188| `PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
189| `PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
190| `PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
191| `PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
192| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
161 193
162Here is an example using 2 drivers. 194Here is an example using 2 drivers.
163 195
@@ -181,7 +213,7 @@ Here is an example using 2 drivers.
181``` 213```
182!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`. 214!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
183 215
184Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations. 216Currently only 2 drivers are supported, but it would be trivial to support all 4 combinations.
185 217
186Define these arrays listing all the LEDs in your `<keyboard>.c`: 218Define these arrays listing all the LEDs in your `<keyboard>.c`:
187 219
@@ -206,7 +238,7 @@ Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](
206 238
207There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`: 239There is basic support for addressable RGB matrix lighting with a WS2811/WS2812{a,b,c} addressable LED strand. To enable it, add this to your `rules.mk`:
208 240
209```makefile 241```make
210RGB_MATRIX_ENABLE = yes 242RGB_MATRIX_ENABLE = yes
211RGB_MATRIX_DRIVER = WS2812 243RGB_MATRIX_DRIVER = WS2812
212``` 244```
@@ -226,7 +258,7 @@ Configure the hardware via your `config.h`:
226 258
227There is basic support for APA102 based addressable LED strands. To enable it, add this to your `rules.mk`: 259There is basic support for APA102 based addressable LED strands. To enable it, add this to your `rules.mk`:
228 260
229```makefile 261```make
230RGB_MATRIX_ENABLE = yes 262RGB_MATRIX_ENABLE = yes
231RGB_MATRIX_DRIVER = APA102 263RGB_MATRIX_DRIVER = APA102
232``` 264```
@@ -246,7 +278,7 @@ Configure the hardware via your `config.h`:
246### AW20216 :id=aw20216 278### AW20216 :id=aw20216
247There is basic support for addressable RGB matrix lighting with the SPI AW20216 RGB controller. To enable it, add this to your `rules.mk`: 279There is basic support for addressable RGB matrix lighting with the SPI AW20216 RGB controller. To enable it, add this to your `rules.mk`:
248 280
249```makefile 281```make
250RGB_MATRIX_ENABLE = yes 282RGB_MATRIX_ENABLE = yes
251RGB_MATRIX_DRIVER = AW20216 283RGB_MATRIX_DRIVER = AW20216
252``` 284```
@@ -340,7 +372,7 @@ x = 224 / (NUMBER_OF_COLS - 1) * COL_POSITION
340y = 64 / (NUMBER_OF_ROWS - 1) * ROW_POSITION 372y = 64 / (NUMBER_OF_ROWS - 1) * ROW_POSITION
341``` 373```
342 374
343Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout. 375Where NUMBER_OF_COLS, NUMBER_OF_ROWS, COL_POSITION, & ROW_POSITION are all based on the physical layout of your keyboard, not the electrical layout.
344 376
345As mentioned earlier, the center of the keyboard by default is expected to be `{ 112, 32 }`, but this can be changed if you want to more accurately calculate the LED's physical `{ x, y }` positions. Keyboard designers can implement `#define RGB_MATRIX_CENTER { 112, 32 }` in their config.h file with the new center point of the keyboard, or where they want it to be allowing more possibilities for the `{ x, y }` values. Do note that the maximum value for x or y is 255, and the recommended maximum is 224 as this gives animations runoff room before they reset. 377As mentioned earlier, the center of the keyboard by default is expected to be `{ 112, 32 }`, but this can be changed if you want to more accurately calculate the LED's physical `{ x, y }` positions. Keyboard designers can implement `#define RGB_MATRIX_CENTER { 112, 32 }` in their config.h file with the new center point of the keyboard, or where they want it to be allowing more possibilities for the `{ x, y }` values. Do note that the maximum value for x or y is 255, and the recommended maximum is 224 as this gives animations runoff room before they reset.
346 378
@@ -383,7 +415,7 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
383 415
384* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system. 416* `RGB_MODE_*` keycodes will generally work, but not all of the modes are currently mapped to the correct effects for the RGB Matrix system.
385 417
386`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MATRIX_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped. 418`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MATRIX_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
387 419
388!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature. 420!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
389 421
@@ -420,7 +452,9 @@ enum rgb_matrix_effects {
420 RGB_MATRIX_JELLYBEAN_RAINDROPS, // Randomly changes a single key's hue and saturation 452 RGB_MATRIX_JELLYBEAN_RAINDROPS, // Randomly changes a single key's hue and saturation
421 RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight ammount at the same time, then shifts back 453 RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight ammount at the same time, then shifts back
422 RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left 454 RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
423 RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right 455 RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
456 RGB_MATRIX_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
457 RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
424#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS) 458#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
425 RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM! 459 RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
426 RGB_MATRIX_DIGITAL_RAIN, // That famous computer simulation 460 RGB_MATRIX_DIGITAL_RAIN, // That famous computer simulation
@@ -473,7 +507,9 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
473|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` | 507|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` |
474|`#define DISABLE_RGB_MATRIX_HUE_BREATHING` |Disables `RGB_MATRIX_HUE_BREATHING` | 508|`#define DISABLE_RGB_MATRIX_HUE_BREATHING` |Disables `RGB_MATRIX_HUE_BREATHING` |
475|`#define DISABLE_RGB_MATRIX_HUE_PENDULUM` |Disables `RGB_MATRIX_HUE_PENDULUM` | 509|`#define DISABLE_RGB_MATRIX_HUE_PENDULUM` |Disables `RGB_MATRIX_HUE_PENDULUM` |
476|`#define DISABLE_RGB_MATRIX_HUE_WAVE ` |Disables `RGB_MATRIX_HUE_WAVE ` | 510|`#define DISABLE_RGB_MATRIX_HUE_WAVE` |Disables `RGB_MATRIX_HUE_WAVE` |
511|`#define DISABLE_RGB_MATRIX_FRACTAL` |Disables `RGB_MATRIX_FRACTAL` |
512|`#define DISABLE_RGB_MATRIX_PIXEL_RAIN ` |Disables `RGB_MATRIX_PIXEL_RAIN ` |
477|`#define DISABLE_RGB_MATRIX_TYPING_HEATMAP` |Disables `RGB_MATRIX_TYPING_HEATMAP` | 513|`#define DISABLE_RGB_MATRIX_TYPING_HEATMAP` |Disables `RGB_MATRIX_TYPING_HEATMAP` |
478|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` | 514|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` |
479|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `RGB_MATRIX_SOLID_REACTIVE_SIMPLE` | 515|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |Disables `RGB_MATRIX_SOLID_REACTIVE_SIMPLE` |
@@ -537,7 +573,7 @@ static bool my_cool_effect(effect_params_t* params) {
537 for (uint8_t i = led_min; i < led_max; i++) { 573 for (uint8_t i = led_min; i < led_max; i++) {
538 rgb_matrix_set_color(i, 0xff, 0xff, 0x00); 574 rgb_matrix_set_color(i, 0xff, 0xff, 0x00);
539 } 575 }
540 return led_max < DRIVER_LED_TOTAL; 576 return rgb_matrix_check_finished_leds(led_max);
541} 577}
542 578
543// e.g: A more complex effect, relying on external methods and state, with 579// e.g: A more complex effect, relying on external methods and state, with
@@ -551,8 +587,7 @@ static bool my_cool_effect2_complex_run(effect_params_t* params) {
551 for (uint8_t i = led_min; i < led_max; i++) { 587 for (uint8_t i = led_min; i < led_max; i++) {
552 rgb_matrix_set_color(i, 0xff, some_global_state++, 0xff); 588 rgb_matrix_set_color(i, 0xff, some_global_state++, 0xff);
553 } 589 }
554 590 return rgb_matrix_check_finished_leds(led_max);
555 return led_max < DRIVER_LED_TOTAL;
556} 591}
557static bool my_cool_effect2(effect_params_t* params) { 592static bool my_cool_effect2(effect_params_t* params) {
558 if (params->init) my_cool_effect2_complex_init(params); 593 if (params->init) my_cool_effect2_complex_init(params);
@@ -694,7 +729,7 @@ Where `28` is an unused index from `eeconfig.h`.
694 729
695### Indicators :id=indicators 730### Indicators :id=indicators
696 731
697If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that: 732If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that:
698```c 733```c
699void rgb_matrix_indicators_kb(void) { 734void rgb_matrix_indicators_kb(void) {
700 rgb_matrix_set_color(index, red, green, blue); 735 rgb_matrix_set_color(index, red, green, blue);
@@ -749,18 +784,18 @@ This example sets the modifiers to be a specific color based on the layer state.
749```c 784```c
750void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { 785void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
751 HSV hsv = {0, 255, 255}; 786 HSV hsv = {0, 255, 255};
752 787
753 if (layer_state_is(layer_state, 2)) { 788 if (layer_state_is(layer_state, 2)) {
754 hsv = {130, 255, 255}; 789 hsv = {130, 255, 255};
755 } else { 790 } else {
756 hsv = {30, 255, 255}; 791 hsv = {30, 255, 255};
757 } 792 }
758 793
759 if (hsv.v > rgb_matrix_get_val()) { 794 if (hsv.v > rgb_matrix_get_val()) {
760 hsv.v = rgb_matrix_get_val(); 795 hsv.v = rgb_matrix_get_val();
761 } 796 }
762 RGB rgb = hsv_to_rgb(hsv); 797 RGB rgb = hsv_to_rgb(hsv);
763 798
764 for (uint8_t i = led_min; i <= led_max; i++) { 799 for (uint8_t i = led_min; i <= led_max; i++) {
765 if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER 800 if (HAS_FLAGS(g_led_config.flags[i], 0x01)) { // 0x01 == LED_FLAG_MODIFIER
766 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 801 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
@@ -769,7 +804,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
769} 804}
770``` 805```
771 806
772If you want to indicate a Host LED status (caps lock, num lock, etc), you can use something like this to light up the caps lock key: 807If you want to indicate a Host LED status (caps lock, num lock, etc), you can use something like this to light up the caps lock key:
773 808
774```c 809```c
775void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { 810void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
diff --git a/docs/feature_stenography.md b/docs/feature_stenography.md
index 8d66034d4..a7c3f3d9e 100644
--- a/docs/feature_stenography.md
+++ b/docs/feature_stenography.md
@@ -32,7 +32,7 @@ GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything
32 32
33Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them. 33Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
34 34
35```makefile 35```make
36STENO_ENABLE = yes 36STENO_ENABLE = yes
37MOUSEKEY_ENABLE = no 37MOUSEKEY_ENABLE = no
38``` 38```
diff --git a/docs/feature_swap_hands.md b/docs/feature_swap_hands.md
index cbc574b6b..b0239bb80 100644
--- a/docs/feature_swap_hands.md
+++ b/docs/feature_swap_hands.md
@@ -6,7 +6,7 @@ The swap-hands action allows support for one-handed typing without requiring a s
6 6
7The configuration table is a simple 2-dimensional array to map from column/row to new column/row. Example `hand_swap_config` for Planck: 7The configuration table is a simple 2-dimensional array to map from column/row to new column/row. Example `hand_swap_config` for Planck:
8 8
9```C 9```c
10const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { 10const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
11 {{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}}, 11 {{11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
12 {{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}}, 12 {{11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md
index 8b001e3ce..8c617fe33 100644
--- a/docs/feature_userspace.md
+++ b/docs/feature_userspace.md
@@ -240,7 +240,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
240 240
241For boards that may not have a shift button (such as on a macro pad), we need a way to always include the bootloader option. To do that, add the following to the `rules.mk` in your userspace folder: 241For boards that may not have a shift button (such as on a macro pad), we need a way to always include the bootloader option. To do that, add the following to the `rules.mk` in your userspace folder:
242 242
243```make 243```make
244ifeq ($(strip $(FLASH_BOOTLOADER)), yes) 244ifeq ($(strip $(FLASH_BOOTLOADER)), yes)
245 OPT_DEFS += -DFLASH_BOOTLOADER 245 OPT_DEFS += -DFLASH_BOOTLOADER
246endif 246endif
@@ -252,4 +252,4 @@ Also, holding Shift will add the flash target (`:flash`) to the command. Holdin
252 252
253And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap. 253And for the boards that lack a shift key, or that you want to always attempt the flashing part, you can add `FLASH_BOOTLOADER = yes` to the `rules.mk` of that keymap.
254 254
255?> This should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely. And this doesn't support BootloadHID or mdloader. 255?> This should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely.
diff --git a/docs/flashing_bootloadhid.md b/docs/flashing_bootloadhid.md
index 9879ec999..213c7c132 100644
--- a/docs/flashing_bootloadhid.md
+++ b/docs/flashing_bootloadhid.md
@@ -44,7 +44,7 @@ For native Windows flashing, the `bootloadHID.exe` can be used outside of the MS
44 44
45### Linux Manual Installation 45### Linux Manual Installation
461. Install libusb development dependency: 461. Install libusb development dependency:
47 ```bash 47 ```
48 # This depends on OS - for Debian the following works 48 # This depends on OS - for Debian the following works
49 sudo apt-get install libusb-dev 49 sudo apt-get install libusb-dev
50 ``` 50 ```
diff --git a/docs/fr-fr/cli.md b/docs/fr-fr/cli.md
index bfa060f2a..917a9315b 100644
--- a/docs/fr-fr/cli.md
+++ b/docs/fr-fr/cli.md
@@ -48,25 +48,6 @@ Nous recherchons des gens pour créer et maintenir un paquet `qmk` pour plus de
48* Installez en utilisant un virtualenv 48* Installez en utilisant un virtualenv
49* Expliquez à l'utilisateur de définir la variable d'environnement `QMK_Home` pour "check out" les sources du firmware à un autre endroit que `~/qmk_firmware`. 49* Expliquez à l'utilisateur de définir la variable d'environnement `QMK_Home` pour "check out" les sources du firmware à un autre endroit que `~/qmk_firmware`.
50 50
51# CLI locale
52
53Si vous ne voulez pas utiliser la CLI globale, il y a une CLI locale empaquetée avec `qmk_firmware`. Vous pouvez le trouver dans `qmk_firmware/bin/qmk`. Vous pouvez lancer la commande `qmk` depuis n'importe quel répertoire et elle fonctionnera toujours sur cette copie de `qmk_firmware`.
54
55**Exemple**:
56
57```
58$ ~/qmk_firmware/bin/qmk hello
59Ψ Hello, World!
60```
61
62## Limitations de la CLI locale
63
64Il y a quelques limitations à la CLI locale comparé à la globale:
65
66* La CLI locale ne supporte pas `qmk setup` ou `qmk clone`
67* La CLI locale n'opère pas sur le même arbre `qmk_firmware`, même si vous avez plusieurs dépôts clonés.
68* La CLI locale ne s'exécute pas dans un virtualenv, donc il y a des risques que des dépendances seront en conflit
69
70# Les commandes CLI 51# Les commandes CLI
71 52
72## `qmk compile` 53## `qmk compile`
diff --git a/docs/fr-fr/getting_started_github.md b/docs/fr-fr/getting_started_github.md
index 0f3982ea2..522b09a03 100644
--- a/docs/fr-fr/getting_started_github.md
+++ b/docs/fr-fr/getting_started_github.md
@@ -32,7 +32,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
35Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
36``` 35```
37 36
38Vous avez maintenant votre fork QMK sur votre machine locale, vous pouvez ajouter votre keymap, la compiler et la flasher sur votre board. Une fois heureux avec vos changements, vous pouvez les ajouter, commit, et pousser vers votre fork comme suit: 37Vous avez maintenant votre fork QMK sur votre machine locale, vous pouvez ajouter votre keymap, la compiler et la flasher sur votre board. Une fois heureux avec vos changements, vous pouvez les ajouter, commit, et pousser vers votre fork comme suit:
diff --git a/docs/getting_started_docker.md b/docs/getting_started_docker.md
index f9c3b366a..c4da8af96 100644
--- a/docs/getting_started_docker.md
+++ b/docs/getting_started_docker.md
@@ -12,13 +12,13 @@ The main prerequisite is a working `docker` or `podman` install.
12 12
13Acquire a local copy of the QMK's repository (including submodules): 13Acquire a local copy of the QMK's repository (including submodules):
14 14
15```bash 15```
16git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git 16git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
17cd qmk_firmware 17cd qmk_firmware
18``` 18```
19 19
20Run the following command to build a keymap: 20Run the following command to build a keymap:
21```bash 21```
22util/docker_build.sh <keyboard>:<keymap> 22util/docker_build.sh <keyboard>:<keymap>
23# For example: util/docker_build.sh planck/rev6:default 23# For example: util/docker_build.sh planck/rev6:default
24``` 24```
@@ -27,14 +27,14 @@ This will compile the desired keyboard/keymap and leave the resulting `.hex` or
27 27
28There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well: 28There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well:
29 29
30```bash 30```
31util/docker_build.sh keyboard:keymap:target 31util/docker_build.sh keyboard:keymap:target
32# For example: util/docker_build.sh planck/rev6:default:flash 32# For example: util/docker_build.sh planck/rev6:default:flash
33``` 33```
34 34
35You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use: 35You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use:
36 36
37```bash 37```
38util/docker_build.sh 38util/docker_build.sh
39# Reads parameters as input (leave blank for all keyboards/keymaps) 39# Reads parameters as input (leave blank for all keyboards/keymaps)
40``` 40```
@@ -42,7 +42,7 @@ util/docker_build.sh
42You can manually set which container runtime you want to use by setting the `RUNTIME` environment variable to it's name or path. 42You can manually set which container runtime you want to use by setting the `RUNTIME` environment variable to it's name or path.
43By default docker or podman are automatically detected and docker is preferred over podman. 43By default docker or podman are automatically detected and docker is preferred over podman.
44 44
45```bash 45```
46RUNTIME="podman" util/docker_build.sh keyboard:keymap:target 46RUNTIME="podman" util/docker_build.sh keyboard:keymap:target
47``` 47```
48 48
diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md
index e3720b886..9232bc622 100644
--- a/docs/getting_started_github.md
+++ b/docs/getting_started_github.md
@@ -32,7 +32,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
35Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
36``` 35```
37 36
38You now have your QMK fork on your local machine, and you can add your keymap, compile it and flash it to your board. Once you're happy with your changes, you can add, commit, and push them to your fork like this: 37You now have your QMK fork on your local machine, and you can add your keymap, compile it and flash it to your board. Once you're happy with your changes, you can add, commit, and push them to your fork like this:
diff --git a/docs/getting_started_make_guide.md b/docs/getting_started_make_guide.md
index 70390a510..deef7520e 100644
--- a/docs/getting_started_make_guide.md
+++ b/docs/getting_started_make_guide.md
@@ -125,10 +125,6 @@ This allows you output audio on the C6 pin (needs abstracting). See the [audio p
125 125
126Use this to debug changes to variable values, see the [tracing variables](unit_testing.md#tracing-variables) section of the Unit Testing page for more information. 126Use this to debug changes to variable values, see the [tracing variables](unit_testing.md#tracing-variables) section of the Unit Testing page for more information.
127 127
128`API_SYSEX_ENABLE`
129
130This enables using the Quantum SYSEX API to send strings (somewhere?)
131
132`KEY_LOCK_ENABLE` 128`KEY_LOCK_ENABLE`
133 129
134This enables [key lock](feature_key_lock.md). 130This enables [key lock](feature_key_lock.md).
diff --git a/docs/getting_started_vagrant.md b/docs/getting_started_vagrant.md
index 114f87567..b5b5ce153 100644
--- a/docs/getting_started_vagrant.md
+++ b/docs/getting_started_vagrant.md
@@ -31,26 +31,26 @@ The development environment is configured to run the QMK Docker image, `qmkfm/qm
31### Why am I seeing issues under Virtualbox? 31### Why am I seeing issues under Virtualbox?
32Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:** 32Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**
33 33
34```console 34```
35vagrant plugin install vagrant-vbguest 35vagrant plugin install vagrant-vbguest
36``` 36```
37 37
38### How do I remove an existing environment? 38### How do I remove an existing environment?
39Finished with your environment? From anywhere inside the folder where you checked out this project, Execute: 39Finished with your environment? From anywhere inside the folder where you checked out this project, Execute:
40 40
41```console 41```
42vagrant destroy 42vagrant destroy
43``` 43```
44 44
45### What if I want to use Docker directly? 45### What if I want to use Docker directly?
46Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker: 46Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker:
47```console 47```
48vagrant up --provider=docker 48vagrant up --provider=docker
49``` 49```
50 50
51### How do I access the virtual machine instead of the Docker container? 51### How do I access the virtual machine instead of the Docker container?
52Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image: 52Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image:
53 53
54```console 54```
55vagrant ssh -c 'sudo -i' 55vagrant ssh -c 'sudo -i'
56``` 56```
diff --git a/docs/hardware_drivers.md b/docs/hardware_drivers.md
index 7e89c0d2b..a15750132 100644
--- a/docs/hardware_drivers.md
+++ b/docs/hardware_drivers.md
@@ -18,10 +18,6 @@ Support for addressing pins on the ProMicro by their Arduino name rather than th
18 18
19Support for SSD1306 based OLED displays. For more information see the [OLED Driver Feature](feature_oled_driver.md) page. 19Support for SSD1306 based OLED displays. For more information see the [OLED Driver Feature](feature_oled_driver.md) page.
20 20
21## uGFX
22
23You can make use of uGFX within QMK to drive character and graphic LCDs, LED arrays, OLED, TFT, and other display technologies. This needs to be better documented, if you are trying to do this and reading the code doesn't help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) and we can help you through the process.
24
25## WS2812 21## WS2812
26 22
27Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light](feature_rgblight.md) page. 23Support for WS2811/WS2812{a,b,c} LED's. For more information see the [RGB Light](feature_rgblight.md) page.
diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md
index 7630b44e0..be55356b1 100644
--- a/docs/hardware_keyboard_guidelines.md
+++ b/docs/hardware_keyboard_guidelines.md
@@ -144,10 +144,38 @@ The `rules.mk` file can also be placed in a sub-folder, and its reading order is
144 * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/rules.mk` 144 * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/rules.mk`
145 * `keyboards/top_folder/keymaps/a_keymap/rules.mk` 145 * `keyboards/top_folder/keymaps/a_keymap/rules.mk`
146 * `users/a_user_folder/rules.mk` 146 * `users/a_user_folder/rules.mk`
147 * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/post_rules.mk`
148 * `keyboards/top_folder/sub_1/sub_2/sub_3/post_rules.mk`
149 * `keyboards/top_folder/sub_1/sub_2/post_rules.mk`
150 * `keyboards/top_folder/sub_1/post_rules.mk`
151* `keyboards/top_folder/post_rules.mk`
147* `common_features.mk` 152* `common_features.mk`
148 153
149Many of the settings written in the `rules.mk` file are interpreted by `common_features.mk`, which sets the necessary source files and compiler options. 154Many of the settings written in the `rules.mk` file are interpreted by `common_features.mk`, which sets the necessary source files and compiler options.
150 155
156The `post_rules.mk` file can interpret `features` of a keyboard-level before `common_features.mk`. For example, when your designed keyboard has the option to implement backlighting or underglow using rgblight.c, writing the following in the `post_rules.mk` makes it easier for the user to configure the `rules.mk`.
157
158* `keyboards/top_folder/keymaps/a_keymap/rules.mk`
159 ```make
160 # Please set the following according to the selection of the hardware implementation option.
161 RGBLED_OPTION_TYPE = backlight ## none, backlight or underglow
162 ```
163* `keyboards/top_folder/post_rules.mk`
164 ```make
165 ifeq ($(filter $(strip $(RGBLED_OPTION_TYPE))x, nonex backlightx underglowx x),)
166 $(error unknown RGBLED_OPTION_TYPE value "$(RGBLED_OPTION_TYPE)")
167 endif
168
169 ifeq ($(strip $(RGBLED_OPTION_TYPE)),backlight)
170 RGBLIGHT_ENABLE = yes
171 OPT_DEFS += -DRGBLED_NUM=30
172 endif
173 ifeq ($(strip $(RGBLED_OPTION_TYPE)),underglow)
174 RGBLIGHT_ENABLE = yes
175 OPT_DEFS += -DRGBLED_NUM=6
176 endif
177 ```
178
151?> See `build_keyboard.mk` and `common_features.mk` for more details. 179?> See `build_keyboard.mk` and `common_features.mk` for more details.
152 180
153### `<keyboard_name.c>` 181### `<keyboard_name.c>`
@@ -227,8 +255,6 @@ The year should be the first year the file is created. If work was done to that
227 255
228The core of QMK is licensed under the [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). If you are shipping binaries for AVR processors you may choose either [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or [GPLv3](https://www.gnu.org/licenses/gpl.html). If you are shipping binaries for ARM processors you must choose [GPL Version 3](https://www.gnu.org/licenses/gpl.html) to comply with the [ChibiOS](https://www.chibios.org) GPLv3 license. 256The core of QMK is licensed under the [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html). If you are shipping binaries for AVR processors you may choose either [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or [GPLv3](https://www.gnu.org/licenses/gpl.html). If you are shipping binaries for ARM processors you must choose [GPL Version 3](https://www.gnu.org/licenses/gpl.html) to comply with the [ChibiOS](https://www.chibios.org) GPLv3 license.
229 257
230If your keyboard makes use of the [uGFX](https://ugfx.io) features within QMK you must comply with the [uGFX License](https://ugfx.io/license.html), which requires a separate commercial license before selling a device containing uGFX.
231
232## Technical Details 258## Technical Details
233 259
234If you're looking for more information on making your keyboard work with QMK, [check out the hardware section](hardware.md)! 260If you're looking for more information on making your keyboard work with QMK, [check out the hardware section](hardware.md)!
diff --git a/docs/he-il/getting_started_github.md b/docs/he-il/getting_started_github.md
index 900852eff..ca79e40f9 100644
--- a/docs/he-il/getting_started_github.md
+++ b/docs/he-il/getting_started_github.md
@@ -35,7 +35,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
35Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 35Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
36Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 36Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
37Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 37Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
38Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
39``` 38```
40 39
41</div> 40</div>
diff --git a/docs/how_keyboards_work.md b/docs/how_keyboards_work.md
index 3dcbc6452..36cbfb4d9 100644
--- a/docs/how_keyboards_work.md
+++ b/docs/how_keyboards_work.md
@@ -9,7 +9,7 @@ firmware directly.
9Whenever you type on 1 particular key, here is the chain of actions taking 9Whenever you type on 1 particular key, here is the chain of actions taking
10place: 10place:
11 11
12``` text 12```
13+------+ +-----+ +----------+ +----------+ +----+ 13+------+ +-----+ +----------+ +----------+ +----+
14| User |-------->| Key |------>| Firmware |----->| USB wire |---->| OS | 14| User |-------->| Key |------>| Firmware |----->| USB wire |---->| OS |
15+------+ +-----+ +----------+ +----------+ +----+ 15+------+ +-----+ +----------+ +----------+ +----+
diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md
index 3ec34a0f8..95c588af4 100644
--- a/docs/i2c_driver.md
+++ b/docs/i2c_driver.md
@@ -62,16 +62,13 @@ Then, modify your board's `mcuconf.h` to enable the peripheral you've chosen, fo
62 62
63Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303. 63Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
64 64
65|`config.h` Overrride |Description |Default| 65|`config.h` Overrride |Description |Default|
66|------------------------|-------------------------------------------------------------------------------------------|-------| 66|------------------------|--------------------------------------------------------------|-------|
67|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`| 67|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`|
68|`I2C1_BANK` (deprecated)|The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`), superseded by `I2C1_SCL_BANK`/`I2C1_SDA_BANK`|`GPIOB`| 68|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` |
69|`I2C1_SCL_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SCL |`GPIOB`| 69|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` |
70|`I2C1_SCL` |The pin number for SCL (0-15) |`6` | 70|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` |
71|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` | 71|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
72|`I2C1_SDA_BANK` |The bank of pins (`GPIOA`, `GPIOB`, `GPIOC`) to use for SDA |`GPIOB`|
73|`I2C1_SDA` |The pin number for SDA (0-15) |`7` |
74|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
75 72
76The following configuration values depend on the specific MCU in use. 73The following configuration values depend on the specific MCU in use.
77 74
@@ -190,7 +187,7 @@ Receive multiple bytes from the selected SPI device.
190 187
191### `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` 188### `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
192 189
193Writes to a register on the I2C device. 190Writes to a register with an 8-bit address on the I2C device.
194 191
195#### Arguments 192#### Arguments
196 193
@@ -211,9 +208,32 @@ Writes to a register on the I2C device.
211 208
212--- 209---
213 210
211### `i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
212
213Writes to a register with a 16-bit address (big endian) on the I2C device.
214
215#### Arguments
216
217 - `uint8_t devaddr`
218 The 7-bit I2C address of the device.
219 - `uint16_t regaddr`
220 The register address to write to.
221 - `uint8_t *data`
222 A pointer to the data to transmit.
223 - `uint16_t length`
224 The number of bytes to write. Take care not to overrun the length of `data`.
225 - `uint16_t timeout`
226 The time in milliseconds to wait for a response from the target device.
227
228#### Return Value
229
230`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
231
232---
233
214### `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` 234### `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
215 235
216Reads from a register on the I2C device. 236Reads from a register with an 8-bit address on the I2C device.
217 237
218#### Arguments 238#### Arguments
219 239
@@ -232,6 +252,27 @@ Reads from a register on the I2C device.
232 252
233--- 253---
234 254
255### `i2c_status_t i2c_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
256
257Reads from a register with a 16-bit address (big endian) on the I2C device.
258
259#### Arguments
260
261 - `uint8_t devaddr`
262 The 7-bit I2C address of the device.
263 - `uint16_t regaddr`
264 The register address to read from.
265 - `uint16_t length`
266 The number of bytes to read. Take care not to overrun the length of `data`.
267 - `uint16_t timeout`
268 The time in milliseconds to wait for a response from the target device.
269
270#### Return Value
271
272`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
273
274---
275
235### `i2c_status_t i2c_stop(void)` 276### `i2c_status_t i2c_stop(void)`
236 277
237Stop the current I2C transaction. 278Stop the current I2C transaction.
diff --git a/docs/ja/compatible_microcontrollers.md b/docs/ja/compatible_microcontrollers.md
index 7a3484fa8..23f32bbb6 100644
--- a/docs/ja/compatible_microcontrollers.md
+++ b/docs/ja/compatible_microcontrollers.md
@@ -32,6 +32,7 @@ QMK は十分な容量のフラッシュメモリを備えた USB 対応 AVR ま
32* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html) 32* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
33* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html) 33* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
34* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html) 34* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
35* [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
35* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html) 36* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
36* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html) 37* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
37* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html) 38* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
diff --git a/docs/ja/feature_haptic_feedback.md b/docs/ja/feature_haptic_feedback.md
index 158079725..687788014 100644
--- a/docs/ja/feature_haptic_feedback.md
+++ b/docs/ja/feature_haptic_feedback.md
@@ -9,9 +9,12 @@
9 9
10現在のところ、`rules.mk` で触覚フィードバック用に以下のオプションを利用可能です: 10現在のところ、`rules.mk` で触覚フィードバック用に以下のオプションを利用可能です:
11 11
12`HAPTIC_ENABLE += DRV2605L` 12```
13HAPTIC_ENABLE = yes
13 14
14`HAPTIC_ENABLE += SOLENOID` 15HAPTIC_DRIVER += DRV2605L
16HAPTIC_DRIVER += SOLENOID
17```
15 18
16## サポートされる既知のハードウェア 19## サポートされる既知のハードウェア
17 20
diff --git a/docs/ja/feature_ps2_mouse.md b/docs/ja/feature_ps2_mouse.md
index 3d6941130..569934c18 100644
--- a/docs/ja/feature_ps2_mouse.md
+++ b/docs/ja/feature_ps2_mouse.md
@@ -43,14 +43,8 @@ PS2_USE_BUSYWAIT = yes
43 43
44```c 44```c
45#ifdef PS2_USE_BUSYWAIT 45#ifdef PS2_USE_BUSYWAIT
46# define PS2_CLOCK_PORT PORTD 46# define PS2_CLOCK_PIN D1
47# define PS2_CLOCK_PIN PIND 47# define PS2_DATA_PIN D2
48# define PS2_CLOCK_DDR DDRD
49# define PS2_CLOCK_BIT 1
50# define PS2_DATA_PORT PORTD
51# define PS2_DATA_PIN PIND
52# define PS2_DATA_DDR DDRD
53# define PS2_DATA_BIT 2
54#endif 48#endif
55``` 49```
56 50
@@ -69,14 +63,8 @@ PS2_USE_INT = yes
69 63
70```c 64```c
71#ifdef PS2_USE_INT 65#ifdef PS2_USE_INT
72#define PS2_CLOCK_PORT PORTD 66#define PS2_CLOCK_PIN D2
73#define PS2_CLOCK_PIN PIND 67#define PS2_DATA_PIN D5
74#define PS2_CLOCK_DDR DDRD
75#define PS2_CLOCK_BIT 2
76#define PS2_DATA_PORT PORTD
77#define PS2_DATA_PIN PIND
78#define PS2_DATA_DDR DDRD
79#define PS2_DATA_BIT 5
80 68
81#define PS2_INT_INIT() do { \ 69#define PS2_INT_INIT() do { \
82 EICRA |= ((1<<ISC21) | \ 70 EICRA |= ((1<<ISC21) | \
@@ -107,14 +95,9 @@ PS2_USE_USART = yes
107 95
108```c 96```c
109#ifdef PS2_USE_USART 97#ifdef PS2_USE_USART
110#define PS2_CLOCK_PORT PORTD 98#ifdef PS2_USE_USART
111#define PS2_CLOCK_PIN PIND 99#define PS2_CLOCK_PIN D5
112#define PS2_CLOCK_DDR DDRD 100#define PS2_DATA_PIN D2
113#define PS2_CLOCK_BIT 5
114#define PS2_DATA_PORT PORTD
115#define PS2_DATA_PIN PIND
116#define PS2_DATA_DDR DDRD
117#define PS2_DATA_BIT 2
118 101
119/* 同期、奇数パリティ、1-bit ストップ、8-bit データ、立ち下がりエッジでサンプル */ 102/* 同期、奇数パリティ、1-bit ストップ、8-bit データ、立ち下がりエッジでサンプル */
120/* CLOCK の DDR を入力としてスレーブに設定 */ 103/* CLOCK の DDR を入力としてスレーブに設定 */
diff --git a/docs/ja/getting_started_github.md b/docs/ja/getting_started_github.md
index 6d9b70c41..640701148 100644
--- a/docs/ja/getting_started_github.md
+++ b/docs/ja/getting_started_github.md
@@ -37,7 +37,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
37Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 37Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
38Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 38Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
39Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 39Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
40Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
41``` 40```
42 41
43ローカルマシンに QMK のフォークができるので、キーマップの追加、コンパイル、キーボードへの書き込みができます。変更に満足したら、以下のようにそれらをフォークへ追加、コミットおよびプッシュすることができます: 42ローカルマシンに QMK のフォークができるので、キーマップの追加、コンパイル、キーボードへの書き込みができます。変更に満足したら、以下のようにそれらをフォークへ追加、コミットおよびプッシュすることができます:
diff --git a/docs/ja/hardware_drivers.md b/docs/ja/hardware_drivers.md
index f77b48ba8..e0061cb32 100644
--- a/docs/ja/hardware_drivers.md
+++ b/docs/ja/hardware_drivers.md
@@ -24,10 +24,6 @@ ProMicro のピンを AVR の名前ではなく、Arduino の名前で指定で
24 24
25SSD1306 ベースの OLED ディスプレイのサポート。詳しくは[OLED ドライバ](ja/feature_oled_driver.md)を参照して下さい。 25SSD1306 ベースの OLED ディスプレイのサポート。詳しくは[OLED ドライバ](ja/feature_oled_driver.md)を参照して下さい。
26 26
27## uGFX
28
29QMK 内で uGFX を使用して、キャラクタ LCD やグラフィック LCD、LED アレイ、OLED ディスプレイ、TFT 液晶や他のディスプレイを制御できます。この部分はより詳しく文書化される必要があります。もしこれを使用したい場合にコードを読んでも分からない場合、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new)を通して助けることができるかもしれません。
30
31## WS2812 27## WS2812
32 28
33WS2811/WS2812{a,b,c} LED のサポート。 詳しくは [RGB ライト](ja/feature_rgblight.md)を参照して下さい。 29WS2811/WS2812{a,b,c} LED のサポート。 詳しくは [RGB ライト](ja/feature_rgblight.md)を参照して下さい。
diff --git a/docs/ja/hardware_keyboard_guidelines.md b/docs/ja/hardware_keyboard_guidelines.md
index 8a9127abc..c0e7c18be 100644
--- a/docs/ja/hardware_keyboard_guidelines.md
+++ b/docs/ja/hardware_keyboard_guidelines.md
@@ -234,8 +234,6 @@ QMK が提供する機能の量を考えれば、新しいユーザーが混乱
234 234
235QMK のコア部分は [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html) でライセンスされます。AVR マイコン用のバイナリを提供する場合は、[GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) か、[GPLv3](https://www.gnu.org/licenses/gpl.html) のどちらかから選択出来ます。ARM マイコン用のバイナリを提供する場合は、 [ChibiOS](https://www.chibios.org) の GPLv3 ライセンスに準拠するため、[GPL Version 3](https://www.gnu.org/licenses/gpl.html) を選択しなければいけません。 235QMK のコア部分は [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html) でライセンスされます。AVR マイコン用のバイナリを提供する場合は、[GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) か、[GPLv3](https://www.gnu.org/licenses/gpl.html) のどちらかから選択出来ます。ARM マイコン用のバイナリを提供する場合は、 [ChibiOS](https://www.chibios.org) の GPLv3 ライセンスに準拠するため、[GPL Version 3](https://www.gnu.org/licenses/gpl.html) を選択しなければいけません。
236 236
237[uGFX](https://ugfx.io) を使用している場合は、[uGFX License](https://ugfx.io/license.html) に準拠する必要があります。uGFX を利用したデバイスを販売するには個別に商用ライセンスを取得しなければいけません。
238
239## 技術的な詳細 237## 技術的な詳細
240 238
241キーボードを QMK で動作させるための詳細は[ハードウェア](ja/hardware.md)を参照して下さい! 239キーボードを QMK で動作させるための詳細は[ハードウェア](ja/hardware.md)を参照して下さい!
diff --git a/docs/ja/i2c_driver.md b/docs/ja/i2c_driver.md
index 9d348d580..1d8f70e16 100644
--- a/docs/ja/i2c_driver.md
+++ b/docs/ja/i2c_driver.md
@@ -79,13 +79,10 @@ ARM MCU 用の設定はしばしば非常に複雑です。これは、多くの
79 79
80STM32 MCU では、使用するハードウェアドライバにより、さまざまなピンを I2C ピンとして設定できます。標準では `B6`, `B7` ピンが I2C 用のピンです。 I2C 用のピンを設定するために次の定義が使えます: 80STM32 MCU では、使用するハードウェアドライバにより、さまざまなピンを I2C ピンとして設定できます。標準では `B6`, `B7` ピンが I2C 用のピンです。 I2C 用のピンを設定するために次の定義が使えます:
81 81
82| 変数 | 説明 | 既定値 | 82| 変数 | 説明 | 既定値 |
83|-----------------------|--------------------------------------------------------------------------------------------------|---------| 83|-----------------------|-------------------------------------------------------------------------------------------|---------|
84| `I2C1_SCL_BANK` | SCL に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` | 84| `I2C1_SCL_PIN` | SCL のピン番号 | `B6` |
85| `I2C1_SDA_BANK` | SDA に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` | 85| `I2C1_SDA_PIN` | SDA のピン番号 | `B7` |
86| `I2C1_SCL` | SCL のピン番号 (0-15) | `6` |
87| `I2C1_SDA` | SDA のピン番号 (0-15) | `7` |
88| `I2C1_BANK`(非推奨) | 使用するピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`)。後継は `I2C1_SCL_BANK`, `I2C1_SDA_BANK` です。 | `GPIOB` |
89 86
90ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します。 87ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します。
91 88
diff --git a/docs/ja/understanding_qmk.md b/docs/ja/understanding_qmk.md
index 109876961..1654f8e00 100644
--- a/docs/ja/understanding_qmk.md
+++ b/docs/ja/understanding_qmk.md
@@ -184,10 +184,6 @@ FIXME: This needs to be written
184 184
185FIXME: This needs to be written 185FIXME: This needs to be written
186 186
187#### Visualizer
188
189FIXME: This needs to be written
190
191#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock) 187#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock)
192 188
193FIXME: This needs to be written 189FIXME: This needs to be written
diff --git a/docs/keycodes.md b/docs/keycodes.md
index 9f61447dc..8aba3a512 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -678,6 +678,46 @@ See also: [One Shot Keys](one_shot_keys.md)
678|`OS_OFF` |Turns One Shot keys off | 678|`OS_OFF` |Turns One Shot keys off |
679|`OS_TOGG` |Toggles One Shot keys status | 679|`OS_TOGG` |Toggles One Shot keys status |
680 680
681## Programmable Button Support :id=programmable-button
682
683See also: [Programmable Button](feature_programmable_button.md)
684
685|Key |Description |
686|------------------------|----------------------|
687|`PROGRAMMABLE_BUTTON_1` |Programmable button 1 |
688|`PROGRAMMABLE_BUTTON_2` |Programmable button 2 |
689|`PROGRAMMABLE_BUTTON_3` |Programmable button 3 |
690|`PROGRAMMABLE_BUTTON_4` |Programmable button 4 |
691|`PROGRAMMABLE_BUTTON_5` |Programmable button 5 |
692|`PROGRAMMABLE_BUTTON_6` |Programmable button 6 |
693|`PROGRAMMABLE_BUTTON_7` |Programmable button 7 |
694|`PROGRAMMABLE_BUTTON_8` |Programmable button 8 |
695|`PROGRAMMABLE_BUTTON_9` |Programmable button 9 |
696|`PROGRAMMABLE_BUTTON_10`|Programmable button 10|
697|`PROGRAMMABLE_BUTTON_11`|Programmable button 11|
698|`PROGRAMMABLE_BUTTON_12`|Programmable button 12|
699|`PROGRAMMABLE_BUTTON_13`|Programmable button 13|
700|`PROGRAMMABLE_BUTTON_14`|Programmable button 14|
701|`PROGRAMMABLE_BUTTON_15`|Programmable button 15|
702|`PROGRAMMABLE_BUTTON_16`|Programmable button 16|
703|`PROGRAMMABLE_BUTTON_17`|Programmable button 17|
704|`PROGRAMMABLE_BUTTON_18`|Programmable button 18|
705|`PROGRAMMABLE_BUTTON_19`|Programmable button 19|
706|`PROGRAMMABLE_BUTTON_20`|Programmable button 20|
707|`PROGRAMMABLE_BUTTON_21`|Programmable button 21|
708|`PROGRAMMABLE_BUTTON_22`|Programmable button 22|
709|`PROGRAMMABLE_BUTTON_23`|Programmable button 23|
710|`PROGRAMMABLE_BUTTON_24`|Programmable button 24|
711|`PROGRAMMABLE_BUTTON_25`|Programmable button 25|
712|`PROGRAMMABLE_BUTTON_26`|Programmable button 26|
713|`PROGRAMMABLE_BUTTON_27`|Programmable button 27|
714|`PROGRAMMABLE_BUTTON_28`|Programmable button 28|
715|`PROGRAMMABLE_BUTTON_29`|Programmable button 29|
716|`PROGRAMMABLE_BUTTON_30`|Programmable button 30|
717|`PROGRAMMABLE_BUTTON_31`|Programmable button 31|
718|`PROGRAMMABLE_BUTTON_32`|Programmable button 32|
719|`PB_1` to `PB_32` |Aliases for keymaps |
720
681## Space Cadet :id=space-cadet 721## Space Cadet :id=space-cadet
682 722
683See also: [Space Cadet](feature_space_cadet.md) 723See also: [Space Cadet](feature_space_cadet.md)
diff --git a/docs/newbs_git_resynchronize_a_branch.md b/docs/newbs_git_resynchronize_a_branch.md
index 3e7acdba7..1d0e4dda1 100644
--- a/docs/newbs_git_resynchronize_a_branch.md
+++ b/docs/newbs_git_resynchronize_a_branch.md
@@ -8,7 +8,7 @@ Suppose you have committed to your `master` branch, and now need to update your
8 8
9No one wants to lose work if it can be helped. If you want to save the changes you've already made to your `master` branch, the simplest way to do so is to simply create a duplicate of your "dirty" `master` branch: 9No one wants to lose work if it can be helped. If you want to save the changes you've already made to your `master` branch, the simplest way to do so is to simply create a duplicate of your "dirty" `master` branch:
10 10
11```sh 11```
12git branch old_master master 12git branch old_master master
13``` 13```
14 14
@@ -18,7 +18,7 @@ Now you have a branch named `old_master` that is a duplicate of your `master` br
18 18
19Now it's time to resynchronize your `master` branch. For this step, you'll want to have QMK's repository configured as a remote in Git. To check your configured remotes, run `git remote -v`, which should return something similar to: 19Now it's time to resynchronize your `master` branch. For this step, you'll want to have QMK's repository configured as a remote in Git. To check your configured remotes, run `git remote -v`, which should return something similar to:
20 20
21```sh 21```
22QMKuser ~/qmk_firmware (master) 22QMKuser ~/qmk_firmware (master)
23$ git remote -v 23$ git remote -v
24origin https://github.com/<your_username>/qmk_firmware.git (fetch) 24origin https://github.com/<your_username>/qmk_firmware.git (fetch)
@@ -29,7 +29,7 @@ upstream https://github.com/qmk/qmk_firmware.git (push)
29 29
30If you only see one fork referenced: 30If you only see one fork referenced:
31 31
32```sh 32```
33QMKuser ~/qmk_firmware (master) 33QMKuser ~/qmk_firmware (master)
34$ git remote -v 34$ git remote -v
35origin https://github.com/qmk/qmk_firmware.git (fetch) 35origin https://github.com/qmk/qmk_firmware.git (fetch)
@@ -38,31 +38,31 @@ origin https://github.com/qmk/qmk_firmware.git (push)
38 38
39add a new remote with: 39add a new remote with:
40 40
41```sh 41```
42git remote add upstream https://github.com/qmk/qmk_firmware.git 42git remote add upstream https://github.com/qmk/qmk_firmware.git
43``` 43```
44 44
45Then, redirect the `origin` remote to your own fork with: 45Then, redirect the `origin` remote to your own fork with:
46 46
47```sh 47```
48git remote set-url origin https://github.com/<your_username>/qmk_firmware.git 48git remote set-url origin https://github.com/<your_username>/qmk_firmware.git
49``` 49```
50 50
51Now that you have both remotes configured, you need to update the references for the upstream repository, which is QMK's, by running: 51Now that you have both remotes configured, you need to update the references for the upstream repository, which is QMK's, by running:
52 52
53```sh 53```
54git fetch upstream 54git fetch upstream
55``` 55```
56 56
57At this point, resynchronize your branch to QMK's by running: 57At this point, resynchronize your branch to QMK's by running:
58 58
59```sh 59```
60git reset --hard upstream/master 60git reset --hard upstream/master
61``` 61```
62 62
63These steps will update the repository on your computer, but your GitHub fork will still be out of sync. To resynchronize your fork on GitHub, you need to push to your fork, instructing Git to override any remote changes that are not reflected in your local repository. To do this, run: 63These steps will update the repository on your computer, but your GitHub fork will still be out of sync. To resynchronize your fork on GitHub, you need to push to your fork, instructing Git to override any remote changes that are not reflected in your local repository. To do this, run:
64 64
65```sh 65```
66git push --force-with-lease 66git push --force-with-lease
67``` 67```
68 68
diff --git a/docs/ru-ru/getting_started_github.md b/docs/ru-ru/getting_started_github.md
index 120f3c24e..7a70926f5 100644
--- a/docs/ru-ru/getting_started_github.md
+++ b/docs/ru-ru/getting_started_github.md
@@ -31,7 +31,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
31Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 31Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
32Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 32Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
33Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 33Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
34Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
35``` 34```
36 35
37Теперь у вас есть форк QMK на вашем локальном компьютере, и вы можете добавить свою раскладку, скомпилировать ее и прошить ей свою клавиатуру. Как только вы будете довольны своими изменениями, есть возможность добавить, зафиксировать их и сделать коммит в свой форк следующим образом: 36Теперь у вас есть форк QMK на вашем локальном компьютере, и вы можете добавить свою раскладку, скомпилировать ее и прошить ей свою клавиатуру. Как только вы будете довольны своими изменениями, есть возможность добавить, зафиксировать их и сделать коммит в свой форк следующим образом:
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index da622044c..42a41fbe2 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -29,7 +29,6 @@ Within `keyboard_task()` you'll find code to handle:
29* [Matrix Scanning](#matrix-scanning) 29* [Matrix Scanning](#matrix-scanning)
30* Mouse Handling 30* Mouse Handling
31* Serial Link(s) 31* Serial Link(s)
32* Visualizer
33* Keyboard status LEDs (Caps Lock, Num Lock, Scroll Lock) 32* Keyboard status LEDs (Caps Lock, Num Lock, Scroll Lock)
34 33
35#### Matrix Scanning 34#### Matrix Scanning
@@ -180,10 +179,6 @@ FIXME: This needs to be written
180 179
181FIXME: This needs to be written 180FIXME: This needs to be written
182 181
183#### Visualizer
184
185FIXME: This needs to be written
186
187#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock) 182#### Keyboard state LEDs (Caps Lock, Num Lock, Scroll Lock)
188 183
189FIXME: This needs to be written 184FIXME: This needs to be written
diff --git a/docs/unit_testing.md b/docs/unit_testing.md
index a0eef51cb..47a105579 100644
--- a/docs/unit_testing.md
+++ b/docs/unit_testing.md
@@ -20,12 +20,12 @@ One thing to remember, is that you have to append `extern "C"` around all of you
20 20
21## Adding Tests for New or Existing Features 21## Adding Tests for New or Existing Features
22 22
23If you want to unit test some feature, then take a look at the existing serial_link tests, in the `quantum/serial_link/tests folder`, and follow the steps below to create a similar structure. 23If you want to unit test a feature, take a look at some of the existing tests, for example those in the `quantum/sequencer/tests` folder. Then follow the steps below to create a similar structure.
24 24
251. If it doesn't already exist, add a test subfolder to the folder containing the feature. 251. If it doesn't already exist, add a test subfolder to the folder containing the feature.
262. Create a `testlist.mk` and a `rules.mk` file in that folder. 262. Create a `testlist.mk` and a `rules.mk` file in that folder.
273. Include those files from the root folder `testlist.mk`and `build_test.mk` respectively. 273. Include those files from the root folder `testlist.mk`and `build_test.mk` respectively.
284. Add a new name for your testgroup to the `testlist.mk` file. Each group defined there will be a separate executable. And that's how you can support mocking out different parts. Note that it's worth adding some common prefix, just like it's done for the serial_link tests. The reason for that is that the make command allows substring filtering, so this way you can easily run a subset of the tests. 284. Add a new name for your testgroup to the `testlist.mk` file. Each group defined there will be a separate executable. And that's how you can support mocking out different parts. Note that it's worth adding some common prefix, just like it's done for the existing tests. The reason for that is that the make command allows substring filtering, so this way you can easily run a subset of the tests.
295. Define the source files and required options in the `rules.mk` file. 295. Define the source files and required options in the `rules.mk` file.
30 * `_SRC` for source files 30 * `_SRC` for source files
31 * `_DEFS` for additional defines 31 * `_DEFS` for additional defines
@@ -44,7 +44,7 @@ If there are problems with the tests, you can find the executable in the `./buil
44 44
45To forward any [debug messages](unit_testing.md#debug-api) to `stderr`, the tests can run with `DEBUG=1`. For example 45To forward any [debug messages](unit_testing.md#debug-api) to `stderr`, the tests can run with `DEBUG=1`. For example
46 46
47```console 47```
48make test:all DEBUG=1 48make test:all DEBUG=1
49``` 49```
50 50
diff --git a/docs/zh-cn/getting_started_github.md b/docs/zh-cn/getting_started_github.md
index 65994754b..b4e8e9fa5 100644
--- a/docs/zh-cn/getting_started_github.md
+++ b/docs/zh-cn/getting_started_github.md
@@ -32,7 +32,6 @@ Submodule path 'lib/chibios': checked out '587968d6cbc2b0e1c7147540872f2a67e59ca
32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486' 32Submodule path 'lib/chibios-contrib': checked out 'ede48346eee4b8d6847c19bc01420bee76a5e486'
33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780' 33Submodule path 'lib/googletest': checked out 'ec44c6c1675c25b9827aacd08c02433cccde7780'
34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d' 34Submodule path 'lib/lufa': checked out 'ce10f7642b0459e409839b23cc91498945119b4d'
35Submodule path 'lib/ugfx': checked out '3e97b74e03c93631cdd3ddb2ce43b963fdce19b2'
36``` 35```
37 36
38现在你本地计算机有QMK的分叉了,你可以添加你的布局了, 为你的键盘编译并刷新固件吧。如果你觉得你的修改很不错, 你可以添加,提交,然后想你的分叉推出(pull)你的改变,像这样: 37现在你本地计算机有QMK的分叉了,你可以添加你的布局了, 为你的键盘编译并刷新固件吧。如果你觉得你的修改很不错, 你可以添加,提交,然后想你的分叉推出(pull)你的改变,像这样: