mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-08-09 08:53:37 +00:00
Compare commits
1242 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3e1ac7a38f | ||
![]() |
be42ea306b | ||
![]() |
900e79febe | ||
![]() |
fec2323089 | ||
![]() |
a8991722bc | ||
![]() |
62e2cb9286 | ||
![]() |
113d3d6001 | ||
![]() |
8946aace5b | ||
![]() |
0a03fc512c | ||
![]() |
30b0600ea2 | ||
![]() |
4443fa8a32 | ||
![]() |
7836906f3e | ||
![]() |
9ae4d01e33 | ||
![]() |
73bddf0ea6 | ||
![]() |
1919644934 | ||
![]() |
092ef661af | ||
![]() |
21276de7d5 | ||
![]() |
c060876692 | ||
![]() |
1875659df0 | ||
![]() |
8b8f73098b | ||
![]() |
3b76a3a323 | ||
![]() |
012b101b2e | ||
![]() |
4e369d405a | ||
![]() |
dd1706e468 | ||
![]() |
dc046bc215 | ||
![]() |
29891b63f9 | ||
![]() |
51cfd7554a | ||
![]() |
b3462157dc | ||
![]() |
bafbca3604 | ||
![]() |
490641307a | ||
![]() |
0f701c7dbe | ||
![]() |
ed791972e1 | ||
![]() |
34a113c97b | ||
![]() |
65a04ead32 | ||
![]() |
14d1d9639c | ||
![]() |
56802f506c | ||
![]() |
c6668b9cd9 | ||
![]() |
c371cb3bc4 | ||
![]() |
b25d4f62c1 | ||
![]() |
4e04da397e | ||
![]() |
b26e5c585b | ||
![]() |
b7b00d58b8 | ||
![]() |
61fa6949fb | ||
![]() |
865a8f42a6 | ||
![]() |
e198643d66 | ||
![]() |
7df44ffb75 | ||
![]() |
66780783c7 | ||
![]() |
6efb71d401 | ||
![]() |
672986a078 | ||
![]() |
b06ade9284 | ||
![]() |
958ddea52e | ||
![]() |
2f3383a11e | ||
![]() |
9f95577ef2 | ||
![]() |
8df2e70ae4 | ||
![]() |
bc7d1cc397 | ||
![]() |
e26e12402b | ||
![]() |
db1df185c9 | ||
![]() |
9d9cdaaa2d | ||
![]() |
2eb9ff8efd | ||
![]() |
2d1aed78a6 | ||
![]() |
6810aaf013 | ||
![]() |
e2dbe39b94 | ||
![]() |
5383335717 | ||
![]() |
39627c7620 | ||
![]() |
496d093fc3 | ||
![]() |
f6dc3569bc | ||
![]() |
83a3357e74 | ||
![]() |
560df40c4d | ||
![]() |
07aee9af0e | ||
![]() |
ba4c8238cb | ||
![]() |
f6709e65eb | ||
![]() |
9b0b3d7b25 | ||
![]() |
80f3da36e5 | ||
![]() |
77e8867498 | ||
![]() |
13434fc066 | ||
![]() |
3a0f11a661 | ||
![]() |
cf162f90fe | ||
![]() |
78a74ca974 | ||
![]() |
b8646bc40b | ||
![]() |
6890c1aeb8 | ||
![]() |
5233a62b20 | ||
![]() |
f8123c27ad | ||
![]() |
4a128c6062 | ||
![]() |
a9f1105f98 | ||
![]() |
0b7df03ab7 | ||
![]() |
75c6afaa7f | ||
![]() |
b7b14678b2 | ||
![]() |
32efd14186 | ||
![]() |
1e7c2a8926 | ||
![]() |
4a64d47f12 | ||
![]() |
50c5403612 | ||
![]() |
1ddff6e30d | ||
![]() |
51a1e3d58d | ||
![]() |
ff884d8968 | ||
![]() |
7be40fd143 | ||
![]() |
974e98ce59 | ||
![]() |
c8c55e3220 | ||
![]() |
2ddf8635c8 | ||
![]() |
c4414af9f3 | ||
![]() |
97640efdbe | ||
![]() |
c5a75eb16f | ||
![]() |
0cad5e9d4a | ||
![]() |
98a68b68a4 | ||
![]() |
cd69ca6527 | ||
![]() |
23d21c85fe | ||
![]() |
3ba88f7798 | ||
![]() |
3e5f5bda4a | ||
![]() |
cfe8c4dee3 | ||
![]() |
72ce2655aa | ||
![]() |
5c5ddeba40 | ||
![]() |
66015f1645 | ||
![]() |
a5ea619139 | ||
![]() |
137938b67a | ||
![]() |
e7b84e1cf6 | ||
![]() |
ffc45ac80c | ||
![]() |
3f6e362b8d | ||
![]() |
45ae4dec4d | ||
![]() |
93f20e012e | ||
![]() |
16800ea8a5 | ||
![]() |
fa2fb9bbe0 | ||
![]() |
11c631027c | ||
![]() |
e97ec68692 | ||
![]() |
39f06c3afb | ||
![]() |
06ed8dd14f | ||
![]() |
20886529c5 | ||
![]() |
2f37a7854d | ||
![]() |
7d5b4adc50 | ||
![]() |
3a13c2120a | ||
![]() |
79020519b4 | ||
![]() |
6761936fcd | ||
![]() |
3dee67a05a | ||
![]() |
98f0c5ee24 | ||
![]() |
c390292e1c | ||
![]() |
382c3bd0bd | ||
![]() |
276130bdef | ||
![]() |
5c84d935f9 | ||
![]() |
6fed854e58 | ||
![]() |
9ac6eeaaa6 | ||
![]() |
a0bc47fcd2 | ||
![]() |
252f01f2e7 | ||
![]() |
997f04b636 | ||
![]() |
33a3cd26ab | ||
![]() |
9098cdd376 | ||
![]() |
f3d3b16ebb | ||
![]() |
7ebeb5d93f | ||
![]() |
c9b26a786c | ||
![]() |
d8cda43d14 | ||
![]() |
bfcf3c139d | ||
![]() |
22194a4014 | ||
![]() |
777a6e0e58 | ||
![]() |
2f58eed8f9 | ||
![]() |
f2684dcfc1 | ||
![]() |
0a6a203fb5 | ||
![]() |
18f8e51cb7 | ||
![]() |
b910b1261d | ||
![]() |
5a4531427d | ||
![]() |
a4b124e906 | ||
![]() |
734c7afa7d | ||
![]() |
ca7b2d63a7 | ||
![]() |
0a50599544 | ||
![]() |
567f808ea5 | ||
![]() |
5cd31fda9c | ||
![]() |
bb71145632 | ||
![]() |
f2299ee5f8 | ||
![]() |
a632593769 | ||
![]() |
728aa576b0 | ||
![]() |
d96ac7084e | ||
![]() |
e446366326 | ||
![]() |
2c3d0126ba | ||
![]() |
e46285b928 | ||
![]() |
b7468f4785 | ||
![]() |
a62fefe84b | ||
![]() |
61ed48edc3 | ||
![]() |
3495cbc638 | ||
![]() |
2655ce58f9 | ||
![]() |
cdbfcb6c14 | ||
![]() |
58721a433b | ||
![]() |
548983abc8 | ||
![]() |
1522695cef | ||
![]() |
a213085640 | ||
![]() |
a31707fdc2 | ||
![]() |
a9e9a533aa | ||
![]() |
62d19fc2ac | ||
![]() |
f6a70e45c2 | ||
![]() |
d7727a54bc | ||
![]() |
9ddb6a56bd | ||
![]() |
c38fdfec9c | ||
![]() |
e9bd7d7ad3 | ||
![]() |
2b0965944d | ||
![]() |
a522b1f156 | ||
![]() |
e1f59a6efc | ||
![]() |
e30d0e5287 | ||
![]() |
a90b45e832 | ||
![]() |
de6ae3408c | ||
![]() |
1bebaa310a | ||
![]() |
e2517ff9a4 | ||
![]() |
dcc47ea31b | ||
![]() |
265d4a78dd | ||
![]() |
a81ae7dd04 | ||
![]() |
4775e02794 | ||
![]() |
114a43e1ea | ||
![]() |
9aaaa71aef | ||
![]() |
33c5a64b5a | ||
![]() |
6e1e62936e | ||
![]() |
eb7ecae4b4 | ||
![]() |
db8c254d3d | ||
![]() |
6b52c6d83d | ||
![]() |
b659ef8278 | ||
![]() |
624d0964c1 | ||
![]() |
fbb35fc257 | ||
![]() |
bea97291dc | ||
![]() |
3ae7015433 | ||
![]() |
f401649855 | ||
![]() |
b1ea30ca7c | ||
![]() |
ceea0d72c1 | ||
![]() |
452ac581a5 | ||
![]() |
c35b552510 | ||
![]() |
c6ed3cdf10 | ||
![]() |
d9b1ab9ae0 | ||
![]() |
41948350e8 | ||
![]() |
833abef115 | ||
![]() |
58696a3937 | ||
![]() |
7a3183b8c8 | ||
![]() |
8de8af6632 | ||
![]() |
b6b3efc14b | ||
![]() |
ccec4867c8 | ||
![]() |
58806984a6 | ||
![]() |
6cc56f3f8c | ||
![]() |
6cdc00d046 | ||
![]() |
c1f6eb2e9e | ||
![]() |
31fdf7d899 | ||
![]() |
f39386a112 | ||
![]() |
e67d2c2f6f | ||
![]() |
744ac91f5e | ||
![]() |
1f6dfd19cf | ||
![]() |
8b48f0dea3 | ||
![]() |
8b671b9969 | ||
![]() |
13f7b68240 | ||
![]() |
bd11ddc093 | ||
![]() |
53f1e3b11f | ||
![]() |
ce05dc6fa1 | ||
![]() |
66050bb809 | ||
![]() |
455cd65e80 | ||
![]() |
34aa533246 | ||
![]() |
89b46eedd5 | ||
![]() |
ff44edfad7 | ||
![]() |
8b95dc6e00 | ||
![]() |
7467231158 | ||
![]() |
368a2eb08f | ||
![]() |
7fb8dd1440 | ||
![]() |
ce34549c26 | ||
![]() |
a45107e152 | ||
![]() |
c7b59a96df | ||
![]() |
0870b796b4 | ||
![]() |
bdede8b2cd | ||
![]() |
6e3cc56bdf | ||
![]() |
7114eb25f8 | ||
![]() |
4617b0cfe7 | ||
![]() |
0b0c31665e | ||
![]() |
fa133aeea5 | ||
![]() |
7e03877924 | ||
![]() |
42fced9514 | ||
![]() |
31d28ba228 | ||
![]() |
b3f55cb5b2 | ||
![]() |
e5203f86e2 | ||
![]() |
71257e21e6 | ||
![]() |
ee3540e8df | ||
![]() |
a474cac2c3 | ||
![]() |
7ed3138e5f | ||
![]() |
e09d84c47c | ||
![]() |
b02abcb9a6 | ||
![]() |
d2b16962ff | ||
![]() |
b514a591f3 | ||
![]() |
597de0e298 | ||
![]() |
1bd9b9204d | ||
![]() |
a5f1438f58 | ||
![]() |
c412b7fc42 | ||
![]() |
5267329caa | ||
![]() |
f583d2fef0 | ||
![]() |
8a6b7003f7 | ||
![]() |
d59d768fea | ||
![]() |
60f0132bd5 | ||
![]() |
0a6913b682 | ||
![]() |
a88dd675bf | ||
![]() |
ae2d5e2e5a | ||
![]() |
0ea3203205 | ||
![]() |
b12b5485bc | ||
![]() |
e1c0bd8a7c | ||
![]() |
709d07aebc | ||
![]() |
ef356ddee6 | ||
![]() |
90811118b7 | ||
![]() |
a081fc7301 | ||
![]() |
fc20e0b014 | ||
![]() |
9e50faedae | ||
![]() |
73f962766e | ||
![]() |
420b13468b | ||
![]() |
a011b5ed5c | ||
![]() |
2505d7edd0 | ||
![]() |
594d03f4aa | ||
![]() |
2a048fbb65 | ||
![]() |
489151d7a0 | ||
![]() |
da6a05bfea | ||
![]() |
cc08f230ff | ||
![]() |
592a2d26ce | ||
![]() |
df87a75c82 | ||
![]() |
e5a92fa80f | ||
![]() |
2166eaf9a7 | ||
![]() |
83b84187ea | ||
![]() |
830ca0c415 | ||
![]() |
b24bd2351a | ||
![]() |
b824faca71 | ||
![]() |
03848bb3aa | ||
![]() |
15ed59cacc | ||
![]() |
5cf0888197 | ||
![]() |
fae6b85640 | ||
![]() |
b37d23bfa5 | ||
![]() |
5050b91068 | ||
![]() |
2d5cfd3ecf | ||
![]() |
f70edea123 | ||
![]() |
456291d04e | ||
![]() |
a1d29982dc | ||
![]() |
6510188138 | ||
![]() |
6f16349e93 | ||
![]() |
9642cd9046 | ||
![]() |
77688ac706 | ||
![]() |
0b410ffd77 | ||
![]() |
70a7ed26e1 | ||
![]() |
300af1e5bf | ||
![]() |
84ba999f2a | ||
![]() |
7e47446695 | ||
![]() |
08711e1cf7 | ||
![]() |
6e356c7860 | ||
![]() |
0e9e2963ca | ||
![]() |
1fbbb1fa9b | ||
![]() |
1e304433e5 | ||
![]() |
0c48e69ced | ||
![]() |
b5b886e36f | ||
![]() |
92d7b8cb54 | ||
![]() |
29f8fa35cf | ||
![]() |
9069c4540f | ||
![]() |
5031e0e35c | ||
![]() |
088853dd22 | ||
![]() |
6fbd79ce4e | ||
![]() |
2661ee282a | ||
![]() |
e80f5de78c | ||
![]() |
3afa2a9439 | ||
![]() |
2c191e21c2 | ||
![]() |
8812a09581 | ||
![]() |
73758d3d3a | ||
![]() |
c8728880de | ||
![]() |
2ce2fa6d06 | ||
![]() |
c9d90db95c | ||
![]() |
1b75a84a39 | ||
![]() |
fc4e6c61a4 | ||
![]() |
b9e81c0691 | ||
![]() |
a1c8b1ebf7 | ||
![]() |
d235352504 | ||
![]() |
f25226453f | ||
![]() |
9539f135d8 | ||
![]() |
27a710861e | ||
![]() |
1556a2ed0e | ||
![]() |
62db54dc32 | ||
![]() |
990895f03f | ||
![]() |
e27034f800 | ||
![]() |
54200b7b82 | ||
![]() |
ae90b1d1e5 | ||
![]() |
7ea022ba88 | ||
![]() |
02f6ab264d | ||
![]() |
f0e4bc937a | ||
![]() |
94c64fef51 | ||
![]() |
849ddc27ee | ||
![]() |
9ec0f3cd59 | ||
![]() |
bd932f1cce | ||
![]() |
11be3e7c64 | ||
![]() |
f165eb5cc9 | ||
![]() |
dc5befd139 | ||
![]() |
7298551e19 | ||
![]() |
9874d78da3 | ||
![]() |
d2fcf78266 | ||
![]() |
443971ab8e | ||
![]() |
9ea3f5575a | ||
![]() |
b9bc470404 | ||
![]() |
f8c6c6c395 | ||
![]() |
52c794b9fc | ||
![]() |
d32812850c | ||
![]() |
4b3f9b8b3a | ||
![]() |
9de717428f | ||
![]() |
0059393868 | ||
![]() |
006d3dbe68 | ||
![]() |
3445396d8e | ||
![]() |
b09fae9eba | ||
![]() |
26b6ba7607 | ||
![]() |
f19fa9854e | ||
![]() |
79df864aa1 | ||
![]() |
afb821077b | ||
![]() |
7fe03a73b8 | ||
![]() |
4cdb19291f | ||
![]() |
aa7eef0a02 | ||
![]() |
c44a232c57 | ||
![]() |
d3da222728 | ||
![]() |
1b1c6326c7 | ||
![]() |
357a10f6c8 | ||
![]() |
c46de05eb0 | ||
![]() |
85a0da9a55 | ||
![]() |
71525fa1a2 | ||
![]() |
f6774f2f1e | ||
![]() |
9c93f36034 | ||
![]() |
f870a04bb7 | ||
![]() |
68afa1ef06 | ||
![]() |
49527afc6a | ||
![]() |
05d2b7e2ac | ||
![]() |
ee90267734 | ||
![]() |
ea56863e32 | ||
![]() |
9c5880a8b8 | ||
![]() |
cf3c8a2138 | ||
![]() |
229a1690a7 | ||
![]() |
02c5afc7d5 | ||
![]() |
dec0d78724 | ||
![]() |
d95182f5b5 | ||
![]() |
c2c78996d9 | ||
![]() |
9c857728c6 | ||
![]() |
06b9925156 | ||
![]() |
faf9c38c26 | ||
![]() |
1c68cd09b8 | ||
![]() |
967a6138ac | ||
![]() |
e2d6187339 | ||
![]() |
fb3c91375c | ||
![]() |
1f9b653f58 | ||
![]() |
e648155113 | ||
![]() |
3c7e9a6827 | ||
![]() |
c4a2bea0e6 | ||
![]() |
d6f207dcd6 | ||
![]() |
ae6f6c3365 | ||
![]() |
8352f589c7 | ||
![]() |
7ae0f7caf1 | ||
![]() |
dc6cf643f3 | ||
![]() |
e6b53af38e | ||
![]() |
e2472ee8f1 | ||
![]() |
432789dc22 | ||
![]() |
4682226e20 | ||
![]() |
d85f954d30 | ||
![]() |
ae18481f50 | ||
![]() |
42245651e7 | ||
![]() |
e471cb80cb | ||
![]() |
0f341dfdd3 | ||
![]() |
24511d31b6 | ||
![]() |
2d3f2e92d8 | ||
![]() |
e394c06d14 | ||
![]() |
a09fdd4190 | ||
![]() |
81cedf5fa5 | ||
![]() |
fc61fd9ce3 | ||
![]() |
897e33599e | ||
![]() |
6f78b0daf0 | ||
![]() |
a4f990a431 | ||
![]() |
b4dba3cfb1 | ||
![]() |
834fb0b1fe | ||
![]() |
53c262de1b | ||
![]() |
5ddbf60f38 | ||
![]() |
18630b741e | ||
![]() |
8ba46dcf61 | ||
![]() |
958215e9d6 | ||
![]() |
4e836dd6cf | ||
![]() |
f1043e3a92 | ||
![]() |
51ce4ae8ad | ||
![]() |
b6fbed3dc3 | ||
![]() |
c7eb952198 | ||
![]() |
8b022cefc5 | ||
![]() |
6c2c211d8a | ||
![]() |
11aa512c85 | ||
![]() |
1b56428e52 | ||
![]() |
aa8e2065f1 | ||
![]() |
1ffb9092eb | ||
![]() |
87eaab600c | ||
![]() |
c286ab90f9 | ||
![]() |
0d36977f3e | ||
![]() |
ca2e424b75 | ||
![]() |
bba5c14933 | ||
![]() |
17f36a21bf | ||
![]() |
2acb426b8e | ||
![]() |
92cf493d7f | ||
![]() |
229633395b | ||
![]() |
8236f59fa3 | ||
![]() |
7317680904 | ||
![]() |
eb0ce41e78 | ||
![]() |
3208f5fd1a | ||
![]() |
65fb7224d5 | ||
![]() |
9e60a81263 | ||
![]() |
6fb9de6cbb | ||
![]() |
05787bc381 | ||
![]() |
61708d60fb | ||
![]() |
158d99b738 | ||
![]() |
6973d6d053 | ||
![]() |
18aa7d1244 | ||
![]() |
b9a3bdb982 | ||
![]() |
6537794989 | ||
![]() |
88653c53ed | ||
![]() |
99ab4393de | ||
![]() |
74ae2286a6 | ||
![]() |
c9d57e9014 | ||
![]() |
525fe9be96 | ||
![]() |
8c4b0827ac | ||
![]() |
6042094c75 | ||
![]() |
daa5afcf1d | ||
![]() |
7f67256047 | ||
![]() |
c3773587e9 | ||
![]() |
358bc8eac8 | ||
![]() |
131811b3d7 | ||
![]() |
c1b385ce0f | ||
![]() |
33ff722ec8 | ||
![]() |
3a2aec47b7 | ||
![]() |
8895b13583 | ||
![]() |
86f073a8ea | ||
![]() |
ce81801480 | ||
![]() |
57db82445e | ||
![]() |
37c2dd7c65 | ||
![]() |
ceb15bf5db | ||
![]() |
98f4e9b837 | ||
![]() |
c7a58bf280 | ||
![]() |
01eed8d5d8 | ||
![]() |
b45b3aaec7 | ||
![]() |
b68e89f846 | ||
![]() |
07e2b645ab | ||
![]() |
afa0eab374 | ||
![]() |
4be3abc39e | ||
![]() |
28dc7ba6a8 | ||
![]() |
e0e621ad6f | ||
![]() |
5368ddbf3d | ||
![]() |
cc3c3ace0c | ||
![]() |
f2f99739b3 | ||
![]() |
67559c7d06 | ||
![]() |
9b0fc99076 | ||
![]() |
80f91fee40 | ||
![]() |
091310e75e | ||
![]() |
024b4070c3 | ||
![]() |
099eaefb40 | ||
![]() |
2886c335a0 | ||
![]() |
7cc90c234f | ||
![]() |
cfbbb503a4 | ||
![]() |
93127df5d4 | ||
![]() |
8d308d56e3 | ||
![]() |
c8a28e8e9b | ||
![]() |
e3d367df8a | ||
![]() |
36ad597e15 | ||
![]() |
e923efcd56 | ||
![]() |
4228f55551 | ||
![]() |
1e5151bf63 | ||
![]() |
a886d7e3dd | ||
![]() |
3024b05cbb | ||
![]() |
6524d5354a | ||
![]() |
0fb3aaec8e | ||
![]() |
e90874c382 | ||
![]() |
b7df75e47f | ||
![]() |
6bba3c6578 | ||
![]() |
81d601b725 | ||
![]() |
5c20a84540 | ||
![]() |
75a43ddf55 | ||
![]() |
27befbfad7 | ||
![]() |
a2c745cae8 | ||
![]() |
049e964e61 | ||
![]() |
2450fe28ee | ||
![]() |
ea8d2ffe31 | ||
![]() |
0115951de1 | ||
![]() |
4d99e0a23c | ||
![]() |
07e7dd8fc1 | ||
![]() |
5501e804ff | ||
![]() |
094357c403 | ||
![]() |
cc4a52eb93 | ||
![]() |
1ed03f498f | ||
![]() |
4908d4b1ca | ||
![]() |
65b5969ed5 | ||
![]() |
f96a7bbd63 | ||
![]() |
3ef06aa732 | ||
![]() |
4601f339e4 | ||
![]() |
cbf538aaaa | ||
![]() |
3a74fa5bf7 | ||
![]() |
0379d1f59e | ||
![]() |
bf0d1fde5d | ||
![]() |
98013e25c6 | ||
![]() |
b35bac6afb | ||
![]() |
a0a6820c1b | ||
![]() |
3a5e4253fc | ||
![]() |
0fcd13f552 | ||
![]() |
7ae826476e | ||
![]() |
46b996a55e | ||
![]() |
7e27d72cbc | ||
![]() |
68722d35a3 | ||
![]() |
dda6e7fb36 | ||
![]() |
e279c78ba3 | ||
![]() |
62cca5c43a | ||
![]() |
bf3a88ab57 | ||
![]() |
a6521b8521 | ||
![]() |
67a87f67a0 | ||
![]() |
1e4f7aa029 | ||
![]() |
cc7542b917 | ||
![]() |
adcc4d376c | ||
![]() |
4938210711 | ||
![]() |
c4d3521ba6 | ||
![]() |
d7b44239c2 | ||
![]() |
56daf7e545 | ||
![]() |
5c22706294 | ||
![]() |
5da65c5cd4 | ||
![]() |
ba62db19e7 | ||
![]() |
79a6419dee | ||
![]() |
44062b5056 | ||
![]() |
02d3b233ab | ||
![]() |
4c625d8286 | ||
![]() |
1efc79063c | ||
![]() |
de3c42125b | ||
![]() |
970e0b18a2 | ||
![]() |
50844a8e67 | ||
![]() |
67d2bc5b3a | ||
![]() |
56b6b28fe9 | ||
![]() |
e884e42ce9 | ||
![]() |
786ebf8760 | ||
![]() |
87d69aebbb | ||
![]() |
b7a1004b61 | ||
![]() |
c2326c05c0 | ||
![]() |
112a51db9c | ||
![]() |
0189c485b9 | ||
![]() |
2f28c6df6d | ||
![]() |
935c894f83 | ||
![]() |
2e1a27da60 | ||
![]() |
d8176fb0f2 | ||
![]() |
211fbbd16d | ||
![]() |
1ddc2cbeb9 | ||
![]() |
76dc52c5c8 | ||
![]() |
4a98466ef3 | ||
![]() |
6876fbe51d | ||
![]() |
2d7746609f | ||
![]() |
38d6e9a75a | ||
![]() |
84df69572c | ||
![]() |
8136cf4bfb | ||
![]() |
6b19a99a4f | ||
![]() |
aee2a9d696 | ||
![]() |
28c1bc9b9f | ||
![]() |
e5b7685e7a | ||
![]() |
a28149b222 | ||
![]() |
39d0a14258 | ||
![]() |
2568d45969 | ||
![]() |
daabe2d8c5 | ||
![]() |
147865cf57 | ||
![]() |
4e577cbbea | ||
![]() |
0b7dba156c | ||
![]() |
27b9dd0f98 | ||
![]() |
10cdd00751 | ||
![]() |
f56838c680 | ||
![]() |
72f93e7fc2 | ||
![]() |
75e1a0d610 | ||
![]() |
96ea277381 | ||
![]() |
64bbeff57d | ||
![]() |
5a281d1ee9 | ||
![]() |
6f59e18efb | ||
![]() |
80708a91ef | ||
![]() |
c1ea29b8e4 | ||
![]() |
ebac02a7b2 | ||
![]() |
2be22a1323 | ||
![]() |
2337cd1186 | ||
![]() |
884f653906 | ||
![]() |
7324650714 | ||
![]() |
be66e5f2b4 | ||
![]() |
1b303e0453 | ||
![]() |
5b25a8aa32 | ||
![]() |
67ff0defe2 | ||
![]() |
3143a7597f | ||
![]() |
c9afacccf4 | ||
![]() |
ace510ffa0 | ||
![]() |
c6bb5b6755 | ||
![]() |
837cae95ba | ||
![]() |
5d58534a8c | ||
![]() |
8ea955c72f | ||
![]() |
a27bc60703 | ||
![]() |
0a94c2951f | ||
![]() |
b31426252e | ||
![]() |
fbbb221a31 | ||
![]() |
a19ae3d784 | ||
![]() |
b52aca0af8 | ||
![]() |
eac8e67888 | ||
![]() |
999008f0eb | ||
![]() |
fccd825212 | ||
![]() |
2192098f57 | ||
![]() |
6979794bac | ||
![]() |
49fd13f596 | ||
![]() |
cb9705428b | ||
![]() |
f24d51f5be | ||
![]() |
538b79657e | ||
![]() |
17c3182b1c | ||
![]() |
559450a099 | ||
![]() |
4313b66edd | ||
![]() |
17ccf3521b | ||
![]() |
c667da0190 | ||
![]() |
98530cad3b | ||
![]() |
64ea1179b1 | ||
![]() |
46dedfaaa4 | ||
![]() |
fa2b8082e6 | ||
![]() |
c133bd1234 | ||
![]() |
6b4728796a | ||
![]() |
ca2d2a524f | ||
![]() |
0d247aae3a | ||
![]() |
1a300d05bd | ||
![]() |
5856d5e13b | ||
![]() |
64d1ce751f | ||
![]() |
18ef3da8e8 | ||
![]() |
33a4075930 | ||
![]() |
ae2703b69b | ||
![]() |
7948fefcd7 | ||
![]() |
052cc5df5d | ||
![]() |
5878336f66 | ||
![]() |
71abc01d0a | ||
![]() |
e82bc5355c | ||
![]() |
2571c205e4 | ||
![]() |
0ad780f852 | ||
![]() |
60599ccc9e | ||
![]() |
f5cd30458a | ||
![]() |
db4e3bb232 | ||
![]() |
c5716f84ad | ||
![]() |
e0c00c35ce | ||
![]() |
372f1bf8cc | ||
![]() |
d2892685c5 | ||
![]() |
f293658147 | ||
![]() |
896d3dc497 | ||
![]() |
8e3903ca38 | ||
![]() |
b7e62af755 | ||
![]() |
7e0147f8e6 | ||
![]() |
c245ee4cd3 | ||
![]() |
ca45416999 | ||
![]() |
0b65af96fd | ||
![]() |
d2773c6d67 | ||
![]() |
45612ac595 | ||
![]() |
96c71b9b4c | ||
![]() |
0c160e1fba | ||
![]() |
bf6f13a2b0 | ||
![]() |
79094d3f72 | ||
![]() |
cf7d3435d7 | ||
![]() |
1e9b299fb0 | ||
![]() |
4410e6b3bf | ||
![]() |
8e614250b4 | ||
![]() |
48d9140cfc | ||
![]() |
d56ee70c52 | ||
![]() |
3f1b3a5125 | ||
![]() |
87b4bc17ed | ||
![]() |
0e6d47e1e4 | ||
![]() |
2b8d9f3193 | ||
![]() |
e4c54a9612 | ||
![]() |
20cefe254d | ||
![]() |
f6c70c40af | ||
![]() |
184c5844be | ||
![]() |
81a3aa025c | ||
![]() |
1bff37781b | ||
![]() |
1da7c8c8d0 | ||
![]() |
23a8f7f03b | ||
![]() |
fd18d95b77 | ||
![]() |
a46c7abd01 | ||
![]() |
539c8e3b72 | ||
![]() |
527a4ee846 | ||
![]() |
62ff02a101 | ||
![]() |
0943d0a2a0 | ||
![]() |
032b039d0b | ||
![]() |
c157c19b81 | ||
![]() |
f150258e5a | ||
![]() |
0d7d2f7915 | ||
![]() |
0477160109 | ||
![]() |
d0c495f4bc | ||
![]() |
e22cb99bc4 | ||
![]() |
ed78c13b5f | ||
![]() |
daf540c0bb | ||
![]() |
391c0428c9 | ||
![]() |
a516f20215 | ||
![]() |
c67c9f1d98 | ||
![]() |
f4ed65169f | ||
![]() |
b630df1aa7 | ||
![]() |
04b8159d17 | ||
![]() |
999e721312 | ||
![]() |
28696197e5 | ||
![]() |
b5423b2e83 | ||
![]() |
a682a98ef3 | ||
![]() |
f536646235 | ||
![]() |
007c0c1db4 | ||
![]() |
c72d661b93 | ||
![]() |
ad4ecd6eb4 | ||
![]() |
5e8a156222 | ||
![]() |
fa8940e5a6 | ||
![]() |
3c0f9599b7 | ||
![]() |
527790b000 | ||
![]() |
ffcc54833d | ||
![]() |
e03afcb083 | ||
![]() |
db8b74f016 | ||
![]() |
47145a6ce8 | ||
![]() |
81e086b387 | ||
![]() |
474a405606 | ||
![]() |
0650f783b5 | ||
![]() |
17c7d1fac3 | ||
![]() |
6dafcac713 | ||
![]() |
0e5f7ac3ba | ||
![]() |
81d69a5798 | ||
![]() |
509a2b40b7 | ||
![]() |
77fe1298c7 | ||
![]() |
20eb93e05c | ||
![]() |
683cdf3a43 | ||
![]() |
3665ae0441 | ||
![]() |
fa1c1cbbee | ||
![]() |
e2e6b3dfd6 | ||
![]() |
6e6fff866e | ||
![]() |
62731fe255 | ||
![]() |
ad14a27cd3 | ||
![]() |
21f15960a9 | ||
![]() |
e1630edef4 | ||
![]() |
528ebb42a4 | ||
![]() |
4345d34cf2 | ||
![]() |
690792eca9 | ||
![]() |
7ca652ce6d | ||
![]() |
99b545843e | ||
![]() |
21389fbd89 | ||
![]() |
ab952c358e | ||
![]() |
06d123de62 | ||
![]() |
48b694b8d6 | ||
![]() |
b768d74b2b | ||
![]() |
6c858477f1 | ||
![]() |
69c1790dce | ||
![]() |
6c3a512923 | ||
![]() |
63b48f5096 | ||
![]() |
0ca60eb759 | ||
![]() |
127560ae22 | ||
![]() |
a7406a429e | ||
![]() |
5f33a251b3 | ||
![]() |
70f0c279f9 | ||
![]() |
92873cc14f | ||
![]() |
2a8b3a809d | ||
![]() |
d30fe46b51 | ||
![]() |
8f757eece8 | ||
![]() |
4e314d75af | ||
![]() |
aaebb0a231 | ||
![]() |
c33354805c | ||
![]() |
9f31783249 | ||
![]() |
d187a0a3af | ||
![]() |
61a72b9c20 | ||
![]() |
a58f86812c | ||
![]() |
cf5077451f | ||
![]() |
22fbbbb1cc | ||
![]() |
c05603fa8c | ||
![]() |
7603a464cd | ||
![]() |
b5cbd7f040 | ||
![]() |
d33f9ec86b | ||
![]() |
a0805eda18 | ||
![]() |
6e93b59f61 | ||
![]() |
d99dbe4d56 | ||
![]() |
c0f16be50f | ||
![]() |
24a795d7a9 | ||
![]() |
5485d5023e | ||
![]() |
2ba0a75c2f | ||
![]() |
38f89dfc2f | ||
![]() |
6f59236b1f | ||
![]() |
75ba2db2c1 | ||
![]() |
177fee0ad4 | ||
![]() |
d9fa80c0b0 | ||
![]() |
733f1da96b | ||
![]() |
a638f6e5aa | ||
![]() |
3df155f203 | ||
![]() |
d6b16b0df0 | ||
![]() |
bc5d407bf7 | ||
![]() |
800ea2af89 | ||
![]() |
f33881b1da | ||
![]() |
bd5860de4e | ||
![]() |
6e3f770d0d | ||
![]() |
997a6747ee | ||
![]() |
e78fe5f77b | ||
![]() |
1b7a538353 | ||
![]() |
da5d745c73 | ||
![]() |
8813bdf5dd | ||
![]() |
ca2cb4f28c | ||
![]() |
c23d873e1a | ||
![]() |
07ec38f345 | ||
![]() |
b404d5e9e4 | ||
![]() |
6910ed2de5 | ||
![]() |
2eed1f5bad | ||
![]() |
67f52935e3 | ||
![]() |
cfb4bb9b98 | ||
![]() |
cfc668d43d | ||
![]() |
ab1e851e7d | ||
![]() |
931354ca35 | ||
![]() |
5626a9282c | ||
![]() |
7b1c200380 | ||
![]() |
daea202bfd | ||
![]() |
79464f3c52 | ||
![]() |
f214ee7f3a | ||
![]() |
943876c432 | ||
![]() |
0edc68f7cd | ||
![]() |
a268437f17 | ||
![]() |
c5706ef791 | ||
![]() |
4a855bd2d1 | ||
![]() |
346b06d391 | ||
![]() |
f4677c866e | ||
![]() |
fb0c64a567 | ||
![]() |
da9f894341 | ||
![]() |
d58f85e09e | ||
![]() |
288c2313fe | ||
![]() |
18bc541694 | ||
![]() |
41977a6010 | ||
![]() |
0ecb03ad47 | ||
![]() |
4e86dca49d | ||
![]() |
32de27bb20 | ||
![]() |
5da3604ec3 | ||
![]() |
25c850e762 | ||
![]() |
351b5cd2cd | ||
![]() |
80ccbdfd86 | ||
![]() |
d202355f75 | ||
![]() |
ca9664b1ac | ||
![]() |
be1214814e | ||
![]() |
46c1e7351e | ||
![]() |
17ae28f0e4 | ||
![]() |
fc25b92e0f | ||
![]() |
8d9c770a81 | ||
![]() |
1acecc38e9 | ||
![]() |
0b6c9385bc | ||
![]() |
6eb2e43a8d | ||
![]() |
339bff6339 | ||
![]() |
1052c03a5b | ||
![]() |
2fad45132f | ||
![]() |
a7afa58fb6 | ||
![]() |
d3b82322af | ||
![]() |
538978b782 | ||
![]() |
a931e6d7bd | ||
![]() |
9b0887359b | ||
![]() |
2563c9ba7f | ||
![]() |
7e923580a5 | ||
![]() |
234e099c72 | ||
![]() |
21ed9b4575 | ||
![]() |
61702b2564 | ||
![]() |
a4760c4d1b | ||
![]() |
c597731d1d | ||
![]() |
6b671f93c6 | ||
![]() |
0c4bd1ccdc | ||
![]() |
4d994458f0 | ||
![]() |
27ad5b4f4e | ||
![]() |
c10a46aa43 | ||
![]() |
9d526b8d66 | ||
![]() |
e3cbd8a965 | ||
![]() |
2181da4b72 | ||
![]() |
de8d8686d2 | ||
![]() |
1a1085da48 | ||
![]() |
408d61dcfb | ||
![]() |
e0eb90aba1 | ||
![]() |
f35dee5c05 | ||
![]() |
960d6e0d7d | ||
![]() |
dd94877ec6 | ||
![]() |
1fb02d5ad8 | ||
![]() |
131bc92b77 | ||
![]() |
4ebb065f94 | ||
![]() |
a360900fbb | ||
![]() |
4e7e824a73 | ||
![]() |
9d3c0018c1 | ||
![]() |
fb18ac2b10 | ||
![]() |
2f4e1a78ad | ||
![]() |
1d94de5358 | ||
![]() |
7850f0d8c6 | ||
![]() |
246f3cb4d2 | ||
![]() |
133be8759a | ||
![]() |
99290b4c7e | ||
![]() |
7a761ebf7d | ||
![]() |
9b429bd12d | ||
![]() |
2821561618 | ||
![]() |
ee4e22d5ea | ||
![]() |
a69262398f | ||
![]() |
b667408be3 | ||
![]() |
2f7b7a1273 | ||
![]() |
f8884640b0 | ||
![]() |
59787a2e51 | ||
![]() |
6424dadd37 | ||
![]() |
9c340077f6 | ||
![]() |
c9810facce | ||
![]() |
26b2288bde | ||
![]() |
5271e89fa7 | ||
![]() |
c0d7a43637 | ||
![]() |
81ea182be4 | ||
![]() |
bd2a33fe77 | ||
![]() |
5024835c6f | ||
![]() |
9a5b631ed6 | ||
![]() |
4873d8c27d | ||
![]() |
7f2f15bc1a | ||
![]() |
4f00ca8d51 | ||
![]() |
4590b808da | ||
![]() |
389c8eea85 | ||
![]() |
ef214e6a3c | ||
![]() |
ac3a1c3569 | ||
![]() |
73ffa4594d | ||
![]() |
96bb79fd75 | ||
![]() |
e001c3349b | ||
![]() |
d5baa925e7 | ||
![]() |
d49edbcf14 | ||
![]() |
c08cf78b47 | ||
![]() |
5cc5270aaf | ||
![]() |
8ea8b80b85 | ||
![]() |
abd432fd7a | ||
![]() |
adc217137e | ||
![]() |
a26e1c8b63 | ||
![]() |
ad7a405fa5 | ||
![]() |
8c52bab930 | ||
![]() |
dc2315ad85 | ||
![]() |
f8cea06be3 | ||
![]() |
3062c98093 | ||
![]() |
363dee82d8 | ||
![]() |
629ac9ae68 | ||
![]() |
4df24bc05d | ||
![]() |
5858efd6c9 | ||
![]() |
298fa76d1e | ||
![]() |
139a7fc6c2 | ||
![]() |
e91bf4583f | ||
![]() |
f543a44836 | ||
![]() |
656b931d70 | ||
![]() |
4ec3e239ba | ||
![]() |
966a560836 | ||
![]() |
e56ea60058 | ||
![]() |
53e543386e | ||
![]() |
4520a584e4 | ||
![]() |
d820114560 | ||
![]() |
b5b900200f | ||
![]() |
b57eb73fcd | ||
![]() |
3d1b9e98a4 | ||
![]() |
e55220dbe0 | ||
![]() |
9b69921491 | ||
![]() |
9edeec7f23 | ||
![]() |
1c62cb7b42 | ||
![]() |
bb50721ddd | ||
![]() |
4629d6a671 | ||
![]() |
db68a95cae | ||
![]() |
6b5cb01834 | ||
![]() |
6dc482b197 | ||
![]() |
bc9bb2f3be | ||
![]() |
22c576b40b | ||
![]() |
29ffe804b8 | ||
![]() |
b6a881ba32 | ||
![]() |
fffea62005 | ||
![]() |
21c396a3aa | ||
![]() |
cdff9b8da7 | ||
![]() |
9a4c307740 | ||
![]() |
4b26d9b62b | ||
![]() |
3575e27ece | ||
![]() |
16ad362e67 | ||
![]() |
f03c470adf | ||
![]() |
c2c7b7af7a | ||
![]() |
05dfe9f9c5 | ||
![]() |
2aacda3235 | ||
![]() |
7bfd775a5c | ||
![]() |
2742935c54 | ||
![]() |
f7f775a4ef | ||
![]() |
8c92c0a59d | ||
![]() |
16222f53a3 | ||
![]() |
4ce3a1c1e9 | ||
![]() |
0c6c51eb63 | ||
![]() |
56a87efbac | ||
![]() |
8f22105289 | ||
![]() |
74360d0a01 | ||
![]() |
c7972f2645 | ||
![]() |
ef31109ad2 | ||
![]() |
8f9847248a | ||
![]() |
16f2a3e2f8 | ||
![]() |
db6b97e90b | ||
![]() |
48b4ce6ddb | ||
![]() |
7654549bff | ||
![]() |
a32c4ae918 | ||
![]() |
cd095c817e | ||
![]() |
a779e82bc7 | ||
![]() |
6ba53f661a | ||
![]() |
25cf8546fe | ||
![]() |
25df4ba6bd | ||
![]() |
b3c397ba08 | ||
![]() |
b5181e3d06 | ||
![]() |
e0b3b12253 | ||
![]() |
6129f5f68b | ||
![]() |
6e98c80eaa | ||
![]() |
652c5a9410 | ||
![]() |
f457f0a26d | ||
![]() |
9f9ad95fb4 | ||
![]() |
78fdebb130 | ||
![]() |
1fbd45a594 | ||
![]() |
1ea54a2d8d | ||
![]() |
32126dc4f0 | ||
![]() |
39fafdac0f | ||
![]() |
f956ed7366 | ||
![]() |
615ca78567 | ||
![]() |
169b0f33f6 | ||
![]() |
451ac2aa1e | ||
![]() |
4162d1f056 | ||
![]() |
e8c6d1c620 | ||
![]() |
6b1b746f66 | ||
![]() |
f4a10933ca | ||
![]() |
71d5d14c13 | ||
![]() |
21c5d2de39 | ||
![]() |
4767554562 | ||
![]() |
241415ecb6 | ||
![]() |
d83ac7a124 | ||
![]() |
85c2b03507 | ||
![]() |
134b60bb25 | ||
![]() |
35be48f525 | ||
![]() |
29d1a2cc51 | ||
![]() |
6840589ca5 | ||
![]() |
e7ae5ec07c | ||
![]() |
f0e2dd4b5e | ||
![]() |
49f1cbd40e | ||
![]() |
8e3a2b9755 | ||
![]() |
06dfa1cafc | ||
![]() |
8ee21ac16d | ||
![]() |
598303fa95 | ||
![]() |
16ca3121d2 | ||
![]() |
3d86b92511 | ||
![]() |
24a922b54b | ||
![]() |
46d679ab11 | ||
![]() |
f9777dfda4 | ||
![]() |
4f26a8b308 | ||
![]() |
fe00bb9746 | ||
![]() |
97464e470c | ||
![]() |
f739fa19e7 | ||
![]() |
58c2dae32e | ||
![]() |
43ae1370f3 | ||
![]() |
294fc6caef | ||
![]() |
4e4ef11cf1 | ||
![]() |
269c7b6e5b | ||
![]() |
2b50cd7989 | ||
![]() |
cfe52b6e6e | ||
![]() |
9c2c96a20e | ||
![]() |
99a225e1a2 | ||
![]() |
78eb69ead5 | ||
![]() |
98f0c0895b | ||
![]() |
02e6c04ac2 | ||
![]() |
d8e100ae3c | ||
![]() |
b9d6bfe927 | ||
![]() |
76daf29ef0 | ||
![]() |
f9ed1e3ebc | ||
![]() |
20cbe372a6 | ||
![]() |
e67a4ba7ce | ||
![]() |
794afbd1c1 | ||
![]() |
9f0f39555c | ||
![]() |
7d81d333f2 | ||
![]() |
f4a702e49f | ||
![]() |
7c4d3d13e3 | ||
![]() |
32f060366f | ||
![]() |
00feff656f | ||
![]() |
36b4e290c8 | ||
![]() |
c6841a51de | ||
![]() |
5a69d3006a | ||
![]() |
1b637287a1 | ||
![]() |
33d7fa1180 | ||
![]() |
8136eda6d4 | ||
![]() |
1cbb5ae99e | ||
![]() |
2d41443e6a | ||
![]() |
d36f73a431 | ||
![]() |
4a0badfb34 | ||
![]() |
35aceab1a4 | ||
![]() |
eb2db05e8a | ||
![]() |
a0aebe5cd5 | ||
![]() |
b9f2121d10 | ||
![]() |
12b3dd36f3 | ||
![]() |
e6ce481179 | ||
![]() |
de381ad3b7 | ||
![]() |
920a8f658c | ||
![]() |
4468662d64 | ||
![]() |
3cb09bed1f | ||
![]() |
91e0e46e4a | ||
![]() |
7b313dbc89 | ||
![]() |
8975dc6c3b | ||
![]() |
6adf461aa0 | ||
![]() |
bd2e59af60 | ||
![]() |
909054c357 | ||
![]() |
06cec720dd | ||
![]() |
ad4fc42e6b | ||
![]() |
62105b5c07 | ||
![]() |
d046f73b49 | ||
![]() |
3561c3a1f9 | ||
![]() |
51d9520be7 | ||
![]() |
9a29ddf6af | ||
![]() |
5d61bc7eb1 | ||
![]() |
ec09c03b64 | ||
![]() |
a4f28b9d1f | ||
![]() |
4875bcecc2 | ||
![]() |
ddb737e716 | ||
![]() |
3e3320e8d9 | ||
![]() |
4a51f06c83 | ||
![]() |
03b7d8217f | ||
![]() |
c783325e16 | ||
![]() |
9d4347b699 | ||
![]() |
32c90bf026 | ||
![]() |
3aebc8acb0 | ||
![]() |
5633a2cdb4 | ||
![]() |
e3c6467ab9 | ||
![]() |
4413805a64 | ||
![]() |
7fb60519ee | ||
![]() |
3472536796 | ||
![]() |
549708edfa | ||
![]() |
67c366850e | ||
![]() |
6aa3814f6e | ||
![]() |
092fa3b61a | ||
![]() |
809865e9ee | ||
![]() |
2f243e2817 | ||
![]() |
8600f5b48a | ||
![]() |
2f517041c7 | ||
![]() |
5fab310e65 | ||
![]() |
a03de8440b | ||
![]() |
b2ded61796 | ||
![]() |
ae14710a10 | ||
![]() |
fd095bbfae | ||
![]() |
ecec4e4a7a | ||
![]() |
9eaa8a24ed | ||
![]() |
caf6245c32 | ||
![]() |
dd17b6be29 | ||
![]() |
aec7f29df7 | ||
![]() |
a40cccced2 | ||
![]() |
41bd4e35a0 | ||
![]() |
1e3095f9cc | ||
![]() |
1b42d2ccfd | ||
![]() |
b87877660e | ||
![]() |
e26442fc2a | ||
![]() |
dd887eae36 | ||
![]() |
911c715f49 | ||
![]() |
8ad43a965f | ||
![]() |
23bd6f16f9 | ||
![]() |
47e72a95ef | ||
![]() |
5c16bb4fc4 | ||
![]() |
04ce3497ab | ||
![]() |
e149340351 | ||
![]() |
b03b49fca3 | ||
![]() |
a74647c1fa | ||
![]() |
c6b979b162 | ||
![]() |
633d92a68b | ||
![]() |
8d8775aff2 | ||
![]() |
81ea4f9110 | ||
![]() |
413c3d349c | ||
![]() |
4b1aa1640c | ||
![]() |
ba8de0ef74 | ||
![]() |
ab9e74ad5e | ||
![]() |
faa7c1a1d8 | ||
![]() |
b0f5eb8f00 | ||
![]() |
367b8e09d9 | ||
![]() |
2447765181 | ||
![]() |
5aaf5a8c25 | ||
![]() |
b078d0bfc5 | ||
![]() |
7e8a64ca53 | ||
![]() |
d78c0007ba | ||
![]() |
e798c02d82 | ||
![]() |
14295563e1 | ||
![]() |
5dd1a68cb6 | ||
![]() |
66fcc7f5f5 | ||
![]() |
42e369dc9e | ||
![]() |
9055dbbe65 |
@@ -4,39 +4,39 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
# We recommend you to keep these unchanged
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[{*.yaml,*.yml}] # To match GitHub Actions formatting
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
indent_size = 4
|
||||
|
||||
[{qmk,*.py}]
|
||||
charset = utf-8
|
||||
max_line_length = 200
|
||||
|
||||
# Make these match what we have in .gitattributes
|
||||
[*.mk]
|
||||
end_of_line = lf
|
||||
[{Makefile,*.mk}]
|
||||
indent_style = tab
|
||||
|
||||
[Makefile]
|
||||
end_of_line = lf
|
||||
indent_style = tab
|
||||
|
||||
[*.sh]
|
||||
end_of_line = lf
|
||||
|
||||
# The gitattributes file will handle the line endings conversion properly according to the operating system settings for other files
|
||||
|
||||
|
||||
# We don't have gitattributes properly for these
|
||||
# So if the user have for example core.autocrlf set to true
|
||||
# the line endings would be wrong.
|
||||
# Don't override anything in `lib/`...
|
||||
[lib/**]
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
tab_width = unset
|
||||
end_of_line = unset
|
||||
charset = unset
|
||||
spelling_language = unset
|
||||
trim_trailing_whitespace = unset
|
||||
insert_final_newline = unset
|
||||
|
||||
# ...except QMK's `lib/python`.
|
||||
[{*.py,lib/python/**.py}]
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
max_line_length = 200
|
||||
|
4
.github/labeler.yml
vendored
4
.github/labeler.yml
vendored
@@ -40,3 +40,7 @@ translation:
|
||||
- docs/ru-ru/**/*
|
||||
CI:
|
||||
- .github/**/*
|
||||
dd:
|
||||
- data/constants/**/*
|
||||
- data/mappings/**/*
|
||||
- data/schemas/**/*
|
||||
|
2
.github/workflows/api.yml
vendored
2
.github/workflows/api.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
2
.github/workflows/auto_tag.yml
vendored
2
.github/workflows/auto_tag.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
|
4
.github/workflows/ci_builds.yml
vendored
4
.github/workflows/ci_builds.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
ref: ${{ github.event.inputs.branch || github.ref }}
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
[ ! -f .failed ] || exit 1
|
||||
|
||||
- name: 'Upload artifacts'
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: artifacts-${{ github.event.inputs.branch || github.ref_name }}-${{ matrix.keymap }}
|
||||
|
2
.github/workflows/cli.yml
vendored
2
.github/workflows/cli.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
|
2
.github/workflows/develop_update.yml
vendored
2
.github/workflows/develop_update.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
qmk --verbose generate-docs
|
||||
|
||||
- name: Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@v4.4.3
|
||||
uses: JamesIves/github-pages-deploy-action@v4.5.0
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
BASE_BRANCH: master
|
||||
|
2
.github/workflows/feature_branch_update.yml
vendored
2
.github/workflows/feature_branch_update.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- riot
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
fetch-depth: 0
|
||||
|
6
.github/workflows/format.yml
vendored
6
.github/workflows/format.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -35,7 +35,9 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v38
|
||||
uses: tj-actions/changed-files@v42
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
- name: Run qmk formatters
|
||||
shell: 'bash {0}'
|
||||
|
4
.github/workflows/format_push.yml
vendored
4
.github/workflows/format_push.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
|
2
.github/workflows/labeler.yml
vendored
2
.github/workflows/labeler.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@main
|
||||
- uses: actions/labeler@v4
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
configuration-path: '.github/labeler.yml'
|
||||
|
41
.github/workflows/lint.yml
vendored
41
.github/workflows/lint.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -27,7 +27,9 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v38
|
||||
uses: tj-actions/changed-files@v42
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
- name: Print info
|
||||
run: |
|
||||
@@ -62,10 +64,12 @@ jobs:
|
||||
|
||||
qmk format-text ${{ steps.file_changes.outputs.all_changed_files}} || true
|
||||
for file in ${{ steps.file_changes.outputs.all_changed_files}}; do
|
||||
if ! git diff --quiet $file; then
|
||||
echo "File '${file}' Requires Formatting"
|
||||
echo "::error file=${file}::Requires Formatting"
|
||||
exit_code=$(($exit_code + 1))
|
||||
if [[ -f $file ]]; then
|
||||
if ! git diff --quiet $file; then
|
||||
echo "File '${file}' Requires Formatting"
|
||||
echo "::error file=${file}::Requires Formatting"
|
||||
exit_code=$(($exit_code + 1))
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -74,31 +78,10 @@ jobs:
|
||||
fi
|
||||
exit $exit_code
|
||||
|
||||
- name: Verify at most one added keyboard
|
||||
- name: Verify keyboard aliases
|
||||
if: always()
|
||||
shell: 'bash {0}'
|
||||
run: |
|
||||
git reset --hard
|
||||
git clean -xfd
|
||||
|
||||
# Get the keyboard list and count for the target branch
|
||||
git checkout -f ${{ github.base_ref }}
|
||||
git pull --ff-only
|
||||
QMK_KEYBOARDS_BASE=$(qmk list-keyboards)
|
||||
QMK_KEYBOARDS_BASE_COUNT=$(qmk list-keyboards | wc -l)
|
||||
|
||||
# Get the keyboard list and count for the PR
|
||||
git checkout -f ${{ github.head_ref }}
|
||||
git merge --no-commit --squash ${{ github.base_ref }}
|
||||
QMK_KEYBOARDS_PR=$(qmk list-keyboards)
|
||||
QMK_KEYBOARDS_PR_COUNT=$(qmk list-keyboards | wc -l)
|
||||
|
||||
echo "::group::Keyboards changes in this PR"
|
||||
diff -d -U 0 <(echo "$QMK_KEYBOARDS_BASE") <(echo "$QMK_KEYBOARDS_PR") | grep -vE '^(---|\+\+\+|@@)' | sed -e 's@^-@Removed: @g' -e 's@^+@ Added: @g'
|
||||
echo "::endgroup::"
|
||||
|
||||
if [[ $QMK_KEYBOARDS_PR_COUNT -gt $(($QMK_KEYBOARDS_BASE_COUNT + 1)) ]]; then
|
||||
echo "More than one keyboard added in this PR -- see the PR Checklist."
|
||||
echo "::error::More than one keyboard added in this PR -- see the PR Checklist."
|
||||
exit 1
|
||||
fi
|
||||
qmk ci-validate-aliases
|
||||
|
2
.github/workflows/regen.yml
vendored
2
.github/workflows/regen.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
|
4
.github/workflows/regen_push.yml
vendored
4
.github/workflows/regen_push.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Disable safe.directory check
|
||||
run : git config --global --add safe.directory '*'
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Run qmk generators
|
||||
run: |
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v5
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
|
3
.github/workflows/stale.yml
vendored
3
.github/workflows/stale.yml
vendored
@@ -3,6 +3,7 @@ name: 'Close stale issues and PRs'
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
actions: write
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -13,7 +14,7 @@ jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v8
|
||||
- uses: actions/stale@main
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
2
.github/workflows/unit_test.yml
vendored
2
.github/workflows/unit_test.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
|
9
.gitignore
vendored
9
.gitignore
vendored
@@ -18,6 +18,11 @@
|
||||
*.lst
|
||||
*.map
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
*.la
|
||||
*.stackdump
|
||||
*.sym
|
||||
|
||||
@@ -95,6 +100,7 @@ secrets.tar
|
||||
# Python things
|
||||
__pycache__
|
||||
.python-version
|
||||
.venv
|
||||
|
||||
# Prerequisites for updating ChibiOS
|
||||
/util/fmpp*
|
||||
@@ -107,5 +113,6 @@ compile_commands.json
|
||||
.clangd/
|
||||
.cache/
|
||||
|
||||
# VIA(L) json files that don't belong in QMK repo
|
||||
# VIA(L) files that don't belong in QMK repo
|
||||
via*.json
|
||||
/keyboards/**/keymaps/vial/*
|
||||
|
51
Makefile
51
Makefile
@@ -38,6 +38,11 @@ $(info QMK Firmware $(QMK_VERSION))
|
||||
endif
|
||||
endif
|
||||
|
||||
# Try to determine userspace from qmk config, if set.
|
||||
ifeq ($(QMK_USERSPACE),)
|
||||
QMK_USERSPACE = $(shell qmk config -ro user.overlay_dir | cut -d= -f2 | sed -e 's@^None$$@@g')
|
||||
endif
|
||||
|
||||
# Determine which qmk cli to use
|
||||
QMK_BIN := qmk
|
||||
|
||||
@@ -191,9 +196,20 @@ define PARSE_KEYBOARD
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
|
||||
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
|
||||
endif
|
||||
|
||||
KEYBOARD_LAYOUTS := $(shell $(QMK_BIN) list-layouts --keyboard $1)
|
||||
LAYOUT_KEYMAPS :=
|
||||
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/layouts/*/$$(LAYOUT)/*/.)))))
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(QMK_USERSPACE)/layouts/$$(LAYOUT)/*/.)))))
|
||||
endif
|
||||
|
||||
KEYMAPS := $$(sort $$(KEYMAPS) $$(LAYOUT_KEYMAPS))
|
||||
|
||||
@@ -300,17 +316,18 @@ endef
|
||||
define BUILD_TEST
|
||||
TEST_PATH := $1
|
||||
TEST_NAME := $$(notdir $$(TEST_PATH))
|
||||
TEST_FULL_NAME := $$(subst /,_,$$(patsubst $$(ROOT_DIR)tests/%,%,$$(TEST_PATH)))
|
||||
MAKE_TARGET := $2
|
||||
COMMAND := $1
|
||||
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_OUTPUT=$$(TEST_FULL_NAME) TEST_PATH=$$(TEST_PATH) FULL_TESTS="$$(FULL_TESTS)"
|
||||
MAKE_MSG := $$(MSG_MAKE_TEST)
|
||||
$$(eval $$(call BUILD))
|
||||
ifneq ($$(MAKE_TARGET),clean)
|
||||
TEST_EXECUTABLE := $$(TEST_OUTPUT_DIR)/$$(TEST_NAME).elf
|
||||
TESTS += $$(TEST_NAME)
|
||||
TEST_EXECUTABLE := $$(TEST_OUTPUT_DIR)/$$(TEST_FULL_NAME).elf
|
||||
TESTS += $$(TEST_FULL_NAME)
|
||||
TEST_MSG := $$(MSG_TEST)
|
||||
$$(TEST_NAME)_COMMAND := \
|
||||
$$(TEST_FULL_NAME)_COMMAND := \
|
||||
printf "$$(TEST_MSG)\n"; \
|
||||
$$(TEST_EXECUTABLE); \
|
||||
if [ $$$$? -gt 0 ]; \
|
||||
@@ -320,6 +337,12 @@ define BUILD_TEST
|
||||
endif
|
||||
endef
|
||||
|
||||
define LIST_TEST
|
||||
include $(BUILDDEFS_PATH)/testlist.mk
|
||||
FOUND_TESTS := $$(patsubst ./tests/%,%,$$(TEST_LIST))
|
||||
$$(info $$(FOUND_TESTS))
|
||||
endef
|
||||
|
||||
define PARSE_TEST
|
||||
TESTS :=
|
||||
TEST_NAME := $$(firstword $$(subst :, ,$$(RULE)))
|
||||
@@ -328,7 +351,7 @@ define PARSE_TEST
|
||||
ifeq ($$(TEST_NAME),all)
|
||||
MATCHED_TESTS := $$(TEST_LIST)
|
||||
else
|
||||
MATCHED_TESTS := $$(foreach TEST, $$(TEST_LIST),$$(if $$(findstring x$$(TEST_NAME)x, x$$(notdir $$(TEST))x), $$(TEST),))
|
||||
MATCHED_TESTS := $$(foreach TEST, $$(TEST_LIST),$$(if $$(findstring x$$(TEST_NAME)x, x$$(patsubst ./tests/%,%,$$(TEST)x)), $$(TEST),))
|
||||
endif
|
||||
$$(foreach TEST,$$(MATCHED_TESTS),$$(eval $$(call BUILD_TEST,$$(TEST),$$(TEST_TARGET))))
|
||||
endef
|
||||
@@ -413,6 +436,10 @@ git-submodules: git-submodule
|
||||
list-keyboards:
|
||||
$(QMK_BIN) list-keyboards --no-resolve-defaults | tr '\n' ' '
|
||||
|
||||
.PHONY: list-tests
|
||||
list-tests:
|
||||
$(eval $(call LIST_TEST))
|
||||
|
||||
.PHONY: generate-keyboards-file
|
||||
generate-keyboards-file:
|
||||
$(QMK_BIN) list-keyboards --no-resolve-defaults
|
||||
@@ -423,8 +450,18 @@ clean:
|
||||
rm -rf $(BUILD_DIR)
|
||||
echo 'done.'
|
||||
|
||||
.PHONY: distclean
|
||||
distclean: clean
|
||||
.PHONY: distclean distclean_qmk
|
||||
distclean: distclean_qmk
|
||||
distclean_qmk: clean
|
||||
echo -n 'Deleting *.bin, *.hex, and *.uf2 ... '
|
||||
rm -f *.bin *.hex *.uf2
|
||||
echo 'done.'
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
.PHONY: distclean_userspace
|
||||
distclean: distclean_userspace
|
||||
distclean_userspace: clean
|
||||
echo -n 'Deleting userspace *.bin, *.hex, and *.uf2 ... '
|
||||
rm -f $(QMK_USERSPACE)/*.bin $(QMK_USERSPACE)/*.hex $(QMK_USERSPACE)/*.uf2
|
||||
echo 'done.'
|
||||
endif
|
||||
|
@@ -13,10 +13,10 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
$(TEST)_INC := \
|
||||
$(TEST_OUTPUT)_INC := \
|
||||
tests/test_common/common_config.h
|
||||
|
||||
$(TEST)_SRC := \
|
||||
$(TEST_OUTPUT)_SRC := \
|
||||
$(QUANTUM_SRC) \
|
||||
$(SRC) \
|
||||
$(QUANTUM_PATH)/keymap_introspection.c \
|
||||
@@ -30,8 +30,8 @@ $(TEST)_SRC := \
|
||||
tests/test_common/test_logger.cpp \
|
||||
$(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp))
|
||||
|
||||
$(TEST)_DEFS := $(OPT_DEFS) "-DKEYMAP_C=\"keymap.c\""
|
||||
$(TEST_OUTPUT)_DEFS := $(OPT_DEFS) "-DKEYMAP_C=\"keymap.c\""
|
||||
|
||||
$(TEST)_CONFIG := $(TEST_PATH)/config.h
|
||||
$(TEST_OUTPUT)_CONFIG := $(TEST_PATH)/config.h
|
||||
|
||||
VPATH += $(TOP_DIR)/tests/test_common
|
||||
|
@@ -1,17 +1,36 @@
|
||||
# Look for a json keymap file
|
||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
|
||||
KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
endif
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json)","")
|
||||
KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
|
||||
endif
|
||||
endif
|
||||
|
@@ -129,37 +129,68 @@ include $(BUILDDEFS_PATH)/build_json.mk
|
||||
# Pull in keymap level rules.mk
|
||||
ifeq ("$(wildcard $(KEYMAP_PATH))", "")
|
||||
# Look through the possible keymap folders until we find a matching keymap.c
|
||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ($(LAYOUTS),)
|
||||
# If we haven't found a keymap yet fall back to community layouts
|
||||
include $(BUILDDEFS_PATH)/build_layout.mk
|
||||
else
|
||||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||
# this state should never be reached
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||
-include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||
KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||
KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
|
||||
endif
|
||||
endif
|
||||
ifeq ($(KEYMAP_PATH),)
|
||||
ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_1)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_2)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_3)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_4)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
|
||||
else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
|
||||
-include $(MAIN_KEYMAP_PATH_5)/rules.mk
|
||||
KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
|
||||
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
|
||||
else ifneq ($(LAYOUTS),)
|
||||
# If we haven't found a keymap yet fall back to community layouts
|
||||
include $(BUILDDEFS_PATH)/build_layout.mk
|
||||
else ifeq ("$(wildcard $(KEYMAP_JSON_PATH))", "") # Not finding keymap.c is fine if we found a keymap.json
|
||||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||
# this state should never be reached
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Have we found a keymap.json?
|
||||
ifneq ("$(wildcard $(KEYMAP_JSON))", "")
|
||||
ifneq ("$(wildcard $(KEYMAP_C))", "")
|
||||
$(call WARNING_MESSAGE,Keymap is specified as both keymap.json and keymap.c -- keymap.json file wins.)
|
||||
endif
|
||||
|
||||
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
||||
|
||||
KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
||||
KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
|
||||
|
||||
@@ -359,6 +390,16 @@ ifeq ("$(USER_NAME)","")
|
||||
endif
|
||||
USER_PATH := users/$(USER_NAME)
|
||||
|
||||
# If we have userspace, then add it to the lookup VPATH
|
||||
ifneq ($(wildcard $(QMK_USERSPACE)),)
|
||||
VPATH += $(QMK_USERSPACE)
|
||||
endif
|
||||
|
||||
# If the equivalent users directory exists in userspace, use that in preference to anything currently in the main repo
|
||||
ifneq ($(wildcard $(QMK_USERSPACE)/$(USER_PATH)),)
|
||||
USER_PATH := $(QMK_USERSPACE)/$(USER_PATH)
|
||||
endif
|
||||
|
||||
# Pull in user level rules.mk
|
||||
-include $(USER_PATH)/rules.mk
|
||||
ifneq ("$(wildcard $(USER_PATH)/config.h)","")
|
||||
@@ -399,6 +440,10 @@ ifneq ("$(KEYMAP_H)","")
|
||||
CONFIG_H += $(KEYMAP_H)
|
||||
endif
|
||||
|
||||
ifeq ($(KEYMAP_C),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
|
||||
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
|
||||
@@ -450,6 +495,7 @@ $(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))
|
||||
$(eval $(call add_qmk_prefix_defs,OPT,OPT))
|
||||
|
||||
# Control whether intermediate file listings are generated
|
||||
# e.g.:
|
||||
@@ -495,10 +541,10 @@ check-size: top-symbols
|
||||
top-symbols: build
|
||||
echo "###########################################"
|
||||
echo "# Highest flash usage:"
|
||||
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [t] ' | head -n$(NUM_TOP_SYMBOLS) | 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'
|
||||
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [RrTt] ' | head -n$(NUM_TOP_SYMBOLS) | 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 -n$(NUM_TOP_SYMBOLS) | 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'
|
||||
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [BbCDdGgSs] ' | head -n$(NUM_TOP_SYMBOLS) | 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
|
||||
|
||||
|
@@ -1,6 +1,10 @@
|
||||
LAYOUTS_PATH := layouts
|
||||
LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH))
|
||||
endif
|
||||
|
||||
define SEARCH_LAYOUTS_REPO
|
||||
LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
|
||||
LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json
|
||||
|
@@ -9,13 +9,13 @@ OPT = g
|
||||
include paths.mk
|
||||
include $(BUILDDEFS_PATH)/message.mk
|
||||
|
||||
TARGET=test/$(TEST)
|
||||
TARGET=test/$(TEST_OUTPUT)
|
||||
|
||||
GTEST_OUTPUT = $(BUILD_DIR)/gtest
|
||||
|
||||
TEST_OBJ = $(BUILD_DIR)/test_obj
|
||||
|
||||
OUTPUTS := $(TEST_OBJ)/$(TEST) $(GTEST_OUTPUT)
|
||||
OUTPUTS := $(TEST_OBJ)/$(TEST_OUTPUT) $(GTEST_OUTPUT)
|
||||
|
||||
GTEST_INC := \
|
||||
$(LIB_PATH)/googletest/googletest/include \
|
||||
@@ -71,18 +71,18 @@ ifneq ($(filter $(FULL_TESTS),$(TEST)),)
|
||||
include $(BUILDDEFS_PATH)/build_full_test.mk
|
||||
endif
|
||||
|
||||
$(TEST)_SRC += \
|
||||
$(TEST_OUTPUT)_SRC += \
|
||||
tests/test_common/main.cpp \
|
||||
$(QUANTUM_PATH)/logging/print.c
|
||||
|
||||
ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
|
||||
$(TEST)_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
|
||||
$(TEST_OUTPUT)_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
|
||||
endif
|
||||
|
||||
$(TEST_OBJ)/$(TEST)_SRC := $($(TEST)_SRC)
|
||||
$(TEST_OBJ)/$(TEST)_INC := $($(TEST)_INC) $(VPATH) $(GTEST_INC)
|
||||
$(TEST_OBJ)/$(TEST)_DEFS := $($(TEST)_DEFS)
|
||||
$(TEST_OBJ)/$(TEST)_CONFIG := $($(TEST)_CONFIG)
|
||||
$(TEST_OBJ)/$(TEST_OUTPUT)_SRC := $($(TEST_OUTPUT)_SRC)
|
||||
$(TEST_OBJ)/$(TEST_OUTPUT)_INC := $($(TEST_OUTPUT)_INC) $(VPATH) $(GTEST_INC)
|
||||
$(TEST_OBJ)/$(TEST_OUTPUT)_DEFS := $($(TEST_OUTPUT)_DEFS)
|
||||
$(TEST_OBJ)/$(TEST_OUTPUT)_CONFIG := $($(TEST_OUTPUT)_CONFIG)
|
||||
|
||||
include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
|
||||
include $(BUILDDEFS_PATH)/common_rules.mk
|
||||
|
@@ -75,10 +75,7 @@ ifeq ($(strip $(AUDIO_ENABLE)), yes)
|
||||
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)
|
||||
@@ -94,11 +91,6 @@ ifeq ($(strip $(MIDI_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)
|
||||
@@ -124,17 +116,11 @@ ifeq ($(strip $(STENO_ENABLE)), yes)
|
||||
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 pmw3320 pmw3360 pmw3389 pimoroni_trackball custom
|
||||
VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 pmw3320 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)
|
||||
@@ -151,30 +137,26 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||
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
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||
OPT_DEFS += -DSTM32_ADC -DHAL_USE_ADC=TRUE
|
||||
LIB_SRC += analog.c
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), azoteq_iqs5xx)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
|
||||
OPT_DEFS += -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
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
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
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
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
|
||||
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
SRC += drivers/sensors/pmw33xx_common.c
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -204,12 +186,12 @@ else
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
|
||||
# External I2C EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_i2c.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), spi)
|
||||
# External SPI EEPROM implementation
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
SRC += eeprom_driver.c eeprom_spi.c
|
||||
else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
|
||||
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
|
||||
@@ -308,10 +290,10 @@ ifneq ($(strip $(FLASH_DRIVER)), none)
|
||||
else
|
||||
OPT_DEFS += -DFLASH_ENABLE
|
||||
ifeq ($(strip $(FLASH_DRIVER)),spi)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += flash_spi.c
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -328,8 +310,10 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgblight
|
||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
|
||||
OPT_DEFS += -DRGBLIGHT_ENABLE
|
||||
OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
SRC += $(QUANTUM_DIR)/color.c
|
||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
|
||||
SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
|
||||
CIE1931_CURVE := yes
|
||||
RGB_KEYCODES_ENABLE := yes
|
||||
endif
|
||||
@@ -342,24 +326,29 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
APA102_DRIVER_REQUIRED := yes
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), custom)
|
||||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
||||
ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
|
||||
OPT_DEFS += -DVELOCIKEY_ENABLE
|
||||
endif
|
||||
endif
|
||||
|
||||
# Deprecated driver names - do not use
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), aw20216)
|
||||
LED_MATRIX_DRIVER := aw20216s
|
||||
endif
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), ckled2001)
|
||||
LED_MATRIX_DRIVER := snled27351
|
||||
endif
|
||||
|
||||
LED_MATRIX_ENABLE ?= no
|
||||
VALID_LED_MATRIX_TYPES := is31fl3731 is31fl3742a is31fl3743a is31fl3745 is31fl3746a ckled2001 custom
|
||||
# TODO: is31fl3733 is31fl3737 is31fl3741
|
||||
VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom
|
||||
|
||||
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
|
||||
OPT_DEFS += -DLED_MATRIX_$(strip $(shell echo $(LED_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners
|
||||
@@ -367,65 +356,101 @@ endif
|
||||
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
|
||||
LIB8TION_ENABLE := yes
|
||||
CIE1931_CURVE := yes
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3218)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3218-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3729)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3729-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3731)
|
||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3731-simple.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3731-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3742a)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3742A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3733)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3733-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3743a)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3736)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3736-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3745)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3737)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3737-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3746a)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3741)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3741-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), ckled2001)
|
||||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3742a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3742a-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3743a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3743a-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3745)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3745-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3746a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3746a-mono.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(LED_MATRIX_DRIVER)), snled27351)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
SRC += ckled2001-simple.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += snled27351-mono.c
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
# Deprecated driver names - do not use
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216)
|
||||
RGB_MATRIX_DRIVER := aw20216s
|
||||
endif
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), ckled2001)
|
||||
RGB_MATRIX_DRIVER := snled27351
|
||||
endif
|
||||
|
||||
RGB_MATRIX_ENABLE ?= no
|
||||
|
||||
VALID_RGB_MATRIX_TYPES := aw20216 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a ckled2001 ws2812 custom
|
||||
VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 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
|
||||
OPT_DEFS += -DRGB_MATRIX_$(strip $(shell echo $(RGB_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||
@@ -433,94 +458,93 @@ endif
|
||||
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
|
||||
LIB8TION_ENABLE := yes
|
||||
CIE1931_CURVE := yes
|
||||
RGB_KEYCODES_ENABLE := yes
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216)
|
||||
OPT_DEFS += -DAW20216 -DSTM32_SPI -DHAL_USE_SPI=TRUE
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
SRC += aw20216.c
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
SRC += aw20216s.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3218)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3218.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3729)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3729.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3731)
|
||||
OPT_DEFS += -DIS31FL3731 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
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
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3733.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3736)
|
||||
OPT_DEFS += -DIS31FL3736 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3736.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3737)
|
||||
OPT_DEFS += -DIS31FL3737 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
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
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
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
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3742a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3742a.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3743a)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3743A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3743a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3743a.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3745)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3745 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3745)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3745.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3746a)
|
||||
OPT_DEFS += -DIS31FLCOMMON -DIS31FL3746A -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3746a)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31flcommon.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += is31fl3746a.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), ckled2001)
|
||||
OPT_DEFS += -DCKLED2001 -DSTM32_I2C -DHAL_USE_I2C=TRUE
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), snled27351)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
SRC += ckled2001.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
SRC += snled27351.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
|
||||
|
||||
@@ -567,6 +591,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/backlight/backlight.c
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
|
||||
OPT_DEFS += -DBACKLIGHT_ENABLE
|
||||
OPT_DEFS += -DBACKLIGHT_$(strip $(shell echo $(BACKLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
ifneq ($(strip $(BACKLIGHT_DRIVER)), custom)
|
||||
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
|
||||
@@ -579,35 +604,6 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
|
||||
endif
|
||||
endif
|
||||
|
||||
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi 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:]'))
|
||||
|
||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
||||
|
||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
|
||||
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
|
||||
@@ -622,28 +618,11 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
|
||||
RAW_ENABLE := yes
|
||||
BOOTMAGIC_ENABLE := yes
|
||||
TRI_LAYER_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)
|
||||
@@ -708,33 +687,35 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
|
||||
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 $(LIB8TION_ENABLE)), yes)
|
||||
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
|
||||
SRC += $(LIB_PATH)/lib8tion/lib8tion.c
|
||||
endif
|
||||
|
||||
VALID_HAPTIC_DRIVER_TYPES := drv2605l solenoid
|
||||
ifeq ($(strip $(HAPTIC_ENABLE)),yes)
|
||||
ifeq ($(filter $(HAPTIC_DRIVER),$(VALID_HAPTIC_DRIVER_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid HAPTIC_DRIVER,HAPTIC_DRIVER="$(HAPTIC_DRIVER)" is not a valid Haptic driver)
|
||||
else
|
||||
OPT_DEFS += -DHAPTIC_$(strip $(shell echo $(HAPTIC_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
COMMON_VPATH += $(DRIVER_PATH)/haptic
|
||||
|
||||
ifeq ($(strip $(HAPTIC_DRIVER)), drv2605l)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
SRC += drv2605l.c
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
OPT_DEFS += -DHAPTIC_DRV2605L
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(HAPTIC_DRIVER)), solenoid)
|
||||
SRC += solenoid.c
|
||||
OPT_DEFS += -DHAPTIC_SOLENOID
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -757,6 +738,7 @@ ifeq ($(strip $(OLED_ENABLE)), yes)
|
||||
$(call CATASTROPHIC_ERROR,Invalid OLED_TRANSPORT,OLED_TRANSPORT="$(OLED_TRANSPORT)" is not a valid OLED transport)
|
||||
else
|
||||
OPT_DEFS += -DOLED_ENABLE
|
||||
OPT_DEFS += -DOLED_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
COMMON_VPATH += $(DRIVER_PATH)/oled
|
||||
ifneq ($(strip $(OLED_DRIVER)), custom)
|
||||
SRC += oled_driver.c
|
||||
@@ -764,10 +746,10 @@ ifeq ($(strip $(OLED_ENABLE)), yes)
|
||||
|
||||
OPT_DEFS += -DOLED_TRANSPORT_$(strip $(shell echo $(OLED_TRANSPORT) | tr '[:lower:]' '[:upper:]'))
|
||||
ifeq ($(strip $(OLED_TRANSPORT)), i2c)
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
endif
|
||||
ifeq ($(strip $(OLED_TRANSPORT)), spi)
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -775,9 +757,9 @@ endif
|
||||
|
||||
ifeq ($(strip $(ST7565_ENABLE)), yes)
|
||||
OPT_DEFS += -DST7565_ENABLE
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h
|
||||
COMMON_VPATH += $(DRIVER_PATH)/lcd
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
SRC += st7565.c
|
||||
endif
|
||||
|
||||
@@ -809,27 +791,6 @@ ifeq ($(strip $(UNICODE_COMMON)), yes)
|
||||
$(QUANTUM_DIR)/unicode/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
|
||||
MOUSE_ENABLE := yes
|
||||
@@ -866,15 +827,12 @@ ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
|
||||
$(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver)
|
||||
endif
|
||||
OPT_DEFS += -DJOYSTICK_ENABLE
|
||||
OPT_DEFS += -DJOYSTICK_$(strip $(shell echo $(JOYSTICK_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
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
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -909,38 +867,108 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||
$(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
|
||||
endif
|
||||
OPT_DEFS += -DBLUETOOTH_ENABLE
|
||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
NO_USB_STARTUP_CHECK := yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||
SRC += outputselect.c
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||
OPT_DEFS += -DBLUETOOTH_BLUEFRUIT_LE -DHAL_USE_SPI=TRUE
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
|
||||
QUANTUM_LIB_SRC += analog.c
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
|
||||
OPT_DEFS += -DBLUETOOTH_RN42 -DHAL_USE_SERIAL=TRUE
|
||||
UART_DRIVER_REQUIRED = yes
|
||||
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
|
||||
SRC += $(DRIVER_PATH)/bluetooth/rn42.c
|
||||
QUANTUM_LIB_SRC += uart.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ENCODER_ENABLE ?= no
|
||||
ENCODER_DRIVER ?= quadrature
|
||||
VALID_ENCODER_DRIVER_TYPES := quadrature custom
|
||||
ifeq ($(strip $(ENCODER_ENABLE)), yes)
|
||||
ifeq ($(filter $(ENCODER_DRIVER),$(VALID_ENCODER_DRIVER_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid ENCODER_DRIVER,ENCODER_DRIVER="$(ENCODER_DRIVER)" is not a valid encoder driver)
|
||||
endif
|
||||
SRC += $(QUANTUM_DIR)/encoder.c
|
||||
OPT_DEFS += -DENCODER_ENABLE
|
||||
OPT_DEFS += -DENCODER_DRIVER_$(strip $(shell echo $(ENCODER_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/encoder
|
||||
COMMON_VPATH += $(DRIVER_PATH)/encoder
|
||||
|
||||
ifneq ($(strip $(ENCODER_DRIVER)), custom)
|
||||
SRC += encoder_$(strip $(ENCODER_DRIVER)).c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(ENCODER_MAP_ENABLE)), yes)
|
||||
OPT_DEFS += -DENCODER_MAP_ENABLE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(OS_DETECTION_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/os_detection.c
|
||||
OPT_DEFS += -DOS_DETECTION_ENABLE
|
||||
ifeq ($(strip $(OS_DETECTION_DEBUG_ENABLE)), yes)
|
||||
OPT_DEFS += -DOS_DETECTION_DEBUG_ENABLE
|
||||
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
|
||||
ifeq ($(strip $(DIP_SWITCH_MAP_ENABLE)), yes)
|
||||
OPT_DEFS += -DDIP_SWITCH_MAP_ENABLE
|
||||
endif
|
||||
endif
|
||||
|
||||
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi 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_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
||||
|
||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||
OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
|
||||
endif
|
||||
endif
|
||||
|
||||
# add extra deps
|
||||
ifeq ($(strip $(WS2812_DRIVER)), i2c)
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes)
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
SRC += apa102.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(ANALOG_DRIVER_REQUIRED)), yes)
|
||||
OPT_DEFS += -DHAL_USE_ADC=TRUE
|
||||
QUANTUM_LIB_SRC += analog.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(I2C_DRIVER_REQUIRED)), yes)
|
||||
OPT_DEFS += -DHAL_USE_I2C=TRUE
|
||||
QUANTUM_LIB_SRC += i2c_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(SPI_DRIVER_REQUIRED)), yes)
|
||||
OPT_DEFS += -DHAL_USE_SPI=TRUE
|
||||
QUANTUM_LIB_SRC += spi_master.c
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(UART_DRIVER_REQUIRED)), yes)
|
||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||
ifneq ($(filter $(MCU_SERIES),RP2040),)
|
||||
OPT_DEFS += -DHAL_USE_SIO=TRUE
|
||||
QUANTUM_LIB_SRC += uart_sio.c
|
||||
else
|
||||
OPT_DEFS += -DHAL_USE_SERIAL=TRUE
|
||||
QUANTUM_LIB_SRC += uart_serial.c
|
||||
endif
|
||||
else
|
||||
QUANTUM_LIB_SRC += uart.c
|
||||
endif
|
||||
endif
|
||||
|
@@ -12,6 +12,9 @@ vpath %.hpp $(VPATH_SRC)
|
||||
vpath %.S $(VPATH_SRC)
|
||||
VPATH :=
|
||||
|
||||
# Helper to return the distinct elements of a list
|
||||
uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
|
||||
|
||||
# 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))))))
|
||||
@@ -188,7 +191,7 @@ DFU_SUFFIX_ARGS ?=
|
||||
elf: $(BUILD_DIR)/$(TARGET).elf
|
||||
hex: $(BUILD_DIR)/$(TARGET).hex
|
||||
uf2: $(BUILD_DIR)/$(TARGET).uf2
|
||||
cpfirmware: $(FIRMWARE_FORMAT)
|
||||
cpfirmware_qmk: $(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
|
||||
@@ -197,6 +200,15 @@ sym: $(BUILD_DIR)/$(TARGET).sym
|
||||
LIBNAME=lib$(TARGET).a
|
||||
lib: $(LIBNAME)
|
||||
|
||||
cpfirmware: cpfirmware_qmk
|
||||
|
||||
ifneq ($(QMK_USERSPACE),)
|
||||
cpfirmware: cpfirmware_userspace
|
||||
cpfirmware_userspace: cpfirmware_qmk
|
||||
$(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to userspace folder" | $(AWK_CMD)
|
||||
$(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(QMK_USERSPACE)/$(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
|
||||
endif
|
||||
|
||||
# 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'
|
||||
|
||||
@@ -264,7 +276,7 @@ BEGIN = gccversion sizebefore
|
||||
# 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))
|
||||
$(eval CMD=MAKE=$(MAKE) $(CC) $(ALL_CFLAGS) $(call uniq,$(OBJ)) --output $@ $(LDFLAGS))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
|
||||
@@ -380,31 +392,9 @@ dump_vars:
|
||||
objs-size:
|
||||
for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE)
|
||||
|
||||
ifeq ($(findstring avr-gcc,$(CC)),avr-gcc)
|
||||
SIZE_MARGIN = 1024
|
||||
|
||||
# size check optionally implemented in its platform.mk
|
||||
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)
|
||||
|
@@ -25,7 +25,9 @@ ifneq ($(CONVERT_TO),)
|
||||
-include $(CONVERTER)/pre_converter.mk
|
||||
|
||||
PLATFORM_KEY = $(shell echo $(CONVERTER) | cut -d "/" -f2)
|
||||
TARGET := $(TARGET)_$(CONVERT_TO)
|
||||
|
||||
# force setting as value can be from environment
|
||||
override TARGET := $(TARGET)_$(CONVERT_TO)
|
||||
|
||||
# Configure any defaults
|
||||
OPT_DEFS += -DCONVERT_TO_$(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]')
|
||||
|
@@ -13,39 +13,53 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
SPACE_CADET_ENABLE ?= yes
|
||||
GRAVE_ESC_ENABLE ?= yes
|
||||
MAGIC_ENABLE ?= yes
|
||||
SEND_STRING_ENABLE ?= yes
|
||||
SPACE_CADET_ENABLE ?= yes
|
||||
|
||||
GENERIC_FEATURES = \
|
||||
AUTO_SHIFT \
|
||||
AUTOCORRECT \
|
||||
BOOTMAGIC \
|
||||
CAPS_WORD \
|
||||
COMBO \
|
||||
COMMAND \
|
||||
CRC \
|
||||
DEFERRED_EXEC \
|
||||
DIGITIZER \
|
||||
DIP_SWITCH \
|
||||
DYNAMIC_KEYMAP \
|
||||
DYNAMIC_MACRO \
|
||||
DYNAMIC_TAPPING_TERM \
|
||||
GRAVE_ESC \
|
||||
HAPTIC \
|
||||
KEY_LOCK \
|
||||
KEY_OVERRIDE \
|
||||
LEADER \
|
||||
MAGIC \
|
||||
MOUSEKEY \
|
||||
MUSIC \
|
||||
OS_DETECTION \
|
||||
PROGRAMMABLE_BUTTON \
|
||||
REPEAT_KEY \
|
||||
SECURE \
|
||||
SEND_STRING \
|
||||
SEQUENCER \
|
||||
SPACE_CADET \
|
||||
SWAP_HANDS \
|
||||
TAP_DANCE \
|
||||
VELOCIKEY \
|
||||
TRI_LAYER \
|
||||
VIA \
|
||||
VIRTSER \
|
||||
WPM \
|
||||
DYNAMIC_TAPPING_TERM \
|
||||
TRI_LAYER
|
||||
|
||||
define HANDLE_GENERIC_FEATURE
|
||||
# $$(info "Processing: $1_ENABLE $2.c")
|
||||
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
|
||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
|
||||
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
|
||||
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
|
||||
OPT_DEFS += -D$1_ENABLE
|
||||
endef
|
||||
|
||||
|
@@ -91,7 +91,6 @@ MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAI
|
||||
|
||||
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_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_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n
|
||||
MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
|
||||
@@ -104,6 +103,10 @@ MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_
|
||||
BOOTLOADER_RETRY_TIME ?= 0.5
|
||||
MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
|
||||
|
||||
define WARNING_MESSAGE
|
||||
$(shell printf "\n %-99s $(WARN_STRING)\n" "$1" >&2)
|
||||
endef
|
||||
|
||||
define CATASTROPHIC_ERROR
|
||||
$(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2)
|
||||
$(error $1)
|
||||
|
@@ -37,7 +37,6 @@ OTHER_OPTION_NAMES = \
|
||||
UNICODEMAP_ENABLE \
|
||||
UNICODE_COMMON \
|
||||
AUTO_SHIFT_ENABLE \
|
||||
AUTO_SHIFT_MODIFIERS \
|
||||
DYNAMIC_TAPPING_TERM_ENABLE \
|
||||
COMBO_ENABLE \
|
||||
KEY_LOCK_ENABLE \
|
||||
@@ -60,7 +59,6 @@ OTHER_OPTION_NAMES = \
|
||||
ENCODER_ENABLE_CUSTOM \
|
||||
GERMAN_ENABLE \
|
||||
HAPTIC_ENABLE \
|
||||
ISSI_ENABLE \
|
||||
KEYLOGGER_ENABLE \
|
||||
LCD_BACKLIGHT_ENABLE \
|
||||
MACROS_ENABLED \
|
||||
|
@@ -0,0 +1,407 @@
|
||||
{
|
||||
"aliases": {
|
||||
/*
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ ¸ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ` │ < │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ « │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ É │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"KC_GRV": {
|
||||
"key": "FR_HASH",
|
||||
"label": "#",
|
||||
}
|
||||
"KC_1": {
|
||||
"key": "FR_1",
|
||||
"label": "1",
|
||||
}
|
||||
"KC_2": {
|
||||
"key": "FR_2",
|
||||
"label": "2",
|
||||
}
|
||||
"KC_3": {
|
||||
"key": "FR_3",
|
||||
"label": "3",
|
||||
}
|
||||
"KC_4": {
|
||||
"key": "FR_4",
|
||||
"label": "4",
|
||||
}
|
||||
"KC_5": {
|
||||
"key": "FR_5",
|
||||
"label": "5",
|
||||
}
|
||||
"KC_6": {
|
||||
"key": "FR_6",
|
||||
"label": "6",
|
||||
}
|
||||
"KC_7": {
|
||||
"key": "FR_7",
|
||||
"label": "7",
|
||||
}
|
||||
"KC_8": {
|
||||
"key": "FR_8",
|
||||
"label": "8",
|
||||
}
|
||||
"KC_9": {
|
||||
"key": "FR_9",
|
||||
"label": "9",
|
||||
}
|
||||
"KC_0": {
|
||||
"key": "FR_0",
|
||||
"label": "0",
|
||||
}
|
||||
"KC_MINS": {
|
||||
"key": "FR_MINS",
|
||||
"label": "-",
|
||||
}
|
||||
"KC_EQL": {
|
||||
"key": "FR_EQL",
|
||||
"label": "=",
|
||||
}
|
||||
"KC_Q": {
|
||||
"key": "FR_Q",
|
||||
"label": "Q",
|
||||
}
|
||||
"KC_W": {
|
||||
"key": "FR_W",
|
||||
"label": "W",
|
||||
}
|
||||
"KC_E": {
|
||||
"key": "FR_E",
|
||||
"label": "E",
|
||||
}
|
||||
"KC_R": {
|
||||
"key": "FR_R",
|
||||
"label": "R",
|
||||
}
|
||||
"KC_T": {
|
||||
"key": "FR_T",
|
||||
"label": "T",
|
||||
}
|
||||
"KC_Y": {
|
||||
"key": "FR_Y",
|
||||
"label": "Y",
|
||||
}
|
||||
"KC_U": {
|
||||
"key": "FR_U",
|
||||
"label": "U",
|
||||
}
|
||||
"KC_I": {
|
||||
"key": "FR_I",
|
||||
"label": "I",
|
||||
}
|
||||
"KC_O": {
|
||||
"key": "FR_O",
|
||||
"label": "O",
|
||||
}
|
||||
"KC_P": {
|
||||
"key": "FR_P",
|
||||
"label": "P",
|
||||
}
|
||||
"KC_LBRC": {
|
||||
"key": "FR_DCIR",
|
||||
"label": "^ (dead)",
|
||||
}
|
||||
"KC_RBRC": {
|
||||
"key": "FR_CEDL",
|
||||
"label": "¸ (dead)",
|
||||
}
|
||||
"KC_A": {
|
||||
"key": "FR_A",
|
||||
"label": "A",
|
||||
}
|
||||
"KC_S": {
|
||||
"key": "FR_S",
|
||||
"label": "S",
|
||||
}
|
||||
"KC_D": {
|
||||
"key": "FR_D",
|
||||
"label": "D",
|
||||
}
|
||||
"KC_F": {
|
||||
"key": "FR_F",
|
||||
"label": "F",
|
||||
}
|
||||
"KC_G": {
|
||||
"key": "FR_G",
|
||||
"label": "G",
|
||||
}
|
||||
"KC_H": {
|
||||
"key": "FR_H",
|
||||
"label": "H",
|
||||
}
|
||||
"KC_J": {
|
||||
"key": "FR_J",
|
||||
"label": "J",
|
||||
}
|
||||
"KC_K": {
|
||||
"key": "FR_K",
|
||||
"label": "K",
|
||||
}
|
||||
"KC_L": {
|
||||
"key": "FR_L",
|
||||
"label": "L",
|
||||
}
|
||||
"KC_SCLN": {
|
||||
"key": "FR_SCLN",
|
||||
"label": ";",
|
||||
}
|
||||
"KC_QUOT": {
|
||||
"key": "FR_DGRV",
|
||||
"label": "` (dead)",
|
||||
}
|
||||
"KC_NUHS": {
|
||||
"key": "FR_LABK",
|
||||
"label": "<",
|
||||
}
|
||||
"KC_NUBS": {
|
||||
"key": "FR_LDAQ",
|
||||
"label": "«",
|
||||
}
|
||||
"KC_Z": {
|
||||
"key": "FR_Z",
|
||||
"label": "Z",
|
||||
}
|
||||
"KC_X": {
|
||||
"key": "FR_X",
|
||||
"label": "X",
|
||||
}
|
||||
"KC_C": {
|
||||
"key": "FR_C",
|
||||
"label": "C",
|
||||
}
|
||||
"KC_V": {
|
||||
"key": "FR_V",
|
||||
"label": "V",
|
||||
}
|
||||
"KC_B": {
|
||||
"key": "FR_B",
|
||||
"label": "B",
|
||||
}
|
||||
"KC_N": {
|
||||
"key": "FR_N",
|
||||
"label": "N",
|
||||
}
|
||||
"KC_M": {
|
||||
"key": "FR_M",
|
||||
"label": "M",
|
||||
}
|
||||
"KC_COMM": {
|
||||
"key": "FR_COMM",
|
||||
"label": ",",
|
||||
}
|
||||
"KC_DOT": {
|
||||
"key": "FR_DOT",
|
||||
"label": ".",
|
||||
}
|
||||
"KC_SLSH": {
|
||||
"key": "FR_EACU",
|
||||
"label": "É",
|
||||
}
|
||||
/* Shifted symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ | │ ! │ " │ / │ $ │ % │ ? │ & │ * │ ( │ ) │ _ │ + │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ │ │ │ │ │ │ │ : │ │ > │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ » │ │ │ │ │ │ │ │ ' │ │ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(FR_HASH)": {
|
||||
"key": "FR_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"S(FR_1)": {
|
||||
"key": "FR_EXLM",
|
||||
"label": "!",
|
||||
}
|
||||
"S(FR_2)": {
|
||||
"key": "FR_DQUO",
|
||||
"label": "\"",
|
||||
}
|
||||
"S(FR_3)": {
|
||||
"key": "FR_SLSH",
|
||||
"label": "/",
|
||||
}
|
||||
"S(FR_4)": {
|
||||
"key": "FR_DLR",
|
||||
"label": "$",
|
||||
}
|
||||
"S(FR_5)": {
|
||||
"key": "FR_PERC",
|
||||
"label": "%",
|
||||
}
|
||||
"S(FR_6)": {
|
||||
"key": "FR_QUES",
|
||||
"label": "?",
|
||||
}
|
||||
"S(FR_7)": {
|
||||
"key": "FR_AMPR",
|
||||
"label": "&",
|
||||
}
|
||||
"S(FR_8)": {
|
||||
"key": "FR_ASTR",
|
||||
"label": "*",
|
||||
}
|
||||
"S(FR_9)": {
|
||||
"key": "FR_LPRN",
|
||||
"label": "(",
|
||||
}
|
||||
"S(FR_0)": {
|
||||
"key": "FR_RPRN",
|
||||
"label": ")",
|
||||
}
|
||||
"S(FR_MINS)": {
|
||||
"key": "FR_UNDS",
|
||||
"label": "_",
|
||||
}
|
||||
"S(FR_EQL)": {
|
||||
"key": "FR_PLUS",
|
||||
"label": "+",
|
||||
}
|
||||
"S(FR_CEDL)": {
|
||||
"key": "FR_DIAE",
|
||||
"label": "¨ (dead)",
|
||||
}
|
||||
"S(FR_SCLN)": {
|
||||
"key": "FR_COLN",
|
||||
"label": ":",
|
||||
}
|
||||
"S(FR_LABK)": {
|
||||
"key": "FR_RABK",
|
||||
"label": ">",
|
||||
}
|
||||
"S(FR_LDAQ)": {
|
||||
"key": "FR_RDAQ",
|
||||
"label": "»",
|
||||
}
|
||||
"S(FR_COMM)": {
|
||||
"key": "FR_QUOT",
|
||||
"label": "'",
|
||||
}
|
||||
/* AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ \ │ ± │ @ │ £ │ ¢ │ ¤ │ ¬ │ ¦ │ ² │ ³ │ ¼ │ ½ │ ¾ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ § │ ¶ │ [ │ ] │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ │ │ │ │ │ │ │ ~ │ { │ } │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ ° │ │ │ │ │ │ │ µ │ ¯ │ - │ ´ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(FR_HASH)": {
|
||||
"key": "FR_BSLS",
|
||||
"label": "\\",
|
||||
}
|
||||
"ALGR(FR_1)": {
|
||||
"key": "FR_PLMN",
|
||||
"label": "±",
|
||||
}
|
||||
"ALGR(FR_2)": {
|
||||
"key": "FR_AT",
|
||||
"label": "@",
|
||||
}
|
||||
"ALGR(FR_3)": {
|
||||
"key": "FR_PND",
|
||||
"label": "£",
|
||||
}
|
||||
"ALGR(FR_4)": {
|
||||
"key": "FR_CENT",
|
||||
"label": "¢",
|
||||
}
|
||||
"ALGR(FR_5)": {
|
||||
"key": "FR_CURR",
|
||||
"label": "¤",
|
||||
}
|
||||
"ALGR(FR_6)": {
|
||||
"key": "FR_NOT",
|
||||
"label": "¬",
|
||||
}
|
||||
"ALGR(FR_7)": {
|
||||
"key": "FR_BRKP",
|
||||
"label": "¦",
|
||||
}
|
||||
"ALGR(FR_8)": {
|
||||
"key": "FR_SUP2",
|
||||
"label": "²",
|
||||
}
|
||||
"ALGR(FR_9)": {
|
||||
"key": "FR_SUP3",
|
||||
"label": "³",
|
||||
}
|
||||
"ALGR(FR_0)": {
|
||||
"key": "FR_QRTR",
|
||||
"label": "¼",
|
||||
}
|
||||
"ALGR(FR_MINS)": {
|
||||
"key": "FR_HALF",
|
||||
"label": "½",
|
||||
}
|
||||
"ALGR(FR_EQL)": {
|
||||
"key": "FR_TQTR",
|
||||
"label": "¾",
|
||||
}
|
||||
"ALGR(FR_O)": {
|
||||
"key": "FR_SECT",
|
||||
"label": "§",
|
||||
}
|
||||
"ALGR(FR_P)": {
|
||||
"key": "FR_PARA",
|
||||
"label": "¶",
|
||||
}
|
||||
"ALGR(FR_DCIR)": {
|
||||
"key": "FR_LBRC",
|
||||
"label": "[",
|
||||
}
|
||||
"ALGR(FR_CEDL)": {
|
||||
"key": "FR_RBRC",
|
||||
"label": "]",
|
||||
}
|
||||
"ALGR(FR_SCLN)": {
|
||||
"key": "FR_TILD",
|
||||
"label": "~",
|
||||
}
|
||||
"ALGR(FR_DGRV)": {
|
||||
"key": "FR_LCBR",
|
||||
"label": "{",
|
||||
}
|
||||
"ALGR(FR_LABK)": {
|
||||
"key": "FR_RCBR",
|
||||
"label": "}",
|
||||
}
|
||||
"ALGR(FR_LDAQ)": {
|
||||
"key": "FR_DEG",
|
||||
"label": "°",
|
||||
}
|
||||
"ALGR(FR_M)": {
|
||||
"key": "FR_MICR",
|
||||
"label": "µ",
|
||||
}
|
||||
"ALGR(FR_COMM)": {
|
||||
"key": "FR_MACR",
|
||||
"label": "¯",
|
||||
}
|
||||
"ALGR(FR_DOT)": {
|
||||
"key": "FR_SHYP",
|
||||
"label": " (soft hyphen)",
|
||||
}
|
||||
"ALGR(FR_EACU)": {
|
||||
"key": "FR_ACUT",
|
||||
"label": "´ (dead)",
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,291 @@
|
||||
{
|
||||
"aliases": {
|
||||
/*
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ | │ № │ - │ / │ " │ : │ , │ . │ _ │ ? │ % │ ! │ ; │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ Й │ Ц │ У │ К │ Е │ Н │ Г │ Ш │ Щ │ З │ Х │ Ъ │ ) │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ Ф │ Ы │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б │ Ю │ Ё │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"KC_GRV": {
|
||||
"key": "RU_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"KC_1": {
|
||||
"key": "RU_NUM",
|
||||
"label": "№",
|
||||
}
|
||||
"KC_2": {
|
||||
"key": "RU_MINS",
|
||||
"label": "-",
|
||||
}
|
||||
"KC_3": {
|
||||
"key": "RU_SLSH",
|
||||
"label": "/",
|
||||
}
|
||||
"KC_4": {
|
||||
"key": "RU_DQUO",
|
||||
"label": "\"",
|
||||
}
|
||||
"KC_5": {
|
||||
"key": "RU_COLN",
|
||||
"label": ":",
|
||||
}
|
||||
"KC_6": {
|
||||
"key": "RU_COMM",
|
||||
"label": ",",
|
||||
}
|
||||
"KC_7": {
|
||||
"key": "RU_DOT",
|
||||
"label": ".",
|
||||
}
|
||||
"KC_8": {
|
||||
"key": "RU_UNDS",
|
||||
"label": "_",
|
||||
}
|
||||
"KC_9": {
|
||||
"key": "RU_QUES",
|
||||
"label": "?",
|
||||
}
|
||||
"KC_0": {
|
||||
"key": "RU_PERC",
|
||||
"label": "%",
|
||||
}
|
||||
"KC_MINS": {
|
||||
"key": "RU_EXLM",
|
||||
"label": "!",
|
||||
}
|
||||
"KC_EQL": {
|
||||
"key": "RU_SCLN",
|
||||
"label": ";",
|
||||
}
|
||||
"KC_Q": {
|
||||
"key": "RU_SHTI",
|
||||
"label": "Й",
|
||||
}
|
||||
"KC_W": {
|
||||
"key": "RU_TSE",
|
||||
"label": "Ц",
|
||||
}
|
||||
"KC_E": {
|
||||
"key": "RU_U",
|
||||
"label": "У",
|
||||
}
|
||||
"KC_R": {
|
||||
"key": "RU_KA",
|
||||
"label": "К",
|
||||
}
|
||||
"KC_T": {
|
||||
"key": "RU_IE",
|
||||
"label": "Е",
|
||||
}
|
||||
"KC_Y": {
|
||||
"key": "RU_EN",
|
||||
"label": "Н",
|
||||
}
|
||||
"KC_U": {
|
||||
"key": "RU_GHE",
|
||||
"label": "Г",
|
||||
}
|
||||
"KC_I": {
|
||||
"key": "RU_SHA",
|
||||
"label": "Ш",
|
||||
}
|
||||
"KC_O": {
|
||||
"key": "RU_SHCH",
|
||||
"label": "Щ",
|
||||
}
|
||||
"KC_P": {
|
||||
"key": "RU_ZE",
|
||||
"label": "З",
|
||||
}
|
||||
"KC_LBRC": {
|
||||
"key": "RU_HA",
|
||||
"label": "Х",
|
||||
}
|
||||
"KC_RBRC": {
|
||||
"key": "RU_HARD",
|
||||
"label": "Ъ",
|
||||
}
|
||||
"KC_BSLS": {
|
||||
"key": "RU_RPRN",
|
||||
"label": ")",
|
||||
}
|
||||
"KC_A": {
|
||||
"key": "RU_EF",
|
||||
"label": "Ф",
|
||||
}
|
||||
"KC_S": {
|
||||
"key": "RU_YERU",
|
||||
"label": "Ы",
|
||||
}
|
||||
"KC_D": {
|
||||
"key": "RU_VE",
|
||||
"label": "В",
|
||||
}
|
||||
"KC_F": {
|
||||
"key": "RU_A",
|
||||
"label": "А",
|
||||
}
|
||||
"KC_G": {
|
||||
"key": "RU_PE",
|
||||
"label": "П",
|
||||
}
|
||||
"KC_H": {
|
||||
"key": "RU_ER",
|
||||
"label": "Р",
|
||||
}
|
||||
"KC_J": {
|
||||
"key": "RU_O",
|
||||
"label": "О",
|
||||
}
|
||||
"KC_K": {
|
||||
"key": "RU_EL",
|
||||
"label": "Л",
|
||||
}
|
||||
"KC_L": {
|
||||
"key": "RU_DE",
|
||||
"label": "Д",
|
||||
}
|
||||
"KC_SCLN": {
|
||||
"key": "RU_ZHE",
|
||||
"label": "Ж",
|
||||
}
|
||||
"KC_QUOT": {
|
||||
"key": "RU_E",
|
||||
"label": "Э",
|
||||
}
|
||||
"KC_Z": {
|
||||
"key": "RU_YA",
|
||||
"label": "Я",
|
||||
}
|
||||
"KC_X": {
|
||||
"key": "RU_CHE",
|
||||
"label": "Ч",
|
||||
}
|
||||
"KC_C": {
|
||||
"key": "RU_ES",
|
||||
"label": "С",
|
||||
}
|
||||
"KC_V": {
|
||||
"key": "RU_EM",
|
||||
"label": "М",
|
||||
}
|
||||
"KC_B": {
|
||||
"key": "RU_I",
|
||||
"label": "И",
|
||||
}
|
||||
"KC_N": {
|
||||
"key": "RU_TE",
|
||||
"label": "Т",
|
||||
}
|
||||
"KC_M": {
|
||||
"key": "RU_SOFT",
|
||||
"label": "Ь",
|
||||
}
|
||||
"KC_COMM": {
|
||||
"key": "RU_BE",
|
||||
"label": "Б",
|
||||
}
|
||||
"KC_DOT": {
|
||||
"key": "RU_YU",
|
||||
"label": "Ю",
|
||||
}
|
||||
"KC_SLSH": {
|
||||
"key": "RU_YO",
|
||||
"label": "Ё",
|
||||
}
|
||||
/* Shifted symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ + │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ = │ \ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ ( │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(RU_PIPE)": {
|
||||
"key": "RU_PLUS",
|
||||
"label": "+",
|
||||
}
|
||||
"S(RU_NUM)": {
|
||||
"key": "RU_1",
|
||||
"label": "1",
|
||||
}
|
||||
"S(RU_MINS)": {
|
||||
"key": "RU_2",
|
||||
"label": "2",
|
||||
}
|
||||
"S(RU_SLSH)": {
|
||||
"key": "RU_3",
|
||||
"label": "3",
|
||||
}
|
||||
"S(RU_DQUO)": {
|
||||
"key": "RU_4",
|
||||
"label": "4",
|
||||
}
|
||||
"S(RU_COLN)": {
|
||||
"key": "RU_5",
|
||||
"label": "5",
|
||||
}
|
||||
"S(RU_COMM)": {
|
||||
"key": "RU_6",
|
||||
"label": "6",
|
||||
}
|
||||
"S(RU_DOT)": {
|
||||
"key": "RU_7",
|
||||
"label": "7",
|
||||
}
|
||||
"S(RU_UNDS)": {
|
||||
"key": "RU_8",
|
||||
"label": "8",
|
||||
}
|
||||
"S(RU_QUES)": {
|
||||
"key": "RU_9",
|
||||
"label": "9",
|
||||
}
|
||||
"S(RU_PERC)": {
|
||||
"key": "RU_0",
|
||||
"label": "0",
|
||||
}
|
||||
"S(RU_EXLM)": {
|
||||
"key": "RU_EQL",
|
||||
"label": "=",
|
||||
}
|
||||
"S(RU_SCLN)": {
|
||||
"key": "RU_BSLS",
|
||||
"label": "\\",
|
||||
}
|
||||
"S(RU_RPRN)": {
|
||||
"key": "RU_LPRN",
|
||||
"label": "(",
|
||||
}
|
||||
/* AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ │ │ │ │ │ │ │ │ ₽ │ │ │ │ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(RU_UNDS)": {
|
||||
"key": "RU_RUBL",
|
||||
"label": "₽",
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,339 @@
|
||||
{
|
||||
"aliases": {
|
||||
/*
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ¿ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ´ │ + │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ñ │ { │ } │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"KC_GRV": {
|
||||
"key": "ES_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"KC_1": {
|
||||
"key": "ES_1",
|
||||
"label": "1",
|
||||
}
|
||||
"KC_2": {
|
||||
"key": "ES_2",
|
||||
"label": "2",
|
||||
}
|
||||
"KC_3": {
|
||||
"key": "ES_3",
|
||||
"label": "3",
|
||||
}
|
||||
"KC_4": {
|
||||
"key": "ES_4",
|
||||
"label": "4",
|
||||
}
|
||||
"KC_5": {
|
||||
"key": "ES_5",
|
||||
"label": "5",
|
||||
}
|
||||
"KC_6": {
|
||||
"key": "ES_6",
|
||||
"label": "6",
|
||||
}
|
||||
"KC_7": {
|
||||
"key": "ES_7",
|
||||
"label": "7",
|
||||
}
|
||||
"KC_8": {
|
||||
"key": "ES_8",
|
||||
"label": "8",
|
||||
}
|
||||
"KC_9": {
|
||||
"key": "ES_9",
|
||||
"label": "9",
|
||||
}
|
||||
"KC_0": {
|
||||
"key": "ES_0",
|
||||
"label": "0",
|
||||
}
|
||||
"KC_MINS": {
|
||||
"key": "ES_QUOT",
|
||||
"label": "'",
|
||||
}
|
||||
"KC_EQL": {
|
||||
"key": "ES_IQUE",
|
||||
"label": "¿",
|
||||
}
|
||||
"KC_Q": {
|
||||
"key": "ES_Q",
|
||||
"label": "Q",
|
||||
}
|
||||
"KC_W": {
|
||||
"key": "ES_W",
|
||||
"label": "W",
|
||||
}
|
||||
"KC_E": {
|
||||
"key": "ES_E",
|
||||
"label": "E",
|
||||
}
|
||||
"KC_R": {
|
||||
"key": "ES_R",
|
||||
"label": "R",
|
||||
}
|
||||
"KC_T": {
|
||||
"key": "ES_T",
|
||||
"label": "T",
|
||||
}
|
||||
"KC_Y": {
|
||||
"key": "ES_Y",
|
||||
"label": "Y",
|
||||
}
|
||||
"KC_U": {
|
||||
"key": "ES_U",
|
||||
"label": "U",
|
||||
}
|
||||
"KC_I": {
|
||||
"key": "ES_I",
|
||||
"label": "I",
|
||||
}
|
||||
"KC_O": {
|
||||
"key": "ES_O",
|
||||
"label": "O",
|
||||
}
|
||||
"KC_P": {
|
||||
"key": "ES_P",
|
||||
"label": "P",
|
||||
}
|
||||
"KC_LBRC": {
|
||||
"key": "ES_ACUT",
|
||||
"label": "´ (dead)",
|
||||
}
|
||||
"KC_RBRC": {
|
||||
"key": "ES_PLUS",
|
||||
"label": "+",
|
||||
}
|
||||
"KC_A": {
|
||||
"key": "ES_A",
|
||||
"label": "A",
|
||||
}
|
||||
"KC_S": {
|
||||
"key": "ES_S",
|
||||
"label": "S",
|
||||
}
|
||||
"KC_D": {
|
||||
"key": "ES_D",
|
||||
"label": "D",
|
||||
}
|
||||
"KC_F": {
|
||||
"key": "ES_F",
|
||||
"label": "F",
|
||||
}
|
||||
"KC_G": {
|
||||
"key": "ES_G",
|
||||
"label": "G",
|
||||
}
|
||||
"KC_H": {
|
||||
"key": "ES_H",
|
||||
"label": "H",
|
||||
}
|
||||
"KC_J": {
|
||||
"key": "ES_J",
|
||||
"label": "J",
|
||||
}
|
||||
"KC_K": {
|
||||
"key": "ES_K",
|
||||
"label": "K",
|
||||
}
|
||||
"KC_L": {
|
||||
"key": "ES_L",
|
||||
"label": "L",
|
||||
}
|
||||
"KC_SCLN": {
|
||||
"key": "ES_NTIL",
|
||||
"label": "Ñ",
|
||||
}
|
||||
"KC_QUOT": {
|
||||
"key": "ES_LCBR",
|
||||
"label": "{",
|
||||
}
|
||||
"KC_NUHS": {
|
||||
"key": "ES_RCBR",
|
||||
"label": "}",
|
||||
}
|
||||
"KC_NUBS": {
|
||||
"key": "ES_LABK",
|
||||
"label": "<",
|
||||
}
|
||||
"KC_Z": {
|
||||
"key": "ES_Z",
|
||||
"label": "Z",
|
||||
}
|
||||
"KC_X": {
|
||||
"key": "ES_X",
|
||||
"label": "X",
|
||||
}
|
||||
"KC_C": {
|
||||
"key": "ES_C",
|
||||
"label": "C",
|
||||
}
|
||||
"KC_V": {
|
||||
"key": "ES_V",
|
||||
"label": "V",
|
||||
}
|
||||
"KC_B": {
|
||||
"key": "ES_B",
|
||||
"label": "B",
|
||||
}
|
||||
"KC_N": {
|
||||
"key": "ES_N",
|
||||
"label": "N",
|
||||
}
|
||||
"KC_M": {
|
||||
"key": "ES_M",
|
||||
"label": "M",
|
||||
}
|
||||
"KC_COMM": {
|
||||
"key": "ES_COMM",
|
||||
"label": ",",
|
||||
}
|
||||
"KC_DOT": {
|
||||
"key": "ES_DOT",
|
||||
"label": ".",
|
||||
}
|
||||
"KC_SLSH": {
|
||||
"key": "ES_MINS",
|
||||
"label": "-",
|
||||
}
|
||||
/* Shifted symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ° │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ¡ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ * │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ [ │ ] │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(ES_PIPE)": {
|
||||
"key": "ES_MORD",
|
||||
"label": "°",
|
||||
}
|
||||
"S(ES_1)": {
|
||||
"key": "ES_EXLM",
|
||||
"label": "!",
|
||||
}
|
||||
"S(ES_2)": {
|
||||
"key": "ES_DQUO",
|
||||
"label": "\"",
|
||||
}
|
||||
"S(ES_3)": {
|
||||
"key": "ES_NUMB",
|
||||
"label": "#",
|
||||
}
|
||||
"S(ES_4)": {
|
||||
"key": "ES_DLR",
|
||||
"label": "$",
|
||||
}
|
||||
"S(ES_5)": {
|
||||
"key": "ES_PERC",
|
||||
"label": "%",
|
||||
}
|
||||
"S(ES_6)": {
|
||||
"key": "ES_AMPR",
|
||||
"label": "&",
|
||||
}
|
||||
"S(ES_7)": {
|
||||
"key": "ES_SLSH",
|
||||
"label": "/",
|
||||
}
|
||||
"S(ES_8)": {
|
||||
"key": "ES_LPRN",
|
||||
"label": "(",
|
||||
}
|
||||
"S(ES_9)": {
|
||||
"key": "ES_RPRN",
|
||||
"label": ")",
|
||||
}
|
||||
"S(ES_0)": {
|
||||
"key": "ES_EQL",
|
||||
"label": "=",
|
||||
}
|
||||
"S(ES_QUOT)": {
|
||||
"key": "ES_QUES",
|
||||
"label": "?",
|
||||
}
|
||||
"S(ES_IQUE)": {
|
||||
"key": "ES_IEXL",
|
||||
"label": "¡",
|
||||
}
|
||||
"S(ES_ACUT)": {
|
||||
"key": "ES_DIAE",
|
||||
"label": "¨ (dead)",
|
||||
}
|
||||
"S(ES_PLUS)": {
|
||||
"key": "ES_ASTR",
|
||||
"label": "*",
|
||||
}
|
||||
"S(ES_LCBR)": {
|
||||
"key": "ES_LBRC",
|
||||
"label": "[",
|
||||
}
|
||||
"S(ES_RCBR)": {
|
||||
"key": "ES_RBRC",
|
||||
"label": "]",
|
||||
}
|
||||
"S(ES_LABK)": {
|
||||
"key": "ES_RABK",
|
||||
"label": ">",
|
||||
}
|
||||
"S(ES_COMM)": {
|
||||
"key": "ES_SCLN",
|
||||
"label": ";",
|
||||
}
|
||||
"S(ES_DOT)": {
|
||||
"key": "ES_COLN",
|
||||
"label": ":",
|
||||
}
|
||||
"S(ES_MINS)": {
|
||||
"key": "ES_UNDS",
|
||||
"label": "_",
|
||||
}
|
||||
/* AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ¬ │ │ │ │ │ │ │ │ │ │ │ \ │ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ @ │ │ │ │ │ │ │ │ │ │ │ ~ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ ^ │ ` │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(ES_PIPE)": {
|
||||
"key": "ES_NOT",
|
||||
"label": "¬",
|
||||
}
|
||||
"ALGR(ES_QUOT)": {
|
||||
"key": "ES_BSLS",
|
||||
"label": "\\",
|
||||
}
|
||||
"ALGR(ES_Q)": {
|
||||
"key": "ES_AT",
|
||||
"label": "@",
|
||||
}
|
||||
"ALGR(ES_PLUS)": {
|
||||
"key": "ES_TILD",
|
||||
"label": "~",
|
||||
}
|
||||
"ALGR(ES_LCBR)": {
|
||||
"key": "ES_CIRC",
|
||||
"label": "^",
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,84 +1,89 @@
|
||||
{
|
||||
"development_board": {
|
||||
"promicro": {
|
||||
"processor": "atmega32u4",
|
||||
"bootloader": "caterina",
|
||||
"pin_compatible": "promicro"
|
||||
},
|
||||
"elite_c": {
|
||||
"processor": "atmega32u4",
|
||||
"bootloader": "atmel-dfu",
|
||||
"pin_compatible": "promicro"
|
||||
},
|
||||
"elite_pi": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"proton_c": {
|
||||
"processor": "STM32F303",
|
||||
"bootloader": "stm32-dfu",
|
||||
"board": "QMK_PROTON_C"
|
||||
},
|
||||
"kb2040": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"promicro_rp2040": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"blok": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_BLOK"
|
||||
},
|
||||
"michi": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"bit_c_pro": {
|
||||
"processor": "RP2040",
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"bluepill": {
|
||||
"processor": "STM32F103",
|
||||
"bootloader": "stm32duino",
|
||||
"board": "STM32_F103_STM32DUINO"
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"blackpill_f401": {
|
||||
"processor": "STM32F401",
|
||||
"board": "BLACKPILL_STM32_F401",
|
||||
"bootloader": "stm32-dfu",
|
||||
"board": "BLACKPILL_STM32_F401"
|
||||
"processor": "STM32F401"
|
||||
},
|
||||
"blackpill_f411": {
|
||||
"processor": "STM32F411",
|
||||
"board": "BLACKPILL_STM32_F411",
|
||||
"bootloader": "stm32-dfu",
|
||||
"board": "BLACKPILL_STM32_F411"
|
||||
"processor": "STM32F411"
|
||||
},
|
||||
"stemcell": {
|
||||
"processor": "STM32F411",
|
||||
"bootloader": "tinyuf2",
|
||||
"board": "STEMCELL"
|
||||
"blok": {
|
||||
"board": "QMK_BLOK",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"bluepill": {
|
||||
"board": "STM32_F103_STM32DUINO",
|
||||
"bootloader": "stm32duino",
|
||||
"processor": "STM32F103"
|
||||
},
|
||||
"bonsai_c4": {
|
||||
"processor": "STM32F411",
|
||||
"board": "BONSAI_C4",
|
||||
"bootloader": "stm32-dfu",
|
||||
"board": "BONSAI_C4"
|
||||
"processor": "STM32F411"
|
||||
},
|
||||
"elite_c": {
|
||||
"bootloader": "atmel-dfu",
|
||||
"pin_compatible": "promicro",
|
||||
"processor": "atmega32u4"
|
||||
},
|
||||
"elite_pi": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"helios": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"imera": {
|
||||
"processor": "RP2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
},
|
||||
"liatris": {
|
||||
"processor": "RP2040",
|
||||
"kb2040": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"board": "QMK_PM2040"
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"liatris": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"michi": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"promicro": {
|
||||
"bootloader": "caterina",
|
||||
"pin_compatible": "promicro",
|
||||
"processor": "atmega32u4"
|
||||
},
|
||||
"promicro_rp2040": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
},
|
||||
"proton_c": {
|
||||
"board": "QMK_PROTON_C",
|
||||
"bootloader": "stm32-dfu",
|
||||
"processor": "STM32F303"
|
||||
},
|
||||
"stemcell": {
|
||||
"board": "STEMCELL",
|
||||
"bootloader": "tinyuf2",
|
||||
"processor": "STM32F411"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
{
|
||||
// Format:
|
||||
// <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", "str", "raw"
|
||||
// value_type: one of "array", "array.int", "bool, "flag", "int", "hex", "list", "mapping", "str", "raw"
|
||||
// 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
|
||||
// warn_duplicate: Default `true`. Set to `false` to turn off warning when a value exists in both places
|
||||
@@ -17,38 +17,51 @@
|
||||
"APA102_DI_PIN": {"info_key": "apa102.data_pin"},
|
||||
|
||||
// Audio
|
||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
|
||||
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "bool"},
|
||||
"AUDIO_DEFAULT_ON": {"info_key": "audio.default.on", "value_type": "bool"},
|
||||
"AUDIO_DEFAULT_CLICKY_ON": {"info_key": "audio.default.clicky", "value_type": "bool"},
|
||||
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "flag"},
|
||||
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "flag"},
|
||||
|
||||
// Backlight
|
||||
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
|
||||
"BACKLIGHT_CAPS_LOCK": {"info_key": "backlight.as_caps_lock", "value_type": "bool"},
|
||||
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "flag"},
|
||||
"BACKLIGHT_CAPS_LOCK": {"info_key": "backlight.as_caps_lock", "value_type": "flag"},
|
||||
"BACKLIGHT_LEVELS": {"info_key": "backlight.levels", "value_type": "int"},
|
||||
"BACKLIGHT_LIMIT_VAL": {"info_key": "backlight.max_brightness", "value_type": "int"},
|
||||
"BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"},
|
||||
"BACKLIGHT_PIN": {"info_key": "backlight.pin"},
|
||||
"BACKLIGHT_PINS": {"info_key": "backlight.pins", "value_type": "array"},
|
||||
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
|
||||
"BACKLIGHT_DEFAULT_ON": {"info_key": "backlight.default.on", "value_type": "bool"},
|
||||
"BACKLIGHT_DEFAULT_BREATHING": {"info_key": "backlight.default.breathing", "value_type": "bool"},
|
||||
"BACKLIGHT_DEFAULT_LEVEL": {"info_key": "backlight.default.brightness", "value_type": "int"},
|
||||
|
||||
// Bootmagic
|
||||
"BOOTMAGIC_LITE_COLUMN": {"info_key": "bootmagic.matrix.1", "value_type": "int"},
|
||||
"BOOTMAGIC_LITE_COLUMN_RIGHT": {"info_key": "split.bootmagic.matrix.1", "value_type": "int"},
|
||||
"BOOTMAGIC_LITE_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"},
|
||||
"BOOTMAGIC_LITE_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"},
|
||||
"BOOTMAGIC_COLUMN": {"info_key": "bootmagic.matrix.1", "value_type": "int"},
|
||||
"BOOTMAGIC_COLUMN_RIGHT": {"info_key": "split.bootmagic.matrix.1", "value_type": "int"},
|
||||
"BOOTMAGIC_ROW": {"info_key": "bootmagic.matrix.0", "value_type": "int"},
|
||||
"BOOTMAGIC_ROW_RIGHT": {"info_key": "split.bootmagic.matrix.0", "value_type": "int"},
|
||||
|
||||
// Caps Word
|
||||
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
|
||||
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "flag"},
|
||||
"CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
|
||||
"CAPS_WORD_INVERT_ON_SHIFT": {"info_key": "caps_word.invert_on_shift", "value_type": "bool"},
|
||||
"DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "bool"},
|
||||
"CAPS_WORD_INVERT_ON_SHIFT": {"info_key": "caps_word.invert_on_shift", "value_type": "flag"},
|
||||
"DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.double_tap_shift_turns_on", "value_type": "flag"},
|
||||
|
||||
// Combos
|
||||
"COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
|
||||
|
||||
"DIP_SWITCH_MATRIX_GRID": {"info_key": "dip_switch.matrix_grid", "value_type": "array.array.int", "to_json": false},
|
||||
"DIP_SWITCH_PINS": {"info_key": "dip_switch.pins", "value_type": "array"},
|
||||
"DIP_SWITCH_PINS_RIGHT": {"info_key": "split.dip_switch.right.pins", "value_type": "array"},
|
||||
|
||||
// Dynamic Keymap
|
||||
"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"},
|
||||
|
||||
// EEPROM
|
||||
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
||||
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
||||
|
||||
// Indicators
|
||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||
@@ -58,18 +71,29 @@
|
||||
"LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"},
|
||||
|
||||
// Leader Key
|
||||
"LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "bool"},
|
||||
"LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "bool"},
|
||||
"LEADER_PER_KEY_TIMING": {"info_key": "leader_key.timing", "value_type": "flag"},
|
||||
"LEADER_KEY_STRICT_KEY_PROCESSING": {"info_key": "leader_key.strict_processing", "value_type": "flag"},
|
||||
"LEADER_TIMEOUT": {"info_key": "leader_key.timeout", "value_type": "int"},
|
||||
|
||||
// LED Matrix
|
||||
"LED_MATRIX_CENTER": {"info_key": "led_matrix.center_point", "value_type": "array.int"},
|
||||
"LED_MATRIX_KEYRELEASES": {"info_key": "led_matrix.react_on_keyup", "value_type": "flag"},
|
||||
"LED_MATRIX_LED_FLUSH_LIMIT": {"info_key": "led_matrix.led_flush_limit", "value_type": "int"},
|
||||
"LED_MATRIX_LED_PROCESS_LIMIT": {"info_key": "led_matrix.led_process_limit", "value_type": "int", "to_json": false},
|
||||
"LED_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "led_matrix.max_brightness", "value_type": "int"},
|
||||
"LED_MATRIX_SLEEP": {"info_key": "led_matrix.sleep", "value_type": "flag"},
|
||||
"LED_MATRIX_SPD_STEP": {"info_key": "led_matrix.speed_steps", "value_type": "int"},
|
||||
"LED_MATRIX_SPLIT": {"info_key": "led_matrix.split_count", "value_type": "array.int"},
|
||||
"LED_MATRIX_TIMEOUT": {"info_key": "led_matrix.timeout", "value_type": "int"},
|
||||
"LED_MATRIX_VAL_STEP": {"info_key": "led_matrix.val_steps", "value_type": "int"},
|
||||
"LED_MATRIX_LED_COUNT": {"info_key": "led_matrix.led_count", "value_type": "int", "to_json": false},
|
||||
"LED_MATRIX_DEFAULT_ON": {"info_key": "led_matrix.default.on", "value_type": "bool"},
|
||||
"LED_MATRIX_DEFAULT_VAL": {"info_key": "led_matrix.default.val", "value_type": "int"},
|
||||
"LED_MATRIX_DEFAULT_SPD": {"info_key": "led_matrix.default.speed", "value_type": "int"},
|
||||
|
||||
// Locking Switch
|
||||
"LOCKING_SUPPORT_ENABLE": {"info_key": "qmk.locking.enabled", "value_type": "flag"},
|
||||
"LOCKING_RESYNC_ENABLE": {"info_key": "qmk.locking.resync", "value_type": "flag"},
|
||||
|
||||
// LUFA Bootloader
|
||||
"QMK_ESC_INPUT": {"info_key": "qmk_lufa_bootloader.esc_input"},
|
||||
@@ -80,7 +104,7 @@
|
||||
// Matrix
|
||||
"DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
|
||||
"DIODE_DIRECTION": {"info_key": "diode_direction"},
|
||||
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
|
||||
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "flag"},
|
||||
"MATRIX_INPUT_PRESSED_STATE": {"info_key": "matrix_pins.input_pressed_state", "value_type": "int"},
|
||||
"MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},
|
||||
|
||||
@@ -102,29 +126,43 @@
|
||||
// RGB Matrix
|
||||
"RGB_MATRIX_CENTER": {"info_key": "rgb_matrix.center_point", "value_type": "array.int"},
|
||||
"RGB_MATRIX_HUE_STEP": {"info_key": "rgb_matrix.hue_steps", "value_type": "int"},
|
||||
"RGB_MATRIX_KEYRELEASES": {"info_key": "rgb_matrix.react_on_keyup", "value_type": "flag"},
|
||||
"RGB_MATRIX_LED_FLUSH_LIMIT": {"info_key": "rgb_matrix.led_flush_limit", "value_type": "int"},
|
||||
"RGB_MATRIX_LED_PROCESS_LIMIT": {"info_key": "rgb_matrix.led_process_limit", "value_type": "int", "to_json": false},
|
||||
"RGB_MATRIX_MAXIMUM_BRIGHTNESS": {"info_key": "rgb_matrix.max_brightness", "value_type": "int"},
|
||||
"RGB_MATRIX_SAT_STEP": {"info_key": "rgb_matrix.sat_steps", "value_type": "int"},
|
||||
"RGB_MATRIX_SLEEP": {"info_key": "rgb_matrix.sleep", "value_type": "flag"},
|
||||
"RGB_MATRIX_SPD_STEP": {"info_key": "rgb_matrix.speed_steps", "value_type": "int"},
|
||||
"RGB_MATRIX_SPLIT": {"info_key": "rgb_matrix.split_count", "value_type": "array.int"},
|
||||
"RGB_MATRIX_TIMEOUT": {"info_key": "rgb_matrix.timeout", "value_type": "int"},
|
||||
"RGB_MATRIX_VAL_STEP": {"info_key": "rgb_matrix.val_steps", "value_type": "int"},
|
||||
"RGB_MATRIX_LED_COUNT": {"info_key": "rgb_matrix.led_count", "value_type": "int", "to_json": false},
|
||||
"RGB_MATRIX_DEFAULT_ON": {"info_key": "rgb_matrix.default.on", "value_type": "bool"},
|
||||
"RGB_MATRIX_DEFAULT_HUE": {"info_key": "rgb_matrix.default.hue", "value_type": "int"},
|
||||
"RGB_MATRIX_DEFAULT_SAT": {"info_key": "rgb_matrix.default.sat", "value_type": "int"},
|
||||
"RGB_MATRIX_DEFAULT_VAL": {"info_key": "rgb_matrix.default.val", "value_type": "int"},
|
||||
"RGB_MATRIX_DEFAULT_SPD": {"info_key": "rgb_matrix.default.speed", "value_type": "int"},
|
||||
|
||||
// RGBLight
|
||||
"RGBLED_NUM": {"info_key": "rgblight.led_count", "value_type": "int"},
|
||||
"RGBLED_SPLIT": {"info_key": "rgblight.split_count", "value_type": "array.int"},
|
||||
"RGBLIGHT_HUE_STEP": {"info_key": "rgblight.hue_steps", "value_type": "int"},
|
||||
"RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "bool"},
|
||||
"RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "bool"},
|
||||
"RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "bool"},
|
||||
"RGBLIGHT_LAYER_BLINK": {"info_key": "rgblight.layers.blink", "value_type": "flag"},
|
||||
"RGBLIGHT_LAYERS": {"info_key": "rgblight.layers.enabled", "value_type": "flag"},
|
||||
"RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF": {"info_key": "rgblight.layers.override_rgb", "value_type": "flag"},
|
||||
"RGBLIGHT_LED_COUNT": {"info_key": "rgblight.led_count", "value_type": "int"},
|
||||
"RGBLIGHT_LED_MAP": {"info_key": "rgblight.led_map", "value_type": "array.int"},
|
||||
"RGBLIGHT_LIMIT_VAL": {"info_key": "rgblight.max_brightness", "value_type": "int"},
|
||||
"RGBLIGHT_MAX_LAYERS": {"info_key": "rgblight.layers.max", "value_type": "int"},
|
||||
"RGBLIGHT_SAT_STEP": {"info_key": "rgblight.saturation_steps", "value_type": "int"},
|
||||
"RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "bool"},
|
||||
"RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "bool"},
|
||||
"RGBLIGHT_SLEEP": {"info_key": "rgblight.sleep", "value_type": "flag"},
|
||||
"RGBLIGHT_SPLIT": {"info_key": "rgblight.split", "value_type": "flag"},
|
||||
"RGBLIGHT_VAL_STEP": {"info_key": "rgblight.brightness_steps", "value_type": "int"},
|
||||
"RGBW": {"info_key": "rgblight.rgbw", "value_type": "bool"},
|
||||
"RGBLIGHT_DEFAULT_ON": {"info_key": "rgblight.default.on", "value_type": "bool"},
|
||||
"RGBLIGHT_DEFAULT_HUE": {"info_key": "rgblight.default.hue", "value_type": "int"},
|
||||
"RGBLIGHT_DEFAULT_SAT": {"info_key": "rgblight.default.sat", "value_type": "int"},
|
||||
"RGBLIGHT_DEFAULT_VAL": {"info_key": "rgblight.default.val", "value_type": "int"},
|
||||
"RGBLIGHT_DEFAULT_SPD": {"info_key": "rgblight.default.speed", "value_type": "int"},
|
||||
"RGBW": {"info_key": "rgblight.rgbw", "value_type": "flag"},
|
||||
|
||||
// Secure
|
||||
"SECURE_IDLE_TIMEOUT": {"info_key": "secure.idle_timeout", "value_type": "int"},
|
||||
@@ -134,29 +172,39 @@
|
||||
// Split Keyboard
|
||||
"SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"},
|
||||
"SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
|
||||
"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_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "bool"},
|
||||
"SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false},
|
||||
"SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"},
|
||||
"SPLIT_USB_DETECT": {"info_key": "split.usb_detect.enabled", "value_type": "flag"},
|
||||
"SPLIT_USB_TIMEOUT": {"info_key": "split.usb_detect.timeout", "value_type": "int"},
|
||||
"SPLIT_USB_TIMEOUT_POLL": {"info_key": "split.usb_detect.polling_interval", "value_type": "int"},
|
||||
"SPLIT_WATCHDOG_ENABLE": {"info_key": "split.transport.watchdog", "value_type": "bool"},
|
||||
"SPLIT_WATCHDOG_ENABLE": {"info_key": "split.transport.watchdog", "value_type": "flag"},
|
||||
"SPLIT_WATCHDOG_TIMEOUT": {"info_key": "split.transport.watchdog_timeout", "value_type": "int"},
|
||||
"SPLIT_ACTIVITY_ENABLE": {"info_key": "split.transport.sync.activity", "value_type": "flag"},
|
||||
"SPLIT_DETECTED_OS_ENABLE": {"info_key": "split.transport.sync.detected_os", "value_type": "flag"},
|
||||
"SPLIT_HAPTIC_ENABLE": {"info_key": "split.transport.sync.haptic", "value_type": "flag"},
|
||||
"SPLIT_LAYER_STATE_ENABLE": {"info_key": "split.transport.sync.layer_state", "value_type": "flag"},
|
||||
"SPLIT_LED_STATE_ENABLE": {"info_key": "split.transport.sync.indicators", "value_type": "flag"},
|
||||
"SPLIT_TRANSPORT_MIRROR": {"info_key": "split.transport.sync.matrix_state", "value_type": "flag"},
|
||||
"SPLIT_MODS_ENABLE": {"info_key": "split.transport.sync.modifiers", "value_type": "flag"},
|
||||
"SPLIT_OLED_ENABLE": {"info_key": "split.transport.sync.oled", "value_type": "flag"},
|
||||
"SPLIT_ST7565_ENABLE": {"info_key": "split.transport.sync.st7565", "value_type": "flag"},
|
||||
"SPLIT_WPM_ENABLE": {"info_key": "split.transport.sync.wpm", "value_type": "flag"},
|
||||
|
||||
// Tapping
|
||||
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "bool"},
|
||||
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "bool"},
|
||||
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "bool"},
|
||||
"PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "bool"},
|
||||
"RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "bool"},
|
||||
"RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "bool"},
|
||||
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"},
|
||||
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"},
|
||||
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
|
||||
"PERMISSIVE_HOLD_PER_KEY": {"info_key": "tapping.permissive_hold_per_key", "value_type": "flag"},
|
||||
"RETRO_TAPPING": {"info_key": "tapping.retro", "value_type": "flag"},
|
||||
"RETRO_TAPPING_PER_KEY": {"info_key": "tapping.retro_per_key", "value_type": "flag"},
|
||||
"TAP_CODE_DELAY": {"info_key": "qmk.tap_keycode_delay", "value_type": "int"},
|
||||
"TAP_HOLD_CAPS_DELAY": {"info_key": "qmk.tap_capslock_delay", "value_type": "int"},
|
||||
"TAPPING_TERM": {"info_key": "tapping.term", "value_type": "int"},
|
||||
"TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "bool"},
|
||||
"TAPPING_TERM_PER_KEY": {"info_key": "tapping.term_per_key", "value_type": "flag"},
|
||||
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
|
||||
|
||||
// USB
|
||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
|
||||
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
|
||||
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
|
||||
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
|
||||
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
|
||||
@@ -171,16 +219,18 @@
|
||||
// Items we want flagged in lint
|
||||
"DEBOUNCING_DELAY": {"info_key": "_invalid.debouncing_delay", "invalid": true, "replace_with": "DEBOUNCE"},
|
||||
"DESCRIPTION": {"info_key": "_invalid.usb_description", "invalid": true},
|
||||
"IGNORE_MOD_TAP_INTERRUPT": {"info_key": "_invalid.ignore_mod_tap_interrupt", "value_type": "bool", "invalid": true},
|
||||
"IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "_invalid.ignore_mod_tap_interrupt_per_key", "invalid": true}
|
||||
"IGNORE_MOD_TAP_INTERRUPT": {"info_key": "_invalid.ignore_mod_tap_interrupt", "value_type": "flag", "invalid": true},
|
||||
"IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "_invalid.ignore_mod_tap_interrupt_per_key", "invalid": true},
|
||||
"LED_DISABLE_WHEN_USB_SUSPENDED": {"info_key": "_invalid.led_matrix_sleep", "invalid": true, "replace_with": "LED_MATRIX_SLEEP"},
|
||||
"NO_ACTION_FUNCTION": {"info_key": "_invalid.no_action_function", "invalid": true},
|
||||
"NO_ACTION_MACRO": {"info_key": "_invalid.no_action_macro", "invalid": true},
|
||||
"PREVENT_STUCK_MODIFIERS": {"info_key": "_invalid.prevent_stuck_mods", "invalid": true},
|
||||
"QMK_KEYS_PER_SCAN": {"info_key": "qmk.keys_per_scan", "value_type": "int", "deprecated": true},
|
||||
"RGB_DI_PIN": {"info_key": "rgblight.pin", "invalid": true, "replace_with": "WS2812_DI_PIN or APA102_DI_PIN"},
|
||||
"RGBLIGHT_ANIMATIONS": {"info_key": "_invalid.rgblight.animations.all", "value_type": "bool", "invalid": true},
|
||||
"TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "bool", "deprecated": true},
|
||||
"TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "bool", "deprecated": true},
|
||||
"RGB_DISABLE_WHEN_USB_SUSPENDED": {"info_key": "_invalid.rgb_matrix_sleep", "invalid": true, "replace_with": "RGB_MATRIX_SLEEP"},
|
||||
"RGBLIGHT_ANIMATIONS": {"info_key": "_invalid.rgblight.animations.all", "value_type": "flag", "invalid": true},
|
||||
"TAPPING_FORCE_HOLD": {"info_key": "tapping.force_hold", "value_type": "flag", "deprecated": true},
|
||||
"TAPPING_FORCE_HOLD_PER_KEY": {"info_key": "tapping.force_hold_per_key", "value_type": "flag", "deprecated": true},
|
||||
"UNUSED_PINS": {"info_key": "_invalid.unused_pins", "deprecated": true},
|
||||
"COMBO_COUNT": {"info_key": "_invalid.combo.count", "invalid": true},
|
||||
|
||||
@@ -190,4 +240,9 @@
|
||||
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
|
||||
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
|
||||
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
|
||||
|
||||
// Items we want flagged in lint
|
||||
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},
|
||||
"VIAL_UNLOCK_COMBO_COLS": {"info_key": "_invalid.vial_unlock_cols", "invalid": true},
|
||||
"VIAL_UNLOCK_COMBO_ROWS": {"info_key": "_invalid.vial_unlock_rows", "invalid": true}
|
||||
}
|
||||
|
@@ -17,9 +17,11 @@
|
||||
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
|
||||
"BOOTMAGIC_ENABLE": {"info_key": "bootmagic.enabled", "value_type": "bool"},
|
||||
"CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
|
||||
"DIP_SWITCH_ENABLE": {"info_key": "dip_switch.enabled", "value_type": "bool"},
|
||||
"DEBOUNCE_TYPE": {"info_key": "build.debounce_type"},
|
||||
"EEPROM_DRIVER": {"info_key": "eeprom.driver"},
|
||||
"ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"},
|
||||
"ENCODER_DRIVER": {"info_key": "encoder.driver"},
|
||||
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
||||
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
||||
"LAYOUTS": {"info_key": "community_layouts", "value_type": "list"},
|
||||
@@ -42,6 +44,7 @@
|
||||
"STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"},
|
||||
"STENO_PROTOCOL": {"info_key": "stenography.protocol"},
|
||||
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
|
||||
"WEAR_LEVELING_DRIVER": {"info_key": "eeprom.wear_leveling.driver"},
|
||||
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
|
||||
|
||||
// Items we want flagged in lint
|
||||
|
@@ -4,6 +4,13 @@
|
||||
// "target": "<keyboard_folder>"
|
||||
// }
|
||||
//
|
||||
|
||||
/* This list of aliases is for testing purposes -- ensures "linked list" recursive traversal works correctly. */
|
||||
"_test_a": { "target": "_test_b" },
|
||||
"_test_b": { "target": "_test_c" },
|
||||
"_test_c": { "target": "planck/rev6" },
|
||||
|
||||
/* The main list of aliases for moved keyboards within QMK. */
|
||||
"2_milk": {
|
||||
"target": "spaceman/2_milk"
|
||||
},
|
||||
@@ -35,7 +42,7 @@
|
||||
"target": "amjkeyboard/amjpad"
|
||||
},
|
||||
"angel64": {
|
||||
"target": "angel64/alpha"
|
||||
"target": "kakunpc/angel64/alpha"
|
||||
},
|
||||
"ashpil/modelm_usbc": {
|
||||
"target": "ibm/model_m/ashpil_usbc"
|
||||
@@ -47,10 +54,10 @@
|
||||
"target": "viktus/at101_bh"
|
||||
},
|
||||
"atom47/rev2": {
|
||||
"target": "maartenwut/atom47/rev2"
|
||||
"target": "evyd13/atom47/rev2"
|
||||
},
|
||||
"atom47/rev3": {
|
||||
"target": "maartenwut/atom47/rev3"
|
||||
"target": "evyd13/atom47/rev3"
|
||||
},
|
||||
"bakeneko60": {
|
||||
"target": "kkatano/bakeneko60"
|
||||
@@ -65,7 +72,7 @@
|
||||
"target": "bear_face/v1"
|
||||
},
|
||||
"bm16a": {
|
||||
"target": "kprepublic/bm16a"
|
||||
"target": "kprepublic/bm16a/v1"
|
||||
},
|
||||
"bm16s": {
|
||||
"target": "kprepublic/bm16s"
|
||||
@@ -77,16 +84,16 @@
|
||||
"target": "kprepublic/bm43a"
|
||||
},
|
||||
"bm60poker": {
|
||||
"target": "kprepublic/bm60poker"
|
||||
"target": "kprepublic/bm60hsrgb_poker/rev1"
|
||||
},
|
||||
"bm60rgb": {
|
||||
"target": "kprepublic/bm60rgb"
|
||||
"target": "kprepublic/bm60hsrgb/rev1"
|
||||
},
|
||||
"bm60rgb_iso": {
|
||||
"target": "kprepublic/bm60rgb_iso"
|
||||
"target": "kprepublic/bm60hsrgb_iso/rev1"
|
||||
},
|
||||
"bm68rgb": {
|
||||
"target": "kprepublic/bm68rgb"
|
||||
"target": "kprepublic/bm68hsrgb/rev1"
|
||||
},
|
||||
"bpiphany/pegasushoof": {
|
||||
"target": "bpiphany/pegasushoof/2013"
|
||||
@@ -136,11 +143,17 @@
|
||||
"daisy": {
|
||||
"target": "ktec/daisy"
|
||||
},
|
||||
"dp3000": {
|
||||
"target": "dp3000/rev1"
|
||||
},
|
||||
"drakon": {
|
||||
"target": "jagdpietr/drakon"
|
||||
},
|
||||
"durgod/k320": {
|
||||
"target": "durgod/k3x0/k320"
|
||||
"target": "durgod/k320/base"
|
||||
},
|
||||
"durgod/k3x0/k320": {
|
||||
"target": "durgod/k320/base"
|
||||
},
|
||||
"durgod/hades": {
|
||||
"target": "durgod/dgk6x/hades_ansi"
|
||||
@@ -166,9 +179,18 @@
|
||||
"dztech/volcano660": {
|
||||
"target": "ilumkb/volcano660"
|
||||
},
|
||||
"dztech/og60": {
|
||||
"target": "dztech/tofu60"
|
||||
},
|
||||
"eek": {
|
||||
"target": "eek/silk_down"
|
||||
},
|
||||
"epoch80": {
|
||||
"target": "kbdfans/epoch80"
|
||||
},
|
||||
"era/klein": {
|
||||
"target": "era/sirind/klein_sd"
|
||||
},
|
||||
"ergodone": {
|
||||
"target": "ktec/ergodone"
|
||||
},
|
||||
@@ -199,6 +221,9 @@
|
||||
"handwired/dactyl_manuform/6x6_kinesis": {
|
||||
"target": "handwired/dactyl_kinesis"
|
||||
},
|
||||
"handwired/dactyl_manuform/dmote/62key": {
|
||||
"target": "handwired/dmote"
|
||||
},
|
||||
"handwired/ferris": {
|
||||
"target": "ferris/0_1"
|
||||
},
|
||||
@@ -265,11 +290,17 @@
|
||||
"honeycomb": {
|
||||
"target": "keyhive/honeycomb"
|
||||
},
|
||||
"hub16": {
|
||||
"target": "joshajohnson/hub16"
|
||||
},
|
||||
"hub20": {
|
||||
"target": "joshajohnson/hub20"
|
||||
},
|
||||
"idb_60": {
|
||||
"target": "idb/idb_60"
|
||||
},
|
||||
"idobo": {
|
||||
"target": "idobao/id75"
|
||||
"target": "idobao/id75/v1"
|
||||
},
|
||||
"jacky_studio/piggy60": {
|
||||
"target": "jacky_studio/piggy60/rev1"
|
||||
@@ -283,6 +314,9 @@
|
||||
"jj50": {
|
||||
"target": "kprepublic/jj50"
|
||||
},
|
||||
"jm60": {
|
||||
"target": "kbdfans/jm60"
|
||||
},
|
||||
"jones": {
|
||||
"target": "jones/v03_1"
|
||||
},
|
||||
@@ -307,12 +341,48 @@
|
||||
"keycapsss/plaid_pad": {
|
||||
"target": "keycapsss/plaid_pad/rev1"
|
||||
},
|
||||
"kira75": {
|
||||
"target": "kira/kira75"
|
||||
},
|
||||
"kira80": {
|
||||
"target": "kira/kira80"
|
||||
},
|
||||
"kudox": {
|
||||
"target": "kudox/rev1"
|
||||
"target": "kumaokobo/kudox/rev1"
|
||||
},
|
||||
"kudox/columner": {
|
||||
"target": "kumaokobo/kudox/columner"
|
||||
},
|
||||
"kudox/rev1": {
|
||||
"target": "kumaokobo/kudox/rev1"
|
||||
},
|
||||
"kudox/rev2": {
|
||||
"target": "kumaokobo/kudox/rev2"
|
||||
},
|
||||
"kudox/rev3": {
|
||||
"target": "kumaokobo/kudox/rev3"
|
||||
},
|
||||
"kudox_full": {
|
||||
"target": "kumaokobo/kudox_full/rev1"
|
||||
},
|
||||
"kudox_full/rev1": {
|
||||
"target": "kumaokobo/kudox_full/rev1"
|
||||
},
|
||||
"kudox_game": {
|
||||
"target": "kumaokobo/kudox_game/rev1"
|
||||
},
|
||||
"kudox_game/rev1": {
|
||||
"target": "kumaokobo/kudox_game/rev1"
|
||||
},
|
||||
"kudox_game/rev2": {
|
||||
"target": "kumaokobo/kudox_game/rev2"
|
||||
},
|
||||
"kyria": {
|
||||
"target": "splitkb/kyria"
|
||||
},
|
||||
"laser_ninja/pumpkin_pad": {
|
||||
"target": "laser_ninja/pumpkinpad"
|
||||
},
|
||||
"lattice60": {
|
||||
"target": "keyhive/lattice60"
|
||||
},
|
||||
@@ -391,6 +461,9 @@
|
||||
"maartenwut/wonderland": {
|
||||
"target": "evyd13/wonderland"
|
||||
},
|
||||
"matchstickworks/southpad": {
|
||||
"target": "matchstickworks/southpad/rev2/"
|
||||
},
|
||||
"matrix/m12og": {
|
||||
"target": "matrix/m12og/rev1"
|
||||
},
|
||||
@@ -401,7 +474,7 @@
|
||||
"target": "mechlovin/adelais/rgb_led/rev1"
|
||||
},
|
||||
"mechlovin/adelais/standard_led": {
|
||||
"target": "mechlovin/adelais/standard_led/rev2"
|
||||
"target": "mechlovin/adelais/standard_led/arm/rev2"
|
||||
},
|
||||
"mechlovin/delphine": {
|
||||
"target": "mechlovin/delphine/mono_led"
|
||||
@@ -424,6 +497,15 @@
|
||||
"minim": {
|
||||
"target": "matthewdias/minim"
|
||||
},
|
||||
"mnk1800s": {
|
||||
"target": "monokei/mnk1800s"
|
||||
},
|
||||
"mnk50": {
|
||||
"target": "monokei/mnk50"
|
||||
},
|
||||
"mnk75": {
|
||||
"target": "monokei/mnk75"
|
||||
},
|
||||
"model01": {
|
||||
"target": "keyboardio/model01"
|
||||
},
|
||||
@@ -436,6 +518,9 @@
|
||||
"montsinger/rebound": {
|
||||
"target": "montsinger/rebound/rev1"
|
||||
},
|
||||
"moonlander": {
|
||||
"target": "zsa/moonlander"
|
||||
},
|
||||
"mschwingen/modelm": {
|
||||
"target": "ibm/model_m/mschwingen"
|
||||
},
|
||||
@@ -455,19 +540,28 @@
|
||||
"target": "pabile/p20/ver1"
|
||||
},
|
||||
"pancake/feather": {
|
||||
"target": "spaceman/pancake/feather"
|
||||
"target": "spaceman/pancake/rev1/feather"
|
||||
},
|
||||
"pancake/promicro": {
|
||||
"target": "spaceman/pancake/promicro"
|
||||
"target": "spaceman/pancake/rev1/promicro"
|
||||
},
|
||||
"peiorisboards/ixora": {
|
||||
"target": "coarse/ixora"
|
||||
},
|
||||
"pico": {
|
||||
"target": "kumaokobo/pico/65keys"
|
||||
},
|
||||
"pico/65keys": {
|
||||
"target": "kumaokobo/pico/65keys"
|
||||
},
|
||||
"pico/70keys": {
|
||||
"target": "kumaokobo/pico/70keys"
|
||||
},
|
||||
"plaid": {
|
||||
"target": "dm9records/plaid"
|
||||
},
|
||||
"plain60": {
|
||||
"target": "maartenwut/plain60"
|
||||
"target": "evyd13/plain60"
|
||||
},
|
||||
"ploopyco/trackball": {
|
||||
"target": "ploopyco/trackball/rev1_005"
|
||||
@@ -503,10 +597,13 @@
|
||||
"target": "wilba_tech/rama_works_u80_a"
|
||||
},
|
||||
"ramonimbao/herringbone": {
|
||||
"target": "ramonimbao/herringbone/v1"
|
||||
"target": "rmi_kb/herringbone/v1"
|
||||
},
|
||||
"ramonimbao/mona": {
|
||||
"target": "ramonimbao/mona/v1"
|
||||
"target": "rmi_kb/mona/v1"
|
||||
},
|
||||
"redox_w": {
|
||||
"target": "redox/wireless"
|
||||
},
|
||||
"rgbkb/pan": {
|
||||
"target": "rgbkb/pan/rev1/32a"
|
||||
@@ -542,10 +639,10 @@
|
||||
"target": "tkw/stoutgat/v1"
|
||||
},
|
||||
"suihankey": {
|
||||
"target": "suihankey/split/alpha"
|
||||
"target": "kakunpc/suihankey/split/alpha"
|
||||
},
|
||||
"ta65": {
|
||||
"target": "maartenwut/ta65"
|
||||
"target": "evyd13/ta65"
|
||||
},
|
||||
"tartan": {
|
||||
"target": "dm9records/tartan"
|
||||
@@ -563,13 +660,13 @@
|
||||
"target": "matthewdias/txuu"
|
||||
},
|
||||
"underscore33": {
|
||||
"target": "underscore33/rev1"
|
||||
"target": "tominabox1/underscore33/rev1"
|
||||
},
|
||||
"vinta": {
|
||||
"target": "coarse/vinta"
|
||||
},
|
||||
"wasdat": {
|
||||
"target": "maartenwut/wasdat"
|
||||
"target": "evyd13/wasdat"
|
||||
},
|
||||
"westfoxtrot/cypher": {
|
||||
"target": "westfoxtrot/cypher/rev1"
|
||||
@@ -581,10 +678,10 @@
|
||||
"target": "xiudi/xd002"
|
||||
},
|
||||
"xd004": {
|
||||
"target": "xiudi/xd004"
|
||||
"target": "xiudi/xd004/v1"
|
||||
},
|
||||
"xd60": {
|
||||
"target": "xiudi/xd60"
|
||||
"target": "xiudi/xd60/rev2"
|
||||
},
|
||||
"xd68": {
|
||||
"target": "xiudi/xd68"
|
||||
@@ -776,6 +873,12 @@
|
||||
"eggman": {
|
||||
"target": "qpockets/eggman"
|
||||
},
|
||||
"enter67": {
|
||||
"target": "kezewa/enter67"
|
||||
},
|
||||
"enter80": {
|
||||
"target": "kezewa/enter80"
|
||||
},
|
||||
"ergo42": {
|
||||
"target": "biacco42/ergo42"
|
||||
},
|
||||
@@ -797,9 +900,15 @@
|
||||
"espectro": {
|
||||
"target": "mechkeys/espectro"
|
||||
},
|
||||
"eu_isolation": {
|
||||
"target": "p3d/eu_isolation"
|
||||
},
|
||||
"felix": {
|
||||
"target": "unikeyboard/felix"
|
||||
},
|
||||
"flygone60/rev3": {
|
||||
"target": "shandoncodes/flygone60/rev3"
|
||||
},
|
||||
"four_banger": {
|
||||
"target": "bpiphany/four_banger"
|
||||
},
|
||||
@@ -831,7 +940,7 @@
|
||||
"target": "kagizaraya/halberd"
|
||||
},
|
||||
"handwired/hillside/0_1": {
|
||||
"target": "handwired/hillside/48"
|
||||
"target": "hillside/48/0_1"
|
||||
},
|
||||
"hecomi/alpha": {
|
||||
"target": "takashiski/hecomi/alpha"
|
||||
@@ -843,10 +952,10 @@
|
||||
"target": "bpiphany/hid_liber"
|
||||
},
|
||||
"id67/default_rgb": {
|
||||
"target": "idobao/id67/default_rgb"
|
||||
"target": "idobao/id67"
|
||||
},
|
||||
"id67/rgb": {
|
||||
"target": "idobao/id67/rgb"
|
||||
"target": "idobao/id67"
|
||||
},
|
||||
"id80": {
|
||||
"target": "idobao/id80/v2/ansi"
|
||||
@@ -884,12 +993,33 @@
|
||||
"kelowna/rgb64": {
|
||||
"target": "weirdo/kelowna/rgb64"
|
||||
},
|
||||
"keychron/q0": {
|
||||
"target": "keychron/q0/base"
|
||||
},
|
||||
"keychron/q1": {
|
||||
"target": "keychron/q1v1/ansi"
|
||||
}
|
||||
"keychron/q4": {
|
||||
"target": "keychron/q4/ansi/v1"
|
||||
}
|
||||
"kmac": {
|
||||
"target": "kbdmania/kmac"
|
||||
}
|
||||
"kmac_pad": {
|
||||
"target": "kbdmania/kmac_pad"
|
||||
}
|
||||
"kprepublic/bm40hsrgb": {
|
||||
"target": "kprepublic/bm40hsrgb/rev1"
|
||||
},
|
||||
"kprepublic/bm65hsrgb_iso": {
|
||||
"target": "kprepublic/bm65hsrgb_iso/rev1"
|
||||
},
|
||||
"kprepublic/bm68hsrgb": {
|
||||
"target": "kprepublic/bm68hsrgb/rev1"
|
||||
},
|
||||
"late9/rev1": {
|
||||
"target": "rookiebwoy/late9/rev1"
|
||||
},
|
||||
"latin17rgb": {
|
||||
"target": "latincompass/latin17rgb"
|
||||
},
|
||||
@@ -914,6 +1044,12 @@
|
||||
"launchpad/rev1": {
|
||||
"target": "maple_computing/launchpad/rev1"
|
||||
},
|
||||
"lefty": {
|
||||
"target": "smoll/lefty/rev2"
|
||||
},
|
||||
"lefty/rev1": {
|
||||
"target": "smoll/lefty/rev1"
|
||||
},
|
||||
"lck75": {
|
||||
"target": "lyso1/lck75"
|
||||
},
|
||||
@@ -929,9 +1065,21 @@
|
||||
"ls_60": {
|
||||
"target": "weirdo/ls_60"
|
||||
},
|
||||
"lpad": {
|
||||
"target": "laneware/lpad"
|
||||
},
|
||||
"lw67": {
|
||||
"target": "laneware/lw67"
|
||||
},
|
||||
"lw75": {
|
||||
"target": "laneware/lw75"
|
||||
},
|
||||
"m3n3van": {
|
||||
"target": "matthewdias/m3n3van"
|
||||
},
|
||||
"macro1": {
|
||||
"target": "laneware/macro1"
|
||||
},
|
||||
"massdrop/thekey": {
|
||||
"target": "drop/thekey/v1"
|
||||
},
|
||||
@@ -956,9 +1104,21 @@
|
||||
"melody96": {
|
||||
"target": "ymdk/melody96"
|
||||
},
|
||||
"miniaxe": {
|
||||
"target": "kagizaraya/miniaxe"
|
||||
},
|
||||
"minidox/rev1": {
|
||||
"target": "maple_computing/minidox/rev1"
|
||||
},
|
||||
"mino/hotswap": {
|
||||
"target": "shandoncodes/mino/hotswap"
|
||||
},
|
||||
"mino_plus/hotswap": {
|
||||
"target": "shandoncodes/mino_plus/hotswap"
|
||||
},
|
||||
"mino_plus/soldered": {
|
||||
"target": "shandoncodes/mino_plus/soldered"
|
||||
},
|
||||
"mio": {
|
||||
"target": "recompile_keys/mio"
|
||||
},
|
||||
@@ -1013,6 +1173,9 @@
|
||||
"nebula68b": {
|
||||
"target": "spaceholdings/nebula68b"
|
||||
},
|
||||
"neopad/rev1": {
|
||||
"target": "rookiebwoy/neopad/rev1"
|
||||
},
|
||||
"niu_mini": {
|
||||
"target": "kbdfans/niu_mini"
|
||||
},
|
||||
@@ -1067,6 +1230,12 @@
|
||||
"pursuit40": {
|
||||
"target": "checkerboards/pursuit40"
|
||||
},
|
||||
"pw88": {
|
||||
"target": "smoll/pw88"
|
||||
},
|
||||
"q4z": {
|
||||
"target": "p3d/q4z"
|
||||
},
|
||||
"qaz": {
|
||||
"target": "tominabox1/qaz"
|
||||
},
|
||||
@@ -1076,6 +1245,9 @@
|
||||
"rabbit_capture_plan": {
|
||||
"target": "kakunpc/rabbit_capture_plan"
|
||||
},
|
||||
"raindrop": {
|
||||
"target": "laneware/raindrop"
|
||||
},
|
||||
"ramonimbao/aelith": {
|
||||
"target": "rmi_kb/aelith"
|
||||
},
|
||||
@@ -1142,6 +1314,9 @@
|
||||
"reviung61": {
|
||||
"target": "reviung/reviung61"
|
||||
},
|
||||
"riot_pad": {
|
||||
"target": "shandoncodes/riot_pad"
|
||||
},
|
||||
"runner3680/3x6": {
|
||||
"target": "omkbd/runner3680/3x6"
|
||||
},
|
||||
@@ -1184,12 +1359,21 @@
|
||||
"setta21": {
|
||||
"target": "salicylic_acid3/setta21"
|
||||
},
|
||||
"soda/mango": {
|
||||
"target": "magic_force/mf17"
|
||||
},
|
||||
"soda/pocket": {
|
||||
"target": "magic_force/mf34"
|
||||
},
|
||||
"space_space/rev1": {
|
||||
"target": "qpockets/space_space/rev1"
|
||||
},
|
||||
"space_space/rev2": {
|
||||
"target": "qpockets/space_space/rev2"
|
||||
},
|
||||
"spacey": {
|
||||
"target": "p3d/spacey"
|
||||
},
|
||||
"spiderisland/winry25tc": {
|
||||
"target": "winry/winry25tc"
|
||||
},
|
||||
@@ -1208,6 +1392,9 @@
|
||||
"stella": {
|
||||
"target": "hnahkb/stella"
|
||||
},
|
||||
"studiokestra/line_tkl": {
|
||||
"target": "studiokestra/line_friends_tkl"
|
||||
},
|
||||
"suihankey/alpha": {
|
||||
"target": "kakunpc/suihankey/alpha"
|
||||
},
|
||||
@@ -1217,6 +1404,9 @@
|
||||
"suihankey/split": {
|
||||
"target": "kakunpc/suihankey/split"
|
||||
},
|
||||
"synapse": {
|
||||
"target": "p3d/synapse"
|
||||
},
|
||||
"the_ruler": {
|
||||
"target": "maple_computing/the_ruler"
|
||||
},
|
||||
@@ -1236,7 +1426,10 @@
|
||||
"target": "marksard/treadstone48/rev2"
|
||||
},
|
||||
"tronguylabs/m122_3270": {
|
||||
"target": "ibm/model_m_122/m122_3270"
|
||||
"target": "ibm/model_m_122/m122_3270/teensy"
|
||||
},
|
||||
"tw40": {
|
||||
"target": "p3d/tw40"
|
||||
},
|
||||
"ua62": {
|
||||
"target": "nacly/ua62"
|
||||
@@ -1256,6 +1449,9 @@
|
||||
"vn66": {
|
||||
"target": "hnahkb/vn66"
|
||||
},
|
||||
"w1_at": {
|
||||
"target": "geonworks/w1_at"
|
||||
},
|
||||
"wallaby": {
|
||||
"target": "kkatano/wallaby"
|
||||
},
|
||||
@@ -1290,7 +1486,7 @@
|
||||
"target": "ydkb/yd68"
|
||||
},
|
||||
"ymd75": {
|
||||
"target": "ymdk/ymd75"
|
||||
"target": "ymdk/ymd75/rev1"
|
||||
},
|
||||
"ymd96": {
|
||||
"target": "ymdk/ymd96"
|
||||
@@ -1304,6 +1500,12 @@
|
||||
"yurei": {
|
||||
"target": "kkatano/yurei"
|
||||
},
|
||||
"z12": {
|
||||
"target": "zigotica/z12"
|
||||
},
|
||||
"z34": {
|
||||
"target": "zigotica/z34"
|
||||
},
|
||||
"zinc": {
|
||||
"target": "25keys/zinc"
|
||||
},
|
||||
@@ -1312,5 +1514,9 @@
|
||||
},
|
||||
"zinc/reva": {
|
||||
"target": "25keys/zinc/reva"
|
||||
},
|
||||
// Moved during 2023 Q4 cycle
|
||||
"ymdk/melody96": {
|
||||
"target": "ymdk/melody96/soldered"
|
||||
}
|
||||
}
|
||||
|
@@ -3,10 +3,25 @@
|
||||
"$id": "qmk.definitions.v1",
|
||||
"title": "Common definitions used across QMK's jsonschemas.",
|
||||
"type": "object",
|
||||
"bcd_version": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$"
|
||||
},
|
||||
"bit": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
},
|
||||
"boolean_array": {
|
||||
"type": "object",
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "#/keyboard_keymap_tuple"},
|
||||
{"$ref": "#/json_file_path"}
|
||||
]
|
||||
},
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
@@ -20,14 +35,56 @@
|
||||
"type": "string",
|
||||
"pattern": "^0x[0-9A-F]{4}$"
|
||||
},
|
||||
"bcd_version": {
|
||||
"json_file_path": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$"
|
||||
"pattern": "^[0-9a-z_/\\-]+\\.json$"
|
||||
},
|
||||
"text_identifier": {
|
||||
"key_unit": {
|
||||
"type": "number"
|
||||
},
|
||||
"keyboard": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 250
|
||||
"pattern": "^[0-9a-z][0-9a-z_/]*$"
|
||||
},
|
||||
"keyboard_keymap_tuple": {
|
||||
"type": "array",
|
||||
"prefixItems": [
|
||||
{"$ref": "#/keyboard"},
|
||||
{"$ref": "#/filename"}
|
||||
],
|
||||
"unevaluatedItems": false
|
||||
},
|
||||
"keycode": {
|
||||
"type": "string",
|
||||
"minLength": 2,
|
||||
"maxLength": 50,
|
||||
"pattern": "^[A-Z][A-Zs_0-9]*$"
|
||||
},
|
||||
"keycode_decl": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"key"
|
||||
],
|
||||
"properties": {
|
||||
"key": {"$ref": "#/keycode"},
|
||||
"label": {"$ref": "#/text_identifier"},
|
||||
"aliases": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {"$ref": "#/keycode_short"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"keycode_decl_array": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {"$ref": "#/keycode_decl"}
|
||||
},
|
||||
"keycode_short": {
|
||||
"type": "string",
|
||||
"minLength": 2,
|
||||
"maxLength": 7,
|
||||
"pattern": "^[A-Z][A-Zs_0-9]*$"
|
||||
},
|
||||
"layout_macro": {
|
||||
"oneOf": [
|
||||
@@ -64,49 +121,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"key_unit": {
|
||||
"type": "number"
|
||||
},
|
||||
"keyboard": {
|
||||
"type": "string",
|
||||
"pattern": "^[0-9a-z][0-9a-z_/]*$"
|
||||
},
|
||||
"keycode": {
|
||||
"type": "string",
|
||||
"minLength": 2,
|
||||
"maxLength": 50,
|
||||
"pattern": "^[A-Z][A-Zs_0-9]*$"
|
||||
},
|
||||
"keycode_short": {
|
||||
"type": "string",
|
||||
"minLength": 2,
|
||||
"maxLength": 7,
|
||||
"pattern": "^[A-Z][A-Zs_0-9]*$"
|
||||
},
|
||||
"keycode_decl": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"key"
|
||||
],
|
||||
"properties": {
|
||||
"key": {"$ref": "#/keycode"},
|
||||
"label": {"$ref": "#/text_identifier"},
|
||||
"aliases": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {"$ref": "#/keycode_short"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"keycode_decl_array": {
|
||||
"type": "array",
|
||||
"minItems": 1
|
||||
"items": {"$ref": "#/keycode_decl"}
|
||||
},
|
||||
"mcu_pin_array": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "#/mcu_pin"}
|
||||
},
|
||||
"mcu_pin": {
|
||||
"oneOf": [
|
||||
{
|
||||
@@ -125,14 +139,14 @@
|
||||
"type": "string",
|
||||
"pattern": "^GP\\d{1,2}$"
|
||||
},
|
||||
{
|
||||
"type": "integer"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
{"type": "integer"},
|
||||
{"type": "null"}
|
||||
]
|
||||
},
|
||||
"mcu_pin_array": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "#/mcu_pin"}
|
||||
},
|
||||
"signed_decimal": {
|
||||
"type": "number"
|
||||
},
|
||||
@@ -144,17 +158,22 @@
|
||||
"minimum": -127,
|
||||
"maximum": 127
|
||||
},
|
||||
"snake_case": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-z][a-z0-9_]*$"
|
||||
},
|
||||
"string_array": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
"string_object": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
}
|
||||
"additionalProperties": {"type": "string"}
|
||||
},
|
||||
"text_identifier": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 250
|
||||
},
|
||||
"unsigned_decimal": {
|
||||
"type": "number",
|
||||
@@ -168,10 +187,5 @@
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"bit": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,10 @@
|
||||
"encoder_config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["custom", "quadrature"]
|
||||
},
|
||||
"rotary": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
@@ -20,10 +24,16 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"dip_switch_config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"type": "object",
|
||||
"not": { "required": [ "vendorId", "productId" ] }, // reject via keys...
|
||||
"not": {"required": ["vendorId", "productId"]}, // reject via keys...
|
||||
"properties": {
|
||||
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
|
||||
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
|
||||
@@ -35,7 +45,7 @@
|
||||
},
|
||||
"development_board": {
|
||||
"type": "string",
|
||||
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris"]
|
||||
"enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera"]
|
||||
},
|
||||
"pin_compatible": {
|
||||
"type": "string",
|
||||
@@ -115,6 +125,14 @@
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"clicky": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"macro_beep": {"type": "boolean"},
|
||||
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
|
||||
"voices": {"type": "boolean"}
|
||||
@@ -126,7 +144,16 @@
|
||||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["pwm", "software", "timer", "custom"]
|
||||
"enum": ["custom", "pwm", "software", "timer"]
|
||||
},
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"breathing": {"type": "boolean"},
|
||||
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"breathing": {"type": "boolean"},
|
||||
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
@@ -245,9 +272,40 @@
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/filename"}
|
||||
},
|
||||
"dip_switch": {
|
||||
"$ref": "#/definitions/dip_switch_config",
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"matrix_grid": {
|
||||
"type": "array",
|
||||
"minItems": 1,
|
||||
"items": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"eeprom": {
|
||||
"properties": {
|
||||
"driver": {"type": "string"}
|
||||
"driver": {"type": "string"},
|
||||
"wear_leveling": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
|
||||
},
|
||||
"backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"encoder": {
|
||||
@@ -256,7 +314,11 @@
|
||||
"enabled": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"features": {"$ref": "qmk.definitions.v1#/boolean_array"},
|
||||
"features": {
|
||||
"$ref": "qmk.definitions.v1#/boolean_array",
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"not": {"required": ["lto"]}
|
||||
},
|
||||
"indicators": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -280,15 +342,9 @@
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"filename": {
|
||||
"type": "string"
|
||||
},
|
||||
"c_macro": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"json_layout": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"filename": {"type": "string"},
|
||||
"c_macro": {"type": "boolean"},
|
||||
"json_layout": {"type": "boolean"},
|
||||
"layout": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
@@ -296,6 +352,7 @@
|
||||
"additionalProperties": false,
|
||||
"required": ["x", "y"],
|
||||
"properties": {
|
||||
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"pattern": "^[^\\n]*$"
|
||||
@@ -370,11 +427,37 @@
|
||||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "boolean"
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {"type": "string"},
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"custom",
|
||||
"is31fl3218",
|
||||
"is31fl3729",
|
||||
"is31fl3731",
|
||||
"is31fl3733",
|
||||
"is31fl3736",
|
||||
"is31fl3737",
|
||||
"is31fl3741",
|
||||
"is31fl3742a",
|
||||
"is31fl3743a",
|
||||
"is31fl3745",
|
||||
"is31fl3746a",
|
||||
"snled27351"
|
||||
]
|
||||
},
|
||||
"center_point": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
@@ -385,6 +468,10 @@
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"react_on_keyup": {"type": "boolean"},
|
||||
"sleep": {"type": "boolean"},
|
||||
"split_count": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
@@ -419,11 +506,41 @@
|
||||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "boolean"
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {"type": "string"},
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"aw20216s",
|
||||
"custom",
|
||||
"is31fl3218",
|
||||
"is31fl3729",
|
||||
"is31fl3731",
|
||||
"is31fl3733",
|
||||
"is31fl3736",
|
||||
"is31fl3737",
|
||||
"is31fl3741",
|
||||
"is31fl3742a",
|
||||
"is31fl3743a",
|
||||
"is31fl3745",
|
||||
"is31fl3746a",
|
||||
"snled27351",
|
||||
"ws2812"
|
||||
]
|
||||
},
|
||||
"center_point": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
@@ -436,6 +553,10 @@
|
||||
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"react_on_keyup": {"type": "boolean"},
|
||||
"sleep": {"type": "boolean"},
|
||||
"split_count": {
|
||||
"type": "array",
|
||||
"minItems": 2,
|
||||
@@ -471,11 +592,22 @@
|
||||
"properties": {
|
||||
"animations": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "boolean"
|
||||
}
|
||||
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"default": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"on": {"type": "boolean"},
|
||||
"animation": {"type": "string"},
|
||||
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
},
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["apa102", "custom", "ws2812"]
|
||||
@@ -586,10 +718,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"matrix_grid": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
||||
},
|
||||
"matrix_pins": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
@@ -609,6 +737,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"dip_switch": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"right": {
|
||||
"$ref": "#/definitions/dip_switch_config"
|
||||
}
|
||||
}
|
||||
},
|
||||
"encoder": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
@@ -618,9 +755,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"main": {
|
||||
"type": "string",
|
||||
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
|
||||
"handedness": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"matrix_grid": {
|
||||
"$ref": "qmk.definitions.v1#/mcu_pin_array",
|
||||
"minItems": 2,
|
||||
"maxItems": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"soft_serial_speed": {
|
||||
@@ -636,10 +781,32 @@
|
||||
"type": "string",
|
||||
"enum": ["custom", "i2c", "serial", "serial_usart"]
|
||||
},
|
||||
"sync_matrix_state": {"type": "boolean"},
|
||||
"sync_modifiers": {"type": "boolean"},
|
||||
"sync": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"activity": {"type": "boolean"},
|
||||
"detected_os": {"type": "boolean"},
|
||||
"haptic": {"type": "boolean"},
|
||||
"layer_state": {"type": "boolean"},
|
||||
"indicators": {"type": "boolean"},
|
||||
"matrix_state": {"type": "boolean"},
|
||||
"modifiers": {"type": "boolean"},
|
||||
"oled": {"type": "boolean"},
|
||||
"st7565": {"type": "boolean"},
|
||||
"wpm": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"watchdog": {"type": "boolean"},
|
||||
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"sync_matrix_state": {
|
||||
"type": "boolean",
|
||||
"$comment": "Deprecated: use sync.matrix_state instead"
|
||||
},
|
||||
"sync_modifiers": {
|
||||
"type": "boolean",
|
||||
"$comment": "Deprecated: use sync.modifiers instead"
|
||||
}
|
||||
}
|
||||
},
|
||||
"usb_detect": {
|
||||
@@ -650,6 +817,16 @@
|
||||
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"main": {
|
||||
"type": "string",
|
||||
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"],
|
||||
"$comment": "Deprecated: use config.h options for now"
|
||||
},
|
||||
"matrix_grid": {
|
||||
"type": "array",
|
||||
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"$comment": "Deprecated: use split.handedness.matrix_grid instead"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -707,7 +884,15 @@
|
||||
"properties": {
|
||||
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
|
||||
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"locking": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"resync": {"type": "boolean"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"qmk_lufa_bootloader": {
|
||||
|
14
data/schemas/user_repo_v0.jsonschema
Normal file
14
data/schemas/user_repo_v0.jsonschema
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||
"$id": "qmk.user_repo.v0",
|
||||
"title": "User Repository Information",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"userspace_version"
|
||||
],
|
||||
"properties": {
|
||||
"userspace_version": {
|
||||
"type": "string",
|
||||
},
|
||||
}
|
||||
}
|
22
data/schemas/user_repo_v1.jsonschema
Normal file
22
data/schemas/user_repo_v1.jsonschema
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||
"$id": "qmk.user_repo.v1",
|
||||
"title": "User Repository Information",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"userspace_version",
|
||||
"build_targets"
|
||||
],
|
||||
"properties": {
|
||||
"userspace_version": {
|
||||
"type": "string",
|
||||
"enum": ["1.0"]
|
||||
},
|
||||
"build_targets": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "qmk.definitions.v1#/build_target"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
336
docs/ChangeLog/20231126.md
Normal file
336
docs/ChangeLog/20231126.md
Normal file
@@ -0,0 +1,336 @@
|
||||
# QMK Breaking Changes - 2023 November 26 Changelog
|
||||
|
||||
## Notable Features :id=notable-features
|
||||
|
||||
As per last few breaking changes cycles, there have been _a lot_ of behind-the-scenes changes, mainly around consolidation of config into `info.json` files, cleanup of `info.json` files, cleaning up driver naming, as well as addressing technical debt.
|
||||
|
||||
As a followup to last cycle's [notable changes](20230827.md#notable-changes), as `qmk/qmk_firmware` is no longer accepting PRs for keymaps we're pleased to announce that storing and building keymaps externally from the normal QMK Firmware repository is now possible. This is done through the new [External Userspace](newbs_external_userspace.md) feature, more details below!
|
||||
|
||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||
|
||||
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|---------------------------------------|-------------------------------|
|
||||
| adm42 | adm42/rev4 |
|
||||
| dp3000 | dp3000/rev1 |
|
||||
| handwired/dactyl_manuform/dmote/62key | handwired/dmote |
|
||||
| keychron/q0/rev_0130 | keychron/q0/base |
|
||||
| keychron/q0/rev_0131 | keychron/q0/plus |
|
||||
| keychron/q1/ansi | keychron/q1v1/ansi |
|
||||
| keychron/q1/ansi_encoder | keychron/q1v1/ansi_encoder |
|
||||
| keychron/q1/iso | keychron/q1v1/iso |
|
||||
| keychron/q1/iso_encoder | keychron/q1v1/iso_encoder |
|
||||
| keychron/q4/ansi_v1 | keychron/q4/ansi |
|
||||
| kprepublic/bm40hsrgb | kprepublic/bm40hsrgb/rev1 |
|
||||
| matchstickworks/southpad | matchstickworks/southpad/rev2 |
|
||||
| soda/mango | magic_force/mf17 |
|
||||
| soda/pocket | magic_force/mf34 |
|
||||
| studiokestra/line_tkl | studiokestra/line_friends_tkl |
|
||||
| ymdk/melody96 | ymdk/melody96/soldered |
|
||||
|
||||
## Notable core changes :id=notable-core
|
||||
|
||||
### External Userspace ([#22222](https://github.com/qmk/qmk_firmware/pull/22222))
|
||||
|
||||
As mentioned above, the new External Userspace feature allows for keymaps to be stored and built externally from the main QMK Firmware repository. This allows for keymaps to be stored separately -- usually in their own repository -- and for users to be able to maintain and build their keymaps without needing to fork the main QMK Firmware repository.
|
||||
|
||||
See the [External Userspace documentation](newbs_external_userspace.md) for more details.
|
||||
|
||||
A significant portion of user keymaps have already been removed from `qmk/qmk_firmware` and more will follow in coming weeks. You can still recover your keymap from the tag [user-keymaps-still-present](https://github.com/qmk/qmk_firmware/tree/user-keymaps-still-present) if required -- a perfect time to migrate to the new External Userspace!
|
||||
|
||||
!> This feature is still in beta, and we're looking for feedback on it. Please try it out and let us know what you think -- a new `#help-userspace` channel has been set up on Discord.
|
||||
|
||||
### Improve and Cleanup Shutdown callbacks ([#21060](https://github.com/qmk/qmk_firmware/pull/20160)) :id=improve-and-cleanup-shutdown-callbacks
|
||||
|
||||
Shutdown callbacks at the keyboard level were never present, preventing safe shutdown sequencing for peripherals such as OLEDs, RGB LEDs, and other devices. This PR adds a new `shutdown_kb` function, as well as amending `shutdown_user`, allowing for safe shutdown of peripherals at both keyboard and keymap level.
|
||||
|
||||
See the [Keyboard Shutdown/Reboot Code](custom_quantum_functions.md#keyboard-shutdown-reboot-code) documentation for more details.
|
||||
|
||||
### OLED Force Flush ([#20953](https://github.com/qmk/qmk_firmware/pull/20953)) :id=oled-force-flush
|
||||
|
||||
Along with the new `shutdown_kb` function, a new API `oled_render_dirty(bool)` function has been added. This allows OLED contents to be written deterministically when supplied with `true` -- that is, the OLED will be updated immediately, rather than waiting for the next OLED update cycle. This allows for OLEDs to show things such as "BOOTLOADER MODE" and the like if resetting to bootloader from QMK.
|
||||
|
||||
### Switch statement helpers for keycode ranges ([#20059](https://github.com/qmk/qmk_firmware/pull/20059)) :id=switch-statement-helpers-for-keycode-ranges
|
||||
|
||||
Predefined ranges usable within switch statements have been added for groups of similar keycodes, where people who wish to handle entire blocks at once can do so. This allows keymaps to be immune to changes in keycode values, and also allows for more efficient code generation.
|
||||
|
||||
The ranges are as follows:
|
||||
|
||||
| Name | Mapping |
|
||||
|-------------------------------------|------------------------------------------------------------------------|
|
||||
| `INTERNAL_KEYCODE_RANGE` | `KC_NO ... KC_TRANSPARENT` |
|
||||
| `BASIC_KEYCODE_RANGE` | `KC_A ... KC_EXSEL` |
|
||||
| `SYSTEM_KEYCODE_RANGE` | `KC_SYSTEM_POWER ... KC_SYSTEM_WAKE` |
|
||||
| `CONSUMER_KEYCODE_RANGE` | `KC_AUDIO_MUTE ... KC_LAUNCHPAD` |
|
||||
| `MOUSE_KEYCODE_RANGE` | `KC_MS_UP ... KC_MS_ACCEL2` |
|
||||
| `MODIFIER_KEYCODE_RANGE` | `KC_LEFT_CTRL ... KC_RIGHT_GUI` |
|
||||
| `SWAP_HANDS_KEYCODE_RANGE` | `QK_SWAP_HANDS_TOGGLE ... QK_SWAP_HANDS_ONE_SHOT` |
|
||||
| `MAGIC_KEYCODE_RANGE` | `QK_MAGIC_SWAP_CONTROL_CAPS_LOCK ... QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK` |
|
||||
| `MIDI_KEYCODE_RANGE` | `QK_MIDI_ON ... QK_MIDI_PITCH_BEND_UP` |
|
||||
| `SEQUENCER_KEYCODE_RANGE` | `QK_SEQUENCER_ON ... QK_SEQUENCER_STEPS_CLEAR` |
|
||||
| `JOYSTICK_KEYCODE_RANGE` | `QK_JOYSTICK_BUTTON_0 ... QK_JOYSTICK_BUTTON_31` |
|
||||
| `PROGRAMMABLE_BUTTON_KEYCODE_RANGE` | `QK_PROGRAMMABLE_BUTTON_1 ... QK_PROGRAMMABLE_BUTTON_32` |
|
||||
| `AUDIO_KEYCODE_RANGE` | `QK_AUDIO_ON ... QK_AUDIO_VOICE_PREVIOUS` |
|
||||
| `STENO_KEYCODE_RANGE` | `QK_STENO_BOLT ... QK_STENO_COMB_MAX` |
|
||||
| `MACRO_KEYCODE_RANGE` | `QK_MACRO_0 ... QK_MACRO_31` |
|
||||
| `BACKLIGHT_KEYCODE_RANGE` | `QK_BACKLIGHT_ON ... QK_BACKLIGHT_TOGGLE_BREATHING` |
|
||||
| `RGB_KEYCODE_RANGE` | `RGB_TOG ... RGB_MODE_TWINKLE` |
|
||||
| `QUANTUM_KEYCODE_RANGE` | `QK_BOOTLOADER ... QK_ALT_REPEAT_KEY` |
|
||||
| `KB_KEYCODE_RANGE` | `QK_KB_0 ... QK_KB_31` |
|
||||
| `USER_KEYCODE_RANGE` | `QK_USER_0 ... QK_USER_31` |
|
||||
|
||||
Usage:
|
||||
|
||||
```c
|
||||
switch (keycode) {
|
||||
case KC_A ... KC_EXSEL:
|
||||
case KC_LEFT_CTRL ... KC_RIGHT_GUI:
|
||||
/* do stuff with basic and modifier keycodes */
|
||||
```
|
||||
|
||||
Becomes:
|
||||
|
||||
```c
|
||||
switch (keycode) {
|
||||
case BASIC_KEYCODE_RANGE:
|
||||
case MODIFIER_KEYCODE_RANGE:
|
||||
/* do stuff with basic and modifier keycodes */
|
||||
```
|
||||
|
||||
### Quantum Painter OLED support ([#19997](https://github.com/qmk/qmk_firmware/pull/19997)) :id=quantum-painter-oled-support
|
||||
|
||||
Quantum Painter has picked up support for SH1106 displays -- commonly seen as 128x64 OLEDs. Support for both I2C and SPI displays is available.
|
||||
|
||||
If you're already using OLED through `OLED_DRIVER_ENABLE = yes` or equivalent in `info.json` and wish to use Quantum Painter instead, you'll need to disable the old OLED system, instead enabling Quantum Painter as well as enabling the appropriate SH1106 driver. See the [Quantum Painter driver documentation](quantum_painter.md#quantum-painter-drivers) for more details. The old OLED driver is still available, and keymaps do not require migrating to Quantum Painter if you don't want to do so.
|
||||
|
||||
### RGB/LED lighting driver naming and cleanup ([#21890](https://github.com/qmk/qmk_firmware/pull/21890), [#21891](https://github.com/qmk/qmk_firmware/pull/21891), [#21892](https://github.com/qmk/qmk_firmware/pull/21892), [#21903](https://github.com/qmk/qmk_firmware/pull/21903), [#21904](https://github.com/qmk/qmk_firmware/pull/21904), [#21905](https://github.com/qmk/qmk_firmware/pull/21905), [#21918](https://github.com/qmk/qmk_firmware/pull/21918), [#21929](https://github.com/qmk/qmk_firmware/pull/21929), [#21938](https://github.com/qmk/qmk_firmware/pull/21938), [#22004](https://github.com/qmk/qmk_firmware/pull/22004), [#22008](https://github.com/qmk/qmk_firmware/pull/22008), [#22009](https://github.com/qmk/qmk_firmware/pull/22009), [#22071](https://github.com/qmk/qmk_firmware/pull/22071), [#22090](https://github.com/qmk/qmk_firmware/pull/22090), [#22099](https://github.com/qmk/qmk_firmware/pull/22099), [#22126](https://github.com/qmk/qmk_firmware/pull/22126), [#22133](https://github.com/qmk/qmk_firmware/pull/22133), [#22163](https://github.com/qmk/qmk_firmware/pull/22163), [#22200](https://github.com/qmk/qmk_firmware/pull/22200), [#22308](https://github.com/qmk/qmk_firmware/pull/22308), [#22309](https://github.com/qmk/qmk_firmware/pull/22309), [#22311](https://github.com/qmk/qmk_firmware/pull/22311), [#22325](https://github.com/qmk/qmk_firmware/pull/22325), [#22365](https://github.com/qmk/qmk_firmware/pull/22365), [#22379](https://github.com/qmk/qmk_firmware/pull/22379), [#22380](https://github.com/qmk/qmk_firmware/pull/22380), [#22381](https://github.com/qmk/qmk_firmware/pull/22381), [#22383](https://github.com/qmk/qmk_firmware/pull/22383), [#22436](https://github.com/qmk/qmk_firmware/pull/22436))
|
||||
|
||||
As you can probably tell by the list of PRs just above, there has been a lot of cleanup and consolidation this cycle when it comes to RGB/LED lighting drivers. The number of changes is too large to list here, but the general theme has been focusing on consistency of naming, both of drivers themselves and their respective implementation and configuration. Most changes only affect keyboard designers -- if you find that your in-development keyboard is no longer building due to naming of defines changing, your best bet is to refer to another board already in the repository which has had the changes applied.
|
||||
|
||||
### Peripheral subsystem enabling ([#22253](https://github.com/qmk/qmk_firmware/pull/22253), [#22448](https://github.com/qmk/qmk_firmware/pull/22448), [#22106](https://github.com/qmk/qmk_firmware/pull/22106)) :id=peripheral-subsystem-enabling
|
||||
|
||||
When enabling peripherals such as I2C, SPI, or Analog/ADC, some required manual inclusion of source files in order to provide driver support, and in some cases, when multiple drivers were using the same underlying peripheral, files were being added to the build multiple times.
|
||||
|
||||
Most systems requiring other peripherals now mark their respective dependencies as "required", allowing the build system to check whether peripherals are necessary before including them in the build rather than having each location enable them manually.
|
||||
|
||||
For a concrete example, users or keyboard designers who previously added `SRC += analog.c` in order to allow for analog readings via an ADC now should specify `ANALOG_DRIVER_REQUIRED = yes` instead. The full list of added options is as follows:
|
||||
|
||||
| New option | Old Equivalent |
|
||||
|--------------------------------|------------------------------------------------------------|
|
||||
| `ANALOG_DRIVER_REQUIRED = yes` | `SRC += analog.c` |
|
||||
| `APA102_DRIVER_REQUIRED = yes` | `SRC += apa102.c` |
|
||||
| `I2C_DRIVER_REQUIRED = yes` | `SRC += i2c_master.c` or `QUANTUM_LIB_SRC += i2c_master.c` |
|
||||
| `SPI_DRIVER_REQUIRED = yes` | `SRC += spi_master.c` or `QUANTUM_LIB_SRC += spi_master.c` |
|
||||
| `UART_DRIVER_REQUIRED = yes` | `SRC += uart.c` |
|
||||
| `WS2812_DRIVER_REQUIRED = yes` | `SRC += ws2812.c` |
|
||||
|
||||
### NKRO on V-USB boards ([#22398](https://github.com/qmk/qmk_firmware/pull/22398)) :id=vusb-nkro
|
||||
|
||||
NKRO is now available for ATmega32A and 328P-based keyboards (including PS2AVRGB/Bootmapper boards), thanks to some internal refactoring and cleanup. To enable it, the process is the same as always - add `NKRO_ENABLE = yes` to your `rules.mk`, then assign and press the `NK_TOGG` keycode to switch modes.
|
||||
|
||||
## Full changelist :id=full-changelist
|
||||
|
||||
Core:
|
||||
* Compilation warning if both `keymap.json` and `keymap.c` exist ([#19939](https://github.com/qmk/qmk_firmware/pull/19939))
|
||||
* [QP] Add support for OLED, variable framebuffer bpp ([#19997](https://github.com/qmk/qmk_firmware/pull/19997))
|
||||
* Generate switch statement helpers for keycode ranges ([#20059](https://github.com/qmk/qmk_firmware/pull/20059))
|
||||
* Chibios SPI driver: allow some SPI pins to be left unassigned ([#20315](https://github.com/qmk/qmk_firmware/pull/20315))
|
||||
* Take care of scroll divisor remainders for PS/2 drag scroll ([#20732](https://github.com/qmk/qmk_firmware/pull/20732))
|
||||
* Add `RGBLIGHT_DEFAULT_ON` macro configuration option ([#20857](https://github.com/qmk/qmk_firmware/pull/20857))
|
||||
* Allow force flush of oled display. ([#20953](https://github.com/qmk/qmk_firmware/pull/20953))
|
||||
* Improve and Cleanup Shutdown callbacks ([#21060](https://github.com/qmk/qmk_firmware/pull/21060))
|
||||
* [Enhancement] QP Getters ([#21171](https://github.com/qmk/qmk_firmware/pull/21171))
|
||||
* Russian typewriter keymap file for popular legacy layout. ([#21174](https://github.com/qmk/qmk_firmware/pull/21174))
|
||||
* Improve directional transition of overlapping mouse keys ([#21494](https://github.com/qmk/qmk_firmware/pull/21494))
|
||||
* Add full solenoid support on split keyboards ([#21583](https://github.com/qmk/qmk_firmware/pull/21583))
|
||||
* Reduce popping during audio initialization using the additive DAC ([#21642](https://github.com/qmk/qmk_firmware/pull/21642))
|
||||
* [Maintenance] USB HID control packet as struct ([#21688](https://github.com/qmk/qmk_firmware/pull/21688))
|
||||
* Bump mouse endpoint packet size to 16 bytes ([#21711](https://github.com/qmk/qmk_firmware/pull/21711))
|
||||
* Allow customizing PWM frequency ([#21717](https://github.com/qmk/qmk_firmware/pull/21717))
|
||||
* Add simpler method for relocating functions to RAM. ([#21804](https://github.com/qmk/qmk_firmware/pull/21804))
|
||||
* Clean up RGB LED type ([#21859](https://github.com/qmk/qmk_firmware/pull/21859))
|
||||
* is31fl3741: Allow changing config register ([#21861](https://github.com/qmk/qmk_firmware/pull/21861))
|
||||
* Add _DEFAULT_ON lighting configuration options ([#21865](https://github.com/qmk/qmk_firmware/pull/21865))
|
||||
* Modify split config is_keyboard_master/left checks. ([#21875](https://github.com/qmk/qmk_firmware/pull/21875))
|
||||
* Remove old `IS_LED_ON/OFF()` macros ([#21878](https://github.com/qmk/qmk_firmware/pull/21878))
|
||||
* ckled2001: driver naming cleanups ([#21890](https://github.com/qmk/qmk_firmware/pull/21890))
|
||||
* aw20216: driver naming cleanups ([#21891](https://github.com/qmk/qmk_firmware/pull/21891))
|
||||
* is31fl3218: driver naming cleanups ([#21892](https://github.com/qmk/qmk_firmware/pull/21892))
|
||||
* is31fl3736: driver naming cleanups ([#21903](https://github.com/qmk/qmk_firmware/pull/21903))
|
||||
* is31fl3737: driver naming cleanups ([#21904](https://github.com/qmk/qmk_firmware/pull/21904))
|
||||
* is31fl3733: driver naming cleanups ([#21905](https://github.com/qmk/qmk_firmware/pull/21905))
|
||||
* Enable RP2040 support for apa102 RGB LED driver ([#21908](https://github.com/qmk/qmk_firmware/pull/21908))
|
||||
* is31fl3731: driver naming cleanups ([#21918](https://github.com/qmk/qmk_firmware/pull/21918))
|
||||
* is31fl3741: driver naming cleanups ([#21929](https://github.com/qmk/qmk_firmware/pull/21929))
|
||||
* refactor: move default RGB/LED matrix #defines ([#21938](https://github.com/qmk/qmk_firmware/pull/21938))
|
||||
* Added flower blooming on RGB Matrix effect ([#21948](https://github.com/qmk/qmk_firmware/pull/21948))
|
||||
* Remove 'Firmware size check does not yet support' message ([#21977](https://github.com/qmk/qmk_firmware/pull/21977))
|
||||
* chibios: mark boot2 bootlader data readonly ([#21986](https://github.com/qmk/qmk_firmware/pull/21986))
|
||||
* Complete RGB Matrix support for IS31FL3218 ([#22004](https://github.com/qmk/qmk_firmware/pull/22004))
|
||||
* Default wear leveling logical size to half backing ([#22006](https://github.com/qmk/qmk_firmware/pull/22006))
|
||||
* chibios: disable RWX segment warning on newer GNU lds ([#22007](https://github.com/qmk/qmk_firmware/pull/22007))
|
||||
* Add and use I2C address defines for ISSI LED drivers ([#22008](https://github.com/qmk/qmk_firmware/pull/22008))
|
||||
* Add and use PWM frequency defines for ISSI LED drivers ([#22009](https://github.com/qmk/qmk_firmware/pull/22009))
|
||||
* directly use object files when linking ELF ([#22025](https://github.com/qmk/qmk_firmware/pull/22025))
|
||||
* Lvgl rate control ([#22049](https://github.com/qmk/qmk_firmware/pull/22049))
|
||||
* Rename CKLED2001 driver to SNLED27351 ([#22071](https://github.com/qmk/qmk_firmware/pull/22071))
|
||||
* Move `PACKED` define to util.h ([#22074](https://github.com/qmk/qmk_firmware/pull/22074))
|
||||
* Simplify more feature driver defines ([#22090](https://github.com/qmk/qmk_firmware/pull/22090))
|
||||
* Update ISSI LED types ([#22099](https://github.com/qmk/qmk_firmware/pull/22099))
|
||||
* Move velocikey to within rgblight ([#22123](https://github.com/qmk/qmk_firmware/pull/22123))
|
||||
* is31fl3218: Add LED Matrix support ([#22126](https://github.com/qmk/qmk_firmware/pull/22126))
|
||||
* Set default board files for uf2boot bootloader ([#22129](https://github.com/qmk/qmk_firmware/pull/22129))
|
||||
* is31fl3736: extract single-color API ([#22133](https://github.com/qmk/qmk_firmware/pull/22133))
|
||||
* is31fl3737/3741: add LED Matrix support ([#22163](https://github.com/qmk/qmk_firmware/pull/22163))
|
||||
* Rename `DRIVER_ADDR_n` defines ([#22200](https://github.com/qmk/qmk_firmware/pull/22200))
|
||||
* New RGB Animations - 4 "Starlight" Animation Variations ([#22212](https://github.com/qmk/qmk_firmware/pull/22212))
|
||||
* QMK Userspace ([#22222](https://github.com/qmk/qmk_firmware/pull/22222))
|
||||
* Dedupe I2C, SPI, UART driver inclusions ([#22253](https://github.com/qmk/qmk_firmware/pull/22253))
|
||||
* Add "AC Next Keyboard Layout Select" consumer usage entry (macOS Globe key) ([#22256](https://github.com/qmk/qmk_firmware/pull/22256))
|
||||
* Separate 6KRO and NKRO report structs ([#22267](https://github.com/qmk/qmk_firmware/pull/22267))
|
||||
* Azoteq IQS5xx support ([#22280](https://github.com/qmk/qmk_firmware/pull/22280))
|
||||
* Add `_flush()` functions to LED drivers ([#22308](https://github.com/qmk/qmk_firmware/pull/22308))
|
||||
* Add `_LED_COUNT` defines to LED drivers ([#22309](https://github.com/qmk/qmk_firmware/pull/22309))
|
||||
* Infer LED DRIVER_COUNT from configured addresses ([#22311](https://github.com/qmk/qmk_firmware/pull/22311))
|
||||
* Added gamma values for ST7735 displays ([#22313](https://github.com/qmk/qmk_firmware/pull/22313))
|
||||
* Consolidate some EEPROM Driver configuration ([#22321](https://github.com/qmk/qmk_firmware/pull/22321))
|
||||
* V-USB: Add generic `send_report()` function ([#22323](https://github.com/qmk/qmk_firmware/pull/22323))
|
||||
* V-USB: Implement `GET_PROTOCOL` and `SET_PROTOCOL` handling ([#22324](https://github.com/qmk/qmk_firmware/pull/22324))
|
||||
* RGB/LED matrix use limits size optimisation ([#22325](https://github.com/qmk/qmk_firmware/pull/22325))
|
||||
* Relocate LED driver init code ([#22365](https://github.com/qmk/qmk_firmware/pull/22365))
|
||||
* WT RGB cleanups ([#22379](https://github.com/qmk/qmk_firmware/pull/22379))
|
||||
* LED drivers: use `PACKED` define from util.h ([#22380](https://github.com/qmk/qmk_firmware/pull/22380))
|
||||
* LED drivers: clean up `SWx`/`CSy` pullup/down resistor config ([#22381](https://github.com/qmk/qmk_firmware/pull/22381))
|
||||
* LED drivers: add defines for PWM and LED control register counts ([#22383](https://github.com/qmk/qmk_firmware/pull/22383))
|
||||
* V-USB: implement NKRO ([#22398](https://github.com/qmk/qmk_firmware/pull/22398))
|
||||
* Allow generic_features to handle subdirectories ([#22400](https://github.com/qmk/qmk_firmware/pull/22400))
|
||||
* Migrate some common features to generic ([#22403](https://github.com/qmk/qmk_firmware/pull/22403))
|
||||
* Remove requirement for `keymap_steno.h` include in keymaps ([#22423](https://github.com/qmk/qmk_firmware/pull/22423))
|
||||
* LED drivers: register naming cleanups ([#22436](https://github.com/qmk/qmk_firmware/pull/22436))
|
||||
* Slight refactor of joystick axis type into typedef ([#22445](https://github.com/qmk/qmk_firmware/pull/22445))
|
||||
* Generalise analog SRC inclusion ([#22448](https://github.com/qmk/qmk_firmware/pull/22448))
|
||||
* Revert "chibios: disable RWX segment warning on newer GNU lds" ([#22469](https://github.com/qmk/qmk_firmware/pull/22469))
|
||||
* chibios: disable RWX segment warning on newer GNU lds ([#22471](https://github.com/qmk/qmk_firmware/pull/22471))
|
||||
|
||||
CLI:
|
||||
* Implement data driven lighting defaults ([#21825](https://github.com/qmk/qmk_firmware/pull/21825))
|
||||
* Generate keymap.json config options more forcefully ([#21960](https://github.com/qmk/qmk_firmware/pull/21960))
|
||||
* Implement data driven dip switches ([#22017](https://github.com/qmk/qmk_firmware/pull/22017))
|
||||
* Improve argument handling of c2json ([#22170](https://github.com/qmk/qmk_firmware/pull/22170))
|
||||
* Support additional split sync items for info.json ([#22193](https://github.com/qmk/qmk_firmware/pull/22193))
|
||||
* CLI refactoring for common build target APIs ([#22221](https://github.com/qmk/qmk_firmware/pull/22221))
|
||||
* Add dd mapping for hardware based split handedness ([#22369](https://github.com/qmk/qmk_firmware/pull/22369))
|
||||
* CLI parallel search updates ([#22525](https://github.com/qmk/qmk_firmware/pull/22525))
|
||||
* Remove duplicates from search results ([#22528](https://github.com/qmk/qmk_firmware/pull/22528))
|
||||
|
||||
Keyboards:
|
||||
* Add KPRepublic/BM40hsrgb rev2 ([#16689](https://github.com/qmk/qmk_firmware/pull/16689))
|
||||
* update to data driven - superseeds part of https://github.com/qmk/qmk… ([#20220](https://github.com/qmk/qmk_firmware/pull/20220))
|
||||
* Modernize `dactyl_manuform/dmote` keyboard ([#20427](https://github.com/qmk/qmk_firmware/pull/20427))
|
||||
* add Skyloong/GK61_V1 keyboard ([#21364](https://github.com/qmk/qmk_firmware/pull/21364))
|
||||
* [Refactor] Make changes to some pins ([#21380](https://github.com/qmk/qmk_firmware/pull/21380))
|
||||
* Add missing fullsize extended default layouts ([#21402](https://github.com/qmk/qmk_firmware/pull/21402))
|
||||
* Add Skyloong/Gk61 PRO keyboard ([#21450](https://github.com/qmk/qmk_firmware/pull/21450))
|
||||
* Added skyloong/Qk21 v1 Number Pad ([#21467](https://github.com/qmk/qmk_firmware/pull/21467))
|
||||
* matchstickworks/southpad - Move files to rev1, add rev2 ([#21574](https://github.com/qmk/qmk_firmware/pull/21574))
|
||||
* partially modernize `dactyl_minidox` ([#21576](https://github.com/qmk/qmk_firmware/pull/21576))
|
||||
* tominabox1/le_chiffre oled rework ([#21611](https://github.com/qmk/qmk_firmware/pull/21611))
|
||||
* Add Skyloong/Gk61_pro_48 keyboard ([#21654](https://github.com/qmk/qmk_firmware/pull/21654))
|
||||
* Adding support for new Waffling60 revision ([#21664](https://github.com/qmk/qmk_firmware/pull/21664))
|
||||
* Leeloo revision 2 updates. ([#21671](https://github.com/qmk/qmk_firmware/pull/21671))
|
||||
* rename og60 to tofu60 ([#21684](https://github.com/qmk/qmk_firmware/pull/21684))
|
||||
* add tofujr v2 keyboard ([#21740](https://github.com/qmk/qmk_firmware/pull/21740))
|
||||
* Rotary numpad ([#21744](https://github.com/qmk/qmk_firmware/pull/21744))
|
||||
* Update era/divine ([#21767](https://github.com/qmk/qmk_firmware/pull/21767))
|
||||
* 1UpKeyboards Pi60 Layout Additions ([#21874](https://github.com/qmk/qmk_firmware/pull/21874))
|
||||
* BIOI keyboards: use core UART driver ([#21879](https://github.com/qmk/qmk_firmware/pull/21879))
|
||||
* Resolve some "Layout should not contain name of keyboard" lint warnings ([#21898](https://github.com/qmk/qmk_firmware/pull/21898))
|
||||
* fc660c/fc980c: clean up actuation point adjustment code ([#21964](https://github.com/qmk/qmk_firmware/pull/21964))
|
||||
* Chromatonemini info json revised to support qmk 0.22.2 ([#21966](https://github.com/qmk/qmk_firmware/pull/21966))
|
||||
* Migrate spi_flash WEAR_LEVELING_DRIVER to info.json ([#21978](https://github.com/qmk/qmk_firmware/pull/21978))
|
||||
* Remove duplication of RP2040 EEPROM defaults ([#21979](https://github.com/qmk/qmk_firmware/pull/21979))
|
||||
* Remove duplication of STM32L432 EEPROM defaults ([#21981](https://github.com/qmk/qmk_firmware/pull/21981))
|
||||
* Migrate spi EEPROM_DRIVER to info.json ([#21991](https://github.com/qmk/qmk_firmware/pull/21991))
|
||||
* Update Keychron Q1v1 ([#21993](https://github.com/qmk/qmk_firmware/pull/21993))
|
||||
* Update Keychron Q2 ([#21994](https://github.com/qmk/qmk_firmware/pull/21994))
|
||||
* Update Keychron Q3 ([#21995](https://github.com/qmk/qmk_firmware/pull/21995))
|
||||
* Update Keychron Q4 ([#21996](https://github.com/qmk/qmk_firmware/pull/21996))
|
||||
* Migrate WEAR_LEVELING_*_SIZE to info.json ([#22010](https://github.com/qmk/qmk_firmware/pull/22010))
|
||||
* Remove duplication of EEPROM defaults ([#22011](https://github.com/qmk/qmk_firmware/pull/22011))
|
||||
* Migrate i2c EEPROM_DRIVER to info.json ([#22013](https://github.com/qmk/qmk_firmware/pull/22013))
|
||||
* Remove config.h which only set DYNAMIC_KEYMAP_LAYER_COUNT ([#22034](https://github.com/qmk/qmk_firmware/pull/22034))
|
||||
* Add community layout support to tofu60 ([#22041](https://github.com/qmk/qmk_firmware/pull/22041))
|
||||
* Update Keychron Q0 ([#22068](https://github.com/qmk/qmk_firmware/pull/22068))
|
||||
* Remove custom ISSI lighting code ([#22073](https://github.com/qmk/qmk_firmware/pull/22073))
|
||||
* add dp3000 rev2 featuring rgblight ([#22084](https://github.com/qmk/qmk_firmware/pull/22084))
|
||||
* Remove ALLOW_WARNINGS and PICO_INTRINSICS_ENABLED ([#22085](https://github.com/qmk/qmk_firmware/pull/22085))
|
||||
* Partially migrate `DYNAMIC_KEYMAP_LAYER_COUNT` ([#22087](https://github.com/qmk/qmk_firmware/pull/22087))
|
||||
* feat(eyeohdesigns/babyv): rgb matrix ([#22105](https://github.com/qmk/qmk_firmware/pull/22105))
|
||||
* input_club/infinity60: remove custom 3731 code, convert to LED Matrix ([#22117](https://github.com/qmk/qmk_firmware/pull/22117))
|
||||
* YMDK Melody96 Break-Up ([#22121](https://github.com/qmk/qmk_firmware/pull/22121))
|
||||
* Remove duplicated rgblight implementation from mxss ([#22122](https://github.com/qmk/qmk_firmware/pull/22122))
|
||||
* KC60 Layout Standardization and Cleanup ([#22125](https://github.com/qmk/qmk_firmware/pull/22125))
|
||||
* Convert adm42 to data driven ([#22144](https://github.com/qmk/qmk_firmware/pull/22144))
|
||||
* Update Drop keyboards for develop ([#22145](https://github.com/qmk/qmk_firmware/pull/22145))
|
||||
* move soda/mango and soda/pocket to magic_force/mf17 and magic_force/mf34 ([#22151](https://github.com/qmk/qmk_firmware/pull/22151))
|
||||
* GMMK2 65% ISO Community Layout Support ([#22152](https://github.com/qmk/qmk_firmware/pull/22152))
|
||||
* Leeloo v2.1 revision 3 updates. ([#22236](https://github.com/qmk/qmk_firmware/pull/22236))
|
||||
* jian/rev1: convert to DIP Switch ([#22248](https://github.com/qmk/qmk_firmware/pull/22248))
|
||||
* Enable linking of encoders to switch within layout macros ([#22264](https://github.com/qmk/qmk_firmware/pull/22264))
|
||||
* Migrate recently introduced sync items ([#22305](https://github.com/qmk/qmk_firmware/pull/22305))
|
||||
* Rename LINE FRIENDS TKL keyboard ([#22310](https://github.com/qmk/qmk_firmware/pull/22310))
|
||||
* feat(mechwild/clunker): new layouts ([#22342](https://github.com/qmk/qmk_firmware/pull/22342))
|
||||
* Remove use of broken split.main ([#22363](https://github.com/qmk/qmk_firmware/pull/22363))
|
||||
* whitefox: remove pointless file ([#22366](https://github.com/qmk/qmk_firmware/pull/22366))
|
||||
* Migrate some EEPROM config to info.json ([#22434](https://github.com/qmk/qmk_firmware/pull/22434))
|
||||
* Remove unnecessary driver counts ([#22435](https://github.com/qmk/qmk_firmware/pull/22435))
|
||||
* Migrate some dip switch config to info.json ([#22437](https://github.com/qmk/qmk_firmware/pull/22437))
|
||||
* Remove userspace keymaps ([#22544](https://github.com/qmk/qmk_firmware/pull/22544))
|
||||
* Stub out community layout directory structure ([#22545](https://github.com/qmk/qmk_firmware/pull/22545))
|
||||
* Remove symbolic linked userspace folder ([#22548](https://github.com/qmk/qmk_firmware/pull/22548))
|
||||
|
||||
Keyboard fixes:
|
||||
* fix unxmaal for 60_iso ([#21975](https://github.com/qmk/qmk_firmware/pull/21975))
|
||||
* Fix input_club/k_type when RGB Matrix disabled ([#22021](https://github.com/qmk/qmk_firmware/pull/22021))
|
||||
* Fixup snes_macropad on develop ([#22444](https://github.com/qmk/qmk_firmware/pull/22444))
|
||||
* Fix missed shutdown callbacks ([#22549](https://github.com/qmk/qmk_firmware/pull/22549))
|
||||
|
||||
Others:
|
||||
* Implement data driven wear leveling ([#21906](https://github.com/qmk/qmk_firmware/pull/21906))
|
||||
* More data driven RGB/LED Matrix config ([#21939](https://github.com/qmk/qmk_firmware/pull/21939))
|
||||
* Update WS2812 docs and add APA102 docs ([#22106](https://github.com/qmk/qmk_firmware/pull/22106))
|
||||
* Add DD mappings for locking switch ([#22242](https://github.com/qmk/qmk_firmware/pull/22242))
|
||||
|
||||
Bugs:
|
||||
* Improve test invocation, fix Retro Shift bugs, and add Auto+Retro Shift test cases ([#15889](https://github.com/qmk/qmk_firmware/pull/15889))
|
||||
* [Bugfix] `qp_ellipse` overflow ([#19005](https://github.com/qmk/qmk_firmware/pull/19005))
|
||||
* Cater for ECC failures in EFL wear-leveling. ([#19749](https://github.com/qmk/qmk_firmware/pull/19749))
|
||||
* Fix OSM on a OSL activated layer ([#20410](https://github.com/qmk/qmk_firmware/pull/20410))
|
||||
* Fixed WB32 MCU remote wakeup issue ([#20863](https://github.com/qmk/qmk_firmware/pull/20863))
|
||||
* Optimize the additive DAC code, fixing performance-related hangs ([#21662](https://github.com/qmk/qmk_firmware/pull/21662))
|
||||
* [Enhancement] Improvements for debounce test coverage + bug fixes for sym_defer_g and sym_eager_pr ([#21667](https://github.com/qmk/qmk_firmware/pull/21667))
|
||||
* fix: make clicky delay silent ([#21866](https://github.com/qmk/qmk_firmware/pull/21866))
|
||||
* Add `mousekey.h` include to `quantum.h` ([#21897](https://github.com/qmk/qmk_firmware/pull/21897))
|
||||
* Fix default layer value in eeconfig_init ([#21909](https://github.com/qmk/qmk_firmware/pull/21909))
|
||||
* Add RTC IRQ Priority to RP2040 board files ([#21926](https://github.com/qmk/qmk_firmware/pull/21926))
|
||||
* Update AW20216S LED type ([#22072](https://github.com/qmk/qmk_firmware/pull/22072))
|
||||
* LED/RGB Matrix: prefix driver defines ([#22088](https://github.com/qmk/qmk_firmware/pull/22088))
|
||||
* RGBLight/Backlight: add prefixed driver defines ([#22089](https://github.com/qmk/qmk_firmware/pull/22089))
|
||||
* Fix lower cpi bound on PMW33XX ([#22108](https://github.com/qmk/qmk_firmware/pull/22108))
|
||||
* Fix parsing/validation for 21939 ([#22148](https://github.com/qmk/qmk_firmware/pull/22148))
|
||||
* is31fl3733: complete LED Matrix support ([#22149](https://github.com/qmk/qmk_firmware/pull/22149))
|
||||
* Fix memory leak in realloc failure handling ([#22188](https://github.com/qmk/qmk_firmware/pull/22188))
|
||||
* avrdude: Version 7.2 changes the text output ([#22235](https://github.com/qmk/qmk_firmware/pull/22235))
|
||||
* Resolve invalid keyboard alias targets ([#22239](https://github.com/qmk/qmk_firmware/pull/22239))
|
||||
* Prep work for NKRO report separation ([#22268](https://github.com/qmk/qmk_firmware/pull/22268))
|
||||
* ChibiOS pin defs: use only vendor if present ([#22297](https://github.com/qmk/qmk_firmware/pull/22297))
|
||||
* Fix invalid LED driver config ([#22312](https://github.com/qmk/qmk_firmware/pull/22312))
|
||||
* Fix compilation error when led/rgb process limit is zero. ([#22328](https://github.com/qmk/qmk_firmware/pull/22328))
|
||||
* V-USB: Fix `GET_IDLE/SET_IDLE` ([#22332](https://github.com/qmk/qmk_firmware/pull/22332))
|
||||
* QP getters correction ([#22357](https://github.com/qmk/qmk_firmware/pull/22357))
|
||||
* Fix 'to_c' for config.h mappings ([#22364](https://github.com/qmk/qmk_firmware/pull/22364))
|
||||
* snled27351: fix missing `i2c_init()` ([#22446](https://github.com/qmk/qmk_firmware/pull/22446))
|
||||
* Move BACKLIGHT_PWM_PERIOD to correct docs section ([#22480](https://github.com/qmk/qmk_firmware/pull/22480))
|
||||
* `qmk find`: Fix failure with multiple filters ([#22497](https://github.com/qmk/qmk_firmware/pull/22497))
|
||||
* Fix `qmk find` failure due to circular imports ([#22523](https://github.com/qmk/qmk_firmware/pull/22523))
|
367
docs/ChangeLog/20240225.md
Normal file
367
docs/ChangeLog/20240225.md
Normal file
@@ -0,0 +1,367 @@
|
||||
# QMK Breaking Changes - 2024 February 25 Changelog
|
||||
|
||||
## Notable Features :id=notable-features
|
||||
|
||||
_0.24.0_ is mainly a maintenance release of QMK Firmware -- as per last few breaking changes cycles, there have been a lot of behind-the-scenes changes, mainly:
|
||||
|
||||
* continued purge of user keymaps
|
||||
* migration of RGB matrix configuration into `info.json` files
|
||||
* standardisation of `LAYOUT` naming
|
||||
* keyboard relocations
|
||||
* addressing technical debt
|
||||
|
||||
## Changes Requiring User Action :id=changes-requiring-user-action
|
||||
|
||||
### Windows Driver Changes ([QMK Toolbox 0.3.0 Release](https://github.com/qmk/qmk_toolbox/releases/tag/0.3.0))
|
||||
|
||||
Flashing keyboards that target `atmel-dfu` or `qmk-dfu` on Windows using `qmk flash` or QMK Toolbox have traditionally used _libusb_ for access to the DFU USB device. Since QMK Toolbox 0.3.0, this has changed to WinUSB.
|
||||
|
||||
If you update QMK Toolbox or update QMK MSYS, you may find that flashing Atmel DFU keyboards no longer functions as intended. If you strike such issues when flashing new firmware, you will need to replace the _libusb_ driver with _WinUSB_ using Zadig. You can follow the [Recovering from Installation to Wrong Device](driver_installation_zadig.md#recovering-from-installation-to-wrong-device) instructions to replace the driver associated with the Atmel DFU bootloader, skipping the section about removal as Zadig will safely replace the driver instead. Please ensure your keyboard is in bootloader mode and has _libusb_ as the existing driver before attempting to use Zadig to replace the driver. If instead you see _HidUsb_ you're not in bootloader mode and should not continue with driver replacement.
|
||||
|
||||
### Updated Keyboard Codebases :id=updated-keyboard-codebases
|
||||
|
||||
One note with updated keyboard names -- historical keyboard names are still considered valid when using [External Userspace](newbs_external_userspace.md) for builds. If you're already using External Userspace, you do not need to move your keymap inside your repository.
|
||||
|
||||
| Old Keyboard Name | New Keyboard Name |
|
||||
|-------------------------|---------------------------------|
|
||||
| enter67 | kezewa/enter67 |
|
||||
| enter80 | kezewa/enter80 |
|
||||
| epoch80 | kbdfans/epoch80 |
|
||||
| eu_isolation | p3d/eu_isolation |
|
||||
| flygone60/rev3 | shandoncodes/flygone60/rev3 |
|
||||
| hub16 | joshajohnson/hub16 |
|
||||
| hub20 | joshajohnson/hub20 |
|
||||
| jm60 | kbdfans/jm60 |
|
||||
| kira75 | kira/kira75 |
|
||||
| kira80 | kira/kira80 |
|
||||
| kmac | kbdmania/kmac |
|
||||
| kmac_pad | kbdmania/kmac_pad |
|
||||
| kudox/columner | kumaokobo/kudox/columner |
|
||||
| kudox/rev1 | kumaokobo/kudox/rev1 |
|
||||
| kudox/rev2 | kumaokobo/kudox/rev2 |
|
||||
| kudox/rev3 | kumaokobo/kudox/rev3 |
|
||||
| kudox_full/rev1 | kumaokobo/kudox_full/rev1 |
|
||||
| kudox_game | kumaokobo/kudox_game |
|
||||
| kudox_game/rev1 | kumaokobo/kudox_game/rev1 |
|
||||
| kudox_game/rev2 | kumaokobo/kudox_game/rev2 |
|
||||
| laser_ninja/pumpkin_pad | laser_ninja/pumpkinpad |
|
||||
| late9/rev1 | rookiebwoy/late9/rev1 |
|
||||
| lefty | smoll/lefty |
|
||||
| lefty/rev1 | smoll/lefty/rev1 |
|
||||
| lefty/rev2 | smoll/lefty/rev2 |
|
||||
| lpad | laneware/lpad |
|
||||
| lw67 | laneware/lw67 |
|
||||
| lw75 | laneware/lw75 |
|
||||
| macro1 | laneware/macro1 |
|
||||
| macro3 | handwired/macro3 |
|
||||
| miniaxe | kagizaraya/miniaxe |
|
||||
| mino/hotswap | shandoncodes/mino/hotswap |
|
||||
| mino_plus/hotswap | shandoncodes/mino_plus/hotswap |
|
||||
| mino_plus/soldered | shandoncodes/mino_plus/soldered |
|
||||
| mnk1800s | monokei/mnk1800s |
|
||||
| mnk50 | monokei/mnk50 |
|
||||
| mnk75 | monokei/mnk75 |
|
||||
| moonlander | zsa/moonlander |
|
||||
| neopad/rev1 | rookiebwoy/neopad/rev1 |
|
||||
| pico/65keys | kumaokobo/pico/65keys |
|
||||
| pico/70keys | kumaokobo/pico/70keys |
|
||||
| pw88 | smoll/pw88 |
|
||||
| q4z | p3d/q4z |
|
||||
| raindrop | laneware/raindrop |
|
||||
| redox_w | redox/wireless |
|
||||
| riot_pad | shandoncodes/riot_pad |
|
||||
| spacey | p3d/spacey |
|
||||
| synapse | p3d/synapse |
|
||||
| tw40 | p3d/tw40 |
|
||||
| w1_at | geonworks/w1_at |
|
||||
| z12 | zigotica/z12 |
|
||||
| z34 | zigotica/z34 |
|
||||
|
||||
## Notable core changes :id=notable-core
|
||||
|
||||
### Renaming Arduino-style GPIO pin functions ([#23085](https://github.com/qmk/qmk_firmware/pull/23085), [#23093](https://github.com/qmk/qmk_firmware/pull/23093)) :id=gpio-rename
|
||||
|
||||
QMK has long used Arduino-style GPIO naming conventions. This has been confusing for users, as over time they've had new variations added, as well as users mistakenly thinking that QMK supports the rest of the Arduino ecosystem.
|
||||
|
||||
The decision was made to rename the GPIO manipulation functions with ones matching QMK Firmware's code styling.
|
||||
|
||||
| Old | New |
|
||||
|------------------------------|---------------------------------------|
|
||||
| `setPinInput(pin)` | `gpio_set_pin_input(pin)` |
|
||||
| `setPinInputHigh(pin)` | `gpio_set_pin_input_high(pin)` |
|
||||
| `setPinInputLow(pin)` | `gpio_set_pin_input_low(pin)` |
|
||||
| `setPinOutput(pin)` | `gpio_set_pin_output(pin)` |
|
||||
| `setPinOutputPushPull(pin)` | `gpio_set_pin_output_push_pull(pin)` |
|
||||
| `setPinOutputOpenDrain(pin)` | `gpio_set_pin_output_open_drain(pin)` |
|
||||
| `writePinHigh(pin)` | `gpio_write_pin_high(pin)` |
|
||||
| `writePinLow(pin)` | `gpio_write_pin_low(pin)` |
|
||||
| `writePin(pin, level)` | `gpio_write_pin(pin, level)` |
|
||||
| `readPin(pin)` | `gpio_read_pin(pin)` |
|
||||
| `togglePin(pin)` | `gpio_toggle_pin(pin)` |
|
||||
|
||||
### I2C driver API Changes ([#22905](https://github.com/qmk/qmk_firmware/pull/22905))
|
||||
|
||||
Much like the GPIO refactoring, I2C APIs were also updated to conform to QMK naming standards. This is largely irrelevant to people using subsystem abstractions such as touchpads or RGB lighting, and only affects people manually communicating with other peripherals.
|
||||
|
||||
| Old API | New API |
|
||||
|--------------------|--------------------------|
|
||||
| `i2c_readReg()` | `i2c_read_register()` |
|
||||
| `i2c_readReg16()` | `i2c_read_register16()` |
|
||||
| `i2c_writeReg()` | `i2c_write_register()` |
|
||||
| `i2c_writeReg16()` | `i2c_write_register16()` |
|
||||
|
||||
### Renaming _Bootmagic Lite_ => _Bootmagic_ ([#22970](https://github.com/qmk/qmk_firmware/pull/22970), [#22979](https://github.com/qmk/qmk_firmware/pull/22979)) :id=bootmagic-rename
|
||||
|
||||
Bootmagic "Lite" had no real meaning once the historical Bootmagic "Full" was deprecated and removed. Any references to _Bootmagic Lite_ should now just refer to _Bootmagic_. We hope we got the majority of the code and the documentation, so if you find any more, let us know!
|
||||
|
||||
### Threshold for automatic mouse layer activation ([#21398](https://github.com/qmk/qmk_firmware/pull/21398)) :id=auto-mouse-layer
|
||||
|
||||
In some cases, accidental automatic activation of the mouse layer made it difficult to continue typing, such as when brushing across a trackball. `AUTO_MOUSE_THRESHOLD` is now a configurable option in `config.h` which allows for specifying what the movement threshold is before automatically activating the mouse layer.
|
||||
|
||||
### DIP Switch Mapping ([#22543](https://github.com/qmk/qmk_firmware/pull/22543)) :id=dip-switch-map
|
||||
|
||||
Much like Encoder Mapping, DIP Switch Mapping allows for specifying a table of actions to execute when a DIP switch state changes. See the [DIP Switch Documentation](feature_dip_switch.md#dip-switch-map) for more information.
|
||||
|
||||
```c
|
||||
#if defined(DIP_SWITCH_MAP_ENABLE)
|
||||
const uint16_t PROGMEM dip_switch_map[NUM_DIP_SWITCHES][NUM_DIP_STATES] = {
|
||||
DIP_SWITCH_OFF_ON(DF(0), DF(1)),
|
||||
DIP_SWITCH_OFF_ON(EC_NORM, EC_SWAP)
|
||||
};
|
||||
#endif
|
||||
```
|
||||
|
||||
### Quantum Painter updates ([#18521](https://github.com/qmk/qmk_firmware/pull/18521), [#20645](https://github.com/qmk/qmk_firmware/pull/20645), [#22358](https://github.com/qmk/qmk_firmware/pull/22358)) :id=qp-updates
|
||||
|
||||
Quantum Painter picked up support for the following:
|
||||
|
||||
* ILI9486 displays
|
||||
* SSD1306 displays, including smaller OLEDs
|
||||
* Native panel pixel format support for fonts
|
||||
|
||||
Quantum Painter now supports the majority of common OLED panels supported by the basic OLED driver, so if you're using an ARM-based board you may find Quantum Painter a much more feature-rich API in comparison.
|
||||
|
||||
## Full changelist :id=full-changelist
|
||||
|
||||
Core:
|
||||
* [Driver] ILI9486 on Quantum Painter ([#18521](https://github.com/qmk/qmk_firmware/pull/18521))
|
||||
* Insert delay between shifted chars in send_string_with_delay ([#19280](https://github.com/qmk/qmk_firmware/pull/19280))
|
||||
* [QP] Native palette support for fonts ([#20645](https://github.com/qmk/qmk_firmware/pull/20645))
|
||||
* I2C driver cleanup ([#21273](https://github.com/qmk/qmk_firmware/pull/21273))
|
||||
* Add option for auto mouse movement threshold ([#21398](https://github.com/qmk/qmk_firmware/pull/21398))
|
||||
* Add Canadian French input locale ([#21456](https://github.com/qmk/qmk_firmware/pull/21456))
|
||||
* Add encoder abstraction. ([#21548](https://github.com/qmk/qmk_firmware/pull/21548))
|
||||
* Converted RGB matrix to use last_input_activity_elapsed(). ([#21687](https://github.com/qmk/qmk_firmware/pull/21687))
|
||||
* Ignore space cadet key release when caps word is active ([#21721](https://github.com/qmk/qmk_firmware/pull/21721))
|
||||
* Add OS detection callbacks ([#21777](https://github.com/qmk/qmk_firmware/pull/21777))
|
||||
* joystick weights ([#21883](https://github.com/qmk/qmk_firmware/pull/21883))
|
||||
* Add RGB matrix & LED Matrix support for IS31FL3729 ([#21944](https://github.com/qmk/qmk_firmware/pull/21944))
|
||||
* dac_additive: Decouple the buffer length from the waveform length ([#22276](https://github.com/qmk/qmk_firmware/pull/22276))
|
||||
* Add missing rgb matrix default parameters ([#22281](https://github.com/qmk/qmk_firmware/pull/22281))
|
||||
* Remove console out endpoint ([#22304](https://github.com/qmk/qmk_firmware/pull/22304))
|
||||
* Add ADC support STM32L4xx and STM32G4xx series MCUs ([#22341](https://github.com/qmk/qmk_firmware/pull/22341))
|
||||
* Add QP support for smaller OLED displays and SSD1306 ([#22358](https://github.com/qmk/qmk_firmware/pull/22358))
|
||||
* Add Imera converter ([#22419](https://github.com/qmk/qmk_firmware/pull/22419))
|
||||
* LED drivers: refactor page selection ([#22518](https://github.com/qmk/qmk_firmware/pull/22518))
|
||||
* Rework RGBLight driver system ([#22529](https://github.com/qmk/qmk_firmware/pull/22529))
|
||||
* Add `APA102_LED_COUNT` define ([#22530](https://github.com/qmk/qmk_firmware/pull/22530))
|
||||
* Add latam spanish headers ([#22542](https://github.com/qmk/qmk_firmware/pull/22542))
|
||||
* Keymap introspection for Dip Switches ([#22543](https://github.com/qmk/qmk_firmware/pull/22543))
|
||||
* Add basic presence check for cirque trackpad. ([#22546](https://github.com/qmk/qmk_firmware/pull/22546))
|
||||
* Rename `RGBLED_NUM` -> `RGBLIGHT_LED_COUNT` ([#22570](https://github.com/qmk/qmk_firmware/pull/22570))
|
||||
* LED drivers: change "TWI" to "I2C" ([#22617](https://github.com/qmk/qmk_firmware/pull/22617))
|
||||
* LED drivers: extract IS31FL3742A from IS31COMMON ([#22620](https://github.com/qmk/qmk_firmware/pull/22620))
|
||||
* Align Dip Switch feature ([#22625](https://github.com/qmk/qmk_firmware/pull/22625))
|
||||
* LED/RGB Matrix: add header for drivers ([#22628](https://github.com/qmk/qmk_firmware/pull/22628))
|
||||
* LED drivers: extract IS31FL3743A from IS31COMMON ([#22635](https://github.com/qmk/qmk_firmware/pull/22635))
|
||||
* LED drivers: extract IS31FL3745 from IS31COMMON ([#22636](https://github.com/qmk/qmk_firmware/pull/22636))
|
||||
* LED drivers: extract IS31FL3746A from IS31COMMON ([#22637](https://github.com/qmk/qmk_firmware/pull/22637))
|
||||
* Update keyboard LED driver configs ([#22638](https://github.com/qmk/qmk_firmware/pull/22638))
|
||||
* Solid reactive: improve fading effect ([#22656](https://github.com/qmk/qmk_firmware/pull/22656))
|
||||
* Remove redundant RGB/LED matrix eeconfig init ([#22673](https://github.com/qmk/qmk_firmware/pull/22673))
|
||||
* Remove redundant rgblight eeconfig init ([#22674](https://github.com/qmk/qmk_firmware/pull/22674))
|
||||
* Remove redundant steno eeconfig init ([#22680](https://github.com/qmk/qmk_firmware/pull/22680))
|
||||
* Rename `LED_DISABLE_WHEN_USB_SUSPENDED` -> `LED_MATRIX_SLEEP` ([#22681](https://github.com/qmk/qmk_firmware/pull/22681))
|
||||
* Rename `RGB_DISABLE_WHEN_USB_SUSPENDED` -> `RGB_MATRIX_SLEEP` ([#22682](https://github.com/qmk/qmk_firmware/pull/22682))
|
||||
* Align VUSB suspend protocol logic ([#22688](https://github.com/qmk/qmk_firmware/pull/22688))
|
||||
* [Audio] Enable Complementary output for PWM Hardware driver ([#22726](https://github.com/qmk/qmk_firmware/pull/22726))
|
||||
* Remove redundant audio eeconfig init ([#22736](https://github.com/qmk/qmk_firmware/pull/22736))
|
||||
* Align location of tap dance keycode ([#22742](https://github.com/qmk/qmk_firmware/pull/22742))
|
||||
* Align `SPLIT_HAND_MATRIX_GRID` left/right logic with `SPLIT_HAND_PIN` ([#22775](https://github.com/qmk/qmk_firmware/pull/22775))
|
||||
* [CI] Regenerate Files ([#22795](https://github.com/qmk/qmk_firmware/pull/22795))
|
||||
* Remove IS31FLCOMMON code ([#22800](https://github.com/qmk/qmk_firmware/pull/22800))
|
||||
* Cirque reachable calibration aide ([#22803](https://github.com/qmk/qmk_firmware/pull/22803))
|
||||
* LED drivers: rename "simple" to "mono" ([#22814](https://github.com/qmk/qmk_firmware/pull/22814))
|
||||
* is31fl3733: change `write_register()` return type to `void` ([#22824](https://github.com/qmk/qmk_firmware/pull/22824))
|
||||
* snled27351: change `write_register()` return type to `void` ([#22825](https://github.com/qmk/qmk_firmware/pull/22825))
|
||||
* apa102: cleanups ([#22826](https://github.com/qmk/qmk_firmware/pull/22826))
|
||||
* Remove PWM advanced check for WS2812 driver ([#22830](https://github.com/qmk/qmk_firmware/pull/22830))
|
||||
* Allow ChibiOS `SIO` driver for `UART` driver ([#22839](https://github.com/qmk/qmk_firmware/pull/22839))
|
||||
* LED drivers: more formatting ([#22865](https://github.com/qmk/qmk_firmware/pull/22865))
|
||||
* LED drivers: change `write_pwm_buffer()` return type to `void` ([#22869](https://github.com/qmk/qmk_firmware/pull/22869))
|
||||
* [CI] Regenerate Files ([#22872](https://github.com/qmk/qmk_firmware/pull/22872))
|
||||
* LED drivers: switch to i2c_writeReg() ([#22878](https://github.com/qmk/qmk_firmware/pull/22878))
|
||||
* LED drivers: remove `write_pwm_buffer()` from public API ([#22884](https://github.com/qmk/qmk_firmware/pull/22884))
|
||||
* i2c: rename read/write register functions ([#22905](https://github.com/qmk/qmk_firmware/pull/22905))
|
||||
* LED drivers: update I2C API usage ([#22951](https://github.com/qmk/qmk_firmware/pull/22951))
|
||||
* LED drivers: create structs to hold PWM/scaling buffers ([#22955](https://github.com/qmk/qmk_firmware/pull/22955))
|
||||
* Migrate and remove deprecated debug utils ([#22961](https://github.com/qmk/qmk_firmware/pull/22961))
|
||||
* Remove call to removed i2c function in azoteq driver ([#22966](https://github.com/qmk/qmk_firmware/pull/22966))
|
||||
* Tidy up print/debug logging headers ([#22969](https://github.com/qmk/qmk_firmware/pull/22969))
|
||||
* Begin removal of bootmagic lite terminology ([#22970](https://github.com/qmk/qmk_firmware/pull/22970))
|
||||
* LED drivers: place I2C addresses into an array ([#22975](https://github.com/qmk/qmk_firmware/pull/22975))
|
||||
* Removal of bootmagic lite terminology ([#22979](https://github.com/qmk/qmk_firmware/pull/22979))
|
||||
* Init pins for Analog Joystick sensor ([#22985](https://github.com/qmk/qmk_firmware/pull/22985))
|
||||
* Workaround for G431 eeprom emulation ([#23002](https://github.com/qmk/qmk_firmware/pull/23002))
|
||||
* is31fl3741: split PWM and scaling buffers ([#23049](https://github.com/qmk/qmk_firmware/pull/23049))
|
||||
* LED drivers: update PWM register defines for `g_<driver>_leds` ([#23052](https://github.com/qmk/qmk_firmware/pull/23052))
|
||||
* LED drivers: add support for shutdown pin ([#23058](https://github.com/qmk/qmk_firmware/pull/23058))
|
||||
* AW20216S: combine EN pin defines ([#23067](https://github.com/qmk/qmk_firmware/pull/23067))
|
||||
* Update naming convention for GPIO control macros ([#23085](https://github.com/qmk/qmk_firmware/pull/23085))
|
||||
* Update GPIO macro usages in core ([#23093](https://github.com/qmk/qmk_firmware/pull/23093))
|
||||
* OS Detection - Entire file should not be wrapped with ifdef ([#23108](https://github.com/qmk/qmk_firmware/pull/23108))
|
||||
* IS31FL3729 updates ([#23109](https://github.com/qmk/qmk_firmware/pull/23109))
|
||||
* Nix shell updates (Nixpkgs 2024-02-23, QMK CLI 1.1.5) ([#23143](https://github.com/qmk/qmk_firmware/pull/23143))
|
||||
|
||||
CLI:
|
||||
* [Refactor] `qmk find` ([#21096](https://github.com/qmk/qmk_firmware/pull/21096))
|
||||
* [Refactor] Break `QGFImageFile`'s `_save` function into smaller pieces ([#21124](https://github.com/qmk/qmk_firmware/pull/21124))
|
||||
* [Enhancement] Prepare for `SyntaxWarning` ([#22562](https://github.com/qmk/qmk_firmware/pull/22562))
|
||||
* Flag invalid keyboard features during lint ([#22832](https://github.com/qmk/qmk_firmware/pull/22832))
|
||||
|
||||
Submodule updates:
|
||||
* chore(chibios-contrib): sync with chibios-21.11.x ([#22560](https://github.com/qmk/qmk_firmware/pull/22560))
|
||||
|
||||
Keyboards:
|
||||
* Move `redox_w` into `redox` ([#21448](https://github.com/qmk/qmk_firmware/pull/21448))
|
||||
* null ST110R2.1 (SaikouType) basic support with layouts ([#21623](https://github.com/qmk/qmk_firmware/pull/21623))
|
||||
* New keyboard addition: Orthograph ([#21770](https://github.com/qmk/qmk_firmware/pull/21770))
|
||||
* Add Olly JF Rev.2 ([#21775](https://github.com/qmk/qmk_firmware/pull/21775))
|
||||
* Cleanup Satisfaction75 Firmware and add new revisions ([#22082](https://github.com/qmk/qmk_firmware/pull/22082))
|
||||
* Migrate dynamic_keymap.layer_count < 4 where requried ([#22091](https://github.com/qmk/qmk_firmware/pull/22091))
|
||||
* Bastard Keyboards: Add support for Dilemma v2 (3x5+3) ([#22185](https://github.com/qmk/qmk_firmware/pull/22185))
|
||||
* Karn: correct layout data ([#22201](https://github.com/qmk/qmk_firmware/pull/22201))
|
||||
* zk3mod : added OLED ([#22303](https://github.com/qmk/qmk_firmware/pull/22303))
|
||||
* Adds support for the Iron180 V2 PCBs ([#22314](https://github.com/qmk/qmk_firmware/pull/22314))
|
||||
* Add 5x13 and 6x13 ortho community layouts ([#22315](https://github.com/qmk/qmk_firmware/pull/22315))
|
||||
* Cipulot refactoring ([#22368](https://github.com/qmk/qmk_firmware/pull/22368))
|
||||
* Remove era/klein ([#22384](https://github.com/qmk/qmk_firmware/pull/22384))
|
||||
* consolidate firmware folder in smoll parent folder ([#22401](https://github.com/qmk/qmk_firmware/pull/22401))
|
||||
* `keycapsss/plaid_pad`: switch to encoder map ([#22474](https://github.com/qmk/qmk_firmware/pull/22474))
|
||||
* Add EE-AT and move W1-AT under geonworks ([#22526](https://github.com/qmk/qmk_firmware/pull/22526))
|
||||
* refactor: projectcain/vault35 ([#22558](https://github.com/qmk/qmk_firmware/pull/22558))
|
||||
* Update Q5 ([#22575](https://github.com/qmk/qmk_firmware/pull/22575))
|
||||
* Update Q7 ([#22577](https://github.com/qmk/qmk_firmware/pull/22577))
|
||||
* Update Q8 ([#22578](https://github.com/qmk/qmk_firmware/pull/22578))
|
||||
* Update Q9 ([#22579](https://github.com/qmk/qmk_firmware/pull/22579))
|
||||
* Remove "empty" files ([#22603](https://github.com/qmk/qmk_firmware/pull/22603))
|
||||
* Rename Pumpkin Pad to Pumkinpad ([#22651](https://github.com/qmk/qmk_firmware/pull/22651))
|
||||
* Noodlepad Additions and Updates ([#22701](https://github.com/qmk/qmk_firmware/pull/22701))
|
||||
* Refactor: move miniaxe into kagizaraya ([#22708](https://github.com/qmk/qmk_firmware/pull/22708))
|
||||
* Refactor: move keyboards into zigotica folder ([#22709](https://github.com/qmk/qmk_firmware/pull/22709))
|
||||
* Refactor: move keyboards into laneware folder ([#22710](https://github.com/qmk/qmk_firmware/pull/22710))
|
||||
* Refactor: move keyboards into kezewa ([#22712](https://github.com/qmk/qmk_firmware/pull/22712))
|
||||
* Refactor: move keyboards into kbdmania folder ([#22714](https://github.com/qmk/qmk_firmware/pull/22714))
|
||||
* Refactor: move keyboards into monokei folder ([#22715](https://github.com/qmk/qmk_firmware/pull/22715))
|
||||
* Refactor: move keyboards into kumaokobo ([#22719](https://github.com/qmk/qmk_firmware/pull/22719))
|
||||
* Updating NCC1701KB and adding via support ([#22721](https://github.com/qmk/qmk_firmware/pull/22721))
|
||||
* Move Moonlander to ZSA folder ([#22740](https://github.com/qmk/qmk_firmware/pull/22740))
|
||||
* Refactor: group shandoncodes keyboards ([#22743](https://github.com/qmk/qmk_firmware/pull/22743))
|
||||
* Refactor: group rookiebwoy keyboards ([#22745](https://github.com/qmk/qmk_firmware/pull/22745))
|
||||
* Default folder correction for kumaokobo ([#22750](https://github.com/qmk/qmk_firmware/pull/22750))
|
||||
* Default folder correction for rookiebwoy ([#22753](https://github.com/qmk/qmk_firmware/pull/22753))
|
||||
* Refactor: move macro3 into handwired folder ([#22759](https://github.com/qmk/qmk_firmware/pull/22759))
|
||||
* Refactor: group kira keyboards ([#22760](https://github.com/qmk/qmk_firmware/pull/22760))
|
||||
* Refactor: group hub keyboards ([#22762](https://github.com/qmk/qmk_firmware/pull/22762))
|
||||
* Refactor: move p3d keyboards ([#22763](https://github.com/qmk/qmk_firmware/pull/22763))
|
||||
* Refactor: group kbdfans keyboards ([#22764](https://github.com/qmk/qmk_firmware/pull/22764))
|
||||
* Remove incorrect use of WS2812_PIO_USE_PIO1 ([#22771](https://github.com/qmk/qmk_firmware/pull/22771))
|
||||
* Migrate LED Matrix config to info.json ([#22792](https://github.com/qmk/qmk_firmware/pull/22792))
|
||||
* Migrate RGB Matrix config to info.json - [0-9] ([#22797](https://github.com/qmk/qmk_firmware/pull/22797))
|
||||
* Migrate RGB Matrix config to info.json - A ([#22798](https://github.com/qmk/qmk_firmware/pull/22798))
|
||||
* Late9 keymaps update, added VIA support ([#22801](https://github.com/qmk/qmk_firmware/pull/22801))
|
||||
* Migrate RGB Matrix config to info.json - B ([#22806](https://github.com/qmk/qmk_firmware/pull/22806))
|
||||
* Migrate RGB Matrix config to info.json - C ([#22807](https://github.com/qmk/qmk_firmware/pull/22807))
|
||||
* Migrate RGB Matrix config to info.json - EF ([#22808](https://github.com/qmk/qmk_firmware/pull/22808))
|
||||
* Migrate RGB Matrix config to info.json - D ([#22811](https://github.com/qmk/qmk_firmware/pull/22811))
|
||||
* H87g2 updates ([#22819](https://github.com/qmk/qmk_firmware/pull/22819))
|
||||
* WT boards: extract `g_is31fl3736_leds` from wt_mono_backlight ([#22823](https://github.com/qmk/qmk_firmware/pull/22823))
|
||||
* Migrate RGB Matrix config to info.json - G ([#22859](https://github.com/qmk/qmk_firmware/pull/22859))
|
||||
* Use existing columns for 3x5 layout ([#22860](https://github.com/qmk/qmk_firmware/pull/22860))
|
||||
* Migrate RGB Matrix config to info.json - H ([#22861](https://github.com/qmk/qmk_firmware/pull/22861))
|
||||
* Migrate RGB Matrix config to info.json - J ([#22862](https://github.com/qmk/qmk_firmware/pull/22862))
|
||||
* Migrate RGB Matrix config to info.json - I ([#22863](https://github.com/qmk/qmk_firmware/pull/22863))
|
||||
* Migrate RGB Matrix config to info.json - L ([#22864](https://github.com/qmk/qmk_firmware/pull/22864))
|
||||
* Migrate RGB Matrix config to info.json - NOPQ ([#22866](https://github.com/qmk/qmk_firmware/pull/22866))
|
||||
* Migrate RGB Matrix config to info.json - XZY ([#22879](https://github.com/qmk/qmk_firmware/pull/22879))
|
||||
* Zed65/no_backlight/cor65 correct data layout ([#22898](https://github.com/qmk/qmk_firmware/pull/22898))
|
||||
* Migrate RGB Matrix config to info.json - M ([#22908](https://github.com/qmk/qmk_firmware/pull/22908))
|
||||
* Migrate RGB Matrix config to info.json - RS ([#22909](https://github.com/qmk/qmk_firmware/pull/22909))
|
||||
* Migrate RGB Matrix config to info.json - TUVW ([#22910](https://github.com/qmk/qmk_firmware/pull/22910))
|
||||
* Migrate RGB Matrix config to info.json - K ([#22911](https://github.com/qmk/qmk_firmware/pull/22911))
|
||||
* Remove `LAYOUTS_HAS_RGB` ([#22917](https://github.com/qmk/qmk_firmware/pull/22917))
|
||||
* Migrate lighting defaults to info.json ([#22920](https://github.com/qmk/qmk_firmware/pull/22920))
|
||||
* Ensure LTO is enabled as a `info.json` build config option ([#22932](https://github.com/qmk/qmk_firmware/pull/22932))
|
||||
* refactor(keyboard): quokka ([#22942](https://github.com/qmk/qmk_firmware/pull/22942))
|
||||
* Sango Keyboard ([#22971](https://github.com/qmk/qmk_firmware/pull/22971))
|
||||
* Add FS streampad ([#22991](https://github.com/qmk/qmk_firmware/pull/22991))
|
||||
* Remove always enabled effects from lighting animation list ([#22992](https://github.com/qmk/qmk_firmware/pull/22992))
|
||||
* Migrate RGB Matrix config to info.json - keychron ([#22998](https://github.com/qmk/qmk_firmware/pull/22998))
|
||||
* Migrate RGB Matrix config to info.json - Misc ([#23000](https://github.com/qmk/qmk_firmware/pull/23000))
|
||||
* Remove ee_hands config from ferris/sweep firmware ([#23029](https://github.com/qmk/qmk_firmware/pull/23029))
|
||||
* Migrate dip switch config to info.json - keychron ([#23037](https://github.com/qmk/qmk_firmware/pull/23037))
|
||||
* [unicorne] Add a layout alias ([#23056](https://github.com/qmk/qmk_firmware/pull/23056))
|
||||
* nacly/sodium62: Update vid, pid, and add via keymap ([#23063](https://github.com/qmk/qmk_firmware/pull/23063))
|
||||
* LED drivers: update keyboard LED configs ([#23073](https://github.com/qmk/qmk_firmware/pull/23073))
|
||||
* Remove invalid keyboard level features ([#23074](https://github.com/qmk/qmk_firmware/pull/23074))
|
||||
* Migrate WEAR_LEVELING_* to info.json ([#23077](https://github.com/qmk/qmk_firmware/pull/23077))
|
||||
* [Keymap Removal] keyboard with most keymaps ([#23081](https://github.com/qmk/qmk_firmware/pull/23081))
|
||||
* Remove obvious user keymaps, keyboards/{v,x,y,z}* edition. ([#23083](https://github.com/qmk/qmk_firmware/pull/23083))
|
||||
* Remove obvious user keymaps, keyboards/{s,t}* edition. ([#23084](https://github.com/qmk/qmk_firmware/pull/23084))
|
||||
* [Keymap Removal] keyboard with most keymaps ([#23092](https://github.com/qmk/qmk_firmware/pull/23092))
|
||||
* Fiuxup takashicompany/heavy_left ([#23094](https://github.com/qmk/qmk_firmware/pull/23094))
|
||||
* Remove obvious user keymaps, keyboards/{i,j,k}* edition ([#23102](https://github.com/qmk/qmk_firmware/pull/23102))
|
||||
* Manual user keymap removal ([#23104](https://github.com/qmk/qmk_firmware/pull/23104))
|
||||
* Manual user keymap removal ([#23119](https://github.com/qmk/qmk_firmware/pull/23119))
|
||||
* Migrate `RGBLED_NUM` -> `RGBLIGHT_LED_COUNT` in remaining non-user keymaps ([#23128](https://github.com/qmk/qmk_firmware/pull/23128))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix VID and PID for AnnePro2 ([#22263](https://github.com/qmk/qmk_firmware/pull/22263))
|
||||
* fix(kikoslab/kl90): Fix firmware to support encoder knobs properly ([#22649](https://github.com/qmk/qmk_firmware/pull/22649))
|
||||
* fix: improper usage of keyboard/user-level functions ([#22652](https://github.com/qmk/qmk_firmware/pull/22652))
|
||||
* Temporary fix for mechlovin/olly/octagon ([#22796](https://github.com/qmk/qmk_firmware/pull/22796))
|
||||
* Keychron Q11 usb poweron fix ([#22799](https://github.com/qmk/qmk_firmware/pull/22799))
|
||||
* capsunlocked/cu80/v2: Fix invalid RGB matrix config ([#22873](https://github.com/qmk/qmk_firmware/pull/22873))
|
||||
* Fix typo in Redox config ([#22899](https://github.com/qmk/qmk_firmware/pull/22899))
|
||||
* Fixup doio/kb16 ([#22921](https://github.com/qmk/qmk_firmware/pull/22921))
|
||||
* Fixup takashicompany/minizone ([#22922](https://github.com/qmk/qmk_firmware/pull/22922))
|
||||
* Fixup sofle ([#22934](https://github.com/qmk/qmk_firmware/pull/22934))
|
||||
* Fix Issue with RGB Matrix not understanding the split keyboard ([#22997](https://github.com/qmk/qmk_firmware/pull/22997))
|
||||
* Fixup sawnsprojects/krush60 ([#23095](https://github.com/qmk/qmk_firmware/pull/23095))
|
||||
* Fixup kbd67/rev1 ([#23096](https://github.com/qmk/qmk_firmware/pull/23096))
|
||||
* Fixup boardsource/equals ([#23106](https://github.com/qmk/qmk_firmware/pull/23106))
|
||||
* Fixup inett_studio/sq80 ([#23121](https://github.com/qmk/qmk_firmware/pull/23121))
|
||||
* Add LED/RGB Matrix drivers to info.json schema ([#23127](https://github.com/qmk/qmk_firmware/pull/23127))
|
||||
* Fix for multiple AMUX usage ([#23155](https://github.com/qmk/qmk_firmware/pull/23155))
|
||||
|
||||
Bugs:
|
||||
* MIDI sustain effect fix on qmk 0.22.2 ([#22114](https://github.com/qmk/qmk_firmware/pull/22114))
|
||||
* Prevent `qmk migrate` processing unparsed info.json values ([#22374](https://github.com/qmk/qmk_firmware/pull/22374))
|
||||
* Remove redundant backlight eeconfig init ([#22675](https://github.com/qmk/qmk_firmware/pull/22675))
|
||||
* pointing_device ifdef indentation fix ([#22802](https://github.com/qmk/qmk_firmware/pull/22802))
|
||||
* Ensure LED config is extracted when feature is disabled ([#22809](https://github.com/qmk/qmk_firmware/pull/22809))
|
||||
* Generate true/false for _DEFAULT_ON options ([#22829](https://github.com/qmk/qmk_firmware/pull/22829))
|
||||
* is31fl3733: fix driver sync backwards compatibility defines ([#22851](https://github.com/qmk/qmk_firmware/pull/22851))
|
||||
* LED drivers: misc formatting and typos ([#22857](https://github.com/qmk/qmk_firmware/pull/22857))
|
||||
* Allow generation of both LED and RGB Matrix config ([#22896](https://github.com/qmk/qmk_firmware/pull/22896))
|
||||
* LED drivers: remove PWM register offsets ([#22897](https://github.com/qmk/qmk_firmware/pull/22897))
|
||||
* `qmk format-json`: Force Unix line endings and ensure LF at EOF ([#22901](https://github.com/qmk/qmk_firmware/pull/22901))
|
||||
* Fix cirque connected check ([#22948](https://github.com/qmk/qmk_firmware/pull/22948))
|
||||
* Fix joystick initialization ([#22953](https://github.com/qmk/qmk_firmware/pull/22953))
|
||||
* Workaround for `make test:all DEBUG=1` ([#23047](https://github.com/qmk/qmk_firmware/pull/23047))
|
||||
* Fix unit test execution ([#23048](https://github.com/qmk/qmk_firmware/pull/23048))
|
||||
* Fix git-submodule running in wrong location ([#23059](https://github.com/qmk/qmk_firmware/pull/23059))
|
||||
* WS2812 bitbang: prefix for `NOP_FUDGE` define ([#23110](https://github.com/qmk/qmk_firmware/pull/23110))
|
||||
* Fix make clean test:os_detection ([#23112](https://github.com/qmk/qmk_firmware/pull/23112))
|
||||
* Fix pmw33xx sensor corruption on get-cpi call ([#23116](https://github.com/qmk/qmk_firmware/pull/23116))
|
||||
* Ensure `qmk generate-compilation-database` copies to userspace as well. ([#23129](https://github.com/qmk/qmk_firmware/pull/23129))
|
@@ -4,7 +4,7 @@
|
||||
* [Building Your First Firmware](newbs_building_firmware.md)
|
||||
* [Flashing Firmware](newbs_flashing.md)
|
||||
* [Getting Help/Support](support.md)
|
||||
* [Building With GitHub Userspace](newbs_building_firmware_workflow.md)
|
||||
* [External Userspace](newbs_external_userspace.md)
|
||||
* [Other Resources](newbs_learn_more_resources.md)
|
||||
* [Syllabus](syllabus.md)
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
* [Caps Word](feature_caps_word.md)
|
||||
* [Combos](feature_combo.md)
|
||||
* [Debounce API](feature_debounce_type.md)
|
||||
* [Digitizer](feature_digitizer.md)
|
||||
* [EEPROM](feature_eeprom.md)
|
||||
* [Key Lock](feature_key_lock.md)
|
||||
* [Key Overrides](feature_key_overrides.md)
|
||||
@@ -115,7 +116,6 @@
|
||||
* [Bootmagic Lite](feature_bootmagic.md)
|
||||
* [Converters](feature_converters.md)
|
||||
* [Custom Matrix](custom_matrix.md)
|
||||
* [Digitizer](feature_digitizer.md)
|
||||
* [DIP Switch](feature_dip_switch.md)
|
||||
* [Encoders](feature_encoders.md)
|
||||
* [Haptic Feedback](feature_haptic_feedback.md)
|
||||
@@ -126,7 +126,6 @@
|
||||
* [PS/2 Mouse](feature_ps2_mouse.md)
|
||||
* [Split Keyboard](feature_split_keyboard.md)
|
||||
* [Stenography](feature_stenography.md)
|
||||
* [Velocikey](feature_velocikey.md)
|
||||
|
||||
* Keyboard Building
|
||||
* [Easy Maker for One Offs](easy_maker.md)
|
||||
@@ -139,7 +138,7 @@
|
||||
* Breaking Changes
|
||||
* [Overview](breaking_changes.md)
|
||||
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
|
||||
* [Most Recent ChangeLog](ChangeLog/20230827.md "QMK v0.22.0 - 2023 Aug 27")
|
||||
* [Most Recent ChangeLog](ChangeLog/20240225.md "QMK v0.24.0 - 2024 Feb 25")
|
||||
* [Past Breaking Changes](breaking_changes_history.md)
|
||||
|
||||
* C Development
|
||||
@@ -148,6 +147,7 @@
|
||||
* [Compatible Microcontrollers](compatible_microcontrollers.md)
|
||||
* [Drivers](hardware_drivers.md)
|
||||
* [ADC Driver](adc_driver.md)
|
||||
* [APA102 Driver](apa102_driver.md)
|
||||
* [Audio Driver](audio_driver.md)
|
||||
* [I2C Driver](i2c_driver.md)
|
||||
* [SPI Driver](spi_driver.md)
|
||||
|
@@ -9,7 +9,7 @@ This driver currently supports both AVR and a limited selection of ARM devices.
|
||||
To use this driver, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
SRC += analog.c
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
Then place this include at the top of your code:
|
||||
|
49
docs/apa102_driver.md
Normal file
49
docs/apa102_driver.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# APA102 Driver :id=apa102-driver
|
||||
|
||||
This driver provides support for APA102 addressable RGB LEDs. They are similar to the [WS2812](ws2812_driver.md) LEDs, but have increased data and refresh rates.
|
||||
|
||||
## Usage :id=usage
|
||||
|
||||
In most cases, the APA102 driver code is automatically included if you are using either the [RGBLight](feature_rgblight.md) or [RGB Matrix](feature_rgb_matrix.md) feature with the `apa102` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
APA102_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
You can then call the APA102 API by including `apa102.h` in your code.
|
||||
|
||||
## Basic Configuration :id=basic-configuration
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|---------------------------|-------------|------------------------------------------------------------------|
|
||||
|`APA102_DI_PIN` |*Not defined*|The GPIO pin connected to the DI pin of the first LED in the chain|
|
||||
|`APA102_CI_PIN` |*Not defined*|The GPIO pin connected to the CI pin of the first LED in the chain|
|
||||
|`APA102_DEFAULT_BRIGHTNESS`|`31` |The default global brightness level of the LEDs, from 0 to 31 |
|
||||
|
||||
## API :id=api
|
||||
|
||||
### `void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds)`
|
||||
|
||||
Send RGB data to the APA102 LED chain.
|
||||
|
||||
#### Arguments :id=api-apa102-setleds-arguments
|
||||
|
||||
- `rgb_led_t *start_led`
|
||||
A pointer to the LED array.
|
||||
- `uint16_t num_leds`
|
||||
The length of the LED array.
|
||||
|
||||
---
|
||||
|
||||
### `void apa102_set_brightness(uint8_t brightness)`
|
||||
|
||||
Set the global brightness.
|
||||
|
||||
#### Arguments :id=api-apa102-set-brightness-arguments
|
||||
|
||||
- `uint8_t brightness`
|
||||
The brightness level to set, from 0 to 31.
|
@@ -116,19 +116,32 @@ Additionally, in the board config, you'll want to make changes to enable the DAC
|
||||
| Define | Defaults | Description |
|
||||
| -------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. |
|
||||
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
|
||||
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when not playing anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
|
||||
| `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. |
|
||||
| `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. |
|
||||
| `AUDIO_DAC_BUFFER_SIZE` | __see next table__ | Number of samples generated every refill. Too few may cause excessive CPU load; too many may cause freezes, RAM or flash exhaustion or lags during matrix scanning. |
|
||||
|
||||
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets.
|
||||
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate, number of simultaneous tones and buffer size, instead of using one of the listed presets.
|
||||
|
||||
| Define | Sample Rate | Simultaneous tones |
|
||||
| --------------------------------- | ----------- | ------------------- |
|
||||
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` |
|
||||
| `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` |
|
||||
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` |
|
||||
| `AUDIO_DAC_QUALITY_VERY_HIGH` | `88200U` | `1` |
|
||||
| `AUDIO_DAC_QUALITY_SANE_MINIMUM` | `16384U` | `8` |
|
||||
| Define | Sample Rate | Simultaneous tones | Buffer size |
|
||||
| --------------------------------- | ----------- | ------------------- | ----------- |
|
||||
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` | `64U` |
|
||||
| `AUDIO_DAC_QUALITY_LOW` | `22050U` | `4` | `128U` |
|
||||
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` | `256U` |
|
||||
| `AUDIO_DAC_QUALITY_VERY_HIGH` | `88200U` | `1` | `256U` |
|
||||
| `AUDIO_DAC_QUALITY_SANE_MINIMUM` | `16384U` | `8` | `64U` |
|
||||
|
||||
#### Notes on buffer size :id=buffer-size
|
||||
|
||||
By default, the buffer size attempts to keep to these constraints:
|
||||
|
||||
* The interval between buffer refills can't be too short, since the microcontroller would then only be servicing buffer refills and would freeze up.
|
||||
* On the additive driver, the interval between buffer refills can't be too long, since matrix scanning would suffer lengthy pauses every so often, which would delay key presses or releases or lose some short taps altogether.
|
||||
* The interval between buffer refills is kept to a minimum, which allows notes to stop as soon as possible after they should.
|
||||
* For greater compatibility, the buffer size should be a power of 2.
|
||||
* The buffer size being too large causes resource exhaustion leading to build failures or freezing at runtime: RAM usage (on the additive driver) or flash usage (on the basic driver).
|
||||
|
||||
You can lower the buffer size if you need a bit more space in your firmware, or raise it if your keyboard freezes up.
|
||||
|
||||
|
||||
```c
|
||||
@@ -186,6 +199,11 @@ with all this information, the configuration would contain these lines:
|
||||
ChibiOS uses GPIOv1 for the F103, which only knows of one alternate function.
|
||||
On 'larger' STM32s, GPIOv2 or GPIOv3 are used; with them it is also necessary to configure `AUDIO_PWM_PAL_MODE` to the correct alternate function for the selected pin, timer and timer-channel.
|
||||
|
||||
You can also use the Complementary output (`TIMx_CHyN`) for PWM on supported controllers. To enable this functionality, you will need to make the following changes:
|
||||
```c
|
||||
// config.h:
|
||||
#define AUDIO_PWM_COMPLEMENTARY_OUTPUT
|
||||
```
|
||||
|
||||
### PWM software :id=pwm-software
|
||||
|
||||
|
@@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
|
||||
|
||||
## What has been included in past Breaking Changes?
|
||||
|
||||
* [2024 Feb 25](ChangeLog/20240225.md)
|
||||
* [2023 Nov 26](ChangeLog/20231126.md)
|
||||
* [2023 Aug 27](ChangeLog/20230827.md)
|
||||
* [2023 May 28](ChangeLog/20230528.md)
|
||||
* [2023 Feb 26](ChangeLog/20230226.md)
|
||||
* [Older Breaking Changes](breaking_changes_history.md)
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for November 26, 2023.
|
||||
The next Breaking Change is scheduled for May 26, 2024.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* 2023 Aug 27 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2023 Oct 29 - `develop` closed to new PRs.
|
||||
* 2023 Oct 29 - Call for testers.
|
||||
* 2023 Nov 5 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2023 Nov 19 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2023 Nov 23 - `master` is locked, no PRs merged.
|
||||
* 2023 Nov 26 - Merge `develop` to `master`.
|
||||
* 2023 Nov 26 - `master` is unlocked. PRs can be merged again.
|
||||
* 2024 Feb 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2024 Apr 28 - `develop` closed to new PRs.
|
||||
* 2024 Apr 28 - Call for testers.
|
||||
* 2024 May 5 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2024 May 19 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2024 May 23 - `master` is locked, no PRs merged.
|
||||
* 2024 May 26 - Merge `develop` to `master`.
|
||||
* 2024 May 26 - `master` is unlocked. PRs can be merged again.
|
||||
|
||||
## What changes will be included?
|
||||
|
||||
@@ -48,7 +48,7 @@ Criteria for acceptance:
|
||||
|
||||
Strongly suggested:
|
||||
|
||||
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20231126`.
|
||||
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20240526`.
|
||||
* This should be in Markdown format, with a name in the format `PR12345.md`, substituting the digits for your PRs ID.
|
||||
* One strong recommendation that the ChangeLog document matches the PR description on GitHub, so as to ensure traceability.
|
||||
|
||||
|
@@ -2,6 +2,8 @@
|
||||
|
||||
This page links to all previous changelogs from the QMK Breaking Changes process.
|
||||
|
||||
* [2024 Feb 25](ChangeLog/20240225.md) - version 0.24.0
|
||||
* [2023 Nov 26](ChangeLog/20231126.md) - version 0.23.0
|
||||
* [2023 Aug 27](ChangeLog/20230827.md) - version 0.22.0
|
||||
* [2023 May 28](ChangeLog/20230528.md) - version 0.21.0
|
||||
* [2023 Feb 26](ChangeLog/20230226.md) - version 0.20.0
|
||||
|
@@ -2,11 +2,11 @@
|
||||
|
||||
## Overview :id=overview
|
||||
|
||||
The QMK CLI makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
|
||||
The QMK CLI (command line interface) makes building and working with QMK keyboards easier. We have provided a number of commands to simplify and streamline tasks such as obtaining and compiling the QMK firmware, creating keymaps, and more.
|
||||
|
||||
### Requirements :id=requirements
|
||||
|
||||
QMK requires Python 3.6 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||
QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
|
||||
|
||||
### Install Using Homebrew (macOS, some Linux) :id=install-using-homebrew
|
||||
|
||||
@@ -20,7 +20,7 @@ qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build
|
||||
|
||||
### Install Using pip :id=install-using-easy_install-or-pip
|
||||
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.6 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command:
|
||||
|
||||
```
|
||||
python3 -m pip install qmk
|
||||
|
@@ -362,6 +362,16 @@ This command is directory aware. It will automatically fill in KEYBOARD if you a
|
||||
qmk list-keymaps -kb planck/ez
|
||||
```
|
||||
|
||||
## `qmk migrate`
|
||||
|
||||
This command searches for legacy code that can be converted to the new `info.json` format and adds it to the specified keyboard's `info.json`.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk migrate [-h] -kb KEYBOARD [-f FILTER]
|
||||
```
|
||||
|
||||
## `qmk new-keyboard`
|
||||
|
||||
This command creates a new keyboard based on available templates.
|
||||
@@ -482,6 +492,131 @@ $ qmk import-kbfirmware ~/Downloads/gh62.json
|
||||
|
||||
---
|
||||
|
||||
# External Userspace Commands
|
||||
|
||||
## `qmk userspace-add`
|
||||
|
||||
This command adds a keyboard/keymap to the External Userspace build targets.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk userspace-add [-h] [-km KEYMAP] [-kb KEYBOARD] [builds ...]
|
||||
|
||||
positional arguments:
|
||||
builds List of builds in form <keyboard>:<keymap>, or path to a keymap JSON file.
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-km KEYMAP, --keymap KEYMAP
|
||||
The keymap to build a firmware for. Ignored when a configurator export is supplied.
|
||||
-kb KEYBOARD, --keyboard KEYBOARD
|
||||
The keyboard to build a firmware for. Ignored when a configurator export is supplied.
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
||||
```
|
||||
$ qmk userspace-add -kb planck/rev6 -km default
|
||||
Ψ Added planck/rev6:default to userspace build targets
|
||||
Ψ Saved userspace file to /home/you/qmk_userspace/qmk.json
|
||||
```
|
||||
|
||||
## `qmk userspace-remove`
|
||||
|
||||
This command removes a keyboard/keymap from the External Userspace build targets.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk userspace-remove [-h] [-km KEYMAP] [-kb KEYBOARD] [builds ...]
|
||||
|
||||
positional arguments:
|
||||
builds List of builds in form <keyboard>:<keymap>, or path to a keymap JSON file.
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-km KEYMAP, --keymap KEYMAP
|
||||
The keymap to build a firmware for. Ignored when a configurator export is supplied.
|
||||
-kb KEYBOARD, --keyboard KEYBOARD
|
||||
The keyboard to build a firmware for. Ignored when a configurator export is supplied.
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
||||
```
|
||||
$ qmk userspace-remove -kb planck/rev6 -km default
|
||||
Ψ Removed planck/rev6:default from userspace build targets
|
||||
Ψ Saved userspace file to /home/you/qmk_userspace/qmk.json
|
||||
```
|
||||
|
||||
## `qmk userspace-list`
|
||||
|
||||
This command lists the External Userspace build targets.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk userspace-list [-h] [-e]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-e, --expand Expands any use of `all` for either keyboard or keymap.
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
||||
```
|
||||
$ qmk userspace-list
|
||||
Ψ Current userspace build targets:
|
||||
Ψ Keyboard: planck/rev6, keymap: you
|
||||
Ψ Keyboard: clueboard/66/rev3, keymap: you
|
||||
```
|
||||
|
||||
## `qmk userspace-compile`
|
||||
|
||||
This command compiles all the External Userspace build targets.
|
||||
|
||||
**Usage**:
|
||||
|
||||
```
|
||||
qmk userspace-compile [-h] [-e ENV] [-n] [-c] [-j PARALLEL] [-t]
|
||||
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-e ENV, --env ENV Set a variable to be passed to make. May be passed multiple times.
|
||||
-n, --dry-run Don't actually build, just show the commands to be run.
|
||||
-c, --clean Remove object files before compiling.
|
||||
-j PARALLEL, --parallel PARALLEL
|
||||
Set the number of parallel make jobs; 0 means unlimited.
|
||||
-t, --no-temp Remove temporary files during build.
|
||||
```
|
||||
|
||||
**Example**:
|
||||
|
||||
```
|
||||
$ qmk userspace-compile
|
||||
Ψ Preparing target list...
|
||||
Build planck/rev6:you [OK]
|
||||
Build clueboard/66/rev3:you [OK]
|
||||
```
|
||||
|
||||
## `qmk userspace-doctor`
|
||||
|
||||
This command examines your environment and alerts you to potential problems related to External Userspace.
|
||||
|
||||
**Example**:
|
||||
|
||||
```
|
||||
% qmk userspace-doctor
|
||||
Ψ QMK home: /home/you/qmk_userspace/qmk_firmware
|
||||
Ψ Testing userspace candidate: /home/you/qmk_userspace -- Valid `qmk.json`
|
||||
Ψ QMK userspace: /home/you/qmk_userspace
|
||||
Ψ Userspace enabled: True
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Developer Commands
|
||||
|
||||
## `qmk format-text`
|
||||
|
@@ -44,7 +44,7 @@ def hello(cli):
|
||||
|
||||
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
|
||||
|
||||
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.6/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
|
||||
|
||||
# User Interaction
|
||||
|
||||
@@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
|
||||
|
||||
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
|
||||
|
||||
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.6/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
|
||||
|
||||
You should never use the format operator (`%`) directly, always pass values as arguments.
|
||||
|
||||
### Logging (`cli.log`)
|
||||
|
||||
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.6/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
|
||||
|
||||
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
|
||||
|
||||
|
@@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
|
||||
|
||||
## Integration Tests
|
||||
|
||||
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.6/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
||||
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
|
||||
|
||||
## Unit Tests
|
||||
|
||||
|
@@ -223,7 +223,7 @@ If you define these options you will enable the associated feature, which may in
|
||||
* Adds ability to [blink](feature_rgblight.md?id=lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action).
|
||||
* `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF`
|
||||
* If defined, then [lighting layers](feature_rgblight?id=overriding-rgb-lighting-onoff-status) will be shown even if RGB Light is off.
|
||||
* `#define RGBLED_NUM 12`
|
||||
* `#define RGBLIGHT_LED_COUNT 12`
|
||||
* number of LEDs
|
||||
* `#define RGBLIGHT_SPLIT`
|
||||
* Needed if both halves of the board have RGB LEDs wired directly to the RGB output pin on the controllers instead of passing the output of the left half to the input of the right half
|
||||
@@ -275,7 +275,7 @@ There are a few different ways to set handedness for split keyboards (listed in
|
||||
* For using high/low pin to determine handedness, low = right hand, high = left hand. Replace `B7` with the pin you are using. This is optional, and if you leave `SPLIT_HAND_PIN` undefined, then you can still use the EE_HANDS method or MASTER_LEFT / MASTER_RIGHT defines like the stock Let's Split uses.
|
||||
|
||||
* `#define SPLIT_HAND_MATRIX_GRID <out_pin>,<in_pin>`
|
||||
* The handedness is determined by using the intersection of the keyswitches in the key matrix, which does not exist. Normally, when this intersection is shorted (level low), it is considered left. If you define `#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT`, it is determined to be right when the level is low.
|
||||
* The handedness is determined by using the intersection of the keyswitches in the key matrix, which does not exist. Normally, when this intersection is shorted (level low), it is considered right. If you define `#define SPLIT_HAND_MATRIX_GRID_LOW_IS_LEFT`, it is determined to be left when the level is low.
|
||||
|
||||
* `#define EE_HANDS` (only works if `SPLIT_HAND_PIN` and `SPLIT_HAND_MATRIX_GRID` are not defined)
|
||||
* Reads the handedness value stored in the EEPROM after `eeprom-lefthand.eep`/`eeprom-righthand.eep` has been flashed to their respective halves.
|
||||
|
@@ -70,6 +70,7 @@ We have a few different types of changes in QMK, each requiring a different leve
|
||||
* Keymaps: Make sure that `make keyboard:keymap` does not return any errors.
|
||||
* Keyboards: Make sure that `make keyboard:all` does not return any errors.
|
||||
* Core: Make sure that `make all` does not return any errors.
|
||||
* Note that user-keymap and userspace contributions are no longer accepted.
|
||||
* Make sure commit messages are understandable on their own. You should put a short description (no more than 70 characters) on the first line, the second line should be empty, and on the 3rd and later lines you should describe your commit in detail, if required. Example:
|
||||
|
||||
```
|
||||
@@ -80,8 +81,6 @@ The kerpleplork was intermittently failing with error code 23. The root cause wa
|
||||
Limited experimentation on the devices I have available shows that 7 is high enough to avoid confusing the kerpleplork, but I'd like to get some feedback from people with ARM devices to be sure.
|
||||
```
|
||||
|
||||
!> **IMPORTANT:** If you would like to contribute a bugfix or improvement to user code, such as non-default keymaps, userspace and layouts, be sure to tag the original submitter of the code in your PR. Many users, regardless of skill level with Git and GitHub, may be confused or frustrated at their code being modified without their knowledge.
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation is one of the easiest ways to get started contributing to QMK. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren't sure where or how to jump in please [reach out for help](#where-can-i-go-for-help)!
|
||||
|
@@ -119,11 +119,11 @@ void keyboard_pre_init_user(void) {
|
||||
// Call the keyboard pre init code.
|
||||
|
||||
// Set our LED pins as output
|
||||
setPinOutput(B0);
|
||||
setPinOutput(B1);
|
||||
setPinOutput(B2);
|
||||
setPinOutput(B3);
|
||||
setPinOutput(B4);
|
||||
gpio_set_pin_output(B0);
|
||||
gpio_set_pin_output(B1);
|
||||
gpio_set_pin_output(B2);
|
||||
gpio_set_pin_output(B3);
|
||||
gpio_set_pin_output(B4);
|
||||
}
|
||||
```
|
||||
|
||||
@@ -283,6 +283,65 @@ void suspend_wakeup_init_user(void) {
|
||||
* Keyboard/Revision: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
|
||||
* Keymap: `void suspend_power_down_kb(void)` and `void suspend_wakeup_init_user(void)`
|
||||
|
||||
|
||||
# Keyboard Shutdown/Reboot Code :id=keyboard-shutdown-reboot-code
|
||||
|
||||
This function gets called whenever the firmware is reset, whether it's a soft reset or reset to the bootloader. This is the spot to use for any sort of cleanup, as this happens right before the actual reset. And it can be useful for turning off different systems (such as RGB, onboard screens, etc).
|
||||
|
||||
Additionally, it differentiates between the soft reset (eg, rebooting back into the firmware) or jumping to the bootloader.
|
||||
|
||||
Certain tasks are performed during shutdown too. The keyboard is cleared, music and midi is stopped (if enabled), the shutdown chime is triggered (if audio is enabled), and haptic is stopped.
|
||||
|
||||
If `jump_to_bootloader` is set to `true`, this indicates that the board will be entering the bootloader for a new firmware flash, whereas `false` indicates that this is happening for a soft reset and will load the firmware agaim immediately (such as when using `QK_REBOOT` or `QK_CLEAR_EEPROM`).
|
||||
|
||||
As there is a keyboard and user level function, returning `false` for the user function will disable the keyboard level function, allowing for customization.
|
||||
|
||||
?> Bootmagic does not trigger `shutdown_*()` as it happens before most of the initialization process.
|
||||
|
||||
### Example `shutdown_kb()` Implementation
|
||||
|
||||
```c
|
||||
bool shutdown_kb(bool jump_to_bootloader) {
|
||||
if (!shutdown_user(jump_to_bootloader)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (jump_to_bootloader) {
|
||||
// red for bootloader
|
||||
rgb_matrix_set_color_all(RGB_OFF);
|
||||
} else {
|
||||
// off for soft reset
|
||||
rgb_matrix_set_color_all(RGB_GREEN);
|
||||
}
|
||||
// force flushing -- otherwise will never happen
|
||||
rgb_matrix_update_pwm_buffers();
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### Example `shutdown_user()` Implementation
|
||||
|
||||
```c
|
||||
bool shutdown_user(bool jump_to_bootloader) {
|
||||
if (jump_to_bootloader) {
|
||||
// red for bootloader
|
||||
rgb_matrix_set_color_all(RGB_RED);
|
||||
} else {
|
||||
// off for soft reset
|
||||
rgb_matrix_set_color_all(RGB_OFF);
|
||||
}
|
||||
// force flushing -- otherwise will never happen
|
||||
rgb_matrix_update_pwm_buffers();
|
||||
// false to not process kb level
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
### Keyboard shutdown/reboot Function Documentation
|
||||
|
||||
* Keyboard/Revision: `bool shutdown_kb(bool jump_to_bootloader)`
|
||||
* Keymap: `bool shutdown_user(bool jump_to_bootloader)`
|
||||
|
||||
# Deferred Execution :id=deferred-execution
|
||||
|
||||
QMK has the ability to execute a callback after a specified period of time, rather than having to manually manage timers. To enable this functionality, set `DEFERRED_EXEC_ENABLE = yes` in rules.mk.
|
||||
|
@@ -70,13 +70,13 @@ The device name here is the name that appears in Zadig, and may not be what the
|
||||
|
||||
|Bootloader |Device Name |VID/PID |Driver |
|
||||
|--------------|------------------------------|--------------|-------|
|
||||
|`atmel-dfu` |ATmega16u2 DFU |`03EB:2FEF` |libusb0|
|
||||
|`atmel-dfu` |ATmega32U2 DFU |`03EB:2FF0` |libusb0|
|
||||
|`atmel-dfu` |ATm16U4 DFU V1.0.2 |`03EB:2FF3` |libusb0|
|
||||
|`atmel-dfu` |ATm32U4DFU |`03EB:2FF4` |libusb0|
|
||||
|`atmel-dfu` |*none* (AT90USB64) |`03EB:2FF9` |libusb0|
|
||||
|`atmel-dfu` |AT90USB128 DFU |`03EB:2FFB` |libusb0|
|
||||
|`qmk-dfu` |(keyboard name) Bootloader |As `atmel-dfu`|libusb0|
|
||||
|`atmel-dfu` |ATmega16u2 DFU |`03EB:2FEF` |WinUSB |
|
||||
|`atmel-dfu` |ATmega32U2 DFU |`03EB:2FF0` |WinUSB |
|
||||
|`atmel-dfu` |ATm16U4 DFU V1.0.2 |`03EB:2FF3` |WinUSB |
|
||||
|`atmel-dfu` |ATm32U4DFU |`03EB:2FF4` |WinUSB |
|
||||
|`atmel-dfu` |*none* (AT90USB64) |`03EB:2FF9` |WinUSB |
|
||||
|`atmel-dfu` |AT90USB128 DFU |`03EB:2FFB` |WinUSB |
|
||||
|`qmk-dfu` |(keyboard name) Bootloader |As `atmel-dfu`|WinUSB |
|
||||
|`halfkay` |*none* |`16C0:0478` |HidUsb |
|
||||
|`caterina` |Pro Micro 3.3V |`1B4F:9203` |usbser |
|
||||
|`caterina` |Pro Micro 5V |`1B4F:9205` |usbser |
|
||||
|
@@ -66,6 +66,14 @@ Currently QMK supports 25xx-series chips over SPI. As such, requires a working s
|
||||
`#define EXTERNAL_EEPROM_PAGE_SIZE` | `32` | Page size of the EEPROM in bytes, as specified in the datasheet
|
||||
`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | `2` | The number of bytes to transmit for the memory location within the EEPROM
|
||||
|
||||
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_spi.h`.
|
||||
|
||||
Alternatively, there are pre-defined hardware configurations for available chips/modules:
|
||||
|
||||
Module | Equivalent `#define` | Source
|
||||
-----------------|---------------------------------|------------------------------------------
|
||||
MB85RS64V FRAM | `define EEPROM_SPI_MB85RS64V` | <https://www.adafruit.com/product/1897>
|
||||
|
||||
!> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
|
||||
|
||||
## Transient Driver configuration :id=transient-eeprom-driver-configuration
|
||||
@@ -105,11 +113,11 @@ 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.
|
||||
`#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` | `(backing_size/2)` | 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.
|
||||
|
||||
@@ -139,7 +147,7 @@ Configurable options in your keyboard's `config.h`:
|
||||
------------------------------------------|----------------------------|--------------------------------------------------------------------------------------------------------------------------------
|
||||
`#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_LOGICAL_SIZE` | `(backing_size/2)` | 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.
|
||||
|
||||
|
@@ -180,18 +180,18 @@ For more granular control, there is `get_auto_shifted_key`. The default function
|
||||
bool get_auto_shifted_key(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
# ifndef NO_AUTO_SHIFT_ALPHA
|
||||
case KC_A ... KC_Z:
|
||||
case AUTO_SHIFT_ALPHA:
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_NUMERIC
|
||||
case KC_1 ... KC_0:
|
||||
case AUTO_SHIFT_NUMERIC:
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_SPECIAL
|
||||
# ifndef NO_AUTO_SHIFT_TAB
|
||||
# ifndef NO_AUTO_SHIFT_TAB
|
||||
case KC_TAB:
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_SYMBOLS
|
||||
# endif
|
||||
# ifndef NO_AUTO_SHIFT_SYMBOLS
|
||||
case AUTO_SHIFT_SYMBOLS:
|
||||
# endif
|
||||
# endif
|
||||
# endif
|
||||
# ifdef AUTO_SHIFT_ENTER
|
||||
case KC_ENT:
|
||||
@@ -310,10 +310,16 @@ generating taps on release. For example:
|
||||
#define RETRO_SHIFT 500
|
||||
```
|
||||
|
||||
Without a value set, holds of any length without an interrupting key will produce the shifted value.
|
||||
|
||||
This value (if set) must be greater than one's `TAPPING_TERM`, as the key press
|
||||
must be designated as a 'hold' by `process_tapping` before we send the modifier.
|
||||
[Per-key tapping terms](tap_hold.md#tapping-term) can be used as a workaround.
|
||||
There is no such limitation in regards to `AUTO_SHIFT_TIMEOUT` for normal keys.
|
||||
|
||||
**Note:** Tap Holds must be added to Auto Shift, see [here.](feature_auto_shift.md#auto-shift-per-key)
|
||||
`IS_RETRO` may be helpful if one wants all Tap Holds retro shifted.
|
||||
|
||||
### Retro Shift and Tap Hold Configurations
|
||||
|
||||
Tap Hold Configurations work a little differently when using Retro Shift.
|
||||
|
@@ -37,8 +37,9 @@ Add the following to your `config.h`:
|
||||
|`BREATHING_PERIOD` |`6` |The length of one backlight "breath" in seconds |
|
||||
|`BACKLIGHT_ON_STATE` |`1` |The state of the backlight pin when the backlight is "on" - `1` for high, `0` for low |
|
||||
|`BACKLIGHT_LIMIT_VAL` |`255` |The maximum duty cycle of the backlight -- `255` allows for full brightness, any lower will decrease the maximum.|
|
||||
|`BACKLIGHT_DEFAULT_ON` |`true` |Enable backlight upon clearing the EEPROM |
|
||||
|`BACKLIGHT_DEFAULT_BREATHING`|`false` |Whether to enable backlight breathing upon clearing the EEPROM |
|
||||
|`BACKLIGHT_DEFAULT_LEVEL` |`BACKLIGHT_LEVELS`|The default backlight level to use upon clearing the EEPROM |
|
||||
|`BACKLIGHT_DEFAULT_BREATHING`|*Not defined* |Whether to enable backlight breathing upon clearing the EEPROM |
|
||||
|
||||
Unless you are designing your own keyboard, you generally should not need to change the `BACKLIGHT_PIN` or `BACKLIGHT_ON_STATE`.
|
||||
|
||||
@@ -172,11 +173,13 @@ Depending on the ChibiOS board configuration, you may need to enable PWM at the
|
||||
|
||||
The following `#define`s apply only to the `pwm` driver:
|
||||
|
||||
|Define |Default |Description |
|
||||
|-----------------------|--------|-----------------------------------|
|
||||
|`BACKLIGHT_PWM_DRIVER` |`PWMD4` |The PWM driver to use |
|
||||
|`BACKLIGHT_PWM_CHANNEL`|`3` |The PWM channel to use |
|
||||
|`BACKLIGHT_PAL_MODE` |`2` |The pin alternative function to use|
|
||||
|Define |Default |Description |
|
||||
|-----------------------|-------------|---------------------------------------------------------------|
|
||||
|`BACKLIGHT_PWM_DRIVER` |`PWMD4` |The PWM driver to use |
|
||||
|`BACKLIGHT_PWM_CHANNEL`|`3` |The PWM channel to use |
|
||||
|`BACKLIGHT_PAL_MODE` |`2` |The pin alternative function to use |
|
||||
|`BACKLIGHT_PWM_PERIOD` |*Not defined*|The PWM period in counter ticks - Default is platform dependent|
|
||||
|
||||
|
||||
Refer to the ST datasheet for your particular MCU to determine these values. For example, these defaults are set up for pin `B8` on a Proton-C (STM32F303) using `TIM4_CH3` on AF2. Unless you are designing your own keyboard, you generally should not need to change them.
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# Bootmagic Lite :id=bootmagic-lite
|
||||
# Bootmagic :id=bootmagic
|
||||
|
||||
The Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button, giving you a way to jump into the bootloader
|
||||
The Bootmagic feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button, giving you a way to jump into the bootloader
|
||||
|
||||
On some keyboards Bootmagic Lite is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with:
|
||||
On some keyboards Bootmagic is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with:
|
||||
|
||||
```make
|
||||
BOOTMAGIC_ENABLE = yes
|
||||
@@ -11,15 +11,15 @@ BOOTMAGIC_ENABLE = yes
|
||||
Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
|
||||
|
||||
```c
|
||||
#define BOOTMAGIC_LITE_ROW 0
|
||||
#define BOOTMAGIC_LITE_COLUMN 1
|
||||
#define BOOTMAGIC_ROW 0
|
||||
#define BOOTMAGIC_COLUMN 1
|
||||
```
|
||||
|
||||
By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards.
|
||||
|
||||
And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key.
|
||||
|
||||
!> Using Bootmagic Lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
|
||||
!> Using Bootmagic will **always reset** the EEPROM, so you will lose any settings that have been saved.
|
||||
|
||||
## Split Keyboards
|
||||
|
||||
@@ -44,35 +44,35 @@ When [handedness](feature_split_keyboard.md#setting-handedness) is predetermined
|
||||
}
|
||||
```
|
||||
|
||||
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:
|
||||
If you pick the top right key for the right half, it is `R05` on the top layout. Within the key matrix below, `R05` is located on row 4 columnn 4. To use that key as the right half's Bootmagic trigger, add these entries to your `config.h` file:
|
||||
|
||||
```c
|
||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 4
|
||||
#define BOOTMAGIC_ROW_RIGHT 4
|
||||
#define BOOTMAGIC_COLUMN_RIGHT 4
|
||||
```
|
||||
|
||||
?> These values are not set by default.
|
||||
|
||||
## Advanced Bootmagic Lite
|
||||
## Advanced Bootmagic
|
||||
|
||||
The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
|
||||
The `bootmagic_scan` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
|
||||
|
||||
To replace the function, all you need to do is add something like this to your code:
|
||||
|
||||
```c
|
||||
void bootmagic_lite(void) {
|
||||
void bootmagic_scan(void) {
|
||||
matrix_scan();
|
||||
wait_ms(DEBOUNCE * 2);
|
||||
matrix_scan();
|
||||
|
||||
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
|
||||
if (matrix_get_row(BOOTMAGIC_ROW) & (1 << BOOTMAGIC_COLUMN)) {
|
||||
// Jump to bootloader.
|
||||
bootloader_jump();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
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.
|
||||
You can define additional logic here. For instance, resetting the EEPROM or requiring additional keys to be pressed to trigger Bootmagic. Keep in mind that `bootmagic_scan` is called before a majority of features are initialized in the firmware.
|
||||
|
||||
## Addenda
|
||||
|
||||
|
@@ -333,28 +333,26 @@ will give the _NAV layer as a reference to it's self. All other layers
|
||||
will have the default for their combo reference layer. If the default
|
||||
is not set, all other layers will reference themselves.
|
||||
|
||||
```c
|
||||
#define COMBO_REF_DEFAULT _MY_COMBO_LAYER
|
||||
...
|
||||
```c
|
||||
#define COMBO_REF_DEFAULT _MY_COMBO_LAYER
|
||||
|
||||
uint8_t combo_ref_from_layer(uint8_t layer){
|
||||
switch (get_highest_layer(layer_state)){
|
||||
case _DVORAK: return _QWERTY;
|
||||
case _NAV: return _NAV;
|
||||
default: return _MY_COMBO_LAYER;
|
||||
}
|
||||
return layer; // important if default is not in case.
|
||||
uint8_t combo_ref_from_layer(uint8_t layer){
|
||||
switch (get_highest_layer(layer_state)){
|
||||
case _DVORAK: return _QWERTY;
|
||||
case _NAV: return _NAV;
|
||||
default: return _MY_COMBO_LAYER;
|
||||
}
|
||||
return layer; // important if default is not in case.
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
The equivalent definition using the combo macros is this:
|
||||
The equivalent definition using the combo macros is this:
|
||||
|
||||
```c
|
||||
COMBO_REF_LAYER(_DVORAK, _QWERTY)
|
||||
COMBO_REF_LAYER(_NAV, _NAV)
|
||||
DEFAULT_REF_LAYER(_MY_COMBO_LAYER).
|
||||
```
|
||||
```c
|
||||
COMBO_REF_LAYER(_DVORAK, _QWERTY)
|
||||
COMBO_REF_LAYER(_NAV, _NAV)
|
||||
DEFAULT_REF_LAYER(_MY_COMBO_LAYER).
|
||||
```
|
||||
|
||||
|
||||
## User callbacks
|
||||
|
@@ -1,12 +1,10 @@
|
||||
# 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 automated process for converting keyboards to use drop-in replacement controllers. This process is designed to be easy to use and can be completed in a few simple steps.
|
||||
|
||||
This page documents the handy automated process for converting keyboards.
|
||||
## Supported Converters
|
||||
|
||||
### Supported Converters
|
||||
|
||||
Currently the following converters are available:
|
||||
The following converters are available at this time:
|
||||
|
||||
| From | To |
|
||||
|------------|-------------------|
|
||||
@@ -21,6 +19,7 @@ Currently the following converters are available:
|
||||
| `promicro` | `elite_pi` |
|
||||
| `promicro` | `helios` |
|
||||
| `promicro` | `liatris` |
|
||||
| `promicro` | `imera` |
|
||||
| `promicro` | `michi` |
|
||||
| `elite_c` | `stemcell` |
|
||||
| `elite_c` | `rp2040_ce` |
|
||||
@@ -28,14 +27,10 @@ Currently the following converters are available:
|
||||
| `elite_c` | `helios` |
|
||||
| `elite_c` | `liatris` |
|
||||
|
||||
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:
|
||||
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
|
||||
@@ -59,14 +54,12 @@ Once a converter is enabled, it exposes the `CONVERT_TO_<target_uppercase>` flag
|
||||
|
||||
### Pin Compatibility
|
||||
|
||||
To ensure compatibility, provide validation, and power future workflows, a keyboard should declare its `pin compatibility`. For legacy reasons, this is currently assumed to be `promicro`.
|
||||
To ensure compatibility, provide validation, and enable future workflows, a keyboard should declare its `pin compatibility`. For legacy reasons, this is currently assumed to be `promicro`. The following pin compatibility interfaces are currently defined:
|
||||
|
||||
Currently the following pin compatibility interfaces are defined:
|
||||
|
||||
| Pinout | Notes |
|
||||
|------------|-----------------------------------|
|
||||
| `promicro` | Includes RX/TX LEDs |
|
||||
| `elite_c` | Includes bottom row pins, no LEDs |
|
||||
| Pin Compatibility | Notes |
|
||||
|-------------------|-----------------------------------|
|
||||
| `promicro` | Includes RX/TX LEDs |
|
||||
| `elite_c` | Includes bottom row pins, no LEDs |
|
||||
|
||||
To declare the base for conversions, add this line to your keyboard's `rules.mk`:
|
||||
|
||||
@@ -90,6 +83,7 @@ If a board currently supported in QMK uses a [Pro Micro](https://www.sparkfun.co
|
||||
| [Elite-Pi](https://keeb.io/products/elite-pi-usb-c-pro-micro-replacement-rp2040) | `elite_pi` |
|
||||
| [0xCB Helios](https://keeb.supply/products/0xcb-helios) | `helios` |
|
||||
| [Liatris](https://splitkb.com/products/liatris) | `liatris` |
|
||||
| [Imera](https://splitkb.com/products/imera) | `imera` |
|
||||
| [Michi](https://github.com/ci-bus/michi-promicro-rp2040) | `michi` |
|
||||
|
||||
Converter summary:
|
||||
@@ -107,6 +101,7 @@ Converter summary:
|
||||
| `elite_pi` | `-e CONVERT_TO=elite_pi` | `CONVERT_TO=elite_pi` | `#ifdef CONVERT_TO_ELITE_PI` |
|
||||
| `helios` | `-e CONVERT_TO=helios` | `CONVERT_TO=helios` | `#ifdef CONVERT_TO_HELIOS` |
|
||||
| `liatris` | `-e CONVERT_TO=liatris` | `CONVERT_TO=liatris` | `#ifdef CONVERT_TO_LIATRIS` |
|
||||
| `imera` | `-e CONVERT_TO=imera` | `CONVERT_TO=imera` | `#ifdef CONVERT_TO_IMERA` |
|
||||
| `michi` | `-e CONVERT_TO=michi` | `CONVERT_TO=michi` | `#ifdef CONVERT_TO_MICHI` |
|
||||
|
||||
### Proton C :id=proton_c
|
||||
@@ -140,7 +135,7 @@ The following defaults are based on what has been implemented for [RP2040](platf
|
||||
|
||||
### SparkFun Pro Micro - RP2040, Blok, Bit-C PRO and Michi :id=promicro_rp2040
|
||||
|
||||
Currently identical to [Adafruit KB2040](#kb2040).
|
||||
Feature set is identical to [Adafruit KB2040](#kb2040).
|
||||
|
||||
### STeMCell :id=stemcell
|
||||
|
||||
@@ -150,9 +145,7 @@ There are two versions of STeMCell available, with different pinouts:
|
||||
- v2.0.0 (pre-release v1.0.1, v1.0.2)
|
||||
Default official firmware only supports v2.0.0 STeMCell.
|
||||
|
||||
STeMCell has support to swap UART and I2C pins, to enable single-wire uart communication in STM chips.
|
||||
|
||||
The following additional flags has to be used while compiling, based on the pin used for split communication.
|
||||
STeMCell has support to swap UART and I2C pins to enable single-wire uart communication in STM chips. The following additional flags has to be used while compiling, based on the pin used for split communication:
|
||||
|
||||
| Split Pin | Compile flags |
|
||||
|-----------|---------------|
|
||||
@@ -173,11 +166,8 @@ The Bonsai C4 only has one on-board LED (B2), and by default, both the Pro Micro
|
||||
|
||||
### RP2040 Community Edition - Elite-Pi, Helios, and Liatris :id=rp2040_ce
|
||||
|
||||
Feature set currently identical to [Adafruit KB2040](#kb2040).
|
||||
Feature set is identical to [Adafruit KB2040](#kb2040). VBUS detection is enabled by default for superior split keyboard support. For more information, refer to the [Community Edition pinout](platformdev_rp2040.md#rp2040_ce) docs.
|
||||
|
||||
Enables VBUS detection by default for superior split keyboard support.
|
||||
|
||||
For more information, refer to the [RP2040 Community Edition](platformdev_rp2040.md#rp2040_ce) docs.
|
||||
|
||||
## Elite-C
|
||||
|
||||
@@ -202,8 +192,8 @@ Converter summary:
|
||||
|
||||
### STeMCell :id=stemcell_elite
|
||||
|
||||
Currently identical to [STeMCell](#stemcell) with support for the additional bottom row of pins.
|
||||
Identical to [Pro Micro - STeMCell](#stemcell) with support for the additional bottom row of pins.
|
||||
|
||||
### RP2040 Community Edition :id=rp2040_ce_elite
|
||||
|
||||
Currently identical to [RP2040 Community Edition](#rp2040_ce), with support for the additional bottom row of pins.
|
||||
Identical to [Pro Micro - RP2040 Community Edition](#rp2040_ce) with support for the additional bottom row of pins.
|
||||
|
@@ -20,6 +20,27 @@ or
|
||||
#define DIP_SWITCH_MATRIX_GRID { {0,6}, {1,6}, {2,6} } // List of row and col pairs
|
||||
```
|
||||
|
||||
## DIP Switch map :id=dip-switch-map
|
||||
|
||||
DIP Switch mapping may be added to your `keymap.c`, which replicates the normal keyswitch functionality, but with dip switches. Add this to your keymap's `rules.mk`:
|
||||
|
||||
```make
|
||||
DIP_SWITCH_MAP_ENABLE = yes
|
||||
```
|
||||
|
||||
Your `keymap.c` will then need a dip switch mapping defined (for two dip switches):
|
||||
|
||||
```c
|
||||
#if defined(DIP_SWITCH_MAP_ENABLE)
|
||||
const uint16_t PROGMEM dip_switch_map[NUM_DIP_SWITCHES][NUM_DIP_STATES] = {
|
||||
DIP_SWITCH_OFF_ON(DF(0), DF(1)),
|
||||
DIP_SWITCH_OFF_ON(EC_NORM, EC_SWAP)
|
||||
};
|
||||
#endif
|
||||
```
|
||||
|
||||
?> This should only be enabled at the keymap level.
|
||||
|
||||
## Callbacks
|
||||
|
||||
The callback functions can be inserted into your `<keyboard>.c`:
|
||||
|
@@ -82,10 +82,10 @@ Your `keymap.c` will then need an encoder mapping defined (for four layers and t
|
||||
```c
|
||||
#if defined(ENCODER_MAP_ENABLE)
|
||||
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
|
||||
[_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) },
|
||||
[0] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
|
||||
[1] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_SAD, RGB_SAI) },
|
||||
[2] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI), ENCODER_CCW_CW(RGB_SPD, RGB_SPI) },
|
||||
[3] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_RIGHT, KC_LEFT) },
|
||||
};
|
||||
#endif
|
||||
```
|
||||
|
@@ -50,10 +50,6 @@ Axes can be configured using one of the following macros:
|
||||
|
||||
* `JOYSTICK_AXIS_IN(input_pin, low, rest, high)`
|
||||
The ADC samples the provided pin. `low`, `high` and `rest` correspond to the minimum, maximum, and resting (or centered) analog values of the axis, respectively.
|
||||
* `JOYSTICK_AXIS_IN_OUT(input_pin, output_pin, low, rest, high)`
|
||||
Same as `JOYSTICK_AXIS_IN()`, but the provided `output_pin` will be pulled high before `input_pin` is read.
|
||||
* `JOYSTICK_AXIS_IN_OUT_GROUND(input_pin, output_pin, ground_pin, low, rest, high)`
|
||||
Same as `JOYSTICK_AXIS_IN_OUT()`, but the provided `ground_pin` will be pulled low before reading from `input_pin`.
|
||||
* `JOYSTICK_AXIS_VIRTUAL`
|
||||
No ADC reading is performed. The value should be provided by user code.
|
||||
|
||||
@@ -160,12 +156,8 @@ Describes a single axis.
|
||||
|
||||
#### Members :id=api-joystick-config-t-members
|
||||
|
||||
- `pin_t output_pin`
|
||||
A pin to set as output high when reading the analog value, or `JS_VIRTUAL_AXIS`.
|
||||
- `pin_t input_pin`
|
||||
The pin to read the analog value from, or `JS_VIRTUAL_AXIS`.
|
||||
- `pin_t ground_pin`
|
||||
A pin to set as output low when reading the analog value, or `JS_VIRTUAL_AXIS`.
|
||||
- `uint16_t min_digit`
|
||||
The minimum analog value.
|
||||
- `uint16_t mid_digit`
|
||||
|
@@ -21,7 +21,7 @@ Then, in your `keymap.c` file, you'll need to define the array `key_overrides`,
|
||||
The `key_override_t` struct has many options that allow you to precisely tune your overrides. The full reference is shown below. Instead of manually creating a `key_override_t` value, it is recommended to use these dedicated initializers:
|
||||
|
||||
#### `ko_make_basic(modifiers, key, replacement)`
|
||||
Returns a `key_override_t`, which sends `replacement` (can be a key-modifer combination), when `key` and `modifiers` are all pressed down. This override still activates if any additional modifiers not specified in `modifiers` are also pressed down. See `ko_make_with_layers_and_negmods` to customize this behavior.
|
||||
Returns a `key_override_t`, which sends `replacement` (can be a key-modifier combination), when `key` and `modifiers` are all pressed down. This override still activates if any additional modifiers not specified in `modifiers` are also pressed down. See `ko_make_with_layers_and_negmods` to customize this behavior.
|
||||
|
||||
#### `ko_make_with_layers(modifiers, key, replacement, layers)`
|
||||
Additionally takes a bitmask `layers` that defines on which layers the override is used.
|
||||
@@ -224,7 +224,7 @@ The duration of the key repeat delay is controlled with the `KEY_OVERRIDE_REPEAT
|
||||
|
||||
## Difference to Combos :id=difference-to-combos
|
||||
|
||||
Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interacton with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable.
|
||||
Note that key overrides are very different from [combos](https://docs.qmk.fm/#/feature_combo). Combos require that you press down several keys almost _at the same time_ and can work with any combination of non-modifier keys. Key overrides work like keyboard shortcuts (e.g. `ctrl` + `z`): They take combinations of _multiple_ modifiers and _one_ non-modifier key to then perform some custom action. Key overrides are implemented with much care to behave just like normal keyboard shortcuts would in regards to the order of pressed keys, timing, and interaction with other pressed keys. There are a number of optional settings that can be used to really fine-tune the behavior of each key override as well. Using key overrides also does not delay key input for regular key presses, which inherently happens in combos and may be undesirable.
|
||||
|
||||
## Solution to the problem of flashing modifiers :id=neutralize-flashing-modifiers
|
||||
|
||||
|
@@ -56,16 +56,16 @@ This is a template indicator function that can be implemented on keyboard level
|
||||
bool led_update_kb(led_t led_state) {
|
||||
bool res = led_update_user(led_state);
|
||||
if(res) {
|
||||
// writePin sets the pin high for 1 and low for 0.
|
||||
// gpio_write_pin sets the pin high for 1 and low for 0.
|
||||
// In this example the pins are inverted, setting
|
||||
// it low/0 turns it on, and high/1 turns the LED off.
|
||||
// This behavior depends on whether the LED is between the pin
|
||||
// and VCC or the pin and GND.
|
||||
writePin(B0, !led_state.num_lock);
|
||||
writePin(B1, !led_state.caps_lock);
|
||||
writePin(B2, !led_state.scroll_lock);
|
||||
writePin(B3, !led_state.compose);
|
||||
writePin(B4, !led_state.kana);
|
||||
gpio_write_pin(B0, !led_state.num_lock);
|
||||
gpio_write_pin(B1, !led_state.caps_lock);
|
||||
gpio_write_pin(B2, !led_state.scroll_lock);
|
||||
gpio_write_pin(B3, !led_state.compose);
|
||||
gpio_write_pin(B4, !led_state.kana);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@@ -19,14 +19,13 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `LED_DRIVER_ADDR_<N>
|
||||
|
||||
| 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 |
|
||||
| `LED_DRIVER_COUNT` | (Required) How many LED driver IC's are present | |
|
||||
| `IS31FL3731_I2C_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `IS31FL3731_I2C_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `LED_MATRIX_LED_COUNT` | (Required) How many LED lights are present across all drivers | |
|
||||
| `LED_DRIVER_ADDR_1` | (Required) Address for the first LED driver | |
|
||||
| `LED_DRIVER_ADDR_2` | (Optional) Address for the second LED driver | |
|
||||
| `LED_DRIVER_ADDR_3` | (Optional) Address for the third LED driver | |
|
||||
| `LED_DRIVER_ADDR_4` | (Optional) Address for the fourth LED driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_1` | (Required) Address for the first LED driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_2` | (Optional) Address for the second LED driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_3` | (Optional) Address for the third LED driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_4` | (Optional) Address for the fourth LED driver | |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
@@ -34,14 +33,15 @@ Here is an example using 2 drivers.
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0b1110100 AD <-> GND
|
||||
// 0b1110111 AD <-> VCC
|
||||
// 0b1110101 AD <-> SCL
|
||||
// 0b1110110 AD <-> SDA
|
||||
#define LED_DRIVER_ADDR_1 0b1110100
|
||||
#define LED_DRIVER_ADDR_2 0b1110110
|
||||
// 00 AD <-> GND
|
||||
// 01 AD <-> SCL
|
||||
// 10 AD <-> SDA
|
||||
// 11 AD <-> VCC
|
||||
// ADDR represents A1:A0 of the 7-bit address.
|
||||
// The result is: 0b11101(ADDR)
|
||||
#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
|
||||
#define IS31FL3731_I2C_ADDRESS_2 IS31FL3731_I2C_ADDRESS_SDA
|
||||
|
||||
#define LED_DRIVER_COUNT 2
|
||||
#define LED_DRIVER_1_LED_TOTAL 25
|
||||
#define LED_DRIVER_2_LED_TOTAL 24
|
||||
#define LED_MATRIX_LED_COUNT (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)
|
||||
@@ -49,12 +49,12 @@ Here is an example using 2 drivers.
|
||||
|
||||
!> Note the parentheses, this is so when `LED_MATRIX_LED_COUNT` is used in code and expanded, the values are added together before any additional math is applied to them. As an example, `rand() % (LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL)` will give very different results than `rand() % LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL`.
|
||||
|
||||
For split keyboards using `LED_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
|
||||
For split keyboards using `LED_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `IS31FL3731_I2C_ADDRESS_1` for one and `IS31FL3731_I2C_ADDRESS_2` for the other one. Then, in `g_is31fl3731_leds`, fill out the correct driver index (0 or 1). If using one address, use `IS31FL3731_I2C_ADDRESS_1` for both, and use index 0 for `g_is31fl3731_leds`.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT] = {
|
||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | LED address
|
||||
@@ -65,7 +65,7 @@ const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT] = {
|
||||
}
|
||||
```
|
||||
|
||||
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-mono.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` ).
|
||||
|
||||
---
|
||||
### IS31FLCOMMON :id=is31flcommon
|
||||
@@ -94,7 +94,6 @@ Configure the hardware via your `config.h`:
|
||||
|----------|-------------|---------|
|
||||
| `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 | |
|
||||
| `LED_MATRIX_LED_COUNT` | (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 | |
|
||||
@@ -127,7 +126,6 @@ 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 LED_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -144,8 +142,8 @@ const is31_led PROGMEM g_is31_leds[LED_MATRIX_LED_COUNT] = {
|
||||
* driver
|
||||
* | LED address
|
||||
* | | */
|
||||
{ 0, CS1_SW1 },
|
||||
{ 0, CS2_SW1 },
|
||||
{ 0, SW1_CS1 },
|
||||
{ 0, SW1_CS2 },
|
||||
// ...
|
||||
}
|
||||
```
|
||||
@@ -159,7 +157,7 @@ Then Define the array listing all the LEDs you want to override in your `<keyboa
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||
* LED Index
|
||||
/* LED Index
|
||||
* | Scaling
|
||||
* | | */
|
||||
{5, 120},
|
||||
@@ -248,16 +246,16 @@ enum led_matrix_effects {
|
||||
LED_MATRIX_CYCLE_OUT_IN, // Full gradient scrolling out to in
|
||||
LED_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard
|
||||
LED_MATRIX_SOLID_REACTIVE_SIMPLE, // Pulses keys hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_WIDE // Value pulses near a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTIWIDE // Value pulses near multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_CROSS // Value pulses the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTICROSS // Value pulses the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_NEXUS // Value pulses away on the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTINEXUS // Value pulses away on the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_WIDE, // Value pulses near a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTIWIDE, // Value pulses near multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_CROSS, // Value pulses the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTICROSS, // Value pulses the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_NEXUS, // Value pulses away on the same column and row of a single key hit then fades out
|
||||
LED_MATRIX_SOLID_REACTIVE_MULTINEXUS, // Value pulses away on the same column and row of multiple key hits then fades out
|
||||
LED_MATRIX_SOLID_SPLASH, // Value pulses away from a single key hit then fades out
|
||||
LED_MATRIX_SOLID_MULTISPLASH, // Value pulses away from multiple key hits then fades out
|
||||
LED_MATRIX_WAVE_LEFT_RIGHT // Sine wave scrolling from left to right
|
||||
LED_MATRIX_WAVE_UP_DOWN // Sine wave scrolling from up to down
|
||||
LED_MATRIX_WAVE_LEFT_RIGHT, // Sine wave scrolling from left to right
|
||||
LED_MATRIX_WAVE_UP_DOWN, // Sine wave scrolling from up to down
|
||||
LED_MATRIX_EFFECT_MAX
|
||||
};
|
||||
```
|
||||
@@ -359,13 +357,15 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
|
||||
```c
|
||||
#define LED_MATRIX_KEYRELEASES // reactive effects respond to keyreleases (instead of keypresses)
|
||||
#define LED_MATRIX_TIMEOUT 0 // number of milliseconds to wait until led automatically turns off
|
||||
#define LED_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
|
||||
#define LED_MATRIX_SLEEP // turn off effects when suspended
|
||||
#define LED_MATRIX_LED_PROCESS_LIMIT (LED_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||
#define LED_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||
#define LED_MATRIX_MAXIMUM_BRIGHTNESS 255 // limits maximum brightness of LEDs
|
||||
#define LED_MATRIX_DEFAULT_ON true // Sets the default enabled state, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||
#define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
|
||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||
```
|
||||
|
@@ -69,9 +69,9 @@ The current list of available languages is:
|
||||
| **italian_osx_iso** | **jis** | **latvian** | **lithuanian_azerty** |
|
||||
| **lithuanian_qwerty** | **norman** | **norwegian** | **portuguese** |
|
||||
| **portuguese_osx_iso** | **romanian** | **serbian_latin** | **slovak** |
|
||||
| **slovenian** | **spanish_dvorak** | **spanish** | **swedish** |
|
||||
| **turkish_f** | **turkish_q** | **uk** | **us_international** |
|
||||
| **workman** | **workman_zxcvm** |
|
||||
| **slovenian** | **spanish_dvorak** | **spanish_latin_america** | **spanish** |
|
||||
| **swedish** | **turkish_f** | **turkish_q** | **uk** |
|
||||
| **us_international** | **workman** | **workman_zxcvm** |
|
||||
|
||||
### Macro Basics
|
||||
|
||||
|
@@ -10,6 +10,7 @@ Tested combinations:
|
||||
|SSD1306 |128x32 |AVR |Primary support |
|
||||
|SSD1306 |128x64 |AVR |Verified working |
|
||||
|SSD1306 |128x32 |Arm | |
|
||||
|SSD1306 |128x64 |Arm |Verified working |
|
||||
|SH1106 |128x64 |AVR |No scrolling |
|
||||
|SH1107 |64x128 |AVR |No scrolling |
|
||||
|SH1107 |64x128 |Arm |No scrolling |
|
||||
@@ -166,6 +167,28 @@ bool oled_task_user(void) {
|
||||
#endif
|
||||
```
|
||||
|
||||
Render a message before booting into bootloader mode.
|
||||
```c
|
||||
void oled_render_boot(bool bootloader) {
|
||||
oled_clear();
|
||||
for (int i = 0; i < 16; i++) {
|
||||
oled_set_cursor(0, i);
|
||||
if (bootloader) {
|
||||
oled_write_P(PSTR("Awaiting New Firmware "), false);
|
||||
} else {
|
||||
oled_write_P(PSTR("Rebooting "), false);
|
||||
}
|
||||
}
|
||||
|
||||
oled_render_dirty(true);
|
||||
}
|
||||
|
||||
bool shutdown_user(bool jump_to_bootloader) {
|
||||
oled_render_boot(jump_to_bootloader);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Basic Configuration
|
||||
|
||||
These configuration options should be placed in `config.h`. Example:
|
||||
@@ -190,7 +213,7 @@ These configuration options should be placed in `config.h`. Example:
|
||||
|`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined* |Scroll timeout direction is right when defined, left when undefined. |
|
||||
|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
|
||||
|`OLED_UPDATE_INTERVAL` |`0` (`50` for split keyboards) |Set the time interval for updating the OLED display in ms. This will improve the matrix scan rate. |
|
||||
|`OLED_UPDATE_PROCESS_LIMIT'|`1` |Set the number of dirty blocks to render per loop. Increasing may degrade performance. |
|
||||
|`OLED_UPDATE_PROCESS_LIMIT`|`1` |Set the number of dirty blocks to render per loop. Increasing may degrade performance. |
|
||||
|
||||
### I2C Configuration
|
||||
|Define |Default |Description |
|
||||
@@ -275,7 +298,7 @@ Rotation on SH1106 and SH1107 is noticeably less efficient than on SSD1306, beca
|
||||
## OLED API
|
||||
|
||||
```c
|
||||
// OLED rotation enum values are flags
|
||||
// OLED Rotation enum values are flags
|
||||
typedef enum {
|
||||
OLED_ROTATION_0 = 0,
|
||||
OLED_ROTATION_90 = 1,
|
||||
@@ -283,7 +306,7 @@ typedef enum {
|
||||
OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180
|
||||
} oled_rotation_t;
|
||||
|
||||
// Initialize the OLED display, rotating the rendered output based on the define passed in.
|
||||
// Initialize the oled display, rotating the rendered output based on the define passed in.
|
||||
// Returns true if the OLED was initialized successfully
|
||||
bool oled_init(oled_rotation_t rotation);
|
||||
|
||||
@@ -301,8 +324,12 @@ bool oled_send_data(const uint8_t *data, uint16_t size);
|
||||
// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering
|
||||
void oled_clear(void);
|
||||
|
||||
// Renders the dirty chunks of the buffer to OLED display
|
||||
void oled_render(void);
|
||||
// Alias to oled_render_dirty to avoid a change in api.
|
||||
#define oled_render() oled_render_dirty(false)
|
||||
|
||||
// Renders all dirty blocks to the display at one time or a subset depending on the value of
|
||||
// all.
|
||||
void oled_render_dirty(bool all);
|
||||
|
||||
// Moves cursor to character position indicated by column and line, wraps if out of bounds
|
||||
// Max column denoted by 'oled_max_chars()' and max lines by 'oled_max_lines()' functions
|
||||
@@ -333,8 +360,6 @@ void oled_write_ln(const char *data, bool invert);
|
||||
|
||||
// Pans the buffer to the right (or left by passing true) by moving contents of the buffer
|
||||
// Useful for moving the screen in preparation for new drawing
|
||||
// oled_scroll_left or oled_scroll_right should be preferred for all cases of moving a static
|
||||
// image such as a logo or to avoid burn-in as it's much, much less cpu intensive
|
||||
void oled_pan(bool left);
|
||||
|
||||
// Returns a pointer to the requested start index in the buffer plus remaining
|
||||
@@ -351,6 +376,7 @@ void oled_write_raw_byte(const char data, uint16_t index);
|
||||
// Coordinates start at top-left and go right and down for positive x and y
|
||||
void oled_write_pixel(uint8_t x, uint8_t y, bool on);
|
||||
|
||||
#if defined(__AVR__)
|
||||
// Writes a PROGMEM string to the buffer at current cursor position
|
||||
// Advances the cursor while writing, inverts the pixels if true
|
||||
// Remapped to call 'void oled_write(const char *data, bool invert);' on ARM
|
||||
@@ -364,6 +390,11 @@ void oled_write_ln_P(const char *data, bool invert);
|
||||
|
||||
// Writes a PROGMEM string to the buffer at current cursor position
|
||||
void oled_write_raw_P(const char *data, uint16_t size);
|
||||
#else
|
||||
# define oled_write_P(data, invert) oled_write(data, invert)
|
||||
# define oled_write_ln_P(data, invert) oled_write_ln(data, invert)
|
||||
# define oled_write_raw_P(data, size) oled_write_raw(data, size)
|
||||
#endif // defined(__AVR__)
|
||||
|
||||
// Can be used to manually turn on the screen if it is off
|
||||
// Returns true if the screen was on or turns on
|
||||
@@ -398,7 +429,7 @@ void oled_scroll_set_area(uint8_t start_line, uint8_t end_line);
|
||||
// Sets scroll speed, 0-7, fastest to slowest. Default is three.
|
||||
// Does not take effect until scrolling is either started or restarted
|
||||
// the ssd1306 supports 8 speeds with the delay
|
||||
// listed below betwen each frame of the scrolling effect
|
||||
// listed below between each frame of the scrolling effect
|
||||
// 0=2, 1=3, 2=4, 3=5, 4=25, 5=64, 6=128, 7=256
|
||||
void oled_scroll_set_speed(uint8_t speed);
|
||||
|
||||
|
@@ -14,7 +14,7 @@ In your `rules.mk` add:
|
||||
OS_DETECTION_ENABLE = yes
|
||||
```
|
||||
|
||||
Include `"os_detection.h"` in your `keymap.c`.
|
||||
It will automatically include the required headers file.
|
||||
It declares `os_variant_t detected_host_os(void);` which you can call to get detected OS.
|
||||
|
||||
It returns one of the following values:
|
||||
@@ -32,14 +32,67 @@ enum {
|
||||
?> Note that it takes some time after firmware is booted to detect the OS.
|
||||
This time is quite short, probably hundreds of milliseconds, but this data may be not ready in keyboard and layout setup functions which run very early during firmware startup.
|
||||
|
||||
## Callbacks :id=callbacks
|
||||
|
||||
If you want to perform custom actions when the OS is detected, then you can use the `process_detected_host_os_kb` function on the keyboard level source file, or `process_detected_host_os_user` function in the user `keymap.c`.
|
||||
|
||||
```c
|
||||
bool process_detected_host_os_kb(os_variant_t detected_os) {
|
||||
if (!process_detected_host_os_user(detected_os)) {
|
||||
return false;
|
||||
}
|
||||
switch (detected_os) {
|
||||
case OS_MACOS:
|
||||
case OS_IOS:
|
||||
rgb_matrix_set_color_all(RGB_WHITE);
|
||||
break;
|
||||
case OS_WINDOWS:
|
||||
rgb_matrix_set_color_all(RGB_BLUE);
|
||||
break;
|
||||
case OS_LINUX:
|
||||
rgb_matrix_set_color_all(RGB_ORANGE);
|
||||
break;
|
||||
case OS_UNSURE:
|
||||
rgb_matrix_set_color_all(RGB_RED);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
## OS detection stability
|
||||
|
||||
The OS detection is currently handled while the USB device descriptor is being assembled.
|
||||
The process is done in steps, generating a number of intermediate results until it stabilizes.
|
||||
We therefore resort to debouncing the result until it has been stable for a given amount of milliseconds.
|
||||
This amount can be configured, in case your board is not stable within the default debouncing time of 200ms.
|
||||
|
||||
## KVM and USB switches
|
||||
|
||||
Some KVM and USB switches may not trigger the USB controller on the keyboard to fully reset upon switching machines.
|
||||
If your keyboard does not redetect the OS in this situation, you can force the keyboard to reset when the USB initialization event is detected, forcing the USB controller to be reconfigured.
|
||||
|
||||
## Configuration Options
|
||||
|
||||
* `#define OS_DETECTION_DEBOUNCE 200`
|
||||
* defined the debounce time for OS detection, in milliseconds
|
||||
* `#define OS_DETECTION_KEYBOARD_RESET`
|
||||
* enables the keyboard reset upon a USB device reinitilization, such as switching devices on some KVMs
|
||||
|
||||
## Debug
|
||||
|
||||
If OS is guessed incorrectly, you may want to collect data about USB setup packets to refine the detection logic.
|
||||
|
||||
To do so in your `rules.mk` add:
|
||||
To do so in your `config.h` add:
|
||||
|
||||
```c
|
||||
#define OS_DETECTION_DEBUG_ENABLE
|
||||
```
|
||||
|
||||
And in your `rules.mk` add:
|
||||
|
||||
```make
|
||||
OS_DETECTION_DEBUG_ENABLE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
```
|
||||
|
||||
|
@@ -69,10 +69,94 @@ The Analog Joystick is an analog (ADC) driven sensor. There are a variety of jo
|
||||
| `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_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|
||||
| `ANALOG_JOYSTICK_AUTO_AXIS` | (Optional) Sets ranges to be considered movement automatically. | _not defined_ |
|
||||
| `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_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_WEIGHTS` | (Optional) Use custom weights for lever positions. | _not defined_ |
|
||||
| `ANALOG_JOYSTICK_CUTOFF` | (Optional) Cut off movement when joystick returns to start position. | _not defined_ |
|
||||
|
||||
If `ANALOG_JOYSTICK_AUTO_AXIS` is used, then `ANALOG_JOYSTICK_AXIS_MIN` and `ANALOG_JOYSTICK_AXIS_MAX` are ignored.
|
||||
|
||||
By default analog joystick implementation uses `x^2` weighting for lever positions. `ANALOG_JOYSTICK_WEIGHTS` allows to experiment with different configurations that might feel better.
|
||||
|
||||
E.g. This is weights for `((x-0.4)^3+0.064)/0.282`:
|
||||
|
||||
```c
|
||||
#define ANALOG_JOYSTICK_WEIGHTS {0,2,4,5,7,8,9,10,12,13,14,15,15,16,17,18,18,19,19,20,20,21,21,21,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,25,25,25,26,26,26,27,28,28,29,29,30,31,32,33,34,35,36,37,38,40,41,43,44,46,48,49,51,53,56,58,60,62,65,68,70,73,76,79,82,85,89,92,96,100}
|
||||
```
|
||||
|
||||
You can use following JS code to generate weights for different formulas:
|
||||
|
||||
```js
|
||||
JSON.stringify(Array.from(Array(101).keys()).map(x => Math.ceil((((x/100-0.4)**3+0.064)/0.282*100))))
|
||||
```
|
||||
|
||||
### Azoteq IQS5XX Trackpad
|
||||
|
||||
To use a Azoteq IQS5XX trackpad, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
POINTING_DEVICE_DRIVER = azoteq_iqs5xx
|
||||
```
|
||||
|
||||
This supports the IQS525, IQS550 and IQS572 controllers, with the latter two being used in the TPS43 and TPS65 trackpads.
|
||||
|
||||
#### Device settings
|
||||
|
||||
Specific device profiles are provided which set the required values for dimensions and resolution.
|
||||
|
||||
| Setting | Description |
|
||||
| -------------------------------- | ---------------------------------------------------------- |
|
||||
| `AZOTEQ_IQS5XX_TPS43` | (Pick One) Sets resolution/mm to TPS43 specifications. |
|
||||
| `AZOTEQ_IQS5XX_TPS65` | (Pick One) Sets resolution/mm to TPS65 specifications. |
|
||||
|
||||
?> If using one of the above defines you can skip to gesture settings.
|
||||
|
||||
| Setting | Description | Default |
|
||||
| -------------------------------- | ---------------------------------------------------------- | ------------- |
|
||||
| `AZOTEQ_IQS5XX_WIDTH_MM` | (Required) Width of the trackpad sensor in millimeters. | _not defined_ |
|
||||
| `AZOTEQ_IQS5XX_HEIGHT_MM` | (Required) Height of the trackpad sensor in millimeters. | _not defined_ |
|
||||
| `AZOTEQ_IQS5XX_RESOLUTION_X` | (Optional) Specify X resolution for CPI calculation. | _not defined_ |
|
||||
| `AZOTEQ_IQS5XX_RESOLUTION_Y` | (Optional) Specify Y resolution for CPI calculation. | _not defined_ |
|
||||
|
||||
**`AZOTEQ_IQS5XX_RESOLUTION_X/Y`** fall back resolutions are provided within the driver based on controller model.
|
||||
|
||||
| I2C Setting | Description | Default |
|
||||
| ------------------------- | ------------------------------------------------------------------------------- | ------- |
|
||||
| `AZOTEQ_IQS5XX_ADDRESS` | (Optional) Sets the I2C Address for the Azoteq trackpad | `0xE8` |
|
||||
| `AZOTEQ_IQS5XX_TIMEOUT_MS`| (Optional) The timeout for i2c communication with in milliseconds. | `10` |
|
||||
|
||||
#### Gesture settings
|
||||
|
||||
| Setting | Description | Default |
|
||||
| ----------------------------------------- | ------------------------------------------------------------------------------------ | ----------- |
|
||||
| `AZOTEQ_IQS5XX_TAP_ENABLE` | (Optional) Enable single finger tap. (Left click) | `true` |
|
||||
| `AZOTEQ_IQS5XX_TWO_FINGER_TAP_ENABLE` | (Optional) Enable two finger tap. (Right click) | `true` |
|
||||
| `AZOTEQ_IQS5XX_PRESS_AND_HOLD_ENABLE` | (Optional) Emulates holding left click to select text. | `false` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_X_ENABLE` | (Optional) Enable swipe gestures X+ (Mouse Button 5) / X- (Mouse Button 4) | `false` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_Y_ENABLE` | (Optional) Enable swipe gestures Y+ (Mouse Button 3) / Y- (Mouse Button 6) | `false` |
|
||||
| `AZOTEQ_IQS5XX_ZOOM_ENABLE` | (Optional) Enable zoom gestures Zoom Out (Mouse Button 7) / Zoom In (Mouse Button 8) | `false` |
|
||||
| `AZOTEQ_IQS5XX_SCROLL_ENABLE` | (Optional) Enable scrolling using two fingers. | `true` |
|
||||
| `AZOTEQ_IQS5XX_TAP_TIME` | (Optional) Maximum time in ms for tap to be registered. | `150` |
|
||||
| `AZOTEQ_IQS5XX_TAP_DISTANCE` | (Optional) Maximum deviation in pixels before single tap is no longer valid. | `25` |
|
||||
| `AZOTEQ_IQS5XX_HOLD_TIME` | (Optional) Minimum time in ms for press and hold. | `300` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_INITIAL_TIME` | (Optional) Maximum time to travel initial distance before swipe is registered. | `150` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_INITIAL_DISTANCE` | (Optional) Minimum travel in pixels before swipe is registered. | `300` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_CONSECUTIVE_TIME` | (Optional) Maximum time to travel consecutive distance before swipe is registered. | `0` |
|
||||
| `AZOTEQ_IQS5XX_SWIPE_CONSECUTIVE_DISTANCE`| (Optional) Minimum travel in pixels before a consecutive swipe is registered. | `2000` |
|
||||
| `AZOTEQ_IQS5XX_SCROLL_INITIAL_DISTANCE` | (Optional) Minimum travel in pixels before scroll is registered. | `50` |
|
||||
| `AZOTEQ_IQS5XX_ZOOM_INITIAL_DISTANCE` | (Optional) Minimum travel in pixels before zoom is registered. | `50` |
|
||||
| `AZOTEQ_IQS5XX_ZOOM_CONSECUTIVE_DISTANCE` | (Optional) Maximum time to travel zoom distance before zoom is registered. | `25` |
|
||||
|
||||
#### Rotation settings
|
||||
|
||||
| Setting | Description | Default |
|
||||
| ---------------------------- | ---------------------------------------------------------- | ------------- |
|
||||
| `AZOTEQ_IQS5XX_ROTATION_90` | (Optional) Configures hardware for 90 degree rotation. | _not defined_ |
|
||||
| `AZOTEQ_IQS5XX_ROTATION_180` | (Optional) Configures hardware for 180 degree rotation. | _not defined_ |
|
||||
| `AZOTEQ_IQS5XX_ROTATION_270` | (Optional) Configures hardware for 270 degree rotation. | _not defined_ |
|
||||
|
||||
### Cirque Trackpad
|
||||
|
||||
@@ -93,12 +177,13 @@ This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the
|
||||
|
||||
#### Common settings
|
||||
|
||||
| Setting | Description | Default |
|
||||
| -------------------------------- | ---------------------------------------------------------- | ------------------------------------------- |
|
||||
| `CIRQUE_PINNACLE_DIAMETER_MM` | (Optional) Diameter of the trackpad sensor in millimeters. | `40` |
|
||||
| `CIRQUE_PINNACLE_ATTENUATION` | (Optional) Sets the attenuation of the sensor data. | `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_4X` |
|
||||
| `CIRQUE_PINNACLE_CURVED_OVERLAY` | (Optional) Applies settings tuned for curved overlay. | _not defined_ |
|
||||
| `CIRQUE_PINNACLE_POSITION_MODE` | (Optional) Mode of operation. | _not defined_ |
|
||||
| Setting | Description | Default |
|
||||
| ------------------------------------ | ---------------------------------------------------------- | ------------------------------------------- |
|
||||
| `CIRQUE_PINNACLE_DIAMETER_MM` | (Optional) Diameter of the trackpad sensor in millimeters. | `40` |
|
||||
| `CIRQUE_PINNACLE_ATTENUATION` | (Optional) Sets the attenuation of the sensor data. | `EXTREG__TRACK_ADCCONFIG__ADC_ATTENUATE_4X` |
|
||||
| `CIRQUE_PINNACLE_CURVED_OVERLAY` | (Optional) Applies settings tuned for curved overlay. | _not defined_ |
|
||||
| `CIRQUE_PINNACLE_POSITION_MODE` | (Optional) Mode of operation. | _not defined_ |
|
||||
| `CIRQUE_PINNACLE_SKIP_SENSOR_CHECK` | (Optional) Skips sensor presence check | _not defined_ |
|
||||
|
||||
**`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.
|
||||
|
||||
@@ -132,12 +217,13 @@ Also see the `POINTING_DEVICE_TASK_THROTTLE_MS`, which defaults to 10ms when usi
|
||||
|
||||
#### Absolute mode settings
|
||||
|
||||
| Setting | Description | Default |
|
||||
| -------------------------------- | ---------------------------------------------------------- | ------------------ |
|
||||
| `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_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` |
|
||||
| Setting | Description | Default |
|
||||
|-----------------------------------------|-------------------------------------------------------------------------|-------------|
|
||||
| `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_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_REACHABLE_CALIBRATION` | (Optional) Enable console messages to aide in calibrating above values. | not defined |
|
||||
|
||||
#### Absolute mode gestures
|
||||
|
||||
@@ -643,6 +729,7 @@ There are a few ways to control the auto mouse feature with both `config.h` opti
|
||||
| `AUTO_MOUSE_TIME` | (Optional) Time layer remains active after activation | _ideally_ (250-1000) | _ms_ | `650 ms` |
|
||||
| `AUTO_MOUSE_DELAY` | (Optional) Lockout time after non-mouse key is pressed | _ideally_ (100-1000) | _ms_ | `TAPPING_TERM` or `200 ms` |
|
||||
| `AUTO_MOUSE_DEBOUNCE` | (Optional) Time delay from last activation to next update | _ideally_ (10 - 100) | _ms_ | `25 ms` |
|
||||
| `AUTO_MOUSE_THRESHOLD` | (Optional) Amount of mouse movement required to switch layers | 0 - | _units_ | `10 units` |
|
||||
|
||||
### Adding mouse keys
|
||||
|
||||
@@ -735,9 +822,11 @@ layer_state_t layer_state_set_user(layer_state_t state) {
|
||||
|
||||
#### Set different target layer when a particular layer is active:
|
||||
|
||||
The below code will change the auto mouse layer target to `_MOUSE_LAYER_2` when `_DEFAULT_LAYER_2` is highest default layer state.
|
||||
*NOTE: that `auto_mouse_layer_off` is used here instead of `remove_auto_mouse_layer` as `default_layer_state_set_*` stack is separate from the `layer_state_set_*` stack* if something similar was to be done in `layer_state_set_user `state = remove_auto_mouse_layer(state, false)` should be used instead
|
||||
*ADDITIONAL NOTE: `AUTO_MOUSE_TARGET_LAYER` is checked if already set to avoid deactivating the target layer unless needed*
|
||||
The below code will change the auto mouse layer target to `_MOUSE_LAYER_2` when `_DEFAULT_LAYER_2` is highest default layer state.
|
||||
|
||||
*NOTE: that `auto_mouse_layer_off` is used here instead of `remove_auto_mouse_layer` as `default_layer_state_set_*` stack is separate from the `layer_state_set_*` stack*, if something similar was to be done in `layer_state_set_user`, `state = remove_auto_mouse_layer(state, false)` should be used instead.
|
||||
|
||||
*ADDITIONAL NOTE: `AUTO_MOUSE_TARGET_LAYER` is checked if already set to avoid deactivating the target layer unless needed*.
|
||||
|
||||
```c
|
||||
// in keymap.c
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
Programmable Buttons are keys that have no predefined meaning. This means they can be processed on the host side by custom software without the operating system trying to interpret them.
|
||||
|
||||
The keycodes are emitted according to the HID Telephony Device page (`0x0B`), Programmable Button usage (`0x07`). On Linux (> 5.14) they are handled automatically and translated to `KEY_MACRO#` keycodes (up to `KEY_MACRO30`).
|
||||
The keycodes are emitted according to the HID Telephony Device page (`0x0B`), Programmable Button usage (`0x09`). On Linux (> 5.14) they are handled automatically and translated to `KEY_MACRO#` keycodes (up to `KEY_MACRO30`).
|
||||
|
||||
?> Currently there is no known support in Windows or macOS. It may be possible to write a custom HID driver to receive these usages, but this is out of the scope of the QMK documentation.
|
||||
|
||||
|
@@ -155,6 +155,29 @@ In your keyboard config.h:
|
||||
#endif
|
||||
```
|
||||
|
||||
### RP2040 PIO Version :id=rp2040-pio-version
|
||||
|
||||
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU.
|
||||
|
||||
There are strict requirements for pin ordering but any pair of GPIO pins can be used. The GPIO used for clock must be directly after data, see the included info.json snippet for an example of correct order.
|
||||
|
||||
You may optionally switch the PIO peripheral used with the following define in config.h:
|
||||
```c
|
||||
#define PS2_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the PS2 implementation uses the PIO0 peripheral
|
||||
```
|
||||
|
||||
Example info.json content:
|
||||
|
||||
```json
|
||||
"ps2": {
|
||||
"clock_pin": "GP1",
|
||||
"data_pin": "GP0",
|
||||
"driver": "vendor",
|
||||
"enabled": true,
|
||||
"mouse_enabled": true
|
||||
}
|
||||
```
|
||||
|
||||
## Additional Settings :id=additional-settings
|
||||
|
||||
### PS/2 Mouse Features :id=ps2-mouse-features
|
||||
|
@@ -28,7 +28,7 @@ To send data to the keyboard, you must first find a library for communicating wi
|
||||
* **Node.js:** [node-hid](https://github.com/node-hid/node-hid)
|
||||
* **C/C++:** [hidapi](https://github.com/libusb/hidapi)
|
||||
* **Java:** [purejavahidapi](https://github.com/nyholku/purejavahidapi) and [hid4java](https://github.com/gary-rowe/hid4java)
|
||||
* **Python:** [pyhidapi](https://pypi.org/project/hid/)
|
||||
* **Python:** [pyhidapi](https://pypi.org/project/hid/) and [pywinusb](https://pypi.org/project/pywinusb)
|
||||
|
||||
Please refer to these libraries' own documentation for instructions on usage. Remember to close the device once you are finished with it!
|
||||
|
||||
|
@@ -19,15 +19,14 @@ You can use between 1 and 4 IS31FL3731 IC's. Do not specify `DRIVER_ADDR_<N>` de
|
||||
|
||||
| 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 |
|
||||
| `ISSI_3731_DEGHOST` | (Optional) Set this define to enable de-ghosting by halving Vcc during blanking time | |
|
||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||
| `IS31FL3731_I2C_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `IS31FL3731_I2C_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `IS31FL3731_DEGHOST` | (Optional) Set this define to enable de-ghosting by halving Vcc during blanking time | |
|
||||
| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_1` | (Required) Address for the first RGB driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_2` | (Optional) Address for the second RGB driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_3` | (Optional) Address for the third RGB driver | |
|
||||
| `IS31FL3731_I2C_ADDRESS_4` | (Optional) Address for the fourth RGB driver | |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
@@ -35,14 +34,15 @@ Here is an example using 2 drivers.
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0b1110100 AD <-> GND
|
||||
// 0b1110111 AD <-> VCC
|
||||
// 0b1110101 AD <-> SCL
|
||||
// 0b1110110 AD <-> SDA
|
||||
#define DRIVER_ADDR_1 0b1110100
|
||||
#define DRIVER_ADDR_2 0b1110110
|
||||
// 00 AD <-> GND
|
||||
// 01 AD <-> SCL
|
||||
// 10 AD <-> SDA
|
||||
// 11 AD <-> VCC
|
||||
// ADDR represents A1:A0 of the 7-bit address.
|
||||
// The result is: 0b11101(ADDR)
|
||||
#define IS31FL3731_I2C_ADDRESS_1 IS31FL3731_I2C_ADDRESS_GND
|
||||
#define IS31FL3731_I2C_ADDRESS_2 IS31FL3731_I2C_ADDRESS_SDA
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 25
|
||||
#define DRIVER_2_LED_TOTAL 24
|
||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -50,12 +50,12 @@ Here is an example using 2 drivers.
|
||||
|
||||
!> Note the parentheses, this is so when `RGB_MATRIX_LED_COUNT` 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`.
|
||||
|
||||
For split keyboards using `RGB_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `DRIVER_ADDR_1` for one and `DRIVER_ADDR_2` for the other one. Then, in `g_is31_leds`, fill out the correct driver index (0 or 1). If using one address, use `DRIVER_ADDR_1` for both, and use index 0 for `g_is31_leds`.
|
||||
For split keyboards using `RGB_MATRIX_SPLIT` with an LED driver, you can either have the same driver address or different driver addresses. If using different addresses, use `IS31FL3731_I2C_ADDRESS_1` for one and `IS31FL3731_I2C_ADDRESS_2` for the other one. Then, in `g_is31fl3731_leds`, fill out the correct driver index (0 or 1). If using one address, use `IS31FL3731_I2C_ADDRESS_1` for both, and use index 0 for `g_is31fl3731_leds`.
|
||||
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | R location
|
||||
@@ -83,34 +83,33 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
|
||||
|
||||
| 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 |
|
||||
| `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_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 | |
|
||||
| `IS31FL3733_I2C_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `IS31FL3733_I2C_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `IS31FL3733_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
|
||||
| `IS31FL3733_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||
| `IS31FL3733_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `IS31FL3733_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `DRIVER_SYNC_1` | (Optional) Sync configuration for the first RGB driver | 0 |
|
||||
| `DRIVER_SYNC_2` | (Optional) Sync configuration for the second RGB driver | 0 |
|
||||
| `DRIVER_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 |
|
||||
| `DRIVER_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 |
|
||||
| `IS31FL3733_I2C_ADDRESS_1` | (Required) Address for the first RGB driver | |
|
||||
| `IS31FL3733_I2C_ADDRESS_2` | (Optional) Address for the second RGB driver | |
|
||||
| `IS31FL3733_I2C_ADDRESS_3` | (Optional) Address for the third RGB driver | |
|
||||
| `IS31FL3733_I2C_ADDRESS_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `IS31FL3733_SYNC_1` | (Optional) Sync configuration for the first RGB driver | 0 |
|
||||
| `IS31FL3733_SYNC_2` | (Optional) Sync configuration for the second RGB driver | 0 |
|
||||
| `IS31FL3733_SYNC_3` | (Optional) Sync configuration for the third RGB driver | 0 |
|
||||
| `IS31FL3733_SYNC_4` | (Optional) Sync configuration for the fourth RGB driver | 0 |
|
||||
|
||||
The IS31FL3733 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
The IS31FL3733 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`IS31FL3733_SWPULLUP`/`IS31FL3733_CSPULLUP` are given the value of `IS31FL3733_PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
|
||||
| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
|
||||
| `IS31FL3733_SWPULLUP/IS31FL3733_CSPULLUP` | Description |
|
||||
|----------------------|-------------|
|
||||
| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_3KR` | The 3k Ohm resistor used at all times |
|
||||
| `PUR_4KR` | The 4k Ohm resistor used at all times |
|
||||
| `PUR_8KR` | The 8k Ohm resistor used at all times |
|
||||
| `PUR_16KR` | The 16k Ohm resistor used at all times |
|
||||
| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3733_PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `IS31FL3733_PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3733_PUR_3KR` | The 3k Ohm resistor used at all times |
|
||||
| `IS31FL3733_PUR_4KR` | The 4k Ohm resistor used at all times |
|
||||
| `IS31FL3733_PUR_8KR` | The 8k Ohm resistor used at all times |
|
||||
| `IS31FL3733_PUR_16KR` | The 16k Ohm resistor used at all times |
|
||||
| `IS31FL3733_PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
@@ -118,17 +117,16 @@ Here is an example using 2 drivers.
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 00 <-> GND
|
||||
// 01 <-> SCL
|
||||
// 10 <-> SDA
|
||||
// 11 <-> VCC
|
||||
// 00 ADDRn <-> GND
|
||||
// 01 ADDRn <-> SCL
|
||||
// 10 ADDRn <-> SDA
|
||||
// 11 ADDRn <-> VCC
|
||||
// ADDR1 represents A1:A0 of the 7-bit address.
|
||||
// ADDR2 represents A3:A2 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR2)(ADDR1)
|
||||
#define DRIVER_ADDR_1 0b1010000
|
||||
#define DRIVER_ADDR_2 0b1010011
|
||||
#define IS31FL3733_I2C_ADDRESS_1 IS31FL3733_I2C_ADDRESS_GND_GND
|
||||
#define IS31FL3733_I2C_ADDRESS_2 IS31FL3733_I2C_ADDRESS_GND_VCC
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 58
|
||||
#define DRIVER_2_LED_TOTAL 10
|
||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -141,19 +139,19 @@ Currently only 4 drivers are supported, but it would be trivial to support all 8
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | R location
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, B_1, A_1, C_1},
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
....
|
||||
}
|
||||
```
|
||||
|
||||
Where `X_Y` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/led/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||
Where `SWx_CSy` is the location of the LED in the matrix defined by [the datasheet](https://www.issi.com/WW/pdf/31FL3733.pdf) and the header file `drivers/led/issi/is31fl3733.h`. The `driver` is the index of the driver you defined in your `config.h` (`0`, `1`, `2`, or `3` for now).
|
||||
|
||||
---
|
||||
### IS31FL3736 :id=is31fl3736
|
||||
@@ -170,31 +168,30 @@ 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 |
|
||||
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3736B 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_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 | |
|
||||
| `IS31FL3736_I2C_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `IS31FL3736_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `IS31FL3736_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3736B only | 0 |
|
||||
| `IS31FL3736_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||
| `IS31FL3736_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `IS31FL3736_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `IS31FL3736_I2C_ADDRESS_1` | (Required) Address for the first RGB driver | |
|
||||
| `IS31FL3736_I2C_ADDRESS_2` | (Optional) Address for the second RGB driver | |
|
||||
| `IS31FL3736_I2C_ADDRESS_3` | (Optional) Address for the third RGB driver | |
|
||||
| `IS31FL3736_I2C_ADDRESS_4` | (Optional) Address for the fourth RGB driver | |
|
||||
|
||||
The IS31FL3736 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
The IS31FL3736 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`IS31FL3736_SWPULLUP`/`IS31FL3736_CSPULLUP` are given the value of `IS31FL3736_PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
|
||||
| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
|
||||
| `IS31FL3736_SWPULLUP/IS31FL3736_CSPULLUP` | Description |
|
||||
|----------------------|-------------|
|
||||
| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
|
||||
| `PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
|
||||
| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `IS31FL3736_PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
|
||||
| `IS31FL3736_PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
@@ -202,16 +199,16 @@ Here is an example using 2 drivers.
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0000 <-> GND
|
||||
// 0101 <-> SCL
|
||||
// 1010 <-> SDA
|
||||
// 1111 <-> VCC
|
||||
// ADDR represents A3:A0 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR)
|
||||
#define DRIVER_ADDR_1 0b1010000
|
||||
#define DRIVER_ADDR_2 0b1010001
|
||||
// 00 ADDRn <-> GND
|
||||
// 01 ADDRn <-> SCL
|
||||
// 10 ADDRn <-> SDA
|
||||
// 11 ADDRn <-> VCC
|
||||
// ADDR1 represents A1:A0 of the 7-bit address.
|
||||
// ADDR2 represents A3:A2 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR2)(ADDR1)
|
||||
#define IS31FL3736_I2C_ADDRESS_1 IS31FL3736_I2C_ADDRESS_GND_GND
|
||||
#define IS31FL3736_I2C_ADDRESS_2 IS31FL3736_I2C_ADDRESS_GND_SCL
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 30
|
||||
#define DRIVER_2_LED_TOTAL 32
|
||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -221,14 +218,14 @@ Here is an example using 2 drivers.
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | R location
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, B_1, A_1, C_1},
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
....
|
||||
}
|
||||
```
|
||||
@@ -246,31 +243,30 @@ 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 |
|
||||
| `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_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 | |
|
||||
| `IS31FL3737_I2C_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
|
||||
| `IS31FL3737_I2C_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
|
||||
| `IS31FL3737_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
|
||||
| `IS31FL3737_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
|
||||
| `IS31FL3737_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `IS31FL3737_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
|
||||
| `RGB_MATRIX_LED_COUNT` | (Required) How many RGB lights are present across all drivers | |
|
||||
| `DRIVER_ADDR_1` | (Required) Address for the first RGB driver | |
|
||||
| `DRIVER_ADDR_2` | (Optional) Address for the second RGB driver | |
|
||||
| `DRIVER_ADDR_3` | (Optional) Address for the third RGB driver | |
|
||||
| `DRIVER_ADDR_4` | (Optional) Address for the fourth RGB driver | |
|
||||
| `IS31FL3737_I2C_ADDRESS_1` | (Required) Address for the first RGB driver | |
|
||||
| `IS31FL3737_I2C_ADDRESS_2` | (Optional) Address for the second RGB driver | |
|
||||
| `IS31FL3737_I2C_ADDRESS_3` | (Optional) Address for the third RGB driver | |
|
||||
| `IS31FL3737_I2C_ADDRESS_4` | (Optional) Address for the fourth RGB driver | |
|
||||
|
||||
The IS31FL3737 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`ISSI_SWPULLUP`/`ISSI_CSPULLUP` are given the value of`PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
The IS31FL3737 IC's have on-chip resistors that can be enabled to allow for de-ghosting of the RGB matrix. By default these resistors are not enabled (`IS31FL3737_SWPULLUP`/`IS31FL3737_CSPULLUP` are given the value of `IS31FL3737_PUR_0R`), the values that can be set to enable de-ghosting are as follows:
|
||||
|
||||
| `ISSI_SWPULLUP/ISSI_CSPULLUP` | Description |
|
||||
| `IS31FL3737_SWPULLUP/IS31FL3737_CSPULLUP` | Description |
|
||||
|----------------------|-------------|
|
||||
| `PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
|
||||
| `PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
|
||||
| `PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_0R` | (default) Do not use the on-chip resistors/enable de-ghosting |
|
||||
| `IS31FL3737_PUR_05KR` | The 0.5k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_1KR` | The 1k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_2KR` | The 2k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_4KR` | The 4k Ohm resistor used during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_8KR` | The 8k Ohm resistor during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_16KR` | The 16k Ohm resistor during blanking period (t_NOL) |
|
||||
| `IS31FL3737_PUR_32KR` | The 32k Ohm resistor used during blanking period (t_NOL) |
|
||||
|
||||
Here is an example using 2 drivers.
|
||||
|
||||
@@ -278,16 +274,15 @@ Here is an example using 2 drivers.
|
||||
// This is a 7-bit address, that gets left-shifted and bit 0
|
||||
// set to 0 for write, 1 for read (as per I2C protocol)
|
||||
// The address will vary depending on your wiring:
|
||||
// 0000 <-> GND
|
||||
// 0101 <-> SCL
|
||||
// 1010 <-> SDA
|
||||
// 1111 <-> VCC
|
||||
// 0000 ADDR <-> GND
|
||||
// 0101 ADDR <-> SCL
|
||||
// 1010 ADDR <-> SDA
|
||||
// 1111 ADDR <-> VCC
|
||||
// ADDR represents A3:A0 of the 7-bit address.
|
||||
// The result is: 0b101(ADDR)
|
||||
#define DRIVER_ADDR_1 0b1010000
|
||||
#define DRIVER_ADDR_2 0b1010001
|
||||
#define IS31FL3737_I2C_ADDRESS_1 IS31FL3737_I2C_ADDRESS_GND
|
||||
#define IS31FL3737_I2C_ADDRESS_2 IS31FL3737_I2C_ADDRESS_SCL
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 30
|
||||
#define DRIVER_2_LED_TOTAL 36
|
||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -297,19 +292,19 @@ Here is an example using 2 drivers.
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
|
||||
/* Refer to IS31 manual for these locations
|
||||
* driver
|
||||
* | R location
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, B_1, A_1, C_1},
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
....
|
||||
}
|
||||
```
|
||||
|
||||
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`, `2`, or `3` for now).
|
||||
Where `SWx_CSy` 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`, `2`, or `3` for now).
|
||||
|
||||
---
|
||||
### IS31FLCOMMON :id=is31flcommon
|
||||
@@ -338,7 +333,6 @@ Configure the hardware via your `config.h`:
|
||||
|----------|-------------|---------|
|
||||
| `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 | |
|
||||
| `RGB_MATRIX_LED_COUNT` | (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 | |
|
||||
@@ -373,7 +367,6 @@ 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 RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -393,7 +386,7 @@ const is31_led PROGMEM g_is31_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{0, CS1_SW1, CS2_SW1, CS3_SW1},
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
....
|
||||
}
|
||||
```
|
||||
@@ -407,7 +400,7 @@ Then Define the array listing all the LEDs you want to override in your `<keyboa
|
||||
|
||||
```c
|
||||
const is31_led PROGMEM g_is31_scaling[ISSI_MANUAL_SCALING] = {
|
||||
* LED Index
|
||||
/* LED Index
|
||||
* | R scaling
|
||||
* | | G scaling
|
||||
* | | | B scaling
|
||||
@@ -465,41 +458,39 @@ Configure the hardware via your `config.h`:
|
||||
```
|
||||
|
||||
---
|
||||
### AW20216 :id=aw20216
|
||||
There is basic support for addressable RGB matrix lighting with the SPI AW20216 RGB controller. To enable it, add this to your `rules.mk`:
|
||||
### AW20216S :id=aw20216s
|
||||
There is basic support for addressable RGB matrix lighting with the SPI AW20216S RGB controller. To enable it, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
RGB_MATRIX_ENABLE = yes
|
||||
RGB_MATRIX_DRIVER = aw20216
|
||||
RGB_MATRIX_DRIVER = aw20216s
|
||||
```
|
||||
|
||||
You can use up to 2 AW20216 IC's. Do not specify `DRIVER_<N>_xxx` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
|
||||
You can use up to 2 AW20216S IC's. Do not specify `DRIVER_<N>_xxx` defines for IC's that are not present on your keyboard. You can define the following items in `config.h`:
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `DRIVER_1_CS` | (Required) MCU pin connected to first RGB driver chip select line | B13 |
|
||||
| `DRIVER_2_CS` | (Optional) MCU pin connected to second RGB driver chip select line | |
|
||||
| `DRIVER_1_EN` | (Required) MCU pin connected to first RGB driver hardware enable line | C13 |
|
||||
| `DRIVER_2_EN` | (Optional) MCU pin connected to second RGB driver hardware enable line | |
|
||||
| `AW20216S_CS_PIN_1` | (Required) MCU pin connected to first RGB driver chip select line | B13 |
|
||||
| `AW20216S_CS_PIN_2` | (Optional) MCU pin connected to second RGB driver chip select line | |
|
||||
| `AW20216S_EN_PIN_1` | (Required) MCU pin connected to first RGB driver hardware enable line | C13 |
|
||||
| `AW20216S_EN_PIN_2` | (Optional) MCU pin connected to second RGB driver hardware enable line | |
|
||||
| `DRIVER_1_LED_TOTAL` | (Required) How many RGB lights are connected to first RGB driver | |
|
||||
| `DRIVER_2_LED_TOTAL` | (Optional) How many RGB lights are connected to second RGB driver | |
|
||||
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
|
||||
| `RGB_MATRIX_LED_COUNT` | (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_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 |
|
||||
| `AW20216S_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 |
|
||||
| `AW20216S_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 |
|
||||
| `AW20216S_SPI_MODE` | (Optional) Mode for SPI communication (0-3, defines polarity and phase of the clock) | 3 |
|
||||
| `AW20216S_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.
|
||||
|
||||
```c
|
||||
#define DRIVER_1_CS B13
|
||||
#define DRIVER_2_CS B14
|
||||
#define AW20216S_CS_PIN_1 B13
|
||||
#define AW20216S_CS_PIN_2 B14
|
||||
// Hardware enable lines may be connected to the same pin
|
||||
#define DRIVER_1_EN C13
|
||||
#define DRIVER_2_EN C13
|
||||
#define AW20216S_EN_PIN_1 C13
|
||||
#define AW20216S_EN_PIN_2 C13
|
||||
|
||||
#define DRIVER_COUNT 2
|
||||
#define DRIVER_1_LED_TOTAL 66
|
||||
#define DRIVER_2_LED_TOTAL 32
|
||||
#define RGB_MATRIX_LED_COUNT (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
|
||||
@@ -510,26 +501,26 @@ Here is an example using 2 drivers.
|
||||
Define these arrays listing all the LEDs in your `<keyboard>.c`:
|
||||
|
||||
```c
|
||||
const aw_led PROGMEM g_aw_leds[RGB_MATRIX_LED_COUNT] = {
|
||||
/* Each AW20216 channel is controlled by a register at some offset between 0x00
|
||||
const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT] = {
|
||||
/* Each AW20216S channel is controlled by a register at some offset between 0x00
|
||||
* and 0xD7 inclusive.
|
||||
* See drivers/awinic/aw20216.h for the mapping between register offsets and
|
||||
* See drivers/led/aw20216s.h for the mapping between register offsets and
|
||||
* driver pin locations.
|
||||
* driver
|
||||
* | R location
|
||||
* | | G location
|
||||
* | | | B location
|
||||
* | | | | */
|
||||
{ 0, CS1_SW1, CS2_SW1, CS3_SW1 },
|
||||
{ 0, CS4_SW1, CS5_SW1, CS6_SW1 },
|
||||
{ 0, CS7_SW1, CS8_SW1, CS9_SW1 },
|
||||
{ 0, CS10_SW1, CS11_SW1, CS12_SW1 },
|
||||
{ 0, CS13_SW1, CS14_SW1, CS15_SW1 },
|
||||
{ 0, SW1_CS1, SW1_CS2, SW1_CS3 },
|
||||
{ 0, SW1_CS4, SW1_CS5, SW1_CS6 },
|
||||
{ 0, SW1_CS7, SW1_CS8, SW1_CS9 },
|
||||
{ 0, SW1_CS10, SW1_CS11, SW1_CS12 },
|
||||
{ 0, SW1_CS13, SW1_CS14, SW1_CS15 },
|
||||
...
|
||||
{ 1, CS1_SW1, CS2_SW1, CS3_SW1 },
|
||||
{ 1, CS13_SW1, CS14_SW1, CS15_SW1 },
|
||||
{ 1, CS16_SW1, CS17_SW1, CS18_SW1 },
|
||||
{ 1, CS4_SW2, CS5_SW2, CS6_SW2 },
|
||||
{ 1, SW1_CS1, SW1_CS2, SW1_CS3 },
|
||||
{ 1, SW1_CS13, SW1_CS14, SW1_CS15 },
|
||||
{ 1, SW1_CS16, SW1_CS17, SW1_CS18 },
|
||||
{ 1, SW2_CS4, SW2_CS5, SW2_CS6 },
|
||||
...
|
||||
};
|
||||
```
|
||||
@@ -642,6 +633,7 @@ enum rgb_matrix_effects {
|
||||
RGB_MATRIX_DUAL_BEACON, // Full gradient spinning around center of keyboard
|
||||
RGB_MATRIX_RAINBOW_BEACON, // Full tighter gradient spinning around center of keyboard
|
||||
RGB_MATRIX_RAINBOW_PINWHEELS, // Full dual gradients spinning two halfs of keyboard
|
||||
RGB_MATRIX_FLOWER_BLOOMING, // Full tighter gradient of first half scrolling left to right and second half scrolling right to left
|
||||
RGB_MATRIX_RAINDROPS, // Randomly changes a single key's hue
|
||||
RGB_MATRIX_JELLYBEAN_RAINDROPS, // Randomly changes a single key's hue and saturation
|
||||
RGB_MATRIX_HUE_BREATHING, // Hue shifts up a slight ammount at the same time, then shifts back
|
||||
@@ -654,16 +646,20 @@ enum rgb_matrix_effects {
|
||||
RGB_MATRIX_DIGITAL_RAIN, // That famous computer simulation
|
||||
RGB_MATRIX_SOLID_REACTIVE_SIMPLE, // Pulses keys hit to hue & value then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE, // Static single hue, pulses keys hit to shifted hue then fades to current hue
|
||||
RGB_MATRIX_SOLID_REACTIVE_WIDE // Hue & value pulse near a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE // Hue & value pulse near multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_CROSS // Hue & value pulse the same column and row of a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTICROSS // Hue & value pulse the same column and row of multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_NEXUS // Hue & value pulse away on the same column and row of a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS // Hue & value pulse away on the same column and row of multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_WIDE, // Hue & value pulse near a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE, // Hue & value pulse near multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_CROSS, // Hue & value pulse the same column and row of a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTICROSS, // Hue & value pulse the same column and row of multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_NEXUS, // Hue & value pulse away on the same column and row of a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS, // Hue & value pulse away on the same column and row of multiple key hits then fades value out
|
||||
RGB_MATRIX_SPLASH, // Full gradient & value pulse away from a single key hit then fades value out
|
||||
RGB_MATRIX_MULTISPLASH, // Full gradient & value pulse away from multiple key hits then fades value out
|
||||
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
|
||||
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
|
||||
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
|
||||
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
|
||||
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
|
||||
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
|
||||
RGB_MATRIX_EFFECT_MAX
|
||||
};
|
||||
```
|
||||
@@ -694,6 +690,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||
|`#define ENABLE_RGB_MATRIX_DUAL_BEACON` |Enables `RGB_MATRIX_DUAL_BEACON` |
|
||||
|`#define ENABLE_RGB_MATRIX_RAINBOW_BEACON` |Enables `RGB_MATRIX_RAINBOW_BEACON` |
|
||||
|`#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS` |Enables `RGB_MATRIX_RAINBOW_PINWHEELS` |
|
||||
|`#define ENABLE_RGB_MATRIX_FLOWER_BLOOMING` |Enables `RGB_MATRIX_FLOWER_BLOOMING` |
|
||||
|`#define ENABLE_RGB_MATRIX_RAINDROPS` |Enables `RGB_MATRIX_RAINDROPS` |
|
||||
|`#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Enables `RGB_MATRIX_JELLYBEAN_RAINDROPS` |
|
||||
|`#define ENABLE_RGB_MATRIX_HUE_BREATHING` |Enables `RGB_MATRIX_HUE_BREATHING` |
|
||||
@@ -702,6 +699,10 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|
||||
|`#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_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|
||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|
||||
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|
||||
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
|
||||
|
||||
|Framebuffer Defines |Description |
|
||||
|------------------------------------------------------|----------------------------------------------|
|
||||
@@ -868,15 +869,17 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
|
||||
```c
|
||||
#define RGB_MATRIX_KEYRELEASES // reactive effects respond to keyreleases (instead of keypresses)
|
||||
#define RGB_MATRIX_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
|
||||
#define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
|
||||
#define RGB_MATRIX_SLEEP // turn off effects when suspended
|
||||
#define RGB_MATRIX_LED_PROCESS_LIMIT (RGB_MATRIX_LED_COUNT + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
|
||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
|
||||
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
|
||||
#define RGB_MATRIX_DEFAULT_ON true // Sets the default enabled state, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT // Sets the default mode, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_HUE 0 // Sets the default hue value, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
|
||||
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
|
||||
#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.
|
||||
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
|
||||
|
@@ -33,13 +33,13 @@ RGBLIGHT_DRIVER = apa102
|
||||
|
||||
At minimum you must define the data pin your LED strip is connected to, and the number of LEDs in the strip, in your `config.h`. For APA102 LEDs, you must also define the clock pin. If your keyboard has onboard RGB LEDs, and you are simply creating a keymap, you usually won't need to modify these.
|
||||
|
||||
|Define |Description |
|
||||
|---------------|-------------------------------------------------------------------------|
|
||||
|`WS2812_DI_PIN`|The pin connected to the data pin of the LEDs (WS2812) |
|
||||
|`APA102_DI_PIN`|The pin connected to the data pin of the LEDs (APA102) |
|
||||
|`APA102_CI_PIN`|The pin connected to the clock pin of the LEDs (APA102) |
|
||||
|`RGBLED_NUM` |The number of LEDs connected |
|
||||
|`RGBLED_SPLIT` |(Optional) For split keyboards, the number of LEDs connected on each half|
|
||||
|Define |Description |
|
||||
|--------------------|-------------------------------------------------------------------------|
|
||||
|`WS2812_DI_PIN` |The pin connected to the data pin of the LEDs (WS2812) |
|
||||
|`APA102_DI_PIN` |The pin connected to the data pin of the LEDs (APA102) |
|
||||
|`APA102_CI_PIN` |The pin connected to the clock pin of the LEDs (APA102) |
|
||||
|`RGBLIGHT_LED_COUNT`|The number of LEDs connected |
|
||||
|`RGBLED_SPLIT` |(Optional) For split keyboards, the number of LEDs connected on each half|
|
||||
|
||||
Then you should be able to use the keycodes below to change the RGB lighting to your liking.
|
||||
|
||||
@@ -102,6 +102,7 @@ Your RGB lighting can be configured by placing these `#define`s in your `config.
|
||||
|`RGBLIGHT_DEFAULT_SAT` |`UINT8_MAX` (255) |The default saturation to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_VAL` |`RGBLIGHT_LIMIT_VAL` |The default value (brightness) to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_SPD` |`0` |The default speed to use upon clearing the EEPROM |
|
||||
|`RGBLIGHT_DEFAULT_ON` |`true` |Enable RGB lighting upon clearing the EEPROM |
|
||||
|
||||
## Effects and Animations
|
||||
|
||||
@@ -151,28 +152,28 @@ Use these defines to add or remove animations from the firmware. When you are ru
|
||||
|
||||
The following options are used to tweak the various animations:
|
||||
|
||||
|Define |Default |Description |
|
||||
|------------------------------------|-------------|-----------------------------------------------------------------------------------------------|
|
||||
|`RGBLIGHT_EFFECT_BREATHE_CENTER` |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
|
||||
|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
|
||||
|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`40` |How long (in milliseconds) to wait between animation steps for the "Christmas" animation |
|
||||
|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|
||||
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|
||||
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
|
||||
|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`200` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
|
||||
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
|
||||
|Define |Default |Description |
|
||||
|------------------------------------|--------------------|-----------------------------------------------------------------------------------------------|
|
||||
|`RGBLIGHT_EFFECT_BREATHE_CENTER` |*Not defined* |If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
|
||||
|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
|
||||
|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`40` |How long (in milliseconds) to wait between animation steps for the "Christmas" animation |
|
||||
|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLIGHT_LED_COUNT`|The number of LEDs to have the "Knight" animation travel |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
|
||||
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|
||||
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|
||||
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
|
||||
|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`200` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
|
||||
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
|
||||
|
||||
### Example Usage to Reduce Memory Footprint
|
||||
1. Use `#undef` to selectively disable animations. The following would disable two animations and save about 4KiB:
|
||||
|
||||
```diff
|
||||
#undef RGBLED_NUM
|
||||
#undef RGBLIGHT_LED_COUNT
|
||||
+#undef RGBLIGHT_EFFECT_STATIC_GRADIENT
|
||||
+#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL
|
||||
#define RGBLED_NUM 12
|
||||
#define RGBLIGHT_LED_COUNT 12
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
```
|
||||
@@ -370,9 +371,9 @@ If you need to change your RGB lighting in code, for example in a macro to chang
|
||||
|
||||
Example:
|
||||
```c
|
||||
sethsv(HSV_WHITE, (LED_TYPE *)&led[0]); // led 0
|
||||
sethsv(HSV_RED, (LED_TYPE *)&led[1]); // led 1
|
||||
sethsv(HSV_GREEN, (LED_TYPE *)&led[2]); // led 2
|
||||
sethsv(HSV_WHITE, (rgb_led_t *)&led[0]); // led 0
|
||||
sethsv(HSV_RED, (rgb_led_t *)&led[1]); // led 1
|
||||
sethsv(HSV_GREEN, (rgb_led_t *)&led[2]); // led 2
|
||||
rgblight_set(); // Utility functions do not call rgblight_set() automatically, so they need to be called explicitly.
|
||||
```
|
||||
|
||||
@@ -385,10 +386,10 @@ rgblight_set(); // Utility functions do not call rgblight_set() automatically, s
|
||||
#### direct operation
|
||||
|Function |Description |
|
||||
|--------------------------------------------|-------------|
|
||||
|`rgblight_setrgb_at(r, g, b, index)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `index` is between 0 and `RGBLED_NUM` (not written to EEPROM) |
|
||||
|`rgblight_sethsv_at(h, s, v, index)` |Set a single LED to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `index` is between 0 and `RGBLED_NUM` (not written to EEPROM) |
|
||||
|`rgblight_setrgb_range(r, g, b, start, end)`|Set a continuous range of LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `start`(included) and `stop`(excluded) are between 0 and `RGBLED_NUM` (not written to EEPROM)|
|
||||
|`rgblight_sethsv_range(h, s, v, start, end)`|Set a continuous range of LEDs to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `start`(included) and `stop`(excluded) are between 0 and `RGBLED_NUM` (not written to EEPROM)|
|
||||
|`rgblight_setrgb_at(r, g, b, index)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `index` is between 0 and `RGBLIGHT_LED_COUNT` (not written to EEPROM) |
|
||||
|`rgblight_sethsv_at(h, s, v, index)` |Set a single LED to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `index` is between 0 and `RGBLIGHT_LED_COUNT` (not written to EEPROM) |
|
||||
|`rgblight_setrgb_range(r, g, b, start, end)`|Set a continuous range of LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 and `start`(included) and `stop`(excluded) are between 0 and `RGBLIGHT_LED_COUNT` (not written to EEPROM)|
|
||||
|`rgblight_sethsv_range(h, s, v, start, end)`|Set a continuous range of LEDs to the given HSV value, where `h`/`s`/`v` are between 0 and 255, and `start`(included) and `stop`(excluded) are between 0 and `RGBLIGHT_LED_COUNT` (not written to EEPROM)|
|
||||
|`rgblight_setrgb(r, g, b)` |Set effect range LEDs to the given RGB value where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|
||||
|`rgblight_setrgb_master(r, g, b)` |Set the LEDs on the master side to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|
||||
|`rgblight_setrgb_slave(r, g, b)` |Set the LEDs on the slave side to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
|
||||
@@ -518,13 +519,12 @@ By defining `RGBLIGHT_LED_MAP` as in the example below, you can specify the LED
|
||||
```c
|
||||
// config.h
|
||||
|
||||
#define RGBLED_NUM 4
|
||||
#define RGBLIGHT_LED_COUNT 4
|
||||
#define RGBLIGHT_LED_MAP { 3, 2, 1, 0 }
|
||||
|
||||
```
|
||||
<img src="https://user-images.githubusercontent.com/2170248/55743725-08ad7a80-5a6e-11e9-83ed-126a2b0209fc.JPG" alt="simple mapped" width="50%"/>
|
||||
|
||||
```
|
||||
## Clipping Range
|
||||
|
||||
Using the `rgblight_set_clipping_range()` function, you can prepare more buffers than the actual number of LEDs, and output some of the buffers to the LEDs. This is useful if you want the split keyboard to treat left and right LEDs as logically contiguous.
|
||||
@@ -541,14 +541,44 @@ In addition to setting the Clipping Range, you can use `RGBLIGHT_LED_MAP` togeth
|
||||
|
||||
```c
|
||||
// config.h
|
||||
#define RGBLED_NUM 8
|
||||
#define RGBLIGHT_LED_COUNT 8
|
||||
#define RGBLIGHT_LED_MAP { 7, 6, 5, 4, 3, 2, 1, 0 }
|
||||
|
||||
// some soruce
|
||||
rgblight_set_clipping_range(3, 4);
|
||||
// some source
|
||||
rgblight_set_clipping_range(3, 4);
|
||||
```
|
||||
<img src="https://user-images.githubusercontent.com/2170248/55743747-119e4c00-5a6e-11e9-91e5-013203ffae8a.JPG" alt="clip mapped" width="70%"/>
|
||||
|
||||
## Hardware Modification
|
||||
|
||||
If your keyboard lacks onboard underglow LEDs, you may often be able to solder on an RGB LED strip yourself. You will need to find an unused pin to wire to the data pin of your LED strip. Some keyboards may break out unused pins from the MCU to make soldering easier. The other two pins, VCC and GND, must also be connected to the appropriate power pins.
|
||||
|
||||
## Velocikey
|
||||
|
||||
Velocikey is a feature that lets you control the speed of lighting effects (like the Rainbow Swirl effect) with the speed of your typing. The faster you type, the faster the lights will go!
|
||||
|
||||
### Usage
|
||||
For Velocikey to take effect, there are two steps. First, when compiling your keyboard, you'll need to set `VELOCIKEY_ENABLE=yes` in `rules.mk`, e.g.:
|
||||
|
||||
```
|
||||
MOUSEKEY_ENABLE = no
|
||||
STENO_ENABLE = no
|
||||
EXTRAKEY_ENABLE = yes
|
||||
VELOCIKEY_ENABLE = yes
|
||||
```
|
||||
|
||||
Then, while using your keyboard, you need to also turn it on with the `VK_TOGG` keycode, which toggles the feature on and off.
|
||||
|
||||
The following light effects will all be controlled by Velocikey when it is enabled:
|
||||
- RGB Breathing
|
||||
- RGB Rainbow Mood
|
||||
- RGB Rainbow Swirl
|
||||
- RGB Snake
|
||||
- RGB Knight
|
||||
|
||||
Support for LED breathing effects is planned but not available yet.
|
||||
|
||||
As long as Velocikey is enabled, it will control the speed regardless of any other speed setting that your RGB lights are currently on.
|
||||
|
||||
### Configuration
|
||||
Velocikey doesn't currently support any configuration via keyboard settings. If you want to adjust something like the speed increase or decay rate, you would need to edit `velocikey.c` and adjust the values there to achieve the kinds of speeds that you like.
|
||||
|
@@ -119,12 +119,12 @@ You can configure the firmware to read key matrix pins on the controller to dete
|
||||
|
||||
The first pin is the output pin and the second is the input pin.
|
||||
|
||||
Some keyboards have unused intersections in the key matrix. This setting uses one of these unused intersections to determine the handness.
|
||||
Some keyboards have unused intersections in the key matrix. This setting uses one of these unused intersections to determine the handedness.
|
||||
|
||||
Normally, when a diode is connected to an intersection, it is judged to be left. If you add the following definition, it will be judged to be right.
|
||||
Normally, when a diode is connected to an intersection, it is judged to be right. If you add the following definition, it will be judged to be left.
|
||||
|
||||
```c
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_LEFT
|
||||
```
|
||||
|
||||
Note that adding a diode at a previously unused intersection will effectively tell the firmware that there is a key held down at that point. You can instruct qmk to ignore that intersection by defining `MATRIX_MASKED` and then defining a `matrix_row_t matrix_mask[MATRIX_ROWS]` array in your keyboard config. Each bit of a single value (starting form the least-significant bit) is used to tell qmk whether or not to pay attention to key presses at that intersection.
|
||||
@@ -205,7 +205,7 @@ This sets the pin to be used for serial communication. If you're not using seria
|
||||
However, if you are using serial and I<sup>2</sup>C on the board, you will need to set this, and to something other than D0 and D1 (as these are used for I<sup>2</sup>C communication).
|
||||
|
||||
```c
|
||||
#define SELECT_SOFT_SERIAL_SPEED {#}`
|
||||
#define SELECT_SOFT_SERIAL_SPEED {#}
|
||||
```
|
||||
|
||||
If you're having issues with serial communication, you can change this value, as it controls the communication speed for serial. The default is 1, and the possible values are:
|
||||
@@ -298,7 +298,7 @@ This enables transmitting the pointing device status to the master side of the s
|
||||
#define SPLIT_HAPTIC_ENABLE
|
||||
```
|
||||
|
||||
This enables triggering of haptic feedback on the slave side of the split keyboard. For DRV2605L this will send the mode, but for solenoids it is expected that the desired mode is already set up on the slave.
|
||||
This enables the triggering of haptic feedback on the slave side of the split keyboard. This will send information to the slave side such as the mode, dwell, and whether buzz is enabled.
|
||||
|
||||
```c
|
||||
#define SPLIT_ACTIVITY_ENABLE
|
||||
|
@@ -104,7 +104,7 @@ After enabling stenography and optionally selecting a protocol, you may also nee
|
||||
|
||||
!> If you had *explicitly* set `VIRSTER_ENABLE = no`, none of the serial stenography protocols (GeminiPR, TX Bolt) will work properly. You are expected to either set it to `yes`, remove the line from your `rules.mk` or send the steno chords yourself in an alternative way using the [provided interceptable hooks](#interfacing-with-the-code).
|
||||
|
||||
In your keymap, create a new layer for Plover, that you can fill in with the [steno keycodes](#keycode-reference) (you will need to include `keymap_steno.h`, see `planck/keymaps/steno/keymap.c` for an example). Remember to create a key to switch to the layer as well as a key for exiting the layer.
|
||||
In your keymap, create a new layer for Plover, that you can fill in with the [steno keycodes](#keycode-reference). Remember to create a key to switch to the layer as well as a key for exiting the layer.
|
||||
|
||||
Once you have your keyboard flashed, launch Plover. Click the 'Configure...' button. In the 'Machine' tab, select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control).
|
||||
|
||||
@@ -149,8 +149,6 @@ At the end of this scenario given as an example, `chord` would have five bits se
|
||||
|
||||
## Keycode Reference :id=keycode-reference
|
||||
|
||||
You must include `keymap_steno.h` to your `keymap.c` with `#include "keymap_steno.h"` before you can use these keycodes
|
||||
|
||||
> Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both.
|
||||
|
||||
|GeminiPR|TX Bolt|Steno Key|
|
||||
@@ -198,7 +196,7 @@ You must include `keymap_steno.h` to your `keymap.c` with `#include "keymap_sten
|
||||
|`STN_RES2`||(Reset 2)|
|
||||
|`STN_PWR`||(Power)|
|
||||
|
||||
If you do not want to hit two keys with one finger combined keycodes can be used. These are also defined in `keymap_steno.h`, and causes both keys to be reported as pressed or released. To use these keycodes define `STENO_COMBINEDMAP` in your `config.h` file.
|
||||
If you do not want to hit two keys with one finger combined keycodes can be used. These cause both keys to be reported as pressed or released. To use these keycodes define `STENO_COMBINEDMAP` in your `config.h` file.
|
||||
|
||||
|Combined key | Key1 | Key 2 |
|
||||
|---------------|--------|----------|
|
||||
|
@@ -173,7 +173,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
switch (keycode) {
|
||||
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
|
||||
action = &tap_dance_actions[TD_INDEX(keycode)];
|
||||
action = &tap_dance_actions[QK_TAP_DANCE_GET_INDEX(keycode)];
|
||||
if (!record->event.pressed && action->state.count && !action->state.finished) {
|
||||
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
|
||||
tap_code16(tap_hold->tap);
|
||||
|
@@ -40,7 +40,7 @@ Eg, if you wanted to set the "Adjust" layer to be layer 5, you'd add this to you
|
||||
| `set_tri_layer_lower_layer(layer)` | Changes the "lower" layer*. |
|
||||
| `set_tri_layer_upper_layer(layer)` | Changes the "upper" layer*. |
|
||||
| `set_tri_layer_adjust_layer(layer)` | Changes the "adjust" layer*. |
|
||||
| `set_tri_layer_layers(lower, upper, adjust)` | Stes the "lower", "upper" and "adjust" layers*. |
|
||||
| `set_tri_layer_layers(lower, upper, adjust)` | Sets the "lower", "upper" and "adjust" layers*. |
|
||||
| `get_tri_layer_lower_layer()` | Gets the current "lower" layer. |
|
||||
| `get_tri_layer_upper_layer()` | Gets the current "upper" layer. |
|
||||
| `get_tri_layer_adjust_layer()` | Gets the current "adjust" layer. |
|
||||
|
@@ -140,7 +140,7 @@ To set the list of enabled input modes, add the `UNICODE_SELECTED_MODES` define
|
||||
```c
|
||||
#define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX
|
||||
// or
|
||||
#define UNICODE_SELECTED_MODES UNICODE_MODE_MAC, UNICODE_MODE_WINCOMPOSE
|
||||
#define UNICODE_SELECTED_MODES UNICODE_MODE_MACOS, UNICODE_MODE_WINCOMPOSE
|
||||
```
|
||||
|
||||
These modes can then be cycled through using the `UC_NEXT` and `UC_PREV` keycodes. You can also switch to any input mode, even if it is not specified in `UNICODE_SELECTED_MODES`, using their respective keycodes.
|
||||
@@ -151,7 +151,7 @@ If your keyboard has working EEPROM, it will remember the last used input mode a
|
||||
|
||||
### ** macOS **
|
||||
|
||||
**Mode Name:** `UNICODE_MODE_MAC`
|
||||
**Mode Name:** `UNICODE_MODE_MACOS`
|
||||
|
||||
macOS has built-in support for Unicode input as its own input source. It supports all possible code points by way of surrogate pairs for code points above `U+FFFF`.
|
||||
|
||||
|
@@ -1,5 +1,7 @@
|
||||
# Userspace: Sharing Code Between Keymaps
|
||||
|
||||
!> Please note, userspace submissions to the upstream `qmk/qmk_firmware` repository are no longer being accepted. The userspace feature itself remains functional and can be configured locally.
|
||||
|
||||
If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your GitHub username, `<name>`) with the following structure:
|
||||
|
||||
* `/users/<name>/` (added to the path automatically)
|
||||
|
@@ -1,29 +0,0 @@
|
||||
# Velocikey
|
||||
|
||||
Velocikey is a feature that lets you control the speed of lighting effects (like the Rainbow Swirl effect) with the speed of your typing. The faster you type, the faster the lights will go!
|
||||
|
||||
## Usage
|
||||
For Velocikey to take effect, there are two steps. First, when compiling your keyboard, you'll need to set `VELOCIKEY_ENABLE=yes` in `rules.mk`, e.g.:
|
||||
|
||||
```
|
||||
MOUSEKEY_ENABLE = no
|
||||
STENO_ENABLE = no
|
||||
EXTRAKEY_ENABLE = yes
|
||||
VELOCIKEY_ENABLE = yes
|
||||
```
|
||||
|
||||
Then, while using your keyboard, you need to also turn it on with the `VK_TOGG` keycode, which toggles the feature on and off.
|
||||
|
||||
The following light effects will all be controlled by Velocikey when it is enabled:
|
||||
- RGB Breathing
|
||||
- RGB Rainbow Mood
|
||||
- RGB Rainbow Swirl
|
||||
- RGB Snake
|
||||
- RGB Knight
|
||||
|
||||
Support for LED breathing effects is planned but not available yet.
|
||||
|
||||
As long as Velocikey is enabled, it will control the speed regardless of any other speed setting that your RGB lights are currently on.
|
||||
|
||||
## Configuration
|
||||
Velocikey doesn't currently support any configuration via keyboard settings. If you want to adjust something like the speed increase or decay rate, you would need to edit `velocikey.c` and adjust the values there to achieve the kinds of speeds that you like.
|
@@ -2,29 +2,29 @@
|
||||
|
||||
QMK has a GPIO control abstraction layer which is microcontroller agnostic. This is done to allow easy access to pin control across different platforms.
|
||||
|
||||
## Functions :id=functions
|
||||
## Macros :id=macros
|
||||
|
||||
The following functions provide basic control of GPIOs and are found in `platforms/<platform>/gpio.h`.
|
||||
The following macros provide basic control of GPIOs and are found in `platforms/<platform>/gpio.h`.
|
||||
|
||||
| Function | Description | Old AVR Examples | Old ChibiOS/ARM Examples |
|
||||
|------------------------------|-----------------------------------------------------|-------------------------------------------------|--------------------------------------------------|
|
||||
| `setPinInput(pin)` | Set pin as input with high impedance (High-Z) | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
|
||||
| `setPinInputHigh(pin)` | Set pin as input with builtin pull-up resistor | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
|
||||
| `setPinInputLow(pin)` | Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
|
||||
| `setPinOutput(pin)` | Set pin as output (alias of `setPinOutputPushPull`) | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|
||||
| `setPinOutputPushPull(pin)` | Set pin as output, push/pull mode | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
|
||||
| `setPinOutputOpenDrain(pin)` | Set pin as output, open-drain mode | N/A (Not implemented on AVR) | `palSetLineMode(pin, PAL_MODE_OUTPUT_OPENDRAIN)` |
|
||||
| `writePinHigh(pin)` | Set pin level as high, assuming it is an output | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
|
||||
| `writePinLow(pin)` | Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
|
||||
| `writePin(pin, level)` | Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
|
||||
| `readPin(pin)` | Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
|
||||
| `togglePin(pin)` | Invert pin level, assuming it is an output | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
|
||||
|Macro |Description |
|
||||
|-------------------------------------|---------------------------------------------------------------------|
|
||||
|`gpio_set_pin_input(pin)` |Set pin as input with high impedance (High-Z) |
|
||||
|`gpio_set_pin_input_high(pin)` |Set pin as input with builtin pull-up resistor |
|
||||
|`gpio_set_pin_input_low(pin)` |Set pin as input with builtin pull-down resistor (unavailable on AVR)|
|
||||
|`gpio_set_pin_output(pin)` |Set pin as output (alias of `gpio_set_pin_output_push_pull`) |
|
||||
|`gpio_set_pin_output_push_pull(pin)` |Set pin as output, push/pull mode |
|
||||
|`gpio_set_pin_output_open_drain(pin)`|Set pin as output, open-drain mode (unavailable on AVR and ATSAM) |
|
||||
|`gpio_write_pin_high(pin)` |Set pin level as high, assuming it is an output |
|
||||
|`gpio_write_pin_low(pin)` |Set pin level as low, assuming it is an output |
|
||||
|`gpio_write_pin(pin, level)` |Set pin level, assuming it is an output |
|
||||
|`gpio_read_pin(pin)` |Returns the level of the pin |
|
||||
|`gpio_toggle_pin(pin)` |Invert pin level, assuming it is an output |
|
||||
|
||||
## Advanced Settings :id=advanced-settings
|
||||
|
||||
Each microcontroller can have multiple advanced settings regarding its GPIO. This abstraction layer does not limit the use of architecture-specific functions. Advanced users should consult the datasheet of their desired device and include any needed libraries. For AVR, the standard avr/io.h library is used; for STM32, the ChibiOS [PAL library](https://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.
|
||||
Each microcontroller can have multiple advanced settings regarding its GPIO. This abstraction layer does not limit the use of architecture-specific functions. Advanced users should consult the datasheet of their desired device. For AVR, the standard `avr/io.h` library is used; for STM32, the ChibiOS [PAL library](https://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used.
|
||||
|
||||
## Atomic Operation
|
||||
## Atomic Operation :id=atomic-operation
|
||||
|
||||
The above functions are not always guaranteed to work atomically. Therefore, if you want to prevent interruptions in the middle of operations when using multiple combinations of the above functions, use the following `ATOMIC_BLOCK_FORCEON` macro.
|
||||
|
||||
|
@@ -169,11 +169,11 @@ The `post_rules.mk` file can interpret `features` of a keyboard-level before `co
|
||||
|
||||
ifeq ($(strip $(RGBLED_OPTION_TYPE)),backlight)
|
||||
RGBLIGHT_ENABLE = yes
|
||||
OPT_DEFS += -DRGBLED_NUM=30
|
||||
OPT_DEFS += -DRGBLIGHT_LED_COUNT=30
|
||||
endif
|
||||
ifeq ($(strip $(RGBLED_OPTION_TYPE)),underglow)
|
||||
RGBLIGHT_ENABLE = yes
|
||||
OPT_DEFS += -DRGBLED_NUM=6
|
||||
OPT_DEFS += -DRGBLIGHT_LED_COUNT=6
|
||||
endif
|
||||
```
|
||||
|
||||
|
@@ -2,6 +2,18 @@
|
||||
|
||||
The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs.
|
||||
|
||||
## Usage :id=usage
|
||||
|
||||
In most cases, the I2C Master driver code is automatically included if you are using a feature or driver which requires it, such as [OLED](feature_oled_driver.md).
|
||||
|
||||
However, if you need to use the driver standalone, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
You can then call the I2C API by including `i2c_master.h` in your code.
|
||||
|
||||
## I2C Addressing :id=note-on-i2c-addresses
|
||||
|
||||
All of the addresses expected by this driver should be pushed to the upper 7 bits of the address byte. Setting
|
||||
@@ -115,8 +127,8 @@ This function is weakly defined, meaning it can be overridden if necessary for y
|
||||
|
||||
```c
|
||||
void i2c_init(void) {
|
||||
setPinInput(B6); // Try releasing special pins for a short time
|
||||
setPinInput(B7);
|
||||
gpio_set_pin_input(B6); // Try releasing special pins for a short time
|
||||
gpio_set_pin_input(B7);
|
||||
wait_ms(10); // Wait for the release to happen
|
||||
|
||||
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
|
||||
@@ -126,23 +138,6 @@ void i2c_init(void) {
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_start(uint8_t address, uint16_t timeout)` :id=api-i2c-start
|
||||
|
||||
Start an I2C transaction.
|
||||
|
||||
#### Arguments :id=api-i2c-start-arguments
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value :id=api-i2c-start-return
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)` :id=api-i2c-transmit
|
||||
|
||||
Send multiple bytes to the selected I2C device.
|
||||
@@ -185,11 +180,11 @@ Receive multiple bytes from the selected I2C device.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-writereg
|
||||
### `i2c_status_t i2c_write_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-write-register
|
||||
|
||||
Writes to a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments :id=api-i2c-writereg-arguments
|
||||
#### Arguments :id=api-i2c-write-register-arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
@@ -202,17 +197,17 @@ Writes to a register with an 8-bit address on the I2C device.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value :id=api-i2c-writereg-return
|
||||
#### Return Value :id=api-i2c-write-register-return
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-writereg16
|
||||
### `i2c_status_t i2c_write_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-write-register16
|
||||
|
||||
Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments :id=api-i2c-writereg16-arguments
|
||||
#### Arguments :id=api-i2c-write-register16-arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
@@ -225,17 +220,17 @@ Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value :id=api-i2c-writereg16-return
|
||||
#### Return Value :id=api-i2c-write-register16-return
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-readreg
|
||||
### `i2c_status_t i2c_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-read-register
|
||||
|
||||
Reads from a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments :id=api-i2c-readreg-arguments
|
||||
#### Arguments :id=api-i2c-read-register-arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
@@ -246,17 +241,17 @@ Reads from a register with an 8-bit address on the I2C device.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value :id=api-i2c-readreg-return
|
||||
#### Return Value :id=api-i2c-read-register-return
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)`
|
||||
### `i2c_status_t i2c_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` :id=api-i2c-read-register16
|
||||
|
||||
Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments :id=api-i2c-readreg16-arguments
|
||||
#### Arguments :id=api-i2c-read-register16-arguments
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
@@ -267,12 +262,27 @@ Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value :id=api-i2c-readreg16-return
|
||||
#### Return Value :id=api-i2c-read-register16-return
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_stop(void)` :id=api-i2c-stop
|
||||
### `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout)` :id=api-i2c-ping-address
|
||||
|
||||
Stop the current I2C transaction.
|
||||
Pings the I2C bus for a specific address.
|
||||
|
||||
On ChibiOS a "best effort" attempt is made by reading a single byte from register 0 at the requested address. This should generally work except for I2C devices that do not not respond to a register 0 read request, which will result in a false negative result (unsucessful response to ping attempt).
|
||||
|
||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
|
||||
|
||||
#### Arguments
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device (ie. without the read/write bit - this will be set automatically).
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value
|
||||
|
||||
`I2C_STATUS_TIMEOUT` if the timeout period elapses, `I2C_STATUS_ERROR` if some other error occurs, otherwise `I2C_STATUS_SUCCESS`.
|
||||
|
@@ -112,7 +112,6 @@
|
||||
* [分割キーボード](ja/feature_split_keyboard.md)
|
||||
* [速記](ja/feature_stenography.md)
|
||||
* [感熱式プリンタ](ja/feature_thermal_printer.md)
|
||||
* [Velocikey](ja/feature_velocikey.md)
|
||||
|
||||
* QMK の開発
|
||||
* [PR チェックリスト](ja/pr_checklist.md)
|
||||
|
@@ -248,7 +248,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
|
||||
* high/low ピンを使って左右を決定します。low = 右手、high = 左手。`B7` を使っているピンに置き換えます。これはオプションで、`SPLIT_HAND_PIN` が未定義のままである場合、EE_HANDS メソッドまたは標準の Let's Splitが使っている MASTER_LEFT / MASTER_RIGHT 定義をまだ使うことができます。
|
||||
|
||||
* `#define SPLIT_HAND_MATRIX_GRID <out_pin>,<in_pin>`
|
||||
* 左右はキーマトリックスのキースイッチが存在しない交点を使って決定されます。通常、この交点が短絡している(ローレベル)のときに左側と見なされます。もし `#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT` が定義されている場合は、ローレベルの時に右側と決定されます。
|
||||
* 左右はキーマトリックスのキースイッチが存在しない交点を使って決定されます。通常、この交点が短絡している(ローレベル)のときに右側と見なされます。もし `#define SPLIT_HAND_MATRIX_GRID_LOW_IS_LEFT` が定義されている場合は、ローレベルの時に左側と決定されます。
|
||||
|
||||
* `#define EE_HANDS` (`SPLIT_HAND_PIN` と `SPLIT_HAND_MATRIX_GRID` が定義されていない場合のみ動作します)
|
||||
* `eeprom-lefthand.eep`/`eeprom-righthand.eep` がそれぞれの半分に書き込まれた後で、EEPROM 内に格納されている左右の設定の値を読み込みます。
|
||||
|
@@ -110,11 +110,11 @@ enum my_keycodes {
|
||||
|
||||
開発環境をセットアップした場合は、プルリクエストを開く前に以下のコマンドを `qmk_firmware/` フォルダから実行することで、あなたの変更をプレビューすることができます:
|
||||
|
||||
./bin/qmk docs
|
||||
qmk docs
|
||||
|
||||
または、Python 3 のみがインストールされている場合:
|
||||
|
||||
python3 -m http.server 8936
|
||||
python3 -m http.server 8936 --directory docs
|
||||
|
||||
その後、ウェブブラウザで、`http://localhost:8936/` を表示します。
|
||||
|
||||
|
@@ -139,8 +139,8 @@ BOOTMAGIC_ENABLE = lite
|
||||
さらに、どのキーを使うかを指定したほうが良いかもしれません。これは普通ではないマトリックスを持つキーボードで特に便利です。そのためには、使いたいキーの行と列を指定する必要があります。`config.h` ファイルにこれらのエントリを追加します:
|
||||
|
||||
```c
|
||||
#define BOOTMAGIC_LITE_ROW 0
|
||||
#define BOOTMAGIC_LITE_COLUMN 1
|
||||
#define BOOTMAGIC_ROW 0
|
||||
#define BOOTMAGIC_COLUMN 1
|
||||
```
|
||||
|
||||
デフォルトでは、これらは 0 と 0 に設定されます。これは通常はほとんどのキーボードで "ESC" キーです。
|
||||
@@ -154,8 +154,8 @@ BOOTMAGIC_ENABLE = lite
|
||||
`SPLIT_HAND_PIN` のようなオプションで、左右の設定があらかじめ決められている場合は、キーボードの左右で別のキーを設定する必要があるかもしれません。これを行うには、`config.h` ファイルに以下のエントリを追加します。
|
||||
|
||||
```c
|
||||
#define BOOTMAGIC_LITE_ROW_RIGHT 4
|
||||
#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
|
||||
#define BOOTMAGIC_ROW_RIGHT 4
|
||||
#define BOOTMAGIC_COLUMN_RIGHT 1
|
||||
```
|
||||
|
||||
デフォルトでは、これらの値は設定されていません。
|
||||
@@ -172,7 +172,7 @@ void bootmagic_lite(void) {
|
||||
wait_ms(DEBOUNCE * 2);
|
||||
matrix_scan();
|
||||
|
||||
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
|
||||
if (matrix_get_row(BOOTMAGIC_ROW) & (1 << BOOTMAGIC_COLUMN)) {
|
||||
// ブートローダにジャンプする。
|
||||
bootloader_jump();
|
||||
}
|
||||
|
@@ -108,10 +108,10 @@ SPLIT_TRANSPORT = custom
|
||||
|
||||
キーマトリックスに未使用の交点があるキーボードがあります。この設定は、左右の決定にこれらの未使用の交点の1つを使用します。
|
||||
|
||||
通常、ダイオードが交点に接続されている場合、左側と判断されます。次の定義を追加すると、右側と判断されます。
|
||||
通常、ダイオードが交点に接続されている場合、右側と判断されます。次の定義を追加すると、左側と判断されます。
|
||||
|
||||
```c
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_RIGHT
|
||||
#define SPLIT_HAND_MATRIX_GRID_LOW_IS_LEFT
|
||||
```
|
||||
|
||||
#### EEPROM による左右の設定
|
||||
|
@@ -1,34 +0,0 @@
|
||||
# Velocikey
|
||||
|
||||
<!---
|
||||
original document: 0.8.147:docs/feature_velocikey.md
|
||||
git diff 0.8.147 HEAD -- docs/feature_velocikey.md | cat
|
||||
-->
|
||||
|
||||
Velocikey は入力の速度を使って(レインボー渦巻効果のような)ライト効果の速度を制御できる機能です。速く入力すればするほどライトが速くなります!
|
||||
|
||||
## 使用法
|
||||
Velocikey を使うためには、2つのステップがあります。最初に、キーボードをコンパイルする時に、`rules.mk` に `VELOCIKEY_ENABLE=yes` を設定する必要があります。例えば:
|
||||
|
||||
```
|
||||
MOUSEKEY_ENABLE = no
|
||||
STENO_ENABLE = no
|
||||
EXTRAKEY_ENABLE = yes
|
||||
VELOCIKEY_ENABLE = yes
|
||||
```
|
||||
|
||||
次に、キーボードの使用中に、VLK_TOG キーコードを使って Velocikey を有効にする必要もあります。これは機能をオンおよびオフにします。
|
||||
|
||||
以下の全てのライト効果が、Velocikey を有効にすることで制御されます:
|
||||
- RGB 明滅動作
|
||||
- RGB レインボームード
|
||||
- RGB レインボー渦巻
|
||||
- RGB スネーク
|
||||
- RGB ナイト
|
||||
|
||||
LED 明滅動作の効果のサポートは計画されていますがまだ利用できません。
|
||||
|
||||
Velocikey が有効になっている限り、現在オンになっている RGB ライトの他の全ての速度設定に関係なく、速度が制御されます。
|
||||
|
||||
## 設定
|
||||
Velocikey は現在のところキーボード設定を介したどのような設定もサポートしません。速度の増加あるいは減少率などを調整したい場合は、`velocikey.c` を編集し、そこで値を調整して、好みの速度を実現する必要があります。
|
@@ -23,12 +23,11 @@ I2C アドレスと他の技術詳細について、さらなる情報を得る
|
||||
| 関数 | 説明 |
|
||||
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `void i2c_init(void);` | I2C ドライバを初期化します。他のあらゆるトランザクションを開始する前に、この関数を一度だけ呼ぶ必要があります。 |
|
||||
| `i2c_status_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
|
||||
| `i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 |
|
||||
| `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 |
|
||||
| `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 |
|
||||
| `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 |
|
||||
| `i2c_status_t i2c_stop(void);` | I2C トランザクションを終了します。 |
|
||||
| `i2c_status_t i2c_ping_address(uint8_t address, uint16_t timeout);` | I2C アドレスをテストします。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
|
||||
|
||||
### 関数の戻り値 :id=function-return
|
||||
|
||||
|
@@ -160,7 +160,7 @@ bool get_retro_tapping(uint16_t keycode, keyrecord_t *record) {
|
||||
|
||||
「キー別」の関数全てにキーレコードを含んでいることに気付いたかもしれません。そしてなぜそうしたのか不思議に思っているかもしれません。
|
||||
|
||||
まぁ、それは単純に本当にカスタマイズのためです。ただし、具体的には、それはキーボードの配線方法によって異なります。例えば、各行が実際にキーボードのマトリックスの1行を使っている場合、キーコード全体をチェックする代わりに、`if (record->event.row == 3)` を使うほうが簡単かもしれません。これは、ホームキー行でタップホールドタイプのキーを使っている人にとって特に便利です。そのため、通常のタイピングを妨げないように微調整することができるのではないでしょうか。
|
||||
まぁ、それは単純に本当にカスタマイズのためです。ただし、具体的には、それはキーボードの配線方法によって異なります。例えば、各行が実際にキーボードのマトリックスの1行を使っている場合、キーコード全体をチェックする代わりに、`if (record->event.key.row == 3)` を使うほうが簡単かもしれません。これは、ホームキー行でタップホールドタイプのキーを使っている人にとって特に便利です。そのため、通常のタイピングを妨げないように微調整することができるのではないでしょうか。
|
||||
|
||||
## `*_kb` や `*_user` 関数が無いのはなぜですか?
|
||||
|
||||
|
@@ -125,7 +125,7 @@ At the top of the file you'll find this:
|
||||
|
||||
These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function, and the following `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers.
|
||||
|
||||
Note: You may also find some older keymap files may also have a define(s) for `_______` and/or `XXXXXXX`. These can be used in place for `KC_TRNS` and `KC_NO` respectively, making it easier to see what keys a layer is overriding. These definitions are now unecessary, as they are included by default.
|
||||
Note: You may also find some older keymap files may also have a define(s) for `_______` and/or `XXXXXXX`. These can be used in place for `KC_TRNS` and `KC_NO` respectively, making it easier to see what keys a layer is overriding. These definitions are now unnecessary, as they are included by default.
|
||||
|
||||
### Layers and Keymaps
|
||||
|
||||
|
@@ -143,13 +143,13 @@ Replace `username.json` with the JSON file name that was downloaded from [QMK Co
|
||||
|
||||
If you have completed all steps correctly, the folder `qmk_keymap/` will contain the following files:
|
||||
```
|
||||
|-- .github
|
||||
| `-- workflows
|
||||
| `-- build.yml
|
||||
|-- rules.mk
|
||||
|-- config.h
|
||||
|-- source.c
|
||||
|-- username.json
|
||||
├── .github
|
||||
│ └── workflows
|
||||
│ └── build.yml
|
||||
├── rules.mk
|
||||
├── config.h
|
||||
├── source.c
|
||||
└── username.json
|
||||
```
|
||||
|
||||
To commit and push them into GitHub, run the following commands (replacing `gh-username` with your GitHub user name):
|
||||
|
96
docs/newbs_external_userspace.md
Normal file
96
docs/newbs_external_userspace.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# External QMK Userspace
|
||||
|
||||
QMK Firmware now officially supports storing user keymaps outside of the normal QMK Firmware repository, allowing users to maintain their own keymaps without having to fork, modify, and maintain a copy of QMK Firmware themselves.
|
||||
|
||||
External Userspace mirrors the structure of the main QMK Firmware repository, but only contains the keymaps that you wish to build. You can still use `keyboards/<my keyboard>/keymaps/<my keymap>` to store your keymaps, or you can use the `layouts/<my layout>/<my keymap>` system as before -- they're just stored external to QMK Firmware.
|
||||
|
||||
The build system will still honor the use of `users/<my keymap>` if you rely on the traditional QMK Firmware [userspace feature](feature_userspace.md) -- it's now supported externally too, using the same location inside the External Userspace directory.
|
||||
|
||||
Additionally, there is first-class support for using GitHub Actions to build your keymaps, allowing you to automatically compile your keymaps whenever you push changes to your External Userspace repository.
|
||||
|
||||
!> External Userspace is new functionality and may have issues. Tighter integration with the `qmk` command will occur over time.
|
||||
|
||||
?> Historical keymap.json and GitHub-based firmware build instructions can be found [here](newbs_building_firmware_workflow.md). This document supersedes those instructions, but they should still function correctly.
|
||||
|
||||
## Setting up QMK Locally
|
||||
|
||||
If you wish to build on your local machine, you will need to set up QMK locally. This is a one-time process, and is documented in the [newbs setup guide](https://docs.qmk.fm/#/newbs).
|
||||
|
||||
!> If you wish to use any QMK CLI commands related to manipulating External Userspace definitions, you will currently need a copy of QMK Firmware as well.
|
||||
|
||||
!> Building locally has a much shorter turnaround time than waiting for GitHub Actions to complete.
|
||||
|
||||
## External Userspace Repository Setup (forked on GitHub)
|
||||
|
||||
A basic skeleton External Userspace repository can be found [here](https://github.com/qmk/qmk_userspace). If you wish to keep your keymaps on GitHub (strongly recommended!), you can fork the repository and use it as a base:
|
||||
|
||||

|
||||
|
||||
Going ahead with your fork will copy it to your account, at which point you can clone it to your local machine and begin adding your keymaps:
|
||||
|
||||

|
||||
|
||||
```sh
|
||||
cd $HOME
|
||||
git clone https://github.com/{myusername}/qmk_userspace.git
|
||||
qmk config user.overlay_dir="$(realpath qmk_userspace)"
|
||||
```
|
||||
|
||||
## External Userspace Setup (locally stored only)
|
||||
|
||||
If you don't want to use GitHub and prefer to keep everything local, you can clone a copy of the default External Userspace locally instead:
|
||||
|
||||
```sh
|
||||
cd $HOME
|
||||
git clone https://github.com/qmk/qmk_userspace.git
|
||||
qmk config user.overlay_dir="$(realpath qmk_userspace)"
|
||||
```
|
||||
|
||||
## Adding a Keymap
|
||||
|
||||
_These instructions assume you have already set up QMK locally, and have a copy of the QMK Firmware repository on your machine._
|
||||
|
||||
Keymaps within External Userspace are defined in the same way as they are in the main QMK repository. You can either use the `qmk new-keymap` command to create a new keymap, or manually create a new directory in the `keyboards` directory.
|
||||
|
||||
Alternatively, you can use the `layouts` directory to store your keymaps, using the same layout system as the main QMK repository -- if you choose to do so you'll want to use the path `layouts/<layout name>/<keymap name>/keymap.*` to store your keymap files, where `layout name` matches an existing layout in QMK, such as `tkl_ansi`.
|
||||
|
||||
After creating your new keymap, building the keymap matches normal QMK usage:
|
||||
|
||||
```sh
|
||||
qmk compile -kb <keyboard> -km <keymap>
|
||||
```
|
||||
|
||||
!> The `qmk config user.overlay_dir=...` command must have been run when cloning the External Userspace repository for this to work correctly.
|
||||
|
||||
## Adding the keymap to External Userspace build targets
|
||||
|
||||
Once you have created your keymap, if you want to use GitHub Actions to build your firmware, you will need to add it to the External Userspace build targets. This is done using the `qmk userspace-add` command:
|
||||
|
||||
```sh
|
||||
# for a keyboard/keymap combo:
|
||||
qmk userspace-add -kb <keyboard> -km <keymap>
|
||||
# or, for a json-based keymap (if kept "loose"):
|
||||
qmk userspace-add <relative/path/to/my/keymap.json>
|
||||
```
|
||||
|
||||
This updates the `qmk.json` file in the root of your External Userspace directory. If you're using a git repository to store your keymaps, now is a great time to commit and push to your own fork.
|
||||
|
||||
## Compiling External Userspace build targets
|
||||
|
||||
Once you have added your keymaps to the External Userspace build targets, you can compile all of them at once using the `qmk userspace-compile` command:
|
||||
|
||||
```sh
|
||||
qmk userspace-compile
|
||||
```
|
||||
|
||||
All firmware builds you've added to the External Userspace build targets will be built, and the resulting firmware files will be placed in the root of your External Userspace directory.
|
||||
|
||||
## Using GitHub Actions
|
||||
|
||||
GitHub Actions can be used to automatically build your keymaps whenever you push changes to your External Userspace repository. If you have set up your list of build targets, this is as simple as enabling workflows in the GitHub repository settings:
|
||||
|
||||

|
||||
|
||||
Any push will result in compilation of all configured builds, and once completed a new release containing the newly-minted firmware files will be created on GitHub, which you can subsequently download and flash to your keyboard:
|
||||
|
||||

|
@@ -56,7 +56,7 @@ QMK maintains a Homebrew tap and formula which will automatically install the CL
|
||||
|
||||
You will need to install Homebrew. Follow the instructions on https://brew.sh.
|
||||
|
||||
!> **NOTE:** If you are using Apple Silicon, such as the M1, you will need to install a rosetta compatible version of Homebrew. This version does not override the base Homebrew. This can be done by running `arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"`. See here: [Rosetta-compatible Homebrew](https://stackoverflow.com/questions/64882584/how-to-run-the-homebrew-installer-under-rosetta-2-on-m1-macbook)
|
||||
?> If you are using an Apple Silicon machine, the installation process will take significantly longer because GitHub actions do not have native runners to build binary packages for the ARM and AVR toolchains.
|
||||
|
||||
#### Installation
|
||||
|
||||
@@ -64,10 +64,6 @@ Install the QMK CLI by running:
|
||||
|
||||
brew install qmk/qmk/qmk
|
||||
|
||||
Install the QMK CLI on an Apple Silicon Mac by running:
|
||||
|
||||
arch -x86_64 brew install qmk/qmk/qmk
|
||||
|
||||
### ** Linux/WSL **
|
||||
|
||||
?> **Note for WSL users**: By default, the installation process will clone the QMK repository into your WSL home directory, but if you have cloned manually, ensure that it is located inside the WSL instance instead of the Windows filesystem (ie. not in `/mnt`), as accessing it is currently [extremely slow](https://github.com/microsoft/WSL/issues/4197).
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user