forked from mirrors/qmk_firmware
Compare commits
2347 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c586cfda48 | ||
|
|
c39a902867 | ||
|
|
2202efaf0c | ||
|
|
536511a32a | ||
|
|
8de0427fec | ||
|
|
0e81d63b64 | ||
|
|
de10784799 | ||
|
|
f1671ec720 | ||
|
|
b9c7d4c48d | ||
|
|
d681eac0ad | ||
|
|
5a0e47db5e | ||
|
|
bfed88dba2 | ||
|
|
4ca99af8f5 | ||
|
|
5f32690cba | ||
|
|
5c90732622 | ||
|
|
6081a8091d | ||
|
|
7f0581cd35 | ||
|
|
d510e80b89 | ||
|
|
4efe6330c4 | ||
|
|
493d422406 | ||
|
|
a6d70de96a | ||
|
|
9a31bbb3fa | ||
|
|
05f30f0787 | ||
|
|
ab45e3b993 | ||
|
|
62e3f8b885 | ||
|
|
1db5272154 | ||
|
|
ee17ffadea | ||
|
|
adfa36fee4 | ||
|
|
55f16167e4 | ||
|
|
fa44f2b21e | ||
|
|
00c8e24c6a | ||
|
|
12eb6444c6 | ||
|
|
6992efb229 | ||
|
|
a7893f207d | ||
|
|
d0c095eec2 | ||
|
|
32512bbf10 | ||
|
|
d458df7698 | ||
|
|
819231afe1 | ||
|
|
7a10c3370f | ||
|
|
1bf95d60e4 | ||
|
|
1cdde7ba6a | ||
|
|
59c7b15b4d | ||
|
|
e8b14a52de | ||
|
|
7aea67980b | ||
|
|
c3f1ba7dd1 | ||
|
|
eabbc04213 | ||
|
|
627e35b7ac | ||
|
|
0e4f953976 | ||
|
|
c10d0fc785 | ||
|
|
11cfc8a0b6 | ||
|
|
4be736c192 | ||
|
|
42eff8c372 | ||
|
|
32cc8a7f43 | ||
|
|
a444ccd27c | ||
|
|
a304a9b51e | ||
|
|
4779539543 | ||
|
|
931c7539d2 | ||
|
|
4f7be48758 | ||
|
|
747b33cb81 | ||
|
|
96c92d208f | ||
|
|
6025df79b3 | ||
|
|
a1fb1405e4 | ||
|
|
37cd5ad810 | ||
|
|
859c1a6fc9 | ||
|
|
4e5cc3c2ba | ||
|
|
54be228882 | ||
|
|
28f9def219 | ||
|
|
06e93a8f5c | ||
|
|
05f6838f37 | ||
|
|
e50b1d33f3 | ||
|
|
92c3e6305b | ||
|
|
de545b8e21 | ||
|
|
4d443d921b | ||
|
|
9fa14655df | ||
|
|
847cca541c | ||
|
|
580bcff4f6 | ||
|
|
f5e16f94d5 | ||
|
|
9cdccb12d1 | ||
|
|
c8ce87e044 | ||
|
|
66983f090c | ||
|
|
abdca8847d | ||
|
|
1f93485aef | ||
|
|
c84f68d4c8 | ||
|
|
303992da70 | ||
|
|
82f806b1ab | ||
|
|
f5333e9136 | ||
|
|
38cd3684e1 | ||
|
|
ba4ba66b2f | ||
|
|
ce2dbe17b5 | ||
|
|
09b0d3e0ed | ||
|
|
c79818e703 | ||
|
|
0ececbcdb7 | ||
|
|
64d2097a27 | ||
|
|
3c6765b21c | ||
|
|
f54a55dcfe | ||
|
|
16c91e0cf2 | ||
|
|
15c09335e9 | ||
|
|
807620fa3c | ||
|
|
7501523e1f | ||
|
|
be56817743 | ||
|
|
d547c0bea7 | ||
|
|
2d7de91888 | ||
|
|
8ee42cd6c4 | ||
|
|
67f9777b8f | ||
|
|
2f73e65837 | ||
|
|
1862ac5454 | ||
|
|
da4689d6b5 | ||
|
|
300dab7962 | ||
|
|
2efad277ee | ||
|
|
3c58f98929 | ||
|
|
82685fc2ac | ||
|
|
928be32c83 | ||
|
|
9b04e9be04 | ||
|
|
acc11f4941 | ||
|
|
633df1f365 | ||
|
|
99e9e1b8e7 | ||
|
|
ce2ac433d9 | ||
|
|
4ef0c8230c | ||
|
|
2cdaa639ee | ||
|
|
f7510ca202 | ||
|
|
6eac98286a | ||
|
|
dc70ba612a | ||
|
|
2a0d490eb3 | ||
|
|
d98f309429 | ||
|
|
09e4001bba | ||
|
|
4b108f7689 | ||
|
|
acf114315e | ||
|
|
b21a52c824 | ||
|
|
2468be889b | ||
|
|
2a3cd98fc6 | ||
|
|
bc385435a7 | ||
|
|
320219d5d8 | ||
|
|
38c8fc9baf | ||
|
|
63154631ab | ||
|
|
0052b03ee0 | ||
|
|
4f4e72e44c | ||
|
|
98312417b5 | ||
|
|
068d5688d8 | ||
|
|
2271b28386 | ||
|
|
590c2342fc | ||
|
|
f80bb4a517 | ||
|
|
b99ccd4f06 | ||
|
|
1dfe2bb49a | ||
|
|
34fec2c07d | ||
|
|
5a126e1a74 | ||
|
|
a991d65e87 | ||
|
|
018fad6b95 | ||
|
|
019bfc4159 | ||
|
|
8a1ca7f6b8 | ||
|
|
dfff040433 | ||
|
|
f9724dfa67 | ||
|
|
e68de95214 | ||
|
|
27dd4dc91e | ||
|
|
5bc81d3a63 | ||
|
|
5db705d054 | ||
|
|
904ec0ce78 | ||
|
|
7a090bb3df | ||
|
|
9d6a94cfb5 | ||
|
|
257fc042df | ||
|
|
36c2575658 | ||
|
|
6bb2ed68a8 | ||
|
|
26954bbc28 | ||
|
|
82f0263e41 | ||
|
|
2a3dd95229 | ||
|
|
ffb34fc082 | ||
|
|
45ffe42f1a | ||
|
|
bbd6ea977c | ||
|
|
a768ec265d | ||
|
|
2714c70bd7 | ||
|
|
b78a7e42b1 | ||
|
|
9a41a303cc | ||
|
|
85cdde1541 | ||
|
|
7c3b6c4bc4 | ||
|
|
61df87ae2c | ||
|
|
52e9ed75e8 | ||
|
|
2bb0550707 | ||
|
|
51b7828540 | ||
|
|
61a5059fc5 | ||
|
|
6663dd7288 | ||
|
|
3f5dc47296 | ||
|
|
57021d6358 | ||
|
|
61ce15f202 | ||
|
|
5925ea3478 | ||
|
|
c8f969a3ce | ||
|
|
5e750cf039 | ||
|
|
2dab029bcf | ||
|
|
7a73f9a6b3 | ||
|
|
5e347f42a6 | ||
|
|
5389f088b1 | ||
|
|
2e567150ea | ||
|
|
16b837b35b | ||
|
|
0348071810 | ||
|
|
35d78aa8a4 | ||
|
|
0bee7cbebe | ||
|
|
a5eeee4ded | ||
|
|
a15e44cfb3 | ||
|
|
2106acc24a | ||
|
|
39e1e27ea9 | ||
|
|
561c5e1d7a | ||
|
|
13b2b93fb0 | ||
|
|
30f2556ae9 | ||
|
|
06310e81e9 | ||
|
|
345e19f691 | ||
|
|
81d317aa87 | ||
|
|
b0c3d61c17 | ||
|
|
e724801d33 | ||
|
|
643f6367a1 | ||
|
|
8224f62806 | ||
|
|
cca5d35321 | ||
|
|
d9bb189e25 | ||
|
|
8f086faf8a | ||
|
|
0d30565bb7 | ||
|
|
744af003be | ||
|
|
29a2bac469 | ||
|
|
0e5d67145a | ||
|
|
5cad58dfa9 | ||
|
|
75bc9e6496 | ||
|
|
d37db0c50c | ||
|
|
8fa7b62011 | ||
|
|
e68205db1b | ||
|
|
9a157a3a99 | ||
|
|
b7fee11e34 | ||
|
|
63474e2c17 | ||
|
|
168a631720 | ||
|
|
7d89dfe2dc | ||
|
|
d87d537b50 | ||
|
|
6154c184a8 | ||
|
|
665feccca1 | ||
|
|
e8c46fab96 | ||
|
|
1c43410e26 | ||
|
|
03909b8a3f | ||
|
|
a3119385a4 | ||
|
|
2d5047a79c | ||
|
|
c5215d4a06 | ||
|
|
4ba5102a50 | ||
|
|
c8a78b1f04 | ||
|
|
f2d4424bb7 | ||
|
|
fb40abe2f2 | ||
|
|
ce29cb0f10 | ||
|
|
fbf3cbcd5c | ||
|
|
4d243e94fa | ||
|
|
71f9a07b0f | ||
|
|
6a0814bb04 | ||
|
|
4b7c01c84b | ||
|
|
3ed4a7086e | ||
|
|
8744d57578 | ||
|
|
43e33ba232 | ||
|
|
5f11d7b554 | ||
|
|
2011aec06f | ||
|
|
ba1f184267 | ||
|
|
bb1edf6676 | ||
|
|
a41c5d8023 | ||
|
|
4804b73540 | ||
|
|
6c7d549e31 | ||
|
|
40d295abf6 | ||
|
|
efd41fe9df | ||
|
|
18a1cbce75 | ||
|
|
f346c8400c | ||
|
|
36de989e6f | ||
|
|
9b8ae05796 | ||
|
|
b56edb5f11 | ||
|
|
b9a6126518 | ||
|
|
1b9491f8f3 | ||
|
|
ea14a93718 | ||
|
|
ac5e6b6a3b | ||
|
|
5108d53169 | ||
|
|
97dfdcb2bd | ||
|
|
11299b337b | ||
|
|
d694488e2e | ||
|
|
25033d5d9e | ||
|
|
f083eb1a37 | ||
|
|
1cffe5b6ce | ||
|
|
61eca0c972 | ||
|
|
7c64a2bcaa | ||
|
|
7de801ed9a | ||
|
|
81b7d6f67f | ||
|
|
3871c717da | ||
|
|
60ab61386e | ||
|
|
0c74892e90 | ||
|
|
326d3ffad8 | ||
|
|
5ac71ef27a | ||
|
|
1bf67b808d | ||
|
|
2aa4f7cf61 | ||
|
|
d9e311ad30 | ||
|
|
783d1cd458 | ||
|
|
c1d9f9911c | ||
|
|
7e926f5c93 | ||
|
|
e25879e836 | ||
|
|
414a387f22 | ||
|
|
d66b5db1d6 | ||
|
|
84d9996b6d | ||
|
|
5a727dbc6d | ||
|
|
a6faf3bc9e | ||
|
|
0365f640af | ||
|
|
fcc14b8838 | ||
|
|
4e35697e1a | ||
|
|
ec6875af56 | ||
|
|
bf44fc81bd | ||
|
|
feea704da7 | ||
|
|
5f16a4ec62 | ||
|
|
0c84dd6bdc | ||
|
|
fd883890af | ||
|
|
3059d7883c | ||
|
|
90ad47b1f2 | ||
|
|
07f6fba6de | ||
|
|
4a3e0ef9ab | ||
|
|
f996a4c5b7 | ||
|
|
56ecc86482 | ||
|
|
6285a1c0d3 | ||
|
|
627f9321a8 | ||
|
|
882eadd94d | ||
|
|
7a5f76d40a | ||
|
|
4aca94d247 | ||
|
|
7a8a4b1938 | ||
|
|
3b14383f48 | ||
|
|
5699763d4c | ||
|
|
5c5610074a | ||
|
|
ac333016eb | ||
|
|
fa0aea2a5a | ||
|
|
a80943579c | ||
|
|
65832c0fc3 | ||
|
|
ef633cf461 | ||
|
|
b8e8a20ca6 | ||
|
|
3ecb0a80af | ||
|
|
7e41eb0277 | ||
|
|
871eeae4ea | ||
|
|
9c2505676c | ||
|
|
c7d8adfeaa | ||
|
|
f03aec28fb | ||
|
|
5d711c89c3 | ||
|
|
c3ef70b9a6 | ||
|
|
ca0a9d243c | ||
|
|
8b78fac451 | ||
|
|
8c4a5f9ba2 | ||
|
|
08721b4125 | ||
|
|
ee26d3e77f | ||
|
|
5d1bc92c64 | ||
|
|
a80461e264 | ||
|
|
0112938140 | ||
|
|
2af2c5e109 | ||
|
|
a7179b188d | ||
|
|
48721b20fc | ||
|
|
59e28b8958 | ||
|
|
9dc7b9d40c | ||
|
|
0856b36139 | ||
|
|
c725f6f768 | ||
|
|
c679decb2b | ||
|
|
2f11509465 | ||
|
|
6b21f8369e | ||
|
|
69f0fc5868 | ||
|
|
6f1eca9c7b | ||
|
|
f8a56cd638 | ||
|
|
05074cbdf0 | ||
|
|
096db8c8ca | ||
|
|
6fce400ef5 | ||
|
|
a949d32072 | ||
|
|
3842b15cf1 | ||
|
|
5d8b6847c7 | ||
|
|
f2f88bcfcc | ||
|
|
a9af4c928e | ||
|
|
fd44341cbf | ||
|
|
92c0b29be9 | ||
|
|
f439fe6055 | ||
|
|
e3cad4045a | ||
|
|
0eab24be26 | ||
|
|
93e657fa99 | ||
|
|
578a3e3505 | ||
|
|
5846b40f74 | ||
|
|
9f1c4f304d | ||
|
|
3def7b98d4 | ||
|
|
c8fbfca1b6 | ||
|
|
b67ae67687 | ||
|
|
d6c39490df | ||
|
|
9d70162d53 | ||
|
|
a61e549a31 | ||
|
|
2757251218 | ||
|
|
dfb23456b1 | ||
|
|
d978432812 | ||
|
|
03630db506 | ||
|
|
1e643ba1d1 | ||
|
|
5936e05a33 | ||
|
|
38ca5e95e1 | ||
|
|
2f2d3e9c7b | ||
|
|
f2f2a7ace9 | ||
|
|
a98f69850f | ||
|
|
e5a15f404d | ||
|
|
c1d4950938 | ||
|
|
77d960cce3 | ||
|
|
d717396708 | ||
|
|
d206c1791e | ||
|
|
4f124574f1 | ||
|
|
fb05b491e7 | ||
|
|
7326a0051b | ||
|
|
34e244cecf | ||
|
|
1204cbb7ea | ||
|
|
dcdc7290e5 | ||
|
|
f7eb7926e8 | ||
|
|
74bec84740 | ||
|
|
0151f4c307 | ||
|
|
88086a80b0 | ||
|
|
58f4e19503 | ||
|
|
b37a59a967 | ||
|
|
1f61fb33b4 | ||
|
|
2b094d4112 | ||
|
|
2daad28ab1 | ||
|
|
43f8d365ba | ||
|
|
54383674db | ||
|
|
1e402060a6 | ||
|
|
33b62b6867 | ||
|
|
fa3dd373b4 | ||
|
|
01ecf332ff | ||
|
|
0d013a21e1 | ||
|
|
01bc974365 | ||
|
|
60cbb25148 | ||
|
|
410686dc03 | ||
|
|
99614bd89a | ||
|
|
e13bb58c40 | ||
|
|
e30cd0fa16 | ||
|
|
7fd3d76faa | ||
|
|
c43e89bb4a | ||
|
|
cbbdcec290 | ||
|
|
3c9f27e1c9 | ||
|
|
31dfdaa1ba | ||
|
|
3b9e186019 | ||
|
|
0e60b3a620 | ||
|
|
a8677ed296 | ||
|
|
7060cb7b26 | ||
|
|
2239527871 | ||
|
|
32792826a8 | ||
|
|
71472a1692 | ||
|
|
25b5c2c538 | ||
|
|
aaaf3ff66a | ||
|
|
d3858585ac | ||
|
|
a0f857b7a2 | ||
|
|
666cba5c2e | ||
|
|
2f9145c6ea | ||
|
|
47fcb40a81 | ||
|
|
b02f178c06 | ||
|
|
8ea836f2b2 | ||
|
|
9aa9155e88 | ||
|
|
eac0f6d4c9 | ||
|
|
2e27eb318e | ||
|
|
0a04064362 | ||
|
|
8ea9f13c67 | ||
|
|
27f9e4775e | ||
|
|
b450ffc5c6 | ||
|
|
701db278e4 | ||
|
|
267864e42c | ||
|
|
46644b0a64 | ||
|
|
86bfd8195c | ||
|
|
3e9f000a97 | ||
|
|
608404f874 | ||
|
|
be42c5fb98 | ||
|
|
2d7a2dfad0 | ||
|
|
de4262f9aa | ||
|
|
65fcf951d3 | ||
|
|
03d0182541 | ||
|
|
d116cf5e9a | ||
|
|
c2e5953bc1 | ||
|
|
2b23ca876d | ||
|
|
84718c0ab7 | ||
|
|
503b40e748 | ||
|
|
712f6cf450 | ||
|
|
52c1517766 | ||
|
|
7b7fb63f4b | ||
|
|
1a400d8644 | ||
|
|
4c39bad2e6 | ||
|
|
c114996034 | ||
|
|
a6eeb930ae | ||
|
|
3077123bf0 | ||
|
|
1c26c0bc9b | ||
|
|
3370e2b74d | ||
|
|
e8e45bca98 | ||
|
|
589e756e98 | ||
|
|
2fb24c0298 | ||
|
|
0a45a19801 | ||
|
|
93ee789387 | ||
|
|
5ab90cc72a | ||
|
|
6a81cb44f2 | ||
|
|
2703ecc9e9 | ||
|
|
62eaec52e0 | ||
|
|
36d60769f8 | ||
|
|
aa06893b58 | ||
|
|
2bddffeaec | ||
|
|
4e3db51e92 | ||
|
|
ad2e853611 | ||
|
|
c725b6bf89 | ||
|
|
d6eff188e9 | ||
|
|
7982957f75 | ||
|
|
7f8886a1b7 | ||
|
|
fd01feae4b | ||
|
|
0da6562c4d | ||
|
|
cfcd647b2e | ||
|
|
b5104c3a93 | ||
|
|
17ec1650fd | ||
|
|
7b3ee1db8c | ||
|
|
fe680a8568 | ||
|
|
6d67e9df4b | ||
|
|
e44604c256 | ||
|
|
545923b0a0 | ||
|
|
00872ea7e7 | ||
|
|
6d2f9c9c1e | ||
|
|
c251d88934 | ||
|
|
82a7f4adda | ||
|
|
89921e917a | ||
|
|
4610a6bf49 | ||
|
|
6d7026e561 | ||
|
|
999b91fbd9 | ||
|
|
9e35a1f617 | ||
|
|
811dbda20a | ||
|
|
4e8b864258 | ||
|
|
5ccb2fd003 | ||
|
|
e312fa44e2 | ||
|
|
8be0496347 | ||
|
|
0b1bed1d41 | ||
|
|
ef80a1dd67 | ||
|
|
050fa9062f | ||
|
|
fa9ecc431d | ||
|
|
8e128452db | ||
|
|
cac5f96275 | ||
|
|
8e5f8a5ff9 | ||
|
|
fa8fb60279 | ||
|
|
589bdedc47 | ||
|
|
d3dfa83b40 | ||
|
|
6e10a80174 | ||
|
|
7224d84167 | ||
|
|
c40af06871 | ||
|
|
afbba27f42 | ||
|
|
81d2218cee | ||
|
|
de207b97fa | ||
|
|
85d84938cf | ||
|
|
b7ce3b1967 | ||
|
|
dc2ce36d63 | ||
|
|
adf4c27db2 | ||
|
|
1c45845178 | ||
|
|
4cde5c243b | ||
|
|
f37de9a212 | ||
|
|
87e1ff218d | ||
|
|
2f4c7697a9 | ||
|
|
15dab01e6a | ||
|
|
84d3575fdb | ||
|
|
026d0e8bf1 | ||
|
|
1706da9054 | ||
|
|
b17324498e | ||
|
|
e49fa43a7f | ||
|
|
0c82aafb8a | ||
|
|
5149728b23 | ||
|
|
577e9d89fa | ||
|
|
f18afffc8d | ||
|
|
d21ee22cc5 | ||
|
|
856029f7c5 | ||
|
|
5ba04d1204 | ||
|
|
9d07ab88af | ||
|
|
10345adaa5 | ||
|
|
f7ab10a3c1 | ||
|
|
0d64038b73 | ||
|
|
d288121f21 | ||
|
|
c2045558d9 | ||
|
|
191c180644 | ||
|
|
b5a53a9946 | ||
|
|
90765aaefd | ||
|
|
3f841a24f0 | ||
|
|
0d991b8873 | ||
|
|
a50b09cba5 | ||
|
|
1a7a6f313e | ||
|
|
51cfb1b457 | ||
|
|
af6435d44d | ||
|
|
5887bf7158 | ||
|
|
dbd4ac5a3f | ||
|
|
80034a847f | ||
|
|
568924c76c | ||
|
|
0fd08da806 | ||
|
|
d05a1deb7c | ||
|
|
b4b34cd2cd | ||
|
|
6b838785b7 | ||
|
|
92665aef33 | ||
|
|
7baf9b3f35 | ||
|
|
97fc4f1b6a | ||
|
|
d8ace624c8 | ||
|
|
738cec9bd5 | ||
|
|
7c097ee6b4 | ||
|
|
ef8a30250b | ||
|
|
93c3a959a7 | ||
|
|
ed15a579a7 | ||
|
|
9da1b86d71 | ||
|
|
c84d058c8b | ||
|
|
9316023290 | ||
|
|
e5e2cd94be | ||
|
|
2f8704143e | ||
|
|
474b4083ae | ||
|
|
a599550adb | ||
|
|
c5f26b0e9a | ||
|
|
de43b09d25 | ||
|
|
d2abfaeacd | ||
|
|
0ab51ee29d | ||
|
|
84944df6a6 | ||
|
|
6567b21688 | ||
|
|
728f7308af | ||
|
|
f6a7bf2a83 | ||
|
|
0e2009c669 | ||
|
|
c9b71f953f | ||
|
|
8a6fd0dc7e | ||
|
|
5f72d54299 | ||
|
|
1e1f387be7 | ||
|
|
1d75e20cd8 | ||
|
|
1085500e89 | ||
|
|
6df5fce073 | ||
|
|
5c7972760c | ||
|
|
5141d6eeb1 | ||
|
|
1c97a0375e | ||
|
|
fe08bbc4a0 | ||
|
|
fbe236fa77 | ||
|
|
da1c562ddf | ||
|
|
b8bbd0cb9a | ||
|
|
36109a887a | ||
|
|
c681b6dbf3 | ||
|
|
b74509d4ae | ||
|
|
5d767f8361 | ||
|
|
9d226b92a8 | ||
|
|
cf1e66b352 | ||
|
|
11836128fc | ||
|
|
f0b1c8ced9 | ||
|
|
6f82647e8d | ||
|
|
b85c224b7c | ||
|
|
85b3b98570 | ||
|
|
e89478eb0f | ||
|
|
6221c86186 | ||
|
|
4c48760558 | ||
|
|
d6402fe9fb | ||
|
|
95d20e6d8b | ||
|
|
08c556b78b | ||
|
|
af84772a5f | ||
|
|
b1a3f806f5 | ||
|
|
787165718d | ||
|
|
bb324e5b3e | ||
|
|
706194b336 | ||
|
|
267f392237 | ||
|
|
5bcfc273ce | ||
|
|
b94baa8bc3 | ||
|
|
71b928fbec | ||
|
|
86e93d7654 | ||
|
|
9a587275cf | ||
|
|
344b8410f7 | ||
|
|
7c3cb99164 | ||
|
|
8bb2c66c88 | ||
|
|
7ff666340c | ||
|
|
73bd3dff8c | ||
|
|
f330ef12b6 | ||
|
|
af02baae78 | ||
|
|
f9e97fd3c3 | ||
|
|
5b16671d7a | ||
|
|
38839a9105 | ||
|
|
8153b55e07 | ||
|
|
6fdce80822 | ||
|
|
d5ed3ae967 | ||
|
|
bbab8eb993 | ||
|
|
ecce9900c9 | ||
|
|
d44a950c10 | ||
|
|
8545473307 | ||
|
|
9e2fe4eff6 | ||
|
|
e869d089b7 | ||
|
|
cda343acbe | ||
|
|
f663f84413 | ||
|
|
b554e4b612 | ||
|
|
044486500c | ||
|
|
650be92cf9 | ||
|
|
a099579aa0 | ||
|
|
0e11b511e4 | ||
|
|
67e80780bb | ||
|
|
2879573688 | ||
|
|
6e4e50d5aa | ||
|
|
25ec68c408 | ||
|
|
2de70e6f2d | ||
|
|
31fb141528 | ||
|
|
3826fca637 | ||
|
|
6b640db4bb | ||
|
|
15a86d5c53 | ||
|
|
e4be4d282c | ||
|
|
cc7a3f8dc7 | ||
|
|
9a2943d221 | ||
|
|
a06b5cae41 | ||
|
|
f03fe5b917 | ||
|
|
e22a183329 | ||
|
|
6123698270 | ||
|
|
6a0ed63eb1 | ||
|
|
a765f730b1 | ||
|
|
07f5147621 | ||
|
|
3ce029c7fd | ||
|
|
89a5d5aea0 | ||
|
|
87c3a53716 | ||
|
|
103c08cc75 | ||
|
|
b835171008 | ||
|
|
0c8f78020d | ||
|
|
d0af56da33 | ||
|
|
ebd4027883 | ||
|
|
d83fda01cf | ||
|
|
f5d091a9d5 | ||
|
|
23732068a4 | ||
|
|
c3ff06c534 | ||
|
|
6342354cf6 | ||
|
|
cbc68dfd21 | ||
|
|
de6360feca | ||
|
|
f5e1d2f76a | ||
|
|
00fcfd9181 | ||
|
|
64e2dbedc3 | ||
|
|
5aef750379 | ||
|
|
0bef2bfeb6 | ||
|
|
c9abb03662 | ||
|
|
1c7e8b9a9d | ||
|
|
1182f5b4be | ||
|
|
416c59fc52 | ||
|
|
ac1c5f8dfe | ||
|
|
a1fb86b17a | ||
|
|
f5b3f12544 | ||
|
|
e6071b891a | ||
|
|
afdf1c23dc | ||
|
|
0103f7877a | ||
|
|
a9c8a88e43 | ||
|
|
bb7572b42f | ||
|
|
caa5dcc672 | ||
|
|
b5725c05bd | ||
|
|
2a544710d7 | ||
|
|
9fa106f76e | ||
|
|
f296e1d1e2 | ||
|
|
5ac861efa5 | ||
|
|
799a7f98ce | ||
|
|
c60c19e8d5 | ||
|
|
90f3e139e6 | ||
|
|
713ce7b276 | ||
|
|
f155db37d4 | ||
|
|
d5aab127d2 | ||
|
|
e1759cd638 | ||
|
|
c421ecdc37 | ||
|
|
92548bb3e7 | ||
|
|
becf0307d7 | ||
|
|
1557455f7f | ||
|
|
90612fce92 | ||
|
|
5591489747 | ||
|
|
0dbaa7e057 | ||
|
|
94d89dfe82 | ||
|
|
8b33ca9fe2 | ||
|
|
c7e114e0bb | ||
|
|
a97ed8a1fd | ||
|
|
38073c3d44 | ||
|
|
83fa6fe916 | ||
|
|
b5608cbb6d | ||
|
|
36c8462f0a | ||
|
|
c4c67f2eb2 | ||
|
|
b4d65aac7f | ||
|
|
394f147897 | ||
|
|
19e6e6d1de | ||
|
|
89e0fba75d | ||
|
|
ce9a5aaef3 | ||
|
|
80405c6d96 | ||
|
|
3904a6afbe | ||
|
|
33d568e29b | ||
|
|
6503987c84 | ||
|
|
40e33d03a8 | ||
|
|
37eee020ed | ||
|
|
d241e80533 | ||
|
|
6a11331a41 | ||
|
|
f736828fa8 | ||
|
|
8b79f30cd5 | ||
|
|
dba5b730a3 | ||
|
|
cc8c539d00 | ||
|
|
6560903350 | ||
|
|
654baebb2c | ||
|
|
7541e75c3e | ||
|
|
e9e83b4da7 | ||
|
|
978e2fcd14 | ||
|
|
b6ee006060 | ||
|
|
1a61f1f578 | ||
|
|
8b9cb030a7 | ||
|
|
aa970e8560 | ||
|
|
68f466db87 | ||
|
|
467f3ae872 | ||
|
|
f22e8585a1 | ||
|
|
ac1173c3d4 | ||
|
|
4b7555117a | ||
|
|
6f499cfa12 | ||
|
|
bc2a6cf6ae | ||
|
|
d47c4ed4d0 | ||
|
|
6a94a9547d | ||
|
|
5816288926 | ||
|
|
85289e34ae | ||
|
|
608fa5154c | ||
|
|
b7771ec25b | ||
|
|
4a8bd7b9a5 | ||
|
|
f090881aeb | ||
|
|
4d107feca9 | ||
|
|
da63289505 | ||
|
|
a899c097ce | ||
|
|
94755308e0 | ||
|
|
db887e63d7 | ||
|
|
baa8d07fdb | ||
|
|
3a543d8990 | ||
|
|
710e8c0ccc | ||
|
|
90a43f9884 | ||
|
|
c0f0f594d4 | ||
|
|
8c58af39af | ||
|
|
78a9e1708a | ||
|
|
24f378e6c3 | ||
|
|
cd8d2b7f7f | ||
|
|
3eb6558602 | ||
|
|
2f9197cfcd | ||
|
|
68b16bba68 | ||
|
|
90eef4cd15 | ||
|
|
787a68948f | ||
|
|
425c54cf8c | ||
|
|
8e2b8413b4 | ||
|
|
e0cdeab951 | ||
|
|
82828c3205 | ||
|
|
158dc6829a | ||
|
|
3a80275fa1 | ||
|
|
75a32de441 | ||
|
|
e5e7039368 | ||
|
|
c4b2e9101d | ||
|
|
ffe16386f0 | ||
|
|
ff8c962d2e | ||
|
|
fc3d3ef076 | ||
|
|
478f83f711 | ||
|
|
c199514372 | ||
|
|
e53e75f4ce | ||
|
|
58c37c0814 | ||
|
|
6b39a38212 | ||
|
|
b26ba52bdd | ||
|
|
59fa34a6fa | ||
|
|
a8183340d0 | ||
|
|
c0ab4ed539 | ||
|
|
ec7801e2cb | ||
|
|
8a4ef2b3c4 | ||
|
|
ff9aca781a | ||
|
|
77aba32bc6 | ||
|
|
56ca807f85 | ||
|
|
d6e1de8c83 | ||
|
|
4d1332b62c | ||
|
|
a284b99876 | ||
|
|
ffa1b37634 | ||
|
|
b03daac76b | ||
|
|
7fd05afb10 | ||
|
|
12fe4c49de | ||
|
|
37417d531d | ||
|
|
d3443a4e8b | ||
|
|
fa6fe11c33 | ||
|
|
767e7db0ed | ||
|
|
da02de5413 | ||
|
|
ddba52325c | ||
|
|
bc6956909a | ||
|
|
df9c266f45 | ||
|
|
be08c86451 | ||
|
|
ba59927018 | ||
|
|
6024ade4fa | ||
|
|
8e9a81a860 | ||
|
|
48eafd98ef | ||
|
|
c9e336fde6 | ||
|
|
8c16efabaf | ||
|
|
214d2a31ed | ||
|
|
7a7a413730 | ||
|
|
371499c3a7 | ||
|
|
869b3a030e | ||
|
|
f3fdd6ae5d | ||
|
|
6641c4cecb | ||
|
|
615dbd62e9 | ||
|
|
bda47ad467 | ||
|
|
a3e057e779 | ||
|
|
4957a633e9 | ||
|
|
796ededd59 | ||
|
|
bfa04efada | ||
|
|
120d5d5520 | ||
|
|
f1c69e5d2c | ||
|
|
76eff706f6 | ||
|
|
7177434a02 | ||
|
|
785444199e | ||
|
|
5acdb4c921 | ||
|
|
4e9a811e58 | ||
|
|
ceb9b0f7b8 | ||
|
|
a8a03b108c | ||
|
|
84ffd4f72d | ||
|
|
8c23f87c51 | ||
|
|
7598f1f3af | ||
|
|
49267b135b | ||
|
|
5de74ce494 | ||
|
|
890dfebe8d | ||
|
|
034854ae39 | ||
|
|
3fbf9dc290 | ||
|
|
5a6c2711fa | ||
|
|
11e20fa0c9 | ||
|
|
4b337b228a | ||
|
|
7608902794 | ||
|
|
f64d30f38e | ||
|
|
5e6f9dfc4d | ||
|
|
be9fa68785 | ||
|
|
34e6be748a | ||
|
|
c03e18f728 | ||
|
|
766c2eeb16 | ||
|
|
66fc18c756 | ||
|
|
bca6367ba9 | ||
|
|
8b668a24d6 | ||
|
|
2b6df95894 | ||
|
|
b2d0dd2f32 | ||
|
|
48580cd08a | ||
|
|
28e1cfc278 | ||
|
|
a99494c400 | ||
|
|
d84a1fb9a4 | ||
|
|
e6ea4ce3af | ||
|
|
3e9fec5dcc | ||
|
|
676bbc6f63 | ||
|
|
ef8db9f104 | ||
|
|
ff4a6a2fd7 | ||
|
|
6e819945ed | ||
|
|
d458d4a596 | ||
|
|
0de08b09e7 | ||
|
|
e2802ca2cb | ||
|
|
2275b35e92 | ||
|
|
35062b00d3 | ||
|
|
a2a9611f18 | ||
|
|
c0af83cdde | ||
|
|
0edc0c05e1 | ||
|
|
fc52a30780 | ||
|
|
e99d6d582c | ||
|
|
a8459aa242 | ||
|
|
14d6c0b441 | ||
|
|
645359e5d0 | ||
|
|
178b70f355 | ||
|
|
73688057f4 | ||
|
|
f1804c18b4 | ||
|
|
0369fb0047 | ||
|
|
0395840eb9 | ||
|
|
e1f6fa579a | ||
|
|
056f7b3676 | ||
|
|
c2bf039893 | ||
|
|
54427509d5 | ||
|
|
857178e779 | ||
|
|
16c41c20cf | ||
|
|
d973734976 | ||
|
|
62ff93f62a | ||
|
|
8020950976 | ||
|
|
7808ddac0a | ||
|
|
56b125ad77 | ||
|
|
a727bd6463 | ||
|
|
b1681fb6a1 | ||
|
|
68a3fe8347 | ||
|
|
d64ec7cb19 | ||
|
|
97f4a75fd7 | ||
|
|
fdd31468ca | ||
|
|
d8b9796a32 | ||
|
|
f1cf119c65 | ||
|
|
97b861d104 | ||
|
|
05ab7453ec | ||
|
|
83ce70c821 | ||
|
|
c797dbfb1b | ||
|
|
e4942df397 | ||
|
|
ba8b236727 | ||
|
|
0100629fa2 | ||
|
|
a372ddcfed | ||
|
|
912e24ba9a | ||
|
|
76f3f0858d | ||
|
|
336791b915 | ||
|
|
5024769b78 | ||
|
|
61b3f125bf | ||
|
|
f44d569144 | ||
|
|
c2939bf038 | ||
|
|
8f692e22e3 | ||
|
|
969c68a9ad | ||
|
|
bcb7e471d5 | ||
|
|
1e389c7904 | ||
|
|
f3ce93fe00 | ||
|
|
fb4f25c0b5 | ||
|
|
12d1eb0415 | ||
|
|
81be7bb7b5 | ||
|
|
332d7f00c5 | ||
|
|
580a5d25cb | ||
|
|
bd8220e9fc | ||
|
|
314865f833 | ||
|
|
40a7714ce5 | ||
|
|
c76a23c37a | ||
|
|
7976779e6c | ||
|
|
b310bf6ca3 | ||
|
|
682dbb21a7 | ||
|
|
83709e7dbe | ||
|
|
c3a03b6423 | ||
|
|
25f849b397 | ||
|
|
b88d04eb62 | ||
|
|
499060a9a5 | ||
|
|
9056775e20 | ||
|
|
d938ccb2fd | ||
|
|
be7198ca49 | ||
|
|
2b23237da1 | ||
|
|
ad31ea3f51 | ||
|
|
671b62efab | ||
|
|
2a4db15f62 | ||
|
|
9ead40db0c | ||
|
|
7712a286dc | ||
|
|
176ab14649 | ||
|
|
1acb37db7f | ||
|
|
eab3be1e75 | ||
|
|
bdd1f318c3 | ||
|
|
5719353240 | ||
|
|
67329cffb5 | ||
|
|
1dee7bc7f3 | ||
|
|
50ec365806 | ||
|
|
2744c1b2cf | ||
|
|
bde724e124 | ||
|
|
690dc4bdaf | ||
|
|
9f63bce70b | ||
|
|
cff489bfdb | ||
|
|
e13aefe41d | ||
|
|
860f53dac4 | ||
|
|
958600d518 | ||
|
|
90dd16ccd2 | ||
|
|
02104270ed | ||
|
|
773124e9c0 | ||
|
|
c397720c87 | ||
|
|
1ab1ce1b46 | ||
|
|
6819420b0e | ||
|
|
f50a623909 | ||
|
|
b8245a5507 | ||
|
|
7aa9a353ac | ||
|
|
ad9a137942 | ||
|
|
886b257c3f | ||
|
|
8c91e90381 | ||
|
|
dce3dc3fe5 | ||
|
|
f52f3f1077 | ||
|
|
b1ceb4bb6a | ||
|
|
5fc8f8488f | ||
|
|
0d67eec5e2 | ||
|
|
9bd8d08834 | ||
|
|
8826a1dea5 | ||
|
|
c6de26fc6f | ||
|
|
f6fd6942ef | ||
|
|
5fe3b9ffa5 | ||
|
|
5b6faa173b | ||
|
|
4d67fe66a3 | ||
|
|
fdd4af9973 | ||
|
|
58c2bb4d64 | ||
|
|
7d60a141a2 | ||
|
|
d958329258 | ||
|
|
a5a4597311 | ||
|
|
df95495d5b | ||
|
|
147e57fd59 | ||
|
|
5841c755ae | ||
|
|
e5918cf968 | ||
|
|
030a96a3f5 | ||
|
|
3b6e48b012 | ||
|
|
6d13199ed0 | ||
|
|
8f585153c4 | ||
|
|
cad0af09a8 | ||
|
|
7d75f88ac9 | ||
|
|
92a61aa0cd | ||
|
|
ae4d518352 | ||
|
|
1cfe49714f | ||
|
|
14d084ae13 | ||
|
|
b331c98ca4 | ||
|
|
59885d07af | ||
|
|
8de4065b09 | ||
|
|
399de0be12 | ||
|
|
b9e11253c4 | ||
|
|
cbc59e383f | ||
|
|
812f97e241 | ||
|
|
a6884e6933 | ||
|
|
a4a67d515e | ||
|
|
88028dd982 | ||
|
|
18e56902c9 | ||
|
|
2858415789 | ||
|
|
46c0db458e | ||
|
|
4a8743cdb1 | ||
|
|
f3004d960f | ||
|
|
6814e32757 | ||
|
|
8580380eec | ||
|
|
294ef95bc9 | ||
|
|
0272621133 | ||
|
|
1e6ef5d42e | ||
|
|
57466c47ba | ||
|
|
46292f5098 | ||
|
|
973bc88b0f | ||
|
|
c4a6636873 | ||
|
|
937ffcecc8 | ||
|
|
8430774430 | ||
|
|
ad981dea72 | ||
|
|
fff2606665 | ||
|
|
3f8343e552 | ||
|
|
a8e01df50f | ||
|
|
87777d1cdd | ||
|
|
e9ad400b83 | ||
|
|
7216243a7a | ||
|
|
930cf6457a | ||
|
|
cf152dd16b | ||
|
|
1f2b1dedcc | ||
|
|
1dbbd2b6b0 | ||
|
|
b8cb147573 | ||
|
|
40b76faba8 | ||
|
|
dfe0515a4b | ||
|
|
57d8bae083 | ||
|
|
935af9e999 | ||
|
|
64aa180775 | ||
|
|
6d816d94f7 | ||
|
|
3c3662c20f | ||
|
|
ebf4380a83 | ||
|
|
16c848ca00 | ||
|
|
06ff5fca42 | ||
|
|
f3a49876d5 | ||
|
|
929f098269 | ||
|
|
9a38ebc656 | ||
|
|
baa566d809 | ||
|
|
2d05c7fc25 | ||
|
|
c4ce95e55b | ||
|
|
3f66e25b41 | ||
|
|
f1edbe5a89 | ||
|
|
e1c777a1c9 | ||
|
|
bcc056774f | ||
|
|
8cc86490aa | ||
|
|
781022e910 | ||
|
|
a5e41615f7 | ||
|
|
6a22c2e665 | ||
|
|
0524a82a88 | ||
|
|
c5423400c3 | ||
|
|
e13ad14cb7 | ||
|
|
d291ad90b4 | ||
|
|
3bde05c568 | ||
|
|
bf67abb046 | ||
|
|
4ce0203208 | ||
|
|
84c9d6ff39 | ||
|
|
f4f2efd117 | ||
|
|
98d411232f | ||
|
|
2cfbc1445c | ||
|
|
675ce76972 | ||
|
|
e2ace195b0 | ||
|
|
0738c9b7f3 | ||
|
|
f4c6e76cf6 | ||
|
|
e96d9abe3c | ||
|
|
d198d7924d | ||
|
|
14a867436c | ||
|
|
fa978542e9 | ||
|
|
85de020573 | ||
|
|
d870716457 | ||
|
|
0ef2246496 | ||
|
|
4a729a7be5 | ||
|
|
fc2c93e57a | ||
|
|
d508988916 | ||
|
|
a5e810b86c | ||
|
|
45504bb094 | ||
|
|
a2f155bbdd | ||
|
|
563c4dbb09 | ||
|
|
f64404cc73 | ||
|
|
67bb6e1945 | ||
|
|
99f7a8fcd3 | ||
|
|
2f917dd768 | ||
|
|
b7c9ff4ebe | ||
|
|
c0216e92fa | ||
|
|
69be0dc97c | ||
|
|
3c1a3c1719 | ||
|
|
aec9942f37 | ||
|
|
5407cf5256 | ||
|
|
8b438a9165 | ||
|
|
af3c7bae23 | ||
|
|
6a156cb5cc | ||
|
|
8e34665e6e | ||
|
|
d59d60ff69 | ||
|
|
168449f86b | ||
|
|
6822101f9c | ||
|
|
ec4f655333 | ||
|
|
ca161fbbd9 | ||
|
|
0c8109a1ac | ||
|
|
c0ac3f7372 | ||
|
|
1660b2d2e2 | ||
|
|
e6a7e7ac8e | ||
|
|
27ae37d626 | ||
|
|
cffe7f9cae | ||
|
|
61bd61347a | ||
|
|
3c57143bae | ||
|
|
4f30b7a2c9 | ||
|
|
df9ddf8b61 | ||
|
|
1caccca1f6 | ||
|
|
d0b33593b2 | ||
|
|
11db29bedb | ||
|
|
d75ae52fe6 | ||
|
|
64974a7f8f | ||
|
|
38209c5c86 | ||
|
|
d76a68fb0f | ||
|
|
6cdf230a20 | ||
|
|
aadf0a1038 | ||
|
|
9b24abf251 | ||
|
|
119abc4375 | ||
|
|
03f9b8db15 | ||
|
|
8c0198334c | ||
|
|
5f6c5cb54b | ||
|
|
5fae1ec9c3 | ||
|
|
50c1b9afdb | ||
|
|
f874984b96 | ||
|
|
05ac5727f2 | ||
|
|
55e5daa868 | ||
|
|
c05e8afe45 | ||
|
|
71ffb41c9b | ||
|
|
084df6a288 | ||
|
|
1fabad1cec | ||
|
|
7e0dde1f00 | ||
|
|
7cec7b6780 | ||
|
|
53a88af036 | ||
|
|
2957f60dc1 | ||
|
|
efc9c525b1 | ||
|
|
dc9eb21332 | ||
|
|
706bceeff8 | ||
|
|
f7a5ec2483 | ||
|
|
1ac1f92000 | ||
|
|
980a1b0562 | ||
|
|
e335d62eda | ||
|
|
7e69348335 | ||
|
|
55b3b2b848 | ||
|
|
5342caf172 | ||
|
|
4a3b4104fe | ||
|
|
08aa54b66f | ||
|
|
92d38c37ec | ||
|
|
74f4682309 | ||
|
|
a772a7f3a7 | ||
|
|
eca8782b54 | ||
|
|
28bd777f58 | ||
|
|
5ee6f9c9c1 | ||
|
|
c803c50dc0 | ||
|
|
dae932fc31 | ||
|
|
f610011aa3 | ||
|
|
23f365f8bc | ||
|
|
4f8cc32cf5 | ||
|
|
aea9005236 | ||
|
|
7eb6f86bc0 | ||
|
|
b19d7399ca | ||
|
|
669ad3c805 | ||
|
|
9216dd3917 | ||
|
|
1bc8793f83 | ||
|
|
4dae5ff37d | ||
|
|
6125f7bf4d | ||
|
|
cfe28937d5 | ||
|
|
729d7c2b2e | ||
|
|
2f095b8925 | ||
|
|
223bc47658 | ||
|
|
047ef3cd12 | ||
|
|
5dcee0199e | ||
|
|
3502bbbd16 | ||
|
|
32d6c122e9 | ||
|
|
e354cbe782 | ||
|
|
98e783cc3c | ||
|
|
9ee2effe8e | ||
|
|
86b5c6b5c3 | ||
|
|
06b6729b16 | ||
|
|
c39eeaa1c8 | ||
|
|
61c644f6d0 | ||
|
|
a900f9251a | ||
|
|
773242503c | ||
|
|
3a08deb7fe | ||
|
|
ed773ab73c | ||
|
|
bffb209eee | ||
|
|
e5823b5650 | ||
|
|
02655690f4 | ||
|
|
2749346a53 | ||
|
|
417f089115 | ||
|
|
4e863dbdef | ||
|
|
193dd01f4e | ||
|
|
024bda1dd3 | ||
|
|
d5d2a01db2 | ||
|
|
78f7c7bb0d | ||
|
|
8c5779f768 | ||
|
|
d802e1c805 | ||
|
|
a867cfc26d | ||
|
|
db6d432d6a | ||
|
|
fded67f1a9 | ||
|
|
b2e870e4a2 | ||
|
|
f6f4d85aa5 | ||
|
|
919df5934b | ||
|
|
8bffc61959 | ||
|
|
d37ed07c47 | ||
|
|
77aafd8056 | ||
|
|
8e1f505ab2 | ||
|
|
a808c29726 | ||
|
|
5f817a1d7f | ||
|
|
764dc18a81 | ||
|
|
872b521e4f | ||
|
|
46e85ded47 | ||
|
|
3315894269 | ||
|
|
e9bf95e0f2 | ||
|
|
1335d205f4 | ||
|
|
e94c2df3f3 | ||
|
|
037c5b5496 | ||
|
|
9aaf4a5a9b | ||
|
|
af5fe7fb75 | ||
|
|
92a9e7c50b | ||
|
|
38a257e666 | ||
|
|
87bb1a3890 | ||
|
|
e784dc79a6 | ||
|
|
1ef4e305e3 | ||
|
|
34ce1353f1 | ||
|
|
36ddb567cc | ||
|
|
e9783df2c5 | ||
|
|
5e5047f071 | ||
|
|
4be80cadac | ||
|
|
04826d1aa1 | ||
|
|
2d9c3f9a89 | ||
|
|
588abd24b5 | ||
|
|
7fde309799 | ||
|
|
9e39b99a0e | ||
|
|
a939adb55c | ||
|
|
6f98a67eda | ||
|
|
6c11579876 | ||
|
|
7e669421f8 | ||
|
|
2648a7a125 | ||
|
|
a12d58c6c9 | ||
|
|
1d1d7c388d | ||
|
|
6a6a333c75 | ||
|
|
5fb269b2b4 | ||
|
|
cd2fca667b | ||
|
|
c17323b0f5 | ||
|
|
86a35483a1 | ||
|
|
b8574efcd6 | ||
|
|
42d084d1c0 | ||
|
|
8d90cf36f1 | ||
|
|
921b9dad6c | ||
|
|
cc9a2aef0f | ||
|
|
dde4120a1e | ||
|
|
5eb3fc255b | ||
|
|
c0f4179117 | ||
|
|
338cf71ee9 | ||
|
|
df3770551a | ||
|
|
3f83a21383 | ||
|
|
8fe3864fe7 | ||
|
|
2df28c1850 | ||
|
|
109c60feeb | ||
|
|
e226a70adc | ||
|
|
b906af0073 | ||
|
|
16fab460fd | ||
|
|
1f63dbfb8e | ||
|
|
8ff2497384 | ||
|
|
08794fef4e | ||
|
|
55b53006a5 | ||
|
|
dccb5711c7 | ||
|
|
ebe87aa67e | ||
|
|
20424fd37f | ||
|
|
4281beb1de | ||
|
|
86b123141b | ||
|
|
dd32cdf527 | ||
|
|
0eb42e042c | ||
|
|
1833e65370 | ||
|
|
0015ebad47 | ||
|
|
3f79708095 | ||
|
|
74b24e410b | ||
|
|
e3404d21fe | ||
|
|
003231aaf2 | ||
|
|
7e6f1c9e08 | ||
|
|
e9458fd694 | ||
|
|
ee71362f99 | ||
|
|
31eb82c911 | ||
|
|
b75f6691a1 | ||
|
|
54658a3687 | ||
|
|
6c40b6856b | ||
|
|
27cde5f4c2 | ||
|
|
b33fdc299c | ||
|
|
83f757f8f0 | ||
|
|
fc7a41fdce | ||
|
|
ee6a0e8744 | ||
|
|
98da119293 | ||
|
|
35fa0f23a5 | ||
|
|
61a8a60dfb | ||
|
|
265b96a12c | ||
|
|
cf44bde909 | ||
|
|
bd70f5261c | ||
|
|
cb65c7755e | ||
|
|
dc8db6551d | ||
|
|
a8b01dc5de | ||
|
|
9d0153dc70 | ||
|
|
876c5201b9 | ||
|
|
8bcb77cb9a | ||
|
|
62696e82cd | ||
|
|
708b3f9192 | ||
|
|
0f22bccb3f | ||
|
|
caeb213400 | ||
|
|
6f1793d486 | ||
|
|
db16271a72 | ||
|
|
edd1f33013 | ||
|
|
77180a6649 | ||
|
|
5d67c4d908 | ||
|
|
8d5eacb7dd | ||
|
|
7121a228eb | ||
|
|
dc67fd9b87 | ||
|
|
4d5e532068 | ||
|
|
6ab5a7d048 | ||
|
|
eedbb9ae64 | ||
|
|
c5c5d37e08 | ||
|
|
c5b11978c7 | ||
|
|
ed169a6b30 | ||
|
|
c349e85956 | ||
|
|
5244b13173 | ||
|
|
41225620c2 | ||
|
|
022e1fdac8 | ||
|
|
7f8f66512c | ||
|
|
3347b63d83 | ||
|
|
d4bf9b1cc1 | ||
|
|
d38696a493 | ||
|
|
49bc3b530b | ||
|
|
b593cfccbd | ||
|
|
fba3820405 | ||
|
|
65eb0f939f | ||
|
|
0d428b9b39 | ||
|
|
40d6766576 | ||
|
|
68a62b99a2 | ||
|
|
d92994be71 | ||
|
|
2f6751e48a | ||
|
|
2218690d0b | ||
|
|
fe8b7619d3 | ||
|
|
212e820ff1 | ||
|
|
89a515913f | ||
|
|
18bfbc93ab | ||
|
|
403536986d | ||
|
|
4d2ae22690 | ||
|
|
e0fbb07129 | ||
|
|
996880a1da | ||
|
|
1d5b462da2 | ||
|
|
4493f31f80 | ||
|
|
e71f8f89d2 | ||
|
|
0880850b15 | ||
|
|
b5996bf793 | ||
|
|
8f70adc0b6 | ||
|
|
b6000e0fe5 | ||
|
|
87c2f97def | ||
|
|
0cf1186f8d | ||
|
|
eb35f58a6e | ||
|
|
249bc3a5c5 | ||
|
|
b069002e61 | ||
|
|
86966fce69 | ||
|
|
280bea87a6 | ||
|
|
ec3df85f08 | ||
|
|
9237326664 | ||
|
|
b2fdb072e5 | ||
|
|
2d985687a9 | ||
|
|
869ede8e4a | ||
|
|
7bc8046f9a | ||
|
|
8014fb14b6 | ||
|
|
26372c81ad | ||
|
|
8e888794fa | ||
|
|
c0a7ecb0e1 | ||
|
|
c84d361e95 | ||
|
|
4666dfb0b0 | ||
|
|
f0d27e22aa | ||
|
|
dfb0f9f6a5 | ||
|
|
8bcac1c8f7 | ||
|
|
05cc707d96 | ||
|
|
6928bce461 | ||
|
|
347bab7c35 | ||
|
|
5995432202 | ||
|
|
184a0942ff | ||
|
|
893d86cb89 | ||
|
|
07ca35decf | ||
|
|
e41d67b428 | ||
|
|
2ff646c642 | ||
|
|
2bface8f89 | ||
|
|
05b7193651 | ||
|
|
51c9988341 | ||
|
|
d953aa730e | ||
|
|
75544d9127 | ||
|
|
44f1bd9b3a | ||
|
|
5de515526d | ||
|
|
4b4f1c6edb | ||
|
|
e4d51c91b9 | ||
|
|
41fb9120d0 | ||
|
|
6e61126e08 | ||
|
|
a6126c5853 | ||
|
|
9dea8a7d86 | ||
|
|
827f32b3ad | ||
|
|
b26217414c | ||
|
|
c09e8bbf42 | ||
|
|
2d8266bd7b | ||
|
|
b28d8fcb07 | ||
|
|
bbd47fcaa2 | ||
|
|
c810d8cc1b | ||
|
|
575e3e18f5 | ||
|
|
1a1b22ef07 | ||
|
|
91a6e6245b | ||
|
|
0978dca728 | ||
|
|
99edf15a69 | ||
|
|
ff6c70415c | ||
|
|
f9df57b722 | ||
|
|
d8971d707e | ||
|
|
0fd600d6df | ||
|
|
0e08fad5c5 | ||
|
|
8e7cb28c4f | ||
|
|
dcfa4712fb | ||
|
|
45929ca657 | ||
|
|
5de86a05c3 | ||
|
|
bca565cfaa | ||
|
|
de10757f05 | ||
|
|
f8fb772f53 | ||
|
|
b77d51f41a | ||
|
|
9bf9adb578 | ||
|
|
9d6cea070e | ||
|
|
6425dd1710 | ||
|
|
4cae7becb1 | ||
|
|
0f9849ca68 | ||
|
|
30209de9fd | ||
|
|
621b4b73a1 | ||
|
|
16cd1d9bf7 | ||
|
|
f7512d61bd | ||
|
|
8e9d45d270 | ||
|
|
e2ab5056f1 | ||
|
|
b202e59322 | ||
|
|
ab76e6ab59 | ||
|
|
da6d6ce2e1 | ||
|
|
967b9e3140 | ||
|
|
82dd84e257 | ||
|
|
7d41639d54 | ||
|
|
618aaa8ca7 | ||
|
|
0be7345640 | ||
|
|
386d19b55f | ||
|
|
c0185116d7 | ||
|
|
ace0603f4f | ||
|
|
f634fddd34 | ||
|
|
24f2effbdd | ||
|
|
34ba7f1c18 | ||
|
|
bcd4f34b26 | ||
|
|
d412854e37 | ||
|
|
9958f9e147 | ||
|
|
aab2ac22c5 | ||
|
|
c45ed8930e | ||
|
|
61ba8efa3e | ||
|
|
c6111aa2a2 | ||
|
|
e01307f265 | ||
|
|
d1bd5a0100 | ||
|
|
7fb312ccd7 | ||
|
|
77ea1bdac4 | ||
|
|
4a66bdf294 | ||
|
|
b16af15750 | ||
|
|
ae2c77c827 | ||
|
|
8a5ad2a113 | ||
|
|
75b40dc7a5 | ||
|
|
9f95844cad | ||
|
|
96b6ddf4bf | ||
|
|
d75ce4862b | ||
|
|
e73f8e942c | ||
|
|
9d7f6d1089 | ||
|
|
09a43b12cb | ||
|
|
7f515ee64f | ||
|
|
325c634101 | ||
|
|
7d842c676a | ||
|
|
369575ad13 | ||
|
|
5467bdf39e | ||
|
|
36635c2203 | ||
|
|
d77b5ad0e8 | ||
|
|
c9d9e70ac7 | ||
|
|
c70bb75323 | ||
|
|
f293e6b4da | ||
|
|
5e57d18c5b | ||
|
|
3ac769b6ab | ||
|
|
73135e74b8 | ||
|
|
d1068b23ad | ||
|
|
36e47cb3aa | ||
|
|
fbfd5312b9 | ||
|
|
3c7c9bdd86 | ||
|
|
779c7debcf | ||
|
|
48f06ae646 | ||
|
|
e884414e1e | ||
|
|
e4a6afa369 | ||
|
|
8f457ada3a | ||
|
|
77cdb20e16 | ||
|
|
4fd2739a8c | ||
|
|
a7a3f72235 | ||
|
|
f6bc058525 | ||
|
|
57601d3cfe | ||
|
|
156f0561f2 | ||
|
|
cb8528c33c | ||
|
|
29ab430f1f | ||
|
|
d9a69324c1 | ||
|
|
1d30ee72ab | ||
|
|
4fae7cde7f | ||
|
|
259cf76966 | ||
|
|
0815d89eb8 | ||
|
|
c1e008b052 | ||
|
|
0d953a2dcf | ||
|
|
97d0e7cb2d | ||
|
|
d995cf3ae5 | ||
|
|
d94b5d0b82 | ||
|
|
5360cb1fd7 | ||
|
|
3057e5f8ca | ||
|
|
8a23742af2 | ||
|
|
83a32b2574 | ||
|
|
3da34f297a | ||
|
|
e793128991 | ||
|
|
c0ee3d2c79 | ||
|
|
cf31355f08 | ||
|
|
bd01e1cee8 | ||
|
|
8aec20c0da | ||
|
|
a58a95f1f5 | ||
|
|
5330d0888d | ||
|
|
3039186dd9 | ||
|
|
7646e567bd | ||
|
|
749918e119 | ||
|
|
5dcc0743f5 | ||
|
|
c2ea26745d | ||
|
|
e0342fec18 | ||
|
|
6b94d8e1c9 | ||
|
|
ffe9c22032 | ||
|
|
82a670135f | ||
|
|
239fed2ef1 | ||
|
|
145dca0e49 | ||
|
|
31f5900666 | ||
|
|
302ed624ac | ||
|
|
6ad86042fe | ||
|
|
2f0dc0fb6d | ||
|
|
a5901a6c0d | ||
|
|
3290377918 | ||
|
|
83b9483045 | ||
|
|
0b21fbc37b | ||
|
|
7e4f74d689 | ||
|
|
59f671744b | ||
|
|
7fb22706fd | ||
|
|
249eb87102 | ||
|
|
b1f8622513 | ||
|
|
d3584be431 | ||
|
|
c204c735af | ||
|
|
25ba9b41c1 | ||
|
|
a44abeb99a | ||
|
|
f30f963a0b | ||
|
|
b1de11c275 | ||
|
|
69a6772074 | ||
|
|
ae5f43072f | ||
|
|
0f962af691 | ||
|
|
f252287b0e | ||
|
|
67b9a722c0 | ||
|
|
7d153b9a66 | ||
|
|
18490537a5 | ||
|
|
8dc7cae7c7 | ||
|
|
2d1f2810a4 | ||
|
|
f01caa2a5a | ||
|
|
019dddcfa3 | ||
|
|
99099c4173 | ||
|
|
deb0fe4bcc | ||
|
|
09b44d2e73 | ||
|
|
2e31f542dc | ||
|
|
63b8959413 | ||
|
|
14fb3cc8b0 | ||
|
|
37feb4fcb4 | ||
|
|
9bf25d1cd5 | ||
|
|
6a90e13224 | ||
|
|
2d1d44edb7 | ||
|
|
b21a803ec6 | ||
|
|
f7b5d67a7b | ||
|
|
21a4f42957 | ||
|
|
65af7272f3 | ||
|
|
31ee13a5d7 | ||
|
|
3bc8afbb81 | ||
|
|
f6d8dd972e | ||
|
|
d175ee1d9b | ||
|
|
4d3ce3cdf8 | ||
|
|
60f22831cb | ||
|
|
f787114fe9 | ||
|
|
38e3be4c74 | ||
|
|
1d9808606a | ||
|
|
60e28544b2 | ||
|
|
e2691c22c1 | ||
|
|
73657a7d58 | ||
|
|
5b688a09ec | ||
|
|
4666d26008 | ||
|
|
2d12eacb4b | ||
|
|
7dd993fb06 | ||
|
|
da280739ef | ||
|
|
548a463fe9 | ||
|
|
0d9a0d5d97 | ||
|
|
5ff823d35f | ||
|
|
08ebf1523b | ||
|
|
6a8df58887 | ||
|
|
16767312db | ||
|
|
fede569bbe | ||
|
|
b0621223bc | ||
|
|
c9f192bae8 | ||
|
|
23c238a180 | ||
|
|
1980e48e0d | ||
|
|
61ed2e2b3c | ||
|
|
f77e569e9f | ||
|
|
4fd04b2371 | ||
|
|
63646e8906 | ||
|
|
afcdd7079c | ||
|
|
9f506e64ba | ||
|
|
aefe6ee9f5 | ||
|
|
e596ece87a | ||
|
|
17c0ca6fa4 | ||
|
|
52d6f07a82 | ||
|
|
0f926a8ae8 | ||
|
|
c72120baab | ||
|
|
50201af2b7 | ||
|
|
8957e928a2 | ||
|
|
bd35fa7de1 | ||
|
|
71c0b97bce | ||
|
|
00cc64638c | ||
|
|
7148a69d5e | ||
|
|
39bec3bfa5 | ||
|
|
2d4a69cfc6 | ||
|
|
793f54f6ca | ||
|
|
656c151e07 | ||
|
|
8106697a42 | ||
|
|
cc7d3b75d7 | ||
|
|
9e4942bec8 | ||
|
|
27ec667430 | ||
|
|
7c57c88c86 | ||
|
|
8787978951 | ||
|
|
e04f6c5d38 | ||
|
|
f7e7671f69 | ||
|
|
7a0fd646e3 | ||
|
|
9f4fbd3aa7 | ||
|
|
54572c8daf | ||
|
|
cbdb225a67 | ||
|
|
78c3149365 | ||
|
|
815d2bae81 | ||
|
|
3e52e60595 | ||
|
|
0930c60553 | ||
|
|
473557ff7d | ||
|
|
03b1de6925 | ||
|
|
12246733b7 | ||
|
|
61e8a0879e | ||
|
|
bc702fade2 | ||
|
|
968081958a | ||
|
|
6339b6dab7 | ||
|
|
ae6f471f1c | ||
|
|
250fd721ac | ||
|
|
8e34b64a99 | ||
|
|
cd673cceba | ||
|
|
a9250ad8a1 | ||
|
|
9aed06ba47 | ||
|
|
c2c2f30f9f | ||
|
|
1f67de2001 | ||
|
|
96afc7a03a | ||
|
|
d1e5221bf8 | ||
|
|
3face6b704 | ||
|
|
69b6e0796b | ||
|
|
7650e68798 | ||
|
|
4b377a80fa | ||
|
|
70e9f70c93 | ||
|
|
9e293e7f9c | ||
|
|
a2ffdb4abd | ||
|
|
74e8a71768 | ||
|
|
2e279f1b88 | ||
|
|
a239051c4a | ||
|
|
87e6c2b06b | ||
|
|
a1902c3bf8 | ||
|
|
008b5f52e5 | ||
|
|
a86d6fffc9 | ||
|
|
53a7306682 | ||
|
|
842d20267c | ||
|
|
9124f5dc2d | ||
|
|
3b60e71f07 | ||
|
|
ab23b4167f | ||
|
|
41bbb34287 | ||
|
|
65a4ad1177 | ||
|
|
b7f415d047 | ||
|
|
0452ad9479 | ||
|
|
e036c19d06 | ||
|
|
f4e3f75ecc | ||
|
|
c7a39c4549 | ||
|
|
5a0e129f11 | ||
|
|
89cc668b73 | ||
|
|
1dce1f90d7 | ||
|
|
ff7274fe9a | ||
|
|
49d5d13148 | ||
|
|
1aa9328200 | ||
|
|
de1417b660 | ||
|
|
38e085df87 | ||
|
|
10fa737ab8 | ||
|
|
a7c403fb09 | ||
|
|
9e65b23adc | ||
|
|
ad4f954b66 | ||
|
|
f440732ff2 | ||
|
|
b1debfb12f | ||
|
|
065f6eeb4e | ||
|
|
80dbdb2a61 | ||
|
|
3facf05324 | ||
|
|
f4f3bf81c7 | ||
|
|
e16dd1bcc0 | ||
|
|
eb8ace0855 | ||
|
|
119cadbaae | ||
|
|
80db7668da | ||
|
|
d31dd6d2a0 | ||
|
|
28fbcac6c9 | ||
|
|
e987ce1652 | ||
|
|
45406c0ca2 | ||
|
|
f1cd2a5a89 | ||
|
|
5b31e97187 | ||
|
|
0844b0d9bd | ||
|
|
b4dba89dc4 | ||
|
|
a72f4346ce | ||
|
|
8fd8b2dc92 | ||
|
|
0c0aa6a0ae | ||
|
|
ec9147f069 | ||
|
|
e83aa78357 | ||
|
|
b4ceefde37 | ||
|
|
6a35788b63 | ||
|
|
578d3f6951 | ||
|
|
f2384d062b | ||
|
|
135c935990 | ||
|
|
580ef6d88f | ||
|
|
8927d56606 | ||
|
|
e212c7c2e5 | ||
|
|
5178f75475 | ||
|
|
d966b39c5d | ||
|
|
249280cac2 | ||
|
|
db43e45077 | ||
|
|
57a78b68de | ||
|
|
0be2eaf174 | ||
|
|
0d7ff026b1 | ||
|
|
24da0457f8 | ||
|
|
96dbbc0439 | ||
|
|
1bdc1c23c7 | ||
|
|
593704b7a7 | ||
|
|
9aed323aa0 | ||
|
|
d4dc743a85 | ||
|
|
d6d48aa2aa | ||
|
|
74420c9fa2 | ||
|
|
7d38aec3ac | ||
|
|
6e2b03cf69 | ||
|
|
e22efc037a | ||
|
|
da5cb5fd6f | ||
|
|
984481ff8e | ||
|
|
3b580de023 | ||
|
|
a2cfa23baf | ||
|
|
d9238b7baf | ||
|
|
b8deac707e | ||
|
|
1477440ba0 | ||
|
|
735fb8a8b6 | ||
|
|
8515d12e20 | ||
|
|
658d211804 | ||
|
|
e4afd371dc | ||
|
|
97ee1c0aee | ||
|
|
d36c245400 | ||
|
|
a33dcb5a9a | ||
|
|
1571f8e258 | ||
|
|
84b7fc364d | ||
|
|
ae705e3e55 | ||
|
|
3fefaf7f6b | ||
|
|
6cb0e8924b | ||
|
|
2427678f7d | ||
|
|
2e052b87c4 | ||
|
|
4452be587b | ||
|
|
781cdde288 | ||
|
|
d1e1f95975 | ||
|
|
8116b2a15c | ||
|
|
14c1bd3b93 | ||
|
|
8ad59ec127 | ||
|
|
4297f0669b | ||
|
|
fc74d6b8d9 | ||
|
|
9af9af73f4 | ||
|
|
d1cf218b9d | ||
|
|
b57f8a8b9f | ||
|
|
1be1bebc04 | ||
|
|
a1b39e6db2 | ||
|
|
07bb65384c | ||
|
|
51e99b562d | ||
|
|
211533c738 | ||
|
|
b4f124c78c | ||
|
|
2d23516462 | ||
|
|
56623a6224 | ||
|
|
566f6e7b76 | ||
|
|
cad8866db1 | ||
|
|
3f7da15bba | ||
|
|
cffc3fcce5 | ||
|
|
dc816a98fe | ||
|
|
a6a7b1ce8f | ||
|
|
84c1fcef05 | ||
|
|
7d685956cc | ||
|
|
9f4769fbe6 | ||
|
|
749fa8b55f | ||
|
|
02dff061db | ||
|
|
b001d9383a | ||
|
|
8696d93e96 | ||
|
|
c969d4ece3 | ||
|
|
86bb162dd3 | ||
|
|
67b001c737 | ||
|
|
6c380e0eb1 | ||
|
|
38de0681ff | ||
|
|
d6abdda34f | ||
|
|
d0faaa9c7c | ||
|
|
b79b8dcdd0 | ||
|
|
d700447dda | ||
|
|
8c1c377272 | ||
|
|
6991631385 | ||
|
|
20fac523c7 | ||
|
|
1f59fe6d1b | ||
|
|
3e9551bcfa | ||
|
|
aff9eafea5 | ||
|
|
fee5950a5c | ||
|
|
720ccf9559 | ||
|
|
2f5074cf32 | ||
|
|
46e2caea78 | ||
|
|
51ee8965a7 | ||
|
|
99478417ac | ||
|
|
7c4992bce1 | ||
|
|
59f9703224 | ||
|
|
f25977bcd4 | ||
|
|
2ab685565a | ||
|
|
5ee29dc000 | ||
|
|
799de75b8b | ||
|
|
be59e8af2b | ||
|
|
ed8ab3e32c | ||
|
|
2df420f1f4 | ||
|
|
6a9ec74b32 | ||
|
|
9e5f8983ec | ||
|
|
7b31fc54df | ||
|
|
c99cbd915f | ||
|
|
4f6c0d0ea5 | ||
|
|
44e62a3634 | ||
|
|
efbfd30318 | ||
|
|
2da12182f3 | ||
|
|
7df371750f | ||
|
|
5f23345886 | ||
|
|
bf9569db93 | ||
|
|
c71c0fba90 | ||
|
|
5249a606f1 | ||
|
|
1d11ae3087 | ||
|
|
3340ca46e8 | ||
|
|
8f22819d47 | ||
|
|
489c5ff4a2 | ||
|
|
939006d2e5 | ||
|
|
95321fbc2c | ||
|
|
77062e9a36 | ||
|
|
0f53e1333f | ||
|
|
8776b4b088 | ||
|
|
a8700404f7 | ||
|
|
8101a836a4 | ||
|
|
eddd1c0567 | ||
|
|
6e83b44940 | ||
|
|
448a90f6b0 | ||
|
|
8ec18d1476 | ||
|
|
4ef11f0905 | ||
|
|
8863e1f696 | ||
|
|
82c194f86c | ||
|
|
c587df3b66 | ||
|
|
372f2b76aa | ||
|
|
489475814a | ||
|
|
fed36fc5f8 | ||
|
|
833f8db838 | ||
|
|
e137e39911 | ||
|
|
b91efb896d | ||
|
|
72dc5d5862 | ||
|
|
909003cce9 | ||
|
|
3a27f065b7 | ||
|
|
102cec8241 | ||
|
|
ad702096a9 | ||
|
|
b45a037c7e | ||
|
|
c7f477bc59 | ||
|
|
2f5c70e834 | ||
|
|
be6a4745ae | ||
|
|
ecfa4172d0 | ||
|
|
c9866313a7 | ||
|
|
edf9d33e61 | ||
|
|
fe1f53ce8f | ||
|
|
36b7a13be9 | ||
|
|
6ebb44f17e | ||
|
|
24324378a8 | ||
|
|
d840ef2b28 | ||
|
|
dcb0c4e51e | ||
|
|
bb75c10e28 | ||
|
|
3a01f51063 | ||
|
|
b825af0728 | ||
|
|
9a65cc39da | ||
|
|
fb65f07832 | ||
|
|
c72ed7c024 | ||
|
|
557fbbd6af | ||
|
|
217ad5cfc0 | ||
|
|
6a723c3571 | ||
|
|
069e232bab | ||
|
|
15290f4366 | ||
|
|
1d3c2ceded | ||
|
|
33384a3663 | ||
|
|
02637ec350 | ||
|
|
9cd2024814 | ||
|
|
b8dbebec2d | ||
|
|
f07ea255a9 | ||
|
|
08a42dc72c | ||
|
|
77eae62d62 | ||
|
|
90f2a03895 | ||
|
|
71a9384f49 | ||
|
|
cfc136f198 | ||
|
|
b7fb5f9987 | ||
|
|
fba519116d | ||
|
|
a7e1de81ff | ||
|
|
85743b9f32 | ||
|
|
7b75aa1818 | ||
|
|
15d385a862 | ||
|
|
c93dc153f1 | ||
|
|
66ef608726 | ||
|
|
7cbada6902 | ||
|
|
c02be0012e | ||
|
|
354eedae7a | ||
|
|
0d88d277e4 | ||
|
|
5c3f3e8332 | ||
|
|
50baf28386 | ||
|
|
3f5d47eae8 | ||
|
|
856f49cf48 | ||
|
|
4f79b57774 | ||
|
|
3058bf0f83 | ||
|
|
2b1f97dcc2 | ||
|
|
a8482a4424 | ||
|
|
bd2af5c556 | ||
|
|
69e4c18153 | ||
|
|
2609c49731 | ||
|
|
4eb284ef8d | ||
|
|
b554d8d336 | ||
|
|
8b188e060c | ||
|
|
ddc6601487 | ||
|
|
88630d4913 | ||
|
|
96209d7eba | ||
|
|
92b2738bbb | ||
|
|
5eb7eee560 | ||
|
|
99706e038b | ||
|
|
cf954bbfd0 | ||
|
|
6e516ee89f | ||
|
|
42a49ba44f | ||
|
|
43d18321e3 | ||
|
|
58769a40de | ||
|
|
2842ab4052 | ||
|
|
a7eb27b867 | ||
|
|
5e817664ad | ||
|
|
fd98d78cd8 | ||
|
|
37d801776e | ||
|
|
f0c14507a5 | ||
|
|
80e321f6ab | ||
|
|
aebf17b7e2 | ||
|
|
52acb7dcac | ||
|
|
4187fc7fbb | ||
|
|
be1dcb9185 | ||
|
|
012db45bfb | ||
|
|
75bba4522d | ||
|
|
113b0f04bc | ||
|
|
dff6f23a1a | ||
|
|
461f279883 | ||
|
|
9b07108fbf | ||
|
|
8e1269617a | ||
|
|
92ec98d5ce | ||
|
|
d4e05f6df3 | ||
|
|
0b9324f332 | ||
|
|
c20522369b | ||
|
|
cec35d2399 | ||
|
|
4b9f73d32e | ||
|
|
a760168722 | ||
|
|
c6277687b4 | ||
|
|
79f2fca1f9 | ||
|
|
34602f4b25 | ||
|
|
2b212cf692 | ||
|
|
65e7d0c01f | ||
|
|
c08ed73216 | ||
|
|
db608aae51 | ||
|
|
bc617d8ad1 | ||
|
|
a5a3918856 | ||
|
|
6ed4f51413 | ||
|
|
d7d3839b8d | ||
|
|
184f4b38c8 | ||
|
|
93149711f6 | ||
|
|
dfecad4362 | ||
|
|
b1942d1d0c | ||
|
|
93bacff1a6 | ||
|
|
36ebc75e9a | ||
|
|
a483ab3213 | ||
|
|
ced6d835e8 | ||
|
|
a2ddb44957 | ||
|
|
31a6401193 | ||
|
|
ceea8ab5fe | ||
|
|
f10285d800 | ||
|
|
aafbe043f9 | ||
|
|
20e16bbcc4 | ||
|
|
e6e6529b4a | ||
|
|
4cff18a705 | ||
|
|
1a4db497db | ||
|
|
5470e4a8ad | ||
|
|
5d0c92b40c | ||
|
|
e014d9897d | ||
|
|
ec7c3ac12d | ||
|
|
2fbdfae4b7 | ||
|
|
017c26c167 | ||
|
|
0b4afdf35b | ||
|
|
371fc8c062 | ||
|
|
d52dca47e8 | ||
|
|
0c402157fc | ||
|
|
05b6fbb1f5 | ||
|
|
b4b636112e | ||
|
|
5491385f3d | ||
|
|
437dad1b0e | ||
|
|
13a44b1fff | ||
|
|
89260bab86 | ||
|
|
ceab485e58 | ||
|
|
9682abd5b8 | ||
|
|
21958a9343 | ||
|
|
69b211abb6 | ||
|
|
78dba27922 | ||
|
|
515eb94fab | ||
|
|
30d060417f | ||
|
|
9578b4b570 | ||
|
|
a1ca14c1e1 | ||
|
|
7562f6644f | ||
|
|
82d3bdb733 | ||
|
|
98078f769d | ||
|
|
de59dd1835 | ||
|
|
e67ac61160 | ||
|
|
a120a166b9 | ||
|
|
687d4772a7 | ||
|
|
fea1a3d5c7 | ||
|
|
6332caef78 | ||
|
|
ff878aa30c | ||
|
|
98aaf7dccd | ||
|
|
86fd95962c | ||
|
|
3c9ddf7c53 | ||
|
|
0a21929928 | ||
|
|
30c201e1c5 | ||
|
|
34dccc565e | ||
|
|
2093498425 | ||
|
|
c3937de310 | ||
|
|
bd63d91163 | ||
|
|
bd07ae6713 | ||
|
|
f9a39775fc | ||
|
|
6e8c3dfafc | ||
|
|
ccd1839443 | ||
|
|
b1c4d3322d | ||
|
|
03f2235bc5 | ||
|
|
eada33b889 | ||
|
|
d5293e1f43 | ||
|
|
005949ff25 | ||
|
|
ac466c1571 | ||
|
|
8dbc8a802c | ||
|
|
2387a95be6 | ||
|
|
ce8e5fb54e | ||
|
|
d0063ea3e9 | ||
|
|
2b975f3f3a | ||
|
|
34592f225a | ||
|
|
49d8d9ebf2 | ||
|
|
5fb93934d0 | ||
|
|
99e11f4823 | ||
|
|
c089541938 | ||
|
|
73e372d920 | ||
|
|
1f1d2ffd29 | ||
|
|
0a3452f307 | ||
|
|
bfc8539d68 | ||
|
|
c32a329583 | ||
|
|
668e6b8e92 | ||
|
|
89f7378569 | ||
|
|
8b44eaa63e | ||
|
|
367e2bb0ff | ||
|
|
6513e0cea3 | ||
|
|
5fcdff9935 | ||
|
|
4fe6f3cd7a | ||
|
|
cbb51eacb0 | ||
|
|
602b0b14d5 | ||
|
|
dde5cd1c54 | ||
|
|
c8af82432d | ||
|
|
f85b945c32 | ||
|
|
0d02af816b | ||
|
|
42caee329f | ||
|
|
6636c21453 | ||
|
|
7d6a7e195c | ||
|
|
967b3b351b | ||
|
|
9d801cb03d | ||
|
|
db38fb1a60 | ||
|
|
98823ff8fc | ||
|
|
13e8fea023 | ||
|
|
60b4ee1df3 | ||
|
|
6151b365f9 | ||
|
|
14d5c3f2f1 | ||
|
|
cd3db41d06 | ||
|
|
25707cad5c | ||
|
|
c86baf3ece | ||
|
|
2689e360ce | ||
|
|
d3952523fe | ||
|
|
0709d208db | ||
|
|
be2265d0d1 | ||
|
|
1127e0da6b | ||
|
|
f08824f6eb | ||
|
|
740c47d4d7 | ||
|
|
c929b7aadf | ||
|
|
6f81880f17 | ||
|
|
6209122213 | ||
|
|
6bc870d899 | ||
|
|
cffe143ca2 | ||
|
|
ac31863021 | ||
|
|
4519af69a9 | ||
|
|
4d96e53222 | ||
|
|
8503c97b96 | ||
|
|
c53ee0b3ce | ||
|
|
fa1d3159af | ||
|
|
e969420a85 | ||
|
|
ba7243d409 | ||
|
|
2cd350d3f4 | ||
|
|
cd62961392 | ||
|
|
eadfcb9a40 | ||
|
|
ed43450043 | ||
|
|
5df515c22d | ||
|
|
2d03a337ab | ||
|
|
111ee6cb91 | ||
|
|
daf71c8d37 | ||
|
|
ca5bd0aa2c | ||
|
|
a1dd4f3c0f | ||
|
|
c93935f243 | ||
|
|
dfe5fe7181 | ||
|
|
c20096c7aa | ||
|
|
79f2445414 | ||
|
|
25713dc222 | ||
|
|
e15dbb49e0 | ||
|
|
3a3272a3d6 | ||
|
|
11d5ff415f | ||
|
|
672c6b4721 | ||
|
|
f9cf09ebd1 | ||
|
|
7f7364c559 | ||
|
|
76a673233c | ||
|
|
0391801267 | ||
|
|
6e40dfa022 | ||
|
|
f491e6b138 | ||
|
|
859e2aa86b | ||
|
|
d6b9056d42 | ||
|
|
c734e7c1bf | ||
|
|
407647d0d1 | ||
|
|
bd1d41024b | ||
|
|
19abd80fb2 | ||
|
|
78b330c8b4 | ||
|
|
e0490a24f2 | ||
|
|
53472a4e7b | ||
|
|
e24fe0832b | ||
|
|
45731efcac | ||
|
|
b7ed91f861 | ||
|
|
4582b1b41a | ||
|
|
d737b4704c | ||
|
|
51bc051172 | ||
|
|
df7fe3e2ac | ||
|
|
e95156d4d8 | ||
|
|
96073e1368 | ||
|
|
f5995901b0 | ||
|
|
77d3e564f7 | ||
|
|
78648b37e9 | ||
|
|
7b018f097d | ||
|
|
b6bd01aa8b | ||
|
|
9a356ab943 | ||
|
|
acf7824f9a | ||
|
|
3410b25cf8 | ||
|
|
560386461e | ||
|
|
8d61218abe | ||
|
|
6beca1c6c0 | ||
|
|
aefa85162b | ||
|
|
4219508b42 | ||
|
|
1b29f98d99 | ||
|
|
4b185a52bc | ||
|
|
3a2d01df6a | ||
|
|
8fe49ebe0b | ||
|
|
9f72f27279 | ||
|
|
c8fd62432a | ||
|
|
b33ecce392 | ||
|
|
9d0b145007 | ||
|
|
c12268807d | ||
|
|
c0bb153151 | ||
|
|
3c5b9f70f5 | ||
|
|
fce882f516 | ||
|
|
045977ea91 | ||
|
|
7e3dab79ad | ||
|
|
a97da5a569 | ||
|
|
14d5e92da5 | ||
|
|
8b865a9d64 | ||
|
|
ce5a2a7367 | ||
|
|
f6be5773d5 | ||
|
|
757b42f2fb | ||
|
|
c03859a3e4 | ||
|
|
415faebd65 | ||
|
|
dd994e72ad | ||
|
|
f92d153532 | ||
|
|
31bce31c74 | ||
|
|
6ef36482a2 | ||
|
|
46a74d820f | ||
|
|
c394bf1c98 | ||
|
|
7aa466515e | ||
|
|
ef847f8ef6 | ||
|
|
30f0bbe079 | ||
|
|
1259140d5a | ||
|
|
108684351e | ||
|
|
af936c6ae6 | ||
|
|
26febb7c24 | ||
|
|
fe2ef59240 | ||
|
|
fc968fd473 | ||
|
|
0ea644a53b | ||
|
|
3c90a30fe7 | ||
|
|
6cc51eb9d9 | ||
|
|
eecd22fbd4 | ||
|
|
9d7e64bcb3 | ||
|
|
0e52a84878 | ||
|
|
fc51ce8304 | ||
|
|
1b67b14587 | ||
|
|
5f7c0e3097 | ||
|
|
ce1ee47ef5 | ||
|
|
942b3cf16c | ||
|
|
e8747e116f | ||
|
|
681f9f4ca6 | ||
|
|
ae3219ae0e | ||
|
|
42a5742add | ||
|
|
590082520e | ||
|
|
a299018824 | ||
|
|
12b9831eeb | ||
|
|
3c0a91059b | ||
|
|
3bf2403244 | ||
|
|
4466261895 | ||
|
|
4d55cde5a7 | ||
|
|
d123364b32 | ||
|
|
0b241ea4f7 | ||
|
|
1493e6d3f0 | ||
|
|
3d06860f3c | ||
|
|
3716e02ff3 | ||
|
|
2726856cde | ||
|
|
3079fd0415 | ||
|
|
0e5fc86c68 | ||
|
|
a1c39084a2 | ||
|
|
8879cdb250 | ||
|
|
75714ff123 | ||
|
|
4bc356711d | ||
|
|
12d26c1466 | ||
|
|
2445c1435a | ||
|
|
9204f8535b | ||
|
|
55a84843ea | ||
|
|
a83731660d | ||
|
|
d57ecaa9a6 | ||
|
|
b5a5bb6d74 | ||
|
|
fefcad3933 | ||
|
|
04d9c53c6e | ||
|
|
c1556f7af0 | ||
|
|
25a0432228 | ||
|
|
b7cdda7dcd | ||
|
|
c1297ceb97 | ||
|
|
a3e9b347ec | ||
|
|
5ebeb32ec0 | ||
|
|
bee48ced71 | ||
|
|
852d3af0a1 | ||
|
|
1c1ba06cfb | ||
|
|
36d5ea8f85 | ||
|
|
dcb20e55fc | ||
|
|
5bd3e9e806 | ||
|
|
7ac9d1abe4 | ||
|
|
696dea19f6 | ||
|
|
9215edde66 | ||
|
|
9d0373779c | ||
|
|
6779f847ea | ||
|
|
e931ac57e1 | ||
|
|
42412d7272 | ||
|
|
d558d10042 | ||
|
|
7f67504993 | ||
|
|
4461355cce | ||
|
|
ccc2030bee | ||
|
|
6932e22dd8 | ||
|
|
69c341eb5c | ||
|
|
1f7faad37a | ||
|
|
d41067f59b | ||
|
|
24d47dc631 | ||
|
|
c99d2965a0 | ||
|
|
9a4a3517de | ||
|
|
4b1db46647 | ||
|
|
51db8baf77 |
@@ -5,6 +5,9 @@ AlignConsecutiveAssignments: 'true'
|
|||||||
AlignConsecutiveDeclarations: 'true'
|
AlignConsecutiveDeclarations: 'true'
|
||||||
AlignOperands: 'true'
|
AlignOperands: 'true'
|
||||||
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
||||||
|
AllowShortCaseLabelsOnASingleLine: 'false'
|
||||||
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
|
AllowShortLoopsOnASingleLine: 'false'
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
AlwaysBreakBeforeMultilineStrings: 'false'
|
AlwaysBreakBeforeMultilineStrings: 'false'
|
||||||
@@ -20,6 +23,7 @@ SortIncludes: 'false'
|
|||||||
SpaceBeforeAssignmentOperators: 'true'
|
SpaceBeforeAssignmentOperators: 'true'
|
||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
SpaceInEmptyParentheses: 'false'
|
SpaceInEmptyParentheses: 'false'
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
TabWidth: '4'
|
TabWidth: '4'
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
|
||||||
|
|||||||
25
.github/ISSUE_TEMPLATE/bug_report.md
vendored
25
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -18,19 +18,18 @@ assignees: ''
|
|||||||
|
|
||||||
## System Information
|
## System Information
|
||||||
|
|
||||||
- Keyboard:
|
**Keyboard:**
|
||||||
- Revision (if applicable):
|
**Revision (if applicable):**
|
||||||
- Operating system:
|
**Operating system:**
|
||||||
- AVR GCC version:
|
**`qmk doctor` output:**
|
||||||
<!-- Run `avr-gcc --version` to find this out. -->
|
```
|
||||||
- ARM GCC version:
|
(Paste output here)
|
||||||
<!-- Run `arm-none-eabi-gcc --version` to find this out. -->
|
```
|
||||||
- QMK Firmware version:
|
|
||||||
<!-- Run `git describe --abbrev=0 --tags` to find this out. -->
|
**Any keyboard related software installed?**
|
||||||
- Any keyboard related software installed?
|
- [ ] AutoHotKey (Windows)
|
||||||
- [ ] AutoHotKey
|
- [ ] Karabiner (macOS)
|
||||||
- [ ] Karabiner
|
- [ ] Other:
|
||||||
- [ ] Other:
|
|
||||||
|
|
||||||
## Additional Context
|
## Additional Context
|
||||||
|
|
||||||
|
|||||||
9
.github/dependabot.yml
vendored
Normal file
9
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
labels: CI
|
||||||
|
reviewers:
|
||||||
|
- "qmk/collaborators"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
58
.github/stale.yml
vendored
58
.github/stale.yml
vendored
@@ -1,58 +0,0 @@
|
|||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
|
||||||
|
|
||||||
# General configuration
|
|
||||||
|
|
||||||
# Pull request specific configuration
|
|
||||||
pulls:
|
|
||||||
staleLabel: awaiting changes
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
|
||||||
daysUntilStale: 45
|
|
||||||
# Number of days of inactivity before a stale Issue or Pull Request is closed.
|
|
||||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
|
||||||
daysUntilClose: 30
|
|
||||||
# Comment to post when marking as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
Thank you for your contribution!
|
|
||||||
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
activity in the last 45 days. It will be closed in 30 days if no further activity occurs.
|
|
||||||
Please feel free to give a status update now, or re-open when it's ready.
|
|
||||||
|
|
||||||
For maintainers: Please label with `awaiting review`, `breaking_change`, `in progress`, or `on hold` to prevent
|
|
||||||
the issue from being re-flagged.
|
|
||||||
# Comment to post when closing a stale Issue or Pull Request.
|
|
||||||
closeComment: >
|
|
||||||
Thank you for your contribution!
|
|
||||||
|
|
||||||
This pull request has been automatically closed because it has not had activity in the last 30 days.
|
|
||||||
Please feel free to give a status update now, ping for review, or re-open when it's ready.
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 30
|
|
||||||
exemptLabels:
|
|
||||||
- awaiting review
|
|
||||||
- breaking_change
|
|
||||||
- in progress
|
|
||||||
- on hold
|
|
||||||
|
|
||||||
# Issue specific configuration
|
|
||||||
issues:
|
|
||||||
staleLabel: stale
|
|
||||||
limitPerRun: 10
|
|
||||||
daysUntilStale: 90
|
|
||||||
daysUntilClose: 30
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had activity in the
|
|
||||||
last 90 days. It will be closed in the next 30 days unless it is tagged properly or other activity
|
|
||||||
occurs.
|
|
||||||
|
|
||||||
For maintainers: Please label with `bug`, `in progress`, `on hold`, `discussion` or `to do` to prevent
|
|
||||||
the issue from being re-flagged.
|
|
||||||
closeComment: >
|
|
||||||
This issue has been automatically closed because it has not had activity in the last 30 days.
|
|
||||||
If this issue is still valid, re-open the issue and let us know.
|
|
||||||
exemptLabels:
|
|
||||||
- bug
|
|
||||||
- in progress
|
|
||||||
- on hold
|
|
||||||
- discussion
|
|
||||||
- to do
|
|
||||||
4
.github/workflows/api.yml
vendored
4
.github/workflows/api.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
@@ -35,4 +35,4 @@ jobs:
|
|||||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||||
SOURCE_DIR: 'api_data'
|
SOURCE_DIR: '.build/api_data'
|
||||||
|
|||||||
18
.github/workflows/auto_approve.yml
vendored
Normal file
18
.github/workflows/auto_approve.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: Automatic Approve
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "*/5 * * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
automatic_approve:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: mheap/automatic-approve-action@v1
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||||
|
workflows: "format.yml,lint.yml,unit_test.yml"
|
||||||
|
dangerous_files: "lib/python/,Makefile,paths.mk,builddefs/"
|
||||||
33
.github/workflows/auto_tag.yaml
vendored
33
.github/workflows/auto_tag.yaml
vendored
@@ -1,33 +0,0 @@
|
|||||||
name: Essential files modified
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
paths:
|
|
||||||
- quantum/**/*
|
|
||||||
- tmk_core/**/*
|
|
||||||
- drivers/**/*
|
|
||||||
- tests/**/*
|
|
||||||
- util/**/*
|
|
||||||
- platforms/**/*
|
|
||||||
- Makefile
|
|
||||||
- '*.mk'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
tag:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
# protect against those who develop with their fork on master
|
|
||||||
if: github.repository == 'qmk/qmk_firmware'
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Bump version and push tag
|
|
||||||
uses: anothrNick/github-tag-action@1.26.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
DEFAULT_BUMP: 'patch'
|
|
||||||
33
.github/workflows/auto_tag.yml
vendored
Normal file
33
.github/workflows/auto_tag.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Essential files modified
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- quantum/**/*
|
||||||
|
- tmk_core/**/*
|
||||||
|
- drivers/**/*
|
||||||
|
- tests/**/*
|
||||||
|
- util/**/*
|
||||||
|
- platforms/**/*
|
||||||
|
- Makefile
|
||||||
|
- '*.mk'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tag:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# protect against those who develop with their fork on master
|
||||||
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Bump version and push tag
|
||||||
|
uses: anothrNick/github-tag-action@1.39.0
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DEFAULT_BUMP: 'patch'
|
||||||
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
container: qmkfm/qmk_cli
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
8
.github/workflows/develop_api.yml
vendored
8
.github/workflows/develop_api.yml
vendored
@@ -18,13 +18,15 @@ jobs:
|
|||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Generate API Data
|
- name: Generate API Data
|
||||||
run: qmk generate-api
|
run: |
|
||||||
|
python3 -m pip install -r requirements-dev.txt
|
||||||
|
qmk generate-api
|
||||||
|
|
||||||
- name: Upload API Data
|
- name: Upload API Data
|
||||||
uses: jakejarvis/s3-sync-action@master
|
uses: jakejarvis/s3-sync-action@master
|
||||||
@@ -35,4 +37,4 @@ jobs:
|
|||||||
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.SPACES_ACCESS_KEY }}
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET_KEY }}
|
||||||
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
AWS_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
|
||||||
SOURCE_DIR: 'api_data'
|
SOURCE_DIR: '.build/api_data'
|
||||||
|
|||||||
11
.github/workflows/develop_update.yml
vendored
11
.github/workflows/develop_update.yml
vendored
@@ -5,7 +5,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
develop_update:
|
develop_update:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -13,8 +12,9 @@ jobs:
|
|||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
|
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Checkout develop
|
- name: Checkout develop
|
||||||
@@ -22,14 +22,7 @@ jobs:
|
|||||||
git fetch origin master develop
|
git fetch origin master develop
|
||||||
git checkout develop
|
git checkout develop
|
||||||
|
|
||||||
- name: Check if branch locked
|
|
||||||
id: check_locked
|
|
||||||
uses: andstor/file-existence-action@v1
|
|
||||||
with:
|
|
||||||
files: ".locked"
|
|
||||||
|
|
||||||
- name: Update develop from master
|
- name: Update develop from master
|
||||||
if: steps.check_locked.outputs.files_exists == 'false'
|
|
||||||
run: |
|
run: |
|
||||||
git config --global user.name "QMK Bot"
|
git config --global user.name "QMK Bot"
|
||||||
git config --global user.email "hello@qmk.fm"
|
git config --global user.email "hello@qmk.fm"
|
||||||
|
|||||||
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
if: github.repository == 'qmk/qmk_firmware'
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
fetch-depth: 1
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
qmk --verbose generate-docs
|
qmk --verbose generate-docs
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
uses: JamesIves/github-pages-deploy-action@3.7.1
|
uses: JamesIves/github-pages-deploy-action@v4.4.0
|
||||||
with:
|
with:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
BASE_BRANCH: master
|
BASE_BRANCH: master
|
||||||
|
|||||||
35
.github/workflows/feature_branch_update.yml
vendored
Normal file
35
.github/workflows/feature_branch_update.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: Update feature branches after develop merge
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
feature_branch_update:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
if: github.repository == 'qmk/qmk_firmware'
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
branch:
|
||||||
|
- xap
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout branch
|
||||||
|
run: |
|
||||||
|
git fetch origin develop ${{ matrix.branch }}
|
||||||
|
git checkout ${{ matrix.branch }}
|
||||||
|
|
||||||
|
- name: Update branch from develop
|
||||||
|
run: |
|
||||||
|
git config --global user.name "QMK Bot"
|
||||||
|
git config --global user.email "hello@qmk.fm"
|
||||||
|
git merge origin/develop
|
||||||
|
git push origin ${{ matrix.branch }}
|
||||||
51
.github/workflows/format.yaml
vendored
51
.github/workflows/format.yaml
vendored
@@ -1,51 +0,0 @@
|
|||||||
name: PR Lint Format
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'drivers/**'
|
|
||||||
- 'lib/arm_atsam/**'
|
|
||||||
- 'lib/lib8tion/**'
|
|
||||||
- 'lib/python/**'
|
|
||||||
- 'platforms/**'
|
|
||||||
- 'quantum/**'
|
|
||||||
- 'tests/**'
|
|
||||||
- 'tmk_core/**'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container: qmkfm/qmk_cli
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
apt-get update && apt-get install -y dos2unix
|
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- uses: trilom/file-changes-action@v1.2.4
|
|
||||||
id: file_changes
|
|
||||||
with:
|
|
||||||
output: ' '
|
|
||||||
fileOutput: ' '
|
|
||||||
|
|
||||||
- name: Run qmk formatters
|
|
||||||
shell: 'bash {0}'
|
|
||||||
run: |
|
|
||||||
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt
|
|
||||||
qmk format-c --core-only $(< ~/files_changed.txt) || true
|
|
||||||
qmk format-python $(< ~/files_changed.txt) || true
|
|
||||||
qmk format-text $(< ~/files_changed.txt) || true
|
|
||||||
|
|
||||||
- name: Fail when formatting required
|
|
||||||
run: |
|
|
||||||
git diff
|
|
||||||
for file in $(git diff --name-only); do
|
|
||||||
echo "File '${file}' Requires Formatting"
|
|
||||||
echo "::error file=${file}::Requires Formatting"
|
|
||||||
done
|
|
||||||
test -z "$(git diff --name-only)"
|
|
||||||
51
.github/workflows/format.yml
vendored
Normal file
51
.github/workflows/format.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
name: PR Lint Format
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'drivers/**'
|
||||||
|
- 'lib/arm_atsam/**'
|
||||||
|
- 'lib/lib8tion/**'
|
||||||
|
- 'lib/python/**'
|
||||||
|
- 'platforms/**'
|
||||||
|
- 'quantum/**'
|
||||||
|
- 'tests/**'
|
||||||
|
- 'tmk_core/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
|
- uses: trilom/file-changes-action@v1.2.4
|
||||||
|
id: file_changes
|
||||||
|
with:
|
||||||
|
output: ' '
|
||||||
|
fileOutput: ' '
|
||||||
|
|
||||||
|
- name: Run qmk formatters
|
||||||
|
shell: 'bash {0}'
|
||||||
|
run: |
|
||||||
|
cat ~/files_added.txt ~/files_modified.txt > ~/files_changed.txt
|
||||||
|
qmk format-c --core-only $(< ~/files_changed.txt) || true
|
||||||
|
qmk format-python $(< ~/files_changed.txt) || true
|
||||||
|
qmk format-text $(< ~/files_changed.txt) || true
|
||||||
|
|
||||||
|
- name: Fail when formatting required
|
||||||
|
run: |
|
||||||
|
git diff
|
||||||
|
for file in $(git diff --name-only); do
|
||||||
|
echo "File '${file}' Requires Formatting"
|
||||||
|
echo "::error file=${file}::Requires Formatting"
|
||||||
|
done
|
||||||
|
test -z "$(git diff --name-only)"
|
||||||
49
.github/workflows/format_push.yaml
vendored
49
.github/workflows/format_push.yaml
vendored
@@ -1,49 +0,0 @@
|
|||||||
name: Lint Format
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
container: qmkfm/qmk_cli
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
apt-get update && apt-get install -y dos2unix
|
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Run qmk formatters
|
|
||||||
shell: 'bash {0}'
|
|
||||||
run: |
|
|
||||||
qmk format-c -a
|
|
||||||
qmk format-python -a
|
|
||||||
qmk format-text -a
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
|
||||||
|
|
||||||
- name: Become QMK Bot
|
|
||||||
run: |
|
|
||||||
git config user.name 'QMK Bot'
|
|
||||||
git config user.email 'hello@qmk.fm'
|
|
||||||
|
|
||||||
- name: Create Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v3
|
|
||||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
|
||||||
delete-branch: true
|
|
||||||
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
|
||||||
author: QMK Bot <hello@qmk.fm>
|
|
||||||
committer: QMK Bot <hello@qmk.fm>
|
|
||||||
commit-message: Format code according to conventions
|
|
||||||
title: '[CI] Format code according to conventions'
|
|
||||||
49
.github/workflows/format_push.yml
vendored
Normal file
49
.github/workflows/format_push.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Lint Format
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
|
- name: Run qmk formatters
|
||||||
|
shell: 'bash {0}'
|
||||||
|
run: |
|
||||||
|
qmk format-c -a
|
||||||
|
qmk format-python -a
|
||||||
|
qmk format-text -a
|
||||||
|
git diff
|
||||||
|
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
|
- name: Become QMK Bot
|
||||||
|
run: |
|
||||||
|
git config user.name 'QMK Bot'
|
||||||
|
git config user.email 'hello@qmk.fm'
|
||||||
|
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v4
|
||||||
|
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||||
|
delete-branch: true
|
||||||
|
branch: bugfix/format_${{ env.GITHUB_REF_SLUG }}
|
||||||
|
author: QMK Bot <hello@qmk.fm>
|
||||||
|
committer: QMK Bot <hello@qmk.fm>
|
||||||
|
commit-message: Format code according to conventions
|
||||||
|
title: '[CI] Format code according to conventions'
|
||||||
5
.github/workflows/lint.yml
vendored
5
.github/workflows/lint.yml
vendored
@@ -12,10 +12,13 @@ jobs:
|
|||||||
container: qmkfm/qmk_cli
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip3 install -r requirements-dev.txt
|
||||||
|
|
||||||
- uses: trilom/file-changes-action@v1.2.4
|
- uses: trilom/file-changes-action@v1.2.4
|
||||||
id: file_changes
|
id: file_changes
|
||||||
with:
|
with:
|
||||||
|
|||||||
64
.github/workflows/stale.yml
vendored
Normal file
64
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
name: 'Close stale issues and PRs'
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
exempt-draft-pr: true
|
||||||
|
ascending: true
|
||||||
|
operations-per-run: 150
|
||||||
|
|
||||||
|
stale-issue-label: stale
|
||||||
|
days-before-issue-stale: 90
|
||||||
|
days-before-issue-close: 30
|
||||||
|
exempt-issue-labels: bug,in progress,on hold,discussion,to do
|
||||||
|
|
||||||
|
stale-issue-message: >
|
||||||
|
This issue has been automatically marked as stale because it has not had activity in the
|
||||||
|
last 90 days. It will be closed in the next 30 days unless it is tagged properly or other activity
|
||||||
|
occurs.
|
||||||
|
|
||||||
|
For maintainers: Please label with `bug`, `in progress`, `on hold`, `discussion` or `to do` to prevent
|
||||||
|
the issue from being re-flagged.
|
||||||
|
|
||||||
|
close-issue-message: >
|
||||||
|
This issue has been automatically closed because it has not had activity in the last 30 days.
|
||||||
|
If this issue is still valid, re-open the issue and let us know.
|
||||||
|
|
||||||
|
// [stale-action-closed]
|
||||||
|
|
||||||
|
stale-pr-label: stale
|
||||||
|
days-before-pr-stale: 45
|
||||||
|
days-before-pr-close: 30
|
||||||
|
exempt-pr-labels: bug,awaiting review,breaking_change,in progress,on hold
|
||||||
|
|
||||||
|
stale-pr-message: >
|
||||||
|
Thank you for your contribution!
|
||||||
|
|
||||||
|
This pull request has been automatically marked as stale because it has not had
|
||||||
|
activity in the last 45 days. It will be closed in 30 days if no further activity occurs.
|
||||||
|
Please feel free to give a status update now, or re-open when it's ready.
|
||||||
|
|
||||||
|
For maintainers: Please label with `bug`, `awaiting review`, `breaking_change`, `in progress`, or `on hold`
|
||||||
|
to prevent the issue from being re-flagged.
|
||||||
|
|
||||||
|
close-pr-message: >
|
||||||
|
Thank you for your contribution!
|
||||||
|
|
||||||
|
This pull request has been automatically closed because it has not had activity in the last 30 days.
|
||||||
|
Please feel free to give a status update now, ping for review, or re-open when it's ready.
|
||||||
|
|
||||||
|
// [stale-action-closed]
|
||||||
6
.github/workflows/unit_test.yml
vendored
6
.github/workflows/unit_test.yml
vendored
@@ -20,11 +20,13 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
container: qmkfm/base_container
|
container: qmkfm/qmk_cli
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pip3 install -r requirements-dev.txt
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: make test:all
|
run: make test:all
|
||||||
|
|||||||
28
.gitignore
vendored
28
.gitignore
vendored
@@ -3,6 +3,11 @@
|
|||||||
*.swp
|
*.swp
|
||||||
*~
|
*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Merge files
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
.clang_complete
|
.clang_complete
|
||||||
@@ -18,7 +23,6 @@
|
|||||||
|
|
||||||
# QMK-specific
|
# QMK-specific
|
||||||
api_data/v1
|
api_data/v1
|
||||||
doxygen/
|
|
||||||
quantum/version.h
|
quantum/version.h
|
||||||
*.bin
|
*.bin
|
||||||
*.eep
|
*.eep
|
||||||
@@ -27,16 +31,11 @@ quantum/version.h
|
|||||||
*.uf2
|
*.uf2
|
||||||
|
|
||||||
# Old-style QMK Makefiles
|
# Old-style QMK Makefiles
|
||||||
/keyboards/*/Makefile
|
/keyboards/**/Makefile
|
||||||
/keyboards/*/*/Makefile
|
|
||||||
/keyboards/*/*/*/Makefile
|
# kbfirmware....
|
||||||
/keyboards/*/*/*/*/Makefile
|
/keyboards/**/kb.h
|
||||||
/keyboards/*/*/*/*/*/Makefile
|
/keyboards/**/kb.c
|
||||||
/keyboards/*/keymaps/Makefile
|
|
||||||
/keyboards/*/*/keymaps/Makefile
|
|
||||||
/keyboards/*/*/*/keymaps/Makefile
|
|
||||||
/keyboards/*/*/*/*/keymaps/Makefile
|
|
||||||
/keyboards/*/*/*/*/*/keymaps/Makefile
|
|
||||||
|
|
||||||
# Eclipse/PyCharm/Other IDE Settings
|
# Eclipse/PyCharm/Other IDE Settings
|
||||||
*.iml
|
*.iml
|
||||||
@@ -67,10 +66,12 @@ CMakeLists.txt
|
|||||||
.vscode/temp.sql
|
.vscode/temp.sql
|
||||||
tags
|
tags
|
||||||
|
|
||||||
# Ignore image files
|
# Ignore image/font files
|
||||||
*.gif
|
*.gif
|
||||||
*.jpg
|
*.jpg
|
||||||
*.png
|
*.png
|
||||||
|
*.ttf
|
||||||
|
*.otf
|
||||||
|
|
||||||
# Things Travis sees
|
# Things Travis sees
|
||||||
/.vs
|
/.vs
|
||||||
@@ -91,3 +92,6 @@ user_song_list.h
|
|||||||
compile_commands.json
|
compile_commands.json
|
||||||
.clangd/
|
.clangd/
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
|
# VIA(L) json files that don't belong in QMK repo
|
||||||
|
via*.json
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -18,3 +18,6 @@
|
|||||||
[submodule "lib/printf"]
|
[submodule "lib/printf"]
|
||||||
path = lib/printf
|
path = lib/printf
|
||||||
url = https://github.com/qmk/printf
|
url = https://github.com/qmk/printf
|
||||||
|
[submodule "lib/pico-sdk"]
|
||||||
|
path = lib/pico-sdk
|
||||||
|
url = https://github.com/qmk/pico-sdk.git
|
||||||
|
|||||||
6
Doxyfile
6
Doxyfile
@@ -21,7 +21,7 @@ DOXYFILE_ENCODING = UTF-8
|
|||||||
PROJECT_NAME = "QMK Firmware"
|
PROJECT_NAME = "QMK Firmware"
|
||||||
PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
|
PROJECT_NUMBER = https://github.com/qmk/qmk_firmware
|
||||||
PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
|
PROJECT_BRIEF = "Keyboard controller firmware for Atmel AVR and ARM USB families"
|
||||||
OUTPUT_DIRECTORY = doxygen
|
OUTPUT_DIRECTORY = .build/doxygen
|
||||||
ALLOW_UNICODE_NAMES = NO
|
ALLOW_UNICODE_NAMES = NO
|
||||||
OUTPUT_LANGUAGE = English
|
OUTPUT_LANGUAGE = English
|
||||||
BRIEF_MEMBER_DESC = YES
|
BRIEF_MEMBER_DESC = YES
|
||||||
@@ -145,7 +145,7 @@ FILE_PATTERNS = *.c \
|
|||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
EXCLUDE =
|
EXCLUDE =
|
||||||
EXCLUDE_SYMLINKS = NO
|
EXCLUDE_SYMLINKS = NO
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS = */protocol/arm_atsam/*
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS =
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH =
|
||||||
EXAMPLE_PATTERNS = *
|
EXAMPLE_PATTERNS = *
|
||||||
@@ -209,7 +209,7 @@ EXPAND_ONLY_PREDEF = NO
|
|||||||
SEARCH_INCLUDES = YES
|
SEARCH_INCLUDES = YES
|
||||||
INCLUDE_PATH =
|
INCLUDE_PATH =
|
||||||
INCLUDE_FILE_PATTERNS =
|
INCLUDE_FILE_PATTERNS =
|
||||||
PREDEFINED =
|
PREDEFINED = __DOXYGEN__ PROGMEM
|
||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
SKIP_FUNCTION_MACROS = YES
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
|
||||||
|
|||||||
136
Makefile
136
Makefile
@@ -19,6 +19,10 @@ endif
|
|||||||
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
|
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
|
||||||
override SILENT := false
|
override SILENT := false
|
||||||
|
|
||||||
|
ifdef SKIP_VERSION
|
||||||
|
SKIP_GIT := yes
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef SUB_IS_SILENT
|
ifndef SUB_IS_SILENT
|
||||||
ifndef SKIP_GIT
|
ifndef SKIP_GIT
|
||||||
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
||||||
@@ -50,48 +54,12 @@ ABS_ROOT_MAKEFILE := $(abspath $(ROOT_MAKEFILE))
|
|||||||
ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
|
ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
|
||||||
ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
|
ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
|
||||||
STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
|
STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
|
||||||
BUILD_DIR := $(ROOT_DIR)/.build
|
|
||||||
TEST_DIR := $(BUILD_DIR)/test
|
include paths.mk
|
||||||
|
|
||||||
|
TEST_OUTPUT_DIR := $(BUILD_DIR)/test
|
||||||
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
||||||
|
|
||||||
# Helper function to process the newt element of a space separated path
|
|
||||||
# It works a bit like the traditional functional head tail
|
|
||||||
# so the CURRENT_PATH_ELEMENT will become the new head
|
|
||||||
# and the PATH_ELEMENTS are the rest that are still unprocessed
|
|
||||||
define NEXT_PATH_ELEMENT
|
|
||||||
$$(eval CURRENT_PATH_ELEMENT := $$(firstword $$(PATH_ELEMENTS)))
|
|
||||||
$$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS)))
|
|
||||||
endef
|
|
||||||
|
|
||||||
# We change the / to spaces so that we more easily can work with the elements
|
|
||||||
# separately
|
|
||||||
PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
|
|
||||||
# Initialize the path elements list for further processing
|
|
||||||
$(eval $(call NEXT_PATH_ELEMENT))
|
|
||||||
|
|
||||||
|
|
||||||
# Phony targets to enable a few simple make commands outside the main processing below.
|
|
||||||
.PHONY: list-keyboards
|
|
||||||
list-keyboards:
|
|
||||||
util/list_keyboards.sh | sort -u | tr '\n' ' '
|
|
||||||
|
|
||||||
.PHONY: generate-keyboards-file
|
|
||||||
generate-keyboards-file:
|
|
||||||
util/list_keyboards.sh | sort -u
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
echo -n 'Deleting .build/ ... '
|
|
||||||
rm -rf $(BUILD_DIR)
|
|
||||||
echo 'done.'
|
|
||||||
|
|
||||||
.PHONY: distclean
|
|
||||||
distclean: clean
|
|
||||||
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
|
||||||
rm -f *.bin *.hex *.uf2
|
|
||||||
echo 'done.'
|
|
||||||
|
|
||||||
|
|
||||||
.DEFAULT_GOAL := all:all
|
.DEFAULT_GOAL := all:all
|
||||||
|
|
||||||
|
|
||||||
@@ -119,53 +87,20 @@ endef
|
|||||||
# a function that returns the value
|
# a function that returns the value
|
||||||
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
|
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
|
||||||
|
|
||||||
|
# Try to find a match for the start of the rule to be checked
|
||||||
# Recursively try to find a match for the start of the rule to be checked
|
|
||||||
# $1 The list to be checked
|
|
||||||
# If a match is found, then RULE_FOUND is set to true
|
|
||||||
# and MATCHED_ITEM to the item that was matched
|
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
|
|
||||||
ifneq ($1,)
|
|
||||||
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
|
||||||
MATCHED_ITEM := $$(firstword $1)
|
|
||||||
else
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endef
|
|
||||||
|
|
||||||
# A recursive helper function for finding the longest match
|
|
||||||
# $1 The list to be checked
|
|
||||||
# It works by always removing the currently matched item from the list
|
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
|
||||||
# Stop the recursion when the list is empty
|
|
||||||
ifneq ($1,)
|
|
||||||
RULE_BEFORE := $$(RULE)
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
|
||||||
# If a match is found in the current list, otherwise just return what we had before
|
|
||||||
ifeq ($$(RULE_FOUND),true)
|
|
||||||
# Save the best match so far and call itself recursively
|
|
||||||
BEST_MATCH := $$(MATCHED_ITEM)
|
|
||||||
BEST_MATCH_RULE := $$(RULE)
|
|
||||||
RULE_FOUND := false
|
|
||||||
RULE := $$(RULE_BEFORE)
|
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1)))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endef
|
|
||||||
|
|
||||||
|
|
||||||
# Recursively try to find the longest match for the start of the rule to be checked
|
|
||||||
# $1 The list to be checked
|
# $1 The list to be checked
|
||||||
# If a match is found, then RULE_FOUND is set to true
|
# If a match is found, then RULE_FOUND is set to true
|
||||||
# and MATCHED_ITEM to the item that was matched
|
# and MATCHED_ITEM to the item that was matched
|
||||||
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
||||||
BEST_MATCH :=
|
# Split on ":", padding with empty strings to avoid indexing issues
|
||||||
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1))
|
TOKEN1:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[0])" $$(RULE))
|
||||||
ifneq ($$(BEST_MATCH),)
|
TOKENr:=$$(shell python3 -c "import sys; print((sys.argv[1].split(':',1)+[''])[1])" $$(RULE))
|
||||||
|
|
||||||
|
FOUNDx:=$$(shell echo $1 | tr " " "\n" | grep -Fx $$(TOKEN1))
|
||||||
|
ifneq ($$(FOUNDx),)
|
||||||
|
RULE := $$(TOKENr)
|
||||||
RULE_FOUND := true
|
RULE_FOUND := true
|
||||||
RULE := $$(BEST_MATCH_RULE)
|
MATCHED_ITEM := $$(TOKEN1)
|
||||||
MATCHED_ITEM := $$(BEST_MATCH)
|
|
||||||
else
|
else
|
||||||
RULE_FOUND := false
|
RULE_FOUND := false
|
||||||
MATCHED_ITEM :=
|
MATCHED_ITEM :=
|
||||||
@@ -340,7 +275,7 @@ define PARSE_KEYMAP
|
|||||||
# Specify the variables that we are passing forward to submake
|
# Specify the variables that we are passing forward to submake
|
||||||
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY) QMK_BIN=$$(QMK_BIN)
|
MAKE_VARS := KEYBOARD=$$(CURRENT_KB) KEYMAP=$$(CURRENT_KM) REQUIRE_PLATFORM_KEY=$$(REQUIRE_PLATFORM_KEY) QMK_BIN=$$(QMK_BIN)
|
||||||
# And the first part of the make command
|
# And the first part of the make command
|
||||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET)
|
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_keyboard.mk $$(MAKE_TARGET)
|
||||||
# The message to display
|
# The message to display
|
||||||
MAKE_MSG := $$(MSG_MAKE_KB)
|
MAKE_MSG := $$(MSG_MAKE_KB)
|
||||||
# We run the command differently, depending on if we want more output or not
|
# We run the command differently, depending on if we want more output or not
|
||||||
@@ -382,12 +317,12 @@ define BUILD_TEST
|
|||||||
TEST_NAME := $$(notdir $$(TEST_PATH))
|
TEST_NAME := $$(notdir $$(TEST_PATH))
|
||||||
MAKE_TARGET := $2
|
MAKE_TARGET := $2
|
||||||
COMMAND := $1
|
COMMAND := $1
|
||||||
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET)
|
MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f $(BUILDDEFS_PATH)/build_test.mk $$(MAKE_TARGET)
|
||||||
MAKE_VARS := TEST=$$(TEST_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
|
MAKE_VARS := TEST=$$(TEST_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
|
||||||
MAKE_MSG := $$(MSG_MAKE_TEST)
|
MAKE_MSG := $$(MSG_MAKE_TEST)
|
||||||
$$(eval $$(call BUILD))
|
$$(eval $$(call BUILD))
|
||||||
ifneq ($$(MAKE_TARGET),clean)
|
ifneq ($$(MAKE_TARGET),clean)
|
||||||
TEST_EXECUTABLE := $$(TEST_DIR)/$$(TEST_NAME).elf
|
TEST_EXECUTABLE := $$(TEST_OUTPUT_DIR)/$$(TEST_NAME).elf
|
||||||
TESTS += $$(TEST_NAME)
|
TESTS += $$(TEST_NAME)
|
||||||
TEST_MSG := $$(MSG_TEST)
|
TEST_MSG := $$(MSG_TEST)
|
||||||
$$(TEST_NAME)_COMMAND := \
|
$$(TEST_NAME)_COMMAND := \
|
||||||
@@ -404,6 +339,7 @@ define PARSE_TEST
|
|||||||
TESTS :=
|
TESTS :=
|
||||||
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
|
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
|
||||||
TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME):,,$$(RULE)))
|
TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME):,,$$(RULE)))
|
||||||
|
include $(BUILDDEFS_PATH)/testlist.mk
|
||||||
ifeq ($$(TEST_NAME),all)
|
ifeq ($$(TEST_NAME),all)
|
||||||
MATCHED_TESTS := $$(TEST_LIST)
|
MATCHED_TESTS := $$(TEST_LIST)
|
||||||
else
|
else
|
||||||
@@ -426,7 +362,6 @@ define SET_SILENT_MODE
|
|||||||
endif
|
endif
|
||||||
endef
|
endef
|
||||||
|
|
||||||
include paths.mk
|
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
|
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
|
||||||
@@ -466,6 +401,7 @@ ifndef SKIP_GIT
|
|||||||
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
|
||||||
if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
|
if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
|
||||||
if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
|
if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
|
||||||
|
if [ ! -e lib/pico-sdk ]; then git submodule sync lib/pico-sdk && git submodule update --depth 50 --init lib/pico-sdk; fi
|
||||||
git submodule status --recursive 2>/dev/null | \
|
git submodule status --recursive 2>/dev/null | \
|
||||||
while IFS= read -r x; do \
|
while IFS= read -r x; do \
|
||||||
case "$$x" in \
|
case "$$x" in \
|
||||||
@@ -496,14 +432,22 @@ git-submodule:
|
|||||||
git submodule sync --recursive
|
git submodule sync --recursive
|
||||||
git submodule update --init --recursive --progress
|
git submodule update --init --recursive --progress
|
||||||
|
|
||||||
# Generate the version.h file
|
.PHONY: list-keyboards
|
||||||
ifdef SKIP_GIT
|
list-keyboards:
|
||||||
VERSION_H_FLAGS := --skip-git
|
util/list_keyboards.sh | sort -u | tr '\n' ' '
|
||||||
endif
|
|
||||||
ifdef SKIP_VERSION
|
|
||||||
VERSION_H_FLAGS := --skip-all
|
|
||||||
SKIP_GIT := yes
|
|
||||||
endif
|
|
||||||
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o quantum/version.h)
|
|
||||||
|
|
||||||
include $(ROOT_DIR)/testlist.mk
|
.PHONY: generate-keyboards-file
|
||||||
|
generate-keyboards-file:
|
||||||
|
util/list_keyboards.sh | sort -u
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
echo -n 'Deleting .build/ ... '
|
||||||
|
rm -rf $(BUILD_DIR)
|
||||||
|
echo 'done.'
|
||||||
|
|
||||||
|
.PHONY: distclean
|
||||||
|
distclean: clean
|
||||||
|
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
||||||
|
rm -f *.bin *.hex *.uf2
|
||||||
|
echo 'done.'
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
theme: jekyll-theme-cayman
|
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
# bootloadhid HIDBootFlash compatible (ATmega32A)
|
# bootloadhid HIDBootFlash compatible (ATmega32A)
|
||||||
# usbasploader USBaspLoader (ATmega328P)
|
# usbasploader USBaspLoader (ATmega328P)
|
||||||
# ARM:
|
# ARM:
|
||||||
|
# halfkay PJRC Teensy
|
||||||
# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
|
# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
|
||||||
# stm32duino STM32Duino (STM32F103x8)
|
# stm32duino STM32Duino (STM32F103x8)
|
||||||
# stm32-dfu STM32 USB DFU in ROM
|
# stm32-dfu STM32 USB DFU in ROM
|
||||||
@@ -37,12 +38,23 @@
|
|||||||
# RISC-V:
|
# RISC-V:
|
||||||
# gd32v-dfu GD32V USB DFU in ROM
|
# gd32v-dfu GD32V USB DFU in ROM
|
||||||
#
|
#
|
||||||
|
# If you need to provide your own implementation, you can set inside `rules.mk`
|
||||||
|
# `BOOTLOADER = custom` -- you'll need to provide your own implementations. See
|
||||||
|
# the respective file under `platforms/<PLATFORM>/bootloaders/custom.c` to see
|
||||||
|
# which functions may be overridden.
|
||||||
|
#
|
||||||
# BOOTLOADER_SIZE can still be defined manually, but it's recommended
|
# BOOTLOADER_SIZE can still be defined manually, but it's recommended
|
||||||
# you add any possible configuration to this list
|
# you add any possible configuration to this list
|
||||||
|
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), custom)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_CUSTOM
|
||||||
|
BOOTLOADER_TYPE = custom
|
||||||
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
|
ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
|
OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
@@ -53,6 +65,8 @@ endif
|
|||||||
ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
|
ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_LUFA_DFU
|
OPT_DEFS += -DBOOTLOADER_LUFA_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
@@ -63,6 +77,8 @@ endif
|
|||||||
ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
|
ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_QMK_DFU
|
OPT_DEFS += -DBOOTLOADER_QMK_DFU
|
||||||
OPT_DEFS += -DBOOTLOADER_DFU
|
OPT_DEFS += -DBOOTLOADER_DFU
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
@@ -73,31 +89,49 @@ endif
|
|||||||
ifeq ($(strip $(BOOTLOADER)), qmk-hid)
|
ifeq ($(strip $(BOOTLOADER)), qmk-hid)
|
||||||
OPT_DEFS += -DBOOTLOADER_QMK_HID
|
OPT_DEFS += -DBOOTLOADER_QMK_HID
|
||||||
OPT_DEFS += -DBOOTLOADER_HID
|
OPT_DEFS += -DBOOTLOADER_HID
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
BOOTLOADER_SIZE ?= 4096
|
BOOTLOADER_SIZE ?= 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
|
BOOTLOADER_TYPE = halfkay
|
||||||
|
|
||||||
|
# Teensy 2.0
|
||||||
ifeq ($(strip $(MCU)), atmega32u4)
|
ifeq ($(strip $(MCU)), atmega32u4)
|
||||||
BOOTLOADER_SIZE = 512
|
BOOTLOADER_SIZE = 512
|
||||||
endif
|
endif
|
||||||
|
# Teensy 2.0++
|
||||||
ifeq ($(strip $(MCU)), at90usb1286)
|
ifeq ($(strip $(MCU)), at90usb1286)
|
||||||
BOOTLOADER_SIZE = 1024
|
BOOTLOADER_SIZE = 1024
|
||||||
endif
|
endif
|
||||||
|
# Teensy LC, 3.0, 3.1/2, 3.5, 3.6
|
||||||
|
ifneq (,$(filter $(MCU_ORIG), MKL26Z64 MK20DX128 MK20DX256 MK64FX512 MK66FX1M0))
|
||||||
|
FIRMWARE_FORMAT = hex
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), caterina)
|
ifeq ($(strip $(BOOTLOADER)), caterina)
|
||||||
OPT_DEFS += -DBOOTLOADER_CATERINA
|
OPT_DEFS += -DBOOTLOADER_CATERINA
|
||||||
|
BOOTLOADER_TYPE = caterina
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
|
ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
|
||||||
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
|
||||||
|
BOOTLOADER_TYPE = bootloadhid
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
|
ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
|
||||||
OPT_DEFS += -DBOOTLOADER_USBASP
|
OPT_DEFS += -DBOOTLOADER_USBASP
|
||||||
|
BOOTLOADER_TYPE = usbasploader
|
||||||
|
|
||||||
BOOTLOADER_SIZE = 4096
|
BOOTLOADER_SIZE = 4096
|
||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
|
||||||
OPT_DEFS += -DBOOTLOADER_MS
|
OPT_DEFS += -DBOOTLOADER_MS
|
||||||
|
BOOTLOADER_TYPE = dfu
|
||||||
|
|
||||||
BOOTLOADER_SIZE ?= 8192
|
BOOTLOADER_SIZE ?= 8192
|
||||||
FIRMWARE_FORMAT = bin
|
FIRMWARE_FORMAT = bin
|
||||||
cpfirmware: lufa_warning
|
cpfirmware: lufa_warning
|
||||||
@@ -115,6 +149,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_STM32_DFU
|
OPT_DEFS += -DBOOTLOADER_STM32_DFU
|
||||||
|
BOOTLOADER_TYPE = stm32_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
|
||||||
@@ -122,6 +157,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_APM32_DFU
|
OPT_DEFS += -DBOOTLOADER_APM32_DFU
|
||||||
|
BOOTLOADER_TYPE = stm32_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
|
||||||
@@ -129,6 +165,7 @@ ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
||||||
OPT_DEFS += -DBOOTLOADER_GD32V_DFU
|
OPT_DEFS += -DBOOTLOADER_GD32V_DFU
|
||||||
|
BOOTLOADER_TYPE = gd32v_dfu
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
|
DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
|
||||||
@@ -136,6 +173,8 @@ ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), kiibohd)
|
ifeq ($(strip $(BOOTLOADER)), kiibohd)
|
||||||
OPT_DEFS += -DBOOTLOADER_KIIBOHD
|
OPT_DEFS += -DBOOTLOADER_KIIBOHD
|
||||||
|
BOOTLOADER_TYPE = kiibohd
|
||||||
|
|
||||||
ifeq ($(strip $(MCU_ORIG)), MK20DX128)
|
ifeq ($(strip $(MCU_ORIG)), MK20DX128)
|
||||||
MCU_LDSCRIPT = MK20DX128BLDR4
|
MCU_LDSCRIPT = MK20DX128BLDR4
|
||||||
endif
|
endif
|
||||||
@@ -151,8 +190,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
|
|||||||
OPT_DEFS += -DBOOTLOADER_STM32DUINO
|
OPT_DEFS += -DBOOTLOADER_STM32DUINO
|
||||||
MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
|
MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
|
||||||
BOARD = STM32_F103_STM32DUINO
|
BOARD = STM32_F103_STM32DUINO
|
||||||
# STM32F103 does NOT have an USB bootloader in ROM (only serial), so setting anything here does not make much sense
|
BOOTLOADER_TYPE = stm32duino
|
||||||
STM32_BOOTLOADER_ADDRESS = 0x80000000
|
|
||||||
|
|
||||||
# Options to pass to dfu-util when flashing
|
# Options to pass to dfu-util when flashing
|
||||||
DFU_ARGS = -d 1EAF:0003 -a 2 -R
|
DFU_ARGS = -d 1EAF:0003 -a 2 -R
|
||||||
@@ -160,4 +198,25 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
|
||||||
OPT_DEFS += -DBOOTLOADER_TINYUF2
|
OPT_DEFS += -DBOOTLOADER_TINYUF2
|
||||||
|
BOOTLOADER_TYPE = tinyuf2
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), rp2040)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_RP2040
|
||||||
|
BOOTLOADER_TYPE = rp2040
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), halfkay)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_HALFKAY
|
||||||
|
BOOTLOADER_TYPE = halfkay
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), md-boot)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_MD_BOOT
|
||||||
|
BOOTLOADER_TYPE = md_boot
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BOOTLOADER)), wb32-dfu)
|
||||||
|
OPT_DEFS += -DBOOTLOADER_WB32_DFU
|
||||||
|
BOOTLOADER_TYPE = wb32_dfu
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(BOOTLOADER_TYPE)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BOOTLOADER,No bootloader specified. Please set an appropriate 'BOOTLOADER' in your keyboard's 'rules.mk' file.)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
$(TEST)_INC := \
|
$(TEST)_INC := \
|
||||||
tests\test_common\common_config.h
|
tests/test_common/common_config.h
|
||||||
|
|
||||||
$(TEST)_SRC := \
|
$(TEST)_SRC := \
|
||||||
$(TMK_COMMON_SRC) \
|
$(TMK_COMMON_SRC) \
|
||||||
@@ -13,6 +13,14 @@ endif
|
|||||||
include paths.mk
|
include paths.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
|
# Helper to add defines with a 'QMK_' prefix
|
||||||
|
define add_qmk_prefix_defs
|
||||||
|
ifdef $1
|
||||||
|
# Need to cater for 'STM32L4xx+'
|
||||||
|
OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
# Set the qmk cli to use
|
# Set the qmk cli to use
|
||||||
QMK_BIN ?= qmk
|
QMK_BIN ?= qmk
|
||||||
|
|
||||||
@@ -37,6 +45,17 @@ ifdef SKIP_VERSION
|
|||||||
OPT_DEFS += -DSKIP_VERSION
|
OPT_DEFS += -DSKIP_VERSION
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Generate the version.h file
|
||||||
|
ifdef SKIP_VERSION
|
||||||
|
VERSION_H_FLAGS := --skip-all
|
||||||
|
endif
|
||||||
|
ifdef SKIP_GIT
|
||||||
|
VERSION_H_FLAGS := --skip-git
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Generate the board's version.h file.
|
||||||
|
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(KEYMAP_OUTPUT)/src/version.h)
|
||||||
|
|
||||||
# Determine which subfolders exist.
|
# Determine which subfolders exist.
|
||||||
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
|
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
|
||||||
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
|
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
|
||||||
@@ -100,7 +119,7 @@ INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard
|
|||||||
include $(INFO_RULES_MK)
|
include $(INFO_RULES_MK)
|
||||||
|
|
||||||
# Check for keymap.json first, so we can regenerate keymap.c
|
# Check for keymap.json first, so we can regenerate keymap.c
|
||||||
include build_json.mk
|
include $(BUILDDEFS_PATH)/build_json.mk
|
||||||
|
|
||||||
# Pull in keymap level rules.mk
|
# Pull in keymap level rules.mk
|
||||||
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
||||||
@@ -127,9 +146,9 @@ ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
|||||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||||
else ifneq ($(LAYOUTS),)
|
else ifneq ($(LAYOUTS),)
|
||||||
# If we haven't found a keymap yet fall back to community layouts
|
# If we haven't found a keymap yet fall back to community layouts
|
||||||
include build_layout.mk
|
include $(BUILDDEFS_PATH)/build_layout.mk
|
||||||
else
|
else
|
||||||
$(error Could not find keymap)
|
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||||
# this state should never be reached
|
# this state should never be reached
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -148,22 +167,20 @@ ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
|||||||
|
|
||||||
# Add rules to generate the keymap files - indentation here is important
|
# Add rules to generate the keymap files - indentation here is important
|
||||||
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
$(KEYMAP_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
|
||||||
$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
$(KEYMAP_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
||||||
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H)
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_H))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c
|
generated-files: $(KEYMAP_OUTPUT)/src/config.h $(KEYMAP_OUTPUT)/src/keymap.c
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(CTPC)), yes)
|
include $(BUILDDEFS_PATH)/converters.mk
|
||||||
CONVERT_TO_PROTON_C=yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
|
||||||
include platforms/chibios/boards/QMK_PROTON_C/convert_to_proton_c.mk
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/mcu_selection.mk
|
include $(BUILDDEFS_PATH)/mcu_selection.mk
|
||||||
|
|
||||||
@@ -313,17 +330,29 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||||
|
KEYBOARD_SRC += $(KEYBOARD_OUTPUT)/src/default_keyboard.c
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
|
||||||
$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
$(KEYBOARD_OUTPUT)/src/default_keyboard.c: $(INFO_JSON_FILES)
|
||||||
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.c)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
|
||||||
$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/default_keyboard.h)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
|
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
|
||||||
$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
|
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=$(QMK_BIN) generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
generated-files: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/default_keyboard.c $(KEYBOARD_OUTPUT)/src/default_keyboard.h $(KEYBOARD_OUTPUT)/src/layouts.h
|
||||||
|
|
||||||
.INTERMEDIATE : generated-files
|
.INTERMEDIATE : generated-files
|
||||||
|
|
||||||
@@ -369,10 +398,18 @@ ifneq ("$(KEYMAP_H)","")
|
|||||||
CONFIG_H += $(KEYMAP_H)
|
CONFIG_H += $(KEYMAP_H)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
|
||||||
|
|
||||||
|
# If a keymap or userspace places their keymap array in another file instead, allow for it to be included
|
||||||
|
# !!NOTE!! -- For this to work, the source file cannot be part of $(SRC), so users should not add it via `SRC += <file>`
|
||||||
|
ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
|
||||||
|
OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
|
||||||
|
endif
|
||||||
|
|
||||||
# project specific files
|
# project specific files
|
||||||
SRC += \
|
SRC += \
|
||||||
$(KEYBOARD_SRC) \
|
$(KEYBOARD_SRC) \
|
||||||
$(KEYMAP_C) \
|
$(QUANTUM_DIR)/keymap_introspection.c \
|
||||||
$(QUANTUM_SRC) \
|
$(QUANTUM_SRC) \
|
||||||
$(QUANTUM_DIR)/main.c \
|
$(QUANTUM_DIR)/main.c \
|
||||||
|
|
||||||
@@ -384,8 +421,10 @@ VPATH += $(KEYMAP_PATH)
|
|||||||
VPATH += $(USER_PATH)
|
VPATH += $(USER_PATH)
|
||||||
VPATH += $(KEYBOARD_PATHS)
|
VPATH += $(KEYBOARD_PATHS)
|
||||||
VPATH += $(COMMON_VPATH)
|
VPATH += $(COMMON_VPATH)
|
||||||
|
VPATH += $(KEYBOARD_OUTPUT)/src
|
||||||
|
VPATH += $(KEYMAP_OUTPUT)/src
|
||||||
|
|
||||||
include common_features.mk
|
include $(BUILDDEFS_PATH)/common_features.mk
|
||||||
include $(BUILDDEFS_PATH)/generic_features.mk
|
include $(BUILDDEFS_PATH)/generic_features.mk
|
||||||
include $(TMK_PATH)/protocol.mk
|
include $(TMK_PATH)/protocol.mk
|
||||||
include $(PLATFORM_PATH)/common.mk
|
include $(PLATFORM_PATH)/common.mk
|
||||||
@@ -413,6 +452,14 @@ else
|
|||||||
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
|
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Setup definitions based on the selected MCU
|
||||||
|
$(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
|
||||||
|
$(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
|
||||||
|
$(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
|
||||||
|
$(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
|
||||||
|
$(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
|
||||||
|
$(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
|
||||||
|
|
||||||
# TODO: remove this bodge?
|
# TODO: remove this bodge?
|
||||||
PROJECT_DEFS := $(OPT_DEFS)
|
PROJECT_DEFS := $(OPT_DEFS)
|
||||||
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
|
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
|
||||||
@@ -446,8 +493,21 @@ check-size: build
|
|||||||
check-md5: build
|
check-md5: build
|
||||||
objs-size: build
|
objs-size: build
|
||||||
|
|
||||||
|
ifeq ($(strip $(TOP_SYMBOLS)),yes)
|
||||||
|
all: top-symbols
|
||||||
|
check-size: top-symbols
|
||||||
|
top-symbols: build
|
||||||
|
echo "###########################################"
|
||||||
|
echo "# Highest flash usage:"
|
||||||
|
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [t] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
|
||||||
|
echo "###########################################"
|
||||||
|
echo "# Highest RAM usage:"
|
||||||
|
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [dbv] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
|
||||||
|
echo "###########################################"
|
||||||
|
endif
|
||||||
|
|
||||||
include $(BUILDDEFS_PATH)/show_options.mk
|
include $(BUILDDEFS_PATH)/show_options.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(BUILDDEFS_PATH)/common_rules.mk
|
||||||
|
|
||||||
# Ensure we have generated files available for each of the objects
|
# Ensure we have generated files available for each of the objects
|
||||||
define GEN_FILES
|
define GEN_FILES
|
||||||
@@ -25,7 +25,7 @@ ifneq ($(FORCE_LAYOUT),)
|
|||||||
$(info Forcing layout: $(FORCE_LAYOUT))
|
$(info Forcing layout: $(FORCE_LAYOUT))
|
||||||
LAYOUTS := $(FORCE_LAYOUT)
|
LAYOUTS := $(FORCE_LAYOUT)
|
||||||
else
|
else
|
||||||
$(error Forced layout does not exist)
|
$(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -4,6 +4,8 @@ endif
|
|||||||
|
|
||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
|
OPT = g
|
||||||
|
|
||||||
include paths.mk
|
include paths.mk
|
||||||
include $(BUILDDEFS_PATH)/message.mk
|
include $(BUILDDEFS_PATH)/message.mk
|
||||||
|
|
||||||
@@ -36,13 +38,14 @@ CREATE_MAP := no
|
|||||||
VPATH += \
|
VPATH += \
|
||||||
$(LIB_PATH)/googletest \
|
$(LIB_PATH)/googletest \
|
||||||
$(LIB_PATH)/googlemock \
|
$(LIB_PATH)/googlemock \
|
||||||
$(LIB_PATH)/printf
|
$(COMMON_VPATH) \
|
||||||
|
$(TEST_PATH)
|
||||||
|
|
||||||
all: elf
|
all: elf
|
||||||
|
|
||||||
VPATH += $(COMMON_VPATH)
|
|
||||||
PLATFORM:=TEST
|
PLATFORM:=TEST
|
||||||
PLATFORM_KEY:=test
|
PLATFORM_KEY:=test
|
||||||
|
BOOTLOADER_TYPE:=none
|
||||||
|
|
||||||
ifeq ($(strip $(DEBUG)), 1)
|
ifeq ($(strip $(DEBUG)), 1)
|
||||||
CONSOLE_ENABLE = yes
|
CONSOLE_ENABLE = yes
|
||||||
@@ -53,21 +56,22 @@ include tests/test_common/build.mk
|
|||||||
include $(TEST_PATH)/test.mk
|
include $(TEST_PATH)/test.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include common_features.mk
|
include $(BUILDDEFS_PATH)/common_features.mk
|
||||||
include $(BUILDDEFS_PATH)/generic_features.mk
|
include $(BUILDDEFS_PATH)/generic_features.mk
|
||||||
include $(PLATFORM_PATH)/common.mk
|
include $(PLATFORM_PATH)/common.mk
|
||||||
include $(TMK_PATH)/protocol.mk
|
include $(TMK_PATH)/protocol.mk
|
||||||
include $(QUANTUM_PATH)/debounce/tests/rules.mk
|
include $(QUANTUM_PATH)/debounce/tests/rules.mk
|
||||||
include $(QUANTUM_PATH)/encoder/tests/rules.mk
|
include $(QUANTUM_PATH)/encoder/tests/rules.mk
|
||||||
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
|
include $(QUANTUM_PATH)/sequencer/tests/rules.mk
|
||||||
|
include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk
|
||||||
|
include $(QUANTUM_PATH)/logging/print.mk
|
||||||
include $(PLATFORM_PATH)/test/rules.mk
|
include $(PLATFORM_PATH)/test/rules.mk
|
||||||
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
||||||
include build_full_test.mk
|
include $(BUILDDEFS_PATH)/build_full_test.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(TEST)_SRC += \
|
$(TEST)_SRC += \
|
||||||
tests/test_common/main.c \
|
tests/test_common/main.c \
|
||||||
$(LIB_PATH)/printf/printf.c \
|
|
||||||
$(QUANTUM_PATH)/logging/print.c
|
$(QUANTUM_PATH)/logging/print.c
|
||||||
|
|
||||||
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
|
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
|
||||||
@@ -76,7 +80,7 @@ $(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
|
|||||||
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
||||||
|
|
||||||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
|
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
|
||||||
include $(TMK_PATH)/rules.mk
|
include $(BUILDDEFS_PATH)/common_rules.mk
|
||||||
|
|
||||||
|
|
||||||
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
|
$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
|
||||||
895
builddefs/common_features.mk
Normal file
895
builddefs/common_features.mk
Normal file
@@ -0,0 +1,895 @@
|
|||||||
|
# Copyright 2017 Fred Sundvik
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
QUANTUM_SRC += \
|
||||||
|
$(QUANTUM_DIR)/quantum.c \
|
||||||
|
$(QUANTUM_DIR)/bitwise.c \
|
||||||
|
$(QUANTUM_DIR)/led.c \
|
||||||
|
$(QUANTUM_DIR)/action.c \
|
||||||
|
$(QUANTUM_DIR)/action_layer.c \
|
||||||
|
$(QUANTUM_DIR)/action_tapping.c \
|
||||||
|
$(QUANTUM_DIR)/action_util.c \
|
||||||
|
$(QUANTUM_DIR)/eeconfig.c \
|
||||||
|
$(QUANTUM_DIR)/keyboard.c \
|
||||||
|
$(QUANTUM_DIR)/keymap_common.c \
|
||||||
|
$(QUANTUM_DIR)/keycode_config.c \
|
||||||
|
$(QUANTUM_DIR)/sync_timer.c \
|
||||||
|
$(QUANTUM_DIR)/logging/debug.c \
|
||||||
|
$(QUANTUM_DIR)/logging/sendchar.c \
|
||||||
|
|
||||||
|
VPATH += $(QUANTUM_DIR)/logging
|
||||||
|
# Fall back to lib/printf if there is no platform provided print
|
||||||
|
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
|
||||||
|
include $(QUANTUM_PATH)/logging/print.mk
|
||||||
|
else
|
||||||
|
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
|
||||||
|
CONSOLE_ENABLE = yes
|
||||||
|
else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api)
|
||||||
|
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
|
||||||
|
endif
|
||||||
|
|
||||||
|
AUDIO_ENABLE ?= no
|
||||||
|
ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
||||||
|
ifeq ($(PLATFORM),CHIBIOS)
|
||||||
|
AUDIO_DRIVER ?= dac_basic
|
||||||
|
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic)
|
||||||
|
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
||||||
|
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive)
|
||||||
|
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
||||||
|
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead
|
||||||
|
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software)
|
||||||
|
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||||
|
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware)
|
||||||
|
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
# fallback for all other platforms is pwm
|
||||||
|
AUDIO_DRIVER ?= pwm_hardware
|
||||||
|
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DAUDIO_ENABLE
|
||||||
|
MUSIC_ENABLE = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic
|
||||||
|
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/voices.c
|
||||||
|
SRC += $(QUANTUM_DIR)/audio/luts.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(SEQUENCER_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DSEQUENCER_ENABLE
|
||||||
|
MUSIC_ENABLE = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/sequencer/sequencer.c
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_sequencer.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(MIDI_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DMIDI_ENABLE
|
||||||
|
MUSIC_ENABLE = yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
MUSIC_ENABLE ?= no
|
||||||
|
ifeq ($(MUSIC_ENABLE), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
|
||||||
|
STENO_PROTOCOL ?= all
|
||||||
|
ifeq ($(strip $(STENO_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE
|
||||||
|
VIRTSER_ENABLE ?= yes
|
||||||
|
|
||||||
|
ifeq ($(strip $(STENO_PROTOCOL)), geminipr)
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE_GEMINI
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(STENO_PROTOCOL)), txbolt)
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE_BOLT
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(STENO_PROTOCOL)), all)
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE_ALL
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE_GEMINI
|
||||||
|
OPT_DEFS += -DSTENO_ENABLE_BOLT
|
||||||
|
endif
|
||||||
|
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DVIRTSER_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DMOUSEKEY_ENABLE
|
||||||
|
MOUSE_ENABLE := yes
|
||||||
|
SRC += $(QUANTUM_DIR)/mousekey.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 pmw3360 pmw3389 pimoroni_trackball custom
|
||||||
|
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
|
||||||
|
MOUSE_ENABLE := yes
|
||||||
|
VPATH += $(QUANTUM_DIR)/pointing_device
|
||||||
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
||||||
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_drivers.c
|
||||||
|
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
||||||
|
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
||||||
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
||||||
|
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
||||||
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||||
|
OPT_DEFS += -DSTM32_ADC -DHAL_USE_ADC=TRUE
|
||||||
|
LIB_SRC += analog.c
|
||||||
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
|
||||||
|
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
SRC += drivers/sensors/cirque_pinnacle.c
|
||||||
|
SRC += drivers/sensors/cirque_pinnacle_gestures.c
|
||||||
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi)
|
||||||
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
|
SRC += drivers/sensors/cirque_pinnacle.c
|
||||||
|
SRC += drivers/sensors/cirque_pinnacle_gestures.c
|
||||||
|
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
|
||||||
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_I2C=TRUE
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
|
||||||
|
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
|
SRC += drivers/sensors/pmw33xx_common.c
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
QUANTUM_PAINTER_ENABLE ?= no
|
||||||
|
ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
|
||||||
|
include $(QUANTUM_DIR)/painter/rules.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling
|
||||||
|
EEPROM_DRIVER ?= vendor
|
||||||
|
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
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
SRC += eeprom_driver.c eeprom_i2c.c
|
||||||
|
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
||||||
|
# External SPI EEPROM implementation
|
||||||
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
SRC += eeprom_driver.c eeprom_spi.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 STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
||||||
|
# Emulated EEPROM
|
||||||
|
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
|
||||||
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||||
|
SRC += eeprom_driver.c eeprom_stm32.c flash_stm32.c
|
||||||
|
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_TEENSY
|
||||||
|
SRC += eeprom_teensy.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),ARM_ATSAM)
|
||||||
|
# arm_atsam EEPROM
|
||||||
|
OPT_DEFS += -DEEPROM_SAMD
|
||||||
|
SRC += eeprom_samd.c
|
||||||
|
else ifeq ($(PLATFORM),TEST)
|
||||||
|
# Test harness "EEPROM"
|
||||||
|
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||||
|
SRC += eeprom.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
|
||||||
|
WEAR_LEVELING_DRIVER ?= none
|
||||||
|
ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
|
||||||
|
ifeq ($(filter $(WEAR_LEVELING_DRIVER),$(VALID_WEAR_LEVELING_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid WEAR_LEVELING_DRIVER,WEAR_LEVELING_DRIVER="$(WEAR_LEVELING_DRIVER)" is not a valid wear leveling driver)
|
||||||
|
else
|
||||||
|
FNV_ENABLE := yes
|
||||||
|
OPT_DEFS += -DWEAR_LEVELING_ENABLE
|
||||||
|
OPT_DEFS += -DWEAR_LEVELING_$(strip $(shell echo $(WEAR_LEVELING_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/wear_leveling
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/wear_leveling
|
||||||
|
SRC += wear_leveling.c
|
||||||
|
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 += $(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 += flash_stm32.c wear_leveling_legacy.c
|
||||||
|
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_FLASH_DRIVER_TYPES := spi
|
||||||
|
FLASH_DRIVER ?= none
|
||||||
|
ifneq ($(strip $(FLASH_DRIVER)), none)
|
||||||
|
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DFLASH_ENABLE
|
||||||
|
ifeq ($(strip $(FLASH_DRIVER)),spi)
|
||||||
|
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||||
|
SRC += flash_spi.c
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
RGBLIGHT_ENABLE ?= no
|
||||||
|
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
||||||
|
RGBLIGHT_DRIVER ?= custom
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||||
|
RGBLIGHT_DRIVER ?= WS2812
|
||||||
|
|
||||||
|
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid RGBLIGHT_DRIVER,RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
|
||||||
|
else
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
|
||||||
|
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
||||||
|
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
|
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
||||||
|
CIE1931_CURVE := yes
|
||||||
|
RGB_KEYCODES_ENABLE := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_DRIVER)), WS2812)
|
||||||
|
WS2812_DRIVER_REQUIRED := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_DRIVER)), APA102)
|
||||||
|
APA102_DRIVER_REQUIRED := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGBLIGHT_DRIVER)), custom)
|
||||||
|
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
LED_MATRIX_ENABLE ?= no
|
||||||
|
VALID_LED_MATRIX_TYPES := IS31FL3731 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A custom
|
||||||
|
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid LED_MATRIX_DRIVER,LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DLED_MATRIX_ENABLE
|
||||||
|
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
||||||
|
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||||
|
OPT_DEFS += -DLIB8_ATTINY
|
||||||
|
endif
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
||||||
|
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c
|
||||||
|
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c
|
||||||
|
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||||
|
CIE1931_CURVE := yes
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3731)
|
||||||
|
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31fl3731-simple.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3742A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3742A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3743A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3745)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3746A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
RGB_MATRIX_ENABLE ?= no
|
||||||
|
|
||||||
|
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 IS31FL3742A IS31FL3743A IS31FL3745 IS31FL3746A CKLED2001 WS2812 custom
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DRGB_MATRIX_ENABLE
|
||||||
|
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
||||||
|
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
||||||
|
OPT_DEFS += -DLIB8_ATTINY
|
||||||
|
endif
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||||
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
||||||
|
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
||||||
|
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||||
|
CIE1931_CURVE := yes
|
||||||
|
RGB_KEYCODES_ENABLE := yes
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), AW20216)
|
||||||
|
OPT_DEFS += -DAW20216 -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
|
SRC += aw20216.c
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3731)
|
||||||
|
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31fl3731.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3733)
|
||||||
|
OPT_DEFS += -DIS31FL3733 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31fl3733.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3737)
|
||||||
|
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31fl3737.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3741)
|
||||||
|
OPT_DEFS += -DIS31FL3741 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31fl3741.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3742A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3742A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3743A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3745)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3746A)
|
||||||
|
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||||
|
SRC += is31flcommon.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), CKLED2001)
|
||||||
|
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
|
SRC += ckled2001.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), WS2812)
|
||||||
|
OPT_DEFS += -DWS2812
|
||||||
|
WS2812_DRIVER_REQUIRED := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_DRIVER)), APA102)
|
||||||
|
OPT_DEFS += -DAPA102
|
||||||
|
APA102_DRIVER_REQUIRED := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
|
||||||
|
OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes)
|
||||||
|
OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DPRINTING_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
||||||
|
QUANTUM_LIB_SRC += uart.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
VARIABLE_TRACE ?= no
|
||||||
|
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
||||||
|
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||||
|
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
||||||
|
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
||||||
|
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
|
||||||
|
SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
|
||||||
|
OPT_DEFS += -DSLEEP_LED_ENABLE
|
||||||
|
|
||||||
|
NO_SUSPEND_POWER_DOWN := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_BACKLIGHT_TYPES := pwm timer software custom
|
||||||
|
|
||||||
|
BACKLIGHT_ENABLE ?= no
|
||||||
|
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
||||||
|
BACKLIGHT_DRIVER ?= software
|
||||||
|
else
|
||||||
|
BACKLIGHT_DRIVER ?= pwm
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
|
||||||
|
endif
|
||||||
|
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight.c
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
||||||
|
OPT_DEFS += -DBACKLIGHT_ENABLE
|
||||||
|
|
||||||
|
ifeq ($(strip $(BACKLIGHT_DRIVER)), custom)
|
||||||
|
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER
|
||||||
|
else
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
|
||||||
|
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm)
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c
|
||||||
|
else
|
||||||
|
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c vendor
|
||||||
|
|
||||||
|
WS2812_DRIVER ?= bitbang
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||||
|
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid WS2812_DRIVER,WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
|
||||||
|
endif
|
||||||
|
|
||||||
|
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER)), bitbang)
|
||||||
|
SRC += ws2812.c
|
||||||
|
else
|
||||||
|
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
||||||
|
|
||||||
|
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||||
|
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# add extra deps
|
||||||
|
ifeq ($(strip $(WS2812_DRIVER)), i2c)
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes)
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||||
|
SRC += apa102.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(CIE1931_CURVE)), yes)
|
||||||
|
OPT_DEFS += -DUSE_CIE1931_CURVE
|
||||||
|
LED_TABLES := yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(LED_TABLES)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/led_tables.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||||
|
DYNAMIC_KEYMAP_ENABLE := yes
|
||||||
|
RAW_ENABLE := yes
|
||||||
|
BOOTMAGIC_ENABLE := yes
|
||||||
|
SRC += $(QUANTUM_DIR)/via.c
|
||||||
|
OPT_DEFS += -DVIA_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_MAGIC_TYPES := yes
|
||||||
|
BOOTMAGIC_ENABLE ?= no
|
||||||
|
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||||
|
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BOOTMAGIC_ENABLE,BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
||||||
|
endif
|
||||||
|
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
||||||
|
OPT_DEFS += -DBOOTMAGIC_LITE
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_lite.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/bootmagic
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/magic.c
|
||||||
|
|
||||||
|
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
||||||
|
|
||||||
|
CUSTOM_MATRIX ?= no
|
||||||
|
|
||||||
|
ifneq ($(strip $(CUSTOM_MATRIX)), yes)
|
||||||
|
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid CUSTOM_MATRIX,CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Include common stuff for all non custom matrix users
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c
|
||||||
|
|
||||||
|
# if 'lite' then skip the actual matrix implementation
|
||||||
|
ifneq ($(strip $(CUSTOM_MATRIX)), lite)
|
||||||
|
# Include the standard or split matrix code if needed
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually.
|
||||||
|
DEBOUNCE_TYPE ?= sym_defer_g
|
||||||
|
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor
|
||||||
|
|
||||||
|
SERIAL_DRIVER ?= bitbang
|
||||||
|
ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
|
||||||
|
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
|
||||||
|
OPT_DEFS += -DSPLIT_KEYBOARD
|
||||||
|
CRC_ENABLE := yes
|
||||||
|
|
||||||
|
# Include files used by all split keyboards
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c
|
||||||
|
|
||||||
|
# Determine which (if any) transport files are required
|
||||||
|
ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
|
||||||
|
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \
|
||||||
|
$(QUANTUM_DIR)/split_common/transactions.c
|
||||||
|
|
||||||
|
OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS
|
||||||
|
|
||||||
|
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
|
||||||
|
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
|
||||||
|
ifeq ($(PLATFORM),AVR)
|
||||||
|
ifneq ($(NO_I2C),yes)
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c \
|
||||||
|
i2c_slave.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
|
||||||
|
QUANTUM_LIB_SRC += serial.c
|
||||||
|
else
|
||||||
|
QUANTUM_LIB_SRC += serial_protocol.c
|
||||||
|
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
COMMON_VPATH += $(QUANTUM_PATH)/split_common
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(CRC_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DCRC_ENABLE
|
||||||
|
SRC += crc.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(FNV_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DFNV_ENABLE
|
||||||
|
VPATH += $(LIB_PATH)/fnv
|
||||||
|
SRC += qmk_fnv_type_validation.c hash_32a.c hash_64a.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(HAPTIC_ENABLE)),yes)
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
||||||
|
|
||||||
|
ifneq ($(filter DRV2605L, $(HAPTIC_DRIVER)), )
|
||||||
|
SRC += DRV2605L.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
OPT_DEFS += -DDRV2605L
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(filter SOLENOID, $(HAPTIC_DRIVER)), )
|
||||||
|
SRC += solenoid.c
|
||||||
|
OPT_DEFS += -DSOLENOID_ENABLE
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(HD44780_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DHD44780_ENABLE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/lcd
|
||||||
|
SRC += hd44780.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
VALID_OLED_DRIVER_TYPES := SSD1306 custom
|
||||||
|
OLED_DRIVER ?= SSD1306
|
||||||
|
ifeq ($(strip $(OLED_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid OLED_DRIVER,OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DOLED_ENABLE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/oled
|
||||||
|
|
||||||
|
OPT_DEFS += -DOLED_DRIVER_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
ifeq ($(strip $(OLED_DRIVER)), SSD1306)
|
||||||
|
SRC += ssd1306_sh1106.c
|
||||||
|
QUANTUM_LIB_SRC += i2c_master.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(ST7565_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DST7565_ENABLE
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/lcd
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
SRC += st7565.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UCIS_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUCIS_ENABLE
|
||||||
|
UNICODE_COMMON := yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUNICODEMAP_ENABLE
|
||||||
|
UNICODE_COMMON := yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DUNICODE_ENABLE
|
||||||
|
UNICODE_COMMON := yes
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
||||||
|
OPT_DEFS += -DUNICODE_COMMON_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \
|
||||||
|
$(QUANTUM_DIR)/utf8.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
MAGIC_ENABLE ?= yes
|
||||||
|
ifeq ($(strip $(MAGIC_ENABLE)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_magic.c
|
||||||
|
OPT_DEFS += -DMAGIC_KEYCODE_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
SEND_STRING_ENABLE ?= yes
|
||||||
|
ifeq ($(strip $(SEND_STRING_ENABLE)), yes)
|
||||||
|
OPT_DEFS += -DSEND_STRING_ENABLE
|
||||||
|
COMMON_VPATH += $(QUANTUM_DIR)/send_string
|
||||||
|
SRC += $(QUANTUM_DIR)/send_string/send_string.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
|
||||||
|
OPT_DEFS += -DAUTO_SHIFT_ENABLE
|
||||||
|
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes)
|
||||||
|
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes)
|
||||||
|
PS2_ENABLE := yes
|
||||||
|
SRC += ps2_mouse.c
|
||||||
|
OPT_DEFS += -DPS2_MOUSE_ENABLE
|
||||||
|
OPT_DEFS += -DMOUSE_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes)
|
||||||
|
PS2_ENABLE := yes
|
||||||
|
SRC += ps2_busywait.c
|
||||||
|
SRC += ps2_io.c
|
||||||
|
OPT_DEFS += -DPS2_USE_BUSYWAIT
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PS2_USE_INT)), yes)
|
||||||
|
PS2_ENABLE := yes
|
||||||
|
SRC += ps2_interrupt.c
|
||||||
|
SRC += ps2_io.c
|
||||||
|
OPT_DEFS += -DPS2_USE_INT
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PS2_USE_USART)), yes)
|
||||||
|
PS2_ENABLE := yes
|
||||||
|
SRC += ps2_usart.c
|
||||||
|
SRC += ps2_io.c
|
||||||
|
OPT_DEFS += -DPS2_USE_USART
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(PS2_ENABLE)), yes)
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/ps2
|
||||||
|
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2
|
||||||
|
OPT_DEFS += -DPS2_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
JOYSTICK_ENABLE ?= no
|
||||||
|
VALID_JOYSTICK_TYPES := analog digital
|
||||||
|
JOYSTICK_DRIVER ?= analog
|
||||||
|
ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver)
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DJOYSTICK_ENABLE
|
||||||
|
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
|
||||||
|
SRC += $(QUANTUM_DIR)/joystick.c
|
||||||
|
|
||||||
|
ifeq ($(strip $(JOYSTICK_DRIVER)), analog)
|
||||||
|
OPT_DEFS += -DANALOG_JOYSTICK_ENABLE
|
||||||
|
SRC += analog.c
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(JOYSTICK_DRIVER)), digital)
|
||||||
|
OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
USBPD_ENABLE ?= no
|
||||||
|
VALID_USBPD_DRIVER_TYPES = custom vendor
|
||||||
|
USBPD_DRIVER ?= vendor
|
||||||
|
ifeq ($(strip $(USBPD_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
|
||||||
|
else
|
||||||
|
OPT_DEFS += -DUSBPD_ENABLE
|
||||||
|
ifeq ($(strip $(USBPD_DRIVER)), vendor)
|
||||||
|
# Vendor-specific implementations
|
||||||
|
OPT_DEFS += -DUSBPD_VENDOR
|
||||||
|
ifeq ($(strip $(MCU_SERIES)), STM32G4xx)
|
||||||
|
OPT_DEFS += -DUSBPD_STM32G4
|
||||||
|
SRC += usbpd_stm32g4.c
|
||||||
|
else
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,There is no vendor-provided USBPD driver available)
|
||||||
|
endif
|
||||||
|
else ifeq ($(strip $(USBPD_DRIVER)), custom)
|
||||||
|
OPT_DEFS += -DUSBPD_CUSTOM
|
||||||
|
# Board designers can add their own driver to $(SRC)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
BLUETOOTH_ENABLE ?= no
|
||||||
|
VALID_BLUETOOTH_DRIVER_TYPES := BluefruitLE RN42 custom
|
||||||
|
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||||
|
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
|
||||||
|
endif
|
||||||
|
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||||
|
NO_USB_STARTUP_CHECK := yes
|
||||||
|
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||||
|
SRC += outputselect.c
|
||||||
|
|
||||||
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), BluefruitLE)
|
||||||
|
OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE
|
||||||
|
SRC += analog.c
|
||||||
|
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||||
|
QUANTUM_LIB_SRC += spi_master.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
|
||||||
|
OPT_DEFS += -DBLUETOOTH_RN42
|
||||||
|
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||||
|
QUANTUM_LIB_SRC += uart.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
426
builddefs/common_rules.mk
Normal file
426
builddefs/common_rules.mk
Normal file
@@ -0,0 +1,426 @@
|
|||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Enable vpath seraching for source files only
|
||||||
|
# Without this, output files, could be read from the wrong .build directories
|
||||||
|
VPATH_SRC := $(VPATH)
|
||||||
|
vpath %.c $(VPATH_SRC)
|
||||||
|
vpath %.h $(VPATH_SRC)
|
||||||
|
vpath %.cpp $(VPATH_SRC)
|
||||||
|
vpath %.cc $(VPATH_SRC)
|
||||||
|
vpath %.hpp $(VPATH_SRC)
|
||||||
|
vpath %.S $(VPATH_SRC)
|
||||||
|
VPATH :=
|
||||||
|
|
||||||
|
# Convert all SRC to OBJ
|
||||||
|
define OBJ_FROM_SRC
|
||||||
|
$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$(patsubst %.clib,$1/%.a,$($1_SRC))))))
|
||||||
|
endef
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
|
||||||
|
|
||||||
|
# Define a list of all objects
|
||||||
|
OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
|
||||||
|
NO_LTO_OBJ := $(filter %.a,$(OBJ))
|
||||||
|
|
||||||
|
MASTER_OUTPUT := $(firstword $(OUTPUTS))
|
||||||
|
|
||||||
|
# Output format. (can be srec, ihex, binary)
|
||||||
|
FORMAT = ihex
|
||||||
|
|
||||||
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
|
OPT ?= s
|
||||||
|
|
||||||
|
# Compiler flag to set the C and C++ language standard level
|
||||||
|
CSTANDARD = -std=gnu11
|
||||||
|
CXXSTANDARD = -std=gnu++14
|
||||||
|
|
||||||
|
# Speed up recompilations by opt-in usage of ccache
|
||||||
|
USE_CCACHE ?= no
|
||||||
|
ifneq ($(USE_CCACHE),no)
|
||||||
|
CC_PREFIX ?= ccache
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------- C Compiler Options ----------------
|
||||||
|
|
||||||
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
|
ifeq ($(PLATFORM),ARM_ATSAM)
|
||||||
|
$(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.)
|
||||||
|
$(info If unsure, set LTO_ENABLE = no.)
|
||||||
|
endif
|
||||||
|
CDEFS += -flto
|
||||||
|
CDEFS += -DLTO_ENABLE
|
||||||
|
endif
|
||||||
|
|
||||||
|
DEBUG_ENABLE ?= yes
|
||||||
|
ifeq ($(strip $(SKIP_DEBUG_INFO)),yes)
|
||||||
|
DEBUG_ENABLE=no
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
CFLAGS += -g$(DEBUG)
|
||||||
|
endif
|
||||||
|
CFLAGS += $(CDEFS)
|
||||||
|
CFLAGS += -O$(OPT)
|
||||||
|
# add color
|
||||||
|
ifeq ($(COLOR),true)
|
||||||
|
ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "")
|
||||||
|
CFLAGS+= -fdiagnostics-color
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
CFLAGS += -Wall
|
||||||
|
CFLAGS += -Wstrict-prototypes
|
||||||
|
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||||
|
CFLAGS += -Werror
|
||||||
|
endif
|
||||||
|
CFLAGS += $(CSTANDARD)
|
||||||
|
|
||||||
|
# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
|
||||||
|
# Fixing of multiple variable definitions must be made.
|
||||||
|
CFLAGS += -fcommon
|
||||||
|
|
||||||
|
#---------------- C++ Compiler Options ----------------
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
CXXFLAGS += -g$(DEBUG)
|
||||||
|
endif
|
||||||
|
CXXFLAGS += $(CXXDEFS)
|
||||||
|
CXXFLAGS += -O$(OPT)
|
||||||
|
# to supress "warning: only initialized variables can be placed into program memory area"
|
||||||
|
CXXFLAGS += -w
|
||||||
|
CXXFLAGS += -Wall
|
||||||
|
CXXFLAGS += -Wundef
|
||||||
|
|
||||||
|
ifneq ($(strip $(ALLOW_WARNINGS)), yes)
|
||||||
|
CXXFLAGS += -Werror
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------- Assembler Options ----------------
|
||||||
|
|
||||||
|
ASFLAGS += $(ADEFS)
|
||||||
|
ifeq ($(VERBOSE_AS_CMD),yes)
|
||||||
|
ASFLAGS += -v
|
||||||
|
endif
|
||||||
|
|
||||||
|
#---------------- Linker Options ----------------
|
||||||
|
|
||||||
|
CREATE_MAP ?= yes
|
||||||
|
ifeq ($(CREATE_MAP),yes)
|
||||||
|
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
||||||
|
endif
|
||||||
|
ifeq ($(VERBOSE_LD_CMD),yes)
|
||||||
|
LDFLAGS += -v
|
||||||
|
endif
|
||||||
|
#LDFLAGS += -Wl,--relax
|
||||||
|
LDFLAGS += $(EXTMEMOPTS)
|
||||||
|
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||||
|
LDFLAGS += -lm
|
||||||
|
# You can give EXTRALDFLAGS at 'make' command line.
|
||||||
|
LDFLAGS += $(EXTRALDFLAGS)
|
||||||
|
|
||||||
|
#---------------- Assembler Listings ----------------
|
||||||
|
|
||||||
|
ADHLNS_ENABLE ?= no
|
||||||
|
ifeq ($(ADHLNS_ENABLE),yes)
|
||||||
|
# Avoid "Options to '-Xassembler' do not match" - only specify assembler options at LTO link time
|
||||||
|
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||||
|
LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
|
||||||
|
else
|
||||||
|
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
|
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||||
|
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||||
|
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
|
||||||
|
else
|
||||||
|
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define programs and commands.
|
||||||
|
SHELL = sh
|
||||||
|
SED = sed
|
||||||
|
REMOVE = rm -f
|
||||||
|
REMOVEDIR = rmdir
|
||||||
|
COPY = cp
|
||||||
|
WINSHELL = cmd
|
||||||
|
SECHO = $(SILENT) || echo
|
||||||
|
MD5SUM ?= md5sum
|
||||||
|
ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),)
|
||||||
|
MD5SUM = md5
|
||||||
|
endif
|
||||||
|
|
||||||
|
# UF2 format settings
|
||||||
|
# To produce a UF2 file in your build, add to your keyboard's rules.mk:
|
||||||
|
# FIRMWARE_FORMAT = uf2
|
||||||
|
UF2CONV = $(TOP_DIR)/util/uf2conv.py
|
||||||
|
UF2_FAMILY ?= 0x0
|
||||||
|
|
||||||
|
# Compiler flags to generate dependency files.
|
||||||
|
#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
|
||||||
|
GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
|
||||||
|
|
||||||
|
|
||||||
|
# Combine all necessary flags and optional flags.
|
||||||
|
# Add target processor to flags.
|
||||||
|
# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
|
||||||
|
ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
|
||||||
|
ALL_CXXFLAGS = $(MCUFLAGS) -x c++ $(CXXFLAGS) $(EXTRAFLAGS)
|
||||||
|
ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
|
||||||
|
|
||||||
|
define NO_LTO
|
||||||
|
$(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto
|
||||||
|
endef
|
||||||
|
$(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ))))
|
||||||
|
|
||||||
|
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
|
||||||
|
$(KEYBOARD_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
|
||||||
|
endef
|
||||||
|
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
|
||||||
|
|
||||||
|
# Add QMK specific flags
|
||||||
|
DFU_SUFFIX ?= dfu-suffix
|
||||||
|
DFU_SUFFIX_ARGS ?=
|
||||||
|
|
||||||
|
|
||||||
|
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
uf2: $(BUILD_DIR)/$(TARGET).uf2
|
||||||
|
cpfirmware: $(FIRMWARE_FORMAT)
|
||||||
|
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to qmk_firmware folder" | $(AWK_CMD)
|
||||||
|
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
|
||||||
|
eep: $(BUILD_DIR)/$(TARGET).eep
|
||||||
|
lss: $(BUILD_DIR)/$(TARGET).lss
|
||||||
|
sym: $(BUILD_DIR)/$(TARGET).sym
|
||||||
|
LIBNAME=lib$(TARGET).a
|
||||||
|
lib: $(LIBNAME)
|
||||||
|
|
||||||
|
# Display size of file, modifying the output so people don't mistakenly grab the hex output
|
||||||
|
BINARY_SIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(SED) -e 's/\.build\/.*$$/$(TARGET).$(FIRMWARE_FORMAT)/g'
|
||||||
|
|
||||||
|
sizebefore:
|
||||||
|
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(BINARY_SIZE); \
|
||||||
|
2>/dev/null; $(SECHO); fi
|
||||||
|
|
||||||
|
sizeafter: $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
@if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(BINARY_SIZE); \
|
||||||
|
2>/dev/null; $(SECHO); fi
|
||||||
|
|
||||||
|
# Display compiler version information.
|
||||||
|
gccversion :
|
||||||
|
@$(SILENT) || $(CC) --version
|
||||||
|
|
||||||
|
# Create final output files (.hex, .eep) from ELF output file.
|
||||||
|
%.hex: %.elf
|
||||||
|
$(eval CMD=$(HEX) $< $@)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.uf2: %.hex
|
||||||
|
$(eval CMD=$(UF2CONV) $(BUILD_DIR)/$(TARGET).hex --output $(BUILD_DIR)/$(TARGET).uf2 --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.eep: %.elf
|
||||||
|
$(eval CMD=$(EEP) $< $@ || exit 0)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Create extended listing file from ELF output file.
|
||||||
|
%.lss: %.elf
|
||||||
|
$(eval CMD=$(OBJDUMP) -h -S -z $< > $@)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Create a symbol table from ELF output file.
|
||||||
|
%.sym: %.elf
|
||||||
|
$(eval CMD=$(NM) -n $< > $@ )
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
%.bin: %.elf
|
||||||
|
$(eval CMD=$(BIN) $< $@ || exit 0)
|
||||||
|
#@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
|
||||||
|
@$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
if [ ! -z "$(DFU_SUFFIX_ARGS)" ]; then \
|
||||||
|
$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null ;\
|
||||||
|
fi
|
||||||
|
#$(SILENT) || printf "$(MSG_EXECUTING) '$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null':\n" ;\
|
||||||
|
$(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
|
||||||
|
|
||||||
|
BEGIN = gccversion sizebefore
|
||||||
|
|
||||||
|
# Link: create ELF output file from object files.
|
||||||
|
.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
.PRECIOUS : $(OBJ)
|
||||||
|
# Note the obj.txt depeendency is there to force linking if a source file is deleted
|
||||||
|
%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
|
||||||
|
@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
|
||||||
|
$(eval CMD=MAKE=$(MAKE) $(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS))
|
||||||
|
@$(BUILD_CMD)
|
||||||
|
|
||||||
|
|
||||||
|
define GEN_OBJRULE
|
||||||
|
$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
|
||||||
|
ifdef $1_CONFIG
|
||||||
|
$1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG))
|
||||||
|
endif
|
||||||
|
$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
|
||||||
|
$1_CXXFLAGS = $$(ALL_CXXFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
|
||||||
|
$1_ASFLAGS = $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
|
||||||
|
|
||||||
|
# Compile: create object files from C source files.
|
||||||
|
$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CC_EXEC := $$(CC))
|
||||||
|
ifneq ($$(VERBOSE_C_CMD),)
|
||||||
|
$$(if $$(filter $$(notdir $$(VERBOSE_C_CMD)),$$(notdir $$<)),$$(eval CC_EXEC += -v))
|
||||||
|
endif
|
||||||
|
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))
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
ifneq ($$(DUMP_C_MACROS),)
|
||||||
|
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<)
|
||||||
|
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Compile: create object files from C++ source files.
|
||||||
|
$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))
|
||||||
|
@$$(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))
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
# Assemble: create object files from assembler source files.
|
||||||
|
$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
$1/%.a : $1/%.o
|
||||||
|
@mkdir -p $$(@D)
|
||||||
|
@$(SILENT) || printf "Archiving: $$<" | $$(AWK_CMD)
|
||||||
|
$$(eval CMD=$$(AR) rcs $$@ $$<)
|
||||||
|
@$$(BUILD_CMD)
|
||||||
|
|
||||||
|
$1/force:
|
||||||
|
|
||||||
|
$1/cflags.txt: $1/force
|
||||||
|
echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/cxxflags.txt: $1/force
|
||||||
|
echo '$$($1_CXXFLAGS)' | cmp -s - $$@ || echo '$$($1_CXXFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/asflags.txt: $1/force
|
||||||
|
echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
|
||||||
|
|
||||||
|
$1/compiler.txt: $1/force
|
||||||
|
$$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
|
||||||
|
$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
|
||||||
|
echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
|
||||||
|
|
||||||
|
.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
|
||||||
|
$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
|
||||||
|
echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
|
||||||
|
|
||||||
|
|
||||||
|
# We have to use static rules for the .d files for some reason
|
||||||
|
DEPS = $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
|
||||||
|
# Keep the .d files
|
||||||
|
.PRECIOUS: $(DEPS)
|
||||||
|
# Empty rule to force recompilation if the .d file is missing
|
||||||
|
$(DEPS):
|
||||||
|
|
||||||
|
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
|
||||||
|
|
||||||
|
# Create preprocessed source for use in sending a bug report.
|
||||||
|
%.i : %.c | $(BEGIN)
|
||||||
|
$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
# Target: clean project.
|
||||||
|
clean:
|
||||||
|
$(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
|
||||||
|
$(REMOVE) $(BUILD_DIR)/$(TARGET).*
|
||||||
|
|
||||||
|
show_path:
|
||||||
|
@echo VPATH=$(VPATH)
|
||||||
|
@echo SRC=$(SRC)
|
||||||
|
@echo OBJ=$(OBJ)
|
||||||
|
|
||||||
|
dump_vars: ERROR_IF_EMPTY=""
|
||||||
|
dump_vars: ERROR_IF_NONBOOL=""
|
||||||
|
dump_vars: ERROR_IF_UNSET=""
|
||||||
|
dump_vars:
|
||||||
|
@$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V))))
|
||||||
|
|
||||||
|
objs-size:
|
||||||
|
for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE)
|
||||||
|
|
||||||
|
ifeq ($(findstring avr-gcc,$(CC)),avr-gcc)
|
||||||
|
SIZE_MARGIN = 1024
|
||||||
|
|
||||||
|
check-size:
|
||||||
|
$(eval MAX_SIZE=$(shell n=`$(CC) -E -mmcu=$(MCU) -D__ASSEMBLER__ $(CFLAGS) $(OPT_DEFS) platforms/avr/bootloader_size.c 2> /dev/null | $(SED) -ne 's/\r//;/^#/n;/^AVR_SIZE:/,$${s/^AVR_SIZE: //;p;}'` && echo $$(($$n)) || echo 0))
|
||||||
|
$(eval CURRENT_SIZE=$(shell if [ -f $(BUILD_DIR)/$(TARGET).hex ]; then $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(AWK) 'NR==2 {print $$4}'; else printf 0; fi))
|
||||||
|
$(eval FREE_SIZE=$(shell expr $(MAX_SIZE) - $(CURRENT_SIZE)))
|
||||||
|
$(eval OVER_SIZE=$(shell expr $(CURRENT_SIZE) - $(MAX_SIZE)))
|
||||||
|
$(eval PERCENT_SIZE=$(shell expr $(CURRENT_SIZE) \* 100 / $(MAX_SIZE)))
|
||||||
|
if [ $(MAX_SIZE) -gt 0 ] && [ $(CURRENT_SIZE) -gt 0 ]; then \
|
||||||
|
$(SILENT) || printf "$(MSG_CHECK_FILESIZE)" | $(AWK_CMD); \
|
||||||
|
if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then \
|
||||||
|
printf "\n * $(MSG_FILE_TOO_BIG)"; $(PRINT_ERROR_PLAIN); \
|
||||||
|
else \
|
||||||
|
if [ $(FREE_SIZE) -lt $(SIZE_MARGIN) ]; then \
|
||||||
|
$(PRINT_WARNING_PLAIN); printf " * $(MSG_FILE_NEAR_LIMIT)"; \
|
||||||
|
else \
|
||||||
|
$(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; \
|
||||||
|
fi ; \
|
||||||
|
fi ; \
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
check-size:
|
||||||
|
$(SILENT) || echo "$(MSG_CHECK_FILESIZE_SKIPPED)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
check-md5:
|
||||||
|
$(MD5SUM) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT)
|
||||||
|
|
||||||
|
# Create build directory
|
||||||
|
$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
|
||||||
|
|
||||||
|
# Create object files directory
|
||||||
|
$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
|
||||||
|
|
||||||
|
# Include the dependency files.
|
||||||
|
-include $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
|
||||||
|
|
||||||
|
|
||||||
|
# Listing of phony targets.
|
||||||
|
.PHONY : all dump_vars finish sizebefore sizeafter qmkversion \
|
||||||
|
gccversion build elf hex uf2 eep lss sym coff extcoff \
|
||||||
|
clean clean_list debug gdb-config show_path \
|
||||||
|
program teensy dfu dfu-ee dfu-start \
|
||||||
|
flash dfu-split-left dfu-split-right \
|
||||||
|
avrdude-split-left avrdude-split-right \
|
||||||
|
avrdude-loop usbasp
|
||||||
37
builddefs/converters.mk
Normal file
37
builddefs/converters.mk
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# 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.
|
||||||
|
ifeq ($(strip $(CTPC)), yes)
|
||||||
|
CONVERT_TO_PROTON_C=yes
|
||||||
|
endif
|
||||||
|
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
||||||
|
CONVERT_TO=proton_c
|
||||||
|
|
||||||
|
cpfirmware: ctpc_warning
|
||||||
|
.INTERMEDIATE: ctpc_warning
|
||||||
|
ctpc_warning: elf
|
||||||
|
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
||||||
|
$(info The `CONVERT_TO_PROTON_C` and `CTPC` options are soon to be deprecated.)
|
||||||
|
$(info Boards should be changed to use `CONVERT_TO=proton_c` instead.)
|
||||||
|
$(info @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# TODO: opt in rather than assume everything uses a pro micro
|
||||||
|
PIN_COMPATIBLE ?= promicro
|
||||||
|
ifneq ($(CONVERT_TO),)
|
||||||
|
# glob to search each platfrorm and/or check for valid converter
|
||||||
|
CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/)
|
||||||
|
ifeq ($(CONVERTER),)
|
||||||
|
$(call CATASTROPHIC_ERROR,Converting from '$(PIN_COMPATIBLE)' to '$(CONVERT_TO)' not possible!)
|
||||||
|
endif
|
||||||
|
|
||||||
|
TARGET := $(TARGET)_$(CONVERT_TO)
|
||||||
|
|
||||||
|
# Configure any defaults
|
||||||
|
OPT_DEFS += -DCONVERT_TO_$(strip $(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]'))
|
||||||
|
OPT_DEFS += -DCONVERTER_ENABLED
|
||||||
|
VPATH += $(CONVERTER)
|
||||||
|
|
||||||
|
# Finally run any converter specific logic
|
||||||
|
include $(CONVERTER)/converter.mk
|
||||||
|
endif
|
||||||
@@ -17,6 +17,7 @@ SPACE_CADET_ENABLE ?= yes
|
|||||||
GRAVE_ESC_ENABLE ?= yes
|
GRAVE_ESC_ENABLE ?= yes
|
||||||
|
|
||||||
GENERIC_FEATURES = \
|
GENERIC_FEATURES = \
|
||||||
|
CAPS_WORD \
|
||||||
COMBO \
|
COMBO \
|
||||||
COMMAND \
|
COMMAND \
|
||||||
DEFERRED_EXEC \
|
DEFERRED_EXEC \
|
||||||
@@ -25,12 +26,14 @@ GENERIC_FEATURES = \
|
|||||||
DYNAMIC_KEYMAP \
|
DYNAMIC_KEYMAP \
|
||||||
DYNAMIC_MACRO \
|
DYNAMIC_MACRO \
|
||||||
ENCODER \
|
ENCODER \
|
||||||
|
ENCODER_MAP \
|
||||||
GRAVE_ESC \
|
GRAVE_ESC \
|
||||||
HAPTIC \
|
HAPTIC \
|
||||||
KEY_LOCK \
|
KEY_LOCK \
|
||||||
KEY_OVERRIDE \
|
KEY_OVERRIDE \
|
||||||
LEADER \
|
LEADER \
|
||||||
PROGRAMMABLE_BUTTON \
|
PROGRAMMABLE_BUTTON \
|
||||||
|
SECURE \
|
||||||
SPACE_CADET \
|
SPACE_CADET \
|
||||||
SWAP_HANDS \
|
SWAP_HANDS \
|
||||||
TAP_DANCE \
|
TAP_DANCE \
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ ifneq ($(findstring MKL26Z64, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = KL2x
|
MCU_SERIES = KL2x
|
||||||
|
|
||||||
@@ -36,7 +38,9 @@ ifneq ($(findstring MK20DX128, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = K20x
|
MCU_SERIES = K20x
|
||||||
|
|
||||||
@@ -63,7 +67,9 @@ ifneq ($(findstring MK20DX256, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = K20x
|
MCU_SERIES = K20x
|
||||||
|
|
||||||
@@ -81,7 +87,7 @@ ifneq ($(findstring MK20DX256, $(MCU)),)
|
|||||||
BOARD ?= PJRC_TEENSY_3_1
|
BOARD ?= PJRC_TEENSY_3_1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring MK66FX1M0, $(MCU)),)
|
ifneq ($(findstring MK64FX512, $(MCU)),)
|
||||||
# Cortex version
|
# Cortex version
|
||||||
MCU = cortex-m4
|
MCU = cortex-m4
|
||||||
|
|
||||||
@@ -92,6 +98,35 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
|
|||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = KINETIS
|
MCU_FAMILY = KINETIS
|
||||||
|
MCU_SERIES = K60x
|
||||||
|
|
||||||
|
# Linker script to use
|
||||||
|
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
|
||||||
|
# or <keyboard_dir>/ld/
|
||||||
|
MCU_LDSCRIPT ?= MK64FX512
|
||||||
|
|
||||||
|
# Startup code to use
|
||||||
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
MCU_STARTUP ?= k60x
|
||||||
|
|
||||||
|
# Board: it should exist either in <chibios>/os/hal/boards/,
|
||||||
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
|
BOARD ?= PJRC_TEENSY_3_5
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(findstring MK66FX1M0, $(MCU)),)
|
||||||
|
# Cortex version
|
||||||
|
MCU = cortex-m4
|
||||||
|
|
||||||
|
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
||||||
|
ARMV = 7
|
||||||
|
|
||||||
|
## chip/board settings
|
||||||
|
# - the next two should match the directories in
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_FAMILY = KINETIS
|
||||||
MCU_SERIES = MK66F18
|
MCU_SERIES = MK66F18
|
||||||
|
|
||||||
# Linker script to use
|
# Linker script to use
|
||||||
@@ -108,6 +143,41 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
|
|||||||
BOARD ?= PJRC_TEENSY_3_6
|
BOARD ?= PJRC_TEENSY_3_6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(findstring RP2040, $(MCU)),)
|
||||||
|
# Cortex version
|
||||||
|
MCU = cortex-m0plus
|
||||||
|
|
||||||
|
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
||||||
|
CHIBIOS_PORT = ARMv6-M-RP2
|
||||||
|
|
||||||
|
## chip/board settings
|
||||||
|
# - the next two should match the directories in
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_FAMILY = RP
|
||||||
|
MCU_SERIES = RP2040
|
||||||
|
|
||||||
|
# Linker script to use
|
||||||
|
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
|
||||||
|
# or <keyboard_dir>/ld/
|
||||||
|
STARTUPLD_CONTRIB = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld
|
||||||
|
MCU_LDSCRIPT ?= RP2040_FLASH_TIMECRIT
|
||||||
|
LDFLAGS += -L $(STARTUPLD_CONTRIB)
|
||||||
|
|
||||||
|
# Startup code to use
|
||||||
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
MCU_STARTUP ?= rp2040
|
||||||
|
|
||||||
|
# Board: it should exist either in <chibios>/os/hal/boards/,
|
||||||
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
|
BOARD ?= GENERIC_PROMICRO_RP2040
|
||||||
|
|
||||||
|
# Default UF2 Bootloader settings
|
||||||
|
UF2_FAMILY ?= RP2040
|
||||||
|
FIRMWARE_FORMAT ?= uf2
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F042, $(MCU)),)
|
ifneq ($(findstring STM32F042, $(MCU)),)
|
||||||
# Cortex version
|
# Cortex version
|
||||||
MCU = cortex-m0
|
MCU = cortex-m0
|
||||||
@@ -117,7 +187,9 @@ ifneq ($(findstring STM32F042, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F0xx
|
MCU_SERIES = STM32F0xx
|
||||||
|
|
||||||
@@ -143,6 +215,9 @@ ifneq ($(findstring STM32F042, $(MCU)),)
|
|||||||
# This ensures that the EEPROM page buffer fits into RAM
|
# This ensures that the EEPROM page buffer fits into RAM
|
||||||
USE_PROCESS_STACKSIZE = 0x600
|
USE_PROCESS_STACKSIZE = 0x600
|
||||||
USE_EXCEPTIONS_STACKSIZE = 0x300
|
USE_EXCEPTIONS_STACKSIZE = 0x300
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC400
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F072, $(MCU)),)
|
ifneq ($(findstring STM32F072, $(MCU)),)
|
||||||
@@ -154,7 +229,9 @@ ifneq ($(findstring STM32F072, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F0xx
|
MCU_SERIES = STM32F0xx
|
||||||
|
|
||||||
@@ -175,6 +252,9 @@ ifneq ($(findstring STM32F072, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F0
|
UF2_FAMILY ?= STM32F0
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F103, $(MCU)),)
|
ifneq ($(findstring STM32F103, $(MCU)),)
|
||||||
@@ -186,7 +266,9 @@ ifneq ($(findstring STM32F103, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F1xx
|
MCU_SERIES = STM32F1xx
|
||||||
|
|
||||||
@@ -218,7 +300,9 @@ ifneq ($(findstring STM32F303, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F3xx
|
MCU_SERIES = STM32F3xx
|
||||||
|
|
||||||
@@ -239,6 +323,9 @@ ifneq ($(findstring STM32F303, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F3
|
UF2_FAMILY ?= STM32F3
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFFD800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F401, $(MCU)),)
|
ifneq ($(findstring STM32F401, $(MCU)),)
|
||||||
@@ -250,7 +337,9 @@ ifneq ($(findstring STM32F401, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
@@ -276,6 +365,9 @@ ifneq ($(findstring STM32F401, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F405, $(MCU)),)
|
ifneq ($(findstring STM32F405, $(MCU)),)
|
||||||
@@ -287,7 +379,9 @@ ifneq ($(findstring STM32F405, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
@@ -308,6 +402,9 @@ ifneq ($(findstring STM32F405, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F407, $(MCU)),)
|
ifneq ($(findstring STM32F407, $(MCU)),)
|
||||||
@@ -319,7 +416,9 @@ ifneq ($(findstring STM32F407, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
@@ -340,6 +439,9 @@ ifneq ($(findstring STM32F407, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F411, $(MCU)),)
|
ifneq ($(findstring STM32F411, $(MCU)),)
|
||||||
@@ -351,7 +453,9 @@ ifneq ($(findstring STM32F411, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
@@ -377,6 +481,9 @@ ifneq ($(findstring STM32F411, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32F4
|
UF2_FAMILY ?= STM32F4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32F446, $(MCU)),)
|
ifneq ($(findstring STM32F446, $(MCU)),)
|
||||||
@@ -388,7 +495,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32F4xx
|
MCU_SERIES = STM32F4xx
|
||||||
|
|
||||||
@@ -406,6 +515,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
|
|||||||
BOARD ?= GENERIC_STM32_F446XE
|
BOARD ?= GENERIC_STM32_F446XE
|
||||||
|
|
||||||
USE_FPU ?= yes
|
USE_FPU ?= yes
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32G431, $(MCU)),)
|
ifneq ($(findstring STM32G431, $(MCU)),)
|
||||||
@@ -417,7 +529,9 @@ ifneq ($(findstring STM32G431, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32G4xx
|
MCU_SERIES = STM32G4xx
|
||||||
|
|
||||||
@@ -438,6 +552,9 @@ ifneq ($(findstring STM32G431, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32G4
|
UF2_FAMILY ?= STM32G4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring STM32G474, $(MCU)),)
|
ifneq ($(findstring STM32G474, $(MCU)),)
|
||||||
@@ -449,7 +566,9 @@ ifneq ($(findstring STM32G474, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32G4xx
|
MCU_SERIES = STM32G4xx
|
||||||
|
|
||||||
@@ -470,6 +589,48 @@ ifneq ($(findstring STM32G474, $(MCU)),)
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32G4
|
UF2_FAMILY ?= STM32G4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter $(MCU),STM32L432 STM32L442))
|
||||||
|
# Cortex version
|
||||||
|
MCU = cortex-m4
|
||||||
|
|
||||||
|
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
||||||
|
ARMV = 7
|
||||||
|
|
||||||
|
## chip/board settings
|
||||||
|
# - the next two should match the directories in
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_FAMILY = STM32
|
||||||
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
|
# Linker script to use
|
||||||
|
# - it should exist either in <chibios>/os/common/startup/ARMCMx/compilers/GCC/ld/
|
||||||
|
# or <keyboard_dir>/ld/
|
||||||
|
MCU_LDSCRIPT ?= STM32L432xC
|
||||||
|
|
||||||
|
# Startup code to use
|
||||||
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
MCU_STARTUP ?= stm32l4xx
|
||||||
|
|
||||||
|
# Board: it should exist either in <chibios>/os/hal/boards/,
|
||||||
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
|
BOARD ?= GENERIC_STM32_L432XC
|
||||||
|
|
||||||
|
PLATFORM_NAME ?= platform_l432
|
||||||
|
|
||||||
|
USE_FPU ?= yes
|
||||||
|
|
||||||
|
# UF2 settings
|
||||||
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
||||||
@@ -481,7 +642,9 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32L4xx
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
@@ -504,6 +667,9 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
|
|||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32L4
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
||||||
@@ -515,7 +681,9 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = STM32
|
MCU_FAMILY = STM32
|
||||||
MCU_SERIES = STM32L4xx
|
MCU_SERIES = STM32L4xx
|
||||||
|
|
||||||
@@ -532,12 +700,15 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
|
|||||||
# <keyboard_dir>/boards/, or drivers/boards/
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
BOARD ?= GENERIC_STM32_L412XB
|
BOARD ?= GENERIC_STM32_L412XB
|
||||||
|
|
||||||
PLATFORM_NAME ?= platform_l432
|
PLATFORM_NAME ?= platform_l412_l422
|
||||||
|
|
||||||
USE_FPU ?= yes
|
USE_FPU ?= yes
|
||||||
|
|
||||||
# UF2 settings
|
# UF2 settings
|
||||||
UF2_FAMILY ?= STM32L4
|
UF2_FAMILY ?= STM32L4
|
||||||
|
|
||||||
|
# Bootloader address for STM32 DFU
|
||||||
|
STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring WB32F3G71, $(MCU)),)
|
ifneq ($(findstring WB32F3G71, $(MCU)),)
|
||||||
@@ -549,7 +720,9 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
MCU_FAMILY = WB32
|
MCU_FAMILY = WB32
|
||||||
MCU_SERIES = WB32F3G71xx
|
MCU_SERIES = WB32F3G71xx
|
||||||
|
|
||||||
@@ -567,6 +740,43 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
|
|||||||
BOARD ?= GENERIC_WB32_F3G71XX
|
BOARD ?= GENERIC_WB32_F3G71XX
|
||||||
|
|
||||||
USE_FPU ?= no
|
USE_FPU ?= no
|
||||||
|
|
||||||
|
# Bootloader address for WB32 DFU
|
||||||
|
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(findstring WB32FQ95, $(MCU)),)
|
||||||
|
# Cortex version
|
||||||
|
MCU = cortex-m3
|
||||||
|
|
||||||
|
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
|
||||||
|
ARMV = 7
|
||||||
|
|
||||||
|
## chip/board settings
|
||||||
|
# - the next two should match the directories in
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_FAMILY = WB32
|
||||||
|
MCU_SERIES = WB32FQ95xx
|
||||||
|
|
||||||
|
# Linker script to use
|
||||||
|
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
|
||||||
|
# or <keyboard_dir>/ld/
|
||||||
|
MCU_LDSCRIPT ?= WB32FQ95xB
|
||||||
|
|
||||||
|
# Startup code to use
|
||||||
|
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
|
||||||
|
MCU_STARTUP ?= wb32fq95xx
|
||||||
|
|
||||||
|
# Board: it should exist either in <chibios>/os/hal/boards/,
|
||||||
|
# <keyboard_dir>/boards/, or drivers/boards/
|
||||||
|
BOARD ?= GENERIC_WB32_FQ95XX
|
||||||
|
|
||||||
|
USE_FPU ?= no
|
||||||
|
|
||||||
|
# Bootloader address for WB32 DFU
|
||||||
|
WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring GD32VF103, $(MCU)),)
|
ifneq ($(findstring GD32VF103, $(MCU)),)
|
||||||
@@ -580,7 +790,10 @@ ifneq ($(findstring GD32VF103, $(MCU)),)
|
|||||||
|
|
||||||
## chip/board settings
|
## chip/board settings
|
||||||
# - the next two should match the directories in
|
# - the next two should match the directories in
|
||||||
# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
|
||||||
|
# OR
|
||||||
|
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
|
||||||
|
MCU_PORT_NAME = GD
|
||||||
MCU_FAMILY = GD32V
|
MCU_FAMILY = GD32V
|
||||||
MCU_SERIES = GD32VF103
|
MCU_SERIES = GD32VF103
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ MSG_COMPILING_CXX = Compiling:
|
|||||||
MSG_ASSEMBLING = Assembling:
|
MSG_ASSEMBLING = Assembling:
|
||||||
MSG_CLEANING = Cleaning project:
|
MSG_CLEANING = Cleaning project:
|
||||||
MSG_CREATING_LIBRARY = Creating library:
|
MSG_CREATING_LIBRARY = Creating library:
|
||||||
|
MSG_GENERATING = Generating:
|
||||||
MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
|
MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
|
||||||
Please consider running $(BOLD)make git-submodule$(NO_COLOR).\n\n
|
Please consider running $(BOLD)make git-submodule$(NO_COLOR).\n\n
|
||||||
MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR)
|
MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR)
|
||||||
@@ -87,6 +88,7 @@ define GENERATE_MSG_AVAILABLE_KEYMAPS
|
|||||||
endef
|
endef
|
||||||
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
|
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
|
||||||
|
|
||||||
|
MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n
|
||||||
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
|
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
|
||||||
MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)
|
MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)
|
||||||
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
|
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
|
||||||
@@ -97,6 +99,11 @@ MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n
|
|||||||
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
|
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
|
||||||
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
|
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
|
||||||
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
|
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
|
||||||
MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) Bootloader not found. Trying again in 5s (Ctrl+C to cancel)\n
|
MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n
|
||||||
BOOTLOADER_RETRY_TIME ?= 0.5
|
BOOTLOADER_RETRY_TIME ?= 0.5
|
||||||
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = Bootloader not found. Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
|
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
|
||||||
|
|
||||||
|
define CATASTROPHIC_ERROR
|
||||||
|
$(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2)
|
||||||
|
$(error $1)
|
||||||
|
endef
|
||||||
@@ -5,7 +5,6 @@ BUILD_OPTION_NAMES = \
|
|||||||
CONSOLE_ENABLE \
|
CONSOLE_ENABLE \
|
||||||
COMMAND_ENABLE \
|
COMMAND_ENABLE \
|
||||||
NKRO_ENABLE \
|
NKRO_ENABLE \
|
||||||
TERMINAL_ENABLE \
|
|
||||||
CUSTOM_MATRIX \
|
CUSTOM_MATRIX \
|
||||||
DEBOUNCE_TYPE \
|
DEBOUNCE_TYPE \
|
||||||
SPLIT_KEYBOARD \
|
SPLIT_KEYBOARD \
|
||||||
@@ -46,6 +45,7 @@ OTHER_OPTION_NAMES = \
|
|||||||
LEADER_ENABLE \
|
LEADER_ENABLE \
|
||||||
PRINTING_ENABLE \
|
PRINTING_ENABLE \
|
||||||
STENO_ENABLE \
|
STENO_ENABLE \
|
||||||
|
STENO_PROTOCOL \
|
||||||
TAP_DANCE_ENABLE \
|
TAP_DANCE_ENABLE \
|
||||||
VIRTSER_ENABLE \
|
VIRTSER_ENABLE \
|
||||||
OLED_ENABLE \
|
OLED_ENABLE \
|
||||||
@@ -57,6 +57,7 @@ OTHER_OPTION_NAMES = \
|
|||||||
HELIX ZINC \
|
HELIX ZINC \
|
||||||
AUTOLOG_ENABLE \
|
AUTOLOG_ENABLE \
|
||||||
DEBUG_ENABLE \
|
DEBUG_ENABLE \
|
||||||
|
ENCODER_MAP_ENABLE \
|
||||||
ENCODER_ENABLE_CUSTOM \
|
ENCODER_ENABLE_CUSTOM \
|
||||||
GERMAN_ENABLE \
|
GERMAN_ENABLE \
|
||||||
HAPTIC_ENABLE \
|
HAPTIC_ENABLE \
|
||||||
@@ -79,7 +80,9 @@ OTHER_OPTION_NAMES = \
|
|||||||
LED_MIRRORED \
|
LED_MIRRORED \
|
||||||
RGBLIGHT_FULL_POWER \
|
RGBLIGHT_FULL_POWER \
|
||||||
LTO_ENABLE \
|
LTO_ENABLE \
|
||||||
PROGRAMMABLE_BUTTON_ENABLE
|
PROGRAMMABLE_BUTTON_ENABLE \
|
||||||
|
SECURE_ENABLE \
|
||||||
|
CAPS_WORD_ENABLE
|
||||||
|
|
||||||
define NAME_ECHO
|
define NAME_ECHO
|
||||||
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
|
@printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
|
||||||
|
|||||||
21
builddefs/testlist.mk
Normal file
21
builddefs/testlist.mk
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk)))
|
||||||
|
FULL_TESTS := $(notdir $(TEST_LIST))
|
||||||
|
|
||||||
|
include $(QUANTUM_PATH)/debounce/tests/testlist.mk
|
||||||
|
include $(QUANTUM_PATH)/encoder/tests/testlist.mk
|
||||||
|
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
|
||||||
|
include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk
|
||||||
|
include $(PLATFORM_PATH)/test/testlist.mk
|
||||||
|
|
||||||
|
define VALIDATE_TEST_LIST
|
||||||
|
ifneq ($1,)
|
||||||
|
ifeq ($$(findstring -,$1),-)
|
||||||
|
$$(call CATASTROPHIC_ERROR,Invalid test name,Test names can't contain '-', but '$1' does.)
|
||||||
|
else
|
||||||
|
$$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))
|
||||||
@@ -1,724 +0,0 @@
|
|||||||
# Copyright 2017 Fred Sundvik
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
QUANTUM_SRC += \
|
|
||||||
$(QUANTUM_DIR)/quantum.c \
|
|
||||||
$(QUANTUM_DIR)/send_string.c \
|
|
||||||
$(QUANTUM_DIR)/bitwise.c \
|
|
||||||
$(QUANTUM_DIR)/led.c \
|
|
||||||
$(QUANTUM_DIR)/action.c \
|
|
||||||
$(QUANTUM_DIR)/action_layer.c \
|
|
||||||
$(QUANTUM_DIR)/action_macro.c \
|
|
||||||
$(QUANTUM_DIR)/action_tapping.c \
|
|
||||||
$(QUANTUM_DIR)/action_util.c \
|
|
||||||
$(QUANTUM_DIR)/eeconfig.c \
|
|
||||||
$(QUANTUM_DIR)/keyboard.c \
|
|
||||||
$(QUANTUM_DIR)/keymap_common.c \
|
|
||||||
$(QUANTUM_DIR)/keycode_config.c \
|
|
||||||
$(QUANTUM_DIR)/sync_timer.c \
|
|
||||||
$(QUANTUM_DIR)/logging/debug.c \
|
|
||||||
$(QUANTUM_DIR)/logging/sendchar.c \
|
|
||||||
|
|
||||||
VPATH += $(QUANTUM_DIR)/logging
|
|
||||||
# Fall back to lib/printf if there is no platform provided print
|
|
||||||
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
|
|
||||||
include $(QUANTUM_PATH)/logging/print.mk
|
|
||||||
else
|
|
||||||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
|
|
||||||
CONSOLE_ENABLE = yes
|
|
||||||
else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api)
|
|
||||||
OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
|
|
||||||
endif
|
|
||||||
|
|
||||||
AUDIO_ENABLE ?= no
|
|
||||||
ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
|
||||||
ifeq ($(PLATFORM),CHIBIOS)
|
|
||||||
AUDIO_DRIVER ?= dac_basic
|
|
||||||
ifeq ($(strip $(AUDIO_DRIVER)), dac_basic)
|
|
||||||
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
|
||||||
else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive)
|
|
||||||
OPT_DEFS += -DAUDIO_DRIVER_DAC
|
|
||||||
## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead
|
|
||||||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software)
|
|
||||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
|
||||||
else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware)
|
|
||||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
# fallback for all other platforms is pwm
|
|
||||||
AUDIO_DRIVER ?= pwm_hardware
|
|
||||||
OPT_DEFS += -DAUDIO_DRIVER_PWM
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DAUDIO_ENABLE
|
|
||||||
MUSIC_ENABLE = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic
|
|
||||||
SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/voices.c
|
|
||||||
SRC += $(QUANTUM_DIR)/audio/luts.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(SEQUENCER_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DSEQUENCER_ENABLE
|
|
||||||
MUSIC_ENABLE = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/sequencer/sequencer.c
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_sequencer.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(MIDI_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DMIDI_ENABLE
|
|
||||||
MUSIC_ENABLE = yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
MUSIC_ENABLE ?= no
|
|
||||||
ifeq ($(MUSIC_ENABLE), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(STENO_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DSTENO_ENABLE
|
|
||||||
VIRTSER_ENABLE ?= yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(VIRTSER_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DVIRTSER_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DMOUSEKEY_ENABLE
|
|
||||||
MOUSE_ENABLE := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/mousekey.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pimoroni_trackball custom
|
|
||||||
POINTING_DEVICE_DRIVER ?= custom
|
|
||||||
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
|
|
||||||
$(error POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
|
|
||||||
else
|
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_ENABLE
|
|
||||||
MOUSE_ENABLE := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device.c
|
|
||||||
SRC += $(QUANTUM_DIR)/pointing_device_drivers.c
|
|
||||||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
|
||||||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
|
||||||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
|
||||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
|
||||||
OPT_DEFS += -DSTM32_ADC -DHAL_USE_ADC=TRUE
|
|
||||||
LIB_SRC += analog.c
|
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
|
|
||||||
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
SRC += drivers/sensors/cirque_pinnacle.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi)
|
|
||||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
|
||||||
SRC += drivers/sensors/cirque_pinnacle.c
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
|
|
||||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_I2C=TRUE
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360)
|
|
||||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
|
|
||||||
EEPROM_DRIVER ?= vendor
|
|
||||||
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
|
|
||||||
$(error EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
|
|
||||||
else
|
|
||||||
OPT_DEFS += -DEEPROM_ENABLE
|
|
||||||
ifeq ($(strip $(EEPROM_DRIVER)), custom)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
SRC += eeprom_driver.c
|
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
SRC += eeprom_driver.c eeprom_i2c.c
|
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
SRC += eeprom_driver.c eeprom_spi.c
|
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
SRC += eeprom_driver.c eeprom_transient.c
|
|
||||||
else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
|
|
||||||
OPT_DEFS += -DEEPROM_VENDOR
|
|
||||||
ifeq ($(PLATFORM),AVR)
|
|
||||||
# Automatically provided by avr-libc, nothing required
|
|
||||||
else ifeq ($(PLATFORM),CHIBIOS)
|
|
||||||
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
SRC += eeprom_driver.c
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
|
|
||||||
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
|
|
||||||
OPT_DEFS += -DEEPROM_DRIVER
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/eeprom
|
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
|
|
||||||
SRC += eeprom_driver.c
|
|
||||||
SRC += eeprom_stm32_L0_L1.c
|
|
||||||
else
|
|
||||||
# This will effectively work the same as "transient" if not supported by the chip
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
|
|
||||||
endif
|
|
||||||
else ifeq ($(PLATFORM),ARM_ATSAM)
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
|
||||||
else ifeq ($(PLATFORM),TEST)
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
RGBLIGHT_ENABLE ?= no
|
|
||||||
VALID_RGBLIGHT_TYPES := WS2812 APA102 custom
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
|
||||||
RGBLIGHT_DRIVER ?= custom
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|
||||||
RGBLIGHT_DRIVER ?= WS2812
|
|
||||||
|
|
||||||
ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
|
|
||||||
$(error RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
|
|
||||||
else
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
|
|
||||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
|
||||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/color.c
|
|
||||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
|
||||||
CIE1931_CURVE := yes
|
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), WS2812)
|
|
||||||
WS2812_DRIVER_REQUIRED := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), APA102)
|
|
||||||
APA102_DRIVER_REQUIRED := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), custom)
|
|
||||||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
LED_MATRIX_ENABLE ?= no
|
|
||||||
VALID_LED_MATRIX_TYPES := IS31FL3731 custom
|
|
||||||
# TODO: IS31FL3733 IS31FL3737 IS31FL3741
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
|
|
||||||
$(error "$(LED_MATRIX_DRIVER)" is not a valid matrix type)
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DLED_MATRIX_ENABLE
|
|
||||||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
|
||||||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
|
||||||
OPT_DEFS += -DLIB8_ATTINY
|
|
||||||
endif
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
|
||||||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c
|
|
||||||
SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c
|
|
||||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
|
||||||
CIE1931_CURVE := yes
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), IS31FL3731)
|
|
||||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
|
||||||
SRC += is31fl3731-simple.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
RGB_MATRIX_ENABLE ?= no
|
|
||||||
VALID_RGB_MATRIX_TYPES := AW20216 IS31FL3731 IS31FL3733 IS31FL3737 IS31FL3741 CKLED2001 WS2812 custom
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
|
|
||||||
$(error "$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DRGB_MATRIX_ENABLE
|
|
||||||
ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
|
|
||||||
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
|
|
||||||
OPT_DEFS += -DLIB8_ATTINY
|
|
||||||
endif
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
|
||||||
SRC += $(QUANTUM_DIR)/color.c
|
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
|
||||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
|
||||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
|
||||||
CIE1931_CURVE := yes
|
|
||||||
RGB_KEYCODES_ENABLE := yes
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), AW20216)
|
|
||||||
OPT_DEFS += -DAW20216 -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
|
||||||
SRC += aw20216.c
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3731)
|
|
||||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
|
||||||
SRC += is31fl3731.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3733)
|
|
||||||
OPT_DEFS += -DIS31FL3733 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
|
||||||
SRC += is31fl3733.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3737)
|
|
||||||
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
|
||||||
SRC += is31fl3737.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), IS31FL3741)
|
|
||||||
OPT_DEFS += -DIS31FL3741 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
|
||||||
SRC += is31fl3741.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), CKLED2001)
|
|
||||||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
|
||||||
SRC += ckled2001.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), WS2812)
|
|
||||||
OPT_DEFS += -DWS2812
|
|
||||||
WS2812_DRIVER_REQUIRED := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), APA102)
|
|
||||||
OPT_DEFS += -DAPA102
|
|
||||||
APA102_DRIVER_REQUIRED := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
|
|
||||||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes)
|
|
||||||
OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PRINTING_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DPRINTING_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
|
|
||||||
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
VARIABLE_TRACE ?= no
|
|
||||||
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
|
||||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
|
||||||
OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
|
|
||||||
ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
|
|
||||||
OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
|
|
||||||
SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
|
|
||||||
OPT_DEFS += -DSLEEP_LED_ENABLE
|
|
||||||
|
|
||||||
NO_SUSPEND_POWER_DOWN := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_BACKLIGHT_TYPES := pwm timer software custom
|
|
||||||
|
|
||||||
BACKLIGHT_ENABLE ?= no
|
|
||||||
ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
|
|
||||||
BACKLIGHT_DRIVER ?= software
|
|
||||||
else
|
|
||||||
BACKLIGHT_DRIVER ?= pwm
|
|
||||||
endif
|
|
||||||
ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
|
|
||||||
$(error BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
|
|
||||||
endif
|
|
||||||
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/backlight
|
|
||||||
SRC += $(QUANTUM_DIR)/backlight/backlight.c
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
|
||||||
OPT_DEFS += -DBACKLIGHT_ENABLE
|
|
||||||
|
|
||||||
ifeq ($(strip $(BACKLIGHT_DRIVER)), custom)
|
|
||||||
OPT_DEFS += -DBACKLIGHT_CUSTOM_DRIVER
|
|
||||||
else
|
|
||||||
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
|
|
||||||
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm)
|
|
||||||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c
|
|
||||||
else
|
|
||||||
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c
|
|
||||||
|
|
||||||
WS2812_DRIVER ?= bitbang
|
|
||||||
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
|
||||||
ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
|
|
||||||
$(error WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
|
|
||||||
endif
|
|
||||||
|
|
||||||
OPT_DEFS += -DWS2812_DRIVER_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
|
||||||
|
|
||||||
ifeq ($(strip $(WS2812_DRIVER)), bitbang)
|
|
||||||
SRC += ws2812.c
|
|
||||||
else
|
|
||||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
|
||||||
|
|
||||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
|
||||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
|
||||||
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# add extra deps
|
|
||||||
ifeq ($(strip $(WS2812_DRIVER)), i2c)
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes)
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
|
||||||
SRC += apa102.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(CIE1931_CURVE)), yes)
|
|
||||||
OPT_DEFS += -DUSE_CIE1931_CURVE
|
|
||||||
LED_TABLES := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_TABLES)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/led_tables.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(TERMINAL_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c
|
|
||||||
OPT_DEFS += -DTERMINAL_ENABLE
|
|
||||||
OPT_DEFS += -DUSER_PRINT
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(VIA_ENABLE)), yes)
|
|
||||||
DYNAMIC_KEYMAP_ENABLE := yes
|
|
||||||
RAW_ENABLE := yes
|
|
||||||
BOOTMAGIC_ENABLE := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/via.c
|
|
||||||
OPT_DEFS += -DVIA_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_MAGIC_TYPES := yes
|
|
||||||
BOOTMAGIC_ENABLE ?= no
|
|
||||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
|
||||||
ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),)
|
|
||||||
$(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic)
|
|
||||||
endif
|
|
||||||
ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
|
|
||||||
OPT_DEFS += -DBOOTMAGIC_LITE
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/bootmagic_lite.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
COMMON_VPATH += $(QUANTUM_DIR)/bootmagic
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/bootmagic/magic.c
|
|
||||||
|
|
||||||
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
|
|
||||||
|
|
||||||
CUSTOM_MATRIX ?= no
|
|
||||||
|
|
||||||
ifneq ($(strip $(CUSTOM_MATRIX)), yes)
|
|
||||||
ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
|
|
||||||
$(error CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Include common stuff for all non custom matrix users
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c
|
|
||||||
|
|
||||||
# if 'lite' then skip the actual matrix implementation
|
|
||||||
ifneq ($(strip $(CUSTOM_MATRIX)), lite)
|
|
||||||
# Include the standard or split matrix code if needed
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually.
|
|
||||||
DEBOUNCE_TYPE ?= sym_defer_g
|
|
||||||
ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
|
|
||||||
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
|
|
||||||
OPT_DEFS += -DSPLIT_KEYBOARD
|
|
||||||
CRC_ENABLE := yes
|
|
||||||
|
|
||||||
# Include files used by all split keyboards
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c
|
|
||||||
|
|
||||||
# Determine which (if any) transport files are required
|
|
||||||
ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
|
|
||||||
QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \
|
|
||||||
$(QUANTUM_DIR)/split_common/transactions.c
|
|
||||||
|
|
||||||
OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS
|
|
||||||
|
|
||||||
# Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
|
|
||||||
# Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
|
|
||||||
ifeq ($(PLATFORM),AVR)
|
|
||||||
ifneq ($(NO_I2C),yes)
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c \
|
|
||||||
i2c_slave.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
SERIAL_DRIVER ?= bitbang
|
|
||||||
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
|
||||||
ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
|
|
||||||
QUANTUM_LIB_SRC += serial.c
|
|
||||||
else
|
|
||||||
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
COMMON_VPATH += $(QUANTUM_PATH)/split_common
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(CRC_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DCRC_ENABLE
|
|
||||||
SRC += crc.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(HAPTIC_ENABLE)),yes)
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
|
||||||
|
|
||||||
ifneq ($(filter DRV2605L, $(HAPTIC_DRIVER)), )
|
|
||||||
SRC += DRV2605L.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
OPT_DEFS += -DDRV2605L
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifneq ($(filter SOLENOID, $(HAPTIC_DRIVER)), )
|
|
||||||
SRC += solenoid.c
|
|
||||||
OPT_DEFS += -DSOLENOID_ENABLE
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(HD44780_ENABLE)), yes)
|
|
||||||
SRC += platforms/avr/drivers/hd44780.c
|
|
||||||
OPT_DEFS += -DHD44780_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
VALID_OLED_DRIVER_TYPES := SSD1306 custom
|
|
||||||
OLED_DRIVER ?= SSD1306
|
|
||||||
ifeq ($(strip $(OLED_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
|
|
||||||
$(error OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
|
|
||||||
else
|
|
||||||
OPT_DEFS += -DOLED_ENABLE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/oled
|
|
||||||
|
|
||||||
OPT_DEFS += -DOLED_DRIVER_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
|
||||||
ifeq ($(strip $(OLED_DRIVER)), SSD1306)
|
|
||||||
SRC += ssd1306_sh1106.c
|
|
||||||
QUANTUM_LIB_SRC += i2c_master.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(ST7565_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DST7565_ENABLE
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/lcd
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
SRC += st7565.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UCIS_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUCIS_ENABLE
|
|
||||||
UNICODE_COMMON := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUNICODEMAP_ENABLE
|
|
||||||
UNICODE_COMMON := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_ENABLE)), yes)
|
|
||||||
OPT_DEFS += -DUNICODE_ENABLE
|
|
||||||
UNICODE_COMMON := yes
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(UNICODE_COMMON)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
MAGIC_ENABLE ?= yes
|
|
||||||
ifeq ($(strip $(MAGIC_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_magic.c
|
|
||||||
OPT_DEFS += -DMAGIC_KEYCODE_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
|
|
||||||
OPT_DEFS += -DAUTO_SHIFT_ENABLE
|
|
||||||
ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes)
|
|
||||||
OPT_DEFS += -DAUTO_SHIFT_MODIFIERS
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes)
|
|
||||||
PS2_ENABLE := yes
|
|
||||||
SRC += ps2_mouse.c
|
|
||||||
OPT_DEFS += -DPS2_MOUSE_ENABLE
|
|
||||||
OPT_DEFS += -DMOUSE_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PS2_USE_BUSYWAIT)), yes)
|
|
||||||
PS2_ENABLE := yes
|
|
||||||
SRC += ps2_busywait.c
|
|
||||||
SRC += ps2_io_avr.c
|
|
||||||
OPT_DEFS += -DPS2_USE_BUSYWAIT
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PS2_USE_INT)), yes)
|
|
||||||
PS2_ENABLE := yes
|
|
||||||
SRC += ps2_interrupt.c
|
|
||||||
SRC += ps2_io.c
|
|
||||||
OPT_DEFS += -DPS2_USE_INT
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PS2_USE_USART)), yes)
|
|
||||||
PS2_ENABLE := yes
|
|
||||||
SRC += ps2_usart.c
|
|
||||||
SRC += ps2_io.c
|
|
||||||
OPT_DEFS += -DPS2_USE_USART
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(PS2_ENABLE)), yes)
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/ps2
|
|
||||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2
|
|
||||||
OPT_DEFS += -DPS2_ENABLE
|
|
||||||
endif
|
|
||||||
|
|
||||||
JOYSTICK_ENABLE ?= no
|
|
||||||
VALID_JOYSTICK_TYPES := analog digital
|
|
||||||
JOYSTICK_DRIVER ?= analog
|
|
||||||
ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
|
|
||||||
$(error "$(JOYSTICK_DRIVER)" is not a valid joystick driver)
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DJOYSTICK_ENABLE
|
|
||||||
SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
|
|
||||||
SRC += $(QUANTUM_DIR)/joystick.c
|
|
||||||
|
|
||||||
ifeq ($(strip $(JOYSTICK_DRIVER)), analog)
|
|
||||||
OPT_DEFS += -DANALOG_JOYSTICK_ENABLE
|
|
||||||
SRC += analog.c
|
|
||||||
endif
|
|
||||||
ifeq ($(strip $(JOYSTICK_DRIVER)), digital)
|
|
||||||
OPT_DEFS += -DDIGITAL_JOYSTICK_ENABLE
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
USBPD_ENABLE ?= no
|
|
||||||
VALID_USBPD_DRIVER_TYPES = custom vendor
|
|
||||||
USBPD_DRIVER ?= vendor
|
|
||||||
ifeq ($(strip $(USBPD_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
|
|
||||||
$(error USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
|
|
||||||
else
|
|
||||||
OPT_DEFS += -DUSBPD_ENABLE
|
|
||||||
ifeq ($(strip $(USBPD_DRIVER)), vendor)
|
|
||||||
# Vendor-specific implementations
|
|
||||||
OPT_DEFS += -DUSBPD_VENDOR
|
|
||||||
ifeq ($(strip $(MCU_SERIES)), STM32G4xx)
|
|
||||||
OPT_DEFS += -DUSBPD_STM32G4
|
|
||||||
SRC += usbpd_stm32g4.c
|
|
||||||
else
|
|
||||||
$(error There is no vendor-provided USBPD driver available)
|
|
||||||
endif
|
|
||||||
else ifeq ($(strip $(USBPD_DRIVER)), custom)
|
|
||||||
OPT_DEFS += -DUSBPD_CUSTOM
|
|
||||||
# Board designers can add their own driver to $(SRC)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
BLUETOOTH_ENABLE ?= no
|
|
||||||
VALID_BLUETOOTH_DRIVER_TYPES := AdafruitBLE RN42 custom
|
|
||||||
ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
|
||||||
ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
|
|
||||||
$(error "$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
|
|
||||||
endif
|
|
||||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
|
||||||
NO_USB_STARTUP_CHECK := yes
|
|
||||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
|
||||||
SRC += outputselect.c
|
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), AdafruitBLE)
|
|
||||||
OPT_DEFS += -DMODULE_ADAFRUIT_BLE
|
|
||||||
SRC += analog.c
|
|
||||||
SRC += $(DRIVER_PATH)/bluetooth/adafruit_ble.cpp
|
|
||||||
QUANTUM_LIB_SRC += spi_master.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
|
|
||||||
OPT_DEFS += -DMODULE_RN42
|
|
||||||
SRC += $(TMK_DIR)/protocol/serial_uart.c
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
53
data/mappings/defaults.json
Normal file
53
data/mappings/defaults.json
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"development_board": {
|
||||||
|
"promicro": {
|
||||||
|
"processor": "atmega32u4",
|
||||||
|
"bootloader": "caterina",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"elite_c": {
|
||||||
|
"processor": "atmega32u4",
|
||||||
|
"bootloader": "atmel-dfu",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"proton_c": {
|
||||||
|
"processor": "STM32F303",
|
||||||
|
"bootloader": "stm32-dfu",
|
||||||
|
"board": "QMK_PROTON_C",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"kb2040": {
|
||||||
|
"processor": "RP2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"board": "QMK_PM2040",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"promicro_rp2040": {
|
||||||
|
"processor": "RP2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"board": "QMK_PM2040",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"blok": {
|
||||||
|
"processor": "RP2040",
|
||||||
|
"bootloader": "rp2040",
|
||||||
|
"board": "QMK_PM2040",
|
||||||
|
"pin_compatible": "promicro"
|
||||||
|
},
|
||||||
|
"bluepill": {
|
||||||
|
"processor": "STM32F103",
|
||||||
|
"bootloader": "stm32duino",
|
||||||
|
"board": "STM32_F103_STM32DUINO"
|
||||||
|
},
|
||||||
|
"blackpill_f401": {
|
||||||
|
"processor": "STM32F401",
|
||||||
|
"bootloader": "stm32-dfu",
|
||||||
|
"board": "BLACKPILL_STM32_F401"
|
||||||
|
},
|
||||||
|
"blackpill_f411": {
|
||||||
|
"processor": "STM32F411",
|
||||||
|
"bootloader": "stm32-dfu",
|
||||||
|
"board": "BLACKPILL_STM32_F411"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,20 +3,27 @@
|
|||||||
{
|
{
|
||||||
# Format:
|
# Format:
|
||||||
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
# <config.h key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||||
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping"
|
# value_type: one of "array", "array.int", "bool", "int", "hex", "list", "mapping", "str", "raw"
|
||||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
|
# to_c: Default `true`. Set to `false` to exclude this mapping from config.h
|
||||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
|
# deprecated: Default `false`. Set to `true` to turn on warning when a value exists
|
||||||
|
# invalid: Default `false`. Set to `true` to generate errors when a value exists
|
||||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
||||||
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
|
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
|
||||||
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
|
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
|
||||||
|
"BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"},
|
||||||
"BACKLIGHT_PIN": {"info_key": "backlight.pin"},
|
"BACKLIGHT_PIN": {"info_key": "backlight.pin"},
|
||||||
|
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
|
||||||
|
"CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
|
||||||
"COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
|
"COMBO_COUNT": {"info_key": "combo.count", "value_type": "int"},
|
||||||
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
||||||
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
||||||
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
"DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
|
||||||
"DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
|
# TODO: Replace ^^^ with vvv
|
||||||
|
#"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
|
||||||
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
||||||
|
"DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"},
|
||||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
||||||
"DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
|
"DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
|
||||||
"DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
|
"DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
|
||||||
@@ -29,6 +36,9 @@
|
|||||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||||
"LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
|
"LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
|
||||||
|
"LED_COMPOSE_PIN": {"info_key": "indicators.compose"},
|
||||||
|
"LED_KANA_PIN": {"info_key": "indicators.kana"},
|
||||||
|
"LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"},
|
||||||
"MANUFACTURER": {"info_key": "manufacturer"},
|
"MANUFACTURER": {"info_key": "manufacturer"},
|
||||||
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
|
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
|
||||||
"MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
|
"MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
|
||||||
@@ -76,6 +86,9 @@
|
|||||||
"QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int"},
|
"QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int"},
|
||||||
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
"QMK_LED": {"info_key": "qmk_lufa_bootloader.led"},
|
||||||
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
|
"QMK_SPEAKER": {"info_key": "qmk_lufa_bootloader.speaker"},
|
||||||
|
"SECURE_UNLOCK_SEQUENCE": {"info_key": "secure.unlock_sequence", "value_type": "array.array.int", "to_json": false},
|
||||||
|
"SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"},
|
||||||
|
"SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"},
|
||||||
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
||||||
"SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
|
"SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync_modifiers", "value_type": "bool"},
|
||||||
"SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
|
"SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync_matrix_state", "value_type": "bool"},
|
||||||
@@ -94,4 +107,11 @@
|
|||||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
"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_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||||
|
|
||||||
|
# Items we want flagged in lint
|
||||||
|
"NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true},
|
||||||
|
"NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true},
|
||||||
|
"DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true},
|
||||||
|
"DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true},
|
||||||
|
"PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,17 @@
|
|||||||
{
|
{
|
||||||
# Format:
|
# Format:
|
||||||
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
# <rules.mk key>: {"info_key": <info.json key>, ["value_type": <value_type>], ["to_json": <true/false>], ["to_c": <true/false>]}
|
||||||
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping"
|
# value_type: one of "array", "array.int", "bool", "int", "list", "hex", "mapping", "str", "raw"
|
||||||
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
# to_json: Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
|
# to_c: Default `true`. Set to `false` to exclude this mapping from rules.mk
|
||||||
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
# warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
|
# deprecated: Default `false`. Set to `true` to turn on warning when a value exists
|
||||||
|
# invalid: Default `false`. Set to `true` to generate errors when a value exists
|
||||||
"BOARD": {"info_key": "board"},
|
"BOARD": {"info_key": "board"},
|
||||||
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
||||||
"BLUETOOTH": {"info_key": "bluetooth.driver"},
|
"BLUETOOTH": {"info_key": "bluetooth.driver"},
|
||||||
|
"CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
|
||||||
|
"ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"},
|
||||||
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
||||||
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
||||||
"MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
|
"MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
|
||||||
@@ -19,7 +23,16 @@
|
|||||||
"MCU": {"info_key": "processor", "warn_duplicate": false},
|
"MCU": {"info_key": "processor", "warn_duplicate": false},
|
||||||
"MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
|
"MOUSEKEY_ENABLE": {"info_key": "mouse_key.enabled", "value_type": "bool"},
|
||||||
"NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
|
"NO_USB_STARTUP_CHECK": {"info_key": "usb.no_startup_check", "value_type": "bool"},
|
||||||
|
"PIN_COMPATIBLE": {"info_key": "pin_compatible"},
|
||||||
|
"SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"},
|
||||||
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
|
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
|
||||||
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "value_type": "str", "to_c": false},
|
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
|
||||||
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}
|
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
|
||||||
|
"STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"},
|
||||||
|
"STENO_PROTOCOL": {"info_key": "stenography.protocol"},
|
||||||
|
|
||||||
|
# Items we want flagged in lint
|
||||||
|
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true},
|
||||||
|
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true},
|
||||||
|
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
'2_milk': {
|
'2_milk': {
|
||||||
target: 'spaceman/2_milk'
|
target: 'spaceman/2_milk'
|
||||||
},
|
},
|
||||||
|
'absinthe': {
|
||||||
|
target: 'keyhive/absinthe'
|
||||||
|
},
|
||||||
'aeboards/constellation': {
|
'aeboards/constellation': {
|
||||||
target: 'aeboards/constellation/rev1'
|
target: 'aeboards/constellation/rev1'
|
||||||
},
|
},
|
||||||
@@ -26,6 +29,18 @@
|
|||||||
alice: {
|
alice: {
|
||||||
target: 'tgr/alice'
|
target: 'tgr/alice'
|
||||||
},
|
},
|
||||||
|
amj40: {
|
||||||
|
target: 'amjkeyboard/amj40'
|
||||||
|
},
|
||||||
|
amj60: {
|
||||||
|
target: 'amjkeyboard/amj60'
|
||||||
|
},
|
||||||
|
amj96: {
|
||||||
|
target: 'amjkeyboard/amj96'
|
||||||
|
},
|
||||||
|
amjpad: {
|
||||||
|
target: 'amjkeyboard/amjpad'
|
||||||
|
},
|
||||||
angel17: {
|
angel17: {
|
||||||
target: 'angel17/alpha'
|
target: 'angel17/alpha'
|
||||||
},
|
},
|
||||||
@@ -33,7 +48,10 @@
|
|||||||
target: 'angel64/alpha'
|
target: 'angel64/alpha'
|
||||||
},
|
},
|
||||||
at101_blackheart: {
|
at101_blackheart: {
|
||||||
target: 'at101_bh'
|
target: 'viktus/at101_bh'
|
||||||
|
},
|
||||||
|
at101_bh: {
|
||||||
|
target: 'viktus/at101_bh'
|
||||||
},
|
},
|
||||||
'atom47/rev2': {
|
'atom47/rev2': {
|
||||||
target: 'maartenwut/atom47/rev2'
|
target: 'maartenwut/atom47/rev2'
|
||||||
@@ -41,8 +59,14 @@
|
|||||||
'atom47/rev3': {
|
'atom47/rev3': {
|
||||||
target: 'maartenwut/atom47/rev3'
|
target: 'maartenwut/atom47/rev3'
|
||||||
},
|
},
|
||||||
|
bakeneko60: {
|
||||||
|
target: 'kkatano/bakeneko60'
|
||||||
|
},
|
||||||
bakeneko65: {
|
bakeneko65: {
|
||||||
target: 'bakeneko65/rev2'
|
target: 'kkatano/bakeneko65/rev2'
|
||||||
|
},
|
||||||
|
bakeneko80: {
|
||||||
|
target: 'kkatano/bakeneko80'
|
||||||
},
|
},
|
||||||
bear_face: {
|
bear_face: {
|
||||||
target: 'bear_face/v1'
|
target: 'bear_face/v1'
|
||||||
@@ -152,6 +176,9 @@
|
|||||||
ergoinu: {
|
ergoinu: {
|
||||||
target: 'dm9records/ergoinu'
|
target: 'dm9records/ergoinu'
|
||||||
},
|
},
|
||||||
|
ergosaurus: {
|
||||||
|
target: 'keyhive/ergosaurus'
|
||||||
|
},
|
||||||
'exclusive/e85': {
|
'exclusive/e85': {
|
||||||
target: 'exclusive/e85/hotswap'
|
target: 'exclusive/e85/hotswap'
|
||||||
},
|
},
|
||||||
@@ -159,7 +186,13 @@
|
|||||||
target: 'gh60/revc'
|
target: 'gh60/revc'
|
||||||
},
|
},
|
||||||
'gmmk/pro': {
|
'gmmk/pro': {
|
||||||
target: 'gmmk/pro/ansi'
|
target: 'gmmk/pro/rev1/ansi'
|
||||||
|
},
|
||||||
|
'gmmk/pro/ansi': {
|
||||||
|
target: 'gmmk/pro/rev1/ansi'
|
||||||
|
},
|
||||||
|
'gmmk/pro/iso': {
|
||||||
|
target: 'gmmk/pro/rev1/iso'
|
||||||
},
|
},
|
||||||
'handwired/ferris': {
|
'handwired/ferris': {
|
||||||
target: 'ferris/0_1'
|
target: 'ferris/0_1'
|
||||||
@@ -206,6 +239,9 @@
|
|||||||
'helix/rev2/under/oled': {
|
'helix/rev2/under/oled': {
|
||||||
target: 'helix/rev2/under'
|
target: 'helix/rev2/under'
|
||||||
},
|
},
|
||||||
|
honeycomb: {
|
||||||
|
target: 'keyhive/honeycomb'
|
||||||
|
},
|
||||||
id80: {
|
id80: {
|
||||||
target: 'id80/ansi'
|
target: 'id80/ansi'
|
||||||
},
|
},
|
||||||
@@ -215,6 +251,9 @@
|
|||||||
LAYOUT: 'LAYOUT_all'
|
LAYOUT: 'LAYOUT_all'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
idobo: {
|
||||||
|
target: 'idobao/id75'
|
||||||
|
},
|
||||||
'jj40': {
|
'jj40': {
|
||||||
target: 'kprepublic/jj40'
|
target: 'kprepublic/jj40'
|
||||||
},
|
},
|
||||||
@@ -251,6 +290,9 @@
|
|||||||
'kyria': {
|
'kyria': {
|
||||||
target: 'splitkb/kyria'
|
target: 'splitkb/kyria'
|
||||||
},
|
},
|
||||||
|
lattice60: {
|
||||||
|
target: 'keyhive/lattice60'
|
||||||
|
},
|
||||||
'lazydesigners/the60': {
|
'lazydesigners/the60': {
|
||||||
target: 'lazydesigners/the60/rev1'
|
target: 'lazydesigners/the60/rev1'
|
||||||
},
|
},
|
||||||
@@ -260,6 +302,9 @@
|
|||||||
'lfkeyboards/smk65': {
|
'lfkeyboards/smk65': {
|
||||||
target: 'lfkeyboards/smk65/revb'
|
target: 'lfkeyboards/smk65/revb'
|
||||||
},
|
},
|
||||||
|
m3v3van: {
|
||||||
|
target: 'matthewdias/m3n3van'
|
||||||
|
},
|
||||||
'maartenwut/atom47/rev2': {
|
'maartenwut/atom47/rev2': {
|
||||||
target: 'evyd13/atom47/rev2'
|
target: 'evyd13/atom47/rev2'
|
||||||
},
|
},
|
||||||
@@ -353,9 +398,15 @@
|
|||||||
'mechlovin/hannah65': {
|
'mechlovin/hannah65': {
|
||||||
target: 'mechlovin/hannah65/rev1'
|
target: 'mechlovin/hannah65/rev1'
|
||||||
},
|
},
|
||||||
|
minim: {
|
||||||
|
target: 'matthewdias/minim'
|
||||||
|
},
|
||||||
model01: {
|
model01: {
|
||||||
target: 'keyboardio/model01'
|
target: 'keyboardio/model01'
|
||||||
},
|
},
|
||||||
|
model_v: {
|
||||||
|
target: 'matthewdias/model_v'
|
||||||
|
},
|
||||||
m0lly: {
|
m0lly: {
|
||||||
target: 'tkc/m0lly'
|
target: 'tkc/m0lly'
|
||||||
},
|
},
|
||||||
@@ -374,7 +425,13 @@
|
|||||||
target: 'oddball/v1'
|
target: 'oddball/v1'
|
||||||
},
|
},
|
||||||
omnikey_blackheart: {
|
omnikey_blackheart: {
|
||||||
target: 'omnikey_bh'
|
target: 'viktus/omnikey_bh'
|
||||||
|
},
|
||||||
|
omnikey_bh: {
|
||||||
|
target: 'viktus/omnikey_bh'
|
||||||
|
},
|
||||||
|
opus: {
|
||||||
|
target: 'keyhive/opus'
|
||||||
},
|
},
|
||||||
'pabile/p20': {
|
'pabile/p20': {
|
||||||
target: 'pabile/p20/ver1'
|
target: 'pabile/p20/ver1'
|
||||||
@@ -471,6 +528,12 @@
|
|||||||
skog: {
|
skog: {
|
||||||
target: 'percent/skog'
|
target: 'percent/skog'
|
||||||
},
|
},
|
||||||
|
smallice: {
|
||||||
|
target: 'keyhive/smallice'
|
||||||
|
},
|
||||||
|
southpole: {
|
||||||
|
target: 'keyhive/southpole'
|
||||||
|
},
|
||||||
speedo: {
|
speedo: {
|
||||||
target: 'cozykeys/speedo/v2'
|
target: 'cozykeys/speedo/v2'
|
||||||
},
|
},
|
||||||
@@ -498,6 +561,9 @@
|
|||||||
'tokyo60': {
|
'tokyo60': {
|
||||||
target: 'tokyokeyboard/tokyo60'
|
target: 'tokyokeyboard/tokyo60'
|
||||||
},
|
},
|
||||||
|
'txuu': {
|
||||||
|
target: 'matthewdias/txuu'
|
||||||
|
},
|
||||||
underscore33: {
|
underscore33: {
|
||||||
target: 'underscore33/rev1'
|
target: 'underscore33/rev1'
|
||||||
},
|
},
|
||||||
@@ -550,18 +616,661 @@
|
|||||||
target: 'xelus/valor/rev1'
|
target: 'xelus/valor/rev1'
|
||||||
},
|
},
|
||||||
yd60mq: {
|
yd60mq: {
|
||||||
target: 'yd60mq/12led'
|
target: 'ymdk/yd60mq/12led'
|
||||||
},
|
},
|
||||||
ymd75: {
|
ymd75: {
|
||||||
target: 'ymd75/rev1'
|
target: 'ymd75/rev1'
|
||||||
},
|
},
|
||||||
z150_blackheart: {
|
z150_blackheart: {
|
||||||
target: 'z150_bh'
|
target: 'viktus/z150_bh'
|
||||||
|
},
|
||||||
|
z150_bh:{
|
||||||
|
target: 'viktus/z150_bh'
|
||||||
},
|
},
|
||||||
zeal60: {
|
zeal60: {
|
||||||
target: 'wilba_tech/zeal60'
|
target: 'wilba_tech/zeal60'
|
||||||
},
|
},
|
||||||
zeal65: {
|
zeal65: {
|
||||||
target: 'wilba_tech/zeal65'
|
target: 'wilba_tech/zeal65'
|
||||||
|
},
|
||||||
|
# Moved during 2022 Q1 cycle
|
||||||
|
6ball: {
|
||||||
|
target: 'maple_computing/6ball'
|
||||||
|
},
|
||||||
|
7skb: {
|
||||||
|
target: 'salicylic_acid3/7skb'
|
||||||
|
},
|
||||||
|
7splus: {
|
||||||
|
target: 'salicylic_acid3/7splus'
|
||||||
|
},
|
||||||
|
acr60: {
|
||||||
|
target: 'mechkeys/acr60'
|
||||||
|
},
|
||||||
|
adalyn: {
|
||||||
|
target: 'tominabox1/adalyn'
|
||||||
|
},
|
||||||
|
ajisai74: {
|
||||||
|
target: 'salicylic_acid3/ajisai74'
|
||||||
|
},
|
||||||
|
aleth42: {
|
||||||
|
target: '25keys/aleth42'
|
||||||
|
},
|
||||||
|
alicia_cook: {
|
||||||
|
target: 'ibnuda/alicia_cook'
|
||||||
|
},
|
||||||
|
allison: {
|
||||||
|
target: 'prototypist/allison'
|
||||||
|
},
|
||||||
|
allison_numpad: {
|
||||||
|
target: 'prototypist/allison_numpad'
|
||||||
|
},
|
||||||
|
alu84: {
|
||||||
|
target: 'mechkeys/alu84'
|
||||||
|
},
|
||||||
|
angel17: {
|
||||||
|
target: 'kakunpc/angel17'
|
||||||
|
},
|
||||||
|
angel64/alpha: {
|
||||||
|
target: 'kakunpc/angel64/alpha'
|
||||||
|
},
|
||||||
|
angel64/rev1: {
|
||||||
|
target: 'kakunpc/angel64/rev1'
|
||||||
|
},
|
||||||
|
arch_36: {
|
||||||
|
target: 'obosob/arch_36'
|
||||||
|
},
|
||||||
|
bakeneko60: {
|
||||||
|
target: 'kkatano/bakeneko60'
|
||||||
|
},
|
||||||
|
bakeneko65/rev2: {
|
||||||
|
target: 'kkatano/bakeneko65/rev2'
|
||||||
|
},
|
||||||
|
bakeneko65/rev3: {
|
||||||
|
target: 'kkatano/bakeneko65/rev3'
|
||||||
|
},
|
||||||
|
bakeneko80: {
|
||||||
|
target: 'kkatano/bakeneko80'
|
||||||
|
},
|
||||||
|
barleycorn: {
|
||||||
|
target: 'yiancardesigns/barleycorn'
|
||||||
|
},
|
||||||
|
bat43/rev1: {
|
||||||
|
target: 'dailycraft/bat43/rev1'
|
||||||
|
},
|
||||||
|
bat43/rev2: {
|
||||||
|
target: 'dailycraft/bat43/rev2'
|
||||||
|
},
|
||||||
|
bigseries/1key: {
|
||||||
|
target: 'woodkeys/bigseries/1key'
|
||||||
|
},
|
||||||
|
bigseries/2key: {
|
||||||
|
target: 'woodkeys/bigseries/2key'
|
||||||
|
},
|
||||||
|
bigseries/3key: {
|
||||||
|
target: 'woodkeys/bigseries/3key'
|
||||||
|
},
|
||||||
|
bigseries/4key: {
|
||||||
|
target: 'woodkeys/bigseries/4key'
|
||||||
|
},
|
||||||
|
bkf: {
|
||||||
|
target: 'drhigsby/bkf'
|
||||||
|
},
|
||||||
|
business_card/alpha: {
|
||||||
|
target: 'kakunpc/business_card/alpha'
|
||||||
|
},
|
||||||
|
business_card/beta: {
|
||||||
|
target: 'kakunpc/business_card/beta'
|
||||||
|
},
|
||||||
|
butterstick: {
|
||||||
|
target: 'gboards/butterstick'
|
||||||
|
},
|
||||||
|
c39: {
|
||||||
|
target: 'maple_computing/c39'
|
||||||
|
},
|
||||||
|
cassette42: {
|
||||||
|
target: '25keys/cassette42'
|
||||||
|
},
|
||||||
|
chidori: {
|
||||||
|
target: 'kagizaraya/chidori'
|
||||||
|
},
|
||||||
|
chili: {
|
||||||
|
target: 'ydkb/chili'
|
||||||
|
},
|
||||||
|
chimera_ergo: {
|
||||||
|
target: 'glenpickle/chimera_ergo'
|
||||||
|
},
|
||||||
|
chimera_ls: {
|
||||||
|
target: 'glenpickle/chimera_ls'
|
||||||
|
},
|
||||||
|
chimera_ortho: {
|
||||||
|
target: 'glenpickle/chimera_ortho'
|
||||||
|
},
|
||||||
|
chimera_ortho_plus: {
|
||||||
|
target: 'glenpickle/chimera_ortho_plus'
|
||||||
|
},
|
||||||
|
choc_taro: {
|
||||||
|
target: 'kakunpc/choc_taro'
|
||||||
|
},
|
||||||
|
choco60: {
|
||||||
|
target: 'recompile_keys/choco60'
|
||||||
|
},
|
||||||
|
christmas_tree: {
|
||||||
|
target: 'maple_computing/christmas_tree'
|
||||||
|
},
|
||||||
|
claw44/rev1: {
|
||||||
|
target: 'dailycraft/claw44/rev1'
|
||||||
|
},
|
||||||
|
cocoa40: {
|
||||||
|
target: 'recompile_keys/cocoa40'
|
||||||
|
},
|
||||||
|
comet46: {
|
||||||
|
target: 'satt/comet46'
|
||||||
|
},
|
||||||
|
cu24: {
|
||||||
|
target: 'capsunlocked/cu24'
|
||||||
|
},
|
||||||
|
cu75: {
|
||||||
|
target: 'capsunlocked/cu75'
|
||||||
|
},
|
||||||
|
cu80: {
|
||||||
|
target: 'capsunlocked/cu80/v1'
|
||||||
|
},
|
||||||
|
delilah: {
|
||||||
|
target: 'rainkeebs/delilah'
|
||||||
|
},
|
||||||
|
diverge3: {
|
||||||
|
target: 'unikeyboard/diverge3'
|
||||||
|
},
|
||||||
|
divergetm2: {
|
||||||
|
target: 'unikeyboard/divergetm2'
|
||||||
|
},
|
||||||
|
dozen0: {
|
||||||
|
target: 'yynmt/dozen0'
|
||||||
|
},
|
||||||
|
dubba175: {
|
||||||
|
target: 'drhigsby/dubba175'
|
||||||
|
},
|
||||||
|
eggman: {
|
||||||
|
target: 'qpockets/eggman'
|
||||||
|
},
|
||||||
|
ergo42: {
|
||||||
|
target: 'biacco42/ergo42'
|
||||||
|
},
|
||||||
|
ergoarrows: {
|
||||||
|
target: 'salicylic_acid3/ergoarrows'
|
||||||
|
},
|
||||||
|
ergodash/mini: {
|
||||||
|
target: 'omkbd/ergodash/mini'
|
||||||
|
},
|
||||||
|
ergodash/rev1: {
|
||||||
|
target: 'omkbd/ergodash/rev1'
|
||||||
|
},
|
||||||
|
ergodox_infinity: {
|
||||||
|
target: 'input_club/ergodox_infinity'
|
||||||
|
},
|
||||||
|
ergotaco: {
|
||||||
|
target: 'gboards/ergotaco'
|
||||||
|
},
|
||||||
|
espectro: {
|
||||||
|
target: 'mechkeys/espectro'
|
||||||
|
},
|
||||||
|
felix: {
|
||||||
|
target: 'unikeyboard/felix'
|
||||||
|
},
|
||||||
|
four_banger: {
|
||||||
|
target: 'bpiphany/four_banger'
|
||||||
|
},
|
||||||
|
freyr: {
|
||||||
|
target: 'hnahkb/freyr'
|
||||||
|
},
|
||||||
|
geminate60: {
|
||||||
|
target: 'weirdo/geminate60'
|
||||||
|
},
|
||||||
|
georgi: {
|
||||||
|
target: 'gboards/georgi'
|
||||||
|
},
|
||||||
|
gergo: {
|
||||||
|
target: 'gboards/gergo'
|
||||||
|
},
|
||||||
|
getta25: {
|
||||||
|
target: 'salicylic_acid3/getta25'
|
||||||
|
},
|
||||||
|
gingham: {
|
||||||
|
target: 'yiancardesigns/gingham'
|
||||||
|
},
|
||||||
|
gurindam: {
|
||||||
|
target: 'ibnuda/gurindam'
|
||||||
|
},
|
||||||
|
halberd: {
|
||||||
|
target: 'kagizaraya/halberd'
|
||||||
|
},
|
||||||
|
hecomi/alpha: {
|
||||||
|
target: 'takashiski/hecomi/alpha'
|
||||||
|
},
|
||||||
|
hid_liber: {
|
||||||
|
target: 'bpiphany/hid_liber'
|
||||||
|
},
|
||||||
|
id67/default_rgb: {
|
||||||
|
target: 'idobao/id67/default_rgb'
|
||||||
|
},
|
||||||
|
id67/rgb: {
|
||||||
|
target: 'idobao/id67/rgb'
|
||||||
|
},
|
||||||
|
id80: {
|
||||||
|
target: 'idobao/id80/v1'
|
||||||
|
},
|
||||||
|
id87: {
|
||||||
|
target: 'idobao/id87/v1'
|
||||||
|
},
|
||||||
|
idobo: {
|
||||||
|
target: 'idobao/id75/v1'
|
||||||
|
},
|
||||||
|
infinity60: {
|
||||||
|
target: 'input_club/infinity60'
|
||||||
|
},
|
||||||
|
ivy/rev1: {
|
||||||
|
target: 'maple_computing/ivy/rev1'
|
||||||
|
},
|
||||||
|
jisplit89: {
|
||||||
|
target: 'salicylic_acid3/jisplit89'
|
||||||
|
},
|
||||||
|
jnao: {
|
||||||
|
target: 'maple_computing/jnao'
|
||||||
|
},
|
||||||
|
just60: {
|
||||||
|
target: 'ydkb/just60'
|
||||||
|
},
|
||||||
|
k_type: {
|
||||||
|
target: 'input_club/k_type'
|
||||||
|
},
|
||||||
|
kagamidget: {
|
||||||
|
target: 'yynmt/kagamidget'
|
||||||
|
},
|
||||||
|
kelowna/rgb64: {
|
||||||
|
target: 'weirdo/kelowna/rgb64'
|
||||||
|
},
|
||||||
|
kprepublic/bm65hsrgb_iso: {
|
||||||
|
target: 'kprepublic/bm65hsrgb_iso/rev1'
|
||||||
|
},
|
||||||
|
kprepublic/bm68hsrgb: {
|
||||||
|
target: 'kprepublic/bm68hsrgb/rev1'
|
||||||
|
},
|
||||||
|
latin17rgb: {
|
||||||
|
target: 'latincompass/latin17rgb'
|
||||||
|
},
|
||||||
|
latin47ble: {
|
||||||
|
target: 'latincompass/latin47ble'
|
||||||
|
},
|
||||||
|
latin60rgb: {
|
||||||
|
target: 'latincompass/latin60rgb'
|
||||||
|
},
|
||||||
|
latin64ble: {
|
||||||
|
target: 'latincompass/latin64ble'
|
||||||
|
},
|
||||||
|
latin6rgb: {
|
||||||
|
target: 'latincompass/latin6rgb'
|
||||||
|
},
|
||||||
|
latinpad: {
|
||||||
|
target: 'latincompass/latinpad'
|
||||||
|
},
|
||||||
|
latinpadble: {
|
||||||
|
target: 'latincompass/latinpadble'
|
||||||
|
},
|
||||||
|
launchpad/rev1: {
|
||||||
|
target: 'maple_computing/launchpad/rev1'
|
||||||
|
},
|
||||||
|
lck75: {
|
||||||
|
target: 'lyso1/lck75'
|
||||||
|
},
|
||||||
|
le_chiffre: {
|
||||||
|
target: 'tominabox1/le_chiffre'
|
||||||
|
},
|
||||||
|
lefishe: {
|
||||||
|
target: 'lyso1/lefishe'
|
||||||
|
},
|
||||||
|
lets_split_eh/eh: {
|
||||||
|
target: 'maple_computing/lets_split_eh/eh'
|
||||||
|
},
|
||||||
|
ls_60: {
|
||||||
|
target: 'weirdo/ls_60'
|
||||||
|
},
|
||||||
|
m3n3van: {
|
||||||
|
target: 'matthewdias/m3n3van'
|
||||||
|
},
|
||||||
|
mechmini/v1: {
|
||||||
|
target: 'mechkeys/mechmini/v1'
|
||||||
|
},
|
||||||
|
mechmini/v2: {
|
||||||
|
target: 'mechkeys/mechmini/v2'
|
||||||
|
},
|
||||||
|
meira: {
|
||||||
|
target: 'woodkeys/meira'
|
||||||
|
},
|
||||||
|
meishi: {
|
||||||
|
target: 'biacco42/meishi'
|
||||||
|
},
|
||||||
|
meishi2: {
|
||||||
|
target: 'biacco42/meishi2'
|
||||||
|
},
|
||||||
|
melody96: {
|
||||||
|
target: 'ymdk/melody96'
|
||||||
|
},
|
||||||
|
minidox/rev1: {
|
||||||
|
target: 'maple_computing/minidox/rev1'
|
||||||
|
},
|
||||||
|
minim: {
|
||||||
|
target: 'matthewdias/minim'
|
||||||
|
},
|
||||||
|
mio: {
|
||||||
|
target: 'recompile_keys/mio'
|
||||||
|
},
|
||||||
|
model_v: {
|
||||||
|
target: 'matthewdias/model_v'
|
||||||
|
},
|
||||||
|
montex: {
|
||||||
|
target: 'idobao/montex/v1'
|
||||||
|
},
|
||||||
|
mt40: {
|
||||||
|
target: 'mt/mt40'
|
||||||
|
},
|
||||||
|
mt64rgb: {
|
||||||
|
target: 'mt/mt64rgb'
|
||||||
|
},
|
||||||
|
mt84: {
|
||||||
|
target: 'mt/mt84'
|
||||||
|
},
|
||||||
|
mt980: {
|
||||||
|
target: 'mt/mt980'
|
||||||
|
},
|
||||||
|
nafuda: {
|
||||||
|
target: 'salicylic_acid3/nafuda'
|
||||||
|
},
|
||||||
|
naiping/np64: {
|
||||||
|
target: 'weirdo/naiping/np64'
|
||||||
|
},
|
||||||
|
naiping/nphhkb: {
|
||||||
|
target: 'weirdo/naiping/nphhkb'
|
||||||
|
},
|
||||||
|
naiping/npminila: {
|
||||||
|
target: 'weirdo/naiping/npminila'
|
||||||
|
},
|
||||||
|
naked48: {
|
||||||
|
target: 'salicylic_acid3/naked48'
|
||||||
|
},
|
||||||
|
naked60: {
|
||||||
|
target: 'salicylic_acid3/naked60'
|
||||||
|
},
|
||||||
|
naked64: {
|
||||||
|
target: 'salicylic_acid3/naked64'
|
||||||
|
},
|
||||||
|
namecard2x4: {
|
||||||
|
target: 'takashiski/namecard2x4'
|
||||||
|
},
|
||||||
|
navi10: {
|
||||||
|
target: 'keyhive/navi10'
|
||||||
|
},
|
||||||
|
nebula12: {
|
||||||
|
target: 'spaceholdings/nebula12'
|
||||||
|
},
|
||||||
|
nebula68: {
|
||||||
|
target: 'spaceholdings/nebula68'
|
||||||
|
},
|
||||||
|
nebula68b: {
|
||||||
|
target: 'spaceholdings/nebula68b'
|
||||||
|
},
|
||||||
|
niu_mini: {
|
||||||
|
target: 'kbdfans/niu_mini'
|
||||||
|
},
|
||||||
|
nk1: {
|
||||||
|
target: 'novelkeys/nk1'
|
||||||
|
},
|
||||||
|
nk65: {
|
||||||
|
target: 'novelkeys/nk65'
|
||||||
|
},
|
||||||
|
nk87: {
|
||||||
|
target: 'novelkeys/nk87'
|
||||||
|
},
|
||||||
|
nknl7en: {
|
||||||
|
target: 'salicylic_acid3/nknl7en'
|
||||||
|
},
|
||||||
|
nknl7jp: {
|
||||||
|
target: 'salicylic_acid3/nknl7jp'
|
||||||
|
},
|
||||||
|
nomu30: {
|
||||||
|
target: 'recompile_keys/nomu30'
|
||||||
|
},
|
||||||
|
novelpad: {
|
||||||
|
target: 'novelkeys/novelpad'
|
||||||
|
},
|
||||||
|
ogurec: {
|
||||||
|
target: 'drhigsby/ogurec'
|
||||||
|
},
|
||||||
|
otaku_split/rev0: {
|
||||||
|
target: 'takashiski/otaku_split/rev0'
|
||||||
|
},
|
||||||
|
otaku_split/rev1: {
|
||||||
|
target: 'takashiski/otaku_split/rev1'
|
||||||
|
},
|
||||||
|
owl8: {
|
||||||
|
target: 'dailycraft/owl8'
|
||||||
|
},
|
||||||
|
packrat: {
|
||||||
|
target: 'drhigsby/packrat'
|
||||||
|
},
|
||||||
|
pistachio: {
|
||||||
|
target: 'rate/pistachio'
|
||||||
|
},
|
||||||
|
pistachio_mp: {
|
||||||
|
target: 'rate/pistachio_mp'
|
||||||
|
},
|
||||||
|
pistachio_pro: {
|
||||||
|
target: 'rate/pistachio_pro'
|
||||||
|
},
|
||||||
|
plexus75: {
|
||||||
|
target: 'checkerboards/plexus75'
|
||||||
|
},
|
||||||
|
pursuit40: {
|
||||||
|
target: 'checkerboards/pursuit40'
|
||||||
|
},
|
||||||
|
qaz: {
|
||||||
|
target: 'tominabox1/qaz'
|
||||||
|
},
|
||||||
|
quark: {
|
||||||
|
target: 'checkerboards/quark'
|
||||||
|
},
|
||||||
|
rabbit_capture_plan: {
|
||||||
|
target: 'kakunpc/rabbit_capture_plan'
|
||||||
|
},
|
||||||
|
rainkeeb: {
|
||||||
|
target: 'rainkeebs/rainkeeb'
|
||||||
|
},
|
||||||
|
reviung33: {
|
||||||
|
target: 'reviung/reviung33'
|
||||||
|
},
|
||||||
|
reviung34: {
|
||||||
|
target: 'reviung/reviung34'
|
||||||
|
},
|
||||||
|
reviung39: {
|
||||||
|
target: 'reviung/reviung39'
|
||||||
|
},
|
||||||
|
reviung41: {
|
||||||
|
target: 'reviung/reviung41'
|
||||||
|
},
|
||||||
|
reviung5: {
|
||||||
|
target: 'reviung/reviung5'
|
||||||
|
},
|
||||||
|
reviung53: {
|
||||||
|
target: 'reviung/reviung53'
|
||||||
|
},
|
||||||
|
reviung61: {
|
||||||
|
target: 'reviung/reviung61'
|
||||||
|
},
|
||||||
|
runner3680/3x6: {
|
||||||
|
target: 'omkbd/runner3680/3x6'
|
||||||
|
},
|
||||||
|
runner3680/3x7: {
|
||||||
|
target: 'omkbd/runner3680/3x7'
|
||||||
|
},
|
||||||
|
runner3680/3x8: {
|
||||||
|
target: 'omkbd/runner3680/3x8'
|
||||||
|
},
|
||||||
|
runner3680/4x6: {
|
||||||
|
target: 'omkbd/runner3680/4x6'
|
||||||
|
},
|
||||||
|
runner3680/4x7: {
|
||||||
|
target: 'omkbd/runner3680/4x7'
|
||||||
|
},
|
||||||
|
runner3680/4x8: {
|
||||||
|
target: 'omkbd/runner3680/4x8'
|
||||||
|
},
|
||||||
|
runner3680/5x6: {
|
||||||
|
target: 'omkbd/runner3680/5x6'
|
||||||
|
},
|
||||||
|
runner3680/5x6_5x8: {
|
||||||
|
target: 'omkbd/runner3680/5x6_5x8'
|
||||||
|
},
|
||||||
|
runner3680/5x7: {
|
||||||
|
target: 'omkbd/runner3680/5x7'
|
||||||
|
},
|
||||||
|
runner3680/5x8: {
|
||||||
|
target: 'omkbd/runner3680/5x8'
|
||||||
|
},
|
||||||
|
scarletbandana: {
|
||||||
|
target: 'woodkeys/scarletbandana'
|
||||||
|
},
|
||||||
|
scythe: {
|
||||||
|
target: 'kagizaraya/scythe'
|
||||||
|
},
|
||||||
|
seigaiha: {
|
||||||
|
target: 'yiancardesigns/seigaiha'
|
||||||
|
},
|
||||||
|
setta21: {
|
||||||
|
target: 'salicylic_acid3/setta21'
|
||||||
|
},
|
||||||
|
space_space/rev1: {
|
||||||
|
target: 'qpockets/space_space/rev1'
|
||||||
|
},
|
||||||
|
space_space/rev2: {
|
||||||
|
target: 'qpockets/space_space/rev2'
|
||||||
|
},
|
||||||
|
spiderisland/winry25tc: {
|
||||||
|
target: 'winry/winry25tc'
|
||||||
|
},
|
||||||
|
splitreus62: {
|
||||||
|
target: 'nacly/splitreus62'
|
||||||
|
},
|
||||||
|
squiggle/rev1: {
|
||||||
|
target: 'ibnuda/squiggle/rev1'
|
||||||
|
},
|
||||||
|
standaside: {
|
||||||
|
target: 'edi/standaside'
|
||||||
|
},
|
||||||
|
steal_this_keyboard: {
|
||||||
|
target: 'obosob/steal_this_keyboard'
|
||||||
|
},
|
||||||
|
stella: {
|
||||||
|
target: 'hnahkb/stella'
|
||||||
|
},
|
||||||
|
suihankey/alpha: {
|
||||||
|
target: 'kakunpc/suihankey/alpha'
|
||||||
|
},
|
||||||
|
suihankey/rev1: {
|
||||||
|
target: 'kakunpc/suihankey/rev1'
|
||||||
|
},
|
||||||
|
suihankey/split: {
|
||||||
|
target: 'kakunpc/suihankey/split'
|
||||||
|
},
|
||||||
|
the_ruler: {
|
||||||
|
target: 'maple_computing/the_ruler'
|
||||||
|
},
|
||||||
|
thedogkeyboard: {
|
||||||
|
target: 'kakunpc/thedogkeyboard'
|
||||||
|
},
|
||||||
|
tiger910: {
|
||||||
|
target: 'weirdo/tiger910'
|
||||||
|
},
|
||||||
|
treadstone32: {
|
||||||
|
target: 'marksard/treadstone32'
|
||||||
|
},
|
||||||
|
treadstone48/rev1: {
|
||||||
|
target: 'marksard/treadstone48/rev1'
|
||||||
|
},
|
||||||
|
treadstone48/rev2: {
|
||||||
|
target: 'marksard/treadstone48/rev2'
|
||||||
|
},
|
||||||
|
txuu: {
|
||||||
|
target: 'matthewdias/txuu'
|
||||||
|
},
|
||||||
|
ua62: {
|
||||||
|
target: 'nacly/ua62'
|
||||||
|
},
|
||||||
|
underscore33/rev1: {
|
||||||
|
target: 'tominabox1/underscore33/rev1'
|
||||||
|
},
|
||||||
|
underscore33/rev2: {
|
||||||
|
target: 'tominabox1/underscore33/rev2'
|
||||||
|
},
|
||||||
|
uno: {
|
||||||
|
target: 'keyhive/uno'
|
||||||
|
},
|
||||||
|
ut472: {
|
||||||
|
target: 'keyhive/ut472'
|
||||||
|
},
|
||||||
|
vn66: {
|
||||||
|
target: 'hnahkb/vn66'
|
||||||
|
},
|
||||||
|
wallaby: {
|
||||||
|
target: 'kkatano/wallaby'
|
||||||
|
},
|
||||||
|
wanten: {
|
||||||
|
target: 'qpockets/wanten'
|
||||||
|
},
|
||||||
|
'wheatfield/blocked65': {
|
||||||
|
target: 'mt/blocked65'
|
||||||
|
},
|
||||||
|
'wheatfield/split75': {
|
||||||
|
target: 'mt/split75'
|
||||||
|
},
|
||||||
|
whitefox: {
|
||||||
|
target: 'input_club/whitefox'
|
||||||
|
},
|
||||||
|
wings42/rev1: {
|
||||||
|
target: 'dailycraft/wings42/rev1'
|
||||||
|
},
|
||||||
|
wings42/rev1_extkeys: {
|
||||||
|
target: 'dailycraft/wings42/rev1_extkeys'
|
||||||
|
},
|
||||||
|
wings42/rev2: {
|
||||||
|
target: 'dailycraft/wings42/rev2'
|
||||||
|
},
|
||||||
|
yasui: {
|
||||||
|
target: 'rainkeebs/yasui'
|
||||||
|
},
|
||||||
|
yd60mq: {
|
||||||
|
target: 'ymdk/yd60mq'
|
||||||
|
},
|
||||||
|
yd68: {
|
||||||
|
target: 'ydkb/yd68'
|
||||||
|
},
|
||||||
|
ymd75: {
|
||||||
|
target: 'ymdk/ymd75'
|
||||||
|
},
|
||||||
|
ymd96: {
|
||||||
|
target: 'ymdk/ymd96'
|
||||||
|
},
|
||||||
|
ymdk_np21: {
|
||||||
|
target: 'ymdk/np21'
|
||||||
|
},
|
||||||
|
yurei: {
|
||||||
|
target: 'kkatano/yurei'
|
||||||
|
},
|
||||||
|
zinc: {
|
||||||
|
target: '25keys/zinc'
|
||||||
|
},
|
||||||
|
zinc/rev1: {
|
||||||
|
target: '25keys/zinc/rev1'
|
||||||
|
},
|
||||||
|
zinc/reva: {
|
||||||
|
target: '25keys/zinc/reva'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||||
"$id": "qmk.definitions.v1",
|
"$id": "qmk.definitions.v1",
|
||||||
"title": "Common definitions used across QMK's jsonschemas.",
|
"title": "Common definitions used across QMK's jsonschemas.",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -20,6 +20,10 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^0x[0-9A-F]{4}$"
|
"pattern": "^0x[0-9A-F]{4}$"
|
||||||
},
|
},
|
||||||
|
"bcd_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$"
|
||||||
|
},
|
||||||
"text_identifier": {
|
"text_identifier": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"minLength": 1,
|
"minLength": 1,
|
||||||
@@ -29,7 +33,30 @@
|
|||||||
"oneOf": [
|
"oneOf": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["LAYOUT", "LAYOUT_planck_1x2uC"]
|
"enum": [
|
||||||
|
"LAYOUT",
|
||||||
|
"LAYOUT_1x2uC",
|
||||||
|
"LAYOUT_1x2uL",
|
||||||
|
"LAYOUT_1x2uR",
|
||||||
|
"LAYOUT_2x2uC",
|
||||||
|
"LAYOUT_2x3uC",
|
||||||
|
"LAYOUT_625uC",
|
||||||
|
"LAYOUT_ortho_3x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uL",
|
||||||
|
"LAYOUT_ortho_4x12_1x2uR",
|
||||||
|
"LAYOUT_ortho_5x12_1x2uC",
|
||||||
|
"LAYOUT_ortho_5x12_2x2uC",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uC",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uL",
|
||||||
|
"LAYOUT_ortho_5x14_1x2uR",
|
||||||
|
"LAYOUT_planck_1x2uC",
|
||||||
|
"LAYOUT_planck_1x2uL",
|
||||||
|
"LAYOUT_planck_1x2uR",
|
||||||
|
"LAYOUT_preonic_1x2uC",
|
||||||
|
"LAYOUT_preonic_1x2uL",
|
||||||
|
"LAYOUT_preonic_1x2uR"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -38,8 +65,23 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"key_unit": {
|
"key_unit": {
|
||||||
"type": "number",
|
"type": "number"
|
||||||
"min": 0.25
|
},
|
||||||
|
"keyboard": {
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"converter/numeric_keypad_IIe",
|
||||||
|
"emptystring/NQG",
|
||||||
|
"maple_computing/christmas_tree/V2017"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[0-9a-z][0-9a-z_/]*$"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"mcu_pin_array": {
|
"mcu_pin_array": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
@@ -47,6 +89,10 @@
|
|||||||
},
|
},
|
||||||
"mcu_pin": {
|
"mcu_pin": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["NO_PIN"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"pattern": "^[A-K]\\d{1,2}$"
|
"pattern": "^[A-K]\\d{1,2}$"
|
||||||
@@ -56,8 +102,11 @@
|
|||||||
"pattern": "^LINE_PIN\\d{1,2}$"
|
"pattern": "^LINE_PIN\\d{1,2}$"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "number",
|
"type": "string",
|
||||||
"multipleOf": 1
|
"pattern": "^GP\\d{1,2}$"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "null"
|
"type": "null"
|
||||||
@@ -68,15 +117,13 @@
|
|||||||
"type": "number"
|
"type": "number"
|
||||||
},
|
},
|
||||||
"signed_int": {
|
"signed_int": {
|
||||||
"type": "number",
|
"type": "integer"
|
||||||
"multipleOf": 1
|
},
|
||||||
}
|
|
||||||
"signed_int_8": {
|
"signed_int_8": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": -127,
|
"minimum": -127,
|
||||||
"max": 127,
|
"maximum": 127
|
||||||
"multipleOf": 1
|
},
|
||||||
}
|
|
||||||
"string_array": {
|
"string_array": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@@ -91,17 +138,20 @@
|
|||||||
},
|
},
|
||||||
"unsigned_decimal": {
|
"unsigned_decimal": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"min": 0
|
"minimum": 0
|
||||||
},
|
},
|
||||||
"unsigned_int": {
|
"unsigned_int": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 0,
|
"minimum": 0
|
||||||
"multipleOf": 1
|
},
|
||||||
}
|
|
||||||
"unsigned_int_8": {
|
"unsigned_int_8": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 0,
|
"minimum": 0,
|
||||||
"max": 255,
|
"maximum": 255
|
||||||
"multipleOf": 1
|
},
|
||||||
|
"bit": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,48 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||||
"$id": "qmk.keyboard.v1",
|
"$id": "qmk.keyboard.v1",
|
||||||
"title": "Keyboard Information",
|
"title": "Keyboard Information",
|
||||||
|
"definitions": {
|
||||||
|
"encoder_config": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"rotary": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"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"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
|
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
||||||
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||||
"url": {
|
"url": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "uri"
|
"format": "uri"
|
||||||
},
|
},
|
||||||
|
"development_board": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["promicro", "elite_c", "proton_c", "kb2040", "promicro_rp2040", "blok", "bluepill", "blackpill_f401", "blackpill_f411"]
|
||||||
|
},
|
||||||
|
"pin_compatible": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["promicro"]
|
||||||
|
},
|
||||||
"processor": {
|
"processor": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L433", "STM32L443", "GD32VF103", "WB32F3G71", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK64FX512", "MK66FX1M0", "RP2040", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "WB32FQ95", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
|
||||||
},
|
},
|
||||||
"audio": {
|
"audio": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -31,12 +60,12 @@
|
|||||||
"breathing": {"type": "boolean"},
|
"breathing": {"type": "boolean"},
|
||||||
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||||
"levels": {
|
"levels": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 1,
|
"minimum": 1,
|
||||||
"max": 31,
|
"maximum": 31
|
||||||
"multipleOf": 1
|
|
||||||
},
|
},
|
||||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||||
|
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bluetooth": {
|
"bluetooth": {
|
||||||
@@ -45,7 +74,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"driver": {
|
"driver": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["AdafruitBLE", "RN42"]
|
"enum": ["BluefruitLE", "RN42"]
|
||||||
},
|
},
|
||||||
"lto": {"type": "boolean"},
|
"lto": {"type": "boolean"},
|
||||||
}
|
}
|
||||||
@@ -57,7 +86,7 @@
|
|||||||
},
|
},
|
||||||
"bootloader": {
|
"bootloader": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],
|
"enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "custom", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2", "rp2040"],
|
||||||
},
|
},
|
||||||
"bootloader_instructions": {
|
"bootloader_instructions": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -69,7 +98,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"debounce_type": {
|
"debounce_type": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_eager_pk"]
|
"enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk"]
|
||||||
},
|
},
|
||||||
"firmware_format": {
|
"firmware_format": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
@@ -83,6 +112,16 @@
|
|||||||
"enum": ["COL2ROW", "ROW2COL"]
|
"enum": ["COL2ROW", "ROW2COL"]
|
||||||
},
|
},
|
||||||
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
|
"caps_word": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {"type": "boolean"},
|
||||||
|
"both_shifts_turns_on": {"type": "boolean"},
|
||||||
|
"double_tap_shift_turns_on": {"type": "boolean"},
|
||||||
|
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
|
},
|
||||||
|
},
|
||||||
"combo": {
|
"combo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
@@ -94,13 +133,22 @@
|
|||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
||||||
},
|
},
|
||||||
|
"encoder": {
|
||||||
|
"$ref": "#/definitions/encoder_config",
|
||||||
|
"properties": {
|
||||||
|
"enabled": {"type": "boolean"}
|
||||||
|
}
|
||||||
|
},
|
||||||
"features": {"$ref": "qmk.definitions.v1#/boolean_array"},
|
"features": {"$ref": "qmk.definitions.v1#/boolean_array"},
|
||||||
"indicators": {
|
"indicators": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||||
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||||
"scroll_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"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"layout_aliases": {
|
"layout_aliases": {
|
||||||
@@ -109,6 +157,7 @@
|
|||||||
},
|
},
|
||||||
"layouts": {
|
"layouts": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -125,18 +174,20 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"label": {"type": "string"},
|
"label": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[^\\n]*$"
|
||||||
|
},
|
||||||
"matrix": {
|
"matrix": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minItems": 2,
|
"minItems": 2,
|
||||||
"maxItems": 2,
|
"maxItems": 2,
|
||||||
"items": {
|
"items": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 0,
|
"minimum": 0
|
||||||
"multipleOf": 1
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"r": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
|
||||||
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
||||||
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
|
||||||
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
"h": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||||
@@ -192,6 +243,60 @@
|
|||||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"led_matrix": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"driver": {"type": "string"},
|
||||||
|
"layout": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"matrix": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 2,
|
||||||
|
"maxItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||||
|
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||||
|
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rgb_matrix": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"driver": {"type": "string"},
|
||||||
|
"layout": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"matrix": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 2,
|
||||||
|
"maxItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||||
|
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||||
|
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"rgblight": {
|
"rgblight": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -211,10 +316,9 @@
|
|||||||
"blink": {"type": "boolean"},
|
"blink": {"type": "boolean"},
|
||||||
"enabled": {"type": "boolean"},
|
"enabled": {"type": "boolean"},
|
||||||
"max": {
|
"max": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 1,
|
"minimum": 1,
|
||||||
"max": 32,
|
"maximum": 32
|
||||||
"multipleOf": 1
|
|
||||||
},
|
},
|
||||||
"override_rgb": {"type": "boolean"}
|
"override_rgb": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
@@ -228,12 +332,46 @@
|
|||||||
"split": {"type": "boolean"},
|
"split": {"type": "boolean"},
|
||||||
"split_count": {
|
"split_count": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"minLength": 2,
|
"minItems": 2,
|
||||||
"maxLength": 2,
|
"maxItems": 2,
|
||||||
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"secure": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {"type": "boolean"},
|
||||||
|
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
|
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
|
"unlock_sequence": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 1,
|
||||||
|
"maxItems": 5,
|
||||||
|
"items": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 2,
|
||||||
|
"maxItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stenography": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"enabled": {"type": "boolean"},
|
||||||
|
"protocol": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["all", "geminipr", "txbolt"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"split": {
|
"split": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
@@ -262,16 +400,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"encoder": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"right": {
|
||||||
|
"$ref": "#/definitions/encoder_config"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"main": {
|
"main": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
|
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
|
||||||
},
|
},
|
||||||
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||||
"soft_serial_speed": {
|
"soft_serial_speed": {
|
||||||
"type": "number",
|
"type": "integer",
|
||||||
"min": 0,
|
"minimum": 0,
|
||||||
"max": 5,
|
"maximum": 5
|
||||||
"multipleOf": 1
|
|
||||||
},
|
},
|
||||||
"transport": {
|
"transport": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -320,11 +466,12 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, # Deprecated
|
||||||
|
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
|
||||||
"force_nkro": {"type": "boolean"},
|
"force_nkro": {"type": "boolean"},
|
||||||
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||||
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
|
||||||
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
"no_startup_check": {"type": "boolean"},
|
"no_startup_check": {"type": "boolean"},
|
||||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||||
"shared_endpoint": {
|
"shared_endpoint": {
|
||||||
@@ -335,7 +482,7 @@
|
|||||||
"mouse": {"type": "boolean"}
|
"mouse": {"type": "boolean"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
"wait_for": {"type": "boolean"},
|
"wait_for": {"type": "boolean"},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -344,8 +491,8 @@
|
|||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"properties": {
|
"properties": {
|
||||||
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||||
"tap_keycode_delay": {"$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_8"},
|
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"qmk_lufa_bootloader": {
|
"qmk_lufa_bootloader": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||||
"$id": "qmk.keymap.v1",
|
"$id": "qmk.keymap.v1",
|
||||||
"title": "Keymap Information",
|
"title": "Keymap Information",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -50,8 +50,12 @@
|
|||||||
},
|
},
|
||||||
"config": {"$ref": "qmk.keyboard.v1"},
|
"config": {"$ref": "qmk.keyboard.v1"},
|
||||||
"notes": {
|
"notes": {
|
||||||
"type": "string",
|
"type": "string"
|
||||||
"description": "asdf"
|
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"required": [
|
||||||
|
"keyboard",
|
||||||
|
"layout",
|
||||||
|
"layers"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,138 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config_common.h"
|
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
|
||||||
#define VENDOR_ID 0xFEED
|
|
||||||
#define PRODUCT_ID 0x0000
|
|
||||||
#define DEVICE_VER 0x0001
|
|
||||||
#define MANUFACTURER %(USER_NAME)s
|
|
||||||
#define PRODUCT %(KEYBOARD)s
|
|
||||||
|
|
||||||
/* key matrix size */
|
|
||||||
#define MATRIX_ROWS 2
|
|
||||||
#define MATRIX_COLS 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keyboard Matrix Assignments
|
|
||||||
*
|
|
||||||
* Change this to how you wired your keyboard
|
|
||||||
* COLS: AVR pins used for columns, left to right
|
|
||||||
* ROWS: AVR pins used for rows, top to bottom
|
|
||||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
|
||||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define MATRIX_ROW_PINS { D0, D5 }
|
|
||||||
#define MATRIX_COL_PINS { F1, F0, B0 }
|
|
||||||
#define UNUSED_PINS
|
|
||||||
|
|
||||||
/* COL2ROW, ROW2COL */
|
|
||||||
#define DIODE_DIRECTION COL2ROW
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
|
|
||||||
*/
|
|
||||||
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
|
|
||||||
|
|
||||||
//#define LED_NUM_LOCK_PIN B0
|
|
||||||
//#define LED_CAPS_LOCK_PIN B1
|
|
||||||
//#define LED_SCROLL_LOCK_PIN B2
|
|
||||||
//#define LED_COMPOSE_PIN B3
|
|
||||||
//#define LED_KANA_PIN B4
|
|
||||||
|
|
||||||
//#define BACKLIGHT_PIN B7
|
|
||||||
//#define BACKLIGHT_LEVELS 3
|
|
||||||
//#define BACKLIGHT_BREATHING
|
|
||||||
|
|
||||||
//#define RGB_DI_PIN E2
|
|
||||||
//#ifdef RGB_DI_PIN
|
|
||||||
//# define RGBLED_NUM 16
|
|
||||||
//# define RGBLIGHT_HUE_STEP 8
|
|
||||||
//# define RGBLIGHT_SAT_STEP 8
|
|
||||||
//# define RGBLIGHT_VAL_STEP 8
|
|
||||||
//# define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
|
||||||
//# define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
|
||||||
/*== all animations enable ==*/
|
|
||||||
//# define RGBLIGHT_ANIMATIONS
|
|
||||||
/*== or choose animations ==*/
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHING
|
|
||||||
//# define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
|
||||||
//# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
|
||||||
//# define RGBLIGHT_EFFECT_SNAKE
|
|
||||||
//# define RGBLIGHT_EFFECT_KNIGHT
|
|
||||||
//# define RGBLIGHT_EFFECT_CHRISTMAS
|
|
||||||
//# define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
|
||||||
//# define RGBLIGHT_EFFECT_RGB_TEST
|
|
||||||
//# define RGBLIGHT_EFFECT_ALTERNATING
|
|
||||||
/*== customize breathing effect ==*/
|
|
||||||
/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
|
|
||||||
//# define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
|
|
||||||
/*==== use exp() and sin() ====*/
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
|
||||||
//# define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
|
||||||
#define DEBOUNCE 5
|
|
||||||
|
|
||||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
|
||||||
//#define MATRIX_HAS_GHOST
|
|
||||||
|
|
||||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
|
||||||
/* Locking resynchronize hack */
|
|
||||||
#define LOCKING_RESYNC_ENABLE
|
|
||||||
|
|
||||||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
|
||||||
* This is useful for the Windows task manager shortcut (ctrl+shift+esc).
|
|
||||||
*/
|
|
||||||
//#define GRAVE_ESC_CTRL_OVERRIDE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force NKRO
|
|
||||||
*
|
|
||||||
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
|
||||||
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
|
||||||
* makefile for this to work.)
|
|
||||||
*
|
|
||||||
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
|
||||||
* until the next keyboard reset.
|
|
||||||
*
|
|
||||||
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
|
||||||
* fully operational during normal computer usage.
|
|
||||||
*
|
|
||||||
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
|
||||||
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
|
||||||
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
|
||||||
* power-up.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
//#define FORCE_NKRO
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature disable options
|
|
||||||
* These options are also useful to firmware size reduction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* disable debug print */
|
|
||||||
//#define NO_DEBUG
|
|
||||||
|
|
||||||
/* disable print */
|
|
||||||
//#define NO_PRINT
|
|
||||||
|
|
||||||
/* disable action features */
|
|
||||||
//#define NO_ACTION_LAYER
|
|
||||||
//#define NO_ACTION_TAPPING
|
|
||||||
//#define NO_ACTION_ONESHOT
|
|
||||||
|
|
||||||
/* disable these deprecated features by default */
|
|
||||||
#define NO_ACTION_MACRO
|
|
||||||
#define NO_ACTION_FUNCTION
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
|
||||||
//#define BOOTMAGIC_LITE_ROW 0
|
|
||||||
//#define BOOTMAGIC_LITE_COLUMN 0
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# %(KEYBOARD)s
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
*A short description of the keyboard/project*
|
|
||||||
|
|
||||||
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/%(USER_NAME)s)
|
|
||||||
* Hardware Supported: *The PCBs, controllers supported*
|
|
||||||
* Hardware Availability: *Links to where you can find this hardware*
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default
|
|
||||||
|
|
||||||
Flashing example for this keyboard:
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default:flash
|
|
||||||
|
|
||||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
||||||
|
|
||||||
## Bootloader
|
|
||||||
|
|
||||||
Enter the bootloader in 3 ways:
|
|
||||||
|
|
||||||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
|
||||||
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
|
||||||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include "%(KEYBOARD)s.h"
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "quantum.h"
|
|
||||||
|
|
||||||
/* This is a shortcut to help you visually see your layout.
|
|
||||||
*
|
|
||||||
* The first section contains all of the arguments representing the physical
|
|
||||||
* layout of the board and position of the keys.
|
|
||||||
*
|
|
||||||
* The second converts the arguments into a two-dimensional array which
|
|
||||||
* represents the switch matrix.
|
|
||||||
*/
|
|
||||||
#define LAYOUT( \
|
|
||||||
k00, k01, k02, \
|
|
||||||
k10, k12 \
|
|
||||||
) { \
|
|
||||||
{ k00, k01, k02 }, \
|
|
||||||
{ k10, KC_NO, k12 } \
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"keyboard_name": "%(KEYBOARD)s",
|
|
||||||
"url": "",
|
|
||||||
"maintainer": "%(USER_NAME)s",
|
|
||||||
"layouts": {
|
|
||||||
"LAYOUT": {
|
|
||||||
"layout": [
|
|
||||||
{"label": "k00", "x": 0, "y": 0},
|
|
||||||
{"label": "k01", "x": 1, "y": 0},
|
|
||||||
{"label": "k02", "x": 2, "y": 0},
|
|
||||||
|
|
||||||
{"label": "k10", "x": 0, "y": 1, "w": 1.5},
|
|
||||||
{"label": "k12", "x": 1.5, "y": 1, "w": 1.5}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
|
||||||
|
|
||||||
// Defines names for use in layer keycodes and the keymap
|
|
||||||
enum layer_names {
|
|
||||||
_BASE,
|
|
||||||
_FN
|
|
||||||
};
|
|
||||||
|
|
||||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
||||||
/* Base */
|
|
||||||
[_BASE] = LAYOUT(
|
|
||||||
KC_A, KC_1, MO(_FN),
|
|
||||||
KC_TAB, KC_SPC
|
|
||||||
),
|
|
||||||
[_FN] = LAYOUT(
|
|
||||||
_______, _______, _______,
|
|
||||||
RESET, XXXXXXX
|
|
||||||
)
|
|
||||||
};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
# The default keymap for %(KEYBOARD)s
|
|
||||||
20
data/templates/keyboard/config.h
Normal file
20
data/templates/keyboard/config.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright %YEAR% %REAL_NAME% (@%USER_NAME%)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Feature disable options
|
||||||
|
* These options are also useful to firmware size reduction.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* disable debug print */
|
||||||
|
//#define NO_DEBUG
|
||||||
|
|
||||||
|
/* disable print */
|
||||||
|
//#define NO_PRINT
|
||||||
|
|
||||||
|
/* disable action features */
|
||||||
|
//#define NO_ACTION_LAYER
|
||||||
|
//#define NO_ACTION_TAPPING
|
||||||
|
//#define NO_ACTION_ONESHOT
|
||||||
25
data/templates/keyboard/info.json
Normal file
25
data/templates/keyboard/info.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"keyboard_name": "%KEYBOARD%",
|
||||||
|
"maintainer": "%USER_NAME%",
|
||||||
|
"manufacturer": "%REAL_NAME%",
|
||||||
|
"processor": "%MCU%",
|
||||||
|
"bootloader": "%BOOTLOADER%",
|
||||||
|
"diode_direction": "COL2ROW",
|
||||||
|
"matrix_pins": {
|
||||||
|
"cols": ["C2"],
|
||||||
|
"rows": ["D1"]
|
||||||
|
},
|
||||||
|
"usb": {
|
||||||
|
"vid": "0xFEED",
|
||||||
|
"pid": "0x0000",
|
||||||
|
"device_version": "1.0.0"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"command": false,
|
||||||
|
"console": false,
|
||||||
|
"extrakey": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"nkro": true
|
||||||
|
}
|
||||||
|
}
|
||||||
27
data/templates/keyboard/readme.md
Normal file
27
data/templates/keyboard/readme.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# %KEYBOARD%
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*A short description of the keyboard/project*
|
||||||
|
|
||||||
|
* Keyboard Maintainer: [%REAL_NAME%](https://github.com/%USER_NAME%)
|
||||||
|
* Hardware Supported: *The PCBs, controllers supported*
|
||||||
|
* Hardware Availability: *Links to where you can find this hardware*
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make %KEYBOARD%:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make %KEYBOARD%:default:flash
|
||||||
|
|
||||||
|
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
||||||
|
|
||||||
|
## Bootloader
|
||||||
|
|
||||||
|
Enter the bootloader in 3 ways:
|
||||||
|
|
||||||
|
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
||||||
|
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
||||||
|
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
||||||
1
data/templates/keyboard/rules.mk
Normal file
1
data/templates/keyboard/rules.mk
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# This file intentionally left blank
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
// Copyright %(YEAR)s %(YOUR_NAME)s (@%(USER_NAME)s)
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "config_common.h"
|
|
||||||
|
|
||||||
/* USB Device descriptor parameter */
|
|
||||||
#define VENDOR_ID 0xFEED
|
|
||||||
#define PRODUCT_ID 0x0000
|
|
||||||
#define DEVICE_VER 0x0001
|
|
||||||
#define MANUFACTURER %(USER_NAME)s
|
|
||||||
#define PRODUCT %(KEYBOARD)s
|
|
||||||
|
|
||||||
/* key matrix size */
|
|
||||||
#define MATRIX_ROWS 8
|
|
||||||
#define MATRIX_COLS 15
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keyboard Matrix Assignments
|
|
||||||
*
|
|
||||||
* Change this to how you wired your keyboard
|
|
||||||
* COLS: AVR pins used for columns, left to right
|
|
||||||
* ROWS: AVR pins used for rows, top to bottom
|
|
||||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
|
||||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
|
|
||||||
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
|
|
||||||
#define UNUSED_PINS
|
|
||||||
|
|
||||||
/* COL2ROW, ROW2COL */
|
|
||||||
#define DIODE_DIRECTION COL2ROW
|
|
||||||
|
|
||||||
//#define LED_NUM_LOCK_PIN D0
|
|
||||||
//#define LED_CAPS_LOCK_PIN D1
|
|
||||||
//#define LED_SCROLL_LOCK_PIN D6
|
|
||||||
|
|
||||||
#define BACKLIGHT_PIN D4
|
|
||||||
//#define BACKLIGHT_LEVELS 3
|
|
||||||
//#define BACKLIGHT_BREATHING
|
|
||||||
|
|
||||||
#define RGBLED_NUM 16
|
|
||||||
//#define RGBLIGHT_HUE_STEP 8
|
|
||||||
//#define RGBLIGHT_SAT_STEP 8
|
|
||||||
//#define RGBLIGHT_VAL_STEP 8
|
|
||||||
//#define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
|
|
||||||
//#define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
|
|
||||||
/*== all animations enable ==*/
|
|
||||||
//#define RGBLIGHT_ANIMATIONS
|
|
||||||
/*== or choose animations ==*/
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHING
|
|
||||||
//#define RGBLIGHT_EFFECT_RAINBOW_MOOD
|
|
||||||
//#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
|
||||||
//#define RGBLIGHT_EFFECT_SNAKE
|
|
||||||
//#define RGBLIGHT_EFFECT_KNIGHT
|
|
||||||
//#define RGBLIGHT_EFFECT_CHRISTMAS
|
|
||||||
//#define RGBLIGHT_EFFECT_STATIC_GRADIENT
|
|
||||||
//#define RGBLIGHT_EFFECT_RGB_TEST
|
|
||||||
//#define RGBLIGHT_EFFECT_ALTERNATING
|
|
||||||
/*== customize breathing effect ==*/
|
|
||||||
/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
|
|
||||||
//#define RGBLIGHT_BREATHE_TABLE_SIZE 256 // 256(default) or 128 or 64
|
|
||||||
/*==== use exp() and sin() ====*/
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1 to 2.7
|
|
||||||
//#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0 to 255
|
|
||||||
|
|
||||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
|
||||||
#define DEBOUNCE 5
|
|
||||||
|
|
||||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
|
|
||||||
//#define MATRIX_HAS_GHOST
|
|
||||||
|
|
||||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
|
||||||
/* Locking resynchronize hack */
|
|
||||||
#define LOCKING_RESYNC_ENABLE
|
|
||||||
|
|
||||||
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
|
|
||||||
* This is useful for the Windows task manager shortcut (ctrl+shift+esc).
|
|
||||||
*/
|
|
||||||
//#define GRAVE_ESC_CTRL_OVERRIDE
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Force NKRO
|
|
||||||
*
|
|
||||||
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
|
|
||||||
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
|
|
||||||
* makefile for this to work.)
|
|
||||||
*
|
|
||||||
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
|
|
||||||
* until the next keyboard reset.
|
|
||||||
*
|
|
||||||
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
|
|
||||||
* fully operational during normal computer usage.
|
|
||||||
*
|
|
||||||
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
|
|
||||||
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
|
|
||||||
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
|
|
||||||
* power-up.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
//#define FORCE_NKRO
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Feature disable options
|
|
||||||
* These options are also useful to firmware size reduction.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* disable debug print */
|
|
||||||
//#define NO_DEBUG
|
|
||||||
|
|
||||||
/* disable print */
|
|
||||||
//#define NO_PRINT
|
|
||||||
|
|
||||||
/* disable action features */
|
|
||||||
//#define NO_ACTION_LAYER
|
|
||||||
//#define NO_ACTION_TAPPING
|
|
||||||
//#define NO_ACTION_ONESHOT
|
|
||||||
|
|
||||||
/* disable these deprecated features by default */
|
|
||||||
#define NO_ACTION_MACRO
|
|
||||||
#define NO_ACTION_FUNCTION
|
|
||||||
|
|
||||||
/* Bootmagic Lite key configuration */
|
|
||||||
//#define BOOTMAGIC_LITE_ROW 0
|
|
||||||
//#define BOOTMAGIC_LITE_COLUMN 0
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# %(KEYBOARD)s
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
*A short description of the keyboard/project*
|
|
||||||
|
|
||||||
* Keyboard Maintainer: [%(YOUR_NAME)s](https://github.com/yourusername)
|
|
||||||
* Hardware Supported: *The PCBs, controllers supported*
|
|
||||||
* Hardware Availability: *Links to where you can find this hardware*
|
|
||||||
|
|
||||||
Make example for this keyboard (after setting up your build environment):
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default
|
|
||||||
|
|
||||||
Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
|
|
||||||
|
|
||||||
make %(KEYBOARD)s:default:flash
|
|
||||||
|
|
||||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
||||||
|
|
||||||
## Bootloader
|
|
||||||
|
|
||||||
Enter the bootloader in 3 ways:
|
|
||||||
|
|
||||||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
|
|
||||||
* **BootloadHID reset**: Hold down the key connected to the `A0` and `B0` pins on the MCU if it is known (often top left or bottom left) and plug in the keyboard
|
|
||||||
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
|
|
||||||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# MCU name
|
|
||||||
MCU = atmega32a
|
|
||||||
|
|
||||||
# Bootloader selection
|
|
||||||
BOOTLOADER = bootloadhid
|
|
||||||
|
|
||||||
# Build Options
|
|
||||||
# change yes to no to disable
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
|
|
||||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
|
||||||
CONSOLE_ENABLE = no # Console for debug
|
|
||||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
|
||||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
|
||||||
WS2812_DRIVER = i2c
|
|
||||||
489
docs/ChangeLog/20220226.md
Normal file
489
docs/ChangeLog/20220226.md
Normal file
@@ -0,0 +1,489 @@
|
|||||||
|
# QMK Breaking Changes - 2022 February 26 Changelog
|
||||||
|
|
||||||
|
## Notable Features :id=notable-features
|
||||||
|
|
||||||
|
### Default USB Polling rate now 1kHz ([#15352](https://github.com/qmk/qmk_firmware/pull/15352))
|
||||||
|
|
||||||
|
The default USB Polling rate has been aligned across supported platforms to now be 1ms/1kHz.
|
||||||
|
|
||||||
|
Something something *Lets go gamers!*
|
||||||
|
|
||||||
|
### Split support for pointing devices ([#15304](https://github.com/qmk/qmk_firmware/pull/15304))
|
||||||
|
|
||||||
|
Pointing devices can now be shared across a split keyboard with support for a single pointing device or a pointing device on each side.
|
||||||
|
|
||||||
|
See the [Pointing Device](feature_pointing_device.md) documentation for further configuration options.
|
||||||
|
|
||||||
|
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||||
|
|
||||||
|
### Legacy macro and action_function system removed ([#16025](https://github.com/qmk/qmk_firmware/pull/16025))
|
||||||
|
|
||||||
|
The long time deprecated `MACRO()` and `action_get_macro` methods have been removed. Where possible, existing usages have been migrated over to core [Macros](feature_macros.md).
|
||||||
|
|
||||||
|
### Create a build error if no bootloader is specified ([#16181](https://github.com/qmk/qmk_firmware/pull/16181))
|
||||||
|
|
||||||
|
Bootloader configuration is no longer assumed. Keyboards must now set either:
|
||||||
|
|
||||||
|
* `BOOTLOADER` within `rules.mk`
|
||||||
|
* `bootloader` within `info.json`
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||||
|
|
||||||
|
The following keyboards have had their source moved within QMK:
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|----------------------------|------------------------------------|
|
||||||
|
| 6ball | maple_computing/6ball |
|
||||||
|
| 7skb | salicylic_acid3/7skb |
|
||||||
|
| 7splus | salicylic_acid3/7splus |
|
||||||
|
| acr60 | mechkeys/acr60 |
|
||||||
|
| adalyn | tominabox1/adalyn |
|
||||||
|
| ajisai74 | salicylic_acid3/ajisai74 |
|
||||||
|
| aleth42 | 25keys/aleth42 |
|
||||||
|
| alicia_cook | ibnuda/alicia_cook |
|
||||||
|
| allison_numpad | prototypist/allison_numpad |
|
||||||
|
| allison | prototypist/allison |
|
||||||
|
| alu84 | mechkeys/alu84 |
|
||||||
|
| angel17 | kakunpc/angel17 |
|
||||||
|
| angel64/alpha | kakunpc/angel64/alpha |
|
||||||
|
| angel64/rev1 | kakunpc/angel64/rev1 |
|
||||||
|
| arch_36 | obosob/arch_36 |
|
||||||
|
| bakeneko60 | kkatano/bakeneko60 |
|
||||||
|
| bakeneko65/rev2 | kkatano/bakeneko65/rev2 |
|
||||||
|
| bakeneko65/rev3 | kkatano/bakeneko65/rev3 |
|
||||||
|
| bakeneko80 | kkatano/bakeneko80 |
|
||||||
|
| barleycorn | yiancardesigns/barleycorn |
|
||||||
|
| bat43/rev1 | dailycraft/bat43/rev1 |
|
||||||
|
| bat43/rev2 | dailycraft/bat43/rev2 |
|
||||||
|
| bigseries/1key | woodkeys/bigseries/1key |
|
||||||
|
| bigseries/2key | woodkeys/bigseries/2key |
|
||||||
|
| bigseries/3key | woodkeys/bigseries/3key |
|
||||||
|
| bigseries/4key | woodkeys/bigseries/4key |
|
||||||
|
| bkf | drhigsby/bkf |
|
||||||
|
| business_card/alpha | kakunpc/business_card/alpha |
|
||||||
|
| business_card/beta | kakunpc/business_card/beta |
|
||||||
|
| butterstick | gboards/butterstick |
|
||||||
|
| c39 | maple_computing/c39 |
|
||||||
|
| cassette42 | 25keys/cassette42 |
|
||||||
|
| chidori | kagizaraya/chidori |
|
||||||
|
| chili | ydkb/chili |
|
||||||
|
| chimera_ergo | glenpickle/chimera_ergo |
|
||||||
|
| chimera_ls | glenpickle/chimera_ls |
|
||||||
|
| chimera_ortho | glenpickle/chimera_ortho |
|
||||||
|
| chimera_ortho_plus | glenpickle/chimera_ortho_plus |
|
||||||
|
| choco60 | recompile_keys/choco60 |
|
||||||
|
| choc_taro | kakunpc/choc_taro |
|
||||||
|
| christmas_tree | maple_computing/christmas_tree |
|
||||||
|
| claw44/rev1 | dailycraft/claw44/rev1 |
|
||||||
|
| cocoa40 | recompile_keys/cocoa40 |
|
||||||
|
| comet46 | satt/comet46 |
|
||||||
|
| cu24 | capsunlocked/cu24 |
|
||||||
|
| cu75 | capsunlocked/cu75 |
|
||||||
|
| cu80 | capsunlocked/cu80/v1 |
|
||||||
|
| delilah | rainkeebs/delilah |
|
||||||
|
| diverge3 | unikeyboard/diverge3 |
|
||||||
|
| divergetm2 | unikeyboard/divergetm2 |
|
||||||
|
| dozen0 | yynmt/dozen0 |
|
||||||
|
| dubba175 | drhigsby/dubba175 |
|
||||||
|
| eggman | qpockets/eggman |
|
||||||
|
| ergo42 | biacco42/ergo42 |
|
||||||
|
| ergoarrows | salicylic_acid3/ergoarrows |
|
||||||
|
| ergodash/mini | omkbd/ergodash/mini |
|
||||||
|
| ergodash/rev1 | omkbd/ergodash/rev1 |
|
||||||
|
| ergodox_infinity | input_club/ergodox_infinity |
|
||||||
|
| ergotaco | gboards/ergotaco |
|
||||||
|
| espectro | mechkeys/espectro |
|
||||||
|
| felix | unikeyboard/felix |
|
||||||
|
| four_banger | bpiphany/four_banger |
|
||||||
|
| freyr | hnahkb/freyr |
|
||||||
|
| geminate60 | weirdo/geminate60 |
|
||||||
|
| georgi | gboards/georgi |
|
||||||
|
| gergo | gboards/gergo |
|
||||||
|
| getta25 | salicylic_acid3/getta25 |
|
||||||
|
| gingham | yiancardesigns/gingham |
|
||||||
|
| gurindam | ibnuda/gurindam |
|
||||||
|
| halberd | kagizaraya/halberd |
|
||||||
|
| hecomi/alpha | takashiski/hecomi/alpha |
|
||||||
|
| hid_liber | bpiphany/hid_liber |
|
||||||
|
| id67/default_rgb | idobao/id67/default_rgb |
|
||||||
|
| id67/rgb | idobao/id67/rgb |
|
||||||
|
| id80 | idobao/id80/v1 |
|
||||||
|
| id87 | idobao/id87/v1 |
|
||||||
|
| idobo | idobao/id75/v1 |
|
||||||
|
| infinity60 | input_club/infinity60 |
|
||||||
|
| ivy/rev1 | maple_computing/ivy/rev1 |
|
||||||
|
| jisplit89 | salicylic_acid3/jisplit89 |
|
||||||
|
| jnao | maple_computing/jnao |
|
||||||
|
| just60 | ydkb/just60 |
|
||||||
|
| kagamidget | yynmt/kagamidget |
|
||||||
|
| kelowna/rgb64 | weirdo/kelowna/rgb64 |
|
||||||
|
| kprepublic/bm65hsrgb_iso | kprepublic/bm65hsrgb_iso/rev1 |
|
||||||
|
| kprepublic/bm68hsrgb | kprepublic/bm68hsrgb/rev1 |
|
||||||
|
| k_type | input_club/k_type |
|
||||||
|
| latin17rgb | latincompass/latin17rgb |
|
||||||
|
| latin47ble | latincompass/latin47ble |
|
||||||
|
| latin60rgb | latincompass/latin60rgb |
|
||||||
|
| latin64ble | latincompass/latin64ble |
|
||||||
|
| latin6rgb | latincompass/latin6rgb |
|
||||||
|
| latinpadble | latincompass/latinpadble |
|
||||||
|
| latinpad | latincompass/latinpad |
|
||||||
|
| launchpad/rev1 | maple_computing/launchpad/rev1 |
|
||||||
|
| lck75 | lyso1/lck75 |
|
||||||
|
| le_chiffre | tominabox1/le_chiffre |
|
||||||
|
| lefishe | lyso1/lefishe |
|
||||||
|
| lets_split_eh/eh | maple_computing/lets_split_eh/eh |
|
||||||
|
| ls_60 | weirdo/ls_60 |
|
||||||
|
| m3n3van | matthewdias/m3n3van |
|
||||||
|
| mechmini/v1 | mechkeys/mechmini/v1 |
|
||||||
|
| mechmini/v2 | mechkeys/mechmini/v2 |
|
||||||
|
| meira | woodkeys/meira |
|
||||||
|
| meishi2 | biacco42/meishi2 |
|
||||||
|
| meishi | biacco42/meishi |
|
||||||
|
| minidox/rev1 | maple_computing/minidox/rev1 |
|
||||||
|
| minim | matthewdias/minim |
|
||||||
|
| mio | recompile_keys/mio |
|
||||||
|
| model_v | matthewdias/model_v |
|
||||||
|
| montex | idobao/montex/v1 |
|
||||||
|
| nafuda | salicylic_acid3/nafuda |
|
||||||
|
| naiping/np64 | weirdo/naiping/np64 |
|
||||||
|
| naiping/nphhkb | weirdo/naiping/nphhkb |
|
||||||
|
| naiping/npminila | weirdo/naiping/npminila |
|
||||||
|
| naked48 | salicylic_acid3/naked48 |
|
||||||
|
| naked60 | salicylic_acid3/naked60 |
|
||||||
|
| naked64 | salicylic_acid3/naked64 |
|
||||||
|
| namecard2x4 | takashiski/namecard2x4 |
|
||||||
|
| nebula12 | spaceholdings/nebula12 |
|
||||||
|
| nebula68b | spaceholdings/nebula68b |
|
||||||
|
| nebula68 | spaceholdings/nebula68 |
|
||||||
|
| niu_mini | kbdfans/niu_mini |
|
||||||
|
| nk1 | novelkeys/nk1 |
|
||||||
|
| nk65 | novelkeys/nk65 |
|
||||||
|
| nk87 | novelkeys/nk87 |
|
||||||
|
| nknl7en | salicylic_acid3/nknl7en |
|
||||||
|
| nknl7jp | salicylic_acid3/nknl7jp |
|
||||||
|
| nomu30 | recompile_keys/nomu30 |
|
||||||
|
| novelpad | novelkeys/novelpad |
|
||||||
|
| ogurec | drhigsby/ogurec |
|
||||||
|
| otaku_split/rev0 | takashiski/otaku_split/rev0 |
|
||||||
|
| otaku_split/rev1 | takashiski/otaku_split/rev1 |
|
||||||
|
| owl8 | dailycraft/owl8 |
|
||||||
|
| packrat | drhigsby/packrat |
|
||||||
|
| pistachio_mp | rate/pistachio_mp |
|
||||||
|
| pistachio_pro | rate/pistachio_pro |
|
||||||
|
| pistachio | rate/pistachio |
|
||||||
|
| plexus75 | checkerboards/plexus75 |
|
||||||
|
| pursuit40 | checkerboards/pursuit40 |
|
||||||
|
| qaz | tominabox1/qaz |
|
||||||
|
| quark | checkerboards/quark |
|
||||||
|
| rabbit_capture_plan | kakunpc/rabbit_capture_plan |
|
||||||
|
| rainkeeb | rainkeebs/rainkeeb |
|
||||||
|
| reviung33 | reviung/reviung33 |
|
||||||
|
| reviung34 | reviung/reviung34 |
|
||||||
|
| reviung39 | reviung/reviung39 |
|
||||||
|
| reviung41 | reviung/reviung41 |
|
||||||
|
| reviung53 | reviung/reviung53 |
|
||||||
|
| reviung5 | reviung/reviung5 |
|
||||||
|
| reviung61 | reviung/reviung61 |
|
||||||
|
| runner3680/3x6 | omkbd/runner3680/3x6 |
|
||||||
|
| runner3680/3x7 | omkbd/runner3680/3x7 |
|
||||||
|
| runner3680/3x8 | omkbd/runner3680/3x8 |
|
||||||
|
| runner3680/4x6 | omkbd/runner3680/4x6 |
|
||||||
|
| runner3680/4x7 | omkbd/runner3680/4x7 |
|
||||||
|
| runner3680/4x8 | omkbd/runner3680/4x8 |
|
||||||
|
| runner3680/5x6_5x8 | omkbd/runner3680/5x6_5x8 |
|
||||||
|
| runner3680/5x6 | omkbd/runner3680/5x6 |
|
||||||
|
| runner3680/5x7 | omkbd/runner3680/5x7 |
|
||||||
|
| runner3680/5x8 | omkbd/runner3680/5x8 |
|
||||||
|
| scarletbandana | woodkeys/scarletbandana |
|
||||||
|
| scythe | kagizaraya/scythe |
|
||||||
|
| seigaiha | yiancardesigns/seigaiha |
|
||||||
|
| setta21 | salicylic_acid3/setta21 |
|
||||||
|
| space_space/rev1 | qpockets/space_space/rev1 |
|
||||||
|
| space_space/rev2 | qpockets/space_space/rev2 |
|
||||||
|
| spiderisland/winry25tc | winry/winry25tc |
|
||||||
|
| splitreus62 | nacly/splitreus62 |
|
||||||
|
| squiggle/rev1 | ibnuda/squiggle/rev1 |
|
||||||
|
| standaside | edi/standaside |
|
||||||
|
| steal_this_keyboard | obosob/steal_this_keyboard |
|
||||||
|
| stella | hnahkb/stella |
|
||||||
|
| suihankey/alpha | kakunpc/suihankey/alpha |
|
||||||
|
| suihankey/rev1 | kakunpc/suihankey/rev1 |
|
||||||
|
| suihankey/split | kakunpc/suihankey/split |
|
||||||
|
| thedogkeyboard | kakunpc/thedogkeyboard |
|
||||||
|
| the_ruler | maple_computing/the_ruler |
|
||||||
|
| tiger910 | weirdo/tiger910 |
|
||||||
|
| treadstone32 | marksard/treadstone32 |
|
||||||
|
| treadstone48/rev1 | marksard/treadstone48/rev1 |
|
||||||
|
| treadstone48/rev2 | marksard/treadstone48/rev2 |
|
||||||
|
| txuu | matthewdias/txuu |
|
||||||
|
| ua62 | nacly/ua62 |
|
||||||
|
| underscore33/rev1 | tominabox1/underscore33/rev1 |
|
||||||
|
| underscore33/rev2 | tominabox1/underscore33/rev2 |
|
||||||
|
| vn66 | hnahkb/vn66 |
|
||||||
|
| wallaby | kkatano/wallaby |
|
||||||
|
| wanten | qpockets/wanten |
|
||||||
|
| whitefox | input_club/whitefox |
|
||||||
|
| wings42/rev1 | dailycraft/wings42/rev1 |
|
||||||
|
| wings42/rev1_extkeys | dailycraft/wings42/rev1_extkeys |
|
||||||
|
| wings42/rev2 | dailycraft/wings42/rev2 |
|
||||||
|
| yasui | rainkeebs/yasui |
|
||||||
|
| yd60mq | ymdk/yd60mq |
|
||||||
|
| yd68 | ydkb/yd68 |
|
||||||
|
| ymd75 | ymdk/ymd75 |
|
||||||
|
| ymd96 | ymdk/ymd96 |
|
||||||
|
| ymdk_np21 | ymdk/np21 |
|
||||||
|
| yurei | kkatano/yurei |
|
||||||
|
| zinc | 25keys/zinc |
|
||||||
|
| zinc/rev1 | 25keys/zinc/rev1 |
|
||||||
|
| zinc/reva | 25keys/zinc/reva |
|
||||||
|
|
||||||
|
## Notable core changes :id=notable-core
|
||||||
|
|
||||||
|
### New MCU Support :id=new-mcu-support
|
||||||
|
|
||||||
|
Building on previous cycles, QMK firmware picked up support for a couple extra MCU variants:
|
||||||
|
|
||||||
|
* STM32L432
|
||||||
|
* STM32L442
|
||||||
|
|
||||||
|
### New Drivers
|
||||||
|
|
||||||
|
QMK now has core-supplied support for the following device peripherals:
|
||||||
|
|
||||||
|
#### LED
|
||||||
|
|
||||||
|
* IS31FL3742A
|
||||||
|
* IS31FL3743A
|
||||||
|
* IS31FL3745
|
||||||
|
* IS31FL3746A
|
||||||
|
|
||||||
|
#### GPIO
|
||||||
|
|
||||||
|
* SN74x138
|
||||||
|
* mcp23018
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Full changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Initial pass at data driven new-keyboard subcommand ([#12795](https://github.com/qmk/qmk_firmware/pull/12795))
|
||||||
|
* Don't send keyboard reports that propagate no changes to the host ([#14065](https://github.com/qmk/qmk_firmware/pull/14065))
|
||||||
|
* Custom matrix lite support for split keyboards ([#14674](https://github.com/qmk/qmk_firmware/pull/14674))
|
||||||
|
* Add sym_defer_pr debouncer type ([#14948](https://github.com/qmk/qmk_firmware/pull/14948))
|
||||||
|
* Add RGB matrix & LED Matrix support for IS31FL3742A, IS31FL3743A, IS31FL3745, IS31FL3746A ([#14989](https://github.com/qmk/qmk_firmware/pull/14989))
|
||||||
|
* New combo configuration options ([#15083](https://github.com/qmk/qmk_firmware/pull/15083))
|
||||||
|
* IS31FL3733 driver for LED Matrix ([#15088](https://github.com/qmk/qmk_firmware/pull/15088))
|
||||||
|
* Add open-drain GPIO support. ([#15282](https://github.com/qmk/qmk_firmware/pull/15282))
|
||||||
|
* Make (un)register code functions weak ([#15285](https://github.com/qmk/qmk_firmware/pull/15285))
|
||||||
|
* Split support for pointing devices. ([#15304](https://github.com/qmk/qmk_firmware/pull/15304))
|
||||||
|
* Added cancel_key_lock function ([#15321](https://github.com/qmk/qmk_firmware/pull/15321))
|
||||||
|
* Remove matrix_is_modified() and debounce_is_active() ([#15349](https://github.com/qmk/qmk_firmware/pull/15349))
|
||||||
|
* Change default USB Polling rate to 1kHz ([#15352](https://github.com/qmk/qmk_firmware/pull/15352))
|
||||||
|
* Implement MAGIC_TOGGLE_CONTROL_CAPSLOCK ([#15368](https://github.com/qmk/qmk_firmware/pull/15368))
|
||||||
|
* Tidy up existing i2c_master implementations ([#15376](https://github.com/qmk/qmk_firmware/pull/15376))
|
||||||
|
* Generalize Unicode defines ([#15409](https://github.com/qmk/qmk_firmware/pull/15409))
|
||||||
|
* Added external spi flash driver. ([#15419](https://github.com/qmk/qmk_firmware/pull/15419))
|
||||||
|
* Remove Deprecated USB Polling comment from vusb.c ([#15420](https://github.com/qmk/qmk_firmware/pull/15420))
|
||||||
|
* Expand rotational range for PMW3360 Optical Sensor ([#15431](https://github.com/qmk/qmk_firmware/pull/15431))
|
||||||
|
* ChibiOS SVN mirror script update ([#15435](https://github.com/qmk/qmk_firmware/pull/15435))
|
||||||
|
* Refactor `bootloader_jump()` implementations ([#15450](https://github.com/qmk/qmk_firmware/pull/15450))
|
||||||
|
* added missing audio_off_user() callback ([#15457](https://github.com/qmk/qmk_firmware/pull/15457))
|
||||||
|
* Migrate serial_uart usages to UART driver ([#15479](https://github.com/qmk/qmk_firmware/pull/15479))
|
||||||
|
* Migrate RN42 to UART driver and refactor ([#15492](https://github.com/qmk/qmk_firmware/pull/15492))
|
||||||
|
* pwm3360 driver cleanup and diff reduction to adns9800 ([#15559](https://github.com/qmk/qmk_firmware/pull/15559))
|
||||||
|
* Advanced deferred_exec for core-side code. ([#15579](https://github.com/qmk/qmk_firmware/pull/15579))
|
||||||
|
* Adjust tap_code16 to account for TAP_HOLD_CAPS_DELAY ([#15635](https://github.com/qmk/qmk_firmware/pull/15635))
|
||||||
|
* Slight tidy up of keyboard task loop ([#15725](https://github.com/qmk/qmk_firmware/pull/15725))
|
||||||
|
* Unify the key up/down behaviour of RGB keycodes ([#15730](https://github.com/qmk/qmk_firmware/pull/15730))
|
||||||
|
* Add PMW3389 optical sensor Support (Updated) ([#15740](https://github.com/qmk/qmk_firmware/pull/15740))
|
||||||
|
* ChibiOS: add support for HID Programmable Buttons ([#15787](https://github.com/qmk/qmk_firmware/pull/15787))
|
||||||
|
* ChibiOS: shorten USB disconnect state on boot to 50ms ([#15805](https://github.com/qmk/qmk_firmware/pull/15805))
|
||||||
|
* Add init function to clear previous matrix effect ([#15815](https://github.com/qmk/qmk_firmware/pull/15815))
|
||||||
|
* Optimize initialization of PMW3360 Sensor ([#15821](https://github.com/qmk/qmk_firmware/pull/15821))
|
||||||
|
* Add Pixel Flow RGB matrix effect ([#15829](https://github.com/qmk/qmk_firmware/pull/15829))
|
||||||
|
* PMW3389 Revert Firmware load during Initilization ([#15859](https://github.com/qmk/qmk_firmware/pull/15859))
|
||||||
|
* Combo `TAP_CODE_DELAY` and `clear_weak_mods` ([#15866](https://github.com/qmk/qmk_firmware/pull/15866))
|
||||||
|
* Relocate matrix_scan_quantum tasks ([#15882](https://github.com/qmk/qmk_firmware/pull/15882))
|
||||||
|
* Adjust mouse key defaults ([#15883](https://github.com/qmk/qmk_firmware/pull/15883))
|
||||||
|
* RGB Matrix: Reload from EEPROM ([#15923](https://github.com/qmk/qmk_firmware/pull/15923))
|
||||||
|
* Enable a default task throttle for split pointing. ([#15925](https://github.com/qmk/qmk_firmware/pull/15925))
|
||||||
|
* Move mcp23018 driver to core ([#15944](https://github.com/qmk/qmk_firmware/pull/15944))
|
||||||
|
* Relocate matrix_init_quantum content ([#15953](https://github.com/qmk/qmk_firmware/pull/15953))
|
||||||
|
* Align location of some host led logic ([#15954](https://github.com/qmk/qmk_firmware/pull/15954))
|
||||||
|
* Rename some Quantum keycodes ([#15968](https://github.com/qmk/qmk_firmware/pull/15968))
|
||||||
|
* Migrate more makefile utilities to builddefs sub-directory ([#16002](https://github.com/qmk/qmk_firmware/pull/16002))
|
||||||
|
* Various Makefile optimisations ([#16015](https://github.com/qmk/qmk_firmware/pull/16015))
|
||||||
|
* Add support for STM32L432, STM32L442. ([#16016](https://github.com/qmk/qmk_firmware/pull/16016))
|
||||||
|
* EEPROM refactor: remove `eeprom_teensy.c` by default, use transient instead ([#16020](https://github.com/qmk/qmk_firmware/pull/16020))
|
||||||
|
* Deprecate Split Transaction status field ([#16023](https://github.com/qmk/qmk_firmware/pull/16023))
|
||||||
|
* Rip out old macro and action_function system ([#16025](https://github.com/qmk/qmk_firmware/pull/16025))
|
||||||
|
* Add a script that simplifies running commands under docker. ([#16028](https://github.com/qmk/qmk_firmware/pull/16028))
|
||||||
|
* Add support for Q-series on the ckled2001 LED driver ([#16051](https://github.com/qmk/qmk_firmware/pull/16051))
|
||||||
|
* Remove unused suspend_idle ([#16063](https://github.com/qmk/qmk_firmware/pull/16063))
|
||||||
|
* Initial migration of suspend callbacks ([#16067](https://github.com/qmk/qmk_firmware/pull/16067))
|
||||||
|
* Add layout change callbacks to VIA ([#16087](https://github.com/qmk/qmk_firmware/pull/16087))
|
||||||
|
* Rename `AdafruitBLE` to `BluefruitLE` ([#16127](https://github.com/qmk/qmk_firmware/pull/16127))
|
||||||
|
* Update outputselect to use platform connected state API ([#16185](https://github.com/qmk/qmk_firmware/pull/16185))
|
||||||
|
* Remove default pointing device driver. ([#16190](https://github.com/qmk/qmk_firmware/pull/16190))
|
||||||
|
* Add SN74x138 demultiplexer driver ([#16217](https://github.com/qmk/qmk_firmware/pull/16217))
|
||||||
|
* Standardise error output. ([#16220](https://github.com/qmk/qmk_firmware/pull/16220))
|
||||||
|
* Followup to #16220, more test error output. ([#16221](https://github.com/qmk/qmk_firmware/pull/16221))
|
||||||
|
* Misc size regression script improvements. ([#16268](https://github.com/qmk/qmk_firmware/pull/16268))
|
||||||
|
* Align existing pca9555 driver to better match mcp23018 API ([#16277](https://github.com/qmk/qmk_firmware/pull/16277))
|
||||||
|
* Size checks print out target firmware file instead ([#16290](https://github.com/qmk/qmk_firmware/pull/16290))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* `develop` changelog generator: use the PR title instead ([#15537](https://github.com/qmk/qmk_firmware/pull/15537))
|
||||||
|
* `develop` changelog generator: skip code formatting in listing ([#16215](https://github.com/qmk/qmk_firmware/pull/16215))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* Durgod: Increase scan rate by using wait_us timer ([#14091](https://github.com/qmk/qmk_firmware/pull/14091))
|
||||||
|
* Add another GMMK Pro ANSI Keymap with custom RGB. ([#14243](https://github.com/qmk/qmk_firmware/pull/14243))
|
||||||
|
* Parse USB device version BCD ([#14580](https://github.com/qmk/qmk_firmware/pull/14580))
|
||||||
|
* Add vitoni keymap for GMMK Pro (ISO) ([#15006](https://github.com/qmk/qmk_firmware/pull/15006))
|
||||||
|
* Move bm65hsrgb_iso and bm68hsrgb to rev1/ to prepare for updates to the boards ([#15132](https://github.com/qmk/qmk_firmware/pull/15132))
|
||||||
|
* Convert ergoinu to SPLIT_KEYBOARD ([#15305](https://github.com/qmk/qmk_firmware/pull/15305))
|
||||||
|
* Convert not_so_minidox to SPLIT_KEYBOARD ([#15306](https://github.com/qmk/qmk_firmware/pull/15306))
|
||||||
|
* Added new handwired keyboard Wakizashi 40 ([#15336](https://github.com/qmk/qmk_firmware/pull/15336))
|
||||||
|
* Convert ai03/orbit to SPLIT_KEYBOARD ([#15340](https://github.com/qmk/qmk_firmware/pull/15340))
|
||||||
|
* Remove manual enable of LTO within user keymaps ([#15378](https://github.com/qmk/qmk_firmware/pull/15378))
|
||||||
|
* Move to organization folder ([#15481](https://github.com/qmk/qmk_firmware/pull/15481))
|
||||||
|
* Convert some more boards to Matrix Lite ([#15489](https://github.com/qmk/qmk_firmware/pull/15489))
|
||||||
|
* Organize Reviung boards into a directory ([#15636](https://github.com/qmk/qmk_firmware/pull/15636))
|
||||||
|
* move winry25tc to winry/ ([#15637](https://github.com/qmk/qmk_firmware/pull/15637))
|
||||||
|
* Rename ymdk_np21 to np21 + move to ymdk vendor folder ([#15641](https://github.com/qmk/qmk_firmware/pull/15641))
|
||||||
|
* move ymd96 to ymdk vendor folder ([#15643](https://github.com/qmk/qmk_firmware/pull/15643))
|
||||||
|
* move ymd75 to ymdk vendor folder ([#15645](https://github.com/qmk/qmk_firmware/pull/15645))
|
||||||
|
* move yd60mq to ymdk vendor folder ([#15647](https://github.com/qmk/qmk_firmware/pull/15647))
|
||||||
|
* rename idobo to idobao/id75, move to vendor folder ([#15661](https://github.com/qmk/qmk_firmware/pull/15661))
|
||||||
|
* move ID67 to IDOBAO vendor folder ([#15662](https://github.com/qmk/qmk_firmware/pull/15662))
|
||||||
|
* move ID80 to IDOBAO vendor folder ([#15665](https://github.com/qmk/qmk_firmware/pull/15665))
|
||||||
|
* move ID87 to IDOBAO vendor folder ([#15667](https://github.com/qmk/qmk_firmware/pull/15667))
|
||||||
|
* move montex to IDOBAO vendor folder ([#15668](https://github.com/qmk/qmk_firmware/pull/15668))
|
||||||
|
* move @yangdigi 's keyboards to a YDKB folder ([#15681](https://github.com/qmk/qmk_firmware/pull/15681))
|
||||||
|
* move @kkatano 's keyboards to kkatano user folder ([#15684](https://github.com/qmk/qmk_firmware/pull/15684))
|
||||||
|
* Sol 3 Keyboard from RGBKB ([#15687](https://github.com/qmk/qmk_firmware/pull/15687))
|
||||||
|
* move cu24, cu75, cu80/v1 into capsunlocked folder ([#15758](https://github.com/qmk/qmk_firmware/pull/15758))
|
||||||
|
* move mechkeys keyboards into the mechkeys/ vendor folder ([#15760](https://github.com/qmk/qmk_firmware/pull/15760))
|
||||||
|
* move @lyso1 's boards into lyso1/ ([#15767](https://github.com/qmk/qmk_firmware/pull/15767))
|
||||||
|
* move prototypist boards into vendor folder ([#15780](https://github.com/qmk/qmk_firmware/pull/15780))
|
||||||
|
* move @yiancar 's boards into yiancardesigns/ ([#15781](https://github.com/qmk/qmk_firmware/pull/15781))
|
||||||
|
* move novelkeys keyboards to vendor folder ([#15783](https://github.com/qmk/qmk_firmware/pull/15783))
|
||||||
|
* move @weirdo-f 's keyboards into weirdo/ ([#15785](https://github.com/qmk/qmk_firmware/pull/15785))
|
||||||
|
* move @marksard 's boards to marksard/ ([#15786](https://github.com/qmk/qmk_firmware/pull/15786))
|
||||||
|
* move input club keyboards into vendor folder ([#15788](https://github.com/qmk/qmk_firmware/pull/15788))
|
||||||
|
* move @monksoffunk 's boards into 25keys/ ([#15789](https://github.com/qmk/qmk_firmware/pull/15789))
|
||||||
|
* move @Salicylic-acid3 's keyboards to salicylic-acid3/ ([#15791](https://github.com/qmk/qmk_firmware/pull/15791))
|
||||||
|
* move @rainkeebs 's keyboards to rainkeebs/ ([#15797](https://github.com/qmk/qmk_firmware/pull/15797))
|
||||||
|
* move standaside into edi/ ([#15798](https://github.com/qmk/qmk_firmware/pull/15798))
|
||||||
|
* move @obosob 's boards into obosob/ ([#15799](https://github.com/qmk/qmk_firmware/pull/15799))
|
||||||
|
* move @nacly 's boards to nacly/ ([#15801](https://github.com/qmk/qmk_firmware/pull/15801))
|
||||||
|
* move @kakunpc 's keebs into kakunpc/ ([#15814](https://github.com/qmk/qmk_firmware/pull/15814))
|
||||||
|
* move @qpocket 's keyboards to qpocket/ ([#15827](https://github.com/qmk/qmk_firmware/pull/15827))
|
||||||
|
* BDN9 keymap ([#15924](https://github.com/qmk/qmk_firmware/pull/15924))
|
||||||
|
* move @matthewdias 's keebs into matthewdias/ ([#15991](https://github.com/qmk/qmk_firmware/pull/15991))
|
||||||
|
* move id80 and id75 to v1 to accommodate for id75 v2 and id80 v3 ([#15992](https://github.com/qmk/qmk_firmware/pull/15992))
|
||||||
|
* Remove `action_function()` from LFKeyboards boards ([#15993](https://github.com/qmk/qmk_firmware/pull/15993))
|
||||||
|
* move @latincompass (aka @18438880 , @haierwangwei2005)'s boards to /latincompass ([#16039](https://github.com/qmk/qmk_firmware/pull/16039))
|
||||||
|
* move g heavy industry boards into /gboards ([#16040](https://github.com/qmk/qmk_firmware/pull/16040))
|
||||||
|
* move @drhigsby 's boards into /drhigsby ([#16041](https://github.com/qmk/qmk_firmware/pull/16041))
|
||||||
|
* More keyboard rules.mk cleanups ([#16044](https://github.com/qmk/qmk_firmware/pull/16044))
|
||||||
|
* move @That-Canadian 's boards into /maple_computing ([#16050](https://github.com/qmk/qmk_firmware/pull/16050))
|
||||||
|
* move @takai 's keyboards into /recompile_keys ([#16053](https://github.com/qmk/qmk_firmware/pull/16053))
|
||||||
|
* move @satt99 's comet46 to satt/ ([#16059](https://github.com/qmk/qmk_firmware/pull/16059))
|
||||||
|
* move @ka2hiro 's boards into /kagizaraya ([#16070](https://github.com/qmk/qmk_firmware/pull/16070))
|
||||||
|
* move @GlenPickle 's chimera* boards into a folder ([#16072](https://github.com/qmk/qmk_firmware/pull/16072))
|
||||||
|
* move @yynmt 's boards into /yynmt ([#16075](https://github.com/qmk/qmk_firmware/pull/16075))
|
||||||
|
* move @Biacco42 's keebs into /biacco42 ([#16080](https://github.com/qmk/qmk_firmware/pull/16080))
|
||||||
|
* move unikeyboard boards to /unikeyboard ([#16081](https://github.com/qmk/qmk_firmware/pull/16081))
|
||||||
|
* move four_banger to bpiphany ([#16082](https://github.com/qmk/qmk_firmware/pull/16082))
|
||||||
|
* move @takashiski 's keebs into /takashiski ([#16089](https://github.com/qmk/qmk_firmware/pull/16089))
|
||||||
|
* move hid_liber to /bpiphany ([#16091](https://github.com/qmk/qmk_firmware/pull/16091))
|
||||||
|
* move spaceholdings boards into /spaceholdings ([#16096](https://github.com/qmk/qmk_firmware/pull/16096))
|
||||||
|
* move @7-rate 's keebs to /rate ([#16099](https://github.com/qmk/qmk_firmware/pull/16099))
|
||||||
|
* move @npspears 's boards into /checkerboards ([#16100](https://github.com/qmk/qmk_firmware/pull/16100))
|
||||||
|
* move @vuhopkep 's keebs into /hnahkb ([#16102](https://github.com/qmk/qmk_firmware/pull/16102))
|
||||||
|
* move @ibnuda 's keebs into /ibnuda ([#16108](https://github.com/qmk/qmk_firmware/pull/16108))
|
||||||
|
* move @tominabox1 's keebs into /tominabox1 ([#16109](https://github.com/qmk/qmk_firmware/pull/16109))
|
||||||
|
* move niu_mini to /kbdfans ([#16112](https://github.com/qmk/qmk_firmware/pull/16112))
|
||||||
|
* move woodkeys.click keyboards to /woodkeys ([#16113](https://github.com/qmk/qmk_firmware/pull/16113))
|
||||||
|
* move @omkbd 's boards to /omkbd ([#16116](https://github.com/qmk/qmk_firmware/pull/16116))
|
||||||
|
* Overhaul Tractyl Manuform ([#16134](https://github.com/qmk/qmk_firmware/pull/16134))
|
||||||
|
* Reduce firmware size for dztech/dz60rgb_wkl/v2_1:via ([#16254](https://github.com/qmk/qmk_firmware/pull/16254))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* Fix build failure for UT47 ([#15483](https://github.com/qmk/qmk_firmware/pull/15483))
|
||||||
|
* Update grs_70ec to use newer custom matrix ([#15609](https://github.com/qmk/qmk_firmware/pull/15609))
|
||||||
|
* fix compiler issue with Tractyl Manuform 4x6 ([#15646](https://github.com/qmk/qmk_firmware/pull/15646))
|
||||||
|
* Fix CI. ([#15828](https://github.com/qmk/qmk_firmware/pull/15828))
|
||||||
|
* Yet another bad `DEFAULT_FOLDER` fix. ([#15904](https://github.com/qmk/qmk_firmware/pull/15904))
|
||||||
|
* Fix build failures for `mschwingen/modelm` ([#15987](https://github.com/qmk/qmk_firmware/pull/15987))
|
||||||
|
* `rocketboard_16`: Fix mismatched LUT sizes ([#15997](https://github.com/qmk/qmk_firmware/pull/15997))
|
||||||
|
* Fix erroneous SRC for Clueboard 66 hotswap ([#16007](https://github.com/qmk/qmk_firmware/pull/16007))
|
||||||
|
* Fix handwired/ms_sculpt_mobile default keymap ([#16032](https://github.com/qmk/qmk_firmware/pull/16032))
|
||||||
|
* Re-org Hillside folders as new model prep. Fix default keymap. ([#16128](https://github.com/qmk/qmk_firmware/pull/16128))
|
||||||
|
* Fix up default folder locations. Again. ([#16135](https://github.com/qmk/qmk_firmware/pull/16135))
|
||||||
|
* Sol3 rgb fix ([#16157](https://github.com/qmk/qmk_firmware/pull/16157))
|
||||||
|
* Add missing `BOOTLOADER` for a handful of boards ([#16225](https://github.com/qmk/qmk_firmware/pull/16225))
|
||||||
|
* Remove half implemented micronucleus bootloader support ([#16252](https://github.com/qmk/qmk_firmware/pull/16252))
|
||||||
|
* Fixup bootloaders. ([#16256](https://github.com/qmk/qmk_firmware/pull/16256))
|
||||||
|
* Fix idobao/id80/v3 compilation errors ([#16280](https://github.com/qmk/qmk_firmware/pull/16280))
|
||||||
|
* Remove parent-relative paths from keyboards. ([#16282](https://github.com/qmk/qmk_firmware/pull/16282))
|
||||||
|
* Bodge for helix build failures ([#16376](https://github.com/qmk/qmk_firmware/pull/16376))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Add a clarification to an error message ([#15207](https://github.com/qmk/qmk_firmware/pull/15207))
|
||||||
|
* Clang-format tweaks ([#15906](https://github.com/qmk/qmk_firmware/pull/15906))
|
||||||
|
* Add example implementations for compatible MCUs list ([#15935](https://github.com/qmk/qmk_firmware/pull/15935))
|
||||||
|
* Add version.h to gitignore ([#16222](https://github.com/qmk/qmk_firmware/pull/16222))
|
||||||
|
* Update keyboard mapping for all moved boards this cycle ([#16312](https://github.com/qmk/qmk_firmware/pull/16312))
|
||||||
|
* Align docs to new-keyboard behaviour ([#16357](https://github.com/qmk/qmk_firmware/pull/16357))
|
||||||
|
* Align new-keyboard with recent schema updates ([#16378](https://github.com/qmk/qmk_firmware/pull/16378))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Fixes potential wpm sampling overflow, along with code comment fixes ([#15277](https://github.com/qmk/qmk_firmware/pull/15277))
|
||||||
|
* Add missing define for unicode common ([#15416](https://github.com/qmk/qmk_firmware/pull/15416))
|
||||||
|
* Fix for SPI write timing in PMW3360 driver ([#15519](https://github.com/qmk/qmk_firmware/pull/15519))
|
||||||
|
* Documentation Typo fix ([#15538](https://github.com/qmk/qmk_firmware/pull/15538))
|
||||||
|
* fix a typo ([#15557](https://github.com/qmk/qmk_firmware/pull/15557))
|
||||||
|
* Fix avr serial compile ([#15589](https://github.com/qmk/qmk_firmware/pull/15589))
|
||||||
|
* More AVR GPIO compilation fixes. ([#15592](https://github.com/qmk/qmk_firmware/pull/15592))
|
||||||
|
* Fix bug and code regression for Split Common ([#15603](https://github.com/qmk/qmk_firmware/pull/15603))
|
||||||
|
* Include missing string.h include in split ([#15606](https://github.com/qmk/qmk_firmware/pull/15606))
|
||||||
|
* Fixes for bootloader refactor build failures ([#15638](https://github.com/qmk/qmk_firmware/pull/15638))
|
||||||
|
* Update pmw3360 driver after reading the datasheet top to bottom. Fix some outdated refs. ([#15682](https://github.com/qmk/qmk_firmware/pull/15682))
|
||||||
|
* Fix split pointing for analog joystick ([#15691](https://github.com/qmk/qmk_firmware/pull/15691))
|
||||||
|
* Fix broken bootloader builds in develop. ([#15880](https://github.com/qmk/qmk_firmware/pull/15880))
|
||||||
|
* Fix optical sensor firmware upload ([#15919](https://github.com/qmk/qmk_firmware/pull/15919))
|
||||||
|
* Pass in the keyrecord_t of the dual-role/tapping key when calling per-key tap hold functions ([#15938](https://github.com/qmk/qmk_firmware/pull/15938))
|
||||||
|
* fixed typo in orange HSV colors decalartion ([#15976](https://github.com/qmk/qmk_firmware/pull/15976))
|
||||||
|
* Fix hack for chibiOS reset name ([#15984](https://github.com/qmk/qmk_firmware/pull/15984))
|
||||||
|
* Fix right side ws2812 leds having two indices ([#15985](https://github.com/qmk/qmk_firmware/pull/15985))
|
||||||
|
* Workaround in Makefile for recursive rule matching ([#15988](https://github.com/qmk/qmk_firmware/pull/15988))
|
||||||
|
* Fix BACKLIGHT_CAPS_LOCK warning ([#15999](https://github.com/qmk/qmk_firmware/pull/15999))
|
||||||
|
* Fix compilation issues for led indicators ([#16001](https://github.com/qmk/qmk_firmware/pull/16001))
|
||||||
|
* ChibiOS timer fixes ([#16017](https://github.com/qmk/qmk_firmware/pull/16017))
|
||||||
|
* Fix bootloader_jump for certain CTRL boards ([#16026](https://github.com/qmk/qmk_firmware/pull/16026))
|
||||||
|
* Fix up issue with PROGMEM and hand_swap_config ([#16027](https://github.com/qmk/qmk_firmware/pull/16027))
|
||||||
|
* Don't make EEPROM size assumptions with dynamic keymaps. ([#16054](https://github.com/qmk/qmk_firmware/pull/16054))
|
||||||
|
* fix missed .noci in reviung move ([#16107](https://github.com/qmk/qmk_firmware/pull/16107))
|
||||||
|
* Fix issues with Python Tests ([#16162](https://github.com/qmk/qmk_firmware/pull/16162))
|
||||||
|
* Fixup multibuild filegen ([#16166](https://github.com/qmk/qmk_firmware/pull/16166))
|
||||||
|
* Remove old .gitignore entry. Add more macOS junk exclusions. ([#16167](https://github.com/qmk/qmk_firmware/pull/16167))
|
||||||
|
* Fixup builds so that teensy EEPROM knows which MCU it's targeting. ([#16168](https://github.com/qmk/qmk_firmware/pull/16168))
|
||||||
|
* Create a build error if no bootloader is specified. ([#16181](https://github.com/qmk/qmk_firmware/pull/16181))
|
||||||
|
* Ensure `version.h` is recreated each build. ([#16188](https://github.com/qmk/qmk_firmware/pull/16188))
|
||||||
|
* Add `custom` to list of valid bootloader types in info.json ([#16228](https://github.com/qmk/qmk_firmware/pull/16228))
|
||||||
|
* Fix `layer_state` restoration at end of dynamic macro feature #16208 ([#16230](https://github.com/qmk/qmk_firmware/pull/16230))
|
||||||
|
* Minor additions #12795 ([#16276](https://github.com/qmk/qmk_firmware/pull/16276))
|
||||||
|
* Various fixes for matrix _RIGHT handling ([#16292](https://github.com/qmk/qmk_firmware/pull/16292))
|
||||||
|
* Fix slashes in build_full_test.mk ([#16300](https://github.com/qmk/qmk_firmware/pull/16300))
|
||||||
|
* ps2/avr: use the correct file name ([#16316](https://github.com/qmk/qmk_firmware/pull/16316))
|
||||||
|
* Fix compilation of ChibiOS UART driver ([#16348](https://github.com/qmk/qmk_firmware/pull/16348))
|
||||||
|
* Various fixes for new-keyboard ([#16358](https://github.com/qmk/qmk_firmware/pull/16358))
|
||||||
|
* Allow NO_PIN within data driven configuration ([#16359](https://github.com/qmk/qmk_firmware/pull/16359))
|
||||||
216
docs/ChangeLog/20220528.md
Normal file
216
docs/ChangeLog/20220528.md
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
# QMK Breaking Changes - 2022 May 28 Changelog
|
||||||
|
|
||||||
|
## Notable Features :id=notable-features
|
||||||
|
|
||||||
|
### Caps Word ([#16588](https://github.com/qmk/qmk_firmware/pull/16588)) :id=caps-word
|
||||||
|
|
||||||
|
This is a new feature that allows for capslock-like functionality that turns itself off at the end of the word.
|
||||||
|
|
||||||
|
For instance, if you wish to type "QMK" without holding shift the entire time, you can either tap both left and right shift, or double-tap shift, to turn on _Caps Word_ -- then type `qmk` (lowercase) without holding shift. Once you hit any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace, this will go back to normal typing!
|
||||||
|
|
||||||
|
There are other activation mechanisms as well as configurable options like timeout and the like -- see the [Caps Word documentation](feature_caps_word.md) for more information.
|
||||||
|
|
||||||
|
### Quantum Painter ([#10174](https://github.com/qmk/qmk_firmware/pull/10174)) :id=quantum-painter
|
||||||
|
|
||||||
|
QMK has had support for small OLED displays for some time now, but hasn't really gained too much ability to draw to panels other than the SSD1306 or SH1106 panels.
|
||||||
|
|
||||||
|
Quantum Painter is a new drawing subsystem available to suitable ARM and RISC-V boards that is capable of drawing to large panel RGB LCDs and RGB OLEDs. It also allows for a lot more flexibility with a larger set of drawing APIs -- lines, rectangles, circles, ellipses, text, images, and even animations.
|
||||||
|
|
||||||
|
The QMK CLI has new commands added to be able to generate images and fonts for Quantum Painter to digest -- it's even capable of converting animated gifs for display on screen.
|
||||||
|
|
||||||
|
See the [Quantum Painter documentation](quantum_painter.md) for more information on how to set up the displays as well as how to convert images and fonts.
|
||||||
|
|
||||||
|
!> Quantum Painter is not supported on AVR due to complexity and size constraints. Boards based on AVR such as ProMicro or Elite-C builds will not be able to leverage Quantum Painter.
|
||||||
|
|
||||||
|
### Encoder Mapping ([#13286](https://github.com/qmk/qmk_firmware/pull/13286)) :id=encoder-mapping
|
||||||
|
|
||||||
|
One of the long-standing complaints with Encoders is that there has been no easy way to configure them in user keymaps. [#13286](https://github.com/qmk/qmk_firmware/pull/13286) added support for [Encoder Mapping](feature_encoders.md#encoder-map), which allows users to define encoder functionality in a similar way to their normal keymap.
|
||||||
|
|
||||||
|
!> This is not yet supported by QMK Configurator. It is also unlikely to ever be supported by VIA.
|
||||||
|
|
||||||
|
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||||
|
|
||||||
|
### `RESET` => `QK_BOOT` ([#17037](https://github.com/qmk/qmk_firmware/pull/17037)) :id=reset-2-qk_boot
|
||||||
|
|
||||||
|
QMK is always in the process of picking up support for new hardware platforms. One of the side-effects for future integrations has shown that QMK's usage of `RESET` as a keycode is causing naming collisions. As a result, [#17037](https://github.com/qmk/qmk_firmware/pull/17037) changed usages of `RESET` to the new keycode `QK_BOOT` in the majority of default-like keymaps. At this stage the old keycode is still usable but will likely be removed in the next breaking changes cycle. Users with keymaps containing `RESET` should also move to `QK_BOOT`.
|
||||||
|
|
||||||
|
### Sendstring keycode overhaul ([#16941](https://github.com/qmk/qmk_firmware/pull/16941)) :id=sendstring-keycodes
|
||||||
|
|
||||||
|
Some keycodes used with `SEND_STRING` and its relatives have been deprecated and may have their old keycode usages removed at a later date. The list of [deprecated keycodes](https://github.com/qmk/qmk_firmware/blob/ebd402788346aa6e88bde1486b2a835684d40d39/quantum/send_string_keycodes.h#L456-L505) should be consulted to determine if you're using one of the older names (the first identifier after `#define`) -- you should swap to the newer variant (the second identifier on the same line).
|
||||||
|
|
||||||
|
### Pillow Installation ([#17133](https://github.com/qmk/qmk_firmware/pull/17133)) :id=pillow-install
|
||||||
|
|
||||||
|
The merge of Quantum Painter added some new dependencies in the QMK CLI, most notably _Pillow_, which requires some installation in order for the CLI to function. If you've got an existing installation, you'll need to run some commands in order to get things working:
|
||||||
|
|
||||||
|
On Windows, if using _QMK MSYS_ or _msys2_, you'll need to run the following command:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pacman --needed --noconfirm --disable-download-timeout -S mingw-w64-x86_64-python-pillow
|
||||||
|
python3 -m pip install --upgrade qmk
|
||||||
|
```
|
||||||
|
|
||||||
|
On macOS:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew update
|
||||||
|
brew upgrade qmk/qmk/qmk
|
||||||
|
```
|
||||||
|
|
||||||
|
On Linux or WSL:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
python3 -m pip install --user --upgrade qmk
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||||
|
|
||||||
|
The following keyboards have had their source moved within QMK:
|
||||||
|
|
||||||
|
| Old Keyboard Name | New Keyboard Name |
|
||||||
|
|----------------------|--------------------|
|
||||||
|
| absinthe | keyhive/absinthe |
|
||||||
|
| amj40 | amjkeyboard/amj40 |
|
||||||
|
| amj60 | amjkeyboard/amj60 |
|
||||||
|
| amj96 | amjkeyboard/amj96 |
|
||||||
|
| amjpad | amjkeyboard/amjpad |
|
||||||
|
| at101_bh | viktus/at101_bh |
|
||||||
|
| ergosaurus | keyhive/ergosaurus |
|
||||||
|
| gmmk/pro/ansi | gmmk/pro/rev1/ansi |
|
||||||
|
| gmmk/pro/iso | gmmk/pro/rev1/iso |
|
||||||
|
| honeycomb | keyhive/honeycomb |
|
||||||
|
| lattice60 | keyhive/lattice60 |
|
||||||
|
| melody96 | ymdk/melody96 |
|
||||||
|
| mt40 | mt/mt40 |
|
||||||
|
| mt64rgb | mt/mt64rgb |
|
||||||
|
| mt84 | mt/mt84 |
|
||||||
|
| mt980 | mt/mt980 |
|
||||||
|
| navi10 | keyhive/navi10 |
|
||||||
|
| omnikey_bh | viktus/omnikey_bh |
|
||||||
|
| opus | keyhive/opus |
|
||||||
|
| smallice | keyhive/smallice |
|
||||||
|
| southpole | keyhive/southpole |
|
||||||
|
| uno | keyhive/uno |
|
||||||
|
| ut472 | keyhive/ut472 |
|
||||||
|
| wheatfield/blocked65 | mt/blocked65 |
|
||||||
|
| wheatfield/split75 | mt/split75 |
|
||||||
|
| z150_bh | viktus/z150_bh |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Full changelist :id=full-changelist
|
||||||
|
|
||||||
|
Core:
|
||||||
|
* Quantum Painter ([#10174](https://github.com/qmk/qmk_firmware/pull/10174))
|
||||||
|
* Add support for encoder mapping. ([#13286](https://github.com/qmk/qmk_firmware/pull/13286))
|
||||||
|
* Add support for multiple switchs/solenoids to Haptic Feedback engine ([#15657](https://github.com/qmk/qmk_firmware/pull/15657))
|
||||||
|
* Add compile/make macro to core ([#15959](https://github.com/qmk/qmk_firmware/pull/15959))
|
||||||
|
* Add Reboot keycode to core ([#15990](https://github.com/qmk/qmk_firmware/pull/15990))
|
||||||
|
* Add support for multiple sensors to pmw3360 ([#15996](https://github.com/qmk/qmk_firmware/pull/15996))
|
||||||
|
* Asymmetric encoders, encoder tests. ([#16068](https://github.com/qmk/qmk_firmware/pull/16068))
|
||||||
|
* Add hacky via support for RGB Matrix ([#16086](https://github.com/qmk/qmk_firmware/pull/16086))
|
||||||
|
* Allow usage of AVRs minimal printf library ([#16266](https://github.com/qmk/qmk_firmware/pull/16266))
|
||||||
|
* Squeeze AVR some more with `-mrelax` and `-mcall-prologues` ([#16269](https://github.com/qmk/qmk_firmware/pull/16269))
|
||||||
|
* Heatmap incorrect matrix effect workaround ([#16315](https://github.com/qmk/qmk_firmware/pull/16315))
|
||||||
|
* Add SN74x154 driver and convert AL1 custom matrix ([#16331](https://github.com/qmk/qmk_firmware/pull/16331))
|
||||||
|
* Add customizable snake and knight animation increments ([#16337](https://github.com/qmk/qmk_firmware/pull/16337))
|
||||||
|
* Chibios USB protocol: allow overriding RAW Capacity ([#16339](https://github.com/qmk/qmk_firmware/pull/16339))
|
||||||
|
* HD44780 driver rework ([#16370](https://github.com/qmk/qmk_firmware/pull/16370))
|
||||||
|
* Update wb32-dfu ([#16438](https://github.com/qmk/qmk_firmware/pull/16438))
|
||||||
|
* Remove `send_unicode_hex_string()` ([#16518](https://github.com/qmk/qmk_firmware/pull/16518))
|
||||||
|
* Add :flash target for UF2 bootloaders ([#16525](https://github.com/qmk/qmk_firmware/pull/16525))
|
||||||
|
* Move `has_mouse_report_changed` function to `report.c` ([#16543](https://github.com/qmk/qmk_firmware/pull/16543))
|
||||||
|
* Move Doxygen docs to subdirectory ([#16561](https://github.com/qmk/qmk_firmware/pull/16561))
|
||||||
|
* Add Caps Word feature to core ([#16588](https://github.com/qmk/qmk_firmware/pull/16588))
|
||||||
|
* Add non blackpill F4x1 config files ([#16600](https://github.com/qmk/qmk_firmware/pull/16600))
|
||||||
|
* Force platform pin defs to be included ([#16611](https://github.com/qmk/qmk_firmware/pull/16611))
|
||||||
|
* Refactor CTPC logic to allow future converters ([#16621](https://github.com/qmk/qmk_firmware/pull/16621))
|
||||||
|
* Use a mutex guard for split shared memory ([#16647](https://github.com/qmk/qmk_firmware/pull/16647))
|
||||||
|
* Rename TICK to TICK_EVENT ([#16649](https://github.com/qmk/qmk_firmware/pull/16649))
|
||||||
|
* Add GET_TAPPING_TERM macro to reduce duplicate code ([#16681](https://github.com/qmk/qmk_firmware/pull/16681))
|
||||||
|
* add the ability to change the pwm frequency for the IS31FL3737B ([#16718](https://github.com/qmk/qmk_firmware/pull/16718))
|
||||||
|
* Joystick feature updates ([#16732](https://github.com/qmk/qmk_firmware/pull/16732))
|
||||||
|
* Add emulated eeprom support for STM32F303xE ([#16737](https://github.com/qmk/qmk_firmware/pull/16737))
|
||||||
|
* Refactor writePin to work with statements ([#16738](https://github.com/qmk/qmk_firmware/pull/16738))
|
||||||
|
* Add mechanism to limit available converters ([#16783](https://github.com/qmk/qmk_firmware/pull/16783))
|
||||||
|
* Implement XAP 'secure' core requirements ([#16843](https://github.com/qmk/qmk_firmware/pull/16843))
|
||||||
|
* rgblight: Add functions to stop blinking one or all but one layer ([#16859](https://github.com/qmk/qmk_firmware/pull/16859))
|
||||||
|
* Expose API for hardware unique ID ([#16869](https://github.com/qmk/qmk_firmware/pull/16869))
|
||||||
|
* Added support for Wb32fq95 ([#16871](https://github.com/qmk/qmk_firmware/pull/16871))
|
||||||
|
* Provide better config defaults for bluepill boards ([#16909](https://github.com/qmk/qmk_firmware/pull/16909))
|
||||||
|
* Joystick: Simplify report descriptor and clean up error messages ([#16926](https://github.com/qmk/qmk_firmware/pull/16926))
|
||||||
|
* Rename keymap_extras headers for consistency ([#16939](https://github.com/qmk/qmk_firmware/pull/16939))
|
||||||
|
* Sendstring keycode overhaul ([#16941](https://github.com/qmk/qmk_firmware/pull/16941))
|
||||||
|
* Move disable_jtag to platforms ([#16960](https://github.com/qmk/qmk_firmware/pull/16960))
|
||||||
|
* Remove ARM pgm_read_word workaround in rgblight ([#16961](https://github.com/qmk/qmk_firmware/pull/16961))
|
||||||
|
* Warn about LTO with arm_atsam, not ChibiOS. ([#17106](https://github.com/qmk/qmk_firmware/pull/17106))
|
||||||
|
|
||||||
|
CLI:
|
||||||
|
* Rework generate-api CLI command to use .build directory ([#16441](https://github.com/qmk/qmk_firmware/pull/16441))
|
||||||
|
* Change data driven "str" type to represent a quoted string literal ([#16516](https://github.com/qmk/qmk_firmware/pull/16516))
|
||||||
|
* Bump the 'jsonschema' version ([#16635](https://github.com/qmk/qmk_firmware/pull/16635))
|
||||||
|
* Add frameworking for development board presets ([#16637](https://github.com/qmk/qmk_firmware/pull/16637))
|
||||||
|
* Extend 'qmk info' to handle keymap level overrides ([#16702](https://github.com/qmk/qmk_firmware/pull/16702))
|
||||||
|
* Data driven `g_led_config` ([#16728](https://github.com/qmk/qmk_firmware/pull/16728))
|
||||||
|
* Allow new-keyboard to use development_board presets ([#16785](https://github.com/qmk/qmk_firmware/pull/16785))
|
||||||
|
* Also format *.hpp files. ([#16997](https://github.com/qmk/qmk_firmware/pull/16997))
|
||||||
|
|
||||||
|
Submodule updates:
|
||||||
|
* ChibiOS 21.11.1 update. ([#16251](https://github.com/qmk/qmk_firmware/pull/16251))
|
||||||
|
* Update ChibiOS-Contrib ([#16915](https://github.com/qmk/qmk_firmware/pull/16915))
|
||||||
|
|
||||||
|
Keyboards:
|
||||||
|
* chore: Add personal GMMK Pro keymap ([#15320](https://github.com/qmk/qmk_firmware/pull/15320))
|
||||||
|
* move melody96 to ymdk vendor folder ([#15680](https://github.com/qmk/qmk_firmware/pull/15680))
|
||||||
|
* move amj keyboards into amjkeyboard vendor folder ([#15733](https://github.com/qmk/qmk_firmware/pull/15733))
|
||||||
|
* move z150_bh at101_bh omnikey_bh to viktus/ ([#16004](https://github.com/qmk/qmk_firmware/pull/16004))
|
||||||
|
* MS Sculpt Mobile refactor ([#16038](https://github.com/qmk/qmk_firmware/pull/16038))
|
||||||
|
* move keyhive exclusive boards into /keyhive ([#16084](https://github.com/qmk/qmk_firmware/pull/16084))
|
||||||
|
* move 麦田 boards into /mt ([#16095](https://github.com/qmk/qmk_firmware/pull/16095))
|
||||||
|
* Convert Wasdat Code custom matrix to SN74x138 driver ([#16257](https://github.com/qmk/qmk_firmware/pull/16257))
|
||||||
|
* Move GMMK Pro to allow for multiple revisions ([#16423](https://github.com/qmk/qmk_firmware/pull/16423))
|
||||||
|
* Updated pin mapping and readme. ([#16505](https://github.com/qmk/qmk_firmware/pull/16505))
|
||||||
|
* Map data driven `DESCRIPTION` as string literal ([#16523](https://github.com/qmk/qmk_firmware/pull/16523))
|
||||||
|
* remove unecessary layers ([#16559](https://github.com/qmk/qmk_firmware/pull/16559))
|
||||||
|
* Helix/rev2 move to split common ([#16723](https://github.com/qmk/qmk_firmware/pull/16723))
|
||||||
|
* Remove some layout exceptions ([#16957](https://github.com/qmk/qmk_firmware/pull/16957))
|
||||||
|
* Refactor legacy quantum keycodes in default-ish keymaps ([#17037](https://github.com/qmk/qmk_firmware/pull/17037))
|
||||||
|
* Refactor legacy quantum keycodes in default-ish keymaps ([#17150](https://github.com/qmk/qmk_firmware/pull/17150))
|
||||||
|
|
||||||
|
Keyboard fixes:
|
||||||
|
* gboards/gergoplex: move `COMBO_ENABLE` to keymap level ([#16667](https://github.com/qmk/qmk_firmware/pull/16667))
|
||||||
|
* usb-usb converter: community layout support ([#16773](https://github.com/qmk/qmk_firmware/pull/16773))
|
||||||
|
* Fix build of `keyhive/uno`. ([#16891](https://github.com/qmk/qmk_firmware/pull/16891))
|
||||||
|
* Fix uno ([#16892](https://github.com/qmk/qmk_firmware/pull/16892))
|
||||||
|
* converter/usb_usb: remove surplus commas ([#17024](https://github.com/qmk/qmk_firmware/pull/17024))
|
||||||
|
* Various fixes for g_led_config lint warnings ([#17104](https://github.com/qmk/qmk_firmware/pull/17104))
|
||||||
|
|
||||||
|
Others:
|
||||||
|
* Add warning for CTPC/CONVERT_TO_PROTON_C. ([#16782](https://github.com/qmk/qmk_firmware/pull/16782))
|
||||||
|
* Add bluepill/blackpill development board presets ([#16806](https://github.com/qmk/qmk_firmware/pull/16806))
|
||||||
|
* Recommend pillow as part of manual MSYS install ([#17133](https://github.com/qmk/qmk_firmware/pull/17133))
|
||||||
|
|
||||||
|
Bugs:
|
||||||
|
* Fix one-shot locked modifiers ([#16114](https://github.com/qmk/qmk_firmware/pull/16114))
|
||||||
|
* Fix missing definition for non-encoder case. ([#16593](https://github.com/qmk/qmk_firmware/pull/16593))
|
||||||
|
* Fixup builds. ([#16596](https://github.com/qmk/qmk_firmware/pull/16596))
|
||||||
|
* Missed some erroneous prints. ([#16597](https://github.com/qmk/qmk_firmware/pull/16597))
|
||||||
|
* Workaround for pin_def errors on KINETIS based builds ([#16614](https://github.com/qmk/qmk_firmware/pull/16614))
|
||||||
|
* Fix flipped logic bug with One Shot `OS_ON` / `OS_OFF` keys ([#16617](https://github.com/qmk/qmk_firmware/pull/16617))
|
||||||
|
* Redo workaround for pin_def errors on KINETIS ([#16620](https://github.com/qmk/qmk_firmware/pull/16620))
|
||||||
|
* Fix oneshot toggle logic ([#16630](https://github.com/qmk/qmk_firmware/pull/16630))
|
||||||
|
* Mousekeys fix ([#16640](https://github.com/qmk/qmk_firmware/pull/16640))
|
||||||
|
* Ignore transport defaults if SPLIT_KEYBOARD is unset ([#16706](https://github.com/qmk/qmk_firmware/pull/16706))
|
||||||
|
* Fixes #16705 : digital rain follows val ([#16716](https://github.com/qmk/qmk_firmware/pull/16716))
|
||||||
|
* Fix AVR backlight breathing: low brightness limit & exceeding breathing table max index ([#16770](https://github.com/qmk/qmk_firmware/pull/16770))
|
||||||
|
* Fixed usb read loops not reading until timeout ([#16827](https://github.com/qmk/qmk_firmware/pull/16827))
|
||||||
|
* [QP] Check BPP capabilities before loading the palette ([#16863](https://github.com/qmk/qmk_firmware/pull/16863))
|
||||||
|
* Fix #16859. ([#16865](https://github.com/qmk/qmk_firmware/pull/16865))
|
||||||
|
* Preinstall python dependencies before executing `qmk`. ([#16874](https://github.com/qmk/qmk_firmware/pull/16874))
|
||||||
|
* Fixup AVR builds. ([#16875](https://github.com/qmk/qmk_firmware/pull/16875))
|
||||||
|
* Fix kinetic mouse mode ([#16951](https://github.com/qmk/qmk_firmware/pull/16951))
|
||||||
|
* Enhancement and fixes of "Secure" feature ([#16958](https://github.com/qmk/qmk_firmware/pull/16958))
|
||||||
|
* Check for ongoing transfers on the OUT endpoint ([#16974](https://github.com/qmk/qmk_firmware/pull/16974))
|
||||||
|
* MSYS2 install: add some Python dependencies through Pacman ([#17025](https://github.com/qmk/qmk_firmware/pull/17025))
|
||||||
|
* Revert "Fix kinetic mouse mode (#16951)" ([#17095](https://github.com/qmk/qmk_firmware/pull/17095))
|
||||||
|
* Workaround for recent -Werror=array-bounds AVR issues ([#17136](https://github.com/qmk/qmk_firmware/pull/17136))
|
||||||
|
* Bug fix: Continue Caps Word when AltGr (right Alt) is held. ([#17156](https://github.com/qmk/qmk_firmware/pull/17156))
|
||||||
@@ -37,7 +37,6 @@
|
|||||||
* Guides
|
* Guides
|
||||||
* [Customizing Functionality](custom_quantum_functions.md)
|
* [Customizing Functionality](custom_quantum_functions.md)
|
||||||
* [Driver Installation with Zadig](driver_installation_zadig.md)
|
* [Driver Installation with Zadig](driver_installation_zadig.md)
|
||||||
* [Easy Maker for One Offs](easy_maker.md)
|
|
||||||
* [Keymap Overview](keymap.md)
|
* [Keymap Overview](keymap.md)
|
||||||
* Development Environments
|
* Development Environments
|
||||||
* [Docker Guide](getting_started_docker.md)
|
* [Docker Guide](getting_started_docker.md)
|
||||||
@@ -53,9 +52,6 @@
|
|||||||
* [Your Fork](newbs_git_using_your_master_branch.md)
|
* [Your Fork](newbs_git_using_your_master_branch.md)
|
||||||
* [Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
|
* [Merge Conflicts](newbs_git_resolving_merge_conflicts.md)
|
||||||
* [Fixing Your Branch](newbs_git_resynchronize_a_branch.md)
|
* [Fixing Your Branch](newbs_git_resynchronize_a_branch.md)
|
||||||
* Keyboard Building
|
|
||||||
* [Hand Wiring Guide](hand_wire.md)
|
|
||||||
* [ISP Flashing Guide](isp_flashing_guide.md)
|
|
||||||
|
|
||||||
* Simple Keycodes
|
* Simple Keycodes
|
||||||
* [Full List](keycodes.md)
|
* [Full List](keycodes.md)
|
||||||
@@ -79,6 +75,7 @@
|
|||||||
|
|
||||||
* Software Features
|
* Software Features
|
||||||
* [Auto Shift](feature_auto_shift.md)
|
* [Auto Shift](feature_auto_shift.md)
|
||||||
|
* [Caps Word](feature_caps_word.md)
|
||||||
* [Combos](feature_combo.md)
|
* [Combos](feature_combo.md)
|
||||||
* [Debounce API](feature_debounce_type.md)
|
* [Debounce API](feature_debounce_type.md)
|
||||||
* [Key Lock](feature_key_lock.md)
|
* [Key Lock](feature_key_lock.md)
|
||||||
@@ -87,18 +84,20 @@
|
|||||||
* [One Shot Keys](one_shot_keys.md)
|
* [One Shot Keys](one_shot_keys.md)
|
||||||
* [Pointing Device](feature_pointing_device.md)
|
* [Pointing Device](feature_pointing_device.md)
|
||||||
* [Raw HID](feature_rawhid.md)
|
* [Raw HID](feature_rawhid.md)
|
||||||
|
* [Secure](feature_secure.md)
|
||||||
|
* [Send String](feature_send_string.md)
|
||||||
* [Sequencer](feature_sequencer.md)
|
* [Sequencer](feature_sequencer.md)
|
||||||
* [Swap Hands](feature_swap_hands.md)
|
* [Swap Hands](feature_swap_hands.md)
|
||||||
* [Tap Dance](feature_tap_dance.md)
|
* [Tap Dance](feature_tap_dance.md)
|
||||||
* [Tap-Hold Configuration](tap_hold.md)
|
* [Tap-Hold Configuration](tap_hold.md)
|
||||||
* [Terminal](feature_terminal.md)
|
|
||||||
* [Unicode](feature_unicode.md)
|
* [Unicode](feature_unicode.md)
|
||||||
* [Userspace](feature_userspace.md)
|
* [Userspace](feature_userspace.md)
|
||||||
* [WPM Calculation](feature_wpm.md)
|
* [WPM Calculation](feature_wpm.md)
|
||||||
|
|
||||||
* Hardware Features
|
* Hardware Features
|
||||||
* Displays
|
* Displays
|
||||||
* [HD44780 LCD Controller](feature_hd44780.md)
|
* [Quantum Painter](quantum_painter.md)
|
||||||
|
* [HD44780 LCD Driver](feature_hd44780.md)
|
||||||
* [ST7565 LCD Driver](feature_st7565.md)
|
* [ST7565 LCD Driver](feature_st7565.md)
|
||||||
* [OLED Driver](feature_oled_driver.md)
|
* [OLED Driver](feature_oled_driver.md)
|
||||||
* Lighting
|
* Lighting
|
||||||
@@ -109,6 +108,7 @@
|
|||||||
* [Audio](feature_audio.md)
|
* [Audio](feature_audio.md)
|
||||||
* [Bluetooth](feature_bluetooth.md)
|
* [Bluetooth](feature_bluetooth.md)
|
||||||
* [Bootmagic Lite](feature_bootmagic.md)
|
* [Bootmagic Lite](feature_bootmagic.md)
|
||||||
|
* [Converters](feature_converters.md)
|
||||||
* [Custom Matrix](custom_matrix.md)
|
* [Custom Matrix](custom_matrix.md)
|
||||||
* [Digitizer](feature_digitizer.md)
|
* [Digitizer](feature_digitizer.md)
|
||||||
* [DIP Switch](feature_dip_switch.md)
|
* [DIP Switch](feature_dip_switch.md)
|
||||||
@@ -117,24 +117,28 @@
|
|||||||
* [Joystick](feature_joystick.md)
|
* [Joystick](feature_joystick.md)
|
||||||
* [LED Indicators](feature_led_indicators.md)
|
* [LED Indicators](feature_led_indicators.md)
|
||||||
* [MIDI](feature_midi.md)
|
* [MIDI](feature_midi.md)
|
||||||
* [Proton C Conversion](proton_c_conversion.md)
|
|
||||||
* [PS/2 Mouse](feature_ps2_mouse.md)
|
* [PS/2 Mouse](feature_ps2_mouse.md)
|
||||||
* [Split Keyboard](feature_split_keyboard.md)
|
* [Split Keyboard](feature_split_keyboard.md)
|
||||||
* [Stenography](feature_stenography.md)
|
* [Stenography](feature_stenography.md)
|
||||||
* [Thermal Printer](feature_thermal_printer.md)
|
* [Thermal Printer](feature_thermal_printer.md)
|
||||||
* [Velocikey](feature_velocikey.md)
|
* [Velocikey](feature_velocikey.md)
|
||||||
|
|
||||||
|
* Keyboard Building
|
||||||
|
* [Easy Maker for One Offs](easy_maker.md)
|
||||||
|
* [Porting Keyboards](porting_your_keyboard_to_qmk.md)
|
||||||
|
* [Hand Wiring Guide](hand_wire.md)
|
||||||
|
* [ISP Flashing Guide](isp_flashing_guide.md)
|
||||||
|
|
||||||
* Developing QMK
|
* Developing QMK
|
||||||
* [PR Checklist](pr_checklist.md)
|
* [PR Checklist](pr_checklist.md)
|
||||||
* Breaking Changes
|
* Breaking Changes
|
||||||
* [Overview](breaking_changes.md)
|
* [Overview](breaking_changes.md)
|
||||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||||
* [Most Recent ChangeLog](ChangeLog/20211127.md "QMK v0.15.0 - 2021 Nov 27")
|
* [Most Recent ChangeLog](ChangeLog/20220528.md "QMK v0.17.0 - 2022 May 28")
|
||||||
* [Past Breaking Changes](breaking_changes_history.md)
|
* [Past Breaking Changes](breaking_changes_history.md)
|
||||||
|
|
||||||
* C Development
|
* C Development
|
||||||
* [ARM Debugging Guide](arm_debugging.md)
|
* [ARM Debugging Guide](arm_debugging.md)
|
||||||
* [AVR Processors](hardware_avr.md)
|
|
||||||
* [Coding Conventions](coding_conventions_c.md)
|
* [Coding Conventions](coding_conventions_c.md)
|
||||||
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||||
* [Drivers](hardware_drivers.md)
|
* [Drivers](hardware_drivers.md)
|
||||||
@@ -144,9 +148,10 @@
|
|||||||
* [SPI Driver](spi_driver.md)
|
* [SPI Driver](spi_driver.md)
|
||||||
* [WS2812 Driver](ws2812_driver.md)
|
* [WS2812 Driver](ws2812_driver.md)
|
||||||
* [EEPROM Driver](eeprom_driver.md)
|
* [EEPROM Driver](eeprom_driver.md)
|
||||||
|
* [Flash Driver](flash_driver.md)
|
||||||
* ['serial' Driver](serial_driver.md)
|
* ['serial' Driver](serial_driver.md)
|
||||||
* [UART Driver](uart_driver.md)
|
* [UART Driver](uart_driver.md)
|
||||||
* [GPIO Controls](internals_gpio_control.md)
|
* [GPIO Controls](gpio_control.md)
|
||||||
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
|
||||||
|
|
||||||
* Python Development
|
* Python Development
|
||||||
@@ -162,6 +167,8 @@
|
|||||||
* Arm/ChibiOS
|
* Arm/ChibiOS
|
||||||
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
|
* [Selecting an MCU](platformdev_selecting_arm_mcu.md)
|
||||||
* [Early initialization](platformdev_chibios_earlyinit.md)
|
* [Early initialization](platformdev_chibios_earlyinit.md)
|
||||||
|
* [Raspberry Pi RP2040](platformdev_rp2040.md)
|
||||||
|
* [Proton C](platformdev_proton_c.md)
|
||||||
|
|
||||||
* QMK Reference
|
* QMK Reference
|
||||||
* [Contributing to QMK](contributing.md)
|
* [Contributing to QMK](contributing.md)
|
||||||
@@ -182,10 +189,10 @@
|
|||||||
* [Understanding QMK](understanding_qmk.md)
|
* [Understanding QMK](understanding_qmk.md)
|
||||||
|
|
||||||
* QMK Internals (In Progress)
|
* QMK Internals (In Progress)
|
||||||
* [Defines](internals_defines.md)
|
* [Defines](internals/defines.md)
|
||||||
* [Input Callback Reg](internals_input_callback_reg.md)
|
* [Input Callback Reg](internals/input_callback_reg.md)
|
||||||
* [Midi Device](internals_midi_device.md)
|
* [Midi Device](internals/midi_device.md)
|
||||||
* [Midi Device Setup Process](internals_midi_device_setup_process.md)
|
* [Midi Device Setup Process](internals/midi_device_setup_process.md)
|
||||||
* [Midi Util](internals_midi_util.md)
|
* [Midi Util](internals/midi_util.md)
|
||||||
* [Send Functions](internals_send_functions.md)
|
* [Send Functions](internals/send_functions.md)
|
||||||
* [Sysex Tools](internals_sysex_tools.md)
|
* [Sysex Tools](internals/sysex_tools.md)
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
|||||||
|
|
||||||
## What has been included in past Breaking Changes?
|
## What has been included in past Breaking Changes?
|
||||||
|
|
||||||
|
* [2022 May 28](ChangeLog/20220528.md)
|
||||||
|
* [2022 Feb 26](ChangeLog/20220226.md)
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md)
|
* [2021 Nov 27](ChangeLog/20211127.md)
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md)
|
* [2021 Aug 28](ChangeLog/20210828.md)
|
||||||
* [2021 May 29](ChangeLog/20210529.md)
|
* [2021 May 29](ChangeLog/20210529.md)
|
||||||
@@ -20,17 +22,17 @@ The breaking change period is when we will merge PR's that change QMK in dangero
|
|||||||
|
|
||||||
## When is the next Breaking Change?
|
## When is the next Breaking Change?
|
||||||
|
|
||||||
The next Breaking Change is scheduled for February 26, 2022.
|
The next Breaking Change is scheduled for August 27, 2022.
|
||||||
|
|
||||||
### Important Dates
|
### Important Dates
|
||||||
|
|
||||||
* [x] 2021 Nov 27 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
* [x] 2022 May 28 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||||
* [ ] 2022 Jan 31 - `develop` closed to new PR's.
|
* [ ] 2022 Jul 31 - `develop` closed to new PR's.
|
||||||
* [ ] 2022 Jan 31 - Call for testers.
|
* [ ] 2022 Jul 31 - Call for testers.
|
||||||
* [ ] 2022 Feb 12 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
* [ ] 2022 Aug 13 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||||
* [ ] 2022 Feb 24 - `master` is locked, no PR's merged.
|
* [ ] 2022 Aug 25 - `master` is locked, no PR's merged.
|
||||||
* [ ] 2022 Feb 26 - Merge `develop` to `master`.
|
* [ ] 2022 Aug 27 - Merge `develop` to `master`.
|
||||||
* [ ] 2022 Feb 26 - `master` is unlocked. PR's can be merged again.
|
* [ ] 2022 Aug 27 - `master` is unlocked. PR's can be merged again.
|
||||||
|
|
||||||
## What changes will be included?
|
## What changes will be included?
|
||||||
|
|
||||||
@@ -41,32 +43,15 @@ If you want your breaking change to be included in this round you need to create
|
|||||||
Criteria for acceptance:
|
Criteria for acceptance:
|
||||||
|
|
||||||
* The PR is complete and ready to merge
|
* The PR is complete and ready to merge
|
||||||
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20220226`.
|
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20220827`.
|
||||||
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PR's ID.
|
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PR's ID.
|
||||||
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
|
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
|
||||||
|
|
||||||
# Checklists
|
## Checklists
|
||||||
|
|
||||||
This section documents various processes we use when running the Breaking Changes process.
|
This section documents various processes we use when running the Breaking Changes process.
|
||||||
|
|
||||||
## Creating the `develop` branch
|
### 4 Weeks Before Merge
|
||||||
|
|
||||||
This happens immediately after the previous `develop` branch is merged.
|
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
|
||||||
* [ ] `git checkout master`
|
|
||||||
* [ ] `git pull --ff-only`
|
|
||||||
* [ ] `git checkout -b develop`
|
|
||||||
* [ ] Edit `readme.md`
|
|
||||||
* [ ] Add a big notice at the top that this is a testing branch.
|
|
||||||
* [ ] Include a link to this document
|
|
||||||
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
|
||||||
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
|
||||||
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
|
||||||
* [ ] `git push upstream develop`
|
|
||||||
* [ ] `git push --tags`
|
|
||||||
|
|
||||||
## 4 Weeks Before Merge
|
|
||||||
|
|
||||||
* `develop` is now closed to new PR's, only fixes for current PR's may be merged
|
* `develop` is now closed to new PR's, only fixes for current PR's may be merged
|
||||||
* Post call for testers
|
* Post call for testers
|
||||||
@@ -74,7 +59,7 @@ This happens immediately after the previous `develop` branch is merged.
|
|||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
## 2 Weeks Before Merge
|
### 2 Weeks Before Merge
|
||||||
|
|
||||||
* `develop` is now closed to existing PR merges, only bugfixes for previous merges may be included
|
* `develop` is now closed to existing PR merges, only bugfixes for previous merges may be included
|
||||||
* Post call for testers
|
* Post call for testers
|
||||||
@@ -82,21 +67,21 @@ This happens immediately after the previous `develop` branch is merged.
|
|||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
## 1 Week Before Merge
|
### 1 Week Before Merge
|
||||||
|
|
||||||
* Announce that master will be closed from <2 Days Before> to <Day of Merge>
|
* Announce that master will be closed from <2 Days Before> to <Day of Merge>
|
||||||
* [ ] Discord
|
* [ ] Discord
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
## 2 Days Before Merge
|
### 2 Days Before Merge
|
||||||
|
|
||||||
* Announce that master is closed for 2 days
|
* Announce that master is closed for 2 days
|
||||||
* [ ] Discord
|
* [ ] Discord
|
||||||
* [ ] GitHub PR
|
* [ ] GitHub PR
|
||||||
* [ ] https://reddit.com/r/olkb
|
* [ ] https://reddit.com/r/olkb
|
||||||
|
|
||||||
## Day Of Merge
|
### Day Of Merge
|
||||||
|
|
||||||
* `qmk_firmware` git commands
|
* `qmk_firmware` git commands
|
||||||
* [ ] `git checkout develop`
|
* [ ] `git checkout develop`
|
||||||
@@ -113,8 +98,39 @@ This happens immediately after the previous `develop` branch is merged.
|
|||||||
* [ ] `git checkout master`
|
* [ ] `git checkout master`
|
||||||
* [ ] `git pull --ff-only`
|
* [ ] `git pull --ff-only`
|
||||||
* [ ] `git merge --no-ff develop`
|
* [ ] `git merge --no-ff develop`
|
||||||
|
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
|
||||||
|
* [ ] `git push upstream <next_version>`
|
||||||
* [ ] `git push upstream master`
|
* [ ] `git push upstream master`
|
||||||
|
|
||||||
## Post-merge operations
|
## Post-merge operations
|
||||||
|
|
||||||
|
### Updating the `develop` branch
|
||||||
|
|
||||||
|
This happens immediately after the previous `develop` branch is merged to `master`.
|
||||||
|
|
||||||
|
* `qmk_firmware` git commands
|
||||||
|
* [ ] `git checkout master`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git checkout develop`
|
||||||
|
* [ ] `git pull --ff-only`
|
||||||
|
* [ ] `git merge --no-ff master`
|
||||||
|
* [ ] Edit `readme.md`
|
||||||
|
* [ ] Add a big notice at the top that this is a testing branch.
|
||||||
|
* [ ] Include a link to this document
|
||||||
|
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
|
||||||
|
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
|
||||||
|
* [ ] `git push upstream breakpoint_<YYYY>_<MM>_<DD>`
|
||||||
|
|
||||||
|
* All submodules under `lib` now need to be checked against their QMK-based forks:
|
||||||
|
* [ ] `git submodule foreach git log -n1`
|
||||||
|
* [ ] Validate each submodule SHA1 matches the qmk fork, e.g. for ChibiOS:
|
||||||
|
* Go to [qmk/ChibiOS](https://github.com/qmk/ChibiOS)
|
||||||
|
* Compare the commit hash in the above output to the commit hash in the repository
|
||||||
|
* If there's a mismatch:
|
||||||
|
* [ ] `cd lib/chibios`
|
||||||
|
* [ ] `git fetch --all`
|
||||||
|
* [ ] `git checkout master`
|
||||||
|
* [ ] `git reset --hard <commit hash>`
|
||||||
|
* [ ] `git push origin master --force-with-lease`
|
||||||
|
|
||||||
* (Optional) [update ChibiOS + ChibiOS-Contrib on `develop`](chibios_upgrade_instructions.md)
|
* (Optional) [update ChibiOS + ChibiOS-Contrib on `develop`](chibios_upgrade_instructions.md)
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||||
|
|
||||||
|
* [2022 May 28](ChangeLog/20220528.md) - version 0.17.0
|
||||||
|
* [2022 Feb 26](ChangeLog/20220226.md) - version 0.16.0
|
||||||
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
* [2021 Nov 27](ChangeLog/20211127.md) - version 0.15.0
|
||||||
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
* [2021 Aug 28](ChangeLog/20210828.md) - version 0.14.0
|
||||||
* [2021 May 29](ChangeLog/20210529.md) - version 0.13.0
|
* [2021 May 29](ChangeLog/20210529.md) - version 0.13.0
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ Any arguments that are not provided will prompt for input. If `-u` is not passed
|
|||||||
**Usage**:
|
**Usage**:
|
||||||
|
|
||||||
```
|
```
|
||||||
qmk new-keyboard [-kb KEYBOARD] [-t {avr,ps2avrgb}] -u USERNAME
|
qmk new-keyboard [-kb KEYBOARD] [-t {atmega32u4,STM32F303,etc}] [-l {60_ansi,75_iso,etc}] -u USERNAME
|
||||||
```
|
```
|
||||||
|
|
||||||
## `qmk new-keymap`
|
## `qmk new-keymap`
|
||||||
@@ -335,6 +335,90 @@ This command cleans up the `.build` folder. If `--all` is passed, any .hex or .b
|
|||||||
qmk clean [-a]
|
qmk clean [-a]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## `qmk via2json`
|
||||||
|
|
||||||
|
This command an generate a keymap.json from a VIA keymap backup. Both the layers and the macros are converted, enabling users to easily move away from a VIA-enabled firmware without writing any code or reimplementing their keymaps in QMK Configurator.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk via2json -kb KEYBOARD [-l LAYOUT] [-km KEYMAP] [-o OUTPUT] filename
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk via2json -kb ai03/polaris -o polaris_keymap.json polaris_via_backup.json
|
||||||
|
Ψ Wrote keymap to /home/you/qmk_firmware/polaris_keymap.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk import-keyboard`
|
||||||
|
|
||||||
|
This command imports a data-driven `info.json` keyboard into the repo.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
usage: qmk import-keyboard [-h] filename
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk import-keyboard ~/Downloads/forever60.json
|
||||||
|
Ψ Importing forever60.json.
|
||||||
|
|
||||||
|
Ψ Imported a new keyboard named forever60.
|
||||||
|
Ψ To start working on things, `cd` into keyboards/forever60,
|
||||||
|
Ψ or open the directory in your preferred text editor.
|
||||||
|
Ψ And build with qmk compile -kb forever60 -km default.
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk import-keymap`
|
||||||
|
|
||||||
|
This command imports a data-driven `keymap.json` keymap into the repo.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
usage: qmk import-keymap [-h] filename
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
qmk import-keymap ~/Downloads/asdf2.json
|
||||||
|
Ψ Importing asdf2.json.
|
||||||
|
|
||||||
|
Ψ Imported a new keymap named asdf2.
|
||||||
|
Ψ To start working on things, `cd` into keyboards/takashicompany/dogtag/keymaps/asdf2,
|
||||||
|
Ψ or open the directory in your preferred text editor.
|
||||||
|
Ψ And build with qmk compile -kb takashicompany/dogtag -km asdf2.
|
||||||
|
```
|
||||||
|
|
||||||
|
## `qmk import-kbfirmware`
|
||||||
|
|
||||||
|
This command creates a new keyboard based on a [Keyboard Firmware Builder](https://kbfirmware.com/) export.
|
||||||
|
|
||||||
|
**Usage**:
|
||||||
|
|
||||||
|
```
|
||||||
|
usage: qmk import-kbfirmware [-h] filename
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```
|
||||||
|
$ qmk import-kbfirmware ~/Downloads/gh62.json
|
||||||
|
Ψ Importing gh62.json.
|
||||||
|
|
||||||
|
⚠ Support here is basic - Consider using 'qmk new-keyboard' instead
|
||||||
|
Ψ Imported a new keyboard named gh62.
|
||||||
|
Ψ To start working on things, `cd` into keyboards/gh62,
|
||||||
|
Ψ or open the directory in your preferred text editor.
|
||||||
|
Ψ And build with qmk compile -kb gh62 -km default.
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Developer Commands
|
# Developer Commands
|
||||||
@@ -498,3 +582,16 @@ Run single test:
|
|||||||
|
|
||||||
qmk pytest -t qmk.tests.test_cli_commands.test_c2json
|
qmk pytest -t qmk.tests.test_cli_commands.test_c2json
|
||||||
qmk pytest -t qmk.tests.test_qmk_path
|
qmk pytest -t qmk.tests.test_qmk_path
|
||||||
|
|
||||||
|
## `qmk painter-convert-graphics`
|
||||||
|
|
||||||
|
This command converts images to a format usable by QMK, i.e. the QGF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
||||||
|
|
||||||
|
## `qmk painter-make-font-image`
|
||||||
|
|
||||||
|
This command converts a TTF font to an intermediate format for editing, before converting to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
||||||
|
|
||||||
|
## `qmk painter-convert-font-image`
|
||||||
|
|
||||||
|
This command converts an intermediate font image to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
|
||||||
|
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ cli.log.info('Reading from %s and writing to %s', cli.args.filename, cli.args.ou
|
|||||||
|
|
||||||
# Testing, and Linting, and Formatting (oh my!)
|
# Testing, and Linting, and Formatting (oh my!)
|
||||||
|
|
||||||
We use nose2, flake8, and yapf to test, lint, and format code. You can use the `pytest` and `format-py` subcommands to run these tests:
|
We use nose2, flake8, and yapf to test, lint, and format code. You can use the `pytest` and `format-python` subcommands to run these tests:
|
||||||
|
|
||||||
### Testing and Linting
|
### Testing and Linting
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ We use nose2, flake8, and yapf to test, lint, and format code. You can use the `
|
|||||||
|
|
||||||
### Formatting
|
### Formatting
|
||||||
|
|
||||||
qmk format-py
|
qmk format-python
|
||||||
|
|
||||||
## Formatting Details
|
## Formatting Details
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ Add this to the end of your `.profile` or `.bashrc`:
|
|||||||
|
|
||||||
If you put `qmk_firmware` into another location you will need to adjust this path.
|
If you put `qmk_firmware` into another location you will need to adjust this path.
|
||||||
|
|
||||||
|
Zsh users will need to load `bashcompinit`. The following can be added to `~/.zshrc` file:
|
||||||
|
|
||||||
|
autoload -Uz bashcompinit && bashcompinit
|
||||||
|
|
||||||
### System Wide Symlink
|
### System Wide Symlink
|
||||||
|
|
||||||
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:
|
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# Compatible Microcontrollers
|
# Compatible Microcontrollers
|
||||||
|
|
||||||
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB or more, though it will *just* squeeze into 16kB with most features disabled.
|
QMK runs on any USB-capable AVR or ARM microcontroller with enough flash space - generally 32kB+ for AVR, and 64kB+ for ARM. With significant disabling of features, QMK may *just* squeeze into 16kB AVR MCUs.
|
||||||
|
|
||||||
|
Features within QMK may or may not be compatible with every microcontroller.
|
||||||
|
|
||||||
## Atmel AVR
|
## Atmel AVR
|
||||||
|
|
||||||
@@ -8,7 +10,11 @@ The following use [LUFA](https://www.fourwalledcubicle.com/LUFA.php) as the USB
|
|||||||
|
|
||||||
* [ATmega16U2](https://www.microchip.com/wwwproducts/en/ATmega16U2) / [ATmega32U2](https://www.microchip.com/wwwproducts/en/ATmega32U2)
|
* [ATmega16U2](https://www.microchip.com/wwwproducts/en/ATmega16U2) / [ATmega32U2](https://www.microchip.com/wwwproducts/en/ATmega32U2)
|
||||||
* [ATmega16U4](https://www.microchip.com/wwwproducts/en/ATmega16U4) / [ATmega32U4](https://www.microchip.com/wwwproducts/en/ATmega32U4)
|
* [ATmega16U4](https://www.microchip.com/wwwproducts/en/ATmega16U4) / [ATmega32U4](https://www.microchip.com/wwwproducts/en/ATmega32U4)
|
||||||
|
* SparkFun Pro Micro (and clones)
|
||||||
|
* PJRC Teensy 2.0
|
||||||
|
* Adafruit Feather 32U4
|
||||||
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
* [AT90USB64](https://www.microchip.com/wwwproducts/en/AT90USB646) / [AT90USB128](https://www.microchip.com/wwwproducts/en/AT90USB1286)
|
||||||
|
* PJRC Teensy++ 2.0
|
||||||
* [AT90USB162](https://www.microchip.com/wwwproducts/en/AT90USB162)
|
* [AT90USB162](https://www.microchip.com/wwwproducts/en/AT90USB162)
|
||||||
|
|
||||||
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
Certain MCUs which do not have native USB will use [V-USB](https://www.obdev.at/products/vusb/index.html) instead:
|
||||||
@@ -25,33 +31,51 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
|||||||
|
|
||||||
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
* [STM32F0x2](https://www.st.com/en/microcontrollers-microprocessors/stm32f0x2.html)
|
||||||
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
* [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)
|
||||||
|
* Bluepill (with STM32duino bootloader)
|
||||||
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
* [STM32F303](https://www.st.com/en/microcontrollers-microprocessors/stm32f303.html)
|
||||||
|
* QMK Proton-C
|
||||||
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
* [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)
|
||||||
|
* WeAct Blackpill
|
||||||
* [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
|
* [STM32F405](https://www.st.com/en/microcontrollers-microprocessors/stm32f405-415.html)
|
||||||
* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
|
* [STM32F407](https://www.st.com/en/microcontrollers-microprocessors/stm32f407-417.html)
|
||||||
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
* [STM32F411](https://www.st.com/en/microcontrollers-microprocessors/stm32f411.html)
|
||||||
|
* WeAct Blackpill
|
||||||
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
* [STM32F446](https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html)
|
||||||
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
* [STM32G431](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x1.html)
|
||||||
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
* [STM32G474](https://www.st.com/en/microcontrollers-microprocessors/stm32g4x4.html)
|
||||||
* [STM32L412](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
* [STM32L412](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L422](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
* [STM32L422](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
|
* [STM32L432](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
* [STM32L433](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||||
|
* [STM32L442](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x2.html)
|
||||||
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
* [STM32L443](https://www.st.com/en/microcontrollers-microprocessors/stm32l4x3.html)
|
||||||
|
|
||||||
### WestBerryTech (WB32)
|
### WestBerryTech (WB32)
|
||||||
|
|
||||||
* [WB32F3G71xx](http://www.westberrytech.com)
|
* [WB32F3G71xx](http://www.westberrytech.com)
|
||||||
|
* [WB32FQ95xx](http://www.westberrytech.com)
|
||||||
|
|
||||||
### NXP (Kinetis)
|
### NXP (Kinetis)
|
||||||
|
|
||||||
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||||
|
* PJRC Teensy LC
|
||||||
* [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
|
* [MK20DX128](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-50-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-based-on-arm-cortex-m4-core:K20_50)
|
||||||
* [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
* [MK20DX256](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
||||||
|
* PJRC Teensy 3.2
|
||||||
|
* [MK64FX512](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k64-120-mhz-256-kb-sram-microcontrollers-mcus-based-on-arm-cortex-m4-core:K64_120)
|
||||||
|
* PJRC Teensy 3.5
|
||||||
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
|
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
|
||||||
|
* PJRC Teensy 3.6
|
||||||
|
|
||||||
|
### Raspberry Pi
|
||||||
|
|
||||||
|
* [RP2040](https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html)
|
||||||
|
|
||||||
|
For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040.md).
|
||||||
|
|
||||||
## Atmel ATSAM
|
## Atmel ATSAM
|
||||||
|
|
||||||
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop).
|
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware.
|
||||||
|
|
||||||
## RISC-V
|
## RISC-V
|
||||||
|
|
||||||
|
|||||||
@@ -107,8 +107,10 @@ This is a C header file that is one of the first things included, and will persi
|
|||||||
* sets the maximum power (in mA) over USB for the device (default: 500)
|
* sets the maximum power (in mA) over USB for the device (default: 500)
|
||||||
* `#define USB_POLLING_INTERVAL_MS 10`
|
* `#define USB_POLLING_INTERVAL_MS 10`
|
||||||
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
|
* sets the USB polling rate in milliseconds for the keyboard, mouse, and shared (NKRO/media keys) interfaces
|
||||||
* `#define USB_SUSPEND_WAKEUP_DELAY 200`
|
* `#define USB_SUSPEND_WAKEUP_DELAY 0`
|
||||||
* set the number of milliseconde to pause after sending a wakeup packet
|
* sets the number of milliseconds to pause after sending a wakeup packet.
|
||||||
|
Disabled by default, you might want to set this to 200 (or higher) if the
|
||||||
|
keyboard does not wake up properly after suspending.
|
||||||
* `#define F_SCL 100000L`
|
* `#define F_SCL 100000L`
|
||||||
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
|
* sets the I2C clock rate speed for keyboards using I2C. The default is `400000L`, except for keyboards using `split_common`, where the default is `100000L`.
|
||||||
|
|
||||||
@@ -126,15 +128,13 @@ If you define these options you will disable the associated feature, which can s
|
|||||||
* disable tap dance and other tapping features
|
* disable tap dance and other tapping features
|
||||||
* `#define NO_ACTION_ONESHOT`
|
* `#define NO_ACTION_ONESHOT`
|
||||||
* disable one-shot modifiers
|
* disable one-shot modifiers
|
||||||
* `#define NO_ACTION_MACRO`
|
|
||||||
* disable old-style macro handling using `MACRO()`, `action_get_macro()` _(deprecated)_
|
|
||||||
* `#define NO_ACTION_FUNCTION`
|
|
||||||
* disable old-style function handling using `fn_actions`, `action_function()` _(deprecated)_
|
|
||||||
|
|
||||||
## Features That Can Be Enabled
|
## Features That Can Be Enabled
|
||||||
|
|
||||||
If you define these options you will enable the associated feature, which may increase your code size.
|
If you define these options you will enable the associated feature, which may increase your code size.
|
||||||
|
|
||||||
|
* `#define ENABLE_COMPILE_KEYCODE`
|
||||||
|
* Enables the `QK_MAKE` keycode
|
||||||
* `#define FORCE_NKRO`
|
* `#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.
|
* 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`
|
* `#define STRICT_LAYER_RELEASE`
|
||||||
@@ -143,7 +143,7 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
## Behaviors That Can Be Configured
|
## Behaviors That Can Be Configured
|
||||||
|
|
||||||
* `#define TAPPING_TERM 200`
|
* `#define TAPPING_TERM 200`
|
||||||
* how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
|
* how long before a key press becomes a hold
|
||||||
* `#define TAPPING_TERM_PER_KEY`
|
* `#define TAPPING_TERM_PER_KEY`
|
||||||
* enables handling for per key `TAPPING_TERM` settings
|
* enables handling for per key `TAPPING_TERM` settings
|
||||||
* `#define RETRO_TAPPING`
|
* `#define RETRO_TAPPING`
|
||||||
@@ -176,6 +176,8 @@ If you define these options you will enable the associated feature, which may in
|
|||||||
* sets the timer for leader key chords to run on each key press rather than overall
|
* sets the timer for leader key chords to run on each key press rather than overall
|
||||||
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
|
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
|
||||||
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
|
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
|
||||||
|
* `#define MOUSE_EXTENDED_REPORT`
|
||||||
|
* Enables support for extended reports (-32767 to 32767, instead of -127 to 127), which may allow for smoother reporting, and prevent maxing out of the reports. Applies to both Pointing Device and Mousekeys.
|
||||||
* `#define ONESHOT_TIMEOUT 300`
|
* `#define ONESHOT_TIMEOUT 300`
|
||||||
* how long before oneshot times out
|
* how long before oneshot times out
|
||||||
* `#define ONESHOT_TAP_TOGGLE 2`
|
* `#define ONESHOT_TAP_TOGGLE 2`
|
||||||
@@ -385,7 +387,6 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
|
|||||||
* A list of [layouts](feature_layouts.md) this keyboard supports.
|
* A list of [layouts](feature_layouts.md) this keyboard supports.
|
||||||
* `LTO_ENABLE`
|
* `LTO_ENABLE`
|
||||||
* Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
|
* Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
|
||||||
However, this will automatically disable the legacy TMK Macros and Functions features, as these break when LTO is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`. (Note: This does not affect QMK [Macros](feature_macros.md) and [Layers](feature_layers.md).)
|
|
||||||
|
|
||||||
## AVR MCU Options
|
## AVR MCU Options
|
||||||
* `MCU = atmega32u4`
|
* `MCU = atmega32u4`
|
||||||
@@ -436,8 +437,8 @@ Use these to enable or disable building certain features. The more you have enab
|
|||||||
* MIDI controls
|
* MIDI controls
|
||||||
* `UNICODE_ENABLE`
|
* `UNICODE_ENABLE`
|
||||||
* Unicode
|
* Unicode
|
||||||
* `BLUETOOTH`
|
* `BLUETOOTH_ENABLE`
|
||||||
* Current options are AdafruitBLE, RN42
|
* Current options are BluefruitLE, RN42
|
||||||
* `SPLIT_KEYBOARD`
|
* `SPLIT_KEYBOARD`
|
||||||
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
|
* Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common
|
||||||
* `CUSTOM_MATRIX`
|
* `CUSTOM_MATRIX`
|
||||||
|
|||||||
@@ -81,17 +81,17 @@ void matrix_init(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t matrix_scan(void) {
|
uint8_t matrix_scan(void) {
|
||||||
bool matrix_has_changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
// TODO: add matrix scanning routine here
|
// TODO: add matrix scanning routine here
|
||||||
|
|
||||||
// Unless hardware debouncing - use the configured debounce routine
|
// Unless hardware debouncing - use the configured debounce routine
|
||||||
debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
|
changed = debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
|
||||||
|
|
||||||
// This *must* be called for correct keyboard behavior
|
// This *must* be called for correct keyboard behavior
|
||||||
matrix_scan_quantum();
|
matrix_scan_quantum();
|
||||||
|
|
||||||
return matrix_has_changed;
|
return changed;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ In other cases you should group like options together in an `object`. This is pa
|
|||||||
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
|
In most cases you can add a simple mapping. These are maintained as JSON files in `data/mappings/info_config.json` and `data/mappings/info_rules.json`, and control mapping for `config.h` and `rules.mk`, respectively. Each mapping is keyed by the `config.h` or `rules.mk` variable, and the value is a hash with the following keys:
|
||||||
|
|
||||||
* `info_key`: (required) The location within `info.json` for this value. See below.
|
* `info_key`: (required) The location within `info.json` for this value. See below.
|
||||||
* `value_type`: (optional) Default `str`. The format for this variable's value. See below.
|
* `value_type`: (optional) Default `raw`. The format for this variable's value. See below.
|
||||||
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
|
* `to_json`: (optional) Default `true`. Set to `false` to exclude this mapping from info.json
|
||||||
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
|
* `to_c`: (optional) Default `true`. Set to `false` to exclude this mapping from config.h
|
||||||
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
|
* `warn_duplicate`: (optional) Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||||
@@ -57,7 +57,7 @@ Under the hood we use [Dotty Dict](https://dotty-dict.readthedocs.io/en/latest/)
|
|||||||
|
|
||||||
#### Value Types
|
#### Value Types
|
||||||
|
|
||||||
By default we treat all values as simple strings. If your value is more complex you can use one of these types to intelligently parse the data:
|
By default we treat all values as unquoted "raw" data. If your value is more complex you can use one of these types to intelligently parse the data:
|
||||||
|
|
||||||
* `array`: A comma separated array of strings
|
* `array`: A comma separated array of strings
|
||||||
* `array.int`: A comma separated array of integers
|
* `array.int`: A comma separated array of integers
|
||||||
@@ -65,6 +65,7 @@ By default we treat all values as simple strings. If your value is more complex
|
|||||||
* `hex`: A number formatted as hex
|
* `hex`: A number formatted as hex
|
||||||
* `list`: A space separate array of strings
|
* `list`: A space separate array of strings
|
||||||
* `mapping`: A hash of key/value pairs
|
* `mapping`: A hash of key/value pairs
|
||||||
|
* `str`: A quoted string literal
|
||||||
|
|
||||||
### Add code to extract it
|
### Add code to extract it
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,15 @@
|
|||||||
|
|
||||||
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
|
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
|
||||||
|
|
||||||
|
Selecting the EEPROM driver is done in your keyboard's `rules.mk`:
|
||||||
|
|
||||||
Driver | Description
|
Driver | Description
|
||||||
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
|
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
|
||||||
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
|
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
|
||||||
`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
|
`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
|
||||||
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
|
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
|
||||||
|
`EEPROM_DRIVER = wear_leveling` | Frontend driver for the wear_leveling system, allowing for EEPROM emulation on top of flash -- both in-MCU and external SPI NOR flash.
|
||||||
|
|
||||||
## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration
|
## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration
|
||||||
|
|
||||||
@@ -43,8 +46,9 @@ Module | Equivalent `#define` | Source
|
|||||||
-----------------|---------------------------------|------------------------------------------
|
-----------------|---------------------------------|------------------------------------------
|
||||||
CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` | <https://www.sparkfun.com/products/14764>
|
CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` | <https://www.sparkfun.com/products/14764>
|
||||||
RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` | <https://www.sparkfun.com/products/14764>
|
RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` | <https://www.sparkfun.com/products/14764>
|
||||||
24LC64 EEPROM | `#define EEPROM_I2C_24LC64` | <https://www.microchip.com/wwwproducts/en/24LC64>
|
24LC32A EEPROM | `#define EEPROM_I2C_24LC32A` | <https://www.microchip.com/en-us/product/24LC32A>
|
||||||
24LC128 EEPROM | `#define EEPROM_I2C_24LC128` | <https://www.microchip.com/wwwproducts/en/24LC128>
|
24LC64 EEPROM | `#define EEPROM_I2C_24LC64` | <https://www.microchip.com/en-us/product/24LC64>
|
||||||
|
24LC128 EEPROM | `#define EEPROM_I2C_24LC128` | <https://www.microchip.com/en-us/product/24LC128>
|
||||||
24LC256 EEPROM | `#define EEPROM_I2C_24LC256` | <https://www.sparkfun.com/products/525>
|
24LC256 EEPROM | `#define EEPROM_I2C_24LC256` | <https://www.sparkfun.com/products/525>
|
||||||
MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/product/1895>
|
MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/product/1895>
|
||||||
|
|
||||||
@@ -54,13 +58,13 @@ MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/p
|
|||||||
|
|
||||||
Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
|
Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
|
||||||
|
|
||||||
`config.h` override | Description | Default Value
|
`config.h` override | Default Value | Description
|
||||||
-----------------------------------------------|--------------------------------------------------------------------------------------|--------------
|
-----------------------------------------------|---------------|-------------------------------------------------------------------------------------
|
||||||
`#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | SPI Slave select pin in order to inform that the EEPROM is currently being addressed | _none_
|
`#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | _none_ | SPI Slave select pin in order to inform that the EEPROM is currently being addressed
|
||||||
`#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | Clock divisor used to divide the peripheral clock to derive the SPI frequency | `64`
|
`#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | `64` | Clock divisor used to divide the peripheral clock to derive the SPI frequency
|
||||||
`#define EXTERNAL_EEPROM_BYTE_COUNT` | Total size of the EEPROM in bytes | 8192
|
`#define EXTERNAL_EEPROM_BYTE_COUNT` | `8192` | Total size of the EEPROM in bytes
|
||||||
`#define EXTERNAL_EEPROM_PAGE_SIZE` | Page size of the EEPROM in bytes, as specified in the datasheet | 32
|
`#define EXTERNAL_EEPROM_PAGE_SIZE` | `32` | Page size of the EEPROM in bytes, as specified in the datasheet
|
||||||
`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | The number of bytes to transmit for the memory location within the EEPROM | 2
|
`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | `2` | The number of bytes to transmit for the memory location within the EEPROM
|
||||||
|
|
||||||
!> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
|
!> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
|
||||||
|
|
||||||
@@ -73,3 +77,84 @@ The only configurable item for the transient EEPROM driver is its size:
|
|||||||
`#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64
|
`#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64
|
||||||
|
|
||||||
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`.
|
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`.
|
||||||
|
|
||||||
|
## Wear-leveling Driver Configuration :id=wear_leveling-eeprom-driver-configuration
|
||||||
|
|
||||||
|
The wear-leveling driver uses an algorithm to minimise the number of erase cycles on the underlying MCU flash memory.
|
||||||
|
|
||||||
|
There is no specific configuration for this driver, but the wear-leveling system used by this driver may need configuration. See the [wear-leveling configuration](#wear_leveling-configuration) section for more information.
|
||||||
|
|
||||||
|
# Wear-leveling Configuration :id=wear_leveling-configuration
|
||||||
|
|
||||||
|
The wear-leveling driver has a few possible _backing stores_ that may be used by adding to your keyboard's `rules.mk` file:
|
||||||
|
|
||||||
|
Driver | Description
|
||||||
|
----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
`WEAR_LEVELING_DRIVER = embedded_flash` | This driver is used for emulating EEPROM by writing to embedded flash on the MCU.
|
||||||
|
`WEAR_LEVELING_DRIVER = spi_flash` | This driver is used to address external SPI NOR Flash peripherals.
|
||||||
|
`WEAR_LEVELING_DRIVER = rp2040_flash` | This driver is used to write to the same storage the RP2040 executes code from.
|
||||||
|
`WEAR_LEVELING_DRIVER = legacy` | This driver is the "legacy" emulated EEPROM provided in historical revisions of QMK. Currently used for STM32F0xx and STM32F4x1, but slated for deprecation and removal once `embedded_flash` support for those MCU families is complete.
|
||||||
|
|
||||||
|
!> All wear-leveling drivers require an amount of RAM equivalent to the selected logical EEPROM size. Increasing the size to 32kB of EEPROM requires 32kB of RAM, which a significant number of MCUs simply do not have.
|
||||||
|
|
||||||
|
## Wear-leveling Embedded Flash Driver Configuration :id=wear_leveling-efl-driver-configuration
|
||||||
|
|
||||||
|
This driver performs writes to the embedded flash storage embedded in the MCU. In most circumstances, the last few of sectors of flash are used in order to minimise the likelihood of collision with program code.
|
||||||
|
|
||||||
|
Configurable options in your keyboard's `config.h`:
|
||||||
|
|
||||||
|
`config.h` override | Default | Description
|
||||||
|
-----------------------------------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
`#define WEAR_LEVELING_EFL_FIRST_SECTOR` | _unset_ | The first sector on the MCU to use. By default this is not defined and calculated at runtime based on the MCU. However, different flash sizes on MCUs may require custom configuration.
|
||||||
|
`#define WEAR_LEVELING_EFL_FLASH_SIZE` | _unset_ | Allows overriding the flash size available for use for wear-leveling. Under normal circumstances this is automatically calculated and should not need to be overridden. Specifying a size larger than the amount actually available in flash will usually prevent the MCU from booting.
|
||||||
|
`#define WEAR_LEVELING_LOGICAL_SIZE` | `1024` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
|
||||||
|
`#define WEAR_LEVELING_BACKING_SIZE` | `2048` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
|
||||||
|
`#define BACKING_STORE_WRITE_SIZE` | _automatic_ | The byte width of the underlying write used on the MCU, and is usually automatically determined from the selected MCU family. If an error occurs in the auto-detection, you'll need to consult the MCU's datasheet and determine this value, specifying it directly.
|
||||||
|
|
||||||
|
!> If your MCU does not boot after swapping to the EFL wear-leveling driver, it's likely that the flash size is incorrectly detected, usually as an MCU with larger flash and may require overriding.
|
||||||
|
|
||||||
|
## Wear-leveling SPI Flash Driver Configuration :id=wear_leveling-flash_spi-driver-configuration
|
||||||
|
|
||||||
|
This driver performs writes to an external SPI NOR Flash peripheral. It also requires a working configuration for the SPI NOR Flash peripheral -- see the [flash driver](flash_driver.md) documentation for more information.
|
||||||
|
|
||||||
|
Configurable options in your keyboard's `config.h`:
|
||||||
|
|
||||||
|
`config.h` override | Default | Description
|
||||||
|
----------------------------------------------------|--------------------------------|--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT` | `1` | Number of blocks in the external flash used by the wear-leveling algorithm.
|
||||||
|
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET` | `0` | The index first block in the external flash used by the wear-leveling algorithm.
|
||||||
|
`#define WEAR_LEVELING_LOGICAL_SIZE` | `((block_count*block_size)/2)` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM. Result must be <= 64kB.
|
||||||
|
`#define WEAR_LEVELING_BACKING_SIZE` | `(block_count*block_size)` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
|
||||||
|
`#define BACKING_STORE_WRITE_SIZE` | `8` | The write width used whenever a write is performed on the external flash peripheral.
|
||||||
|
|
||||||
|
!> There is currently a limit of 64kB for the EEPROM subsystem within QMK, so using a larger flash is not going to be beneficial as the logical size cannot be increased beyond 65536. The backing size may be increased to a larger value, but erase timing may suffer as a result.
|
||||||
|
|
||||||
|
## Wear-leveling RP2040 Driver Configuration :id=wear_leveling-rp2040-driver-configuration
|
||||||
|
|
||||||
|
This driver performs writes to the same underlying storage that the RP2040 executes its code.
|
||||||
|
|
||||||
|
Configurable options in your keyboard's `config.h`:
|
||||||
|
|
||||||
|
`config.h` override | Default | Description
|
||||||
|
------------------------------------------|----------------------------|--------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
`#define WEAR_LEVELING_RP2040_FLASH_SIZE` | `PICO_FLASH_SIZE_BYTES` | Number of bytes of flash on the board.
|
||||||
|
`#define WEAR_LEVELING_RP2040_FLASH_BASE` | `(flash_size-sector_size)` | The byte-wise location that the backing storage should be located.
|
||||||
|
`#define WEAR_LEVELING_LOGICAL_SIZE` | `4096` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
|
||||||
|
`#define WEAR_LEVELING_BACKING_SIZE` | `8192` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size as well as the sector size.
|
||||||
|
`#define BACKING_STORE_WRITE_SIZE` | `2` | The write width used whenever a write is performed on the external flash peripheral.
|
||||||
|
|
||||||
|
## Wear-leveling Legacy EEPROM Emulation Driver Configuration :id=wear_leveling-legacy-driver-configuration
|
||||||
|
|
||||||
|
This driver performs writes to the embedded flash storage embedded in the MCU much like the normal Embedded Flash Driver, and is only for use with STM32F0xx and STM32F4x1 devices. This flash implementation is still currently provided as the EFL driver is currently non-functional for the previously mentioned families.
|
||||||
|
|
||||||
|
By default, `1024` bytes of emulated EEPROM is provided:
|
||||||
|
|
||||||
|
MCU | EEPROM Provided | Flash Used
|
||||||
|
----------|-----------------|--------------
|
||||||
|
STM32F042 | `1024` bytes | `2048` bytes
|
||||||
|
STM32F070 | `1024` bytes | `2048` bytes
|
||||||
|
STM32F072 | `1024` bytes | `2048` bytes
|
||||||
|
STM32F401 | `1024` bytes | `16384` bytes
|
||||||
|
STM32F411 | `1024` bytes | `16384` bytes
|
||||||
|
|
||||||
|
Under normal circumstances configuration of this driver requires intimate knowledge of the MCU's flash structure -- reconfiguration is at your own risk and will require referring to the code.
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
This page covers questions people often have about keymaps. If you haven't you should read [Keymap Overview](keymap.md) first.
|
This page covers questions people often have about keymaps. If you haven't you should read [Keymap Overview](keymap.md) first.
|
||||||
|
|
||||||
## What Keycodes Can I Use?
|
## What Keycodes Can I Use?
|
||||||
|
|
||||||
See [Keycodes](keycodes.md) for an index of keycodes available to you. These link to more extensive documentation when available.
|
See [Keycodes](keycodes.md) for an index of keycodes available to you. These link to more extensive documentation when available.
|
||||||
|
|
||||||
Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/keycode.h).
|
Keycodes are actually defined in [quantum/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/keycode.h).
|
||||||
@@ -25,25 +26,30 @@ Sometimes, for readability's sake, it's useful to define custom names for some k
|
|||||||
|
|
||||||
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
|
This will allow you to use `FN_CAPS` and `ALT_TAB` in your keymap, keeping it more readable.
|
||||||
|
|
||||||
|
## My Keymap Doesn't Update When I Flash It
|
||||||
|
|
||||||
|
This is usually due to VIA, and has to do with how it deals with keymaps.
|
||||||
|
|
||||||
|
On first run, the VIA code in the firmware will copy the keymap from flash memory into EEPROM so that it can be rewritten at runtime by the VIA app. From this point QMK will use the keymap stored in EEPROM instead of flash, and so updates to your `keymap.c` will not be reflected.
|
||||||
|
|
||||||
|
The simple fix for this is to clear the EEPROM. You can do this in several ways:
|
||||||
|
|
||||||
|
* Hold the Bootmagic Lite key (usually top left/Escape) while plugging the board in, which will also place the board into bootloader mode; then unplug and replug the board.
|
||||||
|
* Press the `QK_CLEAR_EEPROM`/`EE_CLR` keycode if it is accessible on your keymap.
|
||||||
|
* Place the board into bootloader mode and hit the "Clear EEPROM" button. This may not be available for all bootloaders, and you may need to reflash the board afterwards.
|
||||||
|
|
||||||
## Some Of My Keys Are Swapped Or Not Working
|
## Some Of My Keys Are Swapped Or Not Working
|
||||||
|
|
||||||
QMK has two features, Bootmagic and Command, which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling Gui, swapping Alt/Gui, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.
|
QMK has a couple of features which allow you to change the behavior of your keyboard on the fly. This includes, but is not limited to, swapping Ctrl/Caps, disabling GUI, swapping Alt/GUI, swapping Backspace/Backslash, disabling all keys, and other behavioral modifications.
|
||||||
|
|
||||||
As a quick fix try holding down `Space`+`Backspace` while you plug in your keyboard. This will reset the stored settings on your keyboard, returning those keys to normal operation. If that doesn't work look here:
|
Refer to the EEPROM clearing methods above, which should return those keys to normal operation. If that doesn't work, look here:
|
||||||
|
|
||||||
* [Bootmagic Lite](feature_bootmagic.md)
|
* [Magic Keycodes](keycodes_magic.md)
|
||||||
* [Command](feature_command.md)
|
* [Command](feature_command.md)
|
||||||
|
|
||||||
## The Menu Key Isn't Working
|
## The Menu Key Isn't Working
|
||||||
|
|
||||||
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when that key was invented there was already a key named `MENU` in the relevant standards, so MS chose to call that the `APP` key.
|
The key found on most modern keyboards that is located between `KC_RGUI` and `KC_RCTL` is actually called `KC_APP`. This is because when the key was invented, there was already a key named "Menu" in the HID specification, so for whatever reason, Microsoft chose to create a new key and call it "Application".
|
||||||
|
|
||||||
## `KC_SYSTEM_REQUEST` Isn't Working
|
|
||||||
Use keycode for Print Screen (`KC_PRINT_SCREEN`/`KC_PSCR`) instead of `KC_SYSTEM_REQUEST`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
|
|
||||||
|
|
||||||
See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and
|
|
||||||
* https://en.wikipedia.org/wiki/Magic_SysRq_key
|
|
||||||
* https://en.wikipedia.org/wiki/System_request
|
|
||||||
|
|
||||||
## Power Keys Aren't Working
|
## Power Keys Aren't Working
|
||||||
|
|
||||||
@@ -52,10 +58,12 @@ Somewhat confusingly, there are two "Power" keycodes in QMK: `KC_KB_POWER` in th
|
|||||||
The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears.
|
The former is only recognized on macOS, while the latter, `KC_SLEP` and `KC_WAKE` are supported by all three major operating systems, so it is recommended to use those instead. Under Windows, these keys take effect immediately, however on macOS they must be held down until a dialog appears.
|
||||||
|
|
||||||
## One Shot Modifier
|
## One Shot Modifier
|
||||||
|
|
||||||
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me.
|
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. One Shot Shift mitigates this for me.
|
||||||
https://github.com/tmk/tmk_keyboard/issues/67
|
https://github.com/tmk/tmk_keyboard/issues/67
|
||||||
|
|
||||||
## Modifier/Layer Stuck
|
## Modifier/Layer Stuck
|
||||||
|
|
||||||
Modifier keys or layers can be stuck unless layer switching is configured properly.
|
Modifier keys or layers can be stuck unless layer switching is configured properly.
|
||||||
For Modifier keys and layer actions you have to place `KC_TRNS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
|
For Modifier keys and layer actions you have to place `KC_TRNS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
|
||||||
|
|
||||||
@@ -63,12 +71,11 @@ For Modifier keys and layer actions you have to place `KC_TRNS` on same position
|
|||||||
* https://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
* https://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
||||||
* https://github.com/tmk/tmk_keyboard/issues/248
|
* https://github.com/tmk/tmk_keyboard/issues/248
|
||||||
|
|
||||||
|
|
||||||
## Mechanical Lock Switch Support
|
## Mechanical Lock Switch Support
|
||||||
|
|
||||||
This feature is for *mechanical lock switch* like [this Alps one](https://deskthority.net/wiki/Alps_SKCL_Lock). You can enable it by adding this to your `config.h`:
|
This feature is for *mechanical lock switch* like [this Alps one](https://deskthority.net/wiki/Alps_SKCL_Lock). You can enable it by adding this to your `config.h`:
|
||||||
|
|
||||||
```
|
```c
|
||||||
#define LOCKING_SUPPORT_ENABLE
|
#define LOCKING_SUPPORT_ENABLE
|
||||||
#define LOCKING_RESYNC_ENABLE
|
#define LOCKING_RESYNC_ENABLE
|
||||||
```
|
```
|
||||||
@@ -91,6 +98,7 @@ Even worse, it is not recognized unless the keyboard's VID and PID match that of
|
|||||||
See [this issue](https://github.com/qmk/qmk_firmware/issues/2179) for detailed information.
|
See [this issue](https://github.com/qmk/qmk_firmware/issues/2179) for detailed information.
|
||||||
|
|
||||||
## Keys Supported in Mac OSX?
|
## Keys Supported in Mac OSX?
|
||||||
|
|
||||||
You can know which keycodes are supported in OSX from this source code.
|
You can know which keycodes are supported in OSX from this source code.
|
||||||
|
|
||||||
`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
|
`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
|
||||||
@@ -101,8 +109,8 @@ And `IOHIDConsumer::dispatchConsumerEvent` handles Consumer page usages.
|
|||||||
|
|
||||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
||||||
|
|
||||||
|
|
||||||
## JIS Keys in Mac OSX
|
## JIS Keys in Mac OSX
|
||||||
|
|
||||||
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
|
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
|
||||||
|
|
||||||
* Enable NFER Key on PC keyboard
|
* Enable NFER Key on PC keyboard
|
||||||
@@ -111,8 +119,8 @@ Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`
|
|||||||
|
|
||||||
https://pqrs.org/osx/karabiner/seil.html
|
https://pqrs.org/osx/karabiner/seil.html
|
||||||
|
|
||||||
|
|
||||||
## RN-42 Bluetooth Doesn't Work with Karabiner
|
## RN-42 Bluetooth Doesn't Work with Karabiner
|
||||||
|
|
||||||
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
|
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
|
||||||
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
||||||
|
|
||||||
@@ -120,37 +128,24 @@ See these for the detail of this problem.
|
|||||||
https://github.com/tmk/tmk_keyboard/issues/213
|
https://github.com/tmk/tmk_keyboard/issues/213
|
||||||
https://github.com/tekezo/Karabiner/issues/403
|
https://github.com/tekezo/Karabiner/issues/403
|
||||||
|
|
||||||
|
|
||||||
## Esc and <code>`</code> on a Single Key
|
## Esc and <code>`</code> on a Single Key
|
||||||
|
|
||||||
See the [Grave Escape](feature_grave_esc.md) feature.
|
See the [Grave Escape](feature_grave_esc.md) feature.
|
||||||
|
|
||||||
## Eject on Mac OSX
|
## Eject on Mac OSX
|
||||||
|
|
||||||
`KC_EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
|
`KC_EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
|
||||||
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
|
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
|
||||||
|
|
||||||
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+f`) on Mac mode but this is not same as Apple Eject keycode probably.
|
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+F`) on Mac mode but this is not same as Apple Eject keycode probably.
|
||||||
|
|
||||||
|
## What are "Real" and "Weak" modifiers?
|
||||||
|
|
||||||
## What's `weak_mods` and `real_mods` in `action_util.c`
|
Real modifiers refer to the state of the real/physical modifier keys, while weak modifiers are the state of "virtual" or temporary modifiers which should not interfere with the internal state of the real modifier keys.
|
||||||
___TO BE IMPROVED___
|
|
||||||
|
|
||||||
real_mods is intended to retains state of real/physical modifier key state, while
|
The real and weak modifier states are ORed together when the keyboard report is sent, so if you release a weak modifier while the same real modifier is still held, the report does not change:
|
||||||
weak_mods retains state of virtual or temporary modifiers which should not affect state real modifier key.
|
|
||||||
|
|
||||||
Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A),
|
1. **Hold down physical Left Shift:** Real mods now contains Left Shift, final state is Left Shift
|
||||||
|
2. **Add weak Left Shift:** Weak mods now contains Left Shift, final state is Left Shift
|
||||||
with weak_mods,
|
3. **Remove weak Left Shift:** Weak mods now contains nothing, final state is Left Shift
|
||||||
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
4. **Release physical Left Shift:** Real mods now contains nothing, final state is nothing
|
||||||
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods |= MOD_BIT(LSHIFT)
|
|
||||||
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods &= ~MOD_BIT(LSHIFT)
|
|
||||||
real_mods still keeps modifier state.
|
|
||||||
|
|
||||||
without weak mods,
|
|
||||||
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
|
||||||
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): real_mods |= MOD_BIT(LSHIFT)
|
|
||||||
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): real_mods &= ~MOD_BIT(LSHIFT)
|
|
||||||
here real_mods lost state for 'physical left shift'.
|
|
||||||
|
|
||||||
weak_mods is ORed with real_mods when keyboard report is sent.
|
|
||||||
https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ In practice, this means that you can check whether a given modifier is active wi
|
|||||||
|
|
||||||
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
To check that *only* a specific set of mods is active at a time, AND the modifier state and your desired mod mask as explained above and compare the result to the mod mask itself: `get_mods() & <mod mask> == <mod mask>`.
|
||||||
|
|
||||||
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
For example, let's say you want to trigger a piece of custom code if one-shot left control and one-shot left shift are on but every other one-shot mods are off. To do so, you can compose the desired mod mask by combining the mod bits for left control and shift with `(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` and then plug it in: `get_oneshot_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`. Using `MOD_MASK_CS` instead for the mod bitmask would have forced you to press four modifier keys (both versions of control and shift) to fulfill the condition.
|
||||||
|
|
||||||
The full list of mod masks is as follows:
|
The full list of mod masks is as follows:
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1, QM
|
|||||||
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
|Board |Bluetooth Protocol |Connection Type|rules.mk |Bluetooth Chip|
|
||||||
|----------------------------------------------------------------|--------------------|---------------|--------------------------------|--------------|
|
|----------------------------------------------------------------|--------------------|---------------|--------------------------------|--------------|
|
||||||
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = RN42` |RN-42 |
|
|Roving Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic |UART |`BLUETOOTH_DRIVER = RN42` |RN-42 |
|
||||||
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = AdafruitBLE`|nRF51822 |
|
|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy|SPI |`BLUETOOTH_DRIVER = BluefruitLE`|nRF51822 |
|
||||||
|
|
||||||
Not Supported Yet but possible:
|
Not Supported Yet but possible:
|
||||||
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514)
|
||||||
@@ -17,9 +17,9 @@ Not Supported Yet but possible:
|
|||||||
|
|
||||||
### Adafruit BLE SPI Friend
|
### Adafruit BLE SPI Friend
|
||||||
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF51822 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines:
|
||||||
* `#define ADAFRUIT_BLE_RST_PIN D4`
|
* `#define BLUEFRUIT_LE_RST_PIN D4`
|
||||||
* `#define ADAFRUIT_BLE_CS_PIN B4`
|
* `#define BLUEFRUIT_LE_CS_PIN B4`
|
||||||
* `#define ADAFRUIT_BLE_IRQ_PIN E6`
|
* `#define BLUEFRUIT_LE_IRQ_PIN E6`
|
||||||
|
|
||||||
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip.
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ Add the following to your `rules.mk`:
|
|||||||
|
|
||||||
```make
|
```make
|
||||||
BLUETOOTH_ENABLE = yes
|
BLUETOOTH_ENABLE = yes
|
||||||
BLUETOOTH_DRIVER = AdafruitBLE # or RN42
|
BLUETOOTH_DRIVER = BluefruitLE # or RN42
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bluetooth Keycodes
|
## Bluetooth Keycodes
|
||||||
|
|||||||
@@ -23,14 +23,35 @@ And to trigger the bootloader, you hold this key down when plugging the keyboard
|
|||||||
|
|
||||||
## Split Keyboards
|
## Split Keyboards
|
||||||
|
|
||||||
When handedness is predetermined via an option like `SPLIT_HAND_PIN`, you might need to configure a different key between halves. To do so, add these entries to your `config.h` file:
|
When [handedness](feature_split_keyboard.md#setting-handedness) is predetermined via options like `SPLIT_HAND_PIN` or `EE_HANDS`, you might need to configure a different key between halves. To identify the correct key for the right half, examine the split key matrix defined in the `<keyboard>.h` file, e.g.:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define LAYOUT_split_3x5_2( \
|
||||||
|
L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, \
|
||||||
|
L06, L07, L08, L09, L10, R06, R07, R08, R09, R10, \
|
||||||
|
L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, \
|
||||||
|
L16, L17, R16, R17 \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
{ L01, L02, L03, L04, L05 }, \
|
||||||
|
{ L06, L07, L08, L09, L10 }, \
|
||||||
|
{ L11, L12, L13, L14, L15 }, \
|
||||||
|
{ L16, L17, KC_NO, KC_NO, KC_NO }, \
|
||||||
|
{ R01, R02, R03, R04, R05 }, \
|
||||||
|
{ R06, R07, R08, R09, R10 }, \
|
||||||
|
{ R11, R12, R13, R14, R15 }, \
|
||||||
|
{ R16, R17, KC_NO, KC_NO, KC_NO } \
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
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 Lite trigger, add these entries to your `config.h` file:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
||||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
#define BOOTMAGIC_LITE_COLUMN_RIGHT 4
|
||||||
```
|
```
|
||||||
|
|
||||||
By default, these values are not set.
|
?> These values are not set by default.
|
||||||
|
|
||||||
## Advanced Bootmagic Lite
|
## Advanced Bootmagic Lite
|
||||||
|
|
||||||
@@ -51,7 +72,7 @@ void bootmagic_lite(void) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can additional feature here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic Lite. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
|
You can define additional logic here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic Lite. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
|
||||||
|
|
||||||
## Addenda
|
## Addenda
|
||||||
|
|
||||||
|
|||||||
156
docs/feature_caps_word.md
Normal file
156
docs/feature_caps_word.md
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
# Caps Word
|
||||||
|
|
||||||
|
It is often useful to type a single word in all capitals, for instance
|
||||||
|
abbreviations like "QMK", or in code, identifiers like `KC_SPC`. "Caps Word" is
|
||||||
|
a modern alternative to Caps Lock:
|
||||||
|
|
||||||
|
* Letters are capitalized while active, and Caps Word automatically disables
|
||||||
|
itself at the end of the word. That is, it stops by default once a space or
|
||||||
|
any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace is
|
||||||
|
pressed. Caps Word also disables itself if the keyboard is idle for 5 seconds.
|
||||||
|
This is configurable, see below.
|
||||||
|
|
||||||
|
* To avoid requiring a dedicated key for Caps Word, there is an option
|
||||||
|
(`BOTH_SHIFTS_TURNS_ON_CAPS_WORD`) to activate Caps Word by simultaneously
|
||||||
|
pressing both shift keys. See below for other options.
|
||||||
|
|
||||||
|
* The implementation does not use the Caps Lock (`KC_CAPS`) keycode. Caps Word
|
||||||
|
works even if you're remapping Caps Lock at the OS level to Ctrl or something
|
||||||
|
else, as Emacs and Vim users often do.
|
||||||
|
|
||||||
|
|
||||||
|
## How do I enable Caps Word :id=how-do-i-enable-caps-word
|
||||||
|
|
||||||
|
In your `rules.mk`, add:
|
||||||
|
|
||||||
|
```make
|
||||||
|
CAPS_WORD_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, use one the following methods to activate Caps Word:
|
||||||
|
|
||||||
|
* **Activate by pressing a key**: Use the `CAPS_WORD` keycode (short
|
||||||
|
alias `CAPSWRD`) in your keymap.
|
||||||
|
|
||||||
|
* **Activate by pressing Left Shift + Right Shift**: Add `#define
|
||||||
|
BOTH_SHIFTS_TURNS_ON_CAPS_WORD` to config.h. You may also need to disable or
|
||||||
|
reconfigure Command, details below. Then, simultaneously pressing both left
|
||||||
|
and right shifts turns on Caps Word. This method works with the plain
|
||||||
|
`KC_LSFT` and `KC_RSFT` keycodes as well as one-shot shifts and Space Cadet
|
||||||
|
shifts. If your shift keys are mod-taps, hold both shift mod-tap keys until
|
||||||
|
the tapping term, then release them.
|
||||||
|
|
||||||
|
* **Activate by double tapping Left Shift**: Add `#define
|
||||||
|
DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD` config.h. Then, double tapping Left Shift
|
||||||
|
turns on Caps Word. This method works with `KC_LSFT` or one-shot Left Shift
|
||||||
|
`OSM(MOD_LSFT)`. To count as a double tap, the maximum time in milliseconds
|
||||||
|
between taps is `TAPPING_TERM`, or if using `TAPPING_TERM_PER_KEY`, the time
|
||||||
|
returned by `get_tapping_term()` for the shift keycode being tapped.
|
||||||
|
|
||||||
|
* **Custom activation**: You can activate Caps Word from code by calling
|
||||||
|
`caps_word_on()`. This may be used to activate Caps Word through [a
|
||||||
|
combo](feature_combo.md) or [tap dance](feature_tap_dance.md) or any means
|
||||||
|
you like.
|
||||||
|
|
||||||
|
### Troubleshooting: Command :id=troubleshooting-command
|
||||||
|
|
||||||
|
When using `BOTH_SHIFTS_TURNS_ON_CAPS_WORD`, you might see a compile message
|
||||||
|
**"BOTH_SHIFTS_TURNS_ON_CAPS_WORD and Command should not be enabled at the same
|
||||||
|
time, since both use the Left Shift + Right Shift key combination."**
|
||||||
|
|
||||||
|
Many keyboards enable the [Command feature](feature_command.md), which by
|
||||||
|
default is also activated using the Left Shift + Right Shift key combination. To
|
||||||
|
fix this conflict, please disable Command by adding in rules.mk:
|
||||||
|
|
||||||
|
```make
|
||||||
|
COMMAND_ENABLE = no
|
||||||
|
```
|
||||||
|
|
||||||
|
Or configure Command to use another key combination like Left Ctrl + Right Ctrl
|
||||||
|
by defining `IS_COMMAND()` in config.h:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Activate Command with Left Ctrl + Right Ctrl.
|
||||||
|
#define IS_COMMAND() (get_mods() == MOD_MASK_CTRL)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Customizing Caps Word :id=customizing-caps-word
|
||||||
|
|
||||||
|
### Idle timeout :id=idle-timeout
|
||||||
|
|
||||||
|
Caps Word turns off automatically if no keys are pressed for
|
||||||
|
`CAPS_WORD_IDLE_TIMEOUT` milliseconds. The default is 5000 (5 seconds).
|
||||||
|
Configure the timeout duration in config.h, for instance
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define CAPS_WORD_IDLE_TIMEOUT 3000 // 3 seconds.
|
||||||
|
```
|
||||||
|
|
||||||
|
Setting `CAPS_WORD_IDLE_TIMEOUT` to 0 configures Caps Word to never time out.
|
||||||
|
Caps Word then remains active indefinitely until a word breaking key is pressed.
|
||||||
|
|
||||||
|
|
||||||
|
### Functions :id=functions
|
||||||
|
|
||||||
|
Functions to manipulate Caps Word:
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
|-------------------------|------------------------------------------------|
|
||||||
|
| `caps_word_on()` | Turns Caps Word on. |
|
||||||
|
| `caps_word_off()` | Turns Caps Word off. |
|
||||||
|
| `caps_word_toggle()` | Toggles Caps Word. |
|
||||||
|
| `is_caps_word_on()` | Returns true if Caps Word is currently on. |
|
||||||
|
|
||||||
|
|
||||||
|
### Configure which keys are "word breaking" :id=configure-which-keys-are-word-breaking
|
||||||
|
|
||||||
|
You can define the `caps_word_press_user(uint16_t keycode)` callback to
|
||||||
|
configure which keys should be shifted and which keys are considered "word
|
||||||
|
breaking" and stop Caps Word.
|
||||||
|
|
||||||
|
The callback is called on every key press while Caps Word is active. When the
|
||||||
|
key should be shifted (that is, a letter key), the callback should call
|
||||||
|
`add_weak_mods(MOD_BIT(KC_LSFT))` to shift the key. Returning true continues the
|
||||||
|
current "word," while returning false is "word breaking" and deactivates Caps
|
||||||
|
Word. The default callback is
|
||||||
|
|
||||||
|
```c
|
||||||
|
bool caps_word_press_user(uint16_t keycode) {
|
||||||
|
switch (keycode) {
|
||||||
|
// Keycodes that continue Caps Word, with shift applied.
|
||||||
|
case KC_A ... KC_Z:
|
||||||
|
case KC_MINS:
|
||||||
|
add_weak_mods(MOD_BIT(KC_LSFT)); // Apply shift to next key.
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Keycodes that continue Caps Word, without shifting.
|
||||||
|
case KC_1 ... KC_0:
|
||||||
|
case KC_BSPC:
|
||||||
|
case KC_DEL:
|
||||||
|
case KC_UNDS:
|
||||||
|
return true;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false; // Deactivate Caps Word.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Representing Caps Word state :id=representing-caps-word-state
|
||||||
|
|
||||||
|
Define `caps_word_set_user(bool active)` to get callbacks when Caps Word turns
|
||||||
|
on or off. This is useful to represent the current Caps Word state, e.g. by
|
||||||
|
setting an LED or playing a sound. In your keymap, define
|
||||||
|
|
||||||
|
```c
|
||||||
|
void caps_word_set_user(bool active) {
|
||||||
|
if (active) {
|
||||||
|
// Do something when Caps Word activates.
|
||||||
|
} else {
|
||||||
|
// Do something when Caps Word deactivates.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
@@ -141,10 +141,13 @@ Processing combos has two buffers, one for the key presses, another for the comb
|
|||||||
## Modifier Combos
|
## Modifier Combos
|
||||||
If a combo resolves to a Modifier, the window for processing the combo can be extended independently from normal combos. By default, this is disabled but can be enabled with `#define COMBO_MUST_HOLD_MODS`, and the time window can be configured with `#define COMBO_HOLD_TERM 150` (default: `TAPPING_TERM`). With `COMBO_MUST_HOLD_MODS`, you cannot tap the combo any more which makes the combo less prone to misfires.
|
If a combo resolves to a Modifier, the window for processing the combo can be extended independently from normal combos. By default, this is disabled but can be enabled with `#define COMBO_MUST_HOLD_MODS`, and the time window can be configured with `#define COMBO_HOLD_TERM 150` (default: `TAPPING_TERM`). With `COMBO_MUST_HOLD_MODS`, you cannot tap the combo any more which makes the combo less prone to misfires.
|
||||||
|
|
||||||
## Per Combo Timing, Holding and Tapping
|
## Strict key press order
|
||||||
For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, or if it needs to be tapped.
|
By defining `COMBO_MUST_PRESS_IN_ORDER` combos only activate when the keys are pressed in the same order as they are defined in the key array.
|
||||||
|
|
||||||
For example, tap-only combos are useful if any (or all) of the underlying keys is a Mod-Tap or a Layer-Tap key. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't actually activate. Instead the keys are processed separately as if the combo wasn't even there.
|
## Per Combo Timing, Holding, Tapping and Key Press Order
|
||||||
|
For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, if it needs to be tapped, or if its keys need to be pressed in order.
|
||||||
|
|
||||||
|
For example, tap-only combos are useful if any (or all) of the underlying keys are mod-tap or layer-tap keys. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't activate. Instead the keys are processed separately as if the combo wasn't even there.
|
||||||
|
|
||||||
In order to use these features, the following configuration options and functions need to be defined. Coming up with useful timings and configuration is left as an exercise for the reader.
|
In order to use these features, the following configuration options and functions need to be defined. Coming up with useful timings and configuration is left as an exercise for the reader.
|
||||||
|
|
||||||
@@ -153,6 +156,7 @@ In order to use these features, the following configuration options and function
|
|||||||
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
|
||||||
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
|
||||||
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
|
||||||
|
| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | bool get_combo_must_press_in_order(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
```c
|
```c
|
||||||
@@ -216,6 +220,38 @@ bool get_combo_must_tap(uint16_t index, combo_t *combo) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
|
||||||
|
switch (combo_index) {
|
||||||
|
/* List combos here that you want to only activate if their keys
|
||||||
|
* are pressed in the same order as they are defined in the combo's key
|
||||||
|
* array. */
|
||||||
|
case COMBO_NAME_HERE:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Generic hook to (dis)allow a combo activation
|
||||||
|
|
||||||
|
By defining `COMBO_SHOULD_TRIGGER` and its companying function `bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record)` you can block or allow combos to activate on the conditions of your choice.
|
||||||
|
For example, you could disallow some combos on the base layer and allow them on another. Or disable combos on the home row when a timer is running.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
```c
|
||||||
|
bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
|
||||||
|
/* Disable combo `SOME_COMBO` on layer `_LAYER_A` */
|
||||||
|
switch (combo_index) {
|
||||||
|
case SOME_COMBO:
|
||||||
|
if (layer_state_is(_LAYER_A)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Variable Length Combos
|
## Variable Length Combos
|
||||||
|
|||||||
98
docs/feature_converters.md
Normal file
98
docs/feature_converters.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Converters
|
||||||
|
|
||||||
|
Since many drop-in replacement controllers now exist, we've done our best to make them easy to use in existing designs.
|
||||||
|
|
||||||
|
This page documents the handy automated process for converting keyboards.
|
||||||
|
|
||||||
|
### Supported Converters
|
||||||
|
|
||||||
|
Currently the following converters are available:
|
||||||
|
|
||||||
|
| From | To |
|
||||||
|
|------------|-------------------|
|
||||||
|
| `promicro` | `proton_c` |
|
||||||
|
| `promicro` | `kb2040` |
|
||||||
|
| `promicro` | `promicro_rp2040` |
|
||||||
|
| `promicro` | `blok` |
|
||||||
|
|
||||||
|
See below for more in depth information on each converter.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Each converter category is broken down by its declared `pin compatibility`.
|
||||||
|
This ensures that only valid combinations are attempted.
|
||||||
|
|
||||||
|
You can generate the firmware by appending `-e CONVERT_TO=<target>` to your compile/flash command. For example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
qmk flash -c -kb keebio/bdn9/rev1 -km default -e CONVERT_TO=proton_c
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also add the same `CONVERT_TO=<target>` to your keymap's `rules.mk`, which will accomplish the same thing.
|
||||||
|
|
||||||
|
?> If you get errors about `PORTB/DDRB`, etc not being defined, you'll need to convert the keyboard's code to use the [GPIO Controls](gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
|
||||||
|
|
||||||
|
### Conditional Configuration
|
||||||
|
|
||||||
|
Once a converter is enabled, it exposes the `CONVERT_TO_<target_uppercase>` flag that you can use in your code with `#ifdef`s, For example:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifdef CONVERT_TO_PROTON_C
|
||||||
|
// Proton C code
|
||||||
|
#else
|
||||||
|
// Pro Micro code
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pro Micro
|
||||||
|
|
||||||
|
If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.com/products/12640) (or compatible board), the supported alternative controllers are:
|
||||||
|
|
||||||
|
| Device | Target |
|
||||||
|
|------------------------------------------------------------------------|-------------------|
|
||||||
|
| [Proton C](https://qmk.fm/proton-c/) | `proton_c` |
|
||||||
|
| [Adafruit KB2040](https://learn.adafruit.com/adafruit-kb2040) | `kb2040` |
|
||||||
|
| [SparkFun Pro Micro - RP2040](https://www.sparkfun.com/products/18288) | `promicro_rp2040` |
|
||||||
|
| [Blok](https://boardsource.xyz/store/628b95b494dfa308a6581622) | `blok` |
|
||||||
|
|
||||||
|
Converter summary:
|
||||||
|
|
||||||
|
| Target | Argument | `rules.mk` | Condition |
|
||||||
|
|-------------------|---------------------------------|------------------------------|-------------------------------------|
|
||||||
|
| `proton_c` | `-e CONVERT_TO=proton_c` | `CONVERT_TO=proton_c` | `#ifdef CONVERT_TO_PROTON_C` |
|
||||||
|
| `kb2040` | `-e CONVERT_TO=kb2040` | `CONVERT_TO=kb2040` | `#ifdef CONVERT_TO_KB2040` |
|
||||||
|
| `promicro_rp2040` | `-e CONVERT_TO=promicro_rp2040` | `CONVERT_TO=promicro_rp2040` | `#ifdef CONVERT_TO_PROMICRO_RP2040` |
|
||||||
|
| `blok` | `-e CONVERT_TO=blok` | `CONVERT_TO=blok` | `#ifdef CONVERT_TO_BLOK` |
|
||||||
|
|
||||||
|
### Proton C :id=proton_c
|
||||||
|
|
||||||
|
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this line to your `config.h`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define CONVERT_TO_PROTON_C_RXLED
|
||||||
|
```
|
||||||
|
|
||||||
|
The following defaults are based on what has been implemented for STM32 boards.
|
||||||
|
|
||||||
|
| Feature | Notes |
|
||||||
|
|----------------------------------------------|------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| [Audio](feature_audio.md) | Enabled |
|
||||||
|
| [RGB Lighting](feature_rgblight.md) | Disabled |
|
||||||
|
| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
|
||||||
|
| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
|
||||||
|
| [Split keyboards](feature_split_keyboard.md) | Partial - heavily dependent on enabled features |
|
||||||
|
|
||||||
|
### Adafruit KB2040 :id=kb2040
|
||||||
|
|
||||||
|
The following defaults are based on what has been implemented for [RP2040](platformdev_rp2040.md) boards.
|
||||||
|
|
||||||
|
| Feature | Notes |
|
||||||
|
|----------------------------------------------|------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| [RGB Lighting](feature_rgblight.md) | Enabled via `PIO` vendor driver |
|
||||||
|
| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
|
||||||
|
| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
|
||||||
|
| [Split keyboards](feature_split_keyboard.md) | Partial via `PIO` vendor driver - heavily dependent on enabled features |
|
||||||
|
|
||||||
|
### SparkFun Pro Micro - RP2040 and Blok :id=promicro_rp2040
|
||||||
|
|
||||||
|
Currently identical to [Adafruit KB2040](#kb2040).
|
||||||
@@ -116,6 +116,7 @@ Where name of algorithm is one of:
|
|||||||
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
|
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
|
||||||
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
|
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
|
||||||
* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
|
* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
|
||||||
|
* ```sym_defer_pr``` - debouncing per row. On any state change, a per-row timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that row, the entire row is pushed. Can improve responsiveness over `sym_defer_g` while being less susceptible than per-key debouncers to noise.
|
||||||
* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
|
* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
|
||||||
* ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed.
|
* ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed.
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ There are a number of options added that should allow some additional degree of
|
|||||||
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|
||||||
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|
||||||
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
|
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
|
||||||
|
|`DYNAMIC_MACRO_DELAY` |*Not Defined* |Sets the waiting time (ms unit) when sending each key. |
|
||||||
|
|
||||||
|
|
||||||
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).
|
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).
|
||||||
|
|||||||
@@ -54,9 +54,43 @@ If you are using different pinouts for the encoders on each half of a split keyb
|
|||||||
#define ENCODER_RESOLUTIONS_RIGHT { 2, 4 }
|
#define ENCODER_RESOLUTIONS_RIGHT { 2, 4 }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If the `_RIGHT` definitions aren't specified in your `config.h`, then the non-`_RIGHT` versions will be applied to both sides of the split.
|
||||||
|
|
||||||
|
Additionally, if one side does not have an encoder, you can specify `{}` for the pins/resolution -- for example, a split keyboard with only a right-side encoder:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define ENCODERS_PAD_A { }
|
||||||
|
#define ENCODERS_PAD_B { }
|
||||||
|
#define ENCODER_RESOLUTIONS { }
|
||||||
|
#define ENCODERS_PAD_A_RIGHT { B12 }
|
||||||
|
#define ENCODERS_PAD_B_RIGHT { B13 }
|
||||||
|
#define ENCODER_RESOLUTIONS_RIGHT { 4 }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Encoder map :id=encoder-map
|
||||||
|
|
||||||
|
Encoder mapping may be added to your `keymap.c`, which replicates the normal keyswitch layer handling functionality, but with encoders. Add this to your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
ENCODER_MAP_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
Your `keymap.c` will then need an encoder mapping defined (for four layers and two encoders):
|
||||||
|
|
||||||
|
```c
|
||||||
|
#if defined(ENCODER_MAP_ENABLE)
|
||||||
|
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
|
||||||
|
[_BASE] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
|
||||||
|
[_LOWER] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
|
||||||
|
[_RAISE] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
|
||||||
|
[_ADJUST] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) },
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
## Callbacks
|
## Callbacks
|
||||||
|
|
||||||
The callback functions can be inserted into your `<keyboard>.c`:
|
When not using `ENCODER_MAP_ENABLE = yes`, the callback functions can be inserted into your `<keyboard>.c`:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
bool encoder_update_kb(uint8_t index, bool clockwise) {
|
||||||
|
|||||||
@@ -4,17 +4,17 @@ If you're using a 60% keyboard, or any other layout with no F-row, you will have
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Replace the `KC_GRV` key in your keymap (usually to the left of the `1` key) with `KC_GESC`. Most of the time this key will output `KC_ESC` when pressed. However, when Shift or GUI are held down it will output `KC_GRV` instead.
|
Replace the `KC_GRV` key in your keymap (usually to the left of the `1` key) with `QK_GESC`. Most of the time this key will output `KC_ESC` when pressed. However, when Shift or GUI are held down it will output `KC_GRV` instead.
|
||||||
|
|
||||||
## What Your OS Sees
|
## What Your OS Sees
|
||||||
|
|
||||||
If Mary presses GESC on her keyboard, the OS will see an KC_ESC character. Now if Mary holds Shift down and presses GESC it will output `~`, or a shifted backtick. Now if she holds GUI/CMD/WIN, it will output a simple <code>`</code> character.
|
If Mary presses `QK_GESC` on her keyboard, the OS will see an KC_ESC character. Now if Mary holds Shift down and presses `QK_GESC` it will output `~`, or a shifted backtick. Now if she holds GUI/CMD/WIN, it will output a simple <code>`</code> character.
|
||||||
|
|
||||||
## Keycodes
|
## Keycodes
|
||||||
|
|
||||||
|Key |Aliases |Description |
|
|Key |Aliases |Description |
|
||||||
|---------|-----------|------------------------------------------------------------------|
|
|-----------------|---------|------------------------------------------------------------------|
|
||||||
|`KC_GESC`|`GRAVE_ESC`|Escape when pressed, <code>`</code> when Shift or GUI are held|
|
|`QK_GRAVE_ESCAPE`|`QK_GESC`|Escape when pressed, <code>`</code> when Shift or GUI are held|
|
||||||
|
|
||||||
### Caveats
|
### Caveats
|
||||||
|
|
||||||
|
|||||||
@@ -50,22 +50,28 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
|||||||
|
|
||||||
### Solenoids
|
### Solenoids
|
||||||
|
|
||||||
First 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.
|
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.
|
||||||
|
|
||||||
[Wiring diagram provided by Adafruit](https://cdn-shop.adafruit.com/product-files/412/solenoid_driver.pdf)
|
[Wiring diagram provided by Adafruit](https://cdn-shop.adafruit.com/product-files/412/solenoid_driver.pdf)
|
||||||
|
|
||||||
|
For relay switches, the hardware may already contain all of that ciruitry, and just require VCC, GND and a data pin.
|
||||||
|
|
||||||
| Settings | Default | Description |
|
| Settings | Default | Description |
|
||||||
|----------------------------|----------------------|-------------------------------------------------------|
|
|----------------------------|----------------------|--------------------------------------------------------------|
|
||||||
|`SOLENOID_PIN` | *Not defined* |Configures the pin that the Solenoid is connected to. |
|
|`SOLENOID_PIN` | *Not defined* |Configures the pin that the switch is connected to. |
|
||||||
|`SOLENOID_PIN_ACTIVE_LOW` | *Not defined* |If defined then the solenoid trigger pin is active low.|
|
|`SOLENOID_PIN_ACTIVE_LOW` | *Not defined* |If defined then the switch trigger pin is active low. |
|
||||||
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the solenoid. |
|
|`SOLENOID_PINS` | *Not defined* |Configures an array of pins to be used for switch activation. |
|
||||||
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|
|`SOLENOID_PINS_ACTIVE_LOW` | *Not defined* |Allows you to specify how each pin is pulled for activation. |
|
||||||
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
|
|`SOLENOID_RANDOM_FIRE` | *Not defined* |When there are multiple solenoids, will select a random one to fire.|
|
||||||
|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HPT_DWL*` keycodes are sent |
|
|`SOLENOID_DEFAULT_DWELL` | `12` ms |Configures the default dwell time for the switch. |
|
||||||
|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On HPT_RST buzz is set "on" if this is "1" |
|
|`SOLENOID_MIN_DWELL` | `4` ms |Sets the lower limit for the dwell. |
|
||||||
|`SOLENOID_BUZZ_ACTUATED` | `SOLENOID_MIN_DWELL` |Actuated-time when the solenoid is in buzz mode |
|
|`SOLENOID_MAX_DWELL` | `100` ms |Sets the upper limit for the dwell. |
|
||||||
|`SOLENOID_BUZZ_NONACTUATED` | `SOLENOID_MIN_DWELL` |Non-Actuated-time when the solenoid is in buzz mode |
|
|`SOLENOID_DWELL_STEP_SIZE` | `1` ms |The step size to use when `HPT_DWL*` keycodes are sent. |
|
||||||
|
|`SOLENOID_DEFAULT_BUZZ` | `0` (disabled) |On HPT_RST buzz is set "on" if this is "1" |
|
||||||
|
|`SOLENOID_BUZZ_ACTUATED` | `SOLENOID_MIN_DWELL` |Actuated-time when the switch is in buzz mode. |
|
||||||
|
|`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 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 withing the buzz period.
|
||||||
@@ -167,7 +173,7 @@ List of waveform sequences from the datasheet:
|
|||||||
```
|
```
|
||||||
#define DRV_GREETING *sequence name or number*
|
#define DRV_GREETING *sequence name or number*
|
||||||
```
|
```
|
||||||
If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence during startup. That can be selected using the following define:
|
If haptic feedback is enabled, the keyboard will vibrate to a specific sequence during startup. That can be selected using the following define:
|
||||||
|
|
||||||
```
|
```
|
||||||
#define DRV_MODE_DEFAULT *sequence name or number*
|
#define DRV_MODE_DEFAULT *sequence name or number*
|
||||||
@@ -191,9 +197,6 @@ With the entry of `#define NO_HAPTIC_MOD` in config.h, the following keys will n
|
|||||||
* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered.
|
* `TT()` layer tap toggle keys, when held to activate a layer. However when tapped `TAPPING_TOGGLE` times to permanently toggle the layer, on the last tap haptic feedback is still triggered.
|
||||||
* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md).
|
* `MT()` mod tap keys, when held to keep a usual modifier key pressed. However when tapped, and the key is quickly released, and sends a keycode, haptic feedback is still triggered. See also [Mod-Tap](mod_tap.md).
|
||||||
|
|
||||||
### NO_HAPTIC_FN
|
|
||||||
With the entry of `#define NO_HAPTIC_FN` in config.h, deprecated `fn_actions` type function keys will not trigger a feedback.
|
|
||||||
|
|
||||||
### NO_HAPTIC_ALPHA
|
### NO_HAPTIC_ALPHA
|
||||||
With the entry of `#define NO_HAPTIC_ALPHA` in config.h, none of the alpha keys (A ... Z) will trigger a feedback.
|
With the entry of `#define NO_HAPTIC_ALPHA` in config.h, none of the alpha keys (A ... Z) will trigger a feedback.
|
||||||
|
|
||||||
|
|||||||
@@ -1,57 +1,298 @@
|
|||||||
# HD44780 LCD Displays
|
# HD44780 LCD Driver
|
||||||
|
|
||||||
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
## Supported Hardware
|
||||||
|
|
||||||
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
|
LCD modules using [HD44780U](https://www.sparkfun.com/datasheets/LCD/HD44780.pdf) IC or equivalent, communicating in 4-bit mode.
|
||||||
|
|
||||||
## Configuration
|
|Module|Size |Notes |
|
||||||
|
|------|--------------|---------------------------------|
|
||||||
|
|1602A |16x2, 5x8 dots| |
|
||||||
|
|2004A |20x4, 5x8 dots|Untested, not currently supported|
|
||||||
|
|
||||||
You will need to configure the pins used by your display, and its number of lines and columns in your keyboard's `config.h`.
|
To run these modules at 3.3V, an additional MAX660 voltage converter IC must be soldered on, along with two 10µF capacitors. See [this page](https://www.codrey.com/electronic-circuits/hack-your-16x2-lcd/) for more details.
|
||||||
|
|
||||||
|
|
||||||
Uncomment the section labled HD44780 and change the parameters as needed.
|
|
||||||
````
|
|
||||||
/*
|
|
||||||
* HD44780 LCD Display Configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LCD_LINES 2 //< number of visible lines of the display
|
|
||||||
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
|
|
||||||
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
|
|
||||||
#if LCD_IO_MODE
|
|
||||||
#define LCD_PORT PORTB //< port for the LCD lines
|
|
||||||
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
|
|
||||||
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
|
|
||||||
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
|
|
||||||
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
|
|
||||||
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
|
|
||||||
#define LCD_RS_PORT LCD_PORT //< port for RS line
|
|
||||||
#define LCD_RS_PIN 3 //< pin for RS line
|
|
||||||
#define LCD_RW_PORT LCD_PORT //< port for RW line
|
|
||||||
#define LCD_RW_PIN 2 //< pin for RW line
|
|
||||||
#define LCD_E_PORT LCD_PORT //< port for Enable line
|
|
||||||
#define LCD_E_PIN 1 //< pin for Enable line
|
|
||||||
#endif
|
|
||||||
````
|
|
||||||
|
|
||||||
Should you need to configure other properties you can copy them from `quantum/hd44780.h` and set them in your `config.h`
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To initialize your display, call `lcd_init()` with one of these parameters:
|
Add the following to your `rules.mk`:
|
||||||
````
|
|
||||||
LCD_DISP_OFF : display off
|
|
||||||
LCD_DISP_ON : display on, cursor off
|
|
||||||
LCD_DISP_ON_CURSOR : display on, cursor on
|
|
||||||
LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
|
|
||||||
````
|
|
||||||
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
|
|
||||||
It is advised to clear the display before use.
|
|
||||||
To do so call `lcd_clrscr()`.
|
|
||||||
|
|
||||||
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
|
```make
|
||||||
|
HD44780_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
|
## Basic Configuration
|
||||||
|
|
||||||
|
Add the following to your `config.h`:
|
||||||
|
|
||||||
|
|Define |Default |Description |
|
||||||
|
|-----------------------|--------------|-----------------------------------------------------------------------------------------------------|
|
||||||
|
|`HD44780_DATA_PINS` |*Not defined* |(Required) An array of four GPIO pins connected to the display's D4-D7 pins, eg. `{ B1, B3, B2, B6 }`|
|
||||||
|
|`HD44780_RS_PIN` |*Not defined* |(Required) The GPIO connected to the display's RS pin |
|
||||||
|
|`HD44780_RW_PIN` |*Not defined* |(Required) The GPIO connected to the display's RW pin |
|
||||||
|
|`HD44780_E_PIN` |*Not defined* |(Required) The GPIO connected to the display's E pin |
|
||||||
|
|`HD44780_DISPLAY_COLS` |`16` |The number of visible characters on a single line of the display |
|
||||||
|
|`HD44780_DISPLAY_LINES`|`2` |The number of visible lines on the display |
|
||||||
|
|`HD44780_WRAP_LINES` |*Not defined* |If defined, input characters will wrap to the next line |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Hello World
|
||||||
|
|
||||||
|
Add the following to your `keymap.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
hd44780_init(true, true); // Show blinking cursor
|
||||||
|
hd44780_puts_P(PSTR("Hello, world!\n"));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Character Definition
|
||||||
|
|
||||||
|
Up to eight custom characters can be defined. This data is stored in the Character Generator RAM (CGRAM), and is not persistent across power cycles.
|
||||||
|
|
||||||
|
This example defines the QMK Psi as the first custom character. The first 16 positions in the character set are reserved for the eight custom characters duplicated.
|
||||||
|
|
||||||
|
```
|
||||||
|
Byte | 16 8 4 2 1
|
||||||
|
1 | x x x ■ □ ■ □ ■
|
||||||
|
2 | x x x ■ □ ■ □ ■
|
||||||
|
3 | x x x ■ □ ■ □ ■
|
||||||
|
4 | x x x □ ■ ■ ■ □
|
||||||
|
5 | x x x □ □ ■ □ □
|
||||||
|
6 | x x x □ □ ■ □ □
|
||||||
|
7 | x x x □ □ ■ □ □
|
||||||
|
8 | x x x □ □ □ □ □
|
||||||
|
```
|
||||||
|
|
||||||
|
```c
|
||||||
|
const uint8_t PROGMEM psi[8] = { 0x15, 0x15, 0x15, 0x0E, 0x04, 0x04, 0x04, 0x00 };
|
||||||
|
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
hd44780_init(false, false);
|
||||||
|
hd44780_define_char_P(0, psi);
|
||||||
|
// Cursor is incremented while defining characters so must be reset
|
||||||
|
hd44780_home();
|
||||||
|
// 0x08 to avoid null terminator
|
||||||
|
hd44780_puts_P(PSTR("\x08 QMK Firmware"));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
### `void hd44780_init(bool cursor, bool blink)`
|
||||||
|
|
||||||
|
Initialize the display.
|
||||||
|
|
||||||
|
This function should be called only once, before any of the other functions can be called.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `bool cursor`
|
||||||
|
Whether to show the cursor.
|
||||||
|
- `bool blink`
|
||||||
|
Whether to blink the cursor, if shown.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_clear(void)`
|
||||||
|
|
||||||
|
Clear the display.
|
||||||
|
|
||||||
|
This function is called on init.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_home(void)`
|
||||||
|
|
||||||
|
Move the cursor to the home position.
|
||||||
|
|
||||||
|
This function is called on init.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_on(bool cursor, bool blink)`
|
||||||
|
|
||||||
|
Turn the display on, and/or set the cursor properties.
|
||||||
|
|
||||||
|
This function is called on init.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `bool cursor`
|
||||||
|
Whether to show the cursor.
|
||||||
|
- `bool blink`
|
||||||
|
Whether to blink the cursor, if shown.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_off(void)`
|
||||||
|
|
||||||
|
Turn the display off.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_set_cursor(uint8_t col, uint8_t line)`
|
||||||
|
|
||||||
|
Move the cursor to the specified position on the display.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t col`
|
||||||
|
The column number to move to, from 0 to 15 on 16x2 displays.
|
||||||
|
- `bool line`
|
||||||
|
The line number to move to, either 0 or 1 on 16x2 displays.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_putc(char c)`
|
||||||
|
|
||||||
|
Print a character to the display. The newline character `\n` will move the cursor to the start of the next line.
|
||||||
|
|
||||||
|
The exact character shown may depend on the ROM code of your particular display - refer to the datasheet for the full character set.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `char c`
|
||||||
|
The character to print.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_puts(const char *s)`
|
||||||
|
|
||||||
|
Print a string of characters to the display.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `const char *s`
|
||||||
|
The string to print.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_puts_P(const char *s)`
|
||||||
|
|
||||||
|
Print a string of characters from PROGMEM to the display.
|
||||||
|
|
||||||
|
On ARM devices, this function is simply an alias of `hd44780_puts()`.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `const char *s`
|
||||||
|
The PROGMEM string to print (ie. `PSTR("Hello")`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_define_char(uint8_t index, uint8_t *data)`
|
||||||
|
|
||||||
|
Define a custom character.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t index`
|
||||||
|
The index of the custom character to define, from 0 to 7.
|
||||||
|
- `uint8_t *data`
|
||||||
|
An array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_define_char_P(uint8_t index, const uint8_t *data)`
|
||||||
|
|
||||||
|
Define a custom character from PROGMEM.
|
||||||
|
|
||||||
|
On ARM devices, this function is simply an alias of `hd44780_define_char()`.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t index`
|
||||||
|
The index of the custom character to define, from 0 to 7.
|
||||||
|
- `const uint8_t *data`
|
||||||
|
A PROGMEM array of 8 bytes containing the 5-bit row data of the character, where the first byte is the topmost row, and the least significant bit of each byte is the rightmost column.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `bool hd44780_busy(void)`
|
||||||
|
|
||||||
|
Indicates whether the display is currently processing, and cannot accept instructions.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
`true` if the display is busy.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_write(uint8_t data, bool isData)`
|
||||||
|
|
||||||
|
Write a byte to the display.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t data`
|
||||||
|
The byte to send to the display.
|
||||||
|
- `bool isData`
|
||||||
|
Whether the byte is an instruction or character data.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `uint8_t hd44780_read(bool isData)`
|
||||||
|
|
||||||
|
Read a byte from the display.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `bool isData`
|
||||||
|
Whether to read the current cursor position, or the character at the cursor.
|
||||||
|
|
||||||
|
#### Return Value
|
||||||
|
|
||||||
|
If `isData` is `true`, the returned byte will be the character at the current DDRAM address. Otherwise, it will be the current DDRAM address and the busy flag.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_command(uint8_t command)`
|
||||||
|
|
||||||
|
Send a command to the display. Refer to the datasheet and `hd44780.h` for the valid commands and defines.
|
||||||
|
|
||||||
|
This function waits for the display to clear the busy flag before sending the command.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t command`
|
||||||
|
The command to send.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_data(uint8_t data)`
|
||||||
|
|
||||||
|
Send a byte of data to the display.
|
||||||
|
|
||||||
|
This function waits for the display to clear the busy flag before sending the data.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t data`
|
||||||
|
The byte of data to send.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_set_cgram_address(uint8_t address)`
|
||||||
|
|
||||||
|
Set the CGRAM address.
|
||||||
|
|
||||||
|
This function is used when defining custom characters.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t address`
|
||||||
|
The CGRAM address to move to, from `0x00` to `0x3F`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### `void hd44780_set_ddram_address(uint8_t address)`
|
||||||
|
|
||||||
|
Set the DDRAM address.
|
||||||
|
|
||||||
|
This function is used when printing characters to the display, and setting the cursor.
|
||||||
|
|
||||||
|
#### Arguments
|
||||||
|
|
||||||
|
- `uint8_t address`
|
||||||
|
The DDRAM address to move to, from `0x00` to `0x7F`.
|
||||||
|
|||||||
@@ -150,3 +150,5 @@ Note that the supported AVR MCUs have a 10-bit ADC, and 12-bit for most STM32 MC
|
|||||||
|
|
||||||
Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
|
Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
|
||||||
To trigger a joystick button, just add the corresponding keycode to your keymap.
|
To trigger a joystick button, just add the corresponding keycode to your keymap.
|
||||||
|
|
||||||
|
You can also trigger joystick buttons in code with `register_joystick_button(button)` and `unregister_joystick_button(button)`, where `button` is the 0-based button index (0 = button 1).
|
||||||
|
|||||||
@@ -19,4 +19,5 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
|
|||||||
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
|
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
|
||||||
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
|
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
|
||||||
|
|
||||||
Switching layers will not cancel the Key Lock.
|
Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ void matrix_scan_user(void) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
As you can see, you have a few function. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences.
|
As you can see, you have a few functions. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences.
|
||||||
|
|
||||||
Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
|
Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously.
|
||||||
|
|
||||||
@@ -74,9 +74,9 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
|
|||||||
|
|
||||||
## Infinite Leader key timeout
|
## Infinite Leader key timeout
|
||||||
|
|
||||||
Sometimes your leader key is not on a comfortable places as the rest of keys on your sequence. Imagine that your leader key is one of your outer top right keys, you may need to reposition your hand just to reach your leader key.
|
Sometimes your leader key is not on a comfortable place as the rest of keys on your sequence. Imagine that your leader key is one of your outer top right keys, you may need to reposition your hand just to reach your leader key.
|
||||||
This can make typing the entire sequence on time hard even if you are able to type most of the sequence fast. For example, if your sequence is `Leader + asd` typing `asd` fast is very easy once you have your hands in your home row. However starting the sequence in time after moving your hand out of the home row to reach the leader key and back is not.
|
This can make typing the entire sequence on time hard even if you are able to type most of the sequence fast. For example, if your sequence is `Leader + asd` typing `asd` fast is very easy once you have your hands in your home row. However starting the sequence in time after moving your hand out of the home row to reach the leader key and back is not.
|
||||||
To remove the stress this situation produces to your hands you can enable an infinite timeout just for the leader key. This mean that, after you hit the leader key you will have an infinite amount of time to start the rest of the sequence, allowing you to proper position your hands on the best position to type the rest of the sequence comfortably.
|
To remove the stress this situation produces to your hands you can enable an infinite timeout just for the leader key. This means that after you hit the leader key you will have an infinite amount of time to start the rest of the sequence, allowing you to proper position your hands on the best position to type the rest of the sequence comfortably.
|
||||||
This infinite timeout only affects the leader key, so in our previous example of `Leader + asd` you will have an infinite amount of time between `Leader` and `a`, but once you start the sequence the timeout you have configured (global or per key) will work normally.
|
This infinite timeout only affects the leader key, so in our previous example of `Leader + asd` you will have an infinite amount of time between `Leader` and `a`, but once you start the sequence the timeout you have configured (global or per key) will work normally.
|
||||||
This way you can configure a very short `LEADER_TIMEOUT` but still have plenty of time to position your hands.
|
This way you can configure a very short `LEADER_TIMEOUT` but still have plenty of time to position your hands.
|
||||||
|
|
||||||
@@ -89,11 +89,11 @@ In order to enable this, place this in your `config.h`:
|
|||||||
|
|
||||||
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
|
||||||
|
|
||||||
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
|
While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by adding `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
|
||||||
|
|
||||||
## Customization
|
## Customization
|
||||||
|
|
||||||
The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`.
|
The Leader Key feature has some additional customization to how the Leader Key feature works. It has two functions that can be called at certain parts of the process. Namely `leader_start()` and `leader_end()`.
|
||||||
|
|
||||||
The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
|
The `leader_start()` function is called when you tap the `KC_LEAD` key, and the `leader_end()` function is called when either the leader sequence is completed, or the leader timeout is hit.
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ QMK provides methods to read 5 of the LEDs defined in the HID spec:
|
|||||||
* Kana
|
* Kana
|
||||||
|
|
||||||
There are three ways to get the lock LED state:
|
There are three ways to get the lock LED state:
|
||||||
* by specifying configuration options within `config.h`
|
* Configuration options in `config.h`
|
||||||
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
|
* Implement `led_update_*` function
|
||||||
* by calling `led_t host_keyboard_led_state()`
|
* Call `led_t host_keyboard_led_state()`
|
||||||
|
|
||||||
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
|
!> The `host_keyboard_led_state()` may reflect an updated state before `led_update_user()` is called.
|
||||||
|
|
||||||
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
|
Two deprecated functions that provide the LED state as `uint8_t`:
|
||||||
|
|
||||||
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
|
||||||
* `uint8_t host_keyboard_leds()`
|
* `uint8_t host_keyboard_leds()`
|
||||||
@@ -37,23 +37,20 @@ To configure the indicators, `#define` these in your `config.h`:
|
|||||||
|
|
||||||
Unless you are designing your own keyboard, you generally should not need to change the above config options.
|
Unless you are designing your own keyboard, you generally should not need to change the above config options.
|
||||||
|
|
||||||
## `led_update_*()`
|
## LED update function
|
||||||
|
|
||||||
When the configuration options do not provide enough flexibility, the API hooks provided allow custom control of the LED behavior. These functions will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
|
When the configuration options do not provide enough flexibility, the following callbacks allow custom control of the LED behavior. These functions will be called when one of those 5 LEDs changes state:
|
||||||
|
|
||||||
By convention, return `true` from `led_update_user()` to get the `led_update_kb()` hook to run its code, and
|
* Keyboard/revision: `bool led_update_kb(led_t led_state)`
|
||||||
return `false` when you would prefer not to run the code in `led_update_kb()`.
|
* Keymap: `bool led_update_user(led_t led_state)`
|
||||||
|
|
||||||
Some examples include:
|
Both receives LED state as a struct parameter. Returning `true` in `led_update_user()` will allow the keyboard level code in `led_update_kb()` to run as well. Returning `false` will override the keyboard level code, depending on how the keyboard level function is set up.
|
||||||
|
|
||||||
- overriding the LEDs to use them for something else like layer indication
|
?> This boolean return type of `led_update_user` allows for overriding keyboard LED controls, and is thus recommended over the void `led_set_user` function.
|
||||||
- return `false` because you do not want the `_kb()` function to run, as it would override your layer behavior.
|
|
||||||
- play a sound when an LED turns on or off.
|
|
||||||
- return `true` because you want the `_kb` function to run, and this is in addition to the default LED behavior.
|
|
||||||
|
|
||||||
?> Because the `led_set_*` functions return `void` instead of `bool`, they do not allow for overriding the keyboard LED control, and thus it's recommended to use `led_update_*` instead.
|
### Example of keyboard LED update implementation
|
||||||
|
|
||||||
### Example `led_update_kb()` Implementation
|
This is a template indicator function that can be implemented on keyboard level code:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool led_update_kb(led_t led_state) {
|
bool led_update_kb(led_t led_state) {
|
||||||
@@ -74,9 +71,9 @@ bool led_update_kb(led_t led_state) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example `led_update_user()` Implementation
|
### Example of user LED update implementation
|
||||||
|
|
||||||
This incomplete example would play a sound if Caps Lock is turned on or off. It returns `true`, because you also want the LEDs to maintain their state.
|
This is an incomplete example will play a sound if Caps Lock is turned on or off. It returns `true` to allow keyboard LED function to maintain their state.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#ifdef AUDIO_ENABLE
|
#ifdef AUDIO_ENABLE
|
||||||
@@ -96,18 +93,17 @@ bool led_update_user(led_t led_state) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### `led_update_*` Function Documentation
|
## Host keyboard LED state
|
||||||
|
|
||||||
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
|
The `host_keyboard_led_state()` function will report the LED state returned from the host computer as `led_t`. This is useful for reading the LED state outside `led_update_*`. For example, you can get the boolean state of Caps Lock from the host with:
|
||||||
* Keymap: `bool led_update_user(led_t led_state)`
|
|
||||||
|
|
||||||
## `host_keyboard_led_state()`
|
```c
|
||||||
|
bool caps = host_keyboard_led_state().caps_lock;
|
||||||
Call this function to get the last received LED state as a `led_t`. This is useful for reading the LED state outside `led_update_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
|
```
|
||||||
|
|
||||||
## Setting Physical LED State
|
## Setting Physical LED State
|
||||||
|
|
||||||
Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
|
Some keyboard implementations provide convenient methods for setting the state of the physical LEDs.
|
||||||
|
|
||||||
### Ergodox Boards
|
### Ergodox Boards
|
||||||
|
|
||||||
|
|||||||
@@ -67,6 +67,109 @@ const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
|
|||||||
|
|
||||||
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/led/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
Where `Cx_y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3731.pdf) and the header file `drivers/led/issi/is31fl3731-simple.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
||||||
|
|
||||||
|
---
|
||||||
|
### IS31FLCOMMON :id=is31flcommon
|
||||||
|
|
||||||
|
There is basic support for addressable LED matrix lighting with a selection of I2C ISSI Lumissil LED controllers through a shared common driver. To enable it, add this to your `rules.mk`:
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
LED_MATRIX_ENABLE = yes
|
||||||
|
LED_MATRIX_DRIVER = <driver name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<driver name>` is the applicable LED driver chip as below
|
||||||
|
|
||||||
|
| Driver Name | Data Sheet | Capability |
|
||||||
|
|-------------|------------|------------|
|
||||||
|
| `IS31FL3742A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3742A_DS.pdf) | 180 LED, 30x6 Matrix |
|
||||||
|
| `ISSIFL3743A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3743A_DS.pdf) | 198 LED, 18x11 Matrix |
|
||||||
|
| `IS31FL3745` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3745_DS.pdf) | 144 LED, 18x8 Matrix |
|
||||||
|
| `IS31FL3746A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3746A_DS.pdf) | 72 LED, 18x4 Matrix |
|
||||||
|
|
||||||
|
You can use between 1 and 4 IC's. Do not specify `DRIVER_ADDR_<N>` define for IC's if not present on your keyboard. The `DRIVER_ADDR_1` default assumes that all Address pins on the controller have been connected to GND. Drivers that have SYNC functionality have the default settings to disable if 1 driver. If more than 1 drivers then `DRIVER_ADDR_1` will be set to Master and the remaiing ones set to Slave.
|
||||||
|
|
||||||
|
Configure the hardware via your `config.h`:
|
||||||
|
|
||||||
|
| Variable | Description | Default |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
|
| `DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
|
||||||
|
| `DRIVER_LED_TOTAL` | (Required) How many LED lights are present across all drivers | |
|
||||||
|
| `DRIVER_ADDR_1` | (Optional) Address for the first LED driver | |
|
||||||
|
| `DRIVER_ADDR_<N>` | (Required) Address for the additional LED drivers | |
|
||||||
|
| `ISSI_SSR_<N>` | (Optional) Configuration for the Spread Spectrum Register | |
|
||||||
|
| `ISSI_CONFIGURATION` | (Optional) Configuration for the Configuration Register | |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
|
| `ISSI_PULLDOWNUP` | (Optional) Configuration for the Pull Up & Pull Down Register | |
|
||||||
|
| `ISSI_TEMP` | (Optional) Configuration for the Tempature Register | |
|
||||||
|
| `ISSI_PWM_ENABLE` | (Optional) Configuration for the PWM Enable Register | |
|
||||||
|
| `ISSI_PWM_SET` | (Optional) Configuration for the PWM Setting Register | |
|
||||||
|
| `ISSI_SCAL_LED ` | (Optional) Configuration for the LEDs Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_MANUAL_SCALING` | (Optional) If you wish to configure the Scaling Registers manually | |
|
||||||
|
|
||||||
|
|
||||||
|
Defaults
|
||||||
|
|
||||||
|
| Variable | IS31FL3742A | IS31FL3743A | IS31FL3745 | IS31FL3746 |
|
||||||
|
|----------|-------------|-------------|------------|------------|
|
||||||
|
| `DRIVER_ADDR_1` | 0b0110000 | 0b0100000 | 0b0100000 | 0b1100000 |
|
||||||
|
| `ISSI_SSR_1` | 0x00 | 0x00 / 0x60 | 0x00 / 0xC0 | 0x00 |
|
||||||
|
| `ISSI_SSR_<2-4>` | 0x00 | 0x40 | 0x80 | 0x00 |
|
||||||
|
| `ISSI_CONFIGURATION` | 0x31 | 0x01 | 0x31 | 0x01 |
|
||||||
|
| `ISSI_PULLDOWNUP` | 0x55 | 0x33 | 0x33 | 0x33 |
|
||||||
|
| `ISSI_TEMP` | N/A | 0x00 | 0x00 | 0x00 |
|
||||||
|
| `ISSI_PWM_ENABLE` | N/A | N/A | N/A | 0x00 |
|
||||||
|
| `ISSI_PWM_SET` | 0x00 | N/A | N/A | 0x00 |
|
||||||
|
|
||||||
|
Here is an example using 2 drivers.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DRIVER_ADDR_2 0b0100001
|
||||||
|
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 66
|
||||||
|
#define DRIVER_2_LED_TOTAL 42
|
||||||
|
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
```
|
||||||
|
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||||
|
|
||||||
|
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
|
||||||
|
|
||||||
|
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
/* Refer to IS31 manual for these locations
|
||||||
|
* driver
|
||||||
|
* | LED address
|
||||||
|
* | | */
|
||||||
|
{ 0, CS1_SW1 },
|
||||||
|
{ 0, CS2_SW1 },
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `CSx_SWx` is the location of the LED in the matrix defined by the datasheet. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||||
|
|
||||||
|
`ISSI_MANUAL_SCALING` is used to override the Scaling for individual LED's. By default they will be set as per `ISSI_SCAL_LED`. In `config.h` set how many LED's you want to manually set scaling for.
|
||||||
|
Eg `#define ISSI_MANUAL_SCALING 3`
|
||||||
|
|
||||||
|
Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||||
|
* LED Index
|
||||||
|
* | Scaling
|
||||||
|
* | | */
|
||||||
|
{5, 120},
|
||||||
|
{9, 120},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where LED Index is the position of the LED in the `g_is31_leds` array. The `scaling` value between 0 and 255 to be written to the Scaling Register.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Common Configuration :id=common-configuration
|
## Common Configuration :id=common-configuration
|
||||||
@@ -161,11 +264,11 @@ enum led_matrix_effects {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`:
|
You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `config.h`:
|
||||||
|
|
||||||
|
|
||||||
|Define |Description |
|
|Define |Description |
|
||||||
|-------------------------------------------------------|-----------------------------------------------|
|
|-------------------------------------------------------|----------------------------------------------|
|
||||||
|`#define ENABLE_LED_MATRIX_ALPHAS_MODS` |Enables `LED_MATRIX_ALPHAS_MODS` |
|
|`#define ENABLE_LED_MATRIX_ALPHAS_MODS` |Enables `LED_MATRIX_ALPHAS_MODS` |
|
||||||
|`#define ENABLE_LED_MATRIX_BREATHING` |Enables `LED_MATRIX_BREATHING` |
|
|`#define ENABLE_LED_MATRIX_BREATHING` |Enables `LED_MATRIX_BREATHING` |
|
||||||
|`#define ENABLE_LED_MATRIX_BAND` |Enables `LED_MATRIX_BAND` |
|
|`#define ENABLE_LED_MATRIX_BAND` |Enables `LED_MATRIX_BAND` |
|
||||||
@@ -175,6 +278,13 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
|||||||
|`#define ENABLE_LED_MATRIX_CYCLE_UP_DOWN` |Enables `LED_MATRIX_CYCLE_UP_DOWN` |
|
|`#define ENABLE_LED_MATRIX_CYCLE_UP_DOWN` |Enables `LED_MATRIX_CYCLE_UP_DOWN` |
|
||||||
|`#define ENABLE_LED_MATRIX_CYCLE_OUT_IN` |Enables `LED_MATRIX_CYCLE_OUT_IN` |
|
|`#define ENABLE_LED_MATRIX_CYCLE_OUT_IN` |Enables `LED_MATRIX_CYCLE_OUT_IN` |
|
||||||
|`#define ENABLE_LED_MATRIX_DUAL_BEACON` |Enables `LED_MATRIX_DUAL_BEACON` |
|
|`#define ENABLE_LED_MATRIX_DUAL_BEACON` |Enables `LED_MATRIX_DUAL_BEACON` |
|
||||||
|
|`#define ENABLE_LED_MATRIX_WAVE_LEFT_RIGHT` |Enables `LED_MATRIX_WAVE_LEFT_RIGHT` |
|
||||||
|
|`#define ENABLE_LED_MATRIX_WAVE_UP_DOWN` |Enables `LED_MATRIX_WAVE_UP_DOWN` |
|
||||||
|
|
||||||
|
?> These modes don't require any additional defines.
|
||||||
|
|
||||||
|
|Reactive Defines |Description |
|
||||||
|
|-------------------------------------------------------|----------------------------------------------|
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE` |Enables `LED_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_SIMPLE` |Enables `LED_MATRIX_SOLID_REACTIVE_SIMPLE` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_WIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_WIDE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_WIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_WIDE` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTIWIDE` |
|
||||||
@@ -184,8 +294,8 @@ You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `con
|
|||||||
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTINEXUS`|
|
|`#define ENABLE_LED_MATRIX_SOLID_REACTIVE_MULTINEXUS` |Enables `LED_MATRIX_SOLID_REACTIVE_MULTINEXUS`|
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_SPLASH` |Enables `LED_MATRIX_SOLID_SPLASH` |
|
|`#define ENABLE_LED_MATRIX_SOLID_SPLASH` |Enables `LED_MATRIX_SOLID_SPLASH` |
|
||||||
|`#define ENABLE_LED_MATRIX_SOLID_MULTISPLASH` |Enables `LED_MATRIX_SOLID_MULTISPLASH` |
|
|`#define ENABLE_LED_MATRIX_SOLID_MULTISPLASH` |Enables `LED_MATRIX_SOLID_MULTISPLASH` |
|
||||||
|`#define ENABLE_LED_MATRIX_WAVE_LEFT_RIGHT` |Enables `LED_MATRIX_WAVE_LEFT_RIGHT` |
|
|
||||||
|`#define ENABLE_LED_MATRIX_WAVE_UP_DOWN` |Enables `LED_MATRIX_WAVE_UP_DOWN` |
|
?> These modes also require the `LED_MATRIX_KEYPRESSES` or `LED_MATRIX_KEYRELEASES` define to be available.
|
||||||
|
|
||||||
## Custom LED Matrix Effects :id=custom-led-matrix-effects
|
## Custom LED Matrix Effects :id=custom-led-matrix-effects
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,8 @@ Only basic keycodes (prefixed by `KC_`) are supported. Do not include the `KC_`
|
|||||||
|
|
||||||
### `SEND_STRING()` & `process_record_user`
|
### `SEND_STRING()` & `process_record_user`
|
||||||
|
|
||||||
|
See also: [Send String](feature_send_string.md)
|
||||||
|
|
||||||
Sometimes you want a key to type out words or phrases. For the most common situations, we've provided `SEND_STRING()`, which will type out a string (i.e. a sequence of characters) for you. All ASCII characters that are easily translatable to a keycode are supported (e.g. `qmk 123\n\t`).
|
Sometimes you want a key to type out words or phrases. For the most common situations, we've provided `SEND_STRING()`, which will type out a string (i.e. a sequence of characters) for you. All ASCII characters that are easily translatable to a keycode are supported (e.g. `qmk 123\n\t`).
|
||||||
|
|
||||||
Here is an example `keymap.c` for a two-key keyboard:
|
Here is an example `keymap.c` for a two-key keyboard:
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ MIDI_ENABLE = yes
|
|||||||
|
|
||||||
There are two MIDI systems in QMK: basic and advanced. With basic MIDI you will only be able to send Note On and Note Off messages using the note keycodes, meaning that keycodes like `MI_OCTU` and `MI_OCTD` will not work. Advanced MIDI allows you to do things like octave shifts, channel changes, velocity changes, modulation, and more.
|
There are two MIDI systems in QMK: basic and advanced. With basic MIDI you will only be able to send Note On and Note Off messages using the note keycodes, meaning that keycodes like `MI_OCTU` and `MI_OCTD` will not work. Advanced MIDI allows you to do things like octave shifts, channel changes, velocity changes, modulation, and more.
|
||||||
|
|
||||||
|
### Caveats
|
||||||
|
|
||||||
|
MIDI requires 2 USB endpoints and as such may not work on some hardware such as V-USB controllers.
|
||||||
|
|
||||||
### Basic MIDI
|
### Basic MIDI
|
||||||
|
|
||||||
To enable basic MIDI, add the following to your `config.h`:
|
To enable basic MIDI, add the following to your `config.h`:
|
||||||
@@ -254,7 +258,7 @@ For the above, the `MI_C` keycode will produce a C3 (note number 48), and so on.
|
|||||||
<!--
|
<!--
|
||||||
#### QMK Internals (Autogenerated)
|
#### QMK Internals (Autogenerated)
|
||||||
|
|
||||||
* [Internals/MIDI Device Setup Process](internals_midi_device_setup_process.md)
|
* [Internals/MIDI Device Setup Process](internals/midi_device_setup_process.md)
|
||||||
* [Internals/MIDI Device](internals_midi_device.md)
|
* [Internals/MIDI Device](internals/midi_device.md)
|
||||||
* [Internals/MIDI Util](internals_midi_util.md)
|
* [Internals/MIDI Util](internals/midi_util.md)
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -59,13 +59,13 @@ This is the default mode. You can adjust the cursor and scrolling acceleration u
|
|||||||
|
|
||||||
|Define |Default|Description |
|
|Define |Default|Description |
|
||||||
|----------------------------|-------|---------------------------------------------------------|
|
|----------------------------|-------|---------------------------------------------------------|
|
||||||
|`MOUSEKEY_DELAY` |300 |Delay between pressing a movement key and cursor movement|
|
|`MOUSEKEY_DELAY` |10 |Delay between pressing a movement key and cursor movement|
|
||||||
|`MOUSEKEY_INTERVAL` |50 |Time between cursor movements in milliseconds |
|
|`MOUSEKEY_INTERVAL` |20 |Time between cursor movements in milliseconds |
|
||||||
|`MOUSEKEY_MOVE_DELTA` |5 |Step size |
|
|`MOUSEKEY_MOVE_DELTA` |8 |Step size |
|
||||||
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|
|`MOUSEKEY_MAX_SPEED` |10 |Maximum cursor speed at which acceleration stops |
|
||||||
|`MOUSEKEY_TIME_TO_MAX` |20 |Time until maximum cursor speed is reached |
|
|`MOUSEKEY_TIME_TO_MAX` |30 |Time until maximum cursor speed is reached |
|
||||||
|`MOUSEKEY_WHEEL_DELAY` |300 |Delay between pressing a wheel key and wheel movement |
|
|`MOUSEKEY_WHEEL_DELAY` |10 |Delay between pressing a wheel key and wheel movement |
|
||||||
|`MOUSEKEY_WHEEL_INTERVAL` |100 |Time between wheel movements |
|
|`MOUSEKEY_WHEEL_INTERVAL` |80 |Time between wheel movements |
|
||||||
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|
|`MOUSEKEY_WHEEL_MAX_SPEED` |8 |Maximum number of scroll steps per scroll action |
|
||||||
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
|
|`MOUSEKEY_WHEEL_TIME_TO_MAX`|40 |Time until maximum scroll speed is reached |
|
||||||
|
|
||||||
@@ -85,11 +85,11 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
|
|||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|--------------------------------------|---------|---------------------------------------------------------------|
|
|--------------------------------------|---------|---------------------------------------------------------------|
|
||||||
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|
||||||
|`MOUSEKEY_DELAY` |8 |Delay between pressing a movement key and cursor movement |
|
|`MOUSEKEY_DELAY` |5 |Delay between pressing a movement key and cursor movement |
|
||||||
|`MOUSEKEY_INTERVAL` |8 |Time between cursor movements in milliseconds |
|
|`MOUSEKEY_INTERVAL` |10 |Time between cursor movements in milliseconds |
|
||||||
|`MOUSEKEY_MOVE_DELTA` |25 |Step size for accelerating from initial to base speed |
|
|`MOUSEKEY_MOVE_DELTA` |16 |Step size for accelerating from initial to base speed |
|
||||||
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
|
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
|
||||||
|`MOUSEKEY_BASE_SPEED` |1000 |Maximum cursor speed at which acceleration stops |
|
|`MOUSEKEY_BASE_SPEED` |5000 |Maximum cursor speed at which acceleration stops |
|
||||||
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|
||||||
|`MOUSEKEY_ACCELERATED_SPEED` |3000 |Accelerated cursor speed |
|
|`MOUSEKEY_ACCELERATED_SPEED` |3000 |Accelerated cursor speed |
|
||||||
|`MOUSEKEY_WHEEL_INITIAL_MOVEMENTS` |16 |Initial number of movements of the mouse wheel |
|
|`MOUSEKEY_WHEEL_INITIAL_MOVEMENTS` |16 |Initial number of movements of the mouse wheel |
|
||||||
@@ -100,7 +100,7 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
|
|||||||
Tips:
|
Tips:
|
||||||
|
|
||||||
* The smoothness of the cursor movement depends on the `MOUSEKEY_INTERVAL` setting. The shorter the interval is set the smoother the movement will be. Setting the value too low makes the cursor unresponsive. Lower settings are possible if the micro processor is fast enough. For example: At an interval of `8` milliseconds, `125` movements per second will be initiated. With a base speed of `1000` each movement will move the cursor by `8` pixels.
|
* The smoothness of the cursor movement depends on the `MOUSEKEY_INTERVAL` setting. The shorter the interval is set the smoother the movement will be. Setting the value too low makes the cursor unresponsive. Lower settings are possible if the micro processor is fast enough. For example: At an interval of `8` milliseconds, `125` movements per second will be initiated. With a base speed of `1000` each movement will move the cursor by `8` pixels.
|
||||||
* Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `1`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second.
|
* Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `2`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second.
|
||||||
|
|
||||||
### Constant mode
|
### Constant mode
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and hardware driven. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
|
Pointing Device is a generic name for a feature intended to be generic: moving the system pointer around. There are certainly other options for it - like mousekeys - but this aims to be easily modifiable and hardware driven. You can implement custom keys to control functionality, or you can gather information from other peripherals and insert it directly here - let QMK handle the processing for you.
|
||||||
|
|
||||||
To enable Pointing Device, uncomment the following line in your rules.mk:
|
To enable Pointing Device, add the following line in your rules.mk and specify one of the driver options below.
|
||||||
|
|
||||||
```make
|
```make
|
||||||
POINTING_DEVICE_ENABLE = yes
|
POINTING_DEVICE_ENABLE = yes
|
||||||
@@ -22,11 +22,11 @@ POINTING_DEVICE_DRIVER = adns5050
|
|||||||
|
|
||||||
The ADNS 5050 sensor uses a serial type protocol for communication, and requires an additional light source.
|
The ADNS 5050 sensor uses a serial type protocol for communication, and requires an additional light source.
|
||||||
|
|
||||||
| Setting | Description |
|
| Setting | Description |
|
||||||
|--------------------|---------------------------------------------------------------------|
|
| ------------------- | ------------------------------------------------------------------- |
|
||||||
|`ADNS5050_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. |
|
| `ADNS5050_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. |
|
||||||
|`ADNS5050_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. |
|
| `ADNS5050_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. |
|
||||||
|`ADNS5050_CS_PIN` | (Required) The pin connected to the cable select pin of the sensor. |
|
| `ADNS5050_CS_PIN` | (Required) The pin connected to the cable select pin of the sensor. |
|
||||||
|
|
||||||
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
|
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
|
||||||
|
|
||||||
@@ -40,13 +40,13 @@ POINTING_DEVICE_DRIVER = adns9800
|
|||||||
|
|
||||||
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking.
|
The ADNS 9800 is an SPI driven optical sensor, that uses laser output for surface tracking.
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|------------------------|------------------------------------------------------------------------|---------------|
|
| ----------------------- | ---------------------------------------------------------------------- | ------------- |
|
||||||
|`ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
| `ADNS9800_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
||||||
|`ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
| `ADNS9800_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
||||||
|`ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
| `ADNS9800_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
||||||
|`ADNS9800_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
| `ADNS9800_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
||||||
|`ADNS9800_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
| `ADNS9800_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
||||||
|
|
||||||
|
|
||||||
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.
|
||||||
@@ -61,17 +61,16 @@ POINTING_DEVICE_DRIVER = analog_joystick
|
|||||||
|
|
||||||
The Analog Joystick is an analog (ADC) driven sensor. There are a variety of joysticks that you can use for this.
|
The Analog Joystick is an analog (ADC) driven sensor. There are a variety of joysticks that you can use for this.
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|----------------------------------|----------------------------------------------------------------------------|---------------|
|
| --------------------------------- | -------------------------------------------------------------------------- | ------------- |
|
||||||
|`ANALOG_JOYSTICK_X_AXIS_PIN` | (Required) The pin used for the vertical/X axis. | _not defined_ |
|
| `ANALOG_JOYSTICK_X_AXIS_PIN` | (Required) The pin used for the vertical/X axis. | _not defined_ |
|
||||||
|`ANALOG_JOYSTICK_Y_AXIS_PIN` | (Required) The pin used for the horizontal/Y axis. | _not defined_ |
|
| `ANALOG_JOYSTICK_Y_AXIS_PIN` | (Required) The pin used for the horizontal/Y axis. | _not defined_ |
|
||||||
|`ANALOG_JOYSTICK_AXIS_MIN` | (Optional) Sets the lower range to be considered movement. | `0` |
|
| `ANALOG_JOYSTICK_AXIS_MIN` | (Optional) Sets the lower range to be considered movement. | `0` |
|
||||||
|`ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|
| `ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|
||||||
|`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
|
| `ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
|
||||||
|`ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
|
| `ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
|
||||||
|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maxiumum value used for motion. | `2` |
|
| `ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
|
||||||
|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
|
| `ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
|
||||||
|
|
||||||
|
|
||||||
### Cirque Trackpad
|
### Cirque Trackpad
|
||||||
|
|
||||||
@@ -90,29 +89,70 @@ POINTING_DEVICE_DRIVER = cirque_pinnacle_spi
|
|||||||
|
|
||||||
This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the TM040040, TM035035 and the TM023023 trackpads. These are I2C or SPI compatible, and both configurations are supported.
|
This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the TM040040, TM035035 and the TM023023 trackpads. These are I2C or SPI compatible, and both configurations are supported.
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|---------------------------------|---------------------------------------------------------------------------------|-----------------------|
|
| -------------------------------- | ---------------------------------------------------------- | ------------------ |
|
||||||
|`CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` |
|
| `CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` |
|
||||||
|`CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` |
|
| `CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` |
|
||||||
|`CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` |
|
| `CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` |
|
||||||
|`CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` |
|
| `CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` |
|
||||||
|`CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|
| `CIRQUE_PINNACLE_DIAMETER_MM` | (Optional) Diameter of the trackpad sensor in millimeters. | `40` |
|
||||||
|`CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|
| `CIRQUE_PINNACLE_ATTENUATION` | (Optional) Sets the attenuation of the sensor data. | `ADC_ATTENUATE_4X` |
|
||||||
|
| `CIRQUE_PINNACLE_CURVED_OVERLAY` | (Optional) Applies settings tuned for curved overlay. | _not defined_ |
|
||||||
|
|
||||||
| I2C Setting | Description | Default |
|
**`CIRQUE_PINNACLE_ATTENUATION`** is a measure of how much data is suppressed in regards to sensitivity. The higher the attenuation, the less sensitive the touchpad will be.
|
||||||
|--------------------------|---------------------------------------------------------------------------------|---------|
|
|
||||||
|`CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` |
|
|
||||||
|`CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` |
|
|
||||||
|
|
||||||
| SPI Setting | Description | Default |
|
Default attenuation is set to 4X, although if you are using a thicker overlay (such as the curved overlay) you will want a lower attenuation such as 2X. The possible values are:
|
||||||
|-------------------------------|------------------------------------------------------------------------|---------------|
|
* `ADC_ATTENUATE_4X`: Least sensitive
|
||||||
|`CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` |
|
* `ADC_ATTENUATE_3X`
|
||||||
|`CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
* `ADC_ATTENUATE_2X`
|
||||||
|`CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` |
|
* `ADC_ATTENUATE_1X`: Most sensitive
|
||||||
|`CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
|
||||||
|`CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
| I2C Setting | Description | Default |
|
||||||
|
| ------------------------- | ------------------------------------------------------------------------------- | ------- |
|
||||||
|
| `CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` |
|
||||||
|
| `CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` |
|
||||||
|
|
||||||
|
| SPI Setting | Description | Default |
|
||||||
|
| ------------------------------ | ---------------------------------------------------------------------- | ------------- |
|
||||||
|
| `CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` |
|
||||||
|
| `CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
||||||
|
| `CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` |
|
||||||
|
| `CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
||||||
|
| `CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
||||||
|
|
||||||
|
Default Scaling is 1024. Actual CPI depends on trackpad diameter.
|
||||||
|
|
||||||
|
Also see the `POINTING_DEVICE_TASK_THROTTLE_MS`, which defaults to 10ms when using Cirque Pinnacle, which matches the internal update rate of the position registers (in standard configuration). Advanced configuration for pen/stylus usage might require lower values.
|
||||||
|
|
||||||
|
#### Cirque Trackpad gestures
|
||||||
|
|
||||||
|
| Gesture Setting | Description | Default |
|
||||||
|
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------- |
|
||||||
|
| `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE` | (Optional) Enable inertial cursor. Cursor continues moving after a flick gesture and slows down by kinetic friction | _not defined_ |
|
||||||
|
| `CIRQUE_PINNACLE_CIRCULAR_SCROLL_ENABLE` | (Optional) Enable circular scroll. Touch originating in outer ring can trigger scroll by moving along the perimeter. Near side triggers vertical scroll and far side triggers horizontal scroll. | _not defined_ |
|
||||||
|
| `CIRQUE_PINNACLE_TAP_ENABLE` | (Optional) Enable tap to click. This currently only works on the master side. | _not defined_ |
|
||||||
|
| `CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|
||||||
|
| `CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|
||||||
|
|
||||||
|
**`POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`** is not specific to Cirque trackpad; any pointing device with a lift/contact status can integrate this gesture into its driver. 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 `pointing_device_get_report()` is needed to generate glide reports.
|
||||||
|
|
||||||
|
### PAW 3204 Sensor
|
||||||
|
|
||||||
|
To use the paw 3204 sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
|
```make
|
||||||
|
POINTING_DEVICE_DRIVER = paw3204
|
||||||
|
```
|
||||||
|
|
||||||
|
The paw 3204 sensor uses a serial type protocol for communication, and requires an additional light source.
|
||||||
|
|
||||||
|
| Setting | Description |
|
||||||
|
|--------------------|---------------------------------------------------------------------|
|
||||||
|
|`PAW3204_SCLK_PIN` | (Required) The pin connected to the clock pin of the sensor. |
|
||||||
|
|`PAW3204_SDIO_PIN` | (Required) The pin connected to the data pin of the sensor. |
|
||||||
|
|
||||||
|
The CPI range is 400-1600, with supported values of (400, 500, 600, 800, 1000, 1200 and 1600). Defaults to 1000 CPI.
|
||||||
|
|
||||||
Default Scaling/CPI is 1024.
|
|
||||||
|
|
||||||
### Pimoroni Trackball
|
### Pimoroni Trackball
|
||||||
|
|
||||||
@@ -124,41 +164,85 @@ 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 | Description | Default |
|
| Setting | Description | Default |
|
||||||
|-------------------------------------|------------------------------------------------------------------------------------|---------|
|
| ------------------------------------ | ---------------------------------------------------------------------------------- | ------- |
|
||||||
|`PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
|
| `PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
|
||||||
|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `100` |
|
| `PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackball in milliseconds. | `100` |
|
||||||
|`PIMORONI_TRACKBALL_INTERVAL_MS` | (Optional) The update/read interval for the sensor in milliseconds. | `8` |
|
| `PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
|
||||||
|`PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
|
| `PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
|
||||||
|`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
|
| `PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
|
||||||
|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
|
|
||||||
|
|
||||||
### PMW 3360 Sensor
|
### PMW 3360 and PMW 3389 Sensor
|
||||||
|
|
||||||
To use the PMW 3360 sensor, add this to your `rules.mk`
|
This drivers supports both the PMW 3360 and PMW 3389 sensor as well as multiple sensors of the same type _per_ controller, so 2 can be attached at the same side for split keyboards (or unsplit keyboards).
|
||||||
|
|
||||||
|
To use the **PMW 3360** sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
```make
|
```make
|
||||||
POINTING_DEVICE_DRIVER = pmw3360
|
POINTING_DEVICE_DRIVER = pmw3360
|
||||||
```
|
```
|
||||||
|
|
||||||
The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for surface tracking.
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
|
|
||||||
|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
|
||||||
|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
|
||||||
|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|
|
||||||
|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
|
|
||||||
|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
|
||||||
|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
|
|
||||||
|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
|
|
||||||
|
|
||||||
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
|
||||||
|
|
||||||
|
To use the **PMW 3389** sensor, add this to your `rules.mk`
|
||||||
|
|
||||||
|
```make
|
||||||
|
POINTING_DEVICE_DRIVER = pmw3389
|
||||||
|
```
|
||||||
|
|
||||||
|
The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
|
||||||
|
|
||||||
|
Both PMW 3360 and PMW 3389 are SPI driven optical sensors, that use a built in IR LED for surface tracking.
|
||||||
|
|
||||||
|
| Setting | Description | Default |
|
||||||
|
| ---------------------------- | ------------------------------------------------------------------------------------------- | ------------- |
|
||||||
|
| `PMW33XX_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
|
||||||
|
| `PMW33XX_CS_PINS` | (Alternative) Sets the Cable Select pins connected to multiple sensors. | _not defined_ |
|
||||||
|
| `PMW33XX_CPI` | (Optional) Sets counts per inch sensitivity of the sensor. | _varies_ |
|
||||||
|
| `PMW33XX_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
|
||||||
|
| `PMW33XX_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|
||||||
|
| `PMW33XX_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
|
||||||
|
| `ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor. | `0` |
|
||||||
|
|
||||||
|
To use multiple sensors, instead of setting `PMW33XX_CS_PIN` you need to set `PMW33XX_CS_PINS` and also handle and merge the read from this sensor in user code.
|
||||||
|
Note that different (per sensor) values of CPI, speed liftoff, rotational angle or flipping of X/Y is not currently supported.
|
||||||
|
|
||||||
|
```c
|
||||||
|
// in config.h:
|
||||||
|
#define PMW33XX_CS_PINS { B5, B6 }
|
||||||
|
// in keyboard.c:
|
||||||
|
#ifdef POINTING_DEVICE_ENABLE
|
||||||
|
void pointing_device_init_kb(void) {
|
||||||
|
pmw33xx_init(1); // index 1 is the second device.
|
||||||
|
pmw33xx_set_cpi(0, 800); // applies to first sensor
|
||||||
|
pmw33xx_set_cpi(1, 800); // applies to second sensor
|
||||||
|
pointing_device_init_user();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contains report from sensor #0 already, need to merge in from sensor #1
|
||||||
|
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
|
||||||
|
pmw33xx_report_t report = pmw33xx_read_burst(1);
|
||||||
|
if (!report.motion.b.is_lifted && report.motion.b.is_motion) {
|
||||||
|
// From quantum/pointing_device_drivers.c
|
||||||
|
#define constrain_hid(amt) ((amt) < -127 ? -127 : ((amt) > 127 ? 127 : (amt)))
|
||||||
|
mouse_report.x = constrain_hid(mouse_report.x + report.delta_x);
|
||||||
|
mouse_report.y = constrain_hid(mouse_report.y + report.delta_y);
|
||||||
|
}
|
||||||
|
return pointing_device_task_user(mouse_report);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### Custom Driver
|
### Custom Driver
|
||||||
|
|
||||||
If you have a sensor type that isn't supported here, you can manually implement it, by adding these functions (with the correct implementation for your device):
|
If you have a sensor type that isn't supported above, a custom option is available by adding the following to your `rules.mk`
|
||||||
|
|
||||||
|
```make
|
||||||
|
POINTING_DEVICE_DRIVER = custom
|
||||||
|
```
|
||||||
|
|
||||||
|
Using the custom driver will require implementing the following functions:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void pointing_device_driver_init(void) {}
|
void pointing_device_driver_init(void) {}
|
||||||
@@ -171,31 +255,68 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
|
|||||||
|
|
||||||
## Common Configuration
|
## Common Configuration
|
||||||
|
|
||||||
| Setting | Description | Default |
|
| Setting | Description | Default |
|
||||||
|-------------------------------|-----------------------------------------------------------------------|---------------|
|
| ---------------------------------- | --------------------------------------------------------------------- | ------------- |
|
||||||
|`POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
| `POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
|
| `POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
|
||||||
|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
|
| `POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
|
||||||
|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
|
| `POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_TASK_THROTTLE_MS` | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_ |
|
||||||
|
|
||||||
|
!> 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.
|
||||||
|
|
||||||
|
|
||||||
|
## Split Keyboard Configuration
|
||||||
|
|
||||||
|
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](feature_split_keyboard.md?id=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.
|
||||||
|
|
||||||
|
| Setting | Description | Default |
|
||||||
|
| ------------------------------------ | ----------------------------------------------------------------------------------------------------- | ------------- |
|
||||||
|
| `POINTING_DEVICE_LEFT` | Pointing device on the left side (Required - pick one only) | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_RIGHT` | Pointing device on the right side (Required - pick one only) | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_COMBINED` | Pointing device on both sides (Required - pick one only) | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_ROTATION_90_RIGHT` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_ROTATION_180_RIGHT` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
|
||||||
|
| `POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
|
||||||
|
| `MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127) |
|
||||||
|
|
||||||
|
!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.
|
||||||
|
|
||||||
|
|
||||||
## Callbacks and Functions
|
## Callbacks and Functions
|
||||||
|
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
|
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||||
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
|
| `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_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_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 coe 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_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_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_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
|
||||||
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `mouse_report_t` data structure). |
|
| `pointing_device_get_report(void)` | Returns the current mouse report (as a `mouse_report_t` data structure). |
|
||||||
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
||||||
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
|
||||||
| `has_mouse_report_changed(old, new)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
|
| `has_mouse_report_changed(new_report, old_report)` | Compares the old and new `mouse_report_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. |
|
||||||
|
|
||||||
|
|
||||||
|
## Split Keyboard Callbacks and Functions
|
||||||
|
|
||||||
|
The combined functions below are only available when using `SPLIT_POINTING_ENABLE` and `POINTING_DEVICE_COMBINED`. The 2 callbacks `pointing_device_task_combined_*` replace the single sided equivalents above. See the [combined pointing devices example](feature_pointing_device.md?id=combined-pointing-devices)
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| `pointing_device_set_shared_report(mouse_report)` | Sets the shared mouse report to the assigned `mouse_report_t` data structured passed to the function. |
|
||||||
|
| `pointing_device_set_cpi_on_side(bool, uint16_t)` | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right` |
|
||||||
|
| `pointing_device_combine_reports(left_report, right_report)` | Returns a combined mouse_report of left_report and right_report (as a `mouse_report_t` data structure) |
|
||||||
|
| `pointing_device_task_combined_kb(left_report, right_report)` | Callback, so keyboard code can intercept and modify the data. Returns a combined mouse report. |
|
||||||
|
| `pointing_device_task_combined_user(left_report, right_report)` | Callback, so user code can intercept and modify. Returns a combined mouse report using `pointing_device_combine_reports` |
|
||||||
|
| `pointing_device_adjust_by_defines_right(mouse_report)` | Applies right side rotations and invert configurations to a raw mouse report. |
|
||||||
|
|
||||||
|
|
||||||
# Manipulating Mouse Reports
|
# Manipulating Mouse Reports
|
||||||
@@ -211,14 +332,14 @@ The report_mouse_t (here "mouseReport") has the following properties:
|
|||||||
To manually manipulate the mouse reports outside of the `pointing_device_task_*` functions, you can use:
|
To manually manipulate the mouse reports outside of the `pointing_device_task_*` functions, you can use:
|
||||||
|
|
||||||
* `pointing_device_get_report()` - Returns the current report_mouse_t that represents the information sent to the host computer
|
* `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 newMouseReport)` - Overrides and saves the report_mouse_t to be 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.
|
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.
|
||||||
|
|
||||||
Additionally, by default, `pointing_device_send()` will only send a report when the report has actually changed. This prevents it from continuously sending mouse reports, which will keep the host system awake. This behavior can be changed by creating your own `pointing_device_send()` function.
|
Additionally, by default, `pointing_device_send()` will only send a report when the report has actually changed. This prevents it from continuously sending mouse reports, which will keep the host system awake. This behavior can be changed by creating your own `pointing_device_send()` function.
|
||||||
|
|
||||||
Also, you use the `has_mouse_report_changed(new, old)` function to check to see if the report has changed.
|
Also, you use the `has_mouse_report_changed(new_report, old_report)` function to check to see if the report has changed.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
@@ -260,7 +381,8 @@ report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
|||||||
if (set_scrolling) {
|
if (set_scrolling) {
|
||||||
mouse_report.h = mouse_report.x;
|
mouse_report.h = mouse_report.x;
|
||||||
mouse_report.v = mouse_report.y;
|
mouse_report.v = mouse_report.y;
|
||||||
mouse_report.x = mouse_report.y = 0
|
mouse_report.x = 0;
|
||||||
|
mouse_report.y = 0;
|
||||||
}
|
}
|
||||||
return mouse_report;
|
return mouse_report;
|
||||||
}
|
}
|
||||||
@@ -274,3 +396,62 @@ 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.
|
||||||
|
|
||||||
|
## Split Examples
|
||||||
|
|
||||||
|
The following examples make use the `SPLIT_POINTING_ENABLE` functionality and show how to manipulate the mouse report for a scrolling mode.
|
||||||
|
|
||||||
|
### Single Pointing Device
|
||||||
|
|
||||||
|
The following example will work with either `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` and enables scrolling mode while on a particular layer.
|
||||||
|
|
||||||
|
```c
|
||||||
|
|
||||||
|
static bool scrolling_mode = false;
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
switch (get_highest_layer(state)) {
|
||||||
|
case _RAISE: // If we're on the _RAISE layer enable scrolling mode
|
||||||
|
scrolling_mode = true;
|
||||||
|
pointing_device_set_cpi(2000);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (scrolling_mode) { // check if we were scrolling before and set disable if so
|
||||||
|
scrolling_mode = false;
|
||||||
|
pointing_device_set_cpi(8000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
|
||||||
|
if (scrolling_mode) {
|
||||||
|
mouse_report.h = mouse_report.x;
|
||||||
|
mouse_report.v = mouse_report.y;
|
||||||
|
mouse_report.x = 0;
|
||||||
|
mouse_report.y = 0;
|
||||||
|
}
|
||||||
|
return mouse_report;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Combined Pointing Devices
|
||||||
|
|
||||||
|
The following example requires `POINTING_DEVICE_COMBINED` and sets the left side pointing device to scroll only.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void keyboard_post_init_user(void) {
|
||||||
|
pointing_device_set_cpi_on_side(true, 1000); //Set cpi on left side to a low value for slower scrolling.
|
||||||
|
pointing_device_set_cpi_on_side(false, 8000); //Set cpi on right side to a reasonable value for mousing.
|
||||||
|
}
|
||||||
|
|
||||||
|
report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) {
|
||||||
|
left_report.h = left_report.x;
|
||||||
|
left_report.v = left_report.y;
|
||||||
|
left_report.x = 0;
|
||||||
|
left_report.y = 0;
|
||||||
|
return pointing_device_combine_reports(left_report, right_report);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
=======
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
|
|||||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
|
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||||
@@ -171,6 +172,8 @@ Configure the hardware via your `config.h`:
|
|||||||
|----------|-------------|---------|
|
|----------|-------------|---------|
|
||||||
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
|
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||||
@@ -232,6 +235,115 @@ const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = {
|
|||||||
|
|
||||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1` for now).
|
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3737.pdf) and the header file `drivers/led/issi/is31fl3737.h`. The `driver` is the index of the driver you defined in your `config.h` (Only `0`, `1` for now).
|
||||||
|
|
||||||
|
---
|
||||||
|
### IS31FLCOMMON :id=is31flcommon
|
||||||
|
|
||||||
|
There is basic support for addressable RGB matrix lighting with a selection of I2C ISSI Lumissil RGB controllers through a shared common driver. To enable it, add this to your `rules.mk`:
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
RGB_MATRIX_ENABLE = yes
|
||||||
|
RGB_MATRIX_DRIVER = <driver name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<driver name>` is the applicable LED driver chip as below
|
||||||
|
|
||||||
|
| Driver Name | Data Sheet | Capability |
|
||||||
|
|-------------|------------|------------|
|
||||||
|
| `IS31FL3742A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3742A_DS.pdf) | 60 RGB, 30x6 Matrix |
|
||||||
|
| `ISSIFL3743A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3743A_DS.pdf) | 66 RGB, 18x11 Matrix |
|
||||||
|
| `IS31FL3745` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3745_DS.pdf) | 48 RGB, 18x8 Matrix |
|
||||||
|
| `IS31FL3746A` | [datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3746A_DS.pdf) | 24 RGB, 18x4 Matrix |
|
||||||
|
|
||||||
|
You can use between 1 and 4 IC's. Do not specify `DRIVER_ADDR_<N>` define for IC's if not present on your keyboard. The `DRIVER_ADDR_1` default assumes that all Address pins on the controller have been connected to GND. Drivers that have SYNC functionality have the default settings to disable if 1 driver. If more than 1 drivers then `DRIVER_ADDR_1` will be set to Master and the remaining ones set to Slave.
|
||||||
|
|
||||||
|
Configure the hardware via your `config.h`:
|
||||||
|
|
||||||
|
| Variable | Description | Default |
|
||||||
|
|----------|-------------|---------|
|
||||||
|
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||||
|
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||||
|
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||||
|
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
||||||
|
| `DRIVER_ADDR_1` | (Optional) Address for the first RGB driver | |
|
||||||
|
| `DRIVER_ADDR_<N>` | (Required) Address for the additional RGB drivers | |
|
||||||
|
| `ISSI_SSR_<N>` | (Optional) Configuration for the Spread Spectrum Register | |
|
||||||
|
| `ISSI_CONFIGURATION` | (Optional) Configuration for the Configuration Register | |
|
||||||
|
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||||
|
| `ISSI_PULLDOWNUP` | (Optional) Configuration for the Pull Up & Pull Down Register | |
|
||||||
|
| `ISSI_TEMP` | (Optional) Configuration for the Tempature Register | |
|
||||||
|
| `ISSI_PWM_ENABLE` | (Optional) Configuration for the PWM Enable Register | |
|
||||||
|
| `ISSI_PWM_SET` | (Optional) Configuration for the PWM Setting Register | |
|
||||||
|
| `ISSI_SCAL_RED` | (Optional) Configuration for the RED LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_SCAL_BLUE` | (Optional) Configuration for the BLUE LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_SCAL_GREEN` | (Optional) Configuration for the GREEN LEDs in Scaling Registers | 0xFF |
|
||||||
|
| `ISSI_MANUAL_SCALING` | (Optional) If you wish to configure the Scaling Registers manually | |
|
||||||
|
|
||||||
|
|
||||||
|
Defaults
|
||||||
|
|
||||||
|
| Variable | IS31FL3742A | IS31FL3743A | IS31FL3745 | IS31FL3746 |
|
||||||
|
|----------|-------------|-------------|------------|------------|
|
||||||
|
| `DRIVER_ADDR_1` | 0b0110000 | 0b0100000 | 0b0100000 | 0b1100000 |
|
||||||
|
| `ISSI_SSR_1` | 0x00 | 0x00 / 0x60 | 0x00 / 0xC0 | 0x00 |
|
||||||
|
| `ISSI_SSR_<2-4>` | 0x00 | 0x40 | 0x80 | 0x00 |
|
||||||
|
| `ISSI_CONFIGURATION` | 0x31 | 0x01 | 0x31 | 0x01 |
|
||||||
|
| `ISSI_PULLDOWNUP` | 0x55 | 0x33 | 0x33 | 0x33 |
|
||||||
|
| `ISSI_TEMP` | N/A | 0x00 | 0x00 | 0x00 |
|
||||||
|
| `ISSI_PWM_ENABLE` | N/A | N/A | N/A | 0x00 |
|
||||||
|
| `ISSI_PWM_SET` | 0x00 | N/A | N/A | 0x00 |
|
||||||
|
|
||||||
|
Here is an example using 2 drivers.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define DRIVER_ADDR_2 0b0100001
|
||||||
|
|
||||||
|
#define DRIVER_COUNT 2
|
||||||
|
#define DRIVER_1_LED_TOTAL 66
|
||||||
|
#define DRIVER_2_LED_TOTAL 42
|
||||||
|
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||||
|
```
|
||||||
|
|
||||||
|
!> Note the parentheses, this is so when `DRIVER_LED_TOTAL` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)` will give very different results than `rand() % DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL`.
|
||||||
|
|
||||||
|
Currently only 4 drivers are supported, but it would be trivial to support for more. Note that using a combination of different drivers is not supported. All drivers must be of the same model.
|
||||||
|
|
||||||
|
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL] = {
|
||||||
|
/* Refer to IS31 manual for these locations
|
||||||
|
* driver
|
||||||
|
* | R location
|
||||||
|
* | | G location
|
||||||
|
* | | | B location
|
||||||
|
* | | | | */
|
||||||
|
{0, CS1_SW1, CS2_SW1, CS3_SW1},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `CSx_SWx` is the location of the LED in the matrix defined by the datasheet. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||||
|
|
||||||
|
`ISSI_MANUAL_SCALING` is used to override the Scaling for individual LED's. By default they will be set as per `ISSI_SCAL_<colour>`. In `config.h` set how many LED's you want to manually set scaling for.
|
||||||
|
Eg `#define ISSI_MANUAL_SCALING 3`
|
||||||
|
|
||||||
|
Then Define the array listing all the LEDs you want to override in your `<keyboard>.c`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
const is31_led __flash g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||||
|
* LED Index
|
||||||
|
* | R scaling
|
||||||
|
* | | G scaling
|
||||||
|
* | | | B scaling
|
||||||
|
* | | | | */
|
||||||
|
{5, 120, 155, 167},
|
||||||
|
{9, 120, 155, 167},
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Where LED Index is the position of the LED in the `g_is31_leds` array. The `scaling` value between 0 and 255 to be written to the Scaling Register.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### WS2812 :id=ws2812
|
### WS2812 :id=ws2812
|
||||||
@@ -252,6 +364,8 @@ Configure the hardware via your `config.h`:
|
|||||||
#define DRIVER_LED_TOTAL 70
|
#define DRIVER_LED_TOTAL 70
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> There are additional configuration options for ARM controllers that offer increased performance over the default bitbang driver. Please see [WS2812 Driver](ws2812_driver.md) for more information.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### APA102 :id=apa102
|
### APA102 :id=apa102
|
||||||
@@ -297,6 +411,7 @@ You can use up to 2 AW20216 IC's. Do not specify `DRIVER_<N>_xxx` defines for IC
|
|||||||
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
|
||||||
| `AW_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 |
|
| `AW_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 |
|
||||||
| `AW_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 |
|
| `AW_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 |
|
||||||
|
| `AW_SPI_MODE` | (Optional) Mode for SPI communication (0-3, defines polarity and phase of the clock) | 3 |
|
||||||
| `AW_SPI_DIVISOR` | (Optional) Clock divisor for SPI communication (powers of 2, smaller numbers means faster communication, should not be less than 4) | 4 |
|
| `AW_SPI_DIVISOR` | (Optional) Clock divisor for SPI communication (powers of 2, smaller numbers means faster communication, should not be less than 4) | 4 |
|
||||||
|
|
||||||
Here is an example using 2 drivers.
|
Here is an example using 2 drivers.
|
||||||
@@ -408,7 +523,7 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
|
|||||||
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
|`RGB_VAD` | |Decrease value (brightness), increase value when Shift is held |
|
||||||
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
|`RGB_SPI` | |Increase effect speed (does not support eeprom yet), decrease speed when Shift is held|
|
||||||
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
|`RGB_SPD` | |Decrease effect speed (does not support eeprom yet), increase speed when Shift is held|
|
||||||
|`RGB_MODE_PLAIN` |`RGB_M_P `|Static (no animation) mode |
|
|`RGB_MODE_PLAIN` |`RGB_M_P` |Static (no animation) mode |
|
||||||
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
|`RGB_MODE_BREATHE` |`RGB_M_B` |Breathing animation mode |
|
||||||
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
|`RGB_MODE_RAINBOW` |`RGB_M_R` |Full gradient scrolling left to right (uses the `RGB_MATRIX_CYCLE_LEFT_RIGHT` mode) |
|
||||||
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
|`RGB_MODE_SWIRL` |`RGB_M_SW`|Full gradient spinning pinwheel around center of keyboard (uses `RGB_MATRIX_CYCLE_PINWHEEL` mode) |
|
||||||
@@ -417,7 +532,7 @@ All RGB keycodes are currently shared with the RGBLIGHT system:
|
|||||||
|
|
||||||
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MODE_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
`RGB_MODE_PLAIN`, `RGB_MODE_BREATHE`, `RGB_MODE_RAINBOW`, and `RGB_MODE_SWIRL` are the only ones that are mapped properly. The rest don't have a direct equivalent, and are not mapped.
|
||||||
|
|
||||||
?> `RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUD)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions-idfunctions) should be used instead.
|
?> `RGB_*` keycodes cannot be used with functions like `tap_code16(RGB_HUD)` as they're not USB HID keycodes. If you wish to replicate similar behaviour in custom code within your firmware (e.g. inside `encoder_update_user()` or `process_record_user()`), the equivalent [RGB functions](#functions) should be used instead.
|
||||||
|
|
||||||
|
|
||||||
!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
!> By default, if you have both the [RGB Light](feature_rgblight.md) and the RGB Matrix feature enabled, these keycodes will work for both features, at the same time. You can disable the keycode functionality by defining the `*_DISABLE_KEYCODES` option for the specific feature.
|
||||||
@@ -457,6 +572,7 @@ enum rgb_matrix_effects {
|
|||||||
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
RGB_MATRIX_HUE_PENDULUM, // Hue shifts up a slight ammount in a wave to the right, then back to the left
|
||||||
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
|
RGB_MATRIX_HUE_WAVE, // Hue shifts up a slight ammount and then back down in a wave to the right
|
||||||
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
|
RGB_MATRIX_PIXEL_FRACTAL, // Single hue fractal filled keys pulsing horizontally out to edges
|
||||||
|
RGB_MATRIX_PIXEL_FLOW, // Pulsing RGB flow along LED wiring with random hues
|
||||||
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
|
RGB_MATRIX_PIXEL_RAIN, // Randomly light keys with random hues
|
||||||
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
|
#if define(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
|
||||||
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
|
RGB_MATRIX_TYPING_HEATMAP, // How hot is your WPM!
|
||||||
@@ -512,6 +628,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
|||||||
|`#define ENABLE_RGB_MATRIX_HUE_PENDULUM` |Enables `RGB_MATRIX_HUE_PENDULUM` |
|
|`#define ENABLE_RGB_MATRIX_HUE_PENDULUM` |Enables `RGB_MATRIX_HUE_PENDULUM` |
|
||||||
|`#define ENABLE_RGB_MATRIX_HUE_WAVE` |Enables `RGB_MATRIX_HUE_WAVE ` |
|
|`#define ENABLE_RGB_MATRIX_HUE_WAVE` |Enables `RGB_MATRIX_HUE_WAVE ` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL` |Enables `RGB_MATRIX_PIXEL_FRACTAL` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL` |Enables `RGB_MATRIX_PIXEL_FRACTAL` |
|
||||||
|
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|
||||||
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|
||||||
|
|
||||||
?> These modes don't require any additional defines.
|
?> These modes don't require any additional defines.
|
||||||
@@ -543,18 +660,44 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
|||||||
|
|
||||||
### RGB Matrix Effect Typing Heatmap :id=rgb-matrix-effect-typing-heatmap
|
### RGB Matrix Effect Typing Heatmap :id=rgb-matrix-effect-typing-heatmap
|
||||||
|
|
||||||
This effect will color the RGB matrix according to a heatmap of recently pressed
|
This effect will color the RGB matrix according to a heatmap of recently pressed keys. Whenever a key is pressed its "temperature" increases as well as that of its neighboring keys. The temperature of each key is then decreased automatically every 25 milliseconds by default.
|
||||||
keys. Whenever a key is pressed its "temperature" increases as well as that of
|
|
||||||
its neighboring keys. The temperature of each key is then decreased
|
|
||||||
automatically every 25 milliseconds by default.
|
|
||||||
|
|
||||||
In order to change the delay of temperature decrease define
|
In order to change the delay of temperature decrease define `RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS`:
|
||||||
`RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS`:
|
|
||||||
|
|
||||||
```c
|
```c
|
||||||
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
|
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
|
||||||
```
|
```
|
||||||
|
|
||||||
|
As heatmap uses the physical position of the leds set in the g_led_config, you may need to tweak the following options to get the best effect for your keyboard. Note the size of this grid is `224x64`.
|
||||||
|
|
||||||
|
Limit the distance the effect spreads to surrounding keys.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGB_MATRIX_TYPING_HEATMAP_SPREAD 40
|
||||||
|
```
|
||||||
|
|
||||||
|
Limit how hot surrounding keys get from each press.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGB_MATRIX_TYPING_HEATMAP_AREA_LIMIT 16
|
||||||
|
```
|
||||||
|
|
||||||
|
Remove the spread effect entirely.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGB_MATRIX_TYPING_HEATMAP_SLIM
|
||||||
|
```
|
||||||
|
|
||||||
|
### RGB Matrix Effect Solid Reactive :id=rgb-matrix-effect-solid-reactive
|
||||||
|
|
||||||
|
Solid reactive effects will pulse RGB light on key presses with user configurable hues. To enable gradient mode that will automatically change reactive color, add the following define:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define RGB_MATRIX_SOLID_REACTIVE_GRADIENT_MODE
|
||||||
|
```
|
||||||
|
|
||||||
|
Gradient mode will loop through the color wheel hues over time and its duration can be controlled with the effect speed keycodes (`RGB_SPI`/`RGB_SPD`).
|
||||||
|
|
||||||
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
## Custom RGB Matrix Effects :id=custom-rgb-matrix-effects
|
||||||
|
|
||||||
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
|
By setting `RGB_MATRIX_CUSTOM_USER = yes` in `rules.mk`, new effects can be defined directly from your keymap or userspace, without having to edit any QMK core files. To declare new effects, create a `rgb_matrix_user.inc` file in the user keymap directory or userspace folder.
|
||||||
@@ -662,6 +805,7 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
|
|||||||
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
|
||||||
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||||
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||||
|
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
|
||||||
```
|
```
|
||||||
|
|
||||||
## EEPROM storage :id=eeprom-storage
|
## EEPROM storage :id=eeprom-storage
|
||||||
@@ -707,6 +851,7 @@ Where `28` is an unused index from `eeconfig.h`.
|
|||||||
|`rgb_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
|
|`rgb_matrix_decrease_speed_noeeprom()` |Decrease the speed of the animations (not written to EEPROM) |
|
||||||
|`rgb_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
|
|`rgb_matrix_set_speed(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 |
|
||||||
|`rgb_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
|
|`rgb_matrix_set_speed_noeeprom(speed)` |Set the speed of the animations to the given value where `speed` is between 0 and 255 (not written to EEPROM) |
|
||||||
|
|`rgb_matrix_reload_from_eeprom()` |Reload the effect configuration (enabled, mode and color) from EEPROM |
|
||||||
|
|
||||||
### Change Color :id=change-color
|
### Change Color :id=change-color
|
||||||
|Function |Description |
|
|Function |Description |
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ On keyboards with onboard RGB LEDs, it is usually enabled by default. If it is n
|
|||||||
RGBLIGHT_ENABLE = yes
|
RGBLIGHT_ENABLE = yes
|
||||||
```
|
```
|
||||||
|
|
||||||
|
?> There are additional configuration options for ARM controllers that offer increased performance over the default WS2812 bitbang driver. Please see [WS2812 Driver](ws2812_driver.md) for more information.
|
||||||
|
|
||||||
For APA102 LEDs, add the following to your `rules.mk`:
|
For APA102 LEDs, add the following to your `rules.mk`:
|
||||||
|
|
||||||
```make
|
```make
|
||||||
@@ -324,6 +326,19 @@ void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|||||||
```
|
```
|
||||||
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
would turn the layer 0 (or 1) on and off again three times when `DEBUG` is pressed.
|
||||||
|
|
||||||
|
Blinking accumulates layers so if multiple layers are set blinking at the same time they will all blink for the duration and repeat times of the last layer to be blinked.
|
||||||
|
To stop these other layers from blinking use `rgblight_unblink_layer` or `rgblight_unblink_all_but_layer`:
|
||||||
|
|
||||||
|
```c
|
||||||
|
rgblight_blink_layer(1, 500);
|
||||||
|
rgblight_unblink_all_but_layer(1);
|
||||||
|
```
|
||||||
|
|
||||||
|
```c
|
||||||
|
rgblight_unblink_layer(3);
|
||||||
|
rgblight_blink_layer(2, 500);
|
||||||
|
```
|
||||||
|
|
||||||
!> Lighting layers on split keyboards will require layer state synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
!> Lighting layers on split keyboards will require layer state synced to the slave half (e.g. `#define SPLIT_LAYER_STATE_ENABLE`). See [data sync options](feature_split_keyboard.md#data-sync-options) for more details.
|
||||||
|
|
||||||
### Overriding RGB Lighting on/off status
|
### Overriding RGB Lighting on/off status
|
||||||
|
|||||||
54
docs/feature_secure.md
Normal file
54
docs/feature_secure.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Secure
|
||||||
|
|
||||||
|
The secure feature aims to prevent unwanted interaction without user intervention.
|
||||||
|
|
||||||
|
?> Secure does **not** currently implement encryption/decryption/etc and should not be a replacement where a strong hardware/software based solution is required.
|
||||||
|
|
||||||
|
### Unlock sequence
|
||||||
|
|
||||||
|
To unlock, the user must perform a set of actions. This can optionally be configured to be multiple keys.
|
||||||
|
|
||||||
|
* While unlocking all keyboard input is ignored
|
||||||
|
* Incorrect attempts will revert back to the previously locked state
|
||||||
|
|
||||||
|
### Automatic Locking
|
||||||
|
|
||||||
|
Once unlocked, the keyboard will revert back to a locked state after the configured timeout.
|
||||||
|
The timeout can be refreshed by using the `secure_activity_event` function, for example from one of the various [hooks](custom_quantum_functions.md).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Add the following to your `rules.mk`:
|
||||||
|
|
||||||
|
```make
|
||||||
|
SECURE_ENABLE = yes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Keycodes
|
||||||
|
|
||||||
|
| Key | Description |
|
||||||
|
|------------------|--------------------------------------------------------------------------------|
|
||||||
|
| `SECURE_LOCK` | Revert back to a locked state |
|
||||||
|
| `SECURE_UNLOCK` | Forces unlock without performing a unlock sequence |
|
||||||
|
| `SECURE_TOGGLE` | Toggle directly between locked and unlock without performing a unlock sequence |
|
||||||
|
| `SECURE_REQUEST` | Request that user perform the unlock sequence |
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
| Define | Default | Description |
|
||||||
|
|-------------------------|----------------|---------------------------------------------------------------------------------|
|
||||||
|
|`SECURE_UNLOCK_TIMEOUT` | `5000` | Timeout for the user to perform the configured unlock sequence - `0` to disable |
|
||||||
|
|`SECURE_IDLE_TIMEOUT` | `60000` | Timeout while unlocked before returning to locked - `0` to disable |
|
||||||
|
|`SECURE_UNLOCK_SEQUENCE` | `{ { 0, 0 } }` | Array of matrix locations describing a sequential sequence of keypresses |
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
|---------------------------|----------------------------------------------------------------------------|
|
||||||
|
| `secure_is_locked()` | Check if the device is currently locked |
|
||||||
|
| `secure_is_unlocking()` | Check if an unlock sequence is currently in progress |
|
||||||
|
| `secure_is_unlocked()` | Check if the device is currently unlocked |
|
||||||
|
| `secure_lock()` | Lock down the device |
|
||||||
|
| `secure_unlock()` | Force unlock the device - bypasses user unlock sequence |
|
||||||
|
| `secure_request_unlock()` | Begin listening for an unlock sequence |
|
||||||
|
| `secure_activity_event()` | Flag that user activity has happened and the device should remain unlocked |
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user