Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f91cd00de8 |
||
|
|
d05b2cd886 |
||
|
|
a58d2dd7c9 |
||
|
|
ed343ddad4 |
||
|
|
e7ad19bb95 |
||
|
|
024c4ef853 |
||
|
|
00eebfb575 |
||
|
|
22b213e191 |
||
|
|
8522449ccf |
||
|
|
cbeab2ac4f |
||
|
|
aa5a6d38de |
||
|
|
a1096e1dec |
||
|
|
a9739f7868 |
||
|
|
a5fb7cfbc9 |
||
|
|
62d87fa446 |
||
|
|
8e5550dbb2 |
||
|
|
f4123acc72 |
||
|
|
98e65cf3e1 |
||
|
|
7d0fc5d486 |
||
|
|
1c1e8d7f7a |
||
|
|
d0db38cbdc |
||
|
|
1a32aa12e0 |
||
|
|
969f324de4 |
||
|
|
608bcf08fe |
||
|
|
97d622651a |
||
|
|
a8711b2b0a |
||
|
|
338a7ed6d5 |
||
|
|
911232abfc |
||
|
|
4eee8c1023 |
||
|
|
7e8690eae1 |
||
|
|
b9078609b6 |
||
|
|
fd61083710 |
||
|
|
082b69db91 |
||
|
|
92ead44cf6 |
||
|
|
61ecee1585 |
||
|
|
85fa06c3db |
||
|
|
eae39d37c6 |
||
|
|
7aed244aae |
||
|
|
880c0c8ee0 |
||
|
|
f31004ebec |
||
|
|
8f728aa731 |
||
|
|
45a5a94b96 |
||
|
|
bef5c95675 |
||
|
|
e5f47fa269 |
||
|
|
05ea735e86 |
||
|
|
35e62d236b |
||
|
|
fc55fcff3d |
||
|
|
b4bdf3f1d5 |
||
|
|
c4ccbf06e1 |
||
|
|
24c05ff1c7 |
||
|
|
65e1afe0af |
||
|
|
09ab67c044 |
||
|
|
7be4540b46 |
||
|
|
f6f627d07f |
||
|
|
4fc14c2712 |
||
|
|
ec515f2164 |
||
|
|
1e067bd4dd |
||
|
|
fa37d958b4 |
||
|
|
20e7906c80 |
||
|
|
e42877d007 |
||
|
|
0188038bc0 |
||
|
|
2a4b9f79fd |
||
|
|
b43ec9d65a |
||
|
|
df8bb7ce24 |
||
|
|
7110708d0f |
||
|
|
b834819a35 |
||
|
|
cc696a2ae8 |
||
|
|
f29d8117bf |
||
|
|
d2ec940da5 |
||
|
|
da2c6a41d8 |
||
|
|
a3ecbc53f6 |
||
|
|
2695344241 |
||
|
|
00ca362826 |
||
|
|
9dcf2a11b2 |
||
|
|
12dc6d1ac8 |
||
|
|
6c2e58eb4d | ||
|
|
1a58fce043 |
||
|
|
96ee4c21a3 | ||
|
|
ae07dee941 |
||
|
|
efce9bc9b5 | ||
|
|
d575bf7ddc |
||
|
|
7a939ec218 |
||
|
|
542440eac5 |
||
|
|
717b6b8f13 | ||
|
|
36c3f4deba |
||
|
|
a954b568ea | ||
|
|
74d64c7f43 |
||
|
|
65cce9105d |
||
|
|
43853b337b |
||
|
|
8474aee2fe | ||
|
|
7098252252 |
||
|
|
16ffaa6482 |
||
|
|
865c29f4de |
||
|
|
507c948ed8 |
||
|
|
f0b04b2a3a |
||
|
|
20555f9a33 |
||
|
|
56ad3a5f43 |
||
|
|
5ef94415aa |
||
|
|
d67e94fb1b |
||
|
|
f797d4f49d |
||
|
|
ad4233d078 |
||
|
|
2c34b480fc | ||
|
|
86badb394e |
||
|
|
e295937e54 | ||
|
|
c7a24a441f |
||
|
|
a08ee4a737 | ||
|
|
9e757bc2ec |
||
|
|
5ef7919022 |
||
|
|
6b38dc17cd |
||
|
|
71b88b333d |
||
|
|
108a2fceca | ||
|
|
c3773d9c35 |
||
|
|
e1b42d5252 |
||
|
|
558fee16e4 | ||
|
|
87e5df1b9e |
||
|
|
4b295009ae |
||
|
|
3d61139567 |
||
|
|
15e7c8f37a |
||
|
|
8d29bd07c2 |
||
|
|
75b899d87d | ||
|
|
c3b3f09702 |
||
|
|
56650d7a2b | ||
|
|
8a47896263 |
||
|
|
0f182ef674 | ||
|
|
f1b2449ce5 |
||
|
|
a26dbbfe96 |
||
|
|
bf28a303c6 |
||
|
|
e814bb9453 | ||
|
|
2916c3f098 |
||
|
|
8644965c81 | ||
|
|
0524a6d848 |
||
|
|
e19991ec46 |
||
|
|
e4e5bca6bc | ||
|
|
8ff7b1de11 |
||
|
|
7827f9fbe3 |
||
|
|
d9f2d8d241 |
||
|
|
058919923a |
||
|
|
d151b1bef5 |
||
|
|
baf0060761 |
||
|
|
036745e853 |
||
|
|
b99e2f7230 | ||
|
|
9c965bb62e |
||
|
|
e68389a11e | ||
|
|
ba63bac661 |
||
|
|
0842f54a27 |
||
|
|
584ad807cc |
||
|
|
e92f1fb220 |
||
|
|
67c97da654 | ||
|
|
90b5c17034 |
||
|
|
0b33318a24 |
||
|
|
a9a2b699cd | ||
|
|
da7811f82a |
||
|
|
49a4ec538d | ||
|
|
9e103614f8 |
||
|
|
711b109246 |
||
|
|
6347d18a2d |
||
|
|
d7b09ad560 |
||
|
|
52e2af7753 | ||
|
|
177e461d90 |
||
|
|
fef7932e55 | ||
|
|
b42191a2dd |
||
|
|
48a421bb10 |
||
|
|
f09f3643ad | ||
|
|
36636205dd |
||
|
|
5b0039aae6 |
||
|
|
18f5a04eaa | ||
|
|
89e39b9858 |
||
|
|
3db5ffcfb7 | ||
|
|
4ae2b4f371 |
||
|
|
0dee127b29 | ||
|
|
6e55870a82 |
||
|
|
21ca1eb7ae |
||
|
|
a1a5869ef8 |
||
|
|
bc5c5e3251 |
||
|
|
f39e08e2ba | ||
|
|
e15d9ca4b3 |
||
|
|
eeac23464b | ||
|
|
5354ec5791 |
||
|
|
35785a6c49 | ||
|
|
235d18f360 |
||
|
|
ea5ef746e2 | ||
|
|
de5fd5d4e2 |
||
|
|
8c8f4b3c06 | ||
|
|
f5b02fbc11 |
||
|
|
55e1acec07 | ||
|
|
611460c9db |
||
|
|
584e390703 | ||
|
|
1ac255fd1c |
||
|
|
2c152c3425 | ||
|
|
664c0bc4c3 |
||
|
|
8a06238054 | ||
|
|
6626084cb8 |
||
|
|
bb27c69675 |
||
|
|
25d7ac9ecc | ||
|
|
03a53e29af |
||
|
|
681d6a29e6 | ||
|
|
096696d86d |
||
|
|
d044a6bcc2 |
||
|
|
091eac1fce |
||
|
|
02bed7e5a5 | ||
|
|
7f9ceef3dd |
||
|
|
7919848324 |
||
|
|
a4436b32df | ||
|
|
7ecdb57414 |
||
|
|
0f9c1c57b4 | ||
|
|
dcdd037276 |
||
|
|
e725cdbc4b | ||
|
|
8ae01715d6 |
||
|
|
9ef5dcd113 | ||
|
|
f4aa8ae845 |
||
|
|
ef6e9a5312 | ||
|
|
0516cf5ed8 |
||
|
|
5bdeb7dad1 |
||
|
|
8347a6688f |
||
|
|
3ce196ff52 | ||
|
|
802a199bbd |
||
|
|
0326355edc |
||
|
|
94f1aade5c | ||
|
|
1a54ecf246 |
||
|
|
fe54121cfa | ||
|
|
319844407c |
||
|
|
77b2742863 | ||
|
|
e57226d9a2 |
||
|
|
021c3cc125 |
||
|
|
0b3a54f9f2 |
||
|
|
7808f8f56b |
||
|
|
e3c8c23d91 | ||
|
|
1646000c9b |
||
|
|
b4cabc3cf7 |
||
|
|
e8e3c7addb |
||
|
|
608ce78778 | ||
|
|
824ad46e5d |
||
|
|
977433443a | ||
|
|
0d477bf570 |
||
|
|
5bf8248dd3 | ||
|
|
2e3664d2c0 |
||
|
|
fad44ae10c |
||
|
|
7b36727ed1 |
||
|
|
f096e5a3f3 |
||
|
|
53c6fa5de7 | ||
|
|
8525ab03de |
||
|
|
97168180cf |
||
|
|
57374489da |
||
|
|
1d145c7511 |
||
|
|
820202cd53 | ||
|
|
faf77f1651 |
||
|
|
4c773971a7 | ||
|
|
2b8aeed02b |
||
|
|
9e8e9af485 | ||
|
|
9e2d8999bf |
||
|
|
4f60946513 | ||
|
|
c8a39b69a0 |
||
|
|
ac9318c78f | ||
|
|
41b1bb4aef |
||
|
|
76cf8dff93 |
||
|
|
75a037d2f0 |
||
|
|
3703699757 |
||
|
|
c97a798af7 |
||
|
|
dd871d0105 |
||
|
|
ba5c707327 |
||
|
|
8b7c351e56 |
||
|
|
196285c59c |
||
|
|
f3b974f216 |
||
|
|
243c21568a |
||
|
|
955809bd5a |
||
|
|
fa24b0fcce |
||
|
|
4f0a0f32f2 |
||
|
|
24895c46f3 |
||
|
|
190e0eff23 | ||
|
|
28720c4d34 |
||
|
|
919e2a4f5c |
||
|
|
f686ad9e63 |
||
|
|
a4ef1ae736 |
||
|
|
81355045cc |
||
|
|
bcd06f03a5 | ||
|
|
02517bd806 |
||
|
|
6b25bfb0ff | ||
|
|
0f948fe039 |
||
|
|
fffa553c25 | ||
|
|
e73b3c08a0 |
||
|
|
fa35be5135 |
||
|
|
0b6a460b7f |
||
|
|
15e45b1d4b | ||
|
|
40d0de39b7 |
||
|
|
05ff5443b1 |
||
|
|
e553cf7214 | ||
|
|
cd95294a25 |
||
|
|
8c108efb0d |
||
|
|
b4f0314b35 | ||
|
|
59c3612590 |
||
|
|
55e4a1c7dc | ||
|
|
e0b037c2cd |
||
|
|
070dea4a9c |
||
|
|
f4171412a6 |
||
|
|
7f42a5bc03 |
||
|
|
3e7ce54902 |
||
|
|
88c094908b |
||
|
|
c045c3e00c | ||
|
|
6b1a376aee |
||
|
|
02525f683e |
||
|
|
5a57d2115b |
||
|
|
660d248549 |
||
|
|
1bc3494494 | ||
|
|
33a12ca0b6 |
||
|
|
084ed078d6 | ||
|
|
32204095e5 |
||
|
|
b76bf29d25 | ||
|
|
396fb4dde7 |
||
|
|
4836fcf831 | ||
|
|
1becbaefbe |
||
|
|
e3c613c79c | ||
|
|
04fbcdc68d |
||
|
|
55909141ef |
||
|
|
cd6e065f6e | ||
|
|
bb2b7ce7e4 |
||
|
|
2fbc222bb0 | ||
|
|
a1469abc8d |
||
|
|
ab1332bb6c |
||
|
|
ac991405d0 |
||
|
|
842c840145 |
||
|
|
614b631ee2 |
||
|
|
5611a40064 |
||
|
|
11c8b2841e | ||
|
|
0c0d038a40 |
||
|
|
5f31d5cc80 |
||
|
|
dbe30a1b6f |
||
|
|
a992e32bd5 | ||
|
|
cf5ce64b1b |
||
|
|
12caf0be4e |
||
|
|
bb9dd05c6a |
||
|
|
59f607b963 | ||
|
|
60ac859852 |
||
|
|
4fb3cf0712 |
||
|
|
e98c41c02f | ||
|
|
45091b0473 |
||
|
|
3cf328c644 |
||
|
|
c26449e64f |
||
|
|
7fa65aa877 | ||
|
|
4e2191ce20 |
||
|
|
3de04e0386 |
||
|
|
2e648d7e48 |
||
|
|
1fd0139b91 |
||
|
|
3478ae5795 |
||
|
|
01354fffb4 |
||
|
|
92c4f0095d |
||
|
|
ac8b914a11 |
||
|
|
de598ac8f0 |
||
|
|
142952cac8 | ||
|
|
a07360e0f1 |
||
|
|
1fc7066713 | ||
|
|
ca425971d5 |
||
|
|
dffa59dca5 | ||
|
|
3319474c5c |
||
|
|
802e2f54c6 | ||
|
|
12d70ab1a4 |
||
|
|
4ae24004b7 |
||
|
|
8244659b44 |
||
|
|
0bd02952ea |
||
|
|
5ea7283159 |
||
|
|
acedfc3fcb | ||
|
|
e5466df800 |
||
|
|
ce1801aeda |
||
|
|
11cb5cf347 |
||
|
|
24d896ca06 | ||
|
|
da2e897f55 |
||
|
|
07684bcc99 |
||
|
|
847bef3177 | ||
|
|
c6a93b5a56 |
||
|
|
8cd71917ce |
||
|
|
7a2cd0fa96 |
||
|
|
83818d1d6f |
||
|
|
960c4969a5 |
||
|
|
73e2ef486a |
||
|
|
b5f8f4d6a2 |
||
|
|
0c4124c1c0 | ||
|
|
9f04023d35 |
||
|
|
43e3831df9 | ||
|
|
ebfa3cdd5c |
||
|
|
c7cb7ba976 |
||
|
|
ec324af22e |
||
|
|
2c54ff3e63 |
||
|
|
402b5ba6d7 | ||
|
|
53f1f3b6d7 |
||
|
|
b779c5f567 | ||
|
|
a1cb822861 |
||
|
|
a4aabea511 |
||
|
|
c8763c9fdb | ||
|
|
edf34315af |
||
|
|
ce8b8414d9 |
||
|
|
7e68cfc6fa |
||
|
|
5c39722ab9 |
||
|
|
ea85ace4a9 |
||
|
|
88453acc6a |
||
|
|
988d81581d | ||
|
|
800bc78d26 |
||
|
|
b43fc33be3 |
||
|
|
d33aa82c51 | ||
|
|
576325e2f4 |
||
|
|
642c169bc3 | ||
|
|
7641359240 |
||
|
|
944a206d1f | ||
|
|
e83b709169 |
||
|
|
00f07ec343 | ||
|
|
80612c8ec0 |
||
|
|
32b9d33bbb |
||
|
|
9208fb5adb | ||
|
|
af141d1a5c |
||
|
|
8d8dcb089e |
||
|
|
a7bf8e64a5 |
||
|
|
d0611b0468 | ||
|
|
1388daa0cc |
||
|
|
d99eb01ee4 |
||
|
|
e17878ad15 |
||
|
|
ba72094b69 |
||
|
|
0d7d75d3d5 | ||
|
|
daf6968947 |
||
|
|
e27dd0f26f |
||
|
|
6624671a60 | ||
|
|
f549b30760 |
||
|
|
6b8670fe8f |
||
|
|
dc26e99dd5 | ||
|
|
a0f40d9410 |
||
|
|
4dc846f21c | ||
|
|
575abc48a3 |
||
|
|
4643681888 | ||
|
|
0ec96ddd52 |
||
|
|
35019fe136 | ||
|
|
2645751ce1 |
||
|
|
f35f4ee933 | ||
|
|
ca84b57042 |
||
|
|
06610c3da6 |
||
|
|
ca635876ce | ||
|
|
5f222a3e02 |
||
|
|
bca0aca8c5 | ||
|
|
f94c8fd766 |
||
|
|
73ec19f0cb | ||
|
|
a7ac6e4e68 |
||
|
|
0da4c26d9c | ||
|
|
9e775b8e9d |
||
|
|
30c0036db1 |
||
|
|
4d3726050e | ||
|
|
625d62efdf |
||
|
|
0f1dcc0592 |
||
|
|
6f63dca06f |
||
|
|
a9eecfec97 |
||
|
|
f57bc9bdca |
||
|
|
725bf55168 |
||
|
|
462077f2dd | ||
|
|
1bb2a17857 | ||
|
|
2ba9ed7110 | ||
|
|
9c3912ba8f | ||
|
|
4dcbaafb78 |
||
|
|
acb282080a |
||
|
|
db55461a41 |
||
|
|
f0cb73c175 | ||
|
|
7b8e2a8ea0 | ||
|
|
ae67507139 |
||
|
|
10e97c30e1 |
||
|
|
8b409c3a38 |
||
|
|
706bbd9228 |
||
|
|
822e0caf42 | ||
|
|
d7ebb14089 | ||
|
|
7a35ce5d64 |
||
|
|
58ebb39d81 |
4527 changed files with 43294 additions and 24226 deletions
35
.clangd
35
.clangd
|
|
@ -1,4 +1,33 @@
|
|||
CompileFlags:
|
||||
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
|
||||
Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues]
|
||||
Compiler: clang
|
||||
Add:
|
||||
[
|
||||
-Wno-unknown-attributes,
|
||||
-Wno-maybe-uninitialized,
|
||||
-Wno-unknown-warning-option,
|
||||
-Wno-pointer-to-int-cast,
|
||||
-Wno-int-to-void-pointer-cast,
|
||||
-DPROGMEM=,
|
||||
]
|
||||
Remove:
|
||||
[
|
||||
-W*,
|
||||
-mmcu=*,
|
||||
-mcpu=*,
|
||||
-mfpu=*,
|
||||
-mfloat-abi=*,
|
||||
-mno-unaligned-access,
|
||||
-mno-thumb-interwork,
|
||||
-mcall-prologues,
|
||||
-D__has_include*,
|
||||
-mlra,
|
||||
]
|
||||
Compiler: clang
|
||||
Diagnostics:
|
||||
UnusedIncludes: None
|
||||
Suppress:
|
||||
[
|
||||
asm_invalid_output_constraint,
|
||||
asm_invalid_input_constraint,
|
||||
invalid_asm_value_for_constraint,
|
||||
anyx86_interrupt_attribute,
|
||||
]
|
||||
|
|
|
|||
2
.github/workflows/api.yml
vendored
2
.github/workflows/api.yml
vendored
|
|
@ -25,7 +25,7 @@ jobs:
|
|||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
|
|
|||
2
.github/workflows/auto_tag.yml
vendored
2
.github/workflows/auto_tag.yml
vendored
|
|
@ -28,7 +28,7 @@ jobs:
|
|||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
|
|
|||
15
.github/workflows/ci_build_major_branch.yml
vendored
15
.github/workflows/ci_build_major_branch.yml
vendored
|
|
@ -6,13 +6,13 @@ permissions:
|
|||
|
||||
on:
|
||||
push:
|
||||
branches: [master, develop]
|
||||
branches: [master, develop, xap]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
type: choice
|
||||
description: "Branch to build"
|
||||
options: [master, develop]
|
||||
options: [master, develop, xap]
|
||||
|
||||
env:
|
||||
# https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits
|
||||
|
|
@ -45,14 +45,14 @@ jobs:
|
|||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Determine concurrency
|
||||
id: generate_slice_length
|
||||
run: |
|
||||
target_count=$( {
|
||||
qmk find -km default 2>/dev/null
|
||||
# qmk find -km xap 2>/dev/null
|
||||
qmk find -km xap 2>/dev/null
|
||||
} | sort | uniq | wc -l)
|
||||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution
|
||||
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT
|
||||
|
|
@ -63,8 +63,7 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
keymap: [default]
|
||||
# keymap: [default, xap]
|
||||
keymap: [default, xap]
|
||||
uses: ./.github/workflows/ci_build_major_branch_keymap.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch || github.ref_name }}
|
||||
|
|
@ -83,12 +82,12 @@ jobs:
|
|||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: firmware-*
|
||||
path: .
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ jobs:
|
|||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Generate build targets
|
||||
id: generate_targets
|
||||
|
|
@ -62,7 +62,7 @@ jobs:
|
|||
echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Upload targets json
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: targets.json
|
||||
|
|
@ -89,10 +89,10 @@ jobs:
|
|||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Get target definitions
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
name: targets-${{ inputs.keymap }}
|
||||
path: .
|
||||
|
|
@ -112,7 +112,7 @@ jobs:
|
|||
qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $(jq -r '.["${{ matrix.target }}"].targets' targets.json) || touch .failed
|
||||
|
||||
- name: Upload binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}-${{ matrix.target }}
|
||||
if-no-files-found: ignore
|
||||
|
|
@ -136,17 +136,17 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v6
|
||||
with:
|
||||
pattern: firmware-${{ inputs.keymap }}-*
|
||||
path: .
|
||||
merge-multiple: true
|
||||
|
||||
- name: Upload all firmwares
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: firmware-${{ inputs.keymap }}
|
||||
if-no-files-found: ignore
|
||||
|
|
|
|||
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
|
|
|
|||
2
.github/workflows/develop_update.yml
vendored
2
.github/workflows/develop_update.yml
vendored
|
|
@ -15,7 +15,7 @@ jobs:
|
|||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
|
|
|||
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
|
|
@ -30,7 +30,7 @@ jobs:
|
|||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ jobs:
|
|||
|
||||
- name: Deploy
|
||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||
uses: JamesIves/github-pages-deploy-action@v4.7.3
|
||||
uses: JamesIves/github-pages-deploy-action@v4.7.4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: gh-pages
|
||||
|
|
|
|||
2
.github/workflows/feature_branch_update.yml
vendored
2
.github/workflows/feature_branch_update.yml
vendored
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
- riot
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
|
|
|||
4
.github/workflows/format.yml
vendored
4
.github/workflows/format.yml
vendored
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
|
@ -36,7 +36,7 @@ jobs:
|
|||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v46
|
||||
uses: tj-actions/changed-files@v47
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
|
|
|||
4
.github/workflows/format_push.yml
vendored
4
.github/workflows/format_push.yml
vendored
|
|
@ -19,7 +19,7 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ jobs:
|
|||
qmk format-text -a
|
||||
git diff
|
||||
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
- uses: rlespinasse/github-slug-action@v5
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
|
|
|
|||
2
.github/workflows/labeler.yml
vendored
2
.github/workflows/labeler.yml
vendored
|
|
@ -10,4 +10,4 @@ jobs:
|
|||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v5
|
||||
- uses: actions/labeler@v6
|
||||
|
|
|
|||
4
.github/workflows/lint.yml
vendored
4
.github/workflows/lint.yml
vendored
|
|
@ -18,7 +18,7 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
|
@ -27,7 +27,7 @@ jobs:
|
|||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v46
|
||||
uses: tj-actions/changed-files@v47
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
|
|
|||
2
.github/workflows/regen.yml
vendored
2
.github/workflows/regen.yml
vendored
|
|
@ -19,7 +19,7 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
|
|
|
|||
4
.github/workflows/regen_push.yml
vendored
4
.github/workflows/regen_push.yml
vendored
|
|
@ -19,14 +19,14 @@ jobs:
|
|||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
util/regen.sh
|
||||
git diff
|
||||
|
||||
- uses: rlespinasse/github-slug-action@v3.x
|
||||
- uses: rlespinasse/github-slug-action@v5
|
||||
|
||||
- name: Become QMK Bot
|
||||
run: |
|
||||
|
|
|
|||
2
.github/workflows/unit_test.yml
vendored
2
.github/workflows/unit_test.yml
vendored
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
|
|
|
|||
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -64,6 +64,7 @@ build/
|
|||
cmake-build-debug
|
||||
CMakeLists.txt
|
||||
*.pdf
|
||||
*.zip
|
||||
|
||||
# Let these ones be user specific, since we have so many different configurations
|
||||
*.code-workspace
|
||||
|
|
@ -94,6 +95,11 @@ tags
|
|||
*.mpeg
|
||||
*.ttf
|
||||
*.otf
|
||||
# Un-ignore limited image file formats in docs
|
||||
!docs/public/**.gif
|
||||
!docs/public/**.jpg
|
||||
!docs/public/**.jpeg
|
||||
!docs/public/**.png
|
||||
|
||||
# Things Travis sees
|
||||
/.vs
|
||||
|
|
|
|||
27
.vscode/settings.json
vendored
27
.vscode/settings.json
vendored
|
|
@ -10,6 +10,13 @@
|
|||
"**/*.uf2": true
|
||||
},
|
||||
"files.associations": {
|
||||
// QMK Filetypes
|
||||
"keyboard.json": "jsonc",
|
||||
"info.json": "jsonc",
|
||||
"keymap.json": "jsonc",
|
||||
"qmk.json": "jsonc",
|
||||
"qmk_module.json": "jsonc",
|
||||
// Standard filetypes
|
||||
"*.h": "c",
|
||||
"*.c": "c",
|
||||
"*.inc": "c",
|
||||
|
|
@ -28,7 +35,23 @@
|
|||
"[json]": {
|
||||
"editor.formatOnSave": false
|
||||
},
|
||||
"clangd.arguments": [
|
||||
"--header-insertion=never"
|
||||
"clangd.arguments": ["--header-insertion=never"],
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": ["qmk.json"],
|
||||
"url": "./data/schemas/user_repo_v1_1.jsonschema"
|
||||
},
|
||||
{
|
||||
"fileMatch": ["qmk_module.json"],
|
||||
"url": "./data/schemas/community_module.jsonschema"
|
||||
},
|
||||
{
|
||||
"fileMatch": ["keyboard.json", "info.json"],
|
||||
"url": "./data/schemas/keyboard.jsonschema"
|
||||
},
|
||||
{
|
||||
"fileMatch": ["keymap.json"],
|
||||
"url": "./data/schemas/keymap.jsonschema"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
9
Makefile
9
Makefile
|
|
@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
|
|||
endif
|
||||
|
||||
include paths.mk
|
||||
include $(BUILDDEFS_PATH)/support.mk
|
||||
|
||||
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
||||
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
||||
|
|
@ -114,7 +115,7 @@ endef
|
|||
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
||||
|
||||
# As TRY_TO_MATCH_RULE_FROM_LIST_HELPER, but with additional
|
||||
# resolution of DEFAULT_FOLDER and keyboard_aliases.hjson for provided rule
|
||||
# resolution of keyboard_aliases.hjson for provided rule
|
||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER_KB
|
||||
# Split on ":", padding with empty strings to avoid indexing issues
|
||||
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||
|
|
@ -254,7 +255,7 @@ endef
|
|||
# if we are going to compile all keyboards, match the rest of the rule
|
||||
# for each of them
|
||||
define PARSE_ALL_KEYBOARDS
|
||||
$$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell $(QMK_BIN) list-keyboards --no-resolve-defaults)))
|
||||
$$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(shell $(QMK_BIN) list-keyboards)))
|
||||
endef
|
||||
|
||||
# Prints a list of all known keymaps for the given keyboard
|
||||
|
|
@ -446,7 +447,7 @@ git-submodules: git-submodule
|
|||
|
||||
.PHONY: list-keyboards
|
||||
list-keyboards:
|
||||
$(QMK_BIN) list-keyboards --no-resolve-defaults | tr '\n' ' '
|
||||
$(QMK_BIN) list-keyboards | tr '\n' ' '
|
||||
|
||||
.PHONY: list-tests
|
||||
list-tests:
|
||||
|
|
@ -454,7 +455,7 @@ list-tests:
|
|||
|
||||
.PHONY: generate-keyboards-file
|
||||
generate-keyboards-file:
|
||||
$(QMK_BIN) list-keyboards --no-resolve-defaults
|
||||
$(QMK_BIN) list-keyboards
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ endif
|
|||
.DEFAULT_GOAL := all
|
||||
|
||||
include paths.mk
|
||||
include $(BUILDDEFS_PATH)/support.mk
|
||||
include $(BUILDDEFS_PATH)/message.mk
|
||||
|
||||
# Helper to add defines with a 'QMK_' prefix
|
||||
|
|
@ -251,6 +252,9 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/
|
|||
endif
|
||||
|
||||
# Community modules
|
||||
COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
|
||||
include $(COMMUNITY_RULES_MK)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
|
||||
|
|
@ -271,10 +275,19 @@ $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(D
|
|||
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
|
||||
|
||||
include $(BUILDDEFS_PATH)/converters.mk
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ endif
|
|||
OPT = g
|
||||
|
||||
include paths.mk
|
||||
include $(BUILDDEFS_PATH)/support.mk
|
||||
include $(BUILDDEFS_PATH)/message.mk
|
||||
|
||||
TARGET=test/$(TEST_OUTPUT)
|
||||
|
|
@ -61,6 +62,7 @@ include $(BUILDDEFS_PATH)/common_features.mk
|
|||
include $(BUILDDEFS_PATH)/generic_features.mk
|
||||
include $(PLATFORM_PATH)/common.mk
|
||||
include $(TMK_PATH)/protocol.mk
|
||||
include $(QUANTUM_PATH)/battery/tests/rules.mk
|
||||
include $(QUANTUM_PATH)/debounce/tests/rules.mk
|
||||
include $(QUANTUM_PATH)/encoder/tests/rules.mk
|
||||
include $(QUANTUM_PATH)/os_detection/tests/rules.mk
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ QUANTUM_SRC += \
|
|||
$(QUANTUM_DIR)/logging/debug.c \
|
||||
$(QUANTUM_DIR)/logging/sendchar.c \
|
||||
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
|
||||
$(QUANTUM_DIR)/process_keycode/process_oneshot.c \
|
||||
$(QUANTUM_DIR)/process_keycode/process_quantum.c \
|
||||
|
||||
include $(QUANTUM_DIR)/nvm/rules.mk
|
||||
|
||||
|
|
@ -171,80 +173,82 @@ endif
|
|||
|
||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
|
||||
EEPROM_DRIVER ?= vendor
|
||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||
ifneq ($(strip $(EEPROM_DRIVER)),none)
|
||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
||||
else
|
||||
OPT_DEFS += -DEEPROM_ENABLE
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
|
||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||
COMMON_VPATH += $(PLATFORM_COMMON_DIR)
|
||||
ifeq ($(strip $(EEPROM_DRIVER)), custom)
|
||||
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
|
||||
SRC += eeprom_driver.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
|
||||
# Wear-leveling EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
||||
# External I2C EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_i2c.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
||||
# External SPI EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_spi.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
|
||||
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
|
||||
# Transient EEPROM implementation -- no data storage but provides runtime area for it
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||
SRC += eeprom_driver.c eeprom_transient.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
|
||||
# Vendor-implemented EEPROM
|
||||
OPT_DEFS += -DEEPROM_VENDOR
|
||||
ifeq ($(PLATFORM),AVR)
|
||||
# Automatically provided by avr-libc, nothing required
|
||||
else ifeq ($(PLATFORM),CHIBIOS)
|
||||
ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
||||
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
||||
# Wear-leveling EEPROM implementation, backed by MCU flash
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
WEAR_LEVELING_DRIVER ?= embedded_flash
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
|
||||
# True EEPROM on STM32L0xx, L1xx
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
|
||||
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
|
||||
else ifneq ($(filter $(MCU_SERIES),RP2040),)
|
||||
# Wear-leveling EEPROM implementation, backed by RP2040 flash
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
WEAR_LEVELING_DRIVER ?= rp2040_flash
|
||||
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
|
||||
# Teensy EEPROM implementations
|
||||
OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
|
||||
SRC += eeprom_kinetis_flexram.c
|
||||
else
|
||||
# Fall back to transient, i.e. non-persistent
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||
SRC += eeprom_driver.c eeprom_transient.c
|
||||
else
|
||||
OPT_DEFS += -DEEPROM_ENABLE
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
|
||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
||||
COMMON_VPATH += $(PLATFORM_COMMON_DIR)
|
||||
ifeq ($(strip $(EEPROM_DRIVER)), custom)
|
||||
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
|
||||
SRC += eeprom_driver.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
|
||||
# Wear-leveling EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
||||
# External I2C EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_i2c.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
||||
# External SPI EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_spi.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
|
||||
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
|
||||
# Transient EEPROM implementation -- no data storage but provides runtime area for it
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||
SRC += eeprom_driver.c eeprom_transient.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
|
||||
# Vendor-implemented EEPROM
|
||||
OPT_DEFS += -DEEPROM_VENDOR
|
||||
ifeq ($(PLATFORM),AVR)
|
||||
# Automatically provided by avr-libc, nothing required
|
||||
else ifeq ($(PLATFORM),CHIBIOS)
|
||||
ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
||||
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
||||
# Wear-leveling EEPROM implementation, backed by MCU flash
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
WEAR_LEVELING_DRIVER ?= embedded_flash
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
|
||||
# True EEPROM on STM32L0xx, L1xx
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
|
||||
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
|
||||
else ifneq ($(filter $(MCU_SERIES),RP2040),)
|
||||
# Wear-leveling EEPROM implementation, backed by RP2040 flash
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
WEAR_LEVELING_DRIVER ?= rp2040_flash
|
||||
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
|
||||
# Teensy EEPROM implementations
|
||||
OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
|
||||
SRC += eeprom_kinetis_flexram.c
|
||||
else
|
||||
# Fall back to transient, i.e. non-persistent
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||
SRC += eeprom_driver.c eeprom_transient.c
|
||||
endif
|
||||
else ifeq ($(PLATFORM),TEST)
|
||||
# Test harness "EEPROM"
|
||||
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||
SRC += eeprom.c
|
||||
endif
|
||||
else ifeq ($(PLATFORM),TEST)
|
||||
# Test harness "EEPROM"
|
||||
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||
SRC += eeprom.c
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
|
@ -265,18 +269,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
|
|||
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
|
||||
OPT_DEFS += -DHAL_USE_EFL
|
||||
SRC += wear_leveling_efl.c
|
||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
|
||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
|
||||
FLASH_DRIVER := spi
|
||||
SRC += wear_leveling_flash_spi.c
|
||||
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
|
||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
|
||||
SRC += wear_leveling_rp2040_flash.c
|
||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
|
||||
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
SRC += legacy_flash_ops.c wear_leveling_legacy.c
|
||||
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
|
@ -635,6 +635,14 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
|
|||
RAW_ENABLE := yes
|
||||
BOOTMAGIC_ENABLE := yes
|
||||
TRI_LAYER_ENABLE := yes
|
||||
ifeq ($(strip $(VIA_INSECURE)), yes)
|
||||
OPT_DEFS += -DVIA_INSECURE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RAW_ENABLE)), yes)
|
||||
OPT_DEFS += -DRAW_ENABLE
|
||||
SRC += raw_hid.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
|
||||
|
|
@ -719,6 +727,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes)
|
|||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||
OPT_DEFS += -DLIB8_ATTINY
|
||||
endif
|
||||
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
|
||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||
endif
|
||||
|
||||
|
|
@ -890,19 +899,19 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
|||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
NO_USB_STARTUP_CHECK := yes
|
||||
CONNECTION_ENABLE := yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||
SRC += outputselect.c process_connection.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
||||
UART_DRIVER_REQUIRED = yes
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||
endif
|
||||
endif
|
||||
|
|
@ -936,21 +945,25 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
|||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(BATTERY_ENABLE)), yes)
|
||||
BATTERY_DRIVER_REQUIRED := yes
|
||||
endif
|
||||
|
||||
VALID_BATTERY_DRIVER_TYPES := adc custom vendor
|
||||
|
||||
BATTERY_DRIVER ?= adc
|
||||
BATTERY_DRIVER ?= none
|
||||
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
|
||||
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
|
||||
endif
|
||||
|
||||
OPT_DEFS += -DBATTERY_DRIVER
|
||||
OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
OPT_DEFS += -DBATTERY_DRIVER_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
COMMON_VPATH += $(DRIVER_PATH)/battery
|
||||
|
||||
SRC += battery.c
|
||||
SRC += battery_$(strip $(BATTERY_DRIVER)).c
|
||||
ifneq ($(strip $(BATTERY_DRIVER)), custom)
|
||||
SRC += battery_$(strip $(BATTERY_DRIVER)).c
|
||||
endif
|
||||
|
||||
# add extra deps
|
||||
ifeq ($(strip $(BATTERY_DRIVER)), adc)
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
|
|||
|
||||
# For a ChibiOS build, ensure that the board files have the hook overrides injected
|
||||
define BOARDSRC_INJECT_HOOKS
|
||||
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||
endef
|
||||
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
||||
|
||||
|
|
@ -289,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
|||
ifneq ($$(VERBOSE_C_INCLUDE),)
|
||||
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
|
||||
endif
|
||||
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
@$$(BUILD_CMD)
|
||||
ifneq ($$(DUMP_C_MACROS),)
|
||||
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
||||
endif
|
||||
|
||||
|
|
@ -300,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
|||
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||
@mkdir -p $$(@D)
|
||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
@$$(BUILD_CMD)
|
||||
|
||||
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
|
||||
@mkdir -p $$(@D)
|
||||
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
|
||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
|
||||
@$$(BUILD_CMD)
|
||||
|
||||
# Assemble: create object files from assembler source files.
|
||||
|
|
|
|||
|
|
@ -1,15 +1,3 @@
|
|||
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
|
||||
# and should not be replicated for new boards. These will be removed from
|
||||
# documentation as well as existing keymaps in due course.
|
||||
ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
|
||||
$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
|
||||
endif
|
||||
|
||||
ifneq (,$(filter $(MCU),atmega32u4))
|
||||
# TODO: opt in rather than assume everything uses a pro micro
|
||||
PIN_COMPATIBLE ?= promicro
|
||||
endif
|
||||
|
||||
# Remove whitespace from any rule.mk provided vars
|
||||
# - env cannot be overwritten but cannot have whitespace anyway
|
||||
CONVERT_TO:=$(strip $(CONVERT_TO))
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"vite": "^5.4.15",
|
||||
"vite": "^5.4.21",
|
||||
"vitepress": "^1.1.0",
|
||||
"vitepress-plugin-tabs": "^0.5.0",
|
||||
"vue": "^3.4.24"
|
||||
|
|
|
|||
|
|
@ -766,10 +766,10 @@ tabbable@^6.2.0:
|
|||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||
|
||||
vite@^5.2.9, vite@^5.4.15:
|
||||
version "5.4.15"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.15.tgz#2941547f10ebb4bf9b0fa0da863c06711eb7e5e5"
|
||||
integrity sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==
|
||||
vite@^5.2.9, vite@^5.4.21:
|
||||
version "5.4.21"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027"
|
||||
integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==
|
||||
dependencies:
|
||||
esbuild "^0.21.3"
|
||||
postcss "^8.4.43"
|
||||
|
|
|
|||
|
|
@ -21,10 +21,12 @@ SPACE_CADET_ENABLE ?= yes
|
|||
GENERIC_FEATURES = \
|
||||
AUTO_SHIFT \
|
||||
AUTOCORRECT \
|
||||
BATTERY \
|
||||
BOOTMAGIC \
|
||||
CAPS_WORD \
|
||||
COMBO \
|
||||
COMMAND \
|
||||
CONNECTION \
|
||||
CRC \
|
||||
DEFERRED_EXEC \
|
||||
DIGITIZER \
|
||||
|
|
|
|||
11
builddefs/support.mk
Normal file
11
builddefs/support.mk
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# Helper to determine if a compiler option is supported
|
||||
# Args:
|
||||
# $(1) = option to test, if successful will be output
|
||||
# $(2) = option to use if $(1) is not supported
|
||||
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
|
||||
cc-option = $(shell \
|
||||
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
|
||||
then echo "$(1)"; else echo "$(2)"; fi)
|
||||
|
||||
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
|
||||
, := ,
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk)))
|
||||
FULL_TESTS := $(notdir $(TEST_LIST))
|
||||
|
||||
include $(QUANTUM_PATH)/battery/tests/testlist.mk
|
||||
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
|
||||
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
|
||||
include $(QUANTUM_PATH)/os_detection/tests/testlist.mk
|
||||
|
|
|
|||
55
data/constants/module_hooks/1.1.0.hjson
Normal file
55
data/constants/module_hooks/1.1.0.hjson
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
{
|
||||
pointing_device_init: {
|
||||
ret_type: void
|
||||
args: void
|
||||
guard: defined(POINTING_DEVICE_ENABLE)
|
||||
}
|
||||
pointing_device_task: {
|
||||
ret_type: report_mouse_t
|
||||
args: report_mouse_t mouse_report
|
||||
call_params: mouse_report
|
||||
guard: defined(POINTING_DEVICE_ENABLE)
|
||||
header: report.h
|
||||
}
|
||||
rgb_matrix_indicators: {
|
||||
ret_type: bool
|
||||
args: void
|
||||
guard: defined(RGB_MATRIX_ENABLE)
|
||||
header: rgb_matrix.h
|
||||
}
|
||||
rgb_matrix_indicators_advanced: {
|
||||
ret_type: bool
|
||||
args: uint8_t led_min, uint8_t led_max
|
||||
call_params: led_min, led_max
|
||||
guard: defined(RGB_MATRIX_ENABLE)
|
||||
header: rgb_matrix.h
|
||||
}
|
||||
led_matrix_indicators: {
|
||||
ret_type: bool
|
||||
args: void
|
||||
guard: defined(LED_MATRIX_ENABLE)
|
||||
header: led_matrix.h
|
||||
}
|
||||
led_matrix_indicators_advanced: {
|
||||
ret_type: bool
|
||||
args: uint8_t led_min, uint8_t led_max
|
||||
call_params: led_min, led_max
|
||||
guard: defined(LED_MATRIX_ENABLE)
|
||||
header: led_matrix.h
|
||||
}
|
||||
default_layer_state_set: {
|
||||
ret_type: layer_state_t
|
||||
args: layer_state_t state
|
||||
call_params: state
|
||||
guard: !defined(NO_ACTION_LAYER)
|
||||
header: action_layer.h
|
||||
}
|
||||
layer_state_set: {
|
||||
ret_type: layer_state_t
|
||||
args: layer_state_t state
|
||||
call_params: state
|
||||
guard: !defined(NO_ACTION_LAYER)
|
||||
header: action_layer.h
|
||||
}
|
||||
|
||||
}
|
||||
3
data/constants/module_hooks/1.1.1.hjson
Normal file
3
data/constants/module_hooks/1.1.1.hjson
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
// This version exists to signify addition of LED/RGB effect support.
|
||||
}
|
||||
|
|
@ -43,6 +43,14 @@
|
|||
"BOOTMAGIC_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"},
|
||||
"BOOTMAGIC_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"},
|
||||
|
||||
// Battery
|
||||
"BATTERY_SAMPLE_INTERVAL": {"info_key": "battery.sample_interval", "value_type": "int"},
|
||||
"BATTERY_ADC_PIN": {"info_key": "battery.adc.pin"},
|
||||
"BATTERY_ADC_REF_VOLTAGE_MV": {"info_key": "battery.adc.reference_voltage", "value_type": "int"},
|
||||
"BATTERY_ADC_VOLTAGE_DIVIDER_R1": {"info_key": "battery.adc.divider_r1", "value_type": "int"},
|
||||
"BATTERY_ADC_VOLTAGE_DIVIDER_R2": {"info_key": "battery.adc.divider_r2", "value_type": "int"},
|
||||
"BATTERY_ADC_RESOLUTION": {"info_key": "battery.adc.resolution", "value_type": "int"},
|
||||
|
||||
// Caps Word
|
||||
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "flag"},
|
||||
"CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
|
||||
|
|
@ -64,6 +72,9 @@
|
|||
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
||||
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
||||
|
||||
// host
|
||||
"NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"},
|
||||
|
||||
// Layer locking
|
||||
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
||||
|
||||
|
|
@ -117,6 +128,7 @@
|
|||
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "flag"},
|
||||
"MATRIX_INPUT_PRESSED_STATE": {"info_key": "matrix_pins.input_pressed_state", "value_type": "int"},
|
||||
"MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
|
||||
"MATRIX_MASKED": {"info_key": "matrix_pins.masked", "value_type": "flag"},
|
||||
|
||||
// Mouse Keys
|
||||
"MOUSEKEY_DELAY": {"info_key": "mousekey.delay", "value_type": "int"},
|
||||
|
|
@ -180,7 +192,7 @@
|
|||
|
||||
// Split Keyboard
|
||||
"SOFT_SERIAL_PIN": {"info_key": "split.serial.pin"},
|
||||
"SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
|
||||
"SELECT_SOFT_SERIAL_SPEED": {"info_key": "split.serial.speed"},
|
||||
"SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false},
|
||||
"SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"},
|
||||
"SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "flag"},
|
||||
|
|
@ -201,6 +213,7 @@
|
|||
|
||||
// Tapping
|
||||
"CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"},
|
||||
"FLOW_TAP_TERM": {"info_key": "tapping.flow_tap_term", "value_type": "int"},
|
||||
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"},
|
||||
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"},
|
||||
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
|
||||
|
|
@ -214,7 +227,6 @@
|
|||
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
||||
|
||||
// USB
|
||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
|
||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
||||
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||
|
|
@ -252,6 +264,7 @@
|
|||
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
|
||||
|
||||
// Items we want flagged in lint
|
||||
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
||||
|
|
|
|||
74
data/mappings/info_defaults.hjson
Normal file
74
data/mappings/info_defaults.hjson
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"bootmagic": {
|
||||
"matrix": [0, 0]
|
||||
},
|
||||
"backlight": {
|
||||
"default": {
|
||||
"on": true
|
||||
},
|
||||
"breathing_period": 6,
|
||||
"levels": 3,
|
||||
"on_state": 1
|
||||
},
|
||||
"debounce": 5,
|
||||
"features": {
|
||||
"command": false,
|
||||
"console": false
|
||||
},
|
||||
"indicators": {
|
||||
"on_state": 1
|
||||
},
|
||||
"led_matrix": {
|
||||
"default": {
|
||||
"animation": "solid",
|
||||
"on": true,
|
||||
"val": 255,
|
||||
"speed": 128
|
||||
},
|
||||
"led_flush_limit": 16,
|
||||
"max_brightness": 255,
|
||||
"sleep": false,
|
||||
"speed_steps": 16,
|
||||
"val_steps": 16
|
||||
},
|
||||
"rgblight": {
|
||||
"default": {
|
||||
"animation": "static_light",
|
||||
"on": true,
|
||||
"hue": 0,
|
||||
"sat": 255,
|
||||
"val": 255,
|
||||
"speed": 0
|
||||
},
|
||||
"brightness_steps": 17,
|
||||
"hue_steps": 8,
|
||||
"max_brightness": 255,
|
||||
"saturation_steps": 17,
|
||||
"sleep": false
|
||||
},
|
||||
"rgb_matrix": {
|
||||
"default": {
|
||||
"animation": "cycle_left_right",
|
||||
"on": true,
|
||||
"hue": 0,
|
||||
"sat": 255,
|
||||
"val": 255,
|
||||
"speed": 128
|
||||
},
|
||||
"hue_steps": 8,
|
||||
"led_flush_limit": 16,
|
||||
"max_brightness": 255,
|
||||
"sat_steps": 16,
|
||||
"sleep": false,
|
||||
"speed_steps": 16,
|
||||
"val_steps": 16
|
||||
},
|
||||
"split": {
|
||||
"serial": {
|
||||
"driver": "bitbang"
|
||||
}
|
||||
},
|
||||
"ws2812": {
|
||||
"driver": "bitbang"
|
||||
}
|
||||
}
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
"AUDIO_DRIVER": {"info_key": "audio.driver"},
|
||||
"BACKLIGHT_DRIVER": {"info_key": "backlight.driver"},
|
||||
"BATTERY_DRIVER": {"info_key": "battery.driver"},
|
||||
"BLUETOOTH_DRIVER": {"info_key": "bluetooth.driver"},
|
||||
"BOARD": {"info_key": "board"},
|
||||
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
||||
|
|
@ -53,8 +54,8 @@
|
|||
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
||||
|
||||
// Items we want flagged in lint
|
||||
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
|
||||
"CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||
"CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
|
||||
"DEFAULT_FOLDER": {"info_key": "_invalid.default_folder", "invalid": true},
|
||||
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,6 +68,81 @@
|
|||
"bakeneko80": {
|
||||
"target": "kkatano/bakeneko80"
|
||||
},
|
||||
"bastardkb/charybdis/3x5/v2/elitec": {
|
||||
"target": "bastardkb/charybdis/3x5/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x5/v2/splinky_2": {
|
||||
"target": "bastardkb/charybdis/3x5/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x5/v2/splinky_3": {
|
||||
"target": "bastardkb/charybdis/3x5/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x5/v2/stemcell": {
|
||||
"target": "bastardkb/charybdis/3x5/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x6/v2/elitec": {
|
||||
"target": "bastardkb/charybdis/3x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x6/v2/splinky_2": {
|
||||
"target": "bastardkb/charybdis/3x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x6/v2/splinky_3": {
|
||||
"target": "bastardkb/charybdis/3x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/3x6/v2/stemcell": {
|
||||
"target": "bastardkb/charybdis/3x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/4x6/v2/elitec": {
|
||||
"target": "bastardkb/charybdis/4x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/4x6/v2/splinky_2": {
|
||||
"target": "bastardkb/charybdis/4x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/4x6/v2/splinky_3": {
|
||||
"target": "bastardkb/charybdis/4x6/elitec"
|
||||
},
|
||||
"bastardkb/charybdis/4x6/v2/stemcell": {
|
||||
"target": "bastardkb/charybdis/4x6/elitec"
|
||||
},
|
||||
"bastardkb/dilemma/3x5_2/splinky": {
|
||||
"target": "bastardkb/dilemma/3x5_2/promicro"
|
||||
},
|
||||
"bastardkb/scylla/v2/elitec": {
|
||||
"target": "bastardkb/scylla/promicro"
|
||||
},
|
||||
"bastardkb/scylla/v2/splinky_2": {
|
||||
"target": "bastardkb/scylla/promicro"
|
||||
},
|
||||
"bastardkb/scylla/v2/splinky_3": {
|
||||
"target": "bastardkb/scylla/promicro"
|
||||
},
|
||||
"bastardkb/scylla/v2/stemcell": {
|
||||
"target": "bastardkb/scylla/promicro"
|
||||
},
|
||||
"bastardkb/skeletyl/v2/elitec": {
|
||||
"target": "bastardkb/skeletyl/promicro"
|
||||
},
|
||||
"bastardkb/skeletyl/v2/splinky_2": {
|
||||
"target": "bastardkb/skeletyl/promicro"
|
||||
},
|
||||
"bastardkb/skeletyl/v2/splinky_3": {
|
||||
"target": "bastardkb/skeletyl/promicro"
|
||||
},
|
||||
"bastardkb/skeletyl/v2/stemcell": {
|
||||
"target": "bastardkb/skeletyl/promicro"
|
||||
},
|
||||
"bastardkb/tbkmini/v2/elitec": {
|
||||
"target": "bastardkb/tbkmini/promicro"
|
||||
},
|
||||
"bastardkb/tbkmini/v2/splinky_2": {
|
||||
"target": "bastardkb/tbkmini/promicro"
|
||||
},
|
||||
"bastardkb/tbkmini/v2/splinky_3": {
|
||||
"target": "bastardkb/tbkmini/promicro"
|
||||
},
|
||||
"bastardkb/tbkmini/v2/stemcell": {
|
||||
"target": "bastardkb/tbkmini/promicro"
|
||||
},
|
||||
"bear_face": {
|
||||
"target": "bear_face/v1"
|
||||
},
|
||||
|
|
@ -146,6 +221,9 @@
|
|||
"daisy": {
|
||||
"target": "ktec/daisy"
|
||||
},
|
||||
"deemen17/de60": {
|
||||
"target": "deemen17/de60/r1"
|
||||
},
|
||||
"dp3000": {
|
||||
"target": "dp3000/rev1"
|
||||
},
|
||||
|
|
@ -254,44 +332,11 @@
|
|||
"handwired/jscotto/scottostarter": {
|
||||
"target": "handwired/scottokeebs/scottostarter"
|
||||
},
|
||||
"helix/pico/sc/back": {
|
||||
"target": "helix/pico/sc"
|
||||
"helix": {
|
||||
"target": "helix/beta"
|
||||
},
|
||||
"helix/pico/sc/under": {
|
||||
"target": "helix/pico/sc"
|
||||
},
|
||||
"helix/rev2/back/oled": {
|
||||
"target": "helix/rev2/back"
|
||||
},
|
||||
"helix/rev2/oled": {
|
||||
"target": "helix/rev2"
|
||||
},
|
||||
"helix/rev2/oled/back": {
|
||||
"target": "helix/rev2/back"
|
||||
},
|
||||
"helix/rev2/oled/under": {
|
||||
"target": "helix/rev2/under"
|
||||
},
|
||||
"helix/rev2/sc/back": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/sc/oled": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/sc/oledback": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/sc/oledunder": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/sc/under": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/under": {
|
||||
"target": "helix/rev2/sc"
|
||||
},
|
||||
"helix/rev2/under/oled": {
|
||||
"target": "helix/rev2/under"
|
||||
"helix/rev2": {
|
||||
"target": "helix/beta"
|
||||
},
|
||||
"honeycomb": {
|
||||
"target": "keyhive/honeycomb"
|
||||
|
|
@ -347,6 +392,9 @@
|
|||
"keycapsss/plaid_pad": {
|
||||
"target": "keycapsss/plaid_pad/rev1"
|
||||
},
|
||||
"keyten/kt60hs_t": {
|
||||
"target": "keyten/kt60hs_t/v1"
|
||||
},
|
||||
"kira75": {
|
||||
"target": "kira/kira75"
|
||||
},
|
||||
|
|
@ -401,6 +449,9 @@
|
|||
"lfkeyboards/smk65": {
|
||||
"target": "lfkeyboards/smk65/revb"
|
||||
},
|
||||
"ll3macorn/bongopad": {
|
||||
"target": "ll3ma/bongopad"
|
||||
},
|
||||
"m3v3van": {
|
||||
"target": "matthewdias/m3n3van"
|
||||
},
|
||||
|
|
@ -1036,7 +1087,7 @@
|
|||
"target": "kprepublic/bm68hsrgb/rev1"
|
||||
},
|
||||
"late9/rev1": {
|
||||
"target": "rookiebwoy/late9/rev1"
|
||||
"target": "ivndbt/late9/rev1"
|
||||
},
|
||||
"latin17rgb": {
|
||||
"target": "latincompass/latin17rgb"
|
||||
|
|
@ -1201,7 +1252,7 @@
|
|||
"target": "spaceholdings/nebula68b"
|
||||
},
|
||||
"neopad/rev1": {
|
||||
"target": "rookiebwoy/neopad/rev1"
|
||||
"target": "ivndbt/neopad/rev1"
|
||||
},
|
||||
"niu_mini": {
|
||||
"target": "kbdfans/niu_mini"
|
||||
|
|
@ -1875,6 +1926,12 @@
|
|||
"kin80": {
|
||||
"target": "kin80/blackpill401"
|
||||
},
|
||||
"kprepublic/cstc40/daughterboard": {
|
||||
"target": "kprepublic/cstc40/rev1"
|
||||
},
|
||||
"kprepublic/cstc40/single_pcb": {
|
||||
"target": "kprepublic/cstc40/rev2"
|
||||
},
|
||||
"kumaokobo/kudox_full": {
|
||||
"target": "kumaokobo/kudox_full/rev1"
|
||||
},
|
||||
|
|
@ -2098,10 +2155,16 @@
|
|||
"target": "rmi_kb/wete/v2"
|
||||
},
|
||||
"rookiebwoy/late9": {
|
||||
"target": "rookiebwoy/late9/rev1"
|
||||
"target": "ivndbt/late9/rev1"
|
||||
},
|
||||
"rookiebwoy/neopad": {
|
||||
"target": "rookiebwoy/neopad/rev1"
|
||||
"target": "ivndbt/neopad/rev1"
|
||||
},
|
||||
"ivndbt/late9": {
|
||||
"target": "ivndbt/late9/rev1"
|
||||
},
|
||||
"ivndbt/neopad": {
|
||||
"target": "ivndbt/neopad/rev1"
|
||||
},
|
||||
"rura66": {
|
||||
"target": "rura66/rev1"
|
||||
|
|
@ -2202,8 +2265,17 @@
|
|||
"trnthsn/s6xty5neor2": {
|
||||
"target": "trnthsn/s6xty5neor2/stm32f103"
|
||||
},
|
||||
"tweetydabird/lotus58": {
|
||||
"target": "tweetydabird/lotus58/promicro"
|
||||
"tweetydabird/lotus58/elite_c": {
|
||||
"target": "tweetydabird/lotus58"
|
||||
},
|
||||
"tweetydabird/lotus58/nanoboot": {
|
||||
"target": "tweetydabird/lotus58"
|
||||
},
|
||||
"tweetydabird/lotus58/promicro": {
|
||||
"target": "tweetydabird/lotus58"
|
||||
},
|
||||
"tweetydabird/lotus58/rp2040_ce": {
|
||||
"target": "tweetydabird/lotus58"
|
||||
},
|
||||
"unison": {
|
||||
"target": "unison/v04"
|
||||
|
|
@ -2246,5 +2318,54 @@
|
|||
},
|
||||
"zsa/planck_ez": {
|
||||
"target": "zsa/planck_ez/base"
|
||||
},
|
||||
// DEFAULT_FOLDER removed during 2025 Q3 cycle
|
||||
"cannonkeys/satisfaction75": {
|
||||
"target": "cannonkeys/satisfaction75/rev1"
|
||||
},
|
||||
"converter/adb_usb": {
|
||||
"target": "converter/adb_usb/rev1"
|
||||
},
|
||||
"converter/sun_usb": {
|
||||
"target": "converter/sun_usb/type5"
|
||||
},
|
||||
"converter/usb_usb": {
|
||||
"target": "converter/usb_usb/hasu"
|
||||
},
|
||||
"durgod/dgk6x": {
|
||||
"target": "durgod/dgk6x/hades_ansi"
|
||||
},
|
||||
"ergodox_ez": {
|
||||
"target": "ergodox_ez/base"
|
||||
},
|
||||
"ferris/0_2": {
|
||||
"target": "ferris/0_2/base"
|
||||
},
|
||||
"handwired/dygma/raise": {
|
||||
"target": "handwired/dygma/raise/ansi"
|
||||
},
|
||||
"helix/rev3_4rows": {
|
||||
"target": "helix/rev3"
|
||||
},
|
||||
"helix/rev3_5rows": {
|
||||
"target": "helix/rev3"
|
||||
},
|
||||
"ibm/model_m/mschwingen": {
|
||||
"target": "ibm/model_m/mschwingen/led_wired"
|
||||
},
|
||||
"mechwild/sugarglider": {
|
||||
"target": "mechwild/sugarglider/wide_oled/f401"
|
||||
},
|
||||
"mechwild/sugarglider/wide_oled": {
|
||||
"target": "mechwild/sugarglider/wide_oled/f401"
|
||||
},
|
||||
"novelkeys/nk65": {
|
||||
"target": "novelkeys/nk65/v1"
|
||||
},
|
||||
"novelkeys/nk65/base": {
|
||||
"target": "novelkeys/nk65/v1"
|
||||
},
|
||||
"sirius/uni660/rev2": {
|
||||
"target": "sirius/uni660/rev2/ansi"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"$id": "qmk.api.keyboard.v1",
|
||||
"allOf": [
|
||||
{"$ref": "qmk.keyboard.v1"},
|
||||
{"$ref": "./keyboard.jsonschema#"},
|
||||
{
|
||||
"properties": {
|
||||
"keymaps": {
|
||||
|
|
@ -10,8 +10,8 @@
|
|||
"url": {"type": "string"}
|
||||
}
|
||||
},
|
||||
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"},
|
||||
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"},
|
||||
"parse_errors": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||
"parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"},
|
||||
"processor_type": {"type": "string"},
|
||||
"protocol": {"type": "string"},
|
||||
"keyboard_folder": {"type": "string"},
|
||||
|
|
|
|||
|
|
@ -3,16 +3,16 @@
|
|||
"$id": "qmk.community_module.v1",
|
||||
"title": "Community Module Information",
|
||||
"type": "object",
|
||||
"required": ["module_name", "maintainer"]
|
||||
"required": ["module_name", "maintainer"],
|
||||
"properties": {
|
||||
"module_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"module_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"license": {"type": "string"},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"},
|
||||
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||
"features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,9 @@
|
|||
"additionalProperties": false,
|
||||
"required": ["pin_a", "pin_b"],
|
||||
"properties": {
|
||||
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -28,22 +28,22 @@
|
|||
"dip_switch_config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||
}
|
||||
}
|
||||
"features_config": {
|
||||
"$ref": "qmk.definitions.v1#/boolean_array",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"not": {"required": ["lto"]}
|
||||
},
|
||||
"features_config": {
|
||||
"$ref": "./definitions.jsonschema#/boolean_array",
|
||||
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||
"not": {"required": ["lto"]}
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
||||
"properties": {
|
||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"},
|
||||
"maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
|
|
@ -84,6 +84,7 @@
|
|||
"STM32F407",
|
||||
"STM32F411",
|
||||
"STM32F446",
|
||||
"STM32G0B1",
|
||||
"STM32G431",
|
||||
"STM32G474",
|
||||
"STM32H723",
|
||||
|
|
@ -118,8 +119,8 @@
|
|||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"default_brightness": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
|
|
@ -144,13 +145,13 @@
|
|||
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
|
||||
},
|
||||
"macro_beep": {"type": "boolean"},
|
||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||
"power_control": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
||||
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||
}
|
||||
},
|
||||
"voices": {"type": "boolean"}
|
||||
|
|
@ -170,23 +171,45 @@
|
|||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"breathing": {"type": "boolean"},
|
||||
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"breathing": {"type": "boolean"},
|
||||
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"levels": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 31
|
||||
},
|
||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"},
|
||||
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||
"on_state": {"$ref": "./definitions.jsonschema#/bit"},
|
||||
"as_caps_lock": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"battery": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["adc", "custom", "vendor"]
|
||||
},
|
||||
"adc": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"reference_voltage": {"type": "integer"},
|
||||
"divider_r1": {"type": "integer"},
|
||||
"divider_r2": {"type": "integer"},
|
||||
"resolution": {"type": "integer"}
|
||||
}
|
||||
},
|
||||
"sample_interval": {"type": "integer"}
|
||||
}
|
||||
},
|
||||
"bluetooth": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -268,7 +291,7 @@
|
|||
"type": "string",
|
||||
"enum": ["COL2ROW", "ROW2COL"]
|
||||
},
|
||||
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"caps_word": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -276,20 +299,20 @@
|
|||
"enabled": {"type": "boolean"},
|
||||
"both_shifts_turns_on": {"type": "boolean"},
|
||||
"double_tap_shift_turns_on": {"type": "boolean"},
|
||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"invert_on_shift": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"combo": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"community_layouts": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/filename"}
|
||||
},
|
||||
"dip_switch": {
|
||||
"$ref": "#/definitions/dip_switch_config",
|
||||
|
|
@ -319,10 +342,10 @@
|
|||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
|
||||
"enum": ["none", "custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
|
||||
},
|
||||
"backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -337,12 +360,12 @@
|
|||
"indicators": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
|
||||
"caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"compose": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"kana": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"on_state": {"$ref": "./definitions.jsonschema#/bit"}
|
||||
}
|
||||
},
|
||||
"joystick": {
|
||||
|
|
@ -350,20 +373,20 @@
|
|||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"driver": {"type": "string"},
|
||||
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"axes": {
|
||||
"type": "object",
|
||||
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}
|
||||
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]},
|
||||
"additionalProperties": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"low": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"rest": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"high": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -375,20 +398,20 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||
"layer_lock": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"layout_aliases": {
|
||||
"type": "object",
|
||||
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
|
||||
"additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"}
|
||||
},
|
||||
"layouts": {
|
||||
"type": "object",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
||||
"propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -403,7 +426,7 @@
|
|||
"additionalProperties": false,
|
||||
"required": ["x", "y"],
|
||||
"properties": {
|
||||
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"pattern": "^[^\\n]*$"
|
||||
|
|
@ -417,13 +440,13 @@
|
|||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
|
||||
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
||||
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
||||
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"w": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"r": {"$ref": "./definitions.jsonschema#/signed_decimal"},
|
||||
"rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||
"ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
|
||||
"h": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||
"w": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||
"x": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||
"y": {"$ref": "./definitions.jsonschema#/key_unit"},
|
||||
"hand": {
|
||||
"type": "string",
|
||||
"enum": ["L", "R", "*"]
|
||||
|
|
@ -443,12 +466,24 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"host": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"nkro": {"type": "boolean"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"leader_key": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"timing": {"type": "boolean"},
|
||||
"strict_processing": {"type": "boolean"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"matrix_pins": {
|
||||
|
|
@ -458,14 +493,15 @@
|
|||
"custom": {"type": "boolean"},
|
||||
"custom_lite": {"type": "boolean"},
|
||||
"ghost": {"type": "boolean"},
|
||||
"input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"masked": {"type": "boolean"},
|
||||
"direct": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||
},
|
||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||
}
|
||||
},
|
||||
"modules": {
|
||||
|
|
@ -478,18 +514,18 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"oneshot": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"led_matrix": {
|
||||
|
|
@ -497,7 +533,7 @@
|
|||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"default": {
|
||||
|
|
@ -506,8 +542,8 @@
|
|||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {
|
||||
|
|
@ -533,21 +569,21 @@
|
|||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
},
|
||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"react_on_keyup": {"type": "boolean"},
|
||||
"sleep": {"type": "boolean"},
|
||||
"split_count": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
},
|
||||
"layout": {
|
||||
"type": "array",
|
||||
|
|
@ -565,9 +601,9 @@
|
|||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -578,7 +614,7 @@
|
|||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"default": {
|
||||
|
|
@ -587,10 +623,10 @@
|
|||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {
|
||||
|
|
@ -618,23 +654,23 @@
|
|||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
},
|
||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"react_on_keyup": {"type": "boolean"},
|
||||
"sleep": {"type": "boolean"},
|
||||
"split_count": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
},
|
||||
"layout": {
|
||||
"type": "array",
|
||||
|
|
@ -652,9 +688,9 @@
|
|||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -666,27 +702,27 @@
|
|||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
"hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["apa102", "custom", "ws2812"]
|
||||
},
|
||||
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"layers": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -701,29 +737,29 @@
|
|||
"override_rgb": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"led_map": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
},
|
||||
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"pin": {
|
||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
||||
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||
"$comment": "Deprecated: use ws2812.pin instead"
|
||||
},
|
||||
"rgbw": {
|
||||
"type": "boolean",
|
||||
"$comment": "Deprecated: use ws2812.rgbw instead"
|
||||
},
|
||||
"saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"sleep": {"type": "boolean"},
|
||||
"split": {"type": "boolean"},
|
||||
"split_count": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -732,8 +768,8 @@
|
|||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"unlock_sequence": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
|
|
@ -767,8 +803,8 @@
|
|||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"mouse_enabled": {"type": "boolean"},
|
||||
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["busywait", "interrupt", "usart", "vendor"]
|
||||
|
|
@ -805,11 +841,11 @@
|
|||
"properties": {
|
||||
"direct": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
"items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||
},
|
||||
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
"cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||
"rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
|
||||
"unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -836,22 +872,21 @@
|
|||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"matrix_grid": {
|
||||
"$ref": "qmk.definitions.v1#/mcu_pin_array",
|
||||
"$ref": "./definitions.jsonschema#/mcu_pin_array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"soft_serial_pin": {
|
||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
||||
"$ref": "./definitions.jsonschema#/mcu_pin",
|
||||
"$comment": "Deprecated: use split.serial.pin instead"
|
||||
},
|
||||
"soft_serial_speed": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 5
|
||||
"$comment": "Deprecated: use split.serial.speed instead"
|
||||
},
|
||||
"serial": {
|
||||
"type": "object",
|
||||
|
|
@ -861,7 +896,12 @@
|
|||
"type": "string",
|
||||
"enum": ["bitbang", "usart", "vendor"]
|
||||
},
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"speed": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 5
|
||||
}
|
||||
}
|
||||
},
|
||||
"transport": {
|
||||
|
|
@ -889,7 +929,7 @@
|
|||
}
|
||||
},
|
||||
"watchdog": {"type": "boolean"},
|
||||
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"sync_matrix_state": {
|
||||
"type": "boolean",
|
||||
"$comment": "Deprecated: use sync.matrix_state instead"
|
||||
|
|
@ -905,8 +945,8 @@
|
|||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"main": {
|
||||
|
|
@ -916,7 +956,7 @@
|
|||
},
|
||||
"matrix_grid": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"items": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
||||
}
|
||||
}
|
||||
|
|
@ -938,9 +978,9 @@
|
|||
"permissive_hold_per_key": {"type": "boolean"},
|
||||
"retro": {"type": "boolean"},
|
||||
"retro_per_key": {"type": "boolean"},
|
||||
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"term_per_key": {"type": "boolean"},
|
||||
"toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"usb": {
|
||||
|
|
@ -948,16 +988,20 @@
|
|||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"device_ver": {
|
||||
"$ref": "qmk.definitions.v1#/hex_number_4d",
|
||||
"$ref": "./definitions.jsonschema#/hex_number_4d",
|
||||
"$comment": "Deprecated: use device_version instead"
|
||||
},
|
||||
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
|
||||
"force_nkro": {"type": "boolean"},
|
||||
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"device_version": {"$ref": "./definitions.jsonschema#/bcd_version"},
|
||||
"force_nkro": {
|
||||
"type": "boolean",
|
||||
"$comment": "Deprecated: use host.default.nkro instead"
|
||||
|
||||
},
|
||||
"pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||
"vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
|
||||
"max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"no_startup_check": {"type": "boolean"},
|
||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"shared_endpoint": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -966,7 +1010,7 @@
|
|||
"mouse": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"wait_for_enumeration": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
|
|
@ -974,9 +1018,9 @@
|
|||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
|
||||
"tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
|
||||
"locking": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
|
@ -991,10 +1035,10 @@
|
|||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"led": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
||||
"esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"led": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"}
|
||||
}
|
||||
},
|
||||
"ws2812": {
|
||||
|
|
@ -1005,10 +1049,10 @@
|
|||
"type": "string",
|
||||
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
|
||||
},
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
|
||||
"rgbw": {"type": "boolean"},
|
||||
"i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"},
|
||||
"i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"},
|
||||
"i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,10 +30,10 @@
|
|||
"keycodes": {
|
||||
"type": "object",
|
||||
"propertyNames": {
|
||||
"$ref": "qmk.definitions.v1#/hex_number_4d"
|
||||
"$ref": "./definitions.jsonschema#/hex_number_4d"
|
||||
},
|
||||
"additionalProperties": {
|
||||
"type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed
|
||||
"type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed
|
||||
"required": [
|
||||
"key"
|
||||
],
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@
|
|||
"minLength": 1,
|
||||
"pattern": "^[a-z][0-9a-z_]*$"
|
||||
},
|
||||
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"layout": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
||||
"host_language": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"keymap": {"$ref": "./definitions.jsonschema#/text_identifier"},
|
||||
"layout": {"$ref": "./definitions.jsonschema#/layout_macro"},
|
||||
"layers": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
|
@ -55,11 +55,11 @@
|
|||
"keycodes": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "qmk.definitions.v1#/text_identifier"
|
||||
"$ref": "./definitions.jsonschema#/text_identifier"
|
||||
}
|
||||
},
|
||||
"duration": {
|
||||
"$ref": "qmk.definitions.v1#/unsigned_int"
|
||||
"$ref": "./definitions.jsonschema#/unsigned_int"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -67,8 +67,8 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"config": {"$ref": "qmk.keyboard.v1"},
|
||||
"keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
|
||||
"config": {"$ref": "./keyboard.jsonschema#"},
|
||||
"notes": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
],
|
||||
"properties": {
|
||||
"userspace_version": {
|
||||
"type": "string",
|
||||
},
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,10 +6,10 @@
|
|||
"definitions": {
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||
]
|
||||
},
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
|
|
|
|||
|
|
@ -6,11 +6,11 @@
|
|||
"definitions": {
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
{"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
|
||||
{"$ref": "./definitions.jsonschema#/keyboard_keymap_env"},
|
||||
{"$ref": "./definitions.jsonschema#/json_file_path"}
|
||||
]
|
||||
},
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@
|
|||
},
|
||||
"features": {
|
||||
"bootmagic": true,
|
||||
"command": false,
|
||||
"console": false,
|
||||
"extrakey": true,
|
||||
"mousekey": true,
|
||||
"nkro": true
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ Four times a year QMK runs a process for merging Breaking Changes. A Breaking Ch
|
|||
## Encoder flip
|
||||
|
||||
* Flips the encoder direction so that `clockwise == true` is for actually turning the knob clockwise
|
||||
* Adds `ENCODER_DIRECTION_FLIP` define, so that reversing the expected dirction is simple for users.
|
||||
* Adds `ENCODER_DIRECTION_FLIP` define, so that reversing the expected direction is simple for users.
|
||||
* Cleans up documentation page for encoders
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ These PRs move the V-USB driver code out of the qmk_firmware repository and into
|
|||
|
||||
Updates all of the per key tap-hold functions to pass the `keyrecord_t` structure, and include documentation changes.
|
||||
|
||||
Any remaining versions or code outside of the main repo will need to be converted:
|
||||
Any remaining versions or code outside of the main repo will need to be converted:
|
||||
| Old function | New Function |
|
||||
|------------------------------------------------------|---------------------------------------------------------------------------|
|
||||
|`uint16_t get_tapping_term(uint16_t keycode)` |`uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record)` |
|
||||
|
|
@ -38,7 +38,7 @@ After the next breaking change you will not be able to build if `bin/qmk hello`
|
|||
[#8269](https://github.com/qmk/qmk_firmware/pull/8269)
|
||||
|
||||
- Provides debug functionality on ChibiOS/ARM that is more compliant than previous integrations.
|
||||
- Less maintenence, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues.
|
||||
- Less maintenance, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues.
|
||||
- A `make git-submodule` may be required after pulling the latest QMK Firmware code to update to the new dependency.
|
||||
|
||||
### Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup
|
||||
|
|
@ -51,8 +51,10 @@ After the next breaking change you will not be able to build if `bin/qmk hello`
|
|||
|
||||
The `RGB_DISABLE_AFTER_TIMEOUT` definition is now deprecated, and has been superseded by `RGB_DISABLE_TIMEOUT`. To use the new definition, rename `RGB_DISABLE_AFTER_TIMEOUT` to `RGB_DISABLE_TIMEOUT` in your `config.h` file, and multiply the value set by 1200.
|
||||
|
||||
Before: `#define RGB_DISABLE_AFTER_TIMEOUT 100`
|
||||
After: `#define RGB_DISABLE_TIMEOUT 120000`
|
||||
```diff
|
||||
-#define RGB_DISABLE_AFTER_TIMEOUT 100
|
||||
+#define RGB_DISABLE_TIMEOUT 120000
|
||||
```
|
||||
|
||||
### Switch to qmk forks for everything
|
||||
|
||||
|
|
@ -103,8 +105,8 @@ This allows current lily58 firmware to advance with updates to the `split_common
|
|||
- Alternatively, if you did not change the OLED code from that in `default`, you may find it easier to simply copy the [relevant section](https://github.com/qmk/qmk_firmware/blob/4ac310668501ae6786c711ecc8f01f62ddaa1c0b/keyboards/lily58/keymaps/default/keymap.c#L138-L172). Otherwise, the changes you need to make are as follows (sample change [here](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7R138-R173))
|
||||
- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L138-L141) the block
|
||||
```c
|
||||
#ifdef SSD1306OLED
|
||||
iota_gfx_init(!has_usb()); // turns on the display
|
||||
#ifdef SSD1306OLED
|
||||
iota_gfx_init(!has_usb()); // turns on the display
|
||||
#endif
|
||||
```
|
||||
- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
|
||||
|
|
@ -127,7 +129,7 @@ oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
|||
|
||||
* Refactor to use split_common and remove split codes under the zinc/revx/
|
||||
* Add - backlight RGB LED and/or underglow RGB LED option
|
||||
* Add - continuous RGB animations feature (between L and R halves)
|
||||
* Add - continuous RGB animations feature (between L and R halves)
|
||||
* Fix - keymap files to adapt to changes
|
||||
* all authors of keymaps confirmed this PR
|
||||
* Update - documents and rules.mk
|
||||
|
|
@ -164,8 +166,8 @@ void keyboard_pre_init_kb(void) {
|
|||
- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
|
||||
- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L91-L158) the block
|
||||
```c
|
||||
#ifdef SSD1306OLED
|
||||
iota_gfx_init(!has_usb()); // turns on the display
|
||||
#ifdef SSD1306OLED
|
||||
iota_gfx_init(!has_usb()); // turns on the display
|
||||
#endif
|
||||
```
|
||||
- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ Added support for MK66F18 (Teensy 3.6) microcontroller.
|
|||
|
||||
### New command: qmk console ([#12828](https://github.com/qmk/qmk_firmware/pull/12828)) {#new-command-qmk-console}
|
||||
|
||||
A new `qmk console` command has been added for attaching to your keyboard's console. It operates similiarly to QMK Toolbox by allowing you to connect to one or more keyboard consoles to display debugging messages.
|
||||
A new `qmk console` command has been added for attaching to your keyboard's console. It operates similarly to QMK Toolbox by allowing you to connect to one or more keyboard consoles to display debugging messages.
|
||||
|
||||
### Improved command: qmk config {#improve-command-qmk-config}
|
||||
|
||||
|
|
@ -121,8 +121,8 @@ bool encoder_update_user(uint8_t index, bool clockwise) {
|
|||
tap_code(KC_UP);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
// If you return true, this will allow the keyboard level code to run, as well.
|
||||
return true;
|
||||
// If you return true, this will allow the keyboard level code to run, as well.
|
||||
//Returning false will override the keyboard level code. Depending on how the keyboard level function is set up.
|
||||
}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ void dip_switch_update_user(uint8_t index, bool active) {
|
|||
}
|
||||
}
|
||||
|
||||
void dip_switch_update_mask_kb(uint32_t state) {
|
||||
void dip_switch_update_mask_kb(uint32_t state) {
|
||||
dip_switch_update_mask_user(state);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ Bootloader configuration is no longer assumed. Keyboards must now set either:
|
|||
|
||||
### Rename `AdafruitBLE` to `BluefruitLE` ([#16127](https://github.com/qmk/qmk_firmware/pull/16127))
|
||||
|
||||
In preparation of future bluetooth work, the `AdafruitBLE` integration has been renamed to allow potential for any other Adafruit BLE products.
|
||||
In preparation of future bluetooth work, the `AdafruitBLE` integration has been renamed to allow potential for any other Adafruit BLE products.
|
||||
|
||||
### Updated Keyboard Codebases {#updated-keyboard-codebases}
|
||||
|
||||
|
|
|
|||
299
docs/ChangeLog/20250525.md
Normal file
299
docs/ChangeLog/20250525.md
Normal file
|
|
@ -0,0 +1,299 @@
|
|||
# QMK Breaking Changes - 2025 May 25 Changelog
|
||||
|
||||
## Notable Features
|
||||
|
||||
### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||
|
||||
Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
|
||||
|
||||
Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
|
||||
|
||||
See the [Flow Tap documentation](../tap_hold#flow-tap) for more information.
|
||||
|
||||
### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||
|
||||
Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks.
|
||||
|
||||
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|------------------------|----------------------|
|
||||
| chew | chew/split |
|
||||
| deemen17/de60fs | deemen17/de60/r1 |
|
||||
| keyten/kt60hs_t | keyten/kt60hs_t/v1 |
|
||||
| plywrks/ply8x | plywrks/ply8x/solder |
|
||||
| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 |
|
||||
| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 |
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||
|
||||
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||
|
||||
### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||
|
||||
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
|
||||
|
||||
The new defaults can be configured in the following ways:
|
||||
|
||||
:::::tabs
|
||||
|
||||
==== keyboard.json
|
||||
|
||||
```json [keyboard.json]
|
||||
{
|
||||
"host": { // [!code focus]
|
||||
"default": { // [!code focus]
|
||||
"nkro": true // [!code focus]
|
||||
} // [!code focus]
|
||||
} // [!code focus]
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
==== keymap.json
|
||||
|
||||
```json [keymap.json]
|
||||
{
|
||||
"config": {
|
||||
"host": { // [!code focus]
|
||||
"default": { // [!code focus]
|
||||
"nkro": true // [!code focus]
|
||||
} // [!code focus]
|
||||
} // [!code focus]
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
==== config.h
|
||||
|
||||
```c [config.h]
|
||||
#pragma once
|
||||
|
||||
#define NKRO_DEFAULT_ON true // [!code focus]
|
||||
```
|
||||
|
||||
:::::
|
||||
|
||||
The deprecated options will be removed in a future breaking changes cycle.
|
||||
|
||||
### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||
|
||||
Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`.
|
||||
|
||||
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||
|
||||
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
|
||||
|
||||
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||
Parent folders containing common configuration would create invalid build targets.
|
||||
|
||||
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
|
||||
|
||||
Backwards compatibility of build targets has been maintained where possible.
|
||||
|
||||
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
|
||||
|
||||
Converter support will be further limited to only function if a keyboard declares that is is compatible.
|
||||
|
||||
This can be configured in the following ways:
|
||||
|
||||
:::::tabs
|
||||
|
||||
==== keyboard.json
|
||||
|
||||
```json [keyboard.json]
|
||||
{
|
||||
"development_board": "promicro", // [!code focus]
|
||||
}
|
||||
```
|
||||
|
||||
==== rules.mk
|
||||
|
||||
```make [rules.mk]
|
||||
PIN_COMPATIBLE = promicro
|
||||
```
|
||||
|
||||
:::::
|
||||
|
||||
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||
|
||||
### Deprecation of `encoder_update_{kb|user}`
|
||||
|
||||
These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map).
|
||||
|
||||
`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely.
|
||||
|
||||
To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`:
|
||||
|
||||
:::::tabs
|
||||
|
||||
=== 1. Add keycode definitions
|
||||
|
||||
Define new keycodes:
|
||||
|
||||
```c
|
||||
enum {
|
||||
MY_ENCODER_LEFT = QK_USER, // [!code focus]
|
||||
MY_ENCODER_RIGHT, // [!code focus]
|
||||
};
|
||||
```
|
||||
|
||||
=== 2. Add encoder mapping
|
||||
|
||||
Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence):
|
||||
|
||||
```c
|
||||
#if defined(ENCODER_MAP_ENABLE)
|
||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||
[0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus]
|
||||
[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
|
||||
};
|
||||
#endif
|
||||
```
|
||||
|
||||
=== 3. Add keycode processing
|
||||
|
||||
Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap:
|
||||
|
||||
```c
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case MY_ENCODER_LEFT: // [!code focus]
|
||||
if (record->event.pressed) { // [!code focus]
|
||||
// Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus]
|
||||
} // [!code focus]
|
||||
return false; // Skip all further processing of this keycode // [!code focus]
|
||||
case MY_ENCODER_RIGHT: // [!code focus]
|
||||
if (record->event.pressed) { // [!code focus]
|
||||
// Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus]
|
||||
} // [!code focus]
|
||||
return false; // Skip all further processing of this keycode // [!code focus]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
=== 4. Remove old code
|
||||
|
||||
Remove your implementation of `encoder_update_user` from your `keymap.c`.
|
||||
|
||||
::::::
|
||||
|
||||
If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356))
|
||||
* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423))
|
||||
* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666))
|
||||
* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787))
|
||||
* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952))
|
||||
* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990))
|
||||
* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042))
|
||||
* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050))
|
||||
* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
|
||||
* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
|
||||
* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129))
|
||||
* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135))
|
||||
* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141))
|
||||
* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171))
|
||||
* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173))
|
||||
* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176))
|
||||
* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184))
|
||||
* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187))
|
||||
* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199))
|
||||
* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200))
|
||||
* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201))
|
||||
* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203))
|
||||
* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207))
|
||||
* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219))
|
||||
* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255))
|
||||
* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
|
||||
* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271))
|
||||
* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280))
|
||||
|
||||
CLI:
|
||||
* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553))
|
||||
* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680))
|
||||
* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061))
|
||||
* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085))
|
||||
* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116))
|
||||
* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149))
|
||||
* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182))
|
||||
* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
|
||||
* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251))
|
||||
|
||||
Submodule updates:
|
||||
* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301))
|
||||
* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178))
|
||||
* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274))
|
||||
|
||||
Keyboards:
|
||||
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459))
|
||||
* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558))
|
||||
* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884))
|
||||
* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690))
|
||||
* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723))
|
||||
* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764))
|
||||
* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785))
|
||||
* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932))
|
||||
* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001))
|
||||
* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005))
|
||||
* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010))
|
||||
* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046))
|
||||
* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070))
|
||||
* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080))
|
||||
* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088))
|
||||
* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142))
|
||||
* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146))
|
||||
* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157))
|
||||
* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169))
|
||||
* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181))
|
||||
* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189))
|
||||
* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190))
|
||||
* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193))
|
||||
* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208))
|
||||
* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246))
|
||||
* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266))
|
||||
* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268))
|
||||
* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287))
|
||||
* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288))
|
||||
* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293))
|
||||
* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018))
|
||||
* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209))
|
||||
* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295))
|
||||
|
||||
Others:
|
||||
* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997))
|
||||
* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191))
|
||||
|
||||
Bugs:
|
||||
* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015))
|
||||
* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060))
|
||||
* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121))
|
||||
* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166))
|
||||
* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175))
|
||||
* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194))
|
||||
* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204))
|
||||
* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210))
|
||||
* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238))
|
||||
* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250))
|
||||
* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254))
|
||||
* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263))
|
||||
* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272))
|
||||
* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298))
|
||||
181
docs/ChangeLog/20250831.md
Normal file
181
docs/ChangeLog/20250831.md
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
# QMK Breaking Changes - 2025 Aug 31 Changelog
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|--------------------------------------|----------------------------------|
|
||||
| bastardkb/charybdis/3x5/v2/elitec | bastardkb/charybdis/3x5/elitec |
|
||||
| bastardkb/charybdis/3x5/v2/splinky_2 | bastardkb/charybdis/3x5/elitec |
|
||||
| bastardkb/charybdis/3x5/v2/splinky_3 | bastardkb/charybdis/3x5/elitec |
|
||||
| bastardkb/charybdis/3x5/v2/stemcell | bastardkb/charybdis/3x5/elitec |
|
||||
| bastardkb/charybdis/3x6/v2/elitec | bastardkb/charybdis/3x6/elitec |
|
||||
| bastardkb/charybdis/3x6/v2/splinky_2 | bastardkb/charybdis/3x6/elitec |
|
||||
| bastardkb/charybdis/3x6/v2/splinky_3 | bastardkb/charybdis/3x6/elitec |
|
||||
| bastardkb/charybdis/3x6/v2/stemcell | bastardkb/charybdis/3x6/elitec |
|
||||
| bastardkb/charybdis/4x6/v2/elitec | bastardkb/charybdis/4x6/elitec |
|
||||
| bastardkb/charybdis/4x6/v2/splinky_2 | bastardkb/charybdis/4x6/elitec |
|
||||
| bastardkb/charybdis/4x6/v2/splinky_3 | bastardkb/charybdis/4x6/elitec |
|
||||
| bastardkb/charybdis/4x6/v2/stemcell | bastardkb/charybdis/4x6/elitec |
|
||||
| bastardkb/dilemma/3x5_2/splinky | bastardkb/dilemma/3x5_2/promicro |
|
||||
| bastardkb/scylla/v2/elitec | bastardkb/scylla/promicro |
|
||||
| bastardkb/scylla/v2/splinky_2 | bastardkb/scylla/promicro |
|
||||
| bastardkb/scylla/v2/splinky_3 | bastardkb/scylla/promicro |
|
||||
| bastardkb/scylla/v2/stemcell | bastardkb/scylla/promicro |
|
||||
| bastardkb/skeletyl/v2/elitec | bastardkb/skeletyl/promicro |
|
||||
| bastardkb/skeletyl/v2/splinky_2 | bastardkb/skeletyl/promicro |
|
||||
| bastardkb/skeletyl/v2/splinky_3 | bastardkb/skeletyl/promicro |
|
||||
| bastardkb/skeletyl/v2/stemcell | bastardkb/skeletyl/promicro |
|
||||
| bastardkb/tbkmini/v2/elitec | bastardkb/tbkmini/promicro |
|
||||
| bastardkb/tbkmini/v2/splinky_2 | bastardkb/tbkmini/promicro |
|
||||
| bastardkb/tbkmini/v2/splinky_3 | bastardkb/tbkmini/promicro |
|
||||
| bastardkb/tbkmini/v2/stemcell | bastardkb/tbkmini/promicro |
|
||||
| helix/rev2 | helix/beta |
|
||||
| helix/rev3_4rows | helix/rev3 |
|
||||
| helix/rev3_5rows | helix/rev3 |
|
||||
| kprepublic/cstc40/daughterboard | kprepublic/cstc40/rev1 |
|
||||
| kprepublic/cstc40/single_pcb | kprepublic/cstc40/rev2 |
|
||||
| ll3macorn/bongopad | ll3ma/bongopad |
|
||||
| novelkeys/nk65/base | novelkeys/nk65/v1 |
|
||||
| tweetydabird/lotus58/elite_c | tweetydabird/lotus58 |
|
||||
| tweetydabird/lotus58/nanoboot | tweetydabird/lotus58 |
|
||||
| tweetydabird/lotus58/promicro | tweetydabird/lotus58 |
|
||||
| tweetydabird/lotus58/rp2040_ce | tweetydabird/lotus58 |
|
||||
|
||||
### Mitigate VIA keylogger security issues [#25414](https://github.com/qmk/qmk_firmware/pull/25414)
|
||||
|
||||
VIA's keyboard matrix testing functionality, which allows users to identify active key presses, has been identified as a potential security concern by community members and security researchers. This feature has been demonstrated to enable unauthorized keystroke capture, with documented examples showing how malicious scripts could exploit this capability to create keyloggers. A recent security assessment revealed that user credentials could be compromised by exploiting the matrix testing function combined with VIA's keycode assignment queries. In this attack scenario, a script could remain active during a locked session and capture password input when users authenticate upon return.
|
||||
|
||||
The QMK team notified the VIA team of this security vulnerability on May 17, 2022, and made multiple subsequent attempts to coordinate a mitigation strategy. Despite repeated outreach, the VIA team has provided no acknowledgment or response to these security concerns. Given the severity of the potential security implications and the lack of engagement from the VIA team, the QMK team has unilaterally implemented a security enhancement that modifies the keyboard matrix testing functionality to prevent the reporting of key press events. This change prioritizes user security and data protection over potential feature compatibility concerns within VIA.
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
|
||||
|
||||
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
|
||||
Parent folders containing common configuration would create invalid build targets.
|
||||
|
||||
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
|
||||
The `DEFAULT_FOLDER` functionality is now removed with the intent that `rules.mk` is now pure configuration.
|
||||
|
||||
Backwards compatibility of build targets has been maintained where possible.
|
||||
|
||||
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
|
||||
|
||||
Converter support has been further limited to only function if a keyboard declares that it is compatible.
|
||||
|
||||
This can be configured in the following ways:
|
||||
|
||||
:::::tabs
|
||||
|
||||
==== keyboard.json
|
||||
|
||||
```json [keyboard.json]
|
||||
{
|
||||
"development_board": "promicro", // [!code focus]
|
||||
}
|
||||
```
|
||||
|
||||
==== rules.mk
|
||||
|
||||
```make [rules.mk]
|
||||
PIN_COMPATIBLE = promicro
|
||||
```
|
||||
|
||||
:::::
|
||||
|
||||
see the [Converters Feature](../feature_converters) documentation for more information.
|
||||
|
||||
### Removal of deprecated RGB and Mouse keycodes ([#25444](https://github.com/qmk/qmk_firmware/pull/25444))
|
||||
|
||||
Backwards compatibility of deprecated RGB and Mouse keycodes has been removed.
|
||||
|
||||
See the following documentation for the list of currently supported keycodes:
|
||||
|
||||
* [RGB Lighting](../features/rgblight#keycodes)
|
||||
* [RGB Matrix](../features/rgb_matrix#keycodes)
|
||||
* [Mouse keys](../features/mouse_keys#mapping-mouse-actions)
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Remove converter assumption that everything is a promicro ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
|
||||
* Remove `DEFAULT_FOLDER` handling ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
|
||||
* Add core handling for pointing device failures. ([#25315](https://github.com/qmk/qmk_firmware/pull/25315))
|
||||
* Relocate remaining `process_record_quantum` keycodes ([#25328](https://github.com/qmk/qmk_firmware/pull/25328))
|
||||
* Remove `process_action_kb` callback ([#25331](https://github.com/qmk/qmk_firmware/pull/25331))
|
||||
* Add `{rgb|led}_matrix_get_mode_name()`. ([#25344](https://github.com/qmk/qmk_firmware/pull/25344))
|
||||
* Align sleep_led logic ([#25395](https://github.com/qmk/qmk_firmware/pull/25395))
|
||||
* Mitigate VIA keylogger security issues ([#25414](https://github.com/qmk/qmk_firmware/pull/25414))
|
||||
* Deprecate some nonstandard mod & mod-tap keycode aliases ([#25437](https://github.com/qmk/qmk_firmware/pull/25437))
|
||||
* Refactor Starlight Smooth matrix effect ([#25442](https://github.com/qmk/qmk_firmware/pull/25442))
|
||||
* Remove deprecated `RGB_` and Mouse keycodes ([#25444](https://github.com/qmk/qmk_firmware/pull/25444))
|
||||
* Configure SPI for `QMK_PM2040` board ([#25481](https://github.com/qmk/qmk_firmware/pull/25481))
|
||||
* Configure SPI for `STEMCELL` board ([#25486](https://github.com/qmk/qmk_firmware/pull/25486))
|
||||
* Configure SPI for `QMK_BLOK` board ([#25487](https://github.com/qmk/qmk_firmware/pull/25487))
|
||||
* Clamp reactive offset value ([#25489](https://github.com/qmk/qmk_firmware/pull/25489))
|
||||
* Relocate `AUDIO_INIT_DELAY` implementation ([#25491](https://github.com/qmk/qmk_firmware/pull/25491))
|
||||
* Add MATRIX_ROWS_PER_HAND definition ([#25513](https://github.com/qmk/qmk_firmware/pull/25513))
|
||||
* Refactor battery driver ([#25550](https://github.com/qmk/qmk_firmware/pull/25550))
|
||||
* Add cachyos as pattern when installing dependencies ([#25580](https://github.com/qmk/qmk_firmware/pull/25580))
|
||||
|
||||
CLI:
|
||||
* Add MATRIX_MASKED DD config ([#25383](https://github.com/qmk/qmk_firmware/pull/25383))
|
||||
* Ensure keyboard aliases do not point to themselves ([#25500](https://github.com/qmk/qmk_firmware/pull/25500))
|
||||
|
||||
Keyboards:
|
||||
* [Update] E8ghtyNeo caps indicator ([#25009](https://github.com/qmk/qmk_firmware/pull/25009))
|
||||
* Keychron C3 Pro `c3_pro.c` corrections ([#25049](https://github.com/qmk/qmk_firmware/pull/25049))
|
||||
* Update franky36 pid and vid ([#25160](https://github.com/qmk/qmk_firmware/pull/25160))
|
||||
* Added Encoder support for Soyuz ([#25279](https://github.com/qmk/qmk_firmware/pull/25279))
|
||||
* CSTC40 rev3 (FXTWINK) ([#25285](https://github.com/qmk/qmk_firmware/pull/25285))
|
||||
* Migrate remaining `DEFAULT_FOLDER` to keyboard aliases ([#25291](https://github.com/qmk/qmk_firmware/pull/25291))
|
||||
* Configure boards to use development_board - R ([#25316](https://github.com/qmk/qmk_firmware/pull/25316))
|
||||
* Configure boards to use development_board - P ([#25317](https://github.com/qmk/qmk_firmware/pull/25317))
|
||||
* Configure boards to use development_board - NO ([#25338](https://github.com/qmk/qmk_firmware/pull/25338))
|
||||
* Configure boards to use development_board - LM ([#25341](https://github.com/qmk/qmk_firmware/pull/25341))
|
||||
* maple_computing/launchpad - Remove broken `default_rgb` keymap ([#25342](https://github.com/qmk/qmk_firmware/pull/25342))
|
||||
* update winry25 VID and PID ([#25351](https://github.com/qmk/qmk_firmware/pull/25351))
|
||||
* Configure boards to use development_board - DE ([#25369](https://github.com/qmk/qmk_firmware/pull/25369))
|
||||
* Configure boards to use development_board - FGHIJ ([#25370](https://github.com/qmk/qmk_firmware/pull/25370))
|
||||
* refactor(mercutio): layouts & reformatting ([#25408](https://github.com/qmk/qmk_firmware/pull/25408))
|
||||
* Configure boards to use development_board - ABC ([#25417](https://github.com/qmk/qmk_firmware/pull/25417))
|
||||
* Configure boards to use development_board - K ([#25421](https://github.com/qmk/qmk_firmware/pull/25421))
|
||||
* Refactor `helix/pico` ([#25428](https://github.com/qmk/qmk_firmware/pull/25428))
|
||||
* Refactor `helix/rev2` ([#25429](https://github.com/qmk/qmk_firmware/pull/25429))
|
||||
* Refactor `helix/rev3_{4,5}rows` ([#25430](https://github.com/qmk/qmk_firmware/pull/25430))
|
||||
* Migrate `helix` common configuration ([#25433](https://github.com/qmk/qmk_firmware/pull/25433))
|
||||
* Refactor `bastardkb/tbkmini` ([#25438](https://github.com/qmk/qmk_firmware/pull/25438))
|
||||
* Convert `novelkeys/nk65` to use RGB Matrix ([#25450](https://github.com/qmk/qmk_firmware/pull/25450))
|
||||
* Convert moon to lite custom matrix ([#25452](https://github.com/qmk/qmk_firmware/pull/25452))
|
||||
* Refactor `bastardkb/skeletyl` ([#25456](https://github.com/qmk/qmk_firmware/pull/25456))
|
||||
* Refactor `bastardkb/scylla` ([#25459](https://github.com/qmk/qmk_firmware/pull/25459))
|
||||
* Refactor `bastardkb/dilemma/3x5_2` ([#25462](https://github.com/qmk/qmk_firmware/pull/25462))
|
||||
* Migrate `usb.force_nkro` to `host.default.nkro` ([#25468](https://github.com/qmk/qmk_firmware/pull/25468))
|
||||
* Give mouse report to pointing_device_task_user first in ploopyco devices ([#25475](https://github.com/qmk/qmk_firmware/pull/25475))
|
||||
* Refactor `bastardkb/charybdis/3x5` ([#25488](https://github.com/qmk/qmk_firmware/pull/25488))
|
||||
* Refactor `bastardkb/charybdis/3x6` ([#25493](https://github.com/qmk/qmk_firmware/pull/25493))
|
||||
* Refactor `bastardkb/charybdis/4x6` ([#25494](https://github.com/qmk/qmk_firmware/pull/25494))
|
||||
* Rebrand For Ll3ma Keyboards ([#25498](https://github.com/qmk/qmk_firmware/pull/25498))
|
||||
* Remove some encoder resolution that duplicate defaults ([#25517](https://github.com/qmk/qmk_firmware/pull/25517))
|
||||
* Remove overriding of `DF()` within keyboards ([#25541](https://github.com/qmk/qmk_firmware/pull/25541))
|
||||
* Refactor inland/kb83 ([#25542](https://github.com/qmk/qmk_firmware/pull/25542))
|
||||
* Refactor `tweetydabird/lotus58` ([#25547](https://github.com/qmk/qmk_firmware/pull/25547))
|
||||
* Swap spleeb to default GENERIC_PROMICRO_RP2040 board files ([#25564](https://github.com/qmk/qmk_firmware/pull/25564))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix `keebio/quefrency/rev1:default60` ([#25423](https://github.com/qmk/qmk_firmware/pull/25423))
|
||||
* Fixup `bastardkb/tbkmini` keymap's build target ([#25458](https://github.com/qmk/qmk_firmware/pull/25458))
|
||||
* Miscellaneous fixes for lint warnings ([#25469](https://github.com/qmk/qmk_firmware/pull/25469))
|
||||
* Fix pytest/has_community default keymap location ([#25471](https://github.com/qmk/qmk_firmware/pull/25471))
|
||||
* Fix serial speed DD configuration & migrate keyboards ([#25546](https://github.com/qmk/qmk_firmware/pull/25546))
|
||||
* Update rgb x coordinate of rightmost column ([#25556](https://github.com/qmk/qmk_firmware/pull/25556))
|
||||
|
||||
Bugs:
|
||||
* Fix buggy switch statement in quantum.c ([#25322](https://github.com/qmk/qmk_firmware/pull/25322))
|
||||
* Compilation fixes for `-fno-common` ([#25436](https://github.com/qmk/qmk_firmware/pull/25436))
|
||||
* Only userspace should be searched for keyboard aliases when locating keymaps ([#25477](https://github.com/qmk/qmk_firmware/pull/25477))
|
||||
* Allow `qmk flash <filename>` to flash AT32 boards ([#25497](https://github.com/qmk/qmk_firmware/pull/25497))
|
||||
|
|
@ -21,8 +21,14 @@
|
|||
{ "text": "Debugging QMK", "link": "/faq_debug" },
|
||||
{ "text": "Keymap FAQ", "link": "/faq_keymap" },
|
||||
{ "text": "Squeezing Space from AVR", "link": "/squeezing_avr" },
|
||||
{ "text": "Glossary", "link": "/reference_glossary" },
|
||||
{ "text": "License Violations", "link": "/license_violations" }
|
||||
{ "text": "Glossary", "link": "/reference_glossary" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Licensing",
|
||||
"items": [
|
||||
{ "text": "License Violations", "link": "/license_violations" },
|
||||
{ "text": "Proprietary Libraries", "link": "/proprietary_libs" }
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -169,6 +175,7 @@
|
|||
]
|
||||
},
|
||||
{ "text": "Audio", "link": "/features/audio" },
|
||||
{ "text": "Battery", "link": "/features/battery" },
|
||||
{ "text": "Bootmagic", "link": "/features/bootmagic" },
|
||||
{ "text": "Converters", "link": "/feature_converters" },
|
||||
{ "text": "Custom Matrix", "link": "/custom_matrix" },
|
||||
|
|
@ -207,7 +214,7 @@
|
|||
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||
{
|
||||
"text": "Most Recent ChangeLog",
|
||||
"link": "/ChangeLog/20250223"
|
||||
"link": "/ChangeLog/20250831"
|
||||
},
|
||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||
|
|
|
|||
|
|
@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
|
|||
|
||||
## What has been included in past Breaking Changes?
|
||||
|
||||
* [2025 Aug 31](ChangeLog/20250831)
|
||||
* [2025 May 25](ChangeLog/20250525)
|
||||
* [2025 Feb 23](ChangeLog/20250223)
|
||||
* [2024 Nov 24](ChangeLog/20241124)
|
||||
* [2024 Aug 25](ChangeLog/20240825)
|
||||
* [Older Breaking Changes](breaking_changes_history)
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for May 25, 2025.
|
||||
The next Breaking Change is scheduled for November 30, 2025.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* 2025 Feb 23 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2025 Apr 27 - `develop` closed to new PRs.
|
||||
* 2025 Apr 27 - Call for testers.
|
||||
* 2025 May 11 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2025 May 18 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2025 May 23 - `master` is locked, no PRs merged.
|
||||
* 2025 May 25 - Merge `develop` to `master`.
|
||||
* 2025 May 25 - `master` is unlocked. PRs can be merged again.
|
||||
* 2025 Aug 31 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2025 Nov 2 - `develop` closed to new PRs.
|
||||
* 2025 Nov 2 - Call for testers.
|
||||
* 2025 Nov 16 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2025 Nov 23 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2025 Nov 28 - `master` is locked, no PRs merged.
|
||||
* 2025 Nov 30 - Merge `develop` to `master`.
|
||||
* 2025 Nov 30 - `master` is unlocked. PRs can be merged again.
|
||||
|
||||
## What changes will be included?
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||
|
||||
* [2025 Aug 31](ChangeLog/20250831) - version 0.30.0
|
||||
* [2025 May 25](ChangeLog/20250525) - version 0.29.0
|
||||
* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0
|
||||
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
|
||||
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
||||
|
|
|
|||
12
docs/cli.md
12
docs/cli.md
|
|
@ -18,6 +18,18 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
|||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||
```
|
||||
|
||||
### Install Using uv {#install-using-uv}
|
||||
|
||||
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
|
||||
|
||||
```
|
||||
uv tool install qmk
|
||||
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
|
||||
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
|
||||
```
|
||||
|
||||
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
|
||||
|
||||
### Install Using pip {#install-using-easy_install-or-pip}
|
||||
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
|
|
|
|||
|
|
@ -17,12 +17,12 @@ qmk compile [-c] <configuratorExport.json>
|
|||
**Usage for Keymaps**:
|
||||
|
||||
```
|
||||
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] -kb <keyboard_name> -km <keymap_name>
|
||||
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] [--compiledb] -kb <keyboard> -km <keymap>
|
||||
```
|
||||
|
||||
**Usage in Keyboard Directory**:
|
||||
|
||||
Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap <keymap_name>`
|
||||
Must be in keyboard directory with a default keymap, or in keymap directory for keyboard, or supply one with `--keymap <keymap>`
|
||||
```
|
||||
qmk compile
|
||||
```
|
||||
|
|
@ -30,7 +30,7 @@ qmk compile
|
|||
**Usage for building all keyboards that support a specific keymap**:
|
||||
|
||||
```
|
||||
qmk compile -kb all -km <keymap_name>
|
||||
qmk compile -kb all -km <keymap>
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
|
@ -62,7 +62,7 @@ $ qmk compile
|
|||
|
||||
Must be under `qmk_firmware/layouts/`, and in a keymap folder.
|
||||
```
|
||||
qmk compile -kb <keyboard_name>
|
||||
qmk compile -kb <keyboard>
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
|
@ -77,11 +77,30 @@ $ qmk compile -kb dz60
|
|||
|
||||
It is possible to speed up compilation by adding the `-j`/`--parallel` flag.
|
||||
```
|
||||
qmk compile -j <num_jobs> -kb <keyboard_name>
|
||||
qmk compile -j <num_jobs> -kb <keyboard>
|
||||
```
|
||||
The `num_jobs` argument determines the maximum number of jobs that can be used. Setting it to zero will enable parallel compilation without limiting the maximum number of jobs.
|
||||
```
|
||||
qmk compile -j 0 -kb <keyboard_name>
|
||||
qmk compile -j 0 -kb <keyboard>
|
||||
```
|
||||
|
||||
**Compilation Database**:
|
||||
|
||||
Creates a `compile_commands.json` file.
|
||||
|
||||
Does 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)! Compiling using this argument can create this for you.
|
||||
|
||||
**Example:**
|
||||
|
||||
```
|
||||
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
||||
$ qmk compile --compiledb
|
||||
Ψ Making clean
|
||||
Ψ Gathering build instructions from make ........
|
||||
Ψ Found 63 compile commands
|
||||
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
||||
Ψ Compiling keymap with make ........
|
||||
... build log continues ...
|
||||
```
|
||||
|
||||
## `qmk flash`
|
||||
|
|
@ -101,7 +120,7 @@ qmk flash [-bl <bootloader>] [-c] [-e <var>=<value>] [-j <num_jobs>] <configurat
|
|||
**Usage for Keymaps**:
|
||||
|
||||
```
|
||||
qmk flash -kb <keyboard_name> -km <keymap_name> [-bl <bootloader>] [-c] [-e <var>=<value>] [-j <num_jobs>]
|
||||
qmk flash -kb <keyboard> -km <keymap_name> [-bl <bootloader>] [-c] [-e <var>=<value>] [-j <num_jobs>]
|
||||
```
|
||||
|
||||
**Usage for pre-compiled firmwares**:
|
||||
|
|
@ -612,14 +631,15 @@ This command compiles all the External Userspace build targets.
|
|||
**Usage**:
|
||||
|
||||
```
|
||||
qmk userspace-compile [-h] [-e ENV] [-n] [-c] [-j PARALLEL] [-t]
|
||||
qmk userspace-compile [-h] [-e ENV] [-p] [-n] [-c] [-j PARALLEL] [-t]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-e ENV, --env ENV Set a variable to be passed to make. May be passed multiple times.
|
||||
-e, --env ENV Set a variable to be passed to make. May be passed multiple times.
|
||||
-p, --print-failures Print failed builds.
|
||||
-n, --dry-run Don't actually build, just show the commands to be run.
|
||||
-c, --clean Remove object files before compiling.
|
||||
-j PARALLEL, --parallel PARALLEL
|
||||
-j, --parallel PARALLEL
|
||||
Set the number of parallel make jobs; 0 means unlimited.
|
||||
-t, --no-temp Remove temporary files during build.
|
||||
```
|
||||
|
|
@ -694,33 +714,6 @@ qmk format-c
|
|||
qmk format-c -b branch_name
|
||||
```
|
||||
|
||||
## `qmk generate-compilation-database`
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
||||
```
|
||||
|
||||
Creates a `compile_commands.json` file.
|
||||
|
||||
Does 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.
|
||||
|
||||
This 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.
|
||||
|
||||
**Example:**
|
||||
|
||||
```
|
||||
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
|
||||
$ qmk generate-compilation-database
|
||||
Ψ Making clean
|
||||
Ψ Gathering build instructions from make -n gh60/satan:colemak
|
||||
Ψ Found 50 compile commands
|
||||
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
|
||||
```
|
||||
|
||||
Now open your dev environment and live a squiggly-free life.
|
||||
|
||||
## `qmk docs`
|
||||
|
||||
This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936.
|
||||
|
|
@ -885,3 +878,13 @@ Run single test:
|
|||
```
|
||||
qmk test-c --test basic
|
||||
```
|
||||
|
||||
## `qmk generate-compilation-database`
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
|
||||
```
|
||||
|
||||
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
|
||||
|
|
|
|||
|
|
@ -140,8 +140,6 @@ If you define these options you will enable the associated feature, which may in
|
|||
|
||||
* `#define ENABLE_COMPILE_KEYCODE`
|
||||
* Enables the `QK_MAKE` keycode
|
||||
* `#define FORCE_NKRO`
|
||||
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
|
||||
* `#define STRICT_LAYER_RELEASE`
|
||||
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
|
||||
|
||||
|
|
@ -366,8 +364,6 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
|||
|
||||
## Build Options
|
||||
|
||||
* `DEFAULT_FOLDER`
|
||||
* Used to specify a default folder when a keyboard has more than one sub-folder.
|
||||
* `FIRMWARE_FORMAT`
|
||||
* Defines which format (bin, hex) is copied to the root `qmk_firmware` folder after building.
|
||||
* `SRC`
|
||||
|
|
@ -401,6 +397,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
|||
* `atmel-dfu`
|
||||
* `lufa-dfu`
|
||||
* `qmk-dfu`
|
||||
* `qmk-hid`
|
||||
* `halfkay`
|
||||
* `caterina`
|
||||
* `bootloadhid`
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ void keyboard_pre_init_user(void) {
|
|||
|
||||
This is called when the matrix is initialized, and after some of the hardware has been set up, but before many of the features have been initialized.
|
||||
|
||||
This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependant on where it's started.
|
||||
This is useful for setting up stuff that you may need elsewhere, but isn't hardware related nor is dependent on where it's started.
|
||||
|
||||
|
||||
### `matrix_init_*` Function Documentation
|
||||
|
|
@ -209,7 +209,7 @@ You should use this function if you need custom matrix scanning code. It can als
|
|||
|
||||
This function gets called at the end of all QMK processing, before starting the next iteration. You can safely assume that QMK has dealt with the last matrix scan at the time that these functions are invoked -- layer states have been updated, USB reports have been sent, LEDs have been updated, and displays have been drawn.
|
||||
|
||||
Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throtting their behaviour if you do indeed require implementing something special.
|
||||
Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To keep your board responsive, it's suggested to do as little as possible during these function calls, potentially throttling their behaviour if you do indeed require implementing something special.
|
||||
|
||||
### Example `void housekeeping_task_user(void)` implementation
|
||||
|
||||
|
|
@ -246,7 +246,7 @@ void check_rgb_timeout(void) {
|
|||
}
|
||||
}
|
||||
/* Then, call the above functions from QMK's built in post processing functions like so */
|
||||
/* Runs at the end of each scan loop, check if RGB timeout has occured or not */
|
||||
/* Runs at the end of each scan loop, check if RGB timeout has occurred or not */
|
||||
void housekeeping_task_user(void) {
|
||||
#ifdef RGBLIGHT_TIMEOUT
|
||||
check_rgb_timeout();
|
||||
|
|
@ -316,7 +316,7 @@ bool shutdown_kb(bool jump_to_bootloader) {
|
|||
if (!shutdown_user(jump_to_bootloader)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (jump_to_bootloader) {
|
||||
// red for bootloader
|
||||
rgb_matrix_set_color_all(RGB_OFF);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ This page describes how QMK's data driven JSON configuration system works. It is
|
|||
|
||||
Historically QMK has been configured through a combination of two mechanisms- `rules.mk` and `config.h`. While this worked well when QMK was only a handful of keyboards we've grown to encompass nearly 4000 supported keyboards. That extrapolates out to 6000 configuration files under `keyboards/` alone! The freeform nature of these files and the unique patterns people have used to avoid duplication have made ongoing maintenance a challenge, and a large number of our keyboards follow patterns that are outdated and sometimes harder to understand.
|
||||
|
||||
We have also been working on bringing the power of QMK to people who aren't comformable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use.
|
||||
We have also been working on bringing the power of QMK to people who aren't comfortable with a CLI, and other projects such as VIA are working to make using QMK as easy as installing a program. These tools need information about how a keyboard is laid out or what pins and features are available so that users can take full advantage of QMK. We introduced `info.json` as a first step towards this. The QMK API is an effort to combine these 3 sources of information- `config.h`, `rules.mk`, and `info.json`- into a single source of truth that end-user tools can use.
|
||||
|
||||
Now we have support for generating `rules.mk` and `config.h` values from `info.json`, allowing us to have a single source of truth. This will allow us to use automated tooling to maintain keyboards saving a lot of time and maintenance work.
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ If Zadig lists one or more devices with the `HidUsb` driver, your keyboard is pr
|
|||
|
||||
If the arrow appears green, select the driver, and click **Install Driver**. See the [list of known bootloaders](#list-of-known-bootloaders) for the correct driver to install.
|
||||
|
||||

|
||||

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

|
||||

|
||||
|
||||
Open the Device Manager, select **View → Devices by container**, and look for an entry with your keyboard's name.
|
||||
|
||||

|
||||

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

|
||||

|
||||
|
||||
Click **Action → Scan for hardware changes**. At this point, you should be able to type again. Double check in Zadig that the keyboard device(s) are using the `HidUsb` driver. If so, you're all done, and your board should be functional again! Otherwise, repeat this process until Zadig reports the correct driver.
|
||||
|
||||
|
|
@ -54,11 +54,11 @@ Open the Device Manager, select **View → Devices by container**, and look for
|
|||
|
||||
Find the `Inf name` value in the Details tab of the device properties. This should generally be something like `oemXX.inf`:
|
||||
|
||||

|
||||

|
||||
|
||||
Then, open a new Command Prompt window as an Administrator (type in `cmd` into the Start menu and press Ctrl+Shift+Enter). Run `pnputil /enum-drivers` to verify the `Inf name` matches the `Published Name` field of one of the entries:
|
||||
|
||||

|
||||

|
||||
|
||||
Run `pnputil /delete-driver oemXX.inf /uninstall`. This will delete the driver and remove it from any devices using it. Note that this will not uninstall the device itself.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
SPI 18x12 LED matrix driver by Awinic. Supports a maximum of four drivers, each controlling up to 216 single-color LEDs, or 72 RGB LEDs.
|
||||
|
||||
[AW20216S Datasheet](https://doc.awinic.com/doc/20230609wm/b6a9c70b-e1bd-495b-925f-bcbed3fc2620.pdf)
|
||||
[AW20216S Datasheet](https://doc.awinic.com/doc/202412/a055779b-49c0-4d09-8f04-73029f44b72b.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Battery Driver
|
||||
|
||||
This driver provides support for sampling battery level.
|
||||
This driver provides support for directly sampling battery level.
|
||||
|
||||
## Usage
|
||||
|
||||
|
|
@ -10,21 +10,17 @@ To use this driver, add the following to your `rules.mk`:
|
|||
BATTERY_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|--------------------------|--------|--------------------------------------------------|
|
||||
|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
|
||||
::::info Note
|
||||
This is already configured for you if you are using the [Battery](../features/battery) feature.
|
||||
::::
|
||||
|
||||
## Driver Configuration {#driver-configuration}
|
||||
|
||||
Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers.
|
||||
Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc`, `vendor`, or `custom`. See below for information on individual drivers.
|
||||
|
||||
### ADC Driver {#adc-driver}
|
||||
|
||||
This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
|
||||
The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
|
||||
|
||||
```make
|
||||
BATTERY_DRIVER = adc
|
||||
|
|
@ -32,20 +28,25 @@ BATTERY_DRIVER = adc
|
|||
|
||||
The following `#define`s apply only to the `adc` driver:
|
||||
|
||||
|Define |Default |Description |
|
||||
|-----------------------------|--------------|--------------------------------------------------------------|
|
||||
|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
|
||||
|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
|
||||
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
|
||||
|Define |Default |Description |
|
||||
|---------------------------------|--------------|--------------------------------------------------------------|
|
||||
|`BATTERY_ADC_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
|
||||
|`BATTERY_ADC_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
|
||||
|`BATTERY_ADC_VOLTAGE_DIVIDER_R1` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_ADC_VOLTAGE_DIVIDER_R2` |`100` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|
||||
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
|
||||
|
||||
## Functions
|
||||
### Custom Driver {#custom-driver}
|
||||
|
||||
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
|
||||
A custom driver is expected to implement the following interface:
|
||||
|
||||
Sample battery level.
|
||||
```c
|
||||
void battery_driver_init(void) {
|
||||
// Perform any initialisation here
|
||||
}
|
||||
|
||||
#### Return Value {#api-battery-get-percent-return}
|
||||
|
||||
The battery percentage, in the range 0-100.
|
||||
uint8_t battery_driver_sample_percent(void) {
|
||||
// Read and return current state here
|
||||
return value;
|
||||
}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3729_led_t PROGMEM g_is31fl3729_leds[IS31FL3729_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3742a_led_t PROGMEM g_is31fl3742a_leds[IS31FL3742A_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3743a_led_t PROGMEM g_is31fl3743a_leds[IS31FL3743A_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3745_led_t PROGMEM g_is31fl3745_leds[IS31FL3745_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3746a_led_t PROGMEM g_is31fl3746a_leds[IS31FL3746A_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ On ARM platforms the bitbang driver causes connection issues when using it toget
|
|||
+-------+ +-------+
|
||||
```
|
||||
|
||||
One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A TRS or USB cable provides enough conductors for this driver to function.
|
||||
One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A TRS or USB cable provides enough conductors for this driver to function.
|
||||
|
||||
### Setup
|
||||
|
||||
|
|
@ -63,12 +63,12 @@ SERIAL_DRIVER = bitbang
|
|||
|
||||
## USART Half-duplex
|
||||
|
||||
Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose Half-duplex over Bitbang if MCU is capable of utilising Half-duplex, and Full-duplex can't be used instead (e.g. lack of available GPIO pins, or imcompatible PCB design).
|
||||
Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose Half-duplex over Bitbang if MCU is capable of utilising Half-duplex, and Full-duplex can't be used instead (e.g. lack of available GPIO pins, or incompatible PCB design).
|
||||
|
||||
### Pin configuration
|
||||
|
||||
```
|
||||
LEFT RIGHT
|
||||
LEFT RIGHT
|
||||
+-------+ | | +-------+
|
||||
| | R R | |
|
||||
| | | SERIAL | | |
|
||||
|
|
@ -80,7 +80,7 @@ Targeting ARM boards based on ChibiOS, where communication is offloaded to a USA
|
|||
+-------+ +-------+
|
||||
```
|
||||
|
||||
Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Ensure that the pin chosen for split communication can operate as the TX pin of the contoller's USART peripheral. A TRS or USB cable provides enough conductors for this driver to function. As the split connection is configured to operate in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
|
||||
Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Ensure that the pin chosen for split communication can operate as the TX pin of the contoller's USART peripheral. A TRS or USB cable provides enough conductors for this driver to function. As the split connection is configured to operate in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
|
||||
|
||||
::: warning
|
||||
***Note:*** A pull-up resistor isn't required for RP2040 controllers configured with PIO subsystem.
|
||||
|
|
@ -278,7 +278,7 @@ There are several advanced configuration options that can be defined in your key
|
|||
|
||||
### Baudrate
|
||||
|
||||
If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions.
|
||||
If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions.
|
||||
|
||||
```c
|
||||
#define SELECT_SOFT_SERIAL_SPEED n
|
||||
|
|
@ -307,19 +307,19 @@ This is the default time window in milliseconds in which a successful communicat
|
|||
|
||||
## Troubleshooting
|
||||
|
||||
If you're having issues withe serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file:
|
||||
If you're having issues with serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file:
|
||||
|
||||
```c
|
||||
#define SERIAL_DEBUG
|
||||
```
|
||||
|
||||
|
||||
::: tip
|
||||
The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](../faq_debug).
|
||||
:::
|
||||
|
||||
## Alternate Functions for selected STM32 MCUs
|
||||
|
||||
Pins for USART Peripherals with
|
||||
Pins for USART Peripherals with
|
||||
|
||||
### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ Depending on the ChibiOS board configuration, you may need to [enable and config
|
|||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const snled27351_led_t PROGMEM g_snled27351_leds[SNLED27351_LED_COUNT] = {
|
||||
|
|
|
|||
|
|
@ -39,8 +39,6 @@ To enable SPI, modify your board's `halconf.h` to enable SPI, then modify your b
|
|||
#pragma once
|
||||
|
||||
#define HAL_USE_SPI TRUE // [!code focus]
|
||||
#define SPI_USE_WAIT TRUE // [!code focus]
|
||||
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
|
|
|||
|
|
@ -144,18 +144,30 @@ The following defines apply only to ARM devices:
|
|||
|`WS2812_T1L`|`(WS2812_TIMING - WS2812_T1H)`|The length of a "1" bit's low phase in nanoseconds (bitbang and PIO drivers only)|
|
||||
|`WS2812_T0L`|`(WS2812_TIMING - WS2812_T0H)`|The length of a "0" bit's low phase in nanoseconds (bitbang and PIO drivers only)|
|
||||
|
||||
### Push-Pull and Open Drain {#push-pull-open-drain}
|
||||
### Logic Levels {#logic-levels}
|
||||
|
||||
By default, the GPIO used for data transmission is configured as a *push-pull* output, meaning the pin is effectively always driven either to VCC or to ground.
|
||||
WS2812 LEDs usually operate at 5V, but some microcontrollers, particularly ARM-based ones, run on 3.3V. This can pose an issue when driving the LED chain as the logic level voltage is lower than the power supply voltage, leading to unreliable data transmission. There are two main workarounds:
|
||||
|
||||
For situations where the logic level voltage is lower than the power supply voltage, however, this can pose an issue. The solution is to configure the pin for *open drain* mode instead, and use a pullup resistor between the DI pin and VCC. In this mode, the MCU can only pull the GPIO *low*, or leave it floating. The pullup resistor is then responsible for pulling the line high, when the MCU is not driving the GPIO.
|
||||
#### 1. Open Drain Circuit {#open-drain-circuit}
|
||||
|
||||
To configure the DI pin for open drain configuration, add the following to your `config.h`:
|
||||
By default, `WS2812_DI_PIN` is configured as a *push-pull* output, meaning the pin is effectively always driven either to VCC or to ground; however, it can be configured in *open drain* mode instead.
|
||||
|
||||
In this mode, the MCU will only pull the GPIO *low*, and leaves it floating otherwise. A pullup resistor (typically around 10kΩ) between DI and 5V is then responsible for pulling the line high when the MCU is not driving the GPIO.
|
||||
|
||||
To use the DI pin in open drain configuration, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define WS2812_EXTERNAL_PULLUP
|
||||
```
|
||||
|
||||
::: warning
|
||||
Because the GPIO is being pulled to 5V in this situation rather than VCC (3.3V), **it must be a 5V tolerant pin**. Consult your MCU's datasheet first – if there are no eligible pins, you must use a level shifter instead.
|
||||
:::
|
||||
|
||||
#### 2. Level Shifter {#level-shifter}
|
||||
|
||||
A level shifter IC, such as the SN74LV1T34, can be placed between the GPIO and the first LED's DI pin to convert the 3.3V logic to 5V. This requires no additional configuration in the firmware, nor a 5V tolerant GPIO, but may be more expensive and is generally less handwire-friendly.
|
||||
|
||||
### SPI Driver {#arm-spi-driver}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to enable SPI at the keyboard level. For STM32, this would look like:
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ As its name implies Direct Pin works by connecting one switch per pin. The other
|
|||
|
||||
Here is a schematic showing how we connect a single button to pin A3 on a ProMicro:
|
||||
|
||||

|
||||

|
||||
|
||||
Once you have wired your switches you can assign keycodes to each pin and build a firmware by selecting the MCU you are using from the Keyboard dropdown. Use this link to show only Easy Maker Direct Pin:
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ Awesome! Open up a Pull Request for it. We'll review the code, and merge it!
|
|||
|
||||
That's amazing! We would love to assist you with that!
|
||||
|
||||
In fact, we have a [whole page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
|
||||
In fact, we have a [whole page](https://qmk.fm/trademark) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK.
|
||||
|
||||
If you have any questions about this, open an issue or head to [Discord](https://discord.gg/qmk).
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_
|
|||
There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here:
|
||||
|
||||
<!-- Source for this image: https://www.keyboard-layout-editor.com/#/gists/bf431647d1001cff5eff20ae55621e9a -->
|
||||

|
||||

|
||||
|
||||
## How Can I Make Custom Names For Complex Keycodes?
|
||||
|
||||
|
|
|
|||
|
|
@ -2,29 +2,40 @@
|
|||
|
||||
These allow you to combine a modifier with a keycode. When pressed, the keydown event for the modifier, then `kc` will be sent. On release, the keyup event for `kc`, then the modifier will be sent.
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|----------|----------------------------------|------------------------------------------------------|
|
||||
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
||||
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
||||
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
||||
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)` |Hold Left GUI and press `kc` |
|
||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
||||
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
||||
|`LSG(kc)` |`SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` |
|
||||
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
||||
|`LCA(kc)` | |Hold Left Control and Alt and press `kc` |
|
||||
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
||||
|`RSA(kc)` |`SAGR(kc)` |Hold Right Shift and Right Alt (AltGr) and press `kc` |
|
||||
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
||||
|`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` |
|
||||
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|
||||
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc` |
|
||||
|Key |Aliases |Description |
|
||||
|----------|-------------------------------|-------------------------------------------------------------------------------|
|
||||
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|
||||
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
|
||||
|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|
||||
|`LGUI(kc)`|`G(kc)`, `LCMD(kc)`, `LWIN(kc)`|Hold Left GUI and press `kc` |
|
||||
|`LCS(kc)` | |Hold Left Control and Left Shift and press `kc` |
|
||||
|`LCA(kc)` | |Hold Left Control and Left Alt and press `kc` |
|
||||
|`LCG(kc)` | |Hold Left Control and Left GUI and press `kc` |
|
||||
|`LSA(kc)` | |Hold Left Shift and Left Alt and press `kc` |
|
||||
|`LSG(kc)` | |Hold Left Shift and Left GUI and press `kc` |
|
||||
|`LAG(kc)` | |Hold Left Alt and Left GUI and press `kc` |
|
||||
|`LCSG(kc)`| |Hold Left Control, Left Shift and Left GUI and press `kc` |
|
||||
|`LCAG(kc)`| |Hold Left Control, Left Alt and Left GUI and press `kc` |
|
||||
|`LSAG(kc)`| |Hold Left Shift, Left Alt and Left GUI and press `kc` |
|
||||
|`RCTL(kc)`| |Hold Right Control and press `kc` |
|
||||
|`RSFT(kc)`| |Hold Right Shift and press `kc` |
|
||||
|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|
||||
|`RGUI(kc)`|`RCMD(kc)`, `RWIN(kc)` |Hold Right GUI and press `kc` |
|
||||
|`RCA(kc)` | |Hold Right Control and Right Alt and press `kc` |
|
||||
|`RCS(kc)` | |Hold Right Control and Right Shift and press `kc` |
|
||||
|`RCG(kc)` | |Hold Right Control and Right GUI and press `kc` |
|
||||
|`RSA(kc)` | |Hold Right Shift and Right Alt and press `kc` |
|
||||
|`RSG(kc)` | |Hold Right Shift and Right GUI and press `kc` |
|
||||
|`RAG(kc)` | |Hold Right Alt and Right GUI and press `kc` |
|
||||
|`RCSG(kc)`| |Hold Right Control, Right Shift and Right GUI and press `kc` |
|
||||
|`RCAG(kc)`| |Hold Right Control, Right Alt and Right GUI and press `kc` |
|
||||
|`RSAG(kc)`| |Hold Right Shift, Right Alt and Right GUI and press `kc` |
|
||||
|`MEH(kc)` | |Hold Left Control, Left Shift and Left Alt and press `kc` |
|
||||
|`HYPR(kc)`| |Hold Left Control, Left Shift, Left Alt and Left GUI and press `kc`<sup>1</sup>|
|
||||
|
||||
You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
|
||||
<sup>1. More information on the Hyper key can be found on [this blog post by Brett Terpstra](https://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/).</sup>
|
||||
|
||||
You can also chain them, for example `LCTL(LALT(KC_DEL))`, `C(A(KC_DEL))`, or `LCA(KC_DEL)` all make a key that sends Control+Alt+Delete with a single keypress.
|
||||
|
||||
# Checking Modifier State {#checking-modifier-state}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ susceptible to noise, you must choose a debounce method that will also mitigate
|
|||
* Debounce algorithms often have a 'debounce time' parameter, that specifies the maximum settling time of the switch contacts.
|
||||
This time might be measured in various units:
|
||||
* Cycles-based debouncing waits n cycles (scans), decreasing count by one each matrix_scan
|
||||
* Timestamp-based debouncing stores the millisecond timestamp a change occurred, and does substraction to figure out time elapsed.
|
||||
* Timestamp-based debouncing stores the millisecond timestamp a change occurred, and does subtraction to figure out time elapsed.
|
||||
* Timestamp-based debouncing is usually superior, especially in the case of noise-resistant devices because settling times of physical
|
||||
switches is specified in units of time, and should not depend on the matrix scan-rate of the keyboard.
|
||||
* Cycles-based debouncing is sometimes considered inferior, because the settling time that it is able to compensate for depends on the
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
|
||||
if (user_config.rgb_layer_change) { // only if this is enabled
|
||||
user_config.rgb_layer_change = false; // disable it, and
|
||||
eeconfig_update_user(user_config.raw); // write the setings to EEPROM
|
||||
eeconfig_update_user(user_config.raw); // write the settings to EEPROM
|
||||
}
|
||||
}
|
||||
return true; break;
|
||||
|
|
@ -109,7 +109,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
}
|
||||
}
|
||||
```
|
||||
And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EE_CLR` keycode or [Bootmagic](features/bootmagic) functionallity. For example, if you want to set rgb layer indication by default, and save the default valued.
|
||||
And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the `EE_CLR` keycode or [Bootmagic](features/bootmagic) functionality. For example, if you want to set rgb layer indication by default, and save the default valued.
|
||||
|
||||
```c
|
||||
void eeconfig_init_user(void) { // EEPROM is getting reset!
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ active layer until pressed again.
|
|||
|
||||
Currently, the `layer` argument of `LT()` is limited to layers 0-15, and the `kc` argument to the [Basic Keycode set](keycodes_basic), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. This is because QMK uses 16-bit keycodes, of which 4 bits are used for the function identifier and 4 bits for the layer, leaving only 8 bits for the keycode.
|
||||
|
||||
For a similar reason, the `layer` argument of `LM()` is also limited to layers 0-15 and the `mod` argument must fit within 5 bits. As a consequence, although left and right modifiers are supported by `LM()`, it is impossible to mix and match left and right modifiers. Specifying at least one right-hand modifier in a combination such as `MOD_RALT|MOD_LSFT` will convert *all* the listed modifiers to their right-hand counterpart. So, using the aforementionned mod-mask will actually send <kbd>Right Alt</kbd>+<kbd>Right Shift</kbd>. Make sure to use the `MOD_xxx` constants over alternative ways of specifying modifiers when defining your layer-mod key.
|
||||
For a similar reason, the `layer` argument of `LM()` is also limited to layers 0-15 and the `mod` argument must fit within 5 bits. As a consequence, although left and right modifiers are supported by `LM()`, it is impossible to mix and match left and right modifiers. Specifying at least one right-hand modifier in a combination such as `MOD_RALT|MOD_LSFT` will convert *all* the listed modifiers to their right-hand counterpart. So, using the aforementioned mod-mask will actually send <kbd>Right Alt</kbd>+<kbd>Right Shift</kbd>. Make sure to use the `MOD_xxx` constants over alternative ways of specifying modifiers when defining your layer-mod key.
|
||||
|
||||
| `LM(1,KC_LSFT)` | `LM(1,MOD_MASK_SHIFT)` | `LM(1,MOD_BIT(KC_LSFT))` | `LM(1,MOD_LSFT)` |
|
||||
|:---------------:|:----------------------:|:------------------------:|:----------------:|
|
||||
|
|
@ -61,27 +61,27 @@ Sometimes, you might want to switch between layers in a macro or as part of a ta
|
|||
|
||||
There are a number of functions (and variables) related to how you can use or manipulate the layers.
|
||||
|
||||
|Function |Description |
|
||||
|----------------------------------------------|---------------------------------------------------------------------------------------------------------|
|
||||
| `layer_state_set(layer_mask)` | Directly sets the layer state (avoid unless you know what you are doing). |
|
||||
| `layer_clear()` | Clears all layers (turns them all off). |
|
||||
| `layer_move(layer)` | Turns specified layer on, and all other layers off. |
|
||||
| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. |
|
||||
| `layer_off(layer)` | Turns specified layer off, leaves all other layers in existing state. |
|
||||
| `layer_invert(layer)` | Inverts/toggles the state of the specified layer |
|
||||
| `layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing layer state. |
|
||||
| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. |
|
||||
| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. |
|
||||
| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. |
|
||||
| `default_layer_set(layer_mask)` | Directly sets the default layer state (avoid unless you know what you are doing). |
|
||||
| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. |
|
||||
| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
|
||||
| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
|
||||
| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
|
||||
| [`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer, but does _not_ write it to persistent memory (EEPROM). |
|
||||
| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
|
||||
| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
|
||||
| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
||||
|Function |Description |
|
||||
|---------------------------------------------|--------------------------------------------------------------------------------------------------------|
|
||||
|`layer_state_set(layer_mask)` |Directly sets the layer state (avoid unless you know what you are doing). |
|
||||
|`layer_clear()` |Clears all layers (turns them all off). |
|
||||
|`layer_move(layer)` |Turns specified layer on, and all other layers off. |
|
||||
|`layer_on(layer)` |Turns specified layer on, leaves all other layers in existing state. |
|
||||
|`layer_off(layer)` |Turns specified layer off, leaves all other layers in existing state. |
|
||||
|`layer_invert(layer)` |Inverts/toggles the state of the specified layer |
|
||||
|`layer_or(layer_mask)` |Turns on layers based on matching bits between specified layer and existing layer state. |
|
||||
|`layer_and(layer_mask)` |Turns on layers based on matching enabled bits between specified layer and existing layer state. |
|
||||
|`layer_xor(layer_mask)` |Turns on layers based on non-matching bits between specified layer and existing layer state. |
|
||||
|`layer_debug(layer_mask)` |Prints out the current bit mask and highest active layer to debugger console. |
|
||||
|`default_layer_set(layer_mask)` |Directly sets the default layer state (avoid unless you know what you are doing). |
|
||||
|`default_layer_or(layer_mask)` |Turns on layers based on matching bits between specified layer and existing default layer state. |
|
||||
|`default_layer_and(layer_mask)` |Turns on layers based on matching enabled bits between specified layer and existing default layer state.|
|
||||
|`default_layer_xor(layer_mask)` |Turns on layers based on non-matching bits between specified layer and existing default layer state. |
|
||||
|`default_layer_debug(layer_mask)` |Prints out the current bit mask and highest active default layer to debugger console. |
|
||||
|[`set_single_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) |Sets the default layer, but does _not_ write it to persistent memory (EEPROM). |
|
||||
|[`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer)|Sets the default layer and writes it to persistent memory (EEPROM). |
|
||||
|[`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) |Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off).|
|
||||
|[`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) |Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
|
||||
|
||||
In addition to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passes the layer state to the function, where it can be read or modified.
|
||||
|
||||
|
|
@ -154,7 +154,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
switch (keycode) {
|
||||
case KC_CYCLE_LAYERS:
|
||||
// Our logic will happen on presses, nothing is done on releases
|
||||
if (!record->event.pressed) {
|
||||
if (!record->event.pressed) {
|
||||
// We've already handled the keycode (doing nothing), let QMK know so no further code is run unnecessarily
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,10 +24,10 @@ For example,
|
|||
|
||||
make planck:jack
|
||||
|
||||
Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`.
|
||||
Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`.
|
||||
|
||||
::: warning
|
||||
This `name` can be [overridden](#override-default-userspace), if needed.
|
||||
This `name` can be [overridden](#override-default-userspace), if needed.
|
||||
:::
|
||||
|
||||
## `Rules.mk`
|
||||
|
|
@ -38,9 +38,9 @@ It's highly recommended that you use `<name>.c` as the default source file to be
|
|||
|
||||
SRC += <name>.c
|
||||
|
||||
Additional files may be added in the same way - it's recommended you have one named `<name>`.c/.h to start off with, though.
|
||||
Additional files may be added in the same way - it's recommended you have one named `<name>`.c/.h to start off with, though.
|
||||
|
||||
The `/users/<name>/rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard.
|
||||
The `/users/<name>/rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard.
|
||||
|
||||
For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can add support for that if the RGBLIGHT feature is enabled:
|
||||
```make
|
||||
|
|
@ -82,7 +82,7 @@ You should use the `config.h` for [configuration options](config_options), and t
|
|||
|
||||
Please include authorship (your name, GitHub username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
|
||||
|
||||
You can use this as a template:
|
||||
You can use this as a template:
|
||||
```
|
||||
Copyright <year> <name> <email> @<github_username>
|
||||
|
||||
|
|
@ -100,9 +100,9 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
```
|
||||
|
||||
You'd want to replace the year, name, email and GitHub username with your info.
|
||||
You'd want to replace the year, name, email and GitHub username with your info.
|
||||
|
||||
Additionally, this is a good place to document your code, if you wish to share it with others.
|
||||
Additionally, this is a good place to document your code, if you wish to share it with others.
|
||||
|
||||
## Build All Keyboards That Support a Specific Keymap
|
||||
|
||||
|
|
@ -118,20 +118,21 @@ This is ideal for when you want ensure everything compiles successfully when pre
|
|||
|
||||
## Examples
|
||||
|
||||
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example).
|
||||
For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace.
|
||||
For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/_example).
|
||||
|
||||
For more complicated examples, checkout the [`awesome-qmk` collection](https://github.com/qmk/awesome-qmk).
|
||||
|
||||
|
||||
### Customized Functions
|
||||
|
||||
QMK has a bunch of [functions](custom_quantum_functions) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap.
|
||||
QMK has a bunch of [functions](custom_quantum_functions) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap.
|
||||
|
||||
However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap!
|
||||
However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap!
|
||||
|
||||
|
||||
For instance, let's look at the `layer_state_set_user()` function. You can enable the [Tri Layer State](ref_functions#olkb-tri-layers) functionality on all of your boards, while also retaining the Tri Layer functionality in your `keymap.c` files.
|
||||
For instance, let's look at the `layer_state_set_user()` function. You can enable the [Tri Layer State](ref_functions#olkb-tri-layers) functionality on all of your boards, while also retaining the Tri Layer functionality in your `keymap.c` files.
|
||||
|
||||
In your `<name.c>` file, you'd want to add this:
|
||||
In your `<name.c>` file, you'd want to add this:
|
||||
```c
|
||||
__attribute__ ((weak))
|
||||
layer_state_t layer_state_set_keymap (layer_state_t state) {
|
||||
|
|
@ -143,7 +144,7 @@ layer_state_t layer_state_set_user (layer_state_t state) {
|
|||
return layer_state_set_keymap (state);
|
||||
}
|
||||
```
|
||||
The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name.
|
||||
The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name.
|
||||
|
||||
The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else.
|
||||
|
||||
|
|
@ -151,7 +152,7 @@ You can see a list of this and other common functions in [`template.c`](https://
|
|||
|
||||
### Custom Features
|
||||
|
||||
Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace.
|
||||
Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace.
|
||||
|
||||
For instance, if you wanted to have a bunch of macros available, but only on certain boards (to save space), you could "hide" them being a `#ifdef MACROS_ENABLED`, and then enable it per board. To do this, add this to your rules.mk
|
||||
```make
|
||||
|
|
@ -159,11 +160,11 @@ ifeq ($(strip $(MACROS_ENABLED)), yes)
|
|||
OPT_DEFS += -DMACROS_ENABLED
|
||||
endif
|
||||
```
|
||||
The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that.
|
||||
The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that.
|
||||
|
||||
Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace.
|
||||
|
||||
And in your `process_record_user` function, you'd do something like this:
|
||||
And in your `process_record_user` function, you'd do something like this:
|
||||
```c
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
|
|
@ -187,9 +188,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
|
||||
### Consolidated Macros
|
||||
|
||||
If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too.
|
||||
If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too.
|
||||
|
||||
First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlapping keycodes
|
||||
First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you won't have any overlapping keycodes
|
||||
|
||||
Then add `#include "<name>.h"` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap.
|
||||
|
||||
|
|
@ -245,7 +246,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
}
|
||||
```
|
||||
|
||||
For 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:
|
||||
For 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:
|
||||
|
||||
```make
|
||||
ifeq ($(strip $(FLASH_BOOTLOADER)), yes)
|
||||
|
|
@ -255,7 +256,7 @@ endif
|
|||
|
||||
This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make <keyboard>:<keymap>`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time.
|
||||
|
||||
Also, holding Shift will add the flash target (`:flash`) to the command. Holding Control will add some commands that will speed up compiling time by processing multiple files at once.
|
||||
Also, holding Shift will add the flash target (`:flash`) to the command. Holding Control will add some commands that will speed up compiling time by processing multiple files at once.
|
||||
|
||||
And 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.
|
||||
|
||||
|
|
|
|||
|
|
@ -73,16 +73,13 @@ Should you rather choose to generate and use your own sample-table with the DAC
|
|||
|
||||
|
||||
### PWM (software)
|
||||
if the DAC pins are unavailable (or the MCU has no usable DAC at all, like STM32F1xx); PWM can be an alternative.
|
||||
If the DAC pins are unavailable (or the MCU has no usable DAC at all, like STM32F1xx); PWM can be an alternative.
|
||||
Note that there is currently only one speaker/pin supported.
|
||||
|
||||
set in `rules.mk`:
|
||||
|
||||
`AUDIO_DRIVER = pwm_software` and in `config.h`:
|
||||
`#define AUDIO_PIN C13` (can be any pin) to have the selected pin output a pwm signal, generated from a timer callback which toggles the pin in software.
|
||||
To use this feature, set `AUDIO_DRIVER = pwm_software` in `rules.mk` and set `#define AUDIO_PIN C13` (can be any pin) in `config.h` to have the selected pin output a pwm signal, generated from a timer callback which toggles the pin in software.
|
||||
|
||||
#### Wiring
|
||||
the usual piezo wiring: red goes to the selected AUDIO_PIN, black goes to ground.
|
||||
The usual piezo wiring: red goes to the selected AUDIO_PIN, black goes to ground.
|
||||
|
||||
OR if you can chose to drive one piezo with two pins, for example `#define AUDIO_PIN B1`, `#define AUDIO_PIN_ALT B2` in `config.h`, with `#define AUDIO_PIN_ALT_AS_NEGATIVE` - then the red lead could go to B1, the black to B2.
|
||||
|
||||
|
|
@ -159,7 +156,7 @@ PLAY_LOOP(my_song);
|
|||
|
||||
It's advised that you wrap all audio features in `#ifdef AUDIO_ENABLE` / `#endif` to avoid causing problems when audio isn't built into the keyboard.
|
||||
|
||||
The available keycodes for audio are:
|
||||
The available keycodes for audio are:
|
||||
|
||||
|Key |Aliases |Description |
|
||||
|-------------------------|---------|-------------------------------------------|
|
||||
|
|
@ -178,8 +175,8 @@ These keycodes turn all of the audio functionality on and off. Turning it off m
|
|||
|`AUDIO_PIN` | *Not defined* |Configures the pin that the speaker is connected to. |
|
||||
|`AUDIO_PIN_ALT` | *Not defined* |Configures the pin for a second speaker or second pin connected to one speaker. |
|
||||
|`AUDIO_PIN_ALT_AS_NEGATIVE` | *Not defined* |Enables support for one speaker connected to two pins. |
|
||||
|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accomidate for USB startup issues. |
|
||||
|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simutaneously. |
|
||||
|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accommodate for USB startup issues. |
|
||||
|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simultaneously. |
|
||||
|`AUDIO_POWER_CONTROL_PIN` | *Not defined* |Enables power control code to enable or cut off power to speaker (such as with PAM8302 amp). |
|
||||
|`AUDIO_POWER_CONTROL_PIN_ON_STATE`| `1` |The state of the audio power control pin when audio is "on" - `1` for high, `0` for low. |
|
||||
|`STARTUP_SONG` | `STARTUP_SOUND` |Plays when the keyboard starts up (audio.c) |
|
||||
|
|
@ -301,9 +298,9 @@ Things that return false are not part of the mask, and are always processed.
|
|||
|
||||
### Music Map
|
||||
|
||||
By default, the Music Mode uses the columns and row to determine the scale for the keys. For a board that uses a rectangular matrix that matches the keyboard layout, this is just fine. However, for boards that use a more complicated matrix (such as the Planck Rev6, or many split keyboards) this would result in a very skewed experience.
|
||||
By default, the Music Mode uses the columns and row to determine the scale for the keys. For a board that uses a rectangular matrix that matches the keyboard layout, this is just fine. However, for boards that use a more complicated matrix (such as the Planck Rev6, or many split keyboards) this would result in a very skewed experience.
|
||||
|
||||
However, the Music Map option allows you to remap the scaling for the music mode, so it fits the layout, and is more natural.
|
||||
However, the Music Map option allows you to remap the scaling for the music mode, so it fits the layout, and is more natural.
|
||||
|
||||
To enable this feature, add `#define MUSIC_MAP` to your `config.h` file, and then you will want to add a `uint8_t music_map` to your keyboard's `c` file, or your `keymap.c`.
|
||||
|
||||
|
|
@ -316,13 +313,13 @@ const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x12(
|
|||
);
|
||||
```
|
||||
|
||||
You will want to use whichever `LAYOUT` macro that your keyboard uses here. This maps it to the correct key location. Start in the bottom left of the keyboard layout, and move to the right, and then upwards. Fill in all the entries until you have a complete matrix.
|
||||
You will want to use whichever `LAYOUT` macro that your keyboard uses here. This maps it to the correct key location. Start in the bottom left of the keyboard layout, and move to the right, and then upwards. Fill in all the entries until you have a complete matrix.
|
||||
|
||||
You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) as an example of how to implement this.
|
||||
You can look at the [Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) as an example of how to implement this.
|
||||
|
||||
## Audio Click
|
||||
|
||||
This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly.
|
||||
This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly.
|
||||
|
||||
Keycodes available:
|
||||
|
||||
|
|
@ -341,7 +338,7 @@ The feature is disabled by default, to save space. To enable it, add this to yo
|
|||
#define AUDIO_CLICKY
|
||||
```
|
||||
|
||||
You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values:
|
||||
You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values:
|
||||
|
||||
| Option | Default Value | Description |
|
||||
|--------|---------------|-------------|
|
||||
|
|
@ -349,7 +346,7 @@ You can configure the default, min and max frequencies, the stepping and built i
|
|||
| `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). |
|
||||
| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the highest frequency. Too high may result in coworkers attacking you. |
|
||||
| `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. This is a multiplicative factor. The default steps the frequency up/down by a musical minor third. |
|
||||
| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. |
|
||||
| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. |
|
||||
| `AUDIO_CLICKY_DELAY_DURATION` | 1 | An integer note duration where 1 is 1/16th of the tempo, or a sixty-fourth note (see `quantum/audio/musical_notes.h` for implementation details). The main clicky effect will be delayed by this duration. Adjusting this to values around 6-12 will help compensate for loud switches. |
|
||||
|
||||
## MIDI Functionality
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ The feature maintains a small buffer of recent key presses. On each key press, i
|
|||
|
||||
The tricky part is how to efficiently check the buffer for typos. We don’t want to spend too much memory or time on storing or searching the typos. A good solution is to represent the typos with a trie data structure. A trie is a tree data structure where each node is a letter, and words are formed by following a path to one of the leaves.
|
||||
|
||||

|
||||

|
||||
|
||||
Since we search whether the buffer ends in a typo, we store the trie writing in reverse. The trie is queried starting from the last letter, then second to last letter, and so on, until either a letter doesn’t match or we reach a leaf, meaning a typo was found.
|
||||
|
||||
|
|
@ -279,7 +279,7 @@ All autocorrection data is stored in a single flat array autocorrect_data. Each
|
|||
* 01 ⇒ branching node: a trie node with multiple children.
|
||||
* 10 ⇒ leaf node: a leaf, corresponding to a typo and storing its correction.
|
||||
|
||||

|
||||

|
||||
|
||||
**Branching node**. Each branch is encoded with one byte for the keycode (KC_A–KC_Z) followed by a link to the child node. Links between nodes are 16-bit byte offsets relative to the beginning of the array, serialized in little endian order.
|
||||
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ In this typical example, the backlight LEDs are all connected in parallel toward
|
|||
A pulldown resistor is also placed between the gate pin and ground to keep it at a defined state when it is not otherwise being driven by the MCU.
|
||||
The values of these resistors are not critical - see [this Electronics StackExchange question](https://electronics.stackexchange.com/q/68748) for more information.
|
||||
|
||||

|
||||

|
||||
|
||||
## API {#api}
|
||||
|
||||
|
|
|
|||
55
docs/features/battery.md
Normal file
55
docs/features/battery.md
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# Battery
|
||||
|
||||
This feature provides the high level abstraction for sampling battery level.
|
||||
|
||||
## Usage
|
||||
|
||||
To use this driver, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
BATTERY_ENABLE = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|--------------------------|--------|--------------------------------------------------|
|
||||
|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
|
||||
|
||||
## Driver Configuration {#driver-configuration}
|
||||
|
||||
See the [Battery Driver](../drivers/battery) documentation for more information.
|
||||
|
||||
## Functions
|
||||
|
||||
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
|
||||
|
||||
Sample battery level.
|
||||
|
||||
#### Return Value {#api-battery-get-percent-return}
|
||||
|
||||
The battery percentage, in the range 0-100.
|
||||
|
||||
## Callbacks
|
||||
|
||||
### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user}
|
||||
|
||||
User hook called when battery level changed.
|
||||
|
||||
### Arguments {#api-battery-percent-changed-user-arguments}
|
||||
|
||||
- `uint8_t level`
|
||||
The battery percentage, in the range 0-100.
|
||||
|
||||
---
|
||||
|
||||
### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb}
|
||||
|
||||
Keyboard hook called when battery level changed.
|
||||
|
||||
### Arguments {#api-battery-percent-changed-kb-arguments}
|
||||
|
||||
- `uint8_t level`
|
||||
The battery percentage, in the range 0-100.
|
||||
|
|
@ -46,7 +46,7 @@ When [handedness](split_keyboard#setting-handedness) is predetermined via option
|
|||
}
|
||||
```
|
||||
|
||||
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file:
|
||||
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 column 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file:
|
||||
|
||||
```c
|
||||
#define BOOTMAGIC_ROW_RIGHT 4
|
||||
|
|
|
|||
|
|
@ -123,22 +123,39 @@ The source file may provide functions which allow access to information specifie
|
|||
Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
|
||||
:::
|
||||
|
||||
### `led_matrix_module.inc`
|
||||
|
||||
This file defines LED matrix effects in the same form as used with `led_matrix_kb.inc` and `led_matrix_user.inc` (see [Custom LED Matrix Effects](led_matrix#custom-led-matrix-effects)). Effect mode names are prepended with `LED_MATRIX_COMMUNITY_MODULE_`.
|
||||
|
||||
### `rgb_matrix_module.inc`
|
||||
|
||||
This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`.
|
||||
|
||||
### Compatible APIs
|
||||
|
||||
Community Modules may provide specializations for the following APIs:
|
||||
|
||||
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||
|----------------------------|-------------------------------------|----------------------------------------|-------------|
|
||||
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||
| Base API | API Format | Example (`hello_world` module) | API Version |
|
||||
|----------------------------------|-------------------------------------------|---------------------------------------------|-------------|
|
||||
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
|
||||
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
|
||||
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
|
||||
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
|
||||
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
|
||||
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
|
||||
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
|
||||
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
|
||||
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
|
||||
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
|
||||
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
|
||||
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
|
||||
| `led_matrix_indicators` | `led_matrix_indicators_<module>` | `led_matrix_indicators_hello_world` | `1.1.0` |
|
||||
| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_<module>` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||
| `rgb_matrix_indicators` | `rgb_matrix_indicators_<module>` | `rgb_matrix_indicators_hello_world` | `1.1.0` |
|
||||
| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_<module>` | `rgb_matrix_indicators_advanced_hello_world` | `1.1.0` |
|
||||
| `pointing_device_init` | `pointing_device_init_<module>` | `pointing_device_init_hello_world` | `1.1.0` |
|
||||
| `pointing_device_task` | `pointing_device_task_<module>` | `pointing_device_task_hello_world` | `1.1.0` |
|
||||
|
||||
|
||||
::: info
|
||||
An unspecified API is disregarded if a Community Module does not provide a specialization for it.
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ Additionally, if one side does not have an encoder, you can specify `{}` for the
|
|||
```
|
||||
|
||||
::: warning
|
||||
Keep in mind that whenver you change the encoder resolution, you will need to reflash the half that has the encoder affected by the change.
|
||||
Keep in mind that whenever you change the encoder resolution, you will need to reflash the half that has the encoder affected by the change.
|
||||
:::
|
||||
|
||||
## Encoder map {#encoder-map}
|
||||
|
|
|
|||
|
|
@ -44,14 +44,14 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
|||
|`QK_HAPTIC_MODE_NEXT` |`HF_NEXT`| Go to next DRV2605L waveform |
|
||||
|`QK_HAPTIC_MODE_PREVIOUS` |`HF_PREV`| Go to previous DRV2605L waveform |
|
||||
|`QK_HAPTIC_CONTINUOUS_TOGGLE`|`HF_CONT`| Toggle continuous haptic mode on/off |
|
||||
|`QK_HAPTIC_CONTINUOUS_UP` |`HF_CONU`| Increase DRV2605L continous haptic strength |
|
||||
|`QK_HAPTIC_CONTINUOUS_DOWN` |`HF_COND`| Decrease DRV2605L continous haptic strength |
|
||||
|`QK_HAPTIC_CONTINUOUS_UP` |`HF_CONU`| Increase DRV2605L continuous haptic strength |
|
||||
|`QK_HAPTIC_CONTINUOUS_DOWN` |`HF_COND`| Decrease DRV2605L continuous haptic strength |
|
||||
|`QK_HAPTIC_DWELL_UP` |`HF_DWLU`| Increase Solenoid dwell time |
|
||||
|`QK_HAPTIC_DWELL_DOWN` |`HF_DWLD`| Decrease Solenoid dwell time |
|
||||
|
||||
### Solenoids
|
||||
|
||||
The solenoid code supports relay switches, and similar hardware, as well as solenoids.
|
||||
The solenoid code supports relay switches, and similar hardware, as well as solenoids.
|
||||
|
||||
For a regular solenoid, you will need a build a circuit to drive the solenoid through a mosfet as most MCU will not be able to provide the current needed to drive the coil in the solenoid.
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ For relay switches, the hardware may already contain all of that ciruitry, and j
|
|||
|`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the switch is in buzz mode. |
|
||||
|
||||
* If solenoid buzz is off, then dwell time is how long the "plunger" stays activated. The dwell time changes how the solenoid sounds.
|
||||
* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times withing the buzz period.
|
||||
* If solenoid buzz is on, then dwell time sets the length of the buzz, while `SOLENOID_BUZZ_ACTUATED` and `SOLENOID_BUZZ_NONACTUATED` set the (non-)actuation times within the buzz period.
|
||||
* With the current implementation, for any of the above time settings, the precision of these settings may be affected by how fast the keyboard is able to scan the matrix.
|
||||
Therefore, if the keyboards scanning routine is slow, it may be preferable to set `SOLENOID_DWELL_STEP_SIZE` to a value slightly smaller than the time it takes to scan the keyboard.
|
||||
|
||||
|
|
@ -104,7 +104,7 @@ Eccentric Rotating Mass vibration motors (ERM) is motor with a off-set weight at
|
|||
```
|
||||
##### LRA
|
||||
|
||||
Linear resonant actuators (LRA, also know as a linear vibrator) works different from a ERM. A LRA has a weight and magnet suspended by springs and a voice coil. When the drive signal is applied, the weight would be vibrate on a single axis (side to side or up and down). Since the weight is attached to a spring, there is a resonance effect at a specific frequency. This frequency is where the LRA will operate the most efficiently. Refer to the motor's datasheet for the recommanded range for this frequency.
|
||||
Linear resonant actuators (LRA, also know as a linear vibrator) works different from a ERM. A LRA has a weight and magnet suspended by springs and a voice coil. When the drive signal is applied, the weight would be vibrate on a single axis (side to side or up and down). Since the weight is attached to a spring, there is a resonance effect at a specific frequency. This frequency is where the LRA will operate the most efficiently. Refer to the motor's datasheet for the recommended range for this frequency.
|
||||
|
||||
```c
|
||||
#define DRV2605L_FB_ERM_LRA 1
|
||||
|
|
@ -114,7 +114,7 @@ Linear resonant actuators (LRA, also know as a linear vibrator) works different
|
|||
/* Please refer to your datasheet for the optimal setting for your specific motor. */
|
||||
#define DRV2605L_RATED_VOLTAGE 2
|
||||
#define DRV2605L_V_PEAK 2.8
|
||||
#define DRV2605L_V_RMS 2.0
|
||||
#define DRV2605L_V_RMS 2.0
|
||||
#define DRV2605L_V_PEAK 2.1
|
||||
#define DRV2605L_F_LRA 205 /* resonance freq */
|
||||
```
|
||||
|
|
@ -125,7 +125,7 @@ DRV2605L comes with preloaded library of various waveform sequences that can be
|
|||
|
||||
List of waveform sequences from the datasheet:
|
||||
|
||||
|seq# | Sequence name |seq# | Sequence name |seq# |Sequence name |
|
||||
|seq# | Sequence name |seq# | Sequence name |seq# |Sequence name |
|
||||
|-----|---------------------|-----|-----------------------------------|-----|--------------------------------------|
|
||||
| 1 | strong_click | 43 | lg_dblclick_med_60 | 85 | transition_rampup_med_smooth2 |
|
||||
| 2 | strong_click_60 | 44 | lg_dblsharp_tick | 86 | transition_rampup_short_smooth1 |
|
||||
|
|
|
|||
|
|
@ -135,11 +135,11 @@ bool momentary_layer(bool key_down, void *layer) {
|
|||
return false;
|
||||
}
|
||||
|
||||
const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), //
|
||||
const key_override_t fn_override = {.trigger_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), //
|
||||
.layers = ~(1 << LAYER_FN), //
|
||||
.suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL), //
|
||||
.suppressed_mods = MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT), //
|
||||
.options = ko_option_no_unregister_on_other_key_down, //
|
||||
.negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RCTL)), //
|
||||
.negative_mod_mask = (uint8_t) ~(MOD_BIT(KC_RGUI) | MOD_BIT(KC_RALT)), //
|
||||
.custom_action = momentary_layer, //
|
||||
.context = (void *)LAYER_FN, //
|
||||
.trigger = KC_NO, //
|
||||
|
|
|
|||
|
|
@ -35,12 +35,12 @@ layer.
|
|||
|
||||
Consider a keymap with the following base layer.
|
||||
|
||||

|
||||

|
||||
|
||||
The highlighted key is a momentary layer switch `MO(NAV)`. Holding it accesses a
|
||||
navigation layer.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
Holding the NAV key is fine for brief use, but awkward to continue holding when
|
||||
|
|
|
|||
|
|
@ -214,9 +214,30 @@ led_matrix_mode(LED_MATRIX_CUSTOM_my_cool_effect);
|
|||
For inspiration and examples, check out the built-in effects under `quantum/led_matrix/animations/`.
|
||||
|
||||
|
||||
## Naming
|
||||
|
||||
If you wish to be able to use the name of an effect in your code -- say for a display indicator -- then you can enable the function `led_matrix_get_mode_name` in the following manner:
|
||||
|
||||
In your keymap's `config.h`:
|
||||
```c
|
||||
#define LED_MATRIX_MODE_NAME_ENABLE
|
||||
```
|
||||
|
||||
In your `keymap.c`
|
||||
```c
|
||||
const char* effect_name = led_matrix_get_mode_name(led_matrix_get_mode());
|
||||
// do something with `effect_name`, like `oled_write_ln(effect_name, false);`
|
||||
```
|
||||
|
||||
::: info
|
||||
`led_matrix_get_mode_name()` is not enabled by default as it increases the amount of flash memory used by the firmware based on the number of effects enabled.
|
||||
:::
|
||||
|
||||
|
||||
## Additional `config.h` Options {#additional-configh-options}
|
||||
|
||||
```c
|
||||
#define LED_MATRIX_MODE_NAME_ENABLE // enables led_matrix_get_mode_name()
|
||||
#define LED_MATRIX_KEYRELEASES // reactive effects respond to keyreleases (instead of keypresses)
|
||||
#define LED_MATRIX_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off
|
||||
#define LED_MATRIX_SLEEP // turn off effects when suspended
|
||||
|
|
@ -227,6 +248,8 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
|
|||
#define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||
#define LED_MATRIX_VAL_STEP 8 // The value by which to increment the brightness per adjustment action
|
||||
#define LED_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action
|
||||
#define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surfac
|
|||
| `ADNS9800_CS_PIN` | (Required) Sets the Chip Select pin connected to the sensor. | `POINTING_DEVICE_CS_PIN` |
|
||||
|
||||
|
||||
The CPI range is 800-8200, in increments of 200. Defaults to 1800 CPI.
|
||||
The CPI range is 800-8200, in increments of 200. Defaults to 1800 CPI.
|
||||
|
||||
### Analog Joystick
|
||||
|
||||
|
|
@ -258,7 +258,7 @@ To use the paw 3204 sensor, add this to your `rules.mk`
|
|||
POINTING_DEVICE_DRIVER = paw3204
|
||||
```
|
||||
|
||||
The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source.
|
||||
The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source.
|
||||
|
||||
| Setting (`config.h`) | Description | Default |
|
||||
| -------------------- |--------------------------------------------------------------- | -------------------------- |
|
||||
|
|
@ -275,7 +275,7 @@ To use the Pimoroni Trackball module, add this to your `rules.mk`:
|
|||
POINTING_DEVICE_DRIVER = pimoroni_trackball
|
||||
```
|
||||
|
||||
The Pimoroni Trackball module is a I2C based breakout board with an RGB enable trackball.
|
||||
The Pimoroni Trackball module is a I2C based breakout board with an RGB enable trackball.
|
||||
|
||||
| Setting (`config.h`) | Description | Default |
|
||||
| ------------------------------------ | ---------------------------------------------------------------------------------- | ------- |
|
||||
|
|
@ -379,14 +379,14 @@ POINTING_DEVICE_DRIVER = custom
|
|||
Using the custom driver will require implementing the following functions:
|
||||
|
||||
```c
|
||||
void pointing_device_driver_init(void) {}
|
||||
bool pointing_device_driver_init(void) { return true; }
|
||||
report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; }
|
||||
uint16_t pointing_device_driver_get_cpi(void) { return 0; }
|
||||
void pointing_device_driver_set_cpi(uint16_t cpi) {}
|
||||
```
|
||||
|
||||
::: warning
|
||||
Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/pointing_device_drivers.c`, but there may be cases where it's very specific to the hardware. So these functions are provided, just in case.
|
||||
Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/pointing_device_drivers.c`, but there may be cases where it's very specific to the hardware. So these functions are provided, just in case.
|
||||
:::
|
||||
|
||||
## Common Configuration
|
||||
|
|
@ -413,12 +413,38 @@ Ideally, new sensor hardware should be added to `drivers/sensors/` and `quantum/
|
|||
When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and `POINTING_DEVICE_TASK_THROTTLE_MS` will default to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness.
|
||||
:::
|
||||
|
||||
The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_SCLK_PIN` provide a convenient way to define a single pin that can be used for an interchangeable sensor config. This allows you to have a single config, without defining each device. Each sensor allows for this to be overridden with their own defines.
|
||||
The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_SCLK_PIN` provide a convenient way to define a single pin that can be used for an interchangeable sensor config. This allows you to have a single config, without defining each device. Each sensor allows for this to be overridden with their own defines.
|
||||
|
||||
::: warning
|
||||
Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports.
|
||||
:::
|
||||
|
||||
## High Resolution Scrolling
|
||||
|
||||
| Setting | Description | Default |
|
||||
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution multiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` |
|
||||
| `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` |
|
||||
|
||||
The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels).
|
||||
This works by adding a resolution multiplier to the HID descriptor for mouse wheel reports, causing the host computer to interpret each wheel tick sent by the keyboard as a fraction of a normal wheel tick.
|
||||
The resolution multiplier is set to `1 / (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER * (10 ^ POINTING_DEVICE_HIRES_SCROLL_EXPONENT))`, which is `1 / 120` by default.
|
||||
If even smoother scrolling than provided by this default value is desired, first try using `#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 1` which will result in a multiplier of `1 / 1200`.
|
||||
|
||||
The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`.
|
||||
|
||||
::: warning
|
||||
High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer.
|
||||
To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent.
|
||||
:::
|
||||
|
||||
::: warning
|
||||
Many programs, especially those that implement their own smoothing for scrolling, don't work well when they receive simultaneous vertical and horizontal wheel inputs (e.g. from high resolution drag-scroll using a trackball).
|
||||
These programs typically implement their smoothing in a way that assumes the user will only scroll in one axis at a time, resulting in slow or jittery motion when trying to scroll at an angle.
|
||||
This can be addressed by snapping scrolling to one axis at a time.
|
||||
:::
|
||||
|
||||
## Split Keyboard Configuration
|
||||
|
||||
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
|
||||
|
|
@ -439,22 +465,24 @@ If there is a `_RIGHT` configuration option or callback, the [common configurati
|
|||
:::
|
||||
|
||||
|
||||
## Callbacks and Functions
|
||||
## Callbacks and Functions
|
||||
|
||||
| Function | Description |
|
||||
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
|
||||
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
|
||||
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
|
||||
| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. |
|
||||
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
|
||||
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
|
||||
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
|
||||
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `report_mouse_t` data structure). |
|
||||
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `report_mouse_t` data structured passed to the function. |
|
||||
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
||||
| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `report_mouse_t` data and returns true only if it has changed. |
|
||||
| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
|
||||
| Function | Description |
|
||||
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
|
||||
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
|
||||
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
|
||||
| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. |
|
||||
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
|
||||
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
|
||||
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
|
||||
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `report_mouse_t` data structure). |
|
||||
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `report_mouse_t` data structured passed to the function. |
|
||||
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
||||
| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `report_mouse_t` data and returns true only if it has changed. |
|
||||
| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
|
||||
| `pointing_device_get_status(void)` | Returns device status as `pointing_device_status_t` a good return is `POINTING_DEVICE_STATUS_SUCCESS`. |
|
||||
| `pointing_device_set_status(pointing_device_status_t status)` | Sets device status, anything other than `POINTING_DEVICE_STATUS_SUCCESS` will disable reports from the device.|
|
||||
|
||||
|
||||
## Split Keyboard Callbacks and Functions
|
||||
|
|
@ -485,7 +513,7 @@ To manually manipulate the mouse reports outside of the `pointing_device_task_*`
|
|||
|
||||
* `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
|
||||
* `pointing_device_set_report(report_mouse_t mouse_report)` - Overrides and saves the report_mouse_t to be sent to the host computer
|
||||
* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report.
|
||||
* `pointing_device_send()` - Sends the mouse report to the host and zeroes out the report.
|
||||
|
||||
When the mouse report is sent, the x, y, v, and h values are set to 0 (this is done in `pointing_device_send()`, which can be overridden to avoid this behavior). This way, button states persist, but movement will only occur once. For further customization, both `pointing_device_init` and `pointing_device_task` can be overridden.
|
||||
|
||||
|
|
@ -520,7 +548,7 @@ Recall that the mouse report is set to zero (except the buttons) whenever it is
|
|||
|
||||
### Drag Scroll or Mouse Scroll
|
||||
|
||||
A very common implementation is to use the mouse movement to scroll instead of moving the cursor on the system. This uses the `pointing_device_task_user` callback to intercept and modify the mouse report before it's sent to the host system.
|
||||
A very common implementation is to use the mouse movement to scroll instead of moving the cursor on the system. This uses the `pointing_device_task_user` callback to intercept and modify the mouse report before it's sent to the host system.
|
||||
|
||||
```c
|
||||
enum custom_keycodes {
|
||||
|
|
@ -547,7 +575,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||
}
|
||||
```
|
||||
|
||||
This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key.
|
||||
This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key.
|
||||
|
||||
### Advanced Drag Scroll
|
||||
|
||||
|
|
@ -683,7 +711,7 @@ If you are having issues with pointing device drivers debug messages can be enab
|
|||
```c
|
||||
#define POINTING_DEVICE_DEBUG
|
||||
```
|
||||
|
||||
|
||||
::: tip
|
||||
The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](../faq_debug).
|
||||
:::
|
||||
|
|
@ -692,7 +720,7 @@ The messages will be printed out to the `CONSOLE` output. For additional informa
|
|||
---
|
||||
# Automatic Mouse Layer {#pointing-device-auto-mouse}
|
||||
|
||||
When using a pointing device combined with a keyboard the mouse buttons are often kept on a separate layer from the default keyboard layer, which requires pressing or holding a key to change layers before using the mouse. To make this easier and more efficient an additional pointing device feature may be enabled that will automatically activate a target layer as soon as the pointing device is active _(in motion, mouse button pressed etc.)_ and deactivate the target layer after a set time.
|
||||
When using a pointing device combined with a keyboard the mouse buttons are often kept on a separate layer from the default keyboard layer, which requires pressing or holding a key to change layers before using the mouse. To make this easier and more efficient an additional pointing device feature may be enabled that will automatically activate a target layer as soon as the pointing device is active _(in motion, mouse button pressed etc.)_ and deactivate the target layer after a set time.
|
||||
|
||||
Additionally if any key that is defined as a mouse key is pressed then the layer will be held as long as the key is pressed and the timer will be reset on key release. When a non-mouse key is pressed then the layer is deactivated early _(with some exceptions see below)_. Mod, mod tap, and one shot mod keys are ignored _(i.e. don't hold or activate layer but do not deactivate the layer either)_ when sending a modifier keycode _(e.g. hold for mod tap)_ allowing for mod keys to be used with the mouse without activating the target layer when typing.
|
||||
|
||||
|
|
@ -726,8 +754,9 @@ void pointing_device_init_user(void) {
|
|||
}
|
||||
```
|
||||
|
||||
Because the auto mouse feature can be disabled/enabled during runtime and starts as disabled by default it must be enabled by calling `set_auto_mouse_enable(true);` somewhere in firmware before the feature will work.
|
||||
_Note: for setting the target layer during initialization either setting `AUTO_MOUSE_DEFAULT_LAYER` in `config.h` or calling `set_auto_mouse_layer(<mouse_layer>)` can be used._
|
||||
Because the auto mouse feature can be disabled/enabled during runtime and starts as disabled by default it must be enabled by calling `set_auto_mouse_enable(true);` somewhere in firmware before the feature will work.
|
||||
|
||||
_Note: for setting the target layer during initialization either setting `AUTO_MOUSE_DEFAULT_LAYER` in `config.h` or calling `set_auto_mouse_layer(<mouse_layer>)` can be used._
|
||||
|
||||
|
||||
## How to Customize:
|
||||
|
|
@ -746,7 +775,7 @@ There are a few ways to control the auto mouse feature with both `config.h` opti
|
|||
|
||||
### Adding mouse keys
|
||||
|
||||
While all default mouse keys and layer keys(for current mouse layer) are treated as mouse keys, additional Keyrecords can be added to mouse keys by adding them to the is_mouse_record_* stack.
|
||||
While all default mouse keys and layer keys(for current mouse layer) are treated as mouse keys, additional Keyrecords can be added to mouse keys by adding them to the is_mouse_record_* stack.
|
||||
|
||||
#### Callbacks for setting up additional key codes as mouse keys:
|
||||
| Callback | Description |
|
||||
|
|
@ -754,7 +783,7 @@ While all default mouse keys and layer keys(for current mouse layer) are treated
|
|||
| `bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record)` | keyboard level callback for adding mouse keys |
|
||||
| `bool is_mouse_record_user(uint16_t keycode, keyrecord_t* record)` | user/keymap level callback for adding mouse keys |
|
||||
|
||||
##### To use the callback function to add mouse keys:
|
||||
##### To use the callback function to add mouse keys:
|
||||
|
||||
The following code will cause the enter key and all of the arrow keys to be treated as mouse keys (hold target layer while they are pressed and reset active layer timer).
|
||||
```c
|
||||
|
|
@ -778,7 +807,7 @@ bool is_mouse_record_kb(uint16_t keycode, keyrecord_t* record) {
|
|||
|
||||
There are several functions that allow for more advanced interaction with the auto mouse feature allowing for greater control.
|
||||
|
||||
### Functions to control auto mouse enable and target layer:
|
||||
### Functions to control auto mouse enable and target layer:
|
||||
| Function | Description | Aliases | Return type |
|
||||
| :--------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------- | --------------: |
|
||||
| `set_auto_mouse_enable(bool enable)` | Enable or disable auto mouse (true:enable, false:disable) | | `void`(None) |
|
||||
|
|
@ -797,25 +826,27 @@ There are several functions that allow for more advanced interaction with the au
|
|||
| `get_auto_mouse_key_tracker(void)` | Gets the current count for the auto mouse key tracker. | | `int8_t` |
|
||||
| `set_auto_mouse_key_tracker(int8_t key_tracker)` | Sets/Overrides the current count for the auto mouse key tracker. | | `void`(None) |
|
||||
|
||||
_NOTES:_
|
||||
- _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._
|
||||
- _It is recommended that `remove_auto_mouse_layer` is used in the `layer_state_set_*` stack of functions and `auto_mouse_layer_off` is used everywhere else_
|
||||
- _`remove_auto_mouse_layer(state, false)` or `auto_mouse_layer_off()` should be called before any instance of `set_auto_mouse_enabled(false)` or `set_auto_mouse_layer(layer)` to ensure that the target layer will be removed appropriately before disabling auto mouse or changing target to avoid a stuck layer_
|
||||
|
||||
### Functions for handling custom key events:
|
||||
_NOTES:_
|
||||
|
||||
- _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._
|
||||
- _It is recommended that `remove_auto_mouse_layer` is used in the `layer_state_set_*` stack of functions and `auto_mouse_layer_off` is used everywhere else_
|
||||
- _`remove_auto_mouse_layer(state, false)` or `auto_mouse_layer_off()` should be called before any instance of `set_auto_mouse_enabled(false)` or `set_auto_mouse_layer(layer)` to ensure that the target layer will be removed appropriately before disabling auto mouse or changing target to avoid a stuck layer_
|
||||
|
||||
### Functions for handling custom key events:
|
||||
| Function | Description | Return type |
|
||||
| :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: |
|
||||
| `auto_mouse_keyevent(bool pressed)` | Auto mouse mouse key event (true: key down, false: key up) | `void`(None) |
|
||||
| `auto_mouse_trigger_reset(bool pressed)` | Reset auto mouse status on key down and start delay timer (non-mouse key event) | `void`(None) |
|
||||
| `auto_mouse_toggle(void)` | Toggle on/off target toggle state (disables layer deactivation when true) | `void`(None) |
|
||||
| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | `bool` |
|
||||
| `get_auto_mouse_toggle(void)` | Return value of toggling state variable | `bool` |
|
||||
|
||||
_NOTE: Generally it would be preferable to use the `is_mouse_record_*` functions to add any additional keys that should act as mouse keys rather than adding `auto_mouse_keyevent(record.event->pressed)` to `process_records_*`_
|
||||
|
||||
### Advanced control examples
|
||||
### Advanced control examples
|
||||
|
||||
#### Disable auto mouse on certain layers:
|
||||
#### Disable auto mouse on certain layers:
|
||||
|
||||
The auto mouse feature can be disabled any time and this can be helpful if you want to disable the auto mouse feature under certain circumstances such as when particular layers are active. One issue however is the handling of the target layer, it needs to be removed appropriately **before** disabling auto mouse _(see notes under control functions above)_. The following function would disable the auto_mouse feature whenever the layers `_LAYER5` through `_LAYER7` are active as the top most layer _(ignoring target layer)_.
|
||||
The auto mouse feature can be disabled any time and this can be helpful if you want to disable the auto mouse feature under certain circumstances such as when particular layers are active. One issue however is the handling of the target layer, it needs to be removed appropriately **before** disabling auto mouse _(see notes under control functions above)_. The following function would disable the auto_mouse feature whenever the layers `_LAYER5` through `_LAYER7` are active as the top most layer _(ignoring target layer)_.
|
||||
|
||||
```c
|
||||
// in keymap.c:
|
||||
|
|
@ -854,7 +885,7 @@ layer_state_t default_layer_state_set_user(layer_state_t state) {
|
|||
auto_mouse_layer_off();
|
||||
set_auto_mouse_layer(_MOUSE_LAYER_2);
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
if((AUTO_MOUSE_TARGET_LAYER) == _MOUSE_LAYER_1) break;
|
||||
auto_mouse_layer_off();
|
||||
|
|
@ -864,9 +895,11 @@ layer_state_t default_layer_state_set_user(layer_state_t state) {
|
|||
}
|
||||
```
|
||||
|
||||
### Use custom keys to control auto mouse:
|
||||
Custom key records could also be created that control the auto mouse feature.
|
||||
The code example below would create a custom key that would toggle the auto mouse feature on and off when pressed while also setting a bool that could be used to disable other code that may turn it on such as the layer code above.
|
||||
### Use custom keys to control auto mouse:
|
||||
|
||||
Custom key records could also be created that control the auto mouse feature.
|
||||
|
||||
The code example below would create a custom key that would toggle the auto mouse feature on and off when pressed while also setting a bool that could be used to disable other code that may turn it on such as the layer code above.
|
||||
|
||||
```c
|
||||
// in config.h:
|
||||
|
|
@ -895,11 +928,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
|||
|
||||
## Customize Target Layer Activation
|
||||
|
||||
Layer activation can be customized by overwriting the `auto_mouse_activation` function. This function is checked every time `pointing_device_task` is called when inactive and every `AUTO_MOUSE_DEBOUNCE` ms when active, and will evaluate pointing device level conditions that trigger target layer activation. When it returns true, the target layer will be activated barring the usual exceptions _(e.g. delay time has not expired)_.
|
||||
Layer activation can be customized by overwriting the `auto_mouse_activation` function. This function is checked every time `pointing_device_task` is called when inactive and every `AUTO_MOUSE_DEBOUNCE` ms when active, and will evaluate pointing device level conditions that trigger target layer activation. When it returns true, the target layer will be activated barring the usual exceptions _(e.g. delay time has not expired)_.
|
||||
|
||||
By default it will return true if any of the `mouse_report` axes `x`,`y`,`h`,`v` are non zero, or if there is any mouse buttons active in `mouse_report`.
|
||||
_Note: The Cirque pinnacle track pad already implements a custom activation function that will activate on touchdown as well as movement all of the default conditions, currently this only works for the master side of split keyboards._
|
||||
|
||||
|
||||
| Function | Description | Return type |
|
||||
| :--------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------: |
|
||||
| `auto_mouse_activation(report_mouse_t mouse_report)` | Overwritable function that controls target layer activation (when true) | `bool` |
|
||||
|
|
@ -911,12 +944,12 @@ When using a custom pointing device (overwriting `pointing_device_task`) the fol
|
|||
```c
|
||||
bool pointing_device_task(void) {
|
||||
//...Custom pointing device task code
|
||||
|
||||
|
||||
// handle automatic mouse layer (needs report_mouse_t as input)
|
||||
pointing_device_task_auto_mouse(local_mouse_report);
|
||||
|
||||
|
||||
//...More custom pointing device task code
|
||||
|
||||
|
||||
return pointing_device_send();
|
||||
}
|
||||
```
|
||||
|
|
|
|||
|
|
@ -23,8 +23,11 @@ MODULE 5+ --------+--+--------- PWR CONTROLLER
|
|||
CLK ------+------------ PIN
|
||||
```
|
||||
|
||||
## Driver Configuration {#driver-configuration}
|
||||
|
||||
## Busywait Version {#busywait-version}
|
||||
Driver selection can be configured in `rules.mk` as `PS2_DRIVER`, or in `info.json` as `ps2.driver`. Valid values are `busywait` (default), `interrupt`, `usart`, or `vendor`. See below for information on individual drivers.
|
||||
|
||||
### Busywait Driver {#busywait-driver}
|
||||
|
||||
Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible.
|
||||
|
||||
|
|
@ -45,7 +48,7 @@ In your keyboard config.h:
|
|||
#endif
|
||||
```
|
||||
|
||||
### Interrupt Version (AVR/ATMega32u4) {#interrupt-version-avr}
|
||||
### Interrupt Driver (AVR/ATMega32u4) {#interrupt-driver-avr}
|
||||
|
||||
The following example uses D2 for clock and D5 for data. You can use any INT or PCINT pin for clock, and any pin for data.
|
||||
|
||||
|
|
@ -78,7 +81,7 @@ In your keyboard config.h:
|
|||
#endif
|
||||
```
|
||||
|
||||
### Interrupt Version (ARM chibios) {#interrupt-version-chibios}
|
||||
### Interrupt Driver (ARM chibios) {#interrupt-driver-chibios}
|
||||
|
||||
Pretty much any two pins can be used for the (software) interrupt variant on ARM cores. The example below uses A8 for clock, and A9 for data.
|
||||
|
||||
|
|
@ -107,7 +110,7 @@ And in the ChibiOS specific `halconf.h`:
|
|||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
### USART Version {#usart-version}
|
||||
### USART Driver {#usart-driver}
|
||||
|
||||
To use USART on the ATMega32u4, you have to use PD5 for clock and PD2 for data. If one of those are unavailable, you need to use interrupt version.
|
||||
|
||||
|
|
@ -159,7 +162,7 @@ In your keyboard config.h:
|
|||
#endif
|
||||
```
|
||||
|
||||
### RP2040 PIO Version {#rp2040-pio-version}
|
||||
### RP2040 PIO Driver {#rp2040-pio-driver}
|
||||
|
||||
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU.
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Key after tapping the <kbd>Z</kbd> key types another "`z`." This is useful for
|
|||
typing doubled letters, like the `z` in "`dazzle`": a double tap on <kbd>Z</kbd>
|
||||
can instead be a roll from <kbd>Z</kbd> to <kbd>Repeat</kbd>, which is
|
||||
potentially faster and more comfortable. The Repeat Key is also useful for
|
||||
hotkeys, like repeating Ctrl + Shift + Right Arrow to select by word.
|
||||
hotkeys, like repeating Ctrl + Shift + Right Arrow to select by word.
|
||||
|
||||
Repeat Key remembers mods that were active with the last key press. These mods
|
||||
are combined with any additional mods while pressing the Repeat Key. If the last
|
||||
|
|
@ -49,10 +49,10 @@ reduce firmware size, Alternate Repeat may be disabled by adding in config.h:
|
|||
|
||||
The following alternate keys are defined by default. See
|
||||
`get_alt_repeat_key_keycode_user()` below for how to change or add to these
|
||||
definitions. Where it makes sense, these definitions also include combinations
|
||||
definitions. Where it makes sense, these definitions also include combinations
|
||||
with mods, like Ctrl + Left ↔ Ctrl + Right Arrow.
|
||||
|
||||
**Navigation**
|
||||
**Navigation**
|
||||
|
||||
|Keycodes |Description |
|
||||
|-----------------------------------|-----------------------------------|
|
||||
|
|
@ -65,7 +65,7 @@ with mods, like Ctrl + Left ↔ Ctrl + Right Arrow.
|
|||
|`MS_WHLL` ↔ `MS_WHLR` | Mouse Wheel Left ↔ Right |
|
||||
|`MS_WHLU` ↔ `MS_WHLD` | Mouse Wheel Up ↔ Down |
|
||||
|
||||
**Misc**
|
||||
**Misc**
|
||||
|
||||
|Keycodes |Description |
|
||||
|-----------------------------------|-----------------------------------|
|
||||
|
|
@ -73,7 +73,7 @@ with mods, like Ctrl + Left ↔ Ctrl + Right Arrow.
|
|||
|`KC_LBRC` ↔ `KC_RBRC` | `[` ↔ `]` |
|
||||
|`KC_LCBR` ↔ `KC_RCBR` | `{` ↔ `}` |
|
||||
|
||||
**Media**
|
||||
**Media**
|
||||
|
||||
|Keycodes |Description |
|
||||
|-----------------------------------|-----------------------------------|
|
||||
|
|
@ -176,9 +176,9 @@ macro](../feature_macros). This way macros can be used without having to
|
|||
dedicate keys to them. The following defines a couple shortcuts.
|
||||
|
||||
* Typing <kbd>K</kbd>, <kbd>Alt Repeat</kbd> produces "`keyboard`," with the
|
||||
initial "`k`" typed as usual and the "`eybord`" produced by the macro.
|
||||
initial "`k`" typed as usual and the "`eybord`" produced by the macro.
|
||||
* Typing <kbd>.</kbd>, <kbd>Alt Repeat</kbd> produces "`../`," handy for "up
|
||||
directory" on the shell. Similary, <kbd>.</kbd> types the initial "`.`" and
|
||||
directory" on the shell. Similarly, <kbd>.</kbd> types the initial "`.`" and
|
||||
"`./`" is produced by the macro.
|
||||
|
||||
```c
|
||||
|
|
@ -290,7 +290,7 @@ By default, pressing the Repeat Key will simply behave as if the last key
|
|||
were pressed again. This also works with macro keys with custom handlers,
|
||||
invoking the macro again. In case fine-tuning is needed for sensible repetition,
|
||||
you can handle how a key is repeated with `get_repeat_key_count()` within
|
||||
`process_record_user()`.
|
||||
`process_record_user()`.
|
||||
|
||||
The `get_repeat_key_count()` function returns a signed count of times the key
|
||||
has been repeated or alternate repeated. When a key is pressed as usual,
|
||||
|
|
@ -306,16 +306,16 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
|||
if (get_repeat_key_count() > 0) {
|
||||
// MY_MACRO is being repeated!
|
||||
if (record->event.pressed) {
|
||||
SEND_STRING("repeat!");
|
||||
SEND_STRING("repeat!");
|
||||
}
|
||||
} else {
|
||||
} else {
|
||||
// MY_MACRO is being used normally.
|
||||
if (record->event.pressed) {
|
||||
if (record->event.pressed) {
|
||||
SEND_STRING("macro");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
|
||||
// Other macros...
|
||||
}
|
||||
return true;
|
||||
|
|
@ -347,19 +347,19 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
|||
case MY_MACRO:
|
||||
if (get_repeat_key_count() > 0) { // Repeating.
|
||||
if (record->event.pressed) {
|
||||
SEND_STRING("repeat!");
|
||||
SEND_STRING("repeat!");
|
||||
}
|
||||
} else if (get_repeat_key_count() < 0) { // Alternate repeating.
|
||||
if (record->event.pressed) {
|
||||
SEND_STRING("alt repeat!");
|
||||
}
|
||||
} else { // Used normally.
|
||||
if (record->event.pressed) {
|
||||
if (record->event.pressed) {
|
||||
SEND_STRING("macro");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
|
||||
// Other macros...
|
||||
}
|
||||
return true;
|
||||
|
|
@ -377,7 +377,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
|||
| `set_last_mods(mods)` | Set the mods to apply when repeating. |
|
||||
| `get_repeat_key_count()` | Signed count of times the key has been repeated or alternate repeated. |
|
||||
| `get_alt_repeat_key_keycode()` | Keycode to be used for alternate repeating. |
|
||||
|
||||
|
||||
|
||||
## Additional "Alternate" keys
|
||||
|
||||
|
|
@ -437,7 +437,7 @@ static void process_altrep3(uint16_t keycode, uint8_t mods) {
|
|||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t* record) {
|
||||
switch (keycode) {
|
||||
case ALTREP2:
|
||||
case ALTREP2:
|
||||
if (record->event.pressed) {
|
||||
process_altrep2(get_last_keycode(), get_last_mods());
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue