forked from Github/qmk_firmware
Compare commits
745 Commits
0.25.3
...
venv-scrip
Author | SHA1 | Date | |
---|---|---|---|
![]() |
855b234813 | ||
![]() |
1da8aa8259 | ||
![]() |
97547ac762 | ||
![]() |
66d0d53dc1 | ||
![]() |
9f76541b29 | ||
![]() |
eb04b94eec | ||
![]() |
b7b0eb76a9 | ||
![]() |
36f306b4a5 | ||
![]() |
f3bae56808 | ||
![]() |
7d8f193988 | ||
![]() |
859dab864a | ||
![]() |
1f7d10902a | ||
![]() |
d189de24a0 | ||
![]() |
e4e015c0c8 | ||
![]() |
4a5bae51cd | ||
![]() |
9e9b4acbde | ||
![]() |
57be487161 | ||
![]() |
968a611476 | ||
![]() |
65a8a5ff69 | ||
![]() |
c7a04bd930 | ||
![]() |
36b5559b99 | ||
![]() |
39161b9ee7 | ||
![]() |
074bbbfb21 | ||
![]() |
638b22d057 | ||
![]() |
9bea332a21 | ||
![]() |
8cbcdcac62 | ||
![]() |
88afd53b1f | ||
![]() |
9c86583981 | ||
![]() |
e66fce38b2 | ||
![]() |
c843ad1268 | ||
![]() |
0853a8ea35 | ||
![]() |
0988523851 | ||
![]() |
7936a791ed | ||
![]() |
3a6df60ba5 | ||
![]() |
5ab408aef7 | ||
![]() |
da34d652d4 | ||
![]() |
310c4847d5 | ||
![]() |
f4e58eeff4 | ||
![]() |
79a661fe61 | ||
![]() |
46236ce3de | ||
![]() |
0bda0f4775 | ||
![]() |
f8b4e24d37 | ||
![]() |
a8a47c4011 | ||
![]() |
d04789e9ea | ||
![]() |
4757ef281f | ||
![]() |
4e77ab66e2 | ||
![]() |
3d4da6de29 | ||
![]() |
be7b479c4a | ||
![]() |
9cd7896760 | ||
![]() |
291f1992d3 | ||
![]() |
8cbd631fcb | ||
![]() |
a3cfb1dab7 | ||
![]() |
69093f6de9 | ||
![]() |
3eb172d08e | ||
![]() |
a8fc265bf1 | ||
![]() |
b3f5408e72 | ||
![]() |
b06e9fdd95 | ||
![]() |
f156e57f8e | ||
![]() |
10849dac68 | ||
![]() |
94b6039620 | ||
![]() |
fb3a414a40 | ||
![]() |
fca6ad4ebc | ||
![]() |
e31eeb85db | ||
![]() |
9523ed9e32 | ||
![]() |
b17322b9b8 | ||
![]() |
580d18d2e9 | ||
![]() |
b10fa5032f | ||
![]() |
4f9ef90754 | ||
![]() |
f2a7f4b804 | ||
![]() |
3cda9ffcd6 | ||
![]() |
54860ed238 | ||
![]() |
83950c7dd9 | ||
![]() |
f4e6af2dbe | ||
![]() |
7877023b48 | ||
![]() |
f5f11b7c79 | ||
![]() |
cfb870d219 | ||
![]() |
6fbfd659ff | ||
![]() |
81a6f3e641 | ||
![]() |
c8cdee3e4e | ||
![]() |
292e0af293 | ||
![]() |
f1f875063c | ||
![]() |
465cbc87de | ||
![]() |
834f88b0a3 | ||
![]() |
6693a30671 | ||
![]() |
114b3db96a | ||
![]() |
e6daffce46 | ||
![]() |
b8dd09994a | ||
![]() |
92afc8198a | ||
![]() |
2aa186873e | ||
![]() |
06b7dce565 | ||
![]() |
95406717e7 | ||
![]() |
7c9e650b1c | ||
![]() |
7630a80791 | ||
![]() |
2c0cdcf7b2 | ||
![]() |
25fac5e737 | ||
![]() |
dd7287bf4e | ||
![]() |
d9fedce9b9 | ||
![]() |
01f6fa7cd6 | ||
![]() |
644588baef | ||
![]() |
7005522176 | ||
![]() |
f5b495e06e | ||
![]() |
5c85271e48 | ||
![]() |
f486605bab | ||
![]() |
32b6faaf35 | ||
![]() |
d00df05df1 | ||
![]() |
bf327f7a81 | ||
![]() |
d316331ab1 | ||
![]() |
3b874ee434 | ||
![]() |
bb9625ba55 | ||
![]() |
11db924a31 | ||
![]() |
453ec007c1 | ||
![]() |
b2608e3162 | ||
![]() |
459de98222 | ||
![]() |
c6b2553470 | ||
![]() |
baa29fef9d | ||
![]() |
22e6a8d15e | ||
![]() |
7f22cb52e3 | ||
![]() |
3f9d464412 | ||
![]() |
80f8aae3ec | ||
![]() |
36008922f8 | ||
![]() |
6602ee04af | ||
![]() |
2ad13037ab | ||
![]() |
7e53bb9965 | ||
![]() |
85a7627641 | ||
![]() |
13581820b8 | ||
![]() |
d0d170e6a0 | ||
![]() |
dd0068cfd4 | ||
![]() |
9884e4982b | ||
![]() |
5478051d74 | ||
![]() |
6fa11bf219 | ||
![]() |
5c97a78ce6 | ||
![]() |
11daef82e0 | ||
![]() |
9d17779832 | ||
![]() |
8844fba607 | ||
![]() |
6129af93f4 | ||
![]() |
a10e7cc858 | ||
![]() |
40d49ee487 | ||
![]() |
9246163b77 | ||
![]() |
c95f0fb671 | ||
![]() |
049865c30c | ||
![]() |
f0b5feb858 | ||
![]() |
eac4053a07 | ||
![]() |
f43c9127bf | ||
![]() |
27d68ef8b9 | ||
![]() |
c8a87ff3fe | ||
![]() |
4055798807 | ||
![]() |
29bc842fe2 | ||
![]() |
49a1a12a32 | ||
![]() |
00db6f2397 | ||
![]() |
fb598e7e61 | ||
![]() |
8cc6127668 | ||
![]() |
c0d57a6826 | ||
![]() |
c3ffbe4504 | ||
![]() |
8c27ae8fd7 | ||
![]() |
1a284f2b92 | ||
![]() |
3a5be8bd22 | ||
![]() |
f25624dca4 | ||
![]() |
a428727897 | ||
![]() |
035dcf213c | ||
![]() |
2cb35373c6 | ||
![]() |
bf6de46d7f | ||
![]() |
7446c6ea7d | ||
![]() |
c9cd92ece3 | ||
![]() |
ddfb8765ec | ||
![]() |
ff21363627 | ||
![]() |
d381bb7258 | ||
![]() |
c2dd0c1845 | ||
![]() |
50e54d8e1a | ||
![]() |
13a87ad354 | ||
![]() |
7f475b590a | ||
![]() |
a322107cb7 | ||
![]() |
305e7baa71 | ||
![]() |
65b5dc7e0f | ||
![]() |
c82f675266 | ||
![]() |
3cf94cb308 | ||
![]() |
208ebf54a9 | ||
![]() |
43e82ed5c7 | ||
![]() |
3d8cebb1a0 | ||
![]() |
e12c1fefdf | ||
![]() |
4bb3741288 | ||
![]() |
6a73c8299b | ||
![]() |
04c5deb503 | ||
![]() |
6374bad540 | ||
![]() |
a1597e7292 | ||
![]() |
b78118b2dd | ||
![]() |
62367b2133 | ||
![]() |
015cd23616 | ||
![]() |
e31ef83495 | ||
![]() |
f18a699393 | ||
![]() |
1118821178 | ||
![]() |
4d6337539d | ||
![]() |
c7fec10bd7 | ||
![]() |
17fac880bf | ||
![]() |
928b5fdf50 | ||
![]() |
805cde674d | ||
![]() |
81895940e6 | ||
![]() |
f7393a5ab8 | ||
![]() |
9a8f5a80e4 | ||
![]() |
a7486a8d87 | ||
![]() |
c622e1439c | ||
![]() |
93cc3f58b1 | ||
![]() |
5da5b179d5 | ||
![]() |
6a536d5588 | ||
![]() |
a0bce36aa1 | ||
![]() |
4665d9c405 | ||
![]() |
bda3300bb3 | ||
![]() |
2e86b05cab | ||
![]() |
90b87abb11 | ||
![]() |
9cbb4a2c4c | ||
![]() |
61778f6136 | ||
![]() |
17be3e4a54 | ||
![]() |
1c03574424 | ||
![]() |
49e339ba8d | ||
![]() |
7983f7409b | ||
![]() |
42f1763db9 | ||
![]() |
a93144834c | ||
![]() |
e7c009c142 | ||
![]() |
e84104fe8d | ||
![]() |
d48aac6a2c | ||
![]() |
aa05fa649f | ||
![]() |
64f533fa47 | ||
![]() |
0b3ece1189 | ||
![]() |
ae4ab5ed31 | ||
![]() |
ccae6e596a | ||
![]() |
0c19eae916 | ||
![]() |
12dae4b9b7 | ||
![]() |
b7729fa019 | ||
![]() |
2c7bf34d09 | ||
![]() |
3aaa086ac8 | ||
![]() |
e0788d19d4 | ||
![]() |
a4c286bb34 | ||
![]() |
f043545144 | ||
![]() |
46d2e15b1f | ||
![]() |
c44f5375ab | ||
![]() |
4691b72bd5 | ||
![]() |
6d4f8d8963 | ||
![]() |
a42652f8e7 | ||
![]() |
75848477fb | ||
![]() |
0fd9909657 | ||
![]() |
b5c807fb4a | ||
![]() |
6af8d4210c | ||
![]() |
4a6ba1e808 | ||
![]() |
59ac1a08c8 | ||
![]() |
e83a36dfbf | ||
![]() |
c3632dce99 | ||
![]() |
deb1dcf6c7 | ||
![]() |
2b55e43e54 | ||
![]() |
a7ed82b39b | ||
![]() |
ef3a939880 | ||
![]() |
3bd303f204 | ||
![]() |
096aca63c5 | ||
![]() |
28b6a8841f | ||
![]() |
d210590d4d | ||
![]() |
07535aa2c0 | ||
![]() |
884a808813 | ||
![]() |
784786c00c | ||
![]() |
9985f5950d | ||
![]() |
fba0408cb3 | ||
![]() |
9df36b25da | ||
![]() |
481e6f6440 | ||
![]() |
16a811604b | ||
![]() |
81109100a9 | ||
![]() |
d7e1eb3e48 | ||
![]() |
dae5e9ee06 | ||
![]() |
99e491f8b5 | ||
![]() |
0da9bd2709 | ||
![]() |
0b6b4c23d2 | ||
![]() |
d4811c19b0 | ||
![]() |
6644f41e91 | ||
![]() |
496f448090 | ||
![]() |
141214122d | ||
![]() |
d95690d89c | ||
![]() |
425a4b7c57 | ||
![]() |
fd65bd5ae0 | ||
![]() |
a5d4ed98fd | ||
![]() |
4b1f916b99 | ||
![]() |
60308a2c0f | ||
![]() |
70cbf08b67 | ||
![]() |
ecf725b356 | ||
![]() |
0f43486537 | ||
![]() |
4b7de2ba5d | ||
![]() |
530e044762 | ||
![]() |
cc3bc2af11 | ||
![]() |
df5800b6c4 | ||
![]() |
8b42e5fb8f | ||
![]() |
474cc01d68 | ||
![]() |
c134822486 | ||
![]() |
b481e7a8f0 | ||
![]() |
63206aebcf | ||
![]() |
d5c98d0539 | ||
![]() |
c05cafa3df | ||
![]() |
0c43a15ce6 | ||
![]() |
7a4f21d340 | ||
![]() |
11f2209087 | ||
![]() |
656fea4dab | ||
![]() |
170ed7ba9b | ||
![]() |
5d76c5280d | ||
![]() |
81dcf2b547 | ||
![]() |
5741eb7b10 | ||
![]() |
9976d0f547 | ||
![]() |
acac787842 | ||
![]() |
45dc2499dc | ||
![]() |
8f6d2ac53c | ||
![]() |
fc9d848a77 | ||
![]() |
b3bb19a96d | ||
![]() |
e6a898e3ee | ||
![]() |
048f2ddcbf | ||
![]() |
373364afd1 | ||
![]() |
31b962b339 | ||
![]() |
557e4e7ffc | ||
![]() |
97a0091bbb | ||
![]() |
e910c89e0b | ||
![]() |
21b84596e7 | ||
![]() |
e9cb9f42a5 | ||
![]() |
48d3edd66f | ||
![]() |
1355eb493f | ||
![]() |
ab4c13e835 | ||
![]() |
faf51c7449 | ||
![]() |
072947e573 | ||
![]() |
8db800bfba | ||
![]() |
fe50774cb4 | ||
![]() |
5f8aaf236f | ||
![]() |
39324e642f | ||
![]() |
1f02cd45af | ||
![]() |
b07a68230d | ||
![]() |
2d2eed9594 | ||
![]() |
822a4580f4 | ||
![]() |
91f293d0c7 | ||
![]() |
40f2575b56 | ||
![]() |
45397a44e3 | ||
![]() |
dccada95aa | ||
![]() |
2c6409fdd8 | ||
![]() |
380e0c9cad | ||
![]() |
783f97ff32 | ||
![]() |
ca6ba30a72 | ||
![]() |
158aaef78c | ||
![]() |
019b6f67b2 | ||
![]() |
339b820520 | ||
![]() |
fc209e1c51 | ||
![]() |
5acc3b2b7b | ||
![]() |
c0e2ecb825 | ||
![]() |
78900720fd | ||
![]() |
142128740d | ||
![]() |
c67c3d375b | ||
![]() |
ac1b488170 | ||
![]() |
b5b4e93857 | ||
![]() |
1f942bb17e | ||
![]() |
5c10bd3d8c | ||
![]() |
0fbe150303 | ||
![]() |
0b4065b50c | ||
![]() |
b04fee4ff7 | ||
![]() |
75402109e9 | ||
![]() |
ddc60da839 | ||
![]() |
fa657fef70 | ||
![]() |
eb78ca1c1a | ||
![]() |
bb20093b24 | ||
![]() |
d28a50e176 | ||
![]() |
8808fffc2f | ||
![]() |
9f387f525c | ||
![]() |
807ba71c89 | ||
![]() |
c7662e4f36 | ||
![]() |
5439507f5e | ||
![]() |
73cb6fd89f | ||
![]() |
8ca082892a | ||
![]() |
9c1e1d1fee | ||
![]() |
d538451adb | ||
![]() |
02b43b4b60 | ||
![]() |
20ae67ba01 | ||
![]() |
938837e881 | ||
![]() |
b3d8d5671c | ||
![]() |
cf84ea7662 | ||
![]() |
56ebd3b829 | ||
![]() |
f98ddf02f4 | ||
![]() |
c25b3bbe90 | ||
![]() |
8c35011d0a | ||
![]() |
c45e75037b | ||
![]() |
8c5acdea12 | ||
![]() |
783f465cd4 | ||
![]() |
60c5ad821c | ||
![]() |
59c275afbc | ||
![]() |
bcfe3a0718 | ||
![]() |
adb884761d | ||
![]() |
622dc56250 | ||
![]() |
e8103722bc | ||
![]() |
ce1adce696 | ||
![]() |
df2d30fd2c | ||
![]() |
d079372580 | ||
![]() |
883821fa62 | ||
![]() |
599899c5fb | ||
![]() |
af70e3759a | ||
![]() |
1eaead3ba4 | ||
![]() |
4bcc80ad46 | ||
![]() |
d09c11dc78 | ||
![]() |
9da9b245d3 | ||
![]() |
82f9019cc9 | ||
![]() |
4e2effc538 | ||
![]() |
a9d6825795 | ||
![]() |
8d5517fa63 | ||
![]() |
8ef275789c | ||
![]() |
ee1505971f | ||
![]() |
a5e9926c45 | ||
![]() |
b6e1a20950 | ||
![]() |
cced3ee622 | ||
![]() |
4e20740efa | ||
![]() |
f2c789bb4a | ||
![]() |
d5cc00ab62 | ||
![]() |
1e4435f22d | ||
![]() |
fab50be817 | ||
![]() |
f04fd13dff | ||
![]() |
23e7d93d0e | ||
![]() |
eb60235cd5 | ||
![]() |
8a58ad27a2 | ||
![]() |
2fb9816c77 | ||
![]() |
2764e48146 | ||
![]() |
6fbe91aecd | ||
![]() |
a6c8c41c68 | ||
![]() |
a6857872f2 | ||
![]() |
78fa0f5ca0 | ||
![]() |
56323f75c6 | ||
![]() |
ddb679ba88 | ||
![]() |
11031adc1b | ||
![]() |
7b4e806c25 | ||
![]() |
8b46500a74 | ||
![]() |
d79f46e408 | ||
![]() |
5a0112df08 | ||
![]() |
7ca0424189 | ||
![]() |
2ddfd60be7 | ||
![]() |
4ab36df48f | ||
![]() |
daa777d6fb | ||
![]() |
e69be076fc | ||
![]() |
63ef6516d3 | ||
![]() |
275e9de350 | ||
![]() |
35356c4623 | ||
![]() |
522bf1daf2 | ||
![]() |
8abaa3bc2d | ||
![]() |
fef8e7195b | ||
![]() |
a763dd5bbd | ||
![]() |
65143b08a3 | ||
![]() |
c70c99367a | ||
![]() |
fd44e96110 | ||
![]() |
b5b06f1094 | ||
![]() |
caa7599b83 | ||
![]() |
40d617f812 | ||
![]() |
c2dbbc060a | ||
![]() |
d885963e38 | ||
![]() |
85447bd53b | ||
![]() |
21b9b70c50 | ||
![]() |
c0aca9f45c | ||
![]() |
e76069ea4e | ||
![]() |
875eb43a28 | ||
![]() |
2db93b5945 | ||
![]() |
2908f0b846 | ||
![]() |
3ebf9880ca | ||
![]() |
a3d938d822 | ||
![]() |
83a7506438 | ||
![]() |
6dfd7ed46f | ||
![]() |
f0807ea64f | ||
![]() |
26e84c513c | ||
![]() |
1552cf2ddc | ||
![]() |
5c43a9bed1 | ||
![]() |
7b5d7907df | ||
![]() |
cfd0ab2198 | ||
![]() |
79ad561b67 | ||
![]() |
85cf8b5183 | ||
![]() |
5a5f68038e | ||
![]() |
52ee9f2ce1 | ||
![]() |
2c2885639e | ||
![]() |
57b7f8534b | ||
![]() |
4d4d7b76b0 | ||
![]() |
6051fc87e3 | ||
![]() |
c58c5fa8fa | ||
![]() |
aaf9074e85 | ||
![]() |
565bb704e0 | ||
![]() |
1ba4fef711 | ||
![]() |
890909c2d7 | ||
![]() |
3251f4b168 | ||
![]() |
f15fff3258 | ||
![]() |
f7a53df9d4 | ||
![]() |
f922ed4283 | ||
![]() |
7d94db8661 | ||
![]() |
4827d383a8 | ||
![]() |
063f1444c6 | ||
![]() |
ec5786bdd1 | ||
![]() |
2e671cfd8b | ||
![]() |
2df8046dd0 | ||
![]() |
1b8b6801d4 | ||
![]() |
2623a258f1 | ||
![]() |
ac8759fe74 | ||
![]() |
cc62eb503d | ||
![]() |
22f830d67c | ||
![]() |
0c4fd514f1 | ||
![]() |
9be6d76c61 | ||
![]() |
27ea1b1332 | ||
![]() |
3d10171e2c | ||
![]() |
e0809eade5 | ||
![]() |
23c4704123 | ||
![]() |
e3ef5b2d9d | ||
![]() |
4d4ccdc41a | ||
![]() |
f8cf58a512 | ||
![]() |
b066c86e43 | ||
![]() |
494af672ce | ||
![]() |
aa8d68036a | ||
![]() |
efa5b30cfd | ||
![]() |
f5319d8911 | ||
![]() |
d69b44e68a | ||
![]() |
f637ff8966 | ||
![]() |
fb54a59bba | ||
![]() |
c97ec805cd | ||
![]() |
07fd206370 | ||
![]() |
fbbc71ec34 | ||
![]() |
83d436581f | ||
![]() |
a0bb7ff992 | ||
![]() |
6eb6e3048a | ||
![]() |
d08da05cb8 | ||
![]() |
8336b5c72f | ||
![]() |
54f907bfe9 | ||
![]() |
b23ddb9ad8 | ||
![]() |
67d512e639 | ||
![]() |
e643fa03ef | ||
![]() |
4fbb395602 | ||
![]() |
1c02c3dfad | ||
![]() |
e4dfbb075e | ||
![]() |
2477aa9161 | ||
![]() |
300505bd9e | ||
![]() |
38f07e1fd2 | ||
![]() |
b82f6ac402 | ||
![]() |
4ae0ca5a11 | ||
![]() |
b9e67347f1 | ||
![]() |
be967d42d2 | ||
![]() |
c5e317aad9 | ||
![]() |
af72a58c8f | ||
![]() |
d0e89aecca | ||
![]() |
ecf5b26ff0 | ||
![]() |
9fb51cfe2b | ||
![]() |
4e8772b5cc | ||
![]() |
6d21898c14 | ||
![]() |
5078ca651c | ||
![]() |
096dc672c1 | ||
![]() |
10e2f1e29f | ||
![]() |
8e64ff574a | ||
![]() |
5e2368984e | ||
![]() |
9dba1cadc9 | ||
![]() |
15af5d7d0d | ||
![]() |
443d111403 | ||
![]() |
62c1787d72 | ||
![]() |
777db159ac | ||
![]() |
8fe667a1a4 | ||
![]() |
3a711f4cfa | ||
![]() |
cd22b8a945 | ||
![]() |
031ccd4887 | ||
![]() |
41878d276e | ||
![]() |
43fc7b5a4f | ||
![]() |
9536b86a09 | ||
![]() |
4ced8d9371 | ||
![]() |
9adac59c29 | ||
![]() |
1c6cdb8d74 | ||
![]() |
c663f5e9f3 | ||
![]() |
32ec677d8d | ||
![]() |
977918982d | ||
![]() |
26c114a2b4 | ||
![]() |
17c6744c82 | ||
![]() |
c2f7974c8e | ||
![]() |
bdca9318f9 | ||
![]() |
e07f752a57 | ||
![]() |
eed2a74be9 | ||
![]() |
bc8ac86422 | ||
![]() |
ce9edc94e5 | ||
![]() |
33adb8cba0 | ||
![]() |
a400c332d2 | ||
![]() |
e754c9f2b4 | ||
![]() |
f8596b40a4 | ||
![]() |
bc0c69570b | ||
![]() |
8471dcc563 | ||
![]() |
869b7d9ae6 | ||
![]() |
7bc3eef8cc | ||
![]() |
641a1ce568 | ||
![]() |
3ffe8d917a | ||
![]() |
e8e5d11ed8 | ||
![]() |
12379dc1eb | ||
![]() |
0947299864 | ||
![]() |
bd5da148ec | ||
![]() |
d6bfbdb6b1 | ||
![]() |
3e4159bc55 | ||
![]() |
cc0b2f9814 | ||
![]() |
5624804c68 | ||
![]() |
38f72c5d2b | ||
![]() |
07253bfe4a | ||
![]() |
62f81cfcc3 | ||
![]() |
2bde8ce206 | ||
![]() |
b94f70d642 | ||
![]() |
086e8e938e | ||
![]() |
af8fe44e0f | ||
![]() |
7bc53b8baa | ||
![]() |
9ca1f35333 | ||
![]() |
2998d20a00 | ||
![]() |
cd374b1500 | ||
![]() |
be7728ae58 | ||
![]() |
ffd9062190 | ||
![]() |
9d02ac37f7 | ||
![]() |
a7aa58cc81 | ||
![]() |
276ecd4693 | ||
![]() |
603586800c | ||
![]() |
90b043e01c | ||
![]() |
5e3b558d5a | ||
![]() |
5f794217b4 | ||
![]() |
7c6dbe5e7c | ||
![]() |
b71b81d539 | ||
![]() |
8bccabca25 | ||
![]() |
17ae6f9b53 | ||
![]() |
2f18d4f449 | ||
![]() |
cebe521b11 | ||
![]() |
94586f821c | ||
![]() |
0b572a1be6 | ||
![]() |
a2176f6a03 | ||
![]() |
751482580e | ||
![]() |
378dbd32bd | ||
![]() |
c973ee1445 | ||
![]() |
03e688e91f | ||
![]() |
d4e98e9fda | ||
![]() |
d5e0562a70 | ||
![]() |
f0471dd5b4 | ||
![]() |
e96d6d9bd4 | ||
![]() |
b4047be3eb | ||
![]() |
191c8cca33 | ||
![]() |
7824e7ed9b | ||
![]() |
17498fa48a | ||
![]() |
cb39df273d | ||
![]() |
99aa4f5191 | ||
![]() |
35f0a17679 | ||
![]() |
7aa2ce2b38 | ||
![]() |
b180a0d415 | ||
![]() |
6f03d20a92 | ||
![]() |
cc6bcf9bac | ||
![]() |
e5c80fc6b3 | ||
![]() |
05573be7b5 | ||
![]() |
aa11ef5bcf | ||
![]() |
751a6b5bc4 | ||
![]() |
27455bba6c | ||
![]() |
a6ef34cd16 | ||
![]() |
92881d38ef | ||
![]() |
4fdde75333 | ||
![]() |
0a5b892820 | ||
![]() |
53a0cdc446 | ||
![]() |
938badc3b0 | ||
![]() |
59a3098139 | ||
![]() |
dafc46f1d1 | ||
![]() |
590281f4f2 | ||
![]() |
baa564bddf | ||
![]() |
51acd35e6f | ||
![]() |
9f449246bb | ||
![]() |
3f44231d2d | ||
![]() |
63848603be | ||
![]() |
4864d5afca | ||
![]() |
0966901f95 | ||
![]() |
089a819179 | ||
![]() |
fca1417f6b | ||
![]() |
751fbd75d3 | ||
![]() |
1317a0732b | ||
![]() |
3c868b9316 | ||
![]() |
3ddd20cf51 | ||
![]() |
7ac1a34a34 | ||
![]() |
c43667fa74 | ||
![]() |
ad82c4703a | ||
![]() |
faa84a7c90 | ||
![]() |
0262161914 | ||
![]() |
e31418ee11 | ||
![]() |
d4654ab893 | ||
![]() |
0c8a968e3d | ||
![]() |
aec7569a04 | ||
![]() |
0594121b68 | ||
![]() |
a2f2de7d2c | ||
![]() |
4e8b740dd7 | ||
![]() |
4f8aab748b | ||
![]() |
c92becc57e | ||
![]() |
e1839238a4 | ||
![]() |
cd565a95a0 | ||
![]() |
a98aa70f80 | ||
![]() |
caf13bb9db | ||
![]() |
248a09d545 | ||
![]() |
4a4eda4c3c | ||
![]() |
55538b2e1e | ||
![]() |
c4a74be7f0 | ||
![]() |
dafbb92f4e | ||
![]() |
942c2a8d5a | ||
![]() |
8fe777adff | ||
![]() |
be9dfe65dd | ||
![]() |
49317f058a | ||
![]() |
fa40356250 | ||
![]() |
b3d3a7c46f | ||
![]() |
7247039742 | ||
![]() |
9fbf4579a4 | ||
![]() |
e69d30a9e9 | ||
![]() |
52b4058ca4 | ||
![]() |
bdd10ef8e7 | ||
![]() |
c785584fa5 | ||
![]() |
031ca3b40b | ||
![]() |
b826877c40 | ||
![]() |
e239d0383a | ||
![]() |
8041a88f5d | ||
![]() |
354a2e40cf | ||
![]() |
e381f91c6e | ||
![]() |
8b5cdfabf5 | ||
![]() |
d4f8b478aa | ||
![]() |
df4538d894 | ||
![]() |
c6ecb9ce41 | ||
![]() |
e484a3a179 | ||
![]() |
186dab5619 | ||
![]() |
9dc183afe4 | ||
![]() |
4926f0de8b | ||
![]() |
333f8bf0d7 | ||
![]() |
3de5e44f52 | ||
![]() |
e7a08ef1a9 | ||
![]() |
d12f090d1e | ||
![]() |
950d765370 | ||
![]() |
c561750f73 | ||
![]() |
260e9a546e | ||
![]() |
0d360b64fa | ||
![]() |
a4da5f219f | ||
![]() |
a82b0628b3 | ||
![]() |
75d11e0421 | ||
![]() |
1a343cfaf4 | ||
![]() |
6d365dd8f1 | ||
![]() |
c1c7c4f6e0 | ||
![]() |
8253697a63 | ||
![]() |
1c536513b3 | ||
![]() |
282253a7e0 | ||
![]() |
a1b2e0261d | ||
![]() |
41dbb4c86c | ||
![]() |
c67789b717 | ||
![]() |
78a0adfbb4 | ||
![]() |
6c87500231 | ||
![]() |
fa6d23235b | ||
![]() |
93f566280e | ||
![]() |
119e54e9e3 | ||
![]() |
c60554e090 | ||
![]() |
32af90ae84 | ||
![]() |
64098fafa6 | ||
![]() |
8a394503c7 | ||
![]() |
6ca94ae158 | ||
![]() |
47356b2201 | ||
![]() |
b36c7b99ae | ||
![]() |
4d32073681 | ||
![]() |
9be50fdce5 | ||
![]() |
267dffda15 | ||
![]() |
6921c8a7dd |
@@ -11,7 +11,8 @@ charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[{*.yaml,*.yml}] # To match GitHub Actions formatting
|
||||
# To match GitHub Actions formatting
|
||||
[*.{yaml,yml}]
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,7 +1,7 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: QMK Discord
|
||||
url: https://discord.gg/Uq7gcHh
|
||||
url: https://discord.gg/qmk
|
||||
about: Ask questions, discuss issues and features. Chill.
|
||||
- name: OLKB Subreddit
|
||||
url: https://www.reddit.com/r/olkb
|
||||
|
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,6 +1,5 @@
|
||||
<!--- Provide a general summary of your changes in the title above. -->
|
||||
|
||||
<!--- This template is entirely optional and can be removed, but is here to help both you and us. -->
|
||||
<!--- Anything on lines wrapped in comments like these will not show up in the final text. -->
|
||||
|
||||
## Description
|
||||
@@ -15,7 +14,7 @@
|
||||
- [ ] New feature
|
||||
- [ ] Enhancement/optimization
|
||||
- [ ] Keyboard (addition or update)
|
||||
- [ ] Keymap/layout/userspace (addition or update)
|
||||
- [ ] Keymap/layout (addition or update)
|
||||
- [ ] Documentation
|
||||
|
||||
## Issues Fixed or Closed by This PR
|
||||
|
82
.github/labeler.yml
vendored
82
.github/labeler.yml
vendored
@@ -1,46 +1,56 @@
|
||||
core:
|
||||
- quantum/**/*
|
||||
- tmk_core/**/*
|
||||
- drivers/**/*
|
||||
- tests/**/*
|
||||
- util/**/*
|
||||
- platforms/**/*
|
||||
- builddefs/**/*
|
||||
- Makefile
|
||||
- '*.mk'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- quantum/**
|
||||
- tmk_core/**
|
||||
- drivers/**
|
||||
- tests/**
|
||||
- util/**
|
||||
- platforms/**
|
||||
- builddefs/*.mk
|
||||
- Makefile
|
||||
- '*.mk'
|
||||
dependencies:
|
||||
- any:
|
||||
- 'lib/**/*'
|
||||
- '!lib/python/**/*'
|
||||
- changed-files:
|
||||
- all-globs-to-any-file:
|
||||
- lib/**
|
||||
- '!lib/python/**'
|
||||
keyboard:
|
||||
- any:
|
||||
- 'keyboards/**/*'
|
||||
- '!keyboards/**/keymaps/**/*'
|
||||
- changed-files:
|
||||
- all-globs-to-any-file:
|
||||
- keyboards/**
|
||||
- '!keyboards/**/keymaps/**'
|
||||
keymap:
|
||||
- users/**/*
|
||||
- layouts/**/*
|
||||
- keyboards/**/keymaps/**/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- users/**
|
||||
- layouts/**
|
||||
- keyboards/**/keymaps/**
|
||||
via:
|
||||
- keyboards/**/keymaps/via/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- keyboards/**/keymaps/via/*
|
||||
cli:
|
||||
- requirements.txt
|
||||
- lib/python/**/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- requirements.txt
|
||||
- lib/python/**
|
||||
python:
|
||||
- '**/*.py'
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- '**/*.py'
|
||||
documentation:
|
||||
- docs/**/*
|
||||
translation:
|
||||
- docs/fr-fr/**/*
|
||||
- docs/es/**/*
|
||||
- docs/ja/**/*
|
||||
- docs/he-il/**/*
|
||||
- docs/pt-br/**/*
|
||||
- docs/zh-cn/**/*
|
||||
- docs/de/**/*
|
||||
- docs/ru-ru/**/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- docs/**
|
||||
- builddefs/docsgen/**
|
||||
CI:
|
||||
- .github/**/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- .github/**
|
||||
dd:
|
||||
- data/constants/**/*
|
||||
- data/mappings/**/*
|
||||
- data/schemas/**/*
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- data/constants/**
|
||||
- data/mappings/**
|
||||
- data/schemas/**
|
||||
|
6
.github/workflows/auto_approve.yml
vendored
6
.github/workflows/auto_approve.yml
vendored
@@ -13,8 +13,8 @@ jobs:
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
|
||||
steps:
|
||||
- uses: mheap/automatic-approve-action@v1
|
||||
- uses: zvecr/automatic-approve-action@safe_files
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
workflows: "format.yml,lint.yml,unit_test.yml"
|
||||
dangerous_files: "lib/python/,Makefile,paths.mk,builddefs/"
|
||||
workflows: "labeler.yml,lint.yml,docs.yml"
|
||||
safe_files: "keyboards/,docs/"
|
||||
|
34
.github/workflows/ci_build_major_branch.yml
vendored
34
.github/workflows/ci_build_major_branch.yml
vendored
@@ -52,9 +52,9 @@ jobs:
|
||||
run: |
|
||||
target_count=$( {
|
||||
qmk find -km default 2>/dev/null
|
||||
qmk find -km via 2>/dev/null
|
||||
# qmk find -km xap 2>/dev/null
|
||||
} | sort | uniq | wc -l)
|
||||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution as we're splitting default and via
|
||||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution
|
||||
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT
|
||||
|
||||
build_targets:
|
||||
@@ -63,7 +63,8 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
keymap: [default, via]
|
||||
keymap: [default]
|
||||
# keymap: [default, xap]
|
||||
uses: ./.github/workflows/ci_build_major_branch_keymap.yml
|
||||
with:
|
||||
branch: ${{ inputs.branch || github.ref_name }}
|
||||
@@ -77,44 +78,59 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Disable safe.directory check
|
||||
run: |
|
||||
git config --global --add safe.directory '*'
|
||||
|
||||
- name: Checkout QMK Firmware
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download firmwares
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: firmware-*
|
||||
path: firmwares
|
||||
path: .
|
||||
merge-multiple: true
|
||||
|
||||
- name: Generate index page
|
||||
run: |
|
||||
python3 -m pip install -r ./util/ci/requirements.txt
|
||||
./util/ci/index_generator.py > index.html
|
||||
./util/ci/firmware_list_generator.py > firmware_list.json
|
||||
|
||||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/${{ github.sha }}
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
args: --acl public-read --follow-symlinks --delete --exclude '*' --include 'index.html' --include 'firmware_list.json' --include '*.hex' --include '*.bin' --include '*.uf2'
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }}
|
||||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }}
|
||||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }}
|
||||
SOURCE_DIR: firmwares
|
||||
SOURCE_DIR: .
|
||||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/${{ github.sha }}
|
||||
|
||||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/latest
|
||||
uses: jakejarvis/s3-sync-action@master
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks --delete
|
||||
args: --acl public-read --follow-symlinks --delete --exclude '*' --include 'index.html' --include 'firmware_list.json' --include '*.hex' --include '*.bin' --include '*.uf2'
|
||||
env:
|
||||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }}
|
||||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }}
|
||||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }}
|
||||
SOURCE_DIR: firmwares
|
||||
SOURCE_DIR: .
|
||||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/latest
|
||||
|
||||
- name: Check if failure marker file exists
|
||||
id: check_failure_marker
|
||||
uses: andstor/file-existence-action@v3
|
||||
with:
|
||||
files: firmwares/.failed
|
||||
files: ./.failed
|
||||
|
||||
- name: Fail build if needed
|
||||
if: steps.check_failure_marker.outputs.files_exists == 'true'
|
||||
|
@@ -172,10 +172,10 @@ jobs:
|
||||
targets-${{ inputs.keymap }}
|
||||
|
||||
- name: 'CI Discord Notification'
|
||||
if: always()
|
||||
if: always() && !cancelled()
|
||||
working-directory: util/ci/
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.CI_DISCORD_WEBHOOK }}
|
||||
run: |
|
||||
python3 -m pip install -r requirements.txt
|
||||
python3 ./discord-results.py --branch ${{ inputs.branch || github.ref_name }} --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
python3 ./discord-results.py --branch ${{ inputs.branch || github.ref_name }} --sha $(git rev-parse HEAD) --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
|
38
.github/workflows/docs.yml
vendored
38
.github/workflows/docs.yml
vendored
@@ -7,7 +7,6 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- vitepress
|
||||
paths:
|
||||
- 'builddefs/docsgen/**'
|
||||
- 'tmk_core/**'
|
||||
@@ -15,6 +14,11 @@ on:
|
||||
- 'platforms/**'
|
||||
- 'docs/**'
|
||||
- '.github/workflows/docs.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- 'builddefs/docsgen/**'
|
||||
- 'docs/**'
|
||||
- '.github/workflows/docs.yml'
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -25,9 +29,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/qmk/qmk_cli
|
||||
|
||||
# protect against those who develop with their fork on master
|
||||
if: github.repository == 'qmk/qmk_firmware' || (github.repository == 'tzarc/qmk_firmware' && github.ref == 'refs/heads/vitepress')
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -35,10 +36,10 @@ jobs:
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
apt-get update && apt-get install -y rsync doxygen curl
|
||||
apt-get update && apt-get install -y rsync doxygen
|
||||
# install nvm
|
||||
touch $HOME/.bashrc
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
||||
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
||||
|
||||
- name: Install node
|
||||
run: |
|
||||
@@ -46,40 +47,19 @@ jobs:
|
||||
nvm install 20
|
||||
nvm use 20
|
||||
corepack enable
|
||||
npm install -g moxygen
|
||||
|
||||
- name: Build docs
|
||||
run: |
|
||||
source $HOME/.bashrc
|
||||
nvm use 20
|
||||
qmk --verbose generate-docs
|
||||
touch '.build/docs/.nojekyll'
|
||||
|
||||
- name: Set CNAME
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
run: |
|
||||
# Override target CNAME
|
||||
echo 'docs.qmk.fm' > .build/docs/CNAME
|
||||
|
||||
- name: Override CNAME
|
||||
if: github.repository == 'tzarc/qmk_firmware'
|
||||
run: |
|
||||
# Temporarily override target CNAME during development
|
||||
echo 'vitepress.qmk.fm' > .build/docs/CNAME
|
||||
|
||||
- name: Deploy
|
||||
if: github.repository == 'qmk/qmk_firmware'
|
||||
uses: JamesIves/github-pages-deploy-action@v4.6.1
|
||||
if: ${{ github.event_name == 'push' && github.repository == 'qmk/qmk_firmware' }}
|
||||
uses: JamesIves/github-pages-deploy-action@v4.7.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: gh-pages
|
||||
folder: .build/docs
|
||||
git-config-name: QMK Bot
|
||||
git-config-email: hello@qmk.fm
|
||||
|
||||
- name: Deploy
|
||||
if: github.repository == 'tzarc/qmk_firmware'
|
||||
uses: JamesIves/github-pages-deploy-action@v4.6.1
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: .build/docs
|
||||
|
2
.github/workflows/format.yml
vendored
2
.github/workflows/format.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v44
|
||||
uses: tj-actions/changed-files@v45
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
2
.github/workflows/format_push.yml
vendored
2
.github/workflows/format_push.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
|
15
.github/workflows/labeler.yml
vendored
15
.github/workflows/labeler.yml
vendored
@@ -1,18 +1,13 @@
|
||||
name: "Pull Request Labeler"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened, ready_for_review, locked]
|
||||
- pull_request_target
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v4
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
configuration-path: '.github/labeler.yml'
|
||||
- uses: actions/labeler@v5
|
||||
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
- name: Get changed files
|
||||
id: file_changes
|
||||
uses: tj-actions/changed-files@v44
|
||||
uses: tj-actions/changed-files@v45
|
||||
with:
|
||||
use_rest_api: true
|
||||
|
||||
|
2
.github/workflows/regen_push.yml
vendored
2
.github/workflows/regen_push.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
||||
git config user.email 'hello@qmk.fm'
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
uses: peter-evans/create-pull-request@v7
|
||||
if: ${{ github.repository == 'qmk/qmk_firmware'}}
|
||||
with:
|
||||
token: ${{ secrets.QMK_BOT_TOKEN }}
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -25,6 +25,8 @@
|
||||
*.la
|
||||
*.stackdump
|
||||
*.sym
|
||||
index.html
|
||||
firmware_list.json
|
||||
|
||||
# QMK-specific
|
||||
api_data/v1
|
||||
@@ -116,4 +118,5 @@ compile_commands.json
|
||||
|
||||
# VIA(L) files that don't belong in QMK repo
|
||||
via*.json
|
||||
/keyboards/**/keymaps/via/*
|
||||
/keyboards/**/keymaps/vial/*
|
||||
|
2
Doxyfile
2
Doxyfile
@@ -145,7 +145,7 @@ FILE_PATTERNS = *.c \
|
||||
RECURSIVE = YES
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS = */protocol/arm_atsam/*
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS = *
|
||||
|
15
Makefile
15
Makefile
@@ -465,3 +465,18 @@ distclean_userspace: clean
|
||||
rm -f $(QMK_USERSPACE)/*.bin $(QMK_USERSPACE)/*.hex $(QMK_USERSPACE)/*.uf2
|
||||
echo 'done.'
|
||||
endif
|
||||
|
||||
# Extra targets for formatting and/or pytest, running within the qmk/qmk_cli container to match GHA.
|
||||
CONTAINER_PREAMBLE := export HOME="/tmp"; export PATH="/tmp/.local/bin:\$$PATH"; python3 -m pip install --upgrade pip; python3 -m pip install -r requirements-dev.txt
|
||||
|
||||
.PHONY: format-core
|
||||
format-core:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a"
|
||||
|
||||
.PHONY: pytest
|
||||
pytest:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk pytest"
|
||||
|
||||
.PHONY: format-and-pytest
|
||||
format-and-pytest:
|
||||
RUNTIME=docker ./util/docker_cmd.sh bash -lic "$(CONTAINER_PREAMBLE); qmk format-c --core-only -a && qmk format-python -a && qmk pytest"
|
||||
|
@@ -21,8 +21,10 @@ $(TEST_OUTPUT)_SRC := \
|
||||
$(SRC) \
|
||||
$(QUANTUM_PATH)/keymap_introspection.c \
|
||||
tests/test_common/matrix.c \
|
||||
tests/test_common/pointing_device_driver.c \
|
||||
tests/test_common/test_driver.cpp \
|
||||
tests/test_common/keyboard_report_util.cpp \
|
||||
tests/test_common/mouse_report_util.cpp \
|
||||
tests/test_common/keycode_util.cpp \
|
||||
tests/test_common/keycode_table.cpp \
|
||||
tests/test_common/test_fixture.cpp \
|
||||
|
@@ -34,10 +34,13 @@ ifeq ($(strip $(DUMP_CI_METADATA)),yes)
|
||||
endif
|
||||
|
||||
# Force expansion
|
||||
TARGET := $(TARGET)
|
||||
override TARGET := $(TARGET)
|
||||
|
||||
ifneq ($(FORCE_LAYOUT),)
|
||||
TARGET := $(TARGET)_$(FORCE_LAYOUT)
|
||||
override TARGET := $(TARGET)_$(FORCE_LAYOUT)
|
||||
endif
|
||||
ifneq ($(CONVERT_TO),)
|
||||
override TARGET := $(TARGET)_$(CONVERT_TO)
|
||||
endif
|
||||
|
||||
# Object files and generated keymap directory
|
||||
@@ -58,9 +61,6 @@ ifdef SKIP_GIT
|
||||
VERSION_H_FLAGS += --skip-git
|
||||
endif
|
||||
|
||||
# Generate the board's version.h file.
|
||||
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(INTERMEDIATE_OUTPUT)/src/version.h)
|
||||
|
||||
# Determine which subfolders exist.
|
||||
KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
|
||||
KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
|
||||
@@ -186,7 +186,10 @@ 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.)
|
||||
# Allow a separately-found keymap.c next to keymap.json -- the keymap.c
|
||||
# generator will include the other keymap.c in the process, if supplied.
|
||||
OTHER_KEYMAP_C := $(KEYMAP_C)
|
||||
OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\"
|
||||
endif
|
||||
|
||||
KEYMAP_PATH := $(KEYMAP_JSON_PATH)
|
||||
@@ -212,12 +215,20 @@ $(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON)
|
||||
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c
|
||||
$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON)
|
||||
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
|
||||
$(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
|
||||
@$(BUILD_CMD)
|
||||
|
||||
generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c $(INTERMEDIATE_OUTPUT)/src/keymap.h
|
||||
|
||||
endif
|
||||
|
||||
include $(BUILDDEFS_PATH)/converters.mk
|
||||
|
||||
# Generate the board's version.h file.
|
||||
$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(INTERMEDIATE_OUTPUT)/src/version.h)
|
||||
|
||||
MCU_ORIG := $(MCU)
|
||||
include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk)
|
||||
|
||||
|
@@ -47,7 +47,8 @@ PLATFORM:=TEST
|
||||
PLATFORM_KEY:=test
|
||||
BOOTLOADER_TYPE:=none
|
||||
|
||||
ifeq ($(strip $(DEBUG)), 1)
|
||||
DEBUG ?= 0
|
||||
ifneq ($(strip $(DEBUG)), 0)
|
||||
CONSOLE_ENABLE = yes
|
||||
endif
|
||||
|
||||
|
@@ -28,6 +28,7 @@ QUANTUM_SRC += \
|
||||
$(QUANTUM_DIR)/sync_timer.c \
|
||||
$(QUANTUM_DIR)/logging/debug.c \
|
||||
$(QUANTUM_DIR)/logging/sendchar.c \
|
||||
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
|
||||
|
||||
VPATH += $(QUANTUM_DIR)/logging
|
||||
# Fall back to lib/printf if there is no platform provided print
|
||||
@@ -129,13 +130,13 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
|
||||
MOUSE_ENABLE := yes
|
||||
VPATH += $(QUANTUM_DIR)/pointing_device
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_drivers.c
|
||||
SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
|
||||
ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
|
||||
SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
endif
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
|
||||
OPT_DEFS += -DPOINTING_DEVICE_DRIVER_NAME=$(strip $(POINTING_DEVICE_DRIVER))
|
||||
ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
|
||||
@@ -215,7 +216,7 @@ else
|
||||
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx GD32VF103),)
|
||||
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
|
||||
# Wear-leveling EEPROM implementation, backed by MCU flash
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
|
||||
SRC += eeprom_driver.c eeprom_wear_leveling.c
|
||||
@@ -238,10 +239,6 @@ else
|
||||
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
|
||||
SRC += eeprom_driver.c eeprom_transient.c
|
||||
endif
|
||||
else ifeq ($(PLATFORM),ARM_ATSAM)
|
||||
# arm_atsam EEPROM
|
||||
OPT_DEFS += -DEEPROM_SAMD
|
||||
SRC += eeprom_samd.c
|
||||
else ifeq ($(PLATFORM),TEST)
|
||||
# Test harness "EEPROM"
|
||||
OPT_DEFS += -DEEPROM_TEST_HARNESS
|
||||
@@ -282,18 +279,17 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
|
||||
endif
|
||||
endif
|
||||
|
||||
VALID_FLASH_DRIVER_TYPES := spi
|
||||
VALID_FLASH_DRIVER_TYPES := spi custom
|
||||
FLASH_DRIVER ?= none
|
||||
ifneq ($(strip $(FLASH_DRIVER)), none)
|
||||
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
|
||||
$(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver)
|
||||
else
|
||||
OPT_DEFS += -DFLASH_ENABLE
|
||||
OPT_DEFS += -DFLASH_ENABLE -DFLASH_DRIVER -DFLASH_DRIVER_$(strip $(shell echo $(FLASH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
ifeq ($(strip $(FLASH_DRIVER)),spi)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
|
||||
COMMON_VPATH += $(DRIVER_PATH)/flash
|
||||
SRC += flash_spi.c
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -311,11 +307,11 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
||||
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)/process_keycode/process_underglow.c
|
||||
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
|
||||
|
||||
ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
|
||||
@@ -461,12 +457,16 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
|
||||
COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
|
||||
POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
|
||||
|
||||
# TODO: Remove this
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
|
||||
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/color.c
|
||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
|
||||
SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
|
||||
LIB8TION_ENABLE := yes
|
||||
CIE1931_CURVE := yes
|
||||
RGB_KEYCODES_ENABLE := yes
|
||||
|
||||
ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
@@ -569,10 +569,6 @@ ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
|
||||
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
|
||||
endif
|
||||
|
||||
VARIABLE_TRACE ?= no
|
||||
ifneq ($(strip $(VARIABLE_TRACE)),no)
|
||||
SRC += $(QUANTUM_DIR)/variable_trace.c
|
||||
@@ -882,7 +878,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
|
||||
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
NO_USB_STARTUP_CHECK := yes
|
||||
COMMON_VPATH += $(DRIVER_PATH)/bluetooth
|
||||
SRC += outputselect.c
|
||||
SRC += outputselect.c process_connection.c
|
||||
|
||||
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
@@ -937,7 +933,7 @@ ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
|
||||
|
||||
OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
|
||||
|
||||
SRC += ws2812_$(strip $(WS2812_DRIVER)).c
|
||||
SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
|
||||
|
||||
ifeq ($(strip $(PLATFORM)), CHIBIOS)
|
||||
ifeq ($(strip $(WS2812_DRIVER)), pwm)
|
||||
|
@@ -43,25 +43,25 @@ ifneq ($(USE_CCACHE),no)
|
||||
CC_PREFIX ?= ccache
|
||||
endif
|
||||
|
||||
#---------------- Debug Options ----------------
|
||||
|
||||
DEBUG_ENABLE ?= no
|
||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||
CFLAGS += -ggdb3
|
||||
CXXFLAGS += -ggdb3
|
||||
ASFLAGS += -ggdb3
|
||||
# Create a map file when debugging
|
||||
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
||||
endif
|
||||
|
||||
|
||||
#---------------- C Compiler Options ----------------
|
||||
|
||||
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||
ifeq ($(PLATFORM),ARM_ATSAM)
|
||||
$(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.)
|
||||
$(info If unsure, set LTO_ENABLE = no.)
|
||||
endif
|
||||
CDEFS += -flto
|
||||
CDEFS += -DLTO_ENABLE
|
||||
endif
|
||||
|
||||
DEBUG_ENABLE ?= yes
|
||||
ifeq ($(strip $(SKIP_DEBUG_INFO)),yes)
|
||||
DEBUG_ENABLE=no
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||
CFLAGS += -g$(DEBUG)
|
||||
endif
|
||||
CFLAGS += $(CDEFS)
|
||||
CFLAGS += -O$(OPT)
|
||||
# add color
|
||||
@@ -83,9 +83,6 @@ CFLAGS += -fcommon
|
||||
|
||||
#---------------- C++ Compiler Options ----------------
|
||||
|
||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||
CXXFLAGS += -g$(DEBUG)
|
||||
endif
|
||||
CXXFLAGS += $(CXXDEFS)
|
||||
CXXFLAGS += -O$(OPT)
|
||||
# to suppress "warning: only initialized variables can be placed into program memory area"
|
||||
@@ -106,14 +103,10 @@ endif
|
||||
|
||||
#---------------- Linker Options ----------------
|
||||
|
||||
CREATE_MAP ?= yes
|
||||
ifeq ($(CREATE_MAP),yes)
|
||||
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
|
||||
endif
|
||||
ifeq ($(VERBOSE_LD_CMD),yes)
|
||||
LDFLAGS += -v
|
||||
endif
|
||||
#LDFLAGS += -Wl,--relax
|
||||
|
||||
LDFLAGS += $(EXTMEMOPTS)
|
||||
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
|
||||
LDFLAGS += -lm
|
||||
@@ -126,15 +119,11 @@ ADHLNS_ENABLE ?= no
|
||||
ifeq ($(ADHLNS_ENABLE),yes)
|
||||
# Avoid "Options to '-Xassembler' do not match" - only specify assembler options at LTO link time
|
||||
ifeq ($(strip $(LTO_ENABLE)), yes)
|
||||
LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
|
||||
LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
|
||||
else
|
||||
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||
CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
|
||||
ifeq ($(strip $(DEBUG_ENABLE)),yes)
|
||||
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
|
||||
else
|
||||
ASFLAGS = -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
||||
endif
|
||||
ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@@ -32,9 +32,6 @@ ifneq ($(CONVERT_TO),)
|
||||
|
||||
PLATFORM_KEY = $(shell echo $(CONVERTER) | cut -d "/" -f2)
|
||||
|
||||
# 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:]')
|
||||
OPT_DEFS += -DCONVERTER_TARGET=\"$(CONVERT_TO)\"
|
||||
|
@@ -33,14 +33,21 @@ export default defineConfig(({ mode }) => {
|
||||
},
|
||||
title: 'QMK Firmware',
|
||||
|
||||
nav: [{ text: "Home", link: "./" }],
|
||||
nav: [{ text: "Home", link: "/" }],
|
||||
|
||||
search: {
|
||||
provider: "local",
|
||||
},
|
||||
|
||||
editLink: {
|
||||
pattern: 'https://github.com/qmk/qmk_firmware/edit/master/docs/:path'
|
||||
},
|
||||
lastUpdated: true,
|
||||
|
||||
sidebar: sidebar,
|
||||
|
||||
externalLinkIcon: true,
|
||||
|
||||
socialLinks: [
|
||||
{ icon: { svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.84375 C 30.738281 3.375 29.9375 3 29 3 Z M 41 5 C 42.667969 5 44 6.332031 44 8 C 44 9.667969 42.667969 11 41 11 C 39.332031 11 38 9.667969 38 8 C 38 6.332031 39.332031 5 41 5 Z M 25 15 C 30.609375 15 35.675781 16.613281 39.28125 19.1875 C 42.886719 21.761719 45 25.226563 45 29 C 45 32.773438 42.886719 36.238281 39.28125 38.8125 C 35.675781 41.386719 30.609375 43 25 43 C 19.390625 43 14.324219 41.386719 10.71875 38.8125 C 7.113281 36.238281 5 32.773438 5 29 C 5 25.226563 7.113281 21.761719 10.71875 19.1875 C 14.324219 16.613281 19.390625 15 25 15 Z M 7.5 16.9375 C 8.203125 16.9375 8.914063 17.148438 9.53125 17.59375 C 7.527344 19.03125 5.886719 20.769531 4.75 22.71875 C 3.582031 21.296875 3.660156 19.339844 5 18 C 5.714844 17.285156 6.609375 16.9375 7.5 16.9375 Z M 42.5 16.9375 C 43.390625 16.9375 44.285156 17.285156 45 18 C 46.339844 19.339844 46.417969 21.296875 45.25 22.71875 C 44.113281 20.769531 42.472656 19.03125 40.46875 17.59375 C 41.085938 17.148438 41.796875 16.9375 42.5 16.9375 Z M 17 22 C 14.800781 22 13 23.800781 13 26 C 13 28.199219 14.800781 30 17 30 C 19.199219 30 21 28.199219 21 26 C 21 23.800781 19.199219 22 17 22 Z M 33 22 C 30.800781 22 29 23.800781 29 26 C 29 28.199219 30.800781 30 33 30 C 35.199219 30 37 28.199219 37 26 C 37 23.800781 35.199219 22 33 22 Z M 17 24 C 18.117188 24 19 24.882813 19 26 C 19 27.117188 18.117188 28 17 28 C 15.882813 28 15 27.117188 15 26 C 15 24.882813 15.882813 24 17 24 Z M 33 24 C 34.117188 24 35 24.882813 35 26 C 35 27.117188 34.117188 28 33 28 C 31.882813 28 31 27.117188 31 26 C 31 24.882813 31.882813 24 33 24 Z M 34.15625 33.84375 C 34.101563 33.851563 34.050781 33.859375 34 33.875 C 33.683594 33.9375 33.417969 34.144531 33.28125 34.4375 C 33.28125 34.4375 32.757813 35.164063 31.4375 36 C 30.117188 36.835938 28.058594 37.6875 25 37.6875 C 21.941406 37.6875 19.882813 36.835938 18.5625 36 C 17.242188 35.164063 16.71875 34.4375 16.71875 34.4375 C 16.492188 34.082031 16.066406 33.90625 15.65625 34 C 15.332031 34.082031 15.070313 34.316406 14.957031 34.632813 C 14.84375 34.945313 14.894531 35.292969 15.09375 35.5625 C 15.09375 35.5625 15.863281 36.671875 17.46875 37.6875 C 19.074219 38.703125 21.558594 39.6875 25 39.6875 C 28.441406 39.6875 30.925781 38.703125 32.53125 37.6875 C 34.136719 36.671875 34.90625 35.5625 34.90625 35.5625 C 35.207031 35.273438 35.296875 34.824219 35.128906 34.441406 C 34.960938 34.058594 34.574219 33.820313 34.15625 33.84375 Z"/></svg>' }, link: "https://reddit.com/r/olkb" },
|
||||
{ icon: "discord", link: "https://discord.gg/qmk" },
|
||||
|
@@ -2,11 +2,22 @@
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import { useRouter } from 'vitepress'
|
||||
import { onBeforeMount } from 'vue';
|
||||
import aliases from "../../../../docs/_aliases.json";
|
||||
|
||||
const router = useRouter()
|
||||
onBeforeMount(async () => {
|
||||
if (window.location.href.includes('/#/')) {
|
||||
const newUrl = window.location.href.replace(/\/#\//, '/').replace(/\?id=/, '#');
|
||||
// Convert from docsify-style to vitepress-style URLs
|
||||
let newUrl = window.location.href.replace(/\/#\//, '/').replace(/\?id=/, '#');
|
||||
|
||||
// Convert any aliases
|
||||
let testUrl = new URL(newUrl);
|
||||
while (testUrl.pathname in aliases) {
|
||||
testUrl.pathname = aliases[testUrl.pathname];
|
||||
}
|
||||
newUrl = testUrl.toString();
|
||||
|
||||
// Redirect if required
|
||||
if (newUrl != window.location.href) {
|
||||
window.history.replaceState({}, '', newUrl);
|
||||
await router.go(newUrl);
|
||||
}
|
||||
|
@@ -1,7 +1,19 @@
|
||||
/* Override <kbd> as vitepress doesn't put them with borders */
|
||||
kbd {
|
||||
border: 1px solid var(--vp-c-text-1);
|
||||
border-radius: 0.6em;
|
||||
border-radius: 5px;
|
||||
margin: 0.2em;
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
:root {
|
||||
--vp-nav-logo-height: 32px;
|
||||
|
||||
--vp-layout-max-width: calc(98% + 64px);
|
||||
|
||||
--vp-sidebar-width: 300px;
|
||||
}
|
||||
|
||||
.VPDoc.has-aside .content-container {
|
||||
max-width: unset !important;
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"vite": "^5.2.10",
|
||||
"vite": "^5.2.14",
|
||||
"vitepress": "^1.1.0",
|
||||
"vitepress-plugin-tabs": "^0.5.0",
|
||||
"vue": "^3.4.24"
|
||||
|
@@ -298,85 +298,85 @@
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz#5e8930291f1e5ead7fb1171d53ba5c87718de062"
|
||||
integrity sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==
|
||||
"@rollup/rollup-android-arm-eabi@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz#8b613b9725e8f9479d142970b106b6ae878610d5"
|
||||
integrity sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==
|
||||
|
||||
"@rollup/rollup-android-arm64@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz#ffb84f1359c04ec8a022a97110e18a5600f5f638"
|
||||
integrity sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==
|
||||
"@rollup/rollup-android-arm64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz#654ca1049189132ff602bfcf8df14c18da1f15fb"
|
||||
integrity sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==
|
||||
|
||||
"@rollup/rollup-darwin-arm64@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz#b2fcee8d4806a0b1b9185ac038cc428ddedce9f4"
|
||||
integrity sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==
|
||||
"@rollup/rollup-darwin-arm64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz#6d241d099d1518ef0c2205d96b3fa52e0fe1954b"
|
||||
integrity sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==
|
||||
|
||||
"@rollup/rollup-darwin-x64@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz#fcb25ccbaa3dd33a6490e9d1c64bab2e0e16b932"
|
||||
integrity sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==
|
||||
"@rollup/rollup-darwin-x64@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz#42bd19d292a57ee11734c980c4650de26b457791"
|
||||
integrity sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz#40d46bdfe667e5eca31bf40047460e326d2e26bb"
|
||||
integrity sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz#f23555ee3d8fe941c5c5fd458cd22b65eb1c2232"
|
||||
integrity sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz#7741df2448c11c56588b50835dbfe91b1a10b375"
|
||||
integrity sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz#f3bbd1ae2420f5539d40ac1fde2b38da67779baa"
|
||||
integrity sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz#0a23b02d2933e4c4872ad18d879890b6a4a295df"
|
||||
integrity sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==
|
||||
"@rollup/rollup-linux-arm64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz#7abe900120113e08a1f90afb84c7c28774054d15"
|
||||
integrity sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz#e37ef259358aa886cc07d782220a4fb83c1e6970"
|
||||
integrity sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==
|
||||
"@rollup/rollup-linux-arm64-musl@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz#9e655285c8175cd44f57d6a1e8e5dedfbba1d820"
|
||||
integrity sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==
|
||||
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz#8c69218b6de05ee2ba211664a2d2ac1e54e43f94"
|
||||
integrity sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz#9a79ae6c9e9d8fe83d49e2712ecf4302db5bef5e"
|
||||
integrity sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz#d32727dab8f538d9a4a7c03bcf58c436aecd0139"
|
||||
integrity sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz#67ac70eca4ace8e2942fabca95164e8874ab8128"
|
||||
integrity sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz#d46097246a187d99fc9451fe8393b7155b47c5ec"
|
||||
integrity sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==
|
||||
"@rollup/rollup-linux-s390x-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz#9f883a7440f51a22ed7f99e1d070bd84ea5005fc"
|
||||
integrity sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz#6356c5a03a4afb1c3057490fc51b4764e109dbc7"
|
||||
integrity sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==
|
||||
"@rollup/rollup-linux-x64-gnu@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz#70116ae6c577fe367f58559e2cffb5641a1dd9d0"
|
||||
integrity sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz#03a5831a9c0d05877b94653b5ddd3020d3c6fb06"
|
||||
integrity sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==
|
||||
"@rollup/rollup-linux-x64-musl@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz#f473f88219feb07b0b98b53a7923be716d1d182f"
|
||||
integrity sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz#6cc0db57750376b9303bdb6f5482af8974fcae35"
|
||||
integrity sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==
|
||||
"@rollup/rollup-win32-arm64-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz#4349482d17f5d1c58604d1c8900540d676f420e0"
|
||||
integrity sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz#aea0b7e492bd9ed46971cb80bc34f1eb14e07789"
|
||||
integrity sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==
|
||||
"@rollup/rollup-win32-ia32-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz#a6fc39a15db618040ec3c2a24c1e26cb5f4d7422"
|
||||
integrity sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.16.4":
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz#c09ad9a132ccb5a67c4f211d909323ab1294f95f"
|
||||
integrity sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==
|
||||
"@rollup/rollup-win32-x64-msvc@4.22.4":
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz#3dd5d53e900df2a40841882c02e56f866c04d202"
|
||||
integrity sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==
|
||||
|
||||
"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
|
||||
version "1.3.0"
|
||||
@@ -697,28 +697,28 @@ rfdc@^1.3.1:
|
||||
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
|
||||
|
||||
rollup@^4.13.0:
|
||||
version "4.16.4"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.16.4.tgz#fe328eb41293f20c9593a095ec23bdc4b5d93317"
|
||||
integrity sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==
|
||||
version "4.22.4"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.22.4.tgz#4135a6446671cd2a2453e1ad42a45d5973ec3a0f"
|
||||
integrity sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==
|
||||
dependencies:
|
||||
"@types/estree" "1.0.5"
|
||||
optionalDependencies:
|
||||
"@rollup/rollup-android-arm-eabi" "4.16.4"
|
||||
"@rollup/rollup-android-arm64" "4.16.4"
|
||||
"@rollup/rollup-darwin-arm64" "4.16.4"
|
||||
"@rollup/rollup-darwin-x64" "4.16.4"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.16.4"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.16.4"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.16.4"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.16.4"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.16.4"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.16.4"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.16.4"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.16.4"
|
||||
"@rollup/rollup-linux-x64-musl" "4.16.4"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.16.4"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.16.4"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.16.4"
|
||||
"@rollup/rollup-android-arm-eabi" "4.22.4"
|
||||
"@rollup/rollup-android-arm64" "4.22.4"
|
||||
"@rollup/rollup-darwin-arm64" "4.22.4"
|
||||
"@rollup/rollup-darwin-x64" "4.22.4"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.22.4"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.22.4"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.22.4"
|
||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.22.4"
|
||||
"@rollup/rollup-linux-x64-musl" "4.22.4"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.22.4"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.22.4"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.22.4"
|
||||
fsevents "~2.3.2"
|
||||
|
||||
shiki@1.3.0, shiki@^1.3.0:
|
||||
@@ -743,10 +743,10 @@ tabbable@^6.2.0:
|
||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
|
||||
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
|
||||
|
||||
vite@^5.2.10, vite@^5.2.9:
|
||||
version "5.2.10"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.10.tgz#2ac927c91e99d51b376a5c73c0e4b059705f5bd7"
|
||||
integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==
|
||||
vite@^5.2.14, vite@^5.2.9:
|
||||
version "5.2.14"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.14.tgz#fd5f60facf6b5f90ec7da6323c467a365d380c3d"
|
||||
integrity sha512-TFQLuwWLPms+NBNlh0D9LZQ+HXW471COABxw/9TEUBrjuHMo9BrYBPrN/SYAwIuVL+rLerycxiLT41t4f5MZpA==
|
||||
dependencies:
|
||||
esbuild "^0.20.1"
|
||||
postcss "^8.4.38"
|
||||
|
@@ -36,6 +36,7 @@ GENERIC_FEATURES = \
|
||||
HAPTIC \
|
||||
KEY_LOCK \
|
||||
KEY_OVERRIDE \
|
||||
LAYER_LOCK \
|
||||
LEADER \
|
||||
MAGIC \
|
||||
MOUSEKEY \
|
||||
|
@@ -67,7 +67,6 @@ OTHER_OPTION_NAMES = \
|
||||
PS2_DRIVER \
|
||||
RAW_ENABLE \
|
||||
SWAP_HANDS_ENABLE \
|
||||
RING_BUFFERED_6KRO_REPORT_ENABLE \
|
||||
WATCHDOG_ENABLE \
|
||||
ERGOINU \
|
||||
NO_USB_STARTUP_CHECK \
|
||||
|
616
data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson
Normal file
616
data/constants/keycodes/extras/keycodes_farsi_0.0.1.hjson
Normal file
@@ -0,0 +1,616 @@
|
||||
{
|
||||
"aliases": {
|
||||
/*
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ │ ۱ │ ۲ │ ۳ │ ۴ │ ۵ │ ۶ │ ۷ │ ۸ │ ۹ │ ۰ │ - │ = │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ ض │ ص │ ث │ ق │ ف │ غ │ ع │ ه │ خ │ ح │ ج │ چ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ ش │ س │ ی │ ب │ ل │ ا │ ت │ ن │ م │ ک │ گ │ \ │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ < │ ظ │ ط │ ز │ ر │ ذ │ د │ پ │ و │ . │ / │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"KC_GRV": {
|
||||
"key": "FA_ZWJ",
|
||||
"label": "(zero-width joiner)",
|
||||
}
|
||||
"KC_1": {
|
||||
"key": "FA_1A",
|
||||
"label": "۱",
|
||||
}
|
||||
"KC_2": {
|
||||
"key": "FA_2A",
|
||||
"label": "۲",
|
||||
}
|
||||
"KC_3": {
|
||||
"key": "FA_3A",
|
||||
"label": "۳",
|
||||
}
|
||||
"KC_4": {
|
||||
"key": "FA_4A",
|
||||
"label": "۴",
|
||||
}
|
||||
"KC_5": {
|
||||
"key": "FA_5A",
|
||||
"label": "۵",
|
||||
}
|
||||
"KC_6": {
|
||||
"key": "FA_6A",
|
||||
"label": "۶",
|
||||
}
|
||||
"KC_7": {
|
||||
"key": "FA_7A",
|
||||
"label": "۷",
|
||||
}
|
||||
"KC_8": {
|
||||
"key": "FA_8A",
|
||||
"label": "۸",
|
||||
}
|
||||
"KC_9": {
|
||||
"key": "FA_9A",
|
||||
"label": "۹",
|
||||
}
|
||||
"KC_0": {
|
||||
"key": "FA_0A",
|
||||
"label": "۰",
|
||||
}
|
||||
"KC_MINS": {
|
||||
"key": "FA_MINS",
|
||||
"label": "-",
|
||||
}
|
||||
"KC_EQL": {
|
||||
"key": "FA_EQL",
|
||||
"label": "=",
|
||||
}
|
||||
"KC_Q": {
|
||||
"key": "FA_ZAD",
|
||||
"label": "ض",
|
||||
}
|
||||
"KC_W": {
|
||||
"key": "FA_SAD",
|
||||
"label": "ص",
|
||||
}
|
||||
"KC_E": {
|
||||
"key": "FA_SE",
|
||||
"label": "ث",
|
||||
}
|
||||
"KC_R": {
|
||||
"key": "FA_QAF",
|
||||
"label": "ق",
|
||||
}
|
||||
"KC_T": {
|
||||
"key": "FA_FE",
|
||||
"label": "ف",
|
||||
}
|
||||
"KC_Y": {
|
||||
"key": "FA_GHYN",
|
||||
"label": "غ",
|
||||
}
|
||||
"KC_U": {
|
||||
"key": "FA_EYN",
|
||||
"label": "ع",
|
||||
}
|
||||
"KC_I": {
|
||||
"key": "FA_HE",
|
||||
"label": "ه",
|
||||
}
|
||||
"KC_O": {
|
||||
"key": "FA_KHE",
|
||||
"label": "خ",
|
||||
}
|
||||
"KC_P": {
|
||||
"key": "FA_HEJ",
|
||||
"label": "ح",
|
||||
}
|
||||
"KC_LBRC": {
|
||||
"key": "FA_JIM",
|
||||
"label": "ج",
|
||||
}
|
||||
"KC_RBRC": {
|
||||
"key": "FA_CHE",
|
||||
"label": "چ",
|
||||
}
|
||||
"KC_A": {
|
||||
"key": "FA_SHIN",
|
||||
"label": "ش",
|
||||
}
|
||||
"KC_S": {
|
||||
"key": "FA_SIN",
|
||||
"label": "س",
|
||||
}
|
||||
"KC_D": {
|
||||
"key": "FA_YE",
|
||||
"label": "ی",
|
||||
}
|
||||
"KC_F": {
|
||||
"key": "FA_BE",
|
||||
"label": "ب",
|
||||
}
|
||||
"KC_G": {
|
||||
"key": "FA_LAM",
|
||||
"label": "ل",
|
||||
}
|
||||
"KC_H": {
|
||||
"key": "FA_ALEF",
|
||||
"label": "ا",
|
||||
}
|
||||
"KC_J": {
|
||||
"key": "FA_TE",
|
||||
"label": "ت",
|
||||
}
|
||||
"KC_K": {
|
||||
"key": "FA_NOON",
|
||||
"label": "ن",
|
||||
}
|
||||
"KC_L": {
|
||||
"key": "FA_MIM",
|
||||
"label": "م",
|
||||
}
|
||||
"KC_SCLN": {
|
||||
"key": "FA_KAF",
|
||||
"label": "ک",
|
||||
}
|
||||
"KC_QUOT": {
|
||||
"key": "FA_GAF",
|
||||
"label": "گ",
|
||||
}
|
||||
"KC_BSLS": {
|
||||
"key": "FA_BSLS",
|
||||
"label": "\\",
|
||||
}
|
||||
"KC_LT": {
|
||||
"key": "FA_LT",
|
||||
"label": "<",
|
||||
}
|
||||
"KC_Z": {
|
||||
"key": "FA_ZA",
|
||||
"label": "ظ",
|
||||
}
|
||||
"KC_X": {
|
||||
"key": "FA_TA",
|
||||
"label": "ط",
|
||||
}
|
||||
"KC_C": {
|
||||
"key": "FA_ZE",
|
||||
"label": "ز",
|
||||
}
|
||||
"KC_V": {
|
||||
"key": "FA_RE",
|
||||
"label": "ر",
|
||||
}
|
||||
"KC_B": {
|
||||
"key": "FA_ZAL",
|
||||
"label": "ذ",
|
||||
}
|
||||
"KC_N": {
|
||||
"key": "FA_DAL",
|
||||
"label": "د",
|
||||
}
|
||||
"KC_M": {
|
||||
"key": "FA_PE",
|
||||
"label": "پ",
|
||||
}
|
||||
"KC_COMM": {
|
||||
"key": "FA_WAW",
|
||||
"label": "و",
|
||||
}
|
||||
"KC_DOT": {
|
||||
"key": "FA_DOT",
|
||||
"label": ".",
|
||||
}
|
||||
"KC_SLSH": {
|
||||
"key": "FA_SLSH",
|
||||
"label": "/",
|
||||
}
|
||||
"KC_SPC": {
|
||||
"key": "FA_SPC",
|
||||
"label": " ",
|
||||
}
|
||||
/* Shifted symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ÷ │ ! │ ٬ │ ٫ │ ﷼ │ ٪ │ × │ ، │ * │ ) │ ( │ ـ │ + │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ ْ │ ٌ │ ٍ │ ً │ ُ │ ِ │ َ │ ّ │ ] │ [ │ } │ { │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ ؤ │ ئ │ ي │ إ │ أ │ آ │ ة │ » │ « │ : │ ؛ │ | │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ > │ ك │ ٓ │ ژ │ ٰ │ │ ٔ │ ء │ │ │ ؟ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(FA_ZWJ)": {
|
||||
"key": "FA_DIV",
|
||||
"label": "÷",
|
||||
}
|
||||
"S(FA_1A)": {
|
||||
"key": "FA_EXLM",
|
||||
"label": "!",
|
||||
}
|
||||
"S(FA_2A)": {
|
||||
"key": "FA_THS",
|
||||
"label": "٬",
|
||||
}
|
||||
"S(FA_3A)": {
|
||||
"key": "FA_DECS",
|
||||
"label": "٫",
|
||||
}
|
||||
"S(FA_4A)": {
|
||||
"key": "FA_RIAL",
|
||||
"label": "﷼",
|
||||
}
|
||||
"S(FA_5A)": {
|
||||
"key": "FA_PRCA",
|
||||
"label": "٪",
|
||||
}
|
||||
"S(FA_6A)": {
|
||||
"key": "FA_MUL",
|
||||
"label": "×",
|
||||
}
|
||||
"S(FA_7A)": {
|
||||
"key": "FA_COMA",
|
||||
"label": "،",
|
||||
}
|
||||
"S(FA_8A)": {
|
||||
"key": "FA_ASTR",
|
||||
"label": "*",
|
||||
}
|
||||
"S(FA_9A)": {
|
||||
"key": "FA_RPRN",
|
||||
"label": ")",
|
||||
}
|
||||
"S(FA_0A)": {
|
||||
"key": "FA_LPRN",
|
||||
"label": "(",
|
||||
}
|
||||
"S(FA_MINS)": {
|
||||
"key": "FA_TATW",
|
||||
"label": "ـ",
|
||||
}
|
||||
"S(FA_EQL)": {
|
||||
"key": "FA_PLUS",
|
||||
"label": "+",
|
||||
}
|
||||
"S(FA_ZAD)": {
|
||||
"key": "FA_SUK",
|
||||
"label": "ْ",
|
||||
}
|
||||
"S(FA_SAD)": {
|
||||
"key": "FA_DMTN",
|
||||
"label": "ٌ",
|
||||
}
|
||||
"S(FA_SE)": {
|
||||
"key": "FA_KSTN",
|
||||
"label": "ٍ",
|
||||
}
|
||||
"S(FA_QAF)": {
|
||||
"key": "FA_FTHN",
|
||||
"label": "ً",
|
||||
}
|
||||
"S(FA_FE)": {
|
||||
"key": "FA_DMM",
|
||||
"label": "ُ",
|
||||
}
|
||||
"S(FA_GHYN)": {
|
||||
"key": "FA_KAS",
|
||||
"label": "ِ",
|
||||
}
|
||||
"S(FA_EYN)": {
|
||||
"key": "FA_FAT",
|
||||
"label": "َ",
|
||||
}
|
||||
"S(FA_HE)": {
|
||||
"key": "FA_TSDD",
|
||||
"label": "",
|
||||
}
|
||||
"S(FA_KHE)": {
|
||||
"key": "FA_RBRC",
|
||||
"label": "]",
|
||||
}
|
||||
"S(FA_HEJ)": {
|
||||
"key": "FA_LBRC",
|
||||
"label": "[",
|
||||
}
|
||||
"S(FA_JIM)": {
|
||||
"key": "FA_RCBR",
|
||||
"label": "}",
|
||||
}
|
||||
"S(FA_CHE)": {
|
||||
"key": "FA_LCBR",
|
||||
"label": "{",
|
||||
}
|
||||
"S(FA_SHIN)": {
|
||||
"key": "FA_HMZV",
|
||||
"label": "ؤ",
|
||||
}
|
||||
"S(FA_SIN)": {
|
||||
"key": "FA_HMZY",
|
||||
"label": "ئ",
|
||||
}
|
||||
"S(FA_YE)": {
|
||||
"key": "FA_YEA",
|
||||
"label": "ي",
|
||||
}
|
||||
"S(FA_BE)": {
|
||||
"key": "FA_HMZU",
|
||||
"label": "إ",
|
||||
}
|
||||
"S(FA_LAM)": {
|
||||
"key": "FA_HMZO",
|
||||
"label": "أ",
|
||||
}
|
||||
"S(FA_ALEF)": {
|
||||
"key": "FA_MALF",
|
||||
"label": "آ",
|
||||
}
|
||||
"S(FA_TE)": {
|
||||
"key": "FA_TEHM",
|
||||
"label": "ة",
|
||||
}
|
||||
"S(FA_NOON)": {
|
||||
"key": "FA_RQOT",
|
||||
"label": "»",
|
||||
}
|
||||
"S(FA_MIM)": {
|
||||
"key": "FA_LQOT",
|
||||
"label": "«",
|
||||
}
|
||||
"S(FA_KAF)": {
|
||||
"key": "FA_COLN",
|
||||
"label": ":",
|
||||
}
|
||||
"S(FA_GAF)": {
|
||||
"key": "FA_SCLA",
|
||||
"label": "؛",
|
||||
}
|
||||
"S(FA_LT)": {
|
||||
"key": "FA_GT",
|
||||
"label": ">",
|
||||
}
|
||||
"S(FA_ZA)": {
|
||||
"key": "FA_KAFA",
|
||||
"label": "ك",
|
||||
}
|
||||
"S(FA_TA)": {
|
||||
"key": "FA_MADO",
|
||||
"label": "ٓ",
|
||||
}
|
||||
"S(FA_ZE)": {
|
||||
"key": "FA_JEH",
|
||||
"label": "ژ",
|
||||
}
|
||||
"S(FA_RE)": {
|
||||
"key": "FA_SUPA",
|
||||
"label": "ٰ",
|
||||
}
|
||||
"S(FA_ZAL)": {
|
||||
"key": "FA_ZWNJ",
|
||||
"label": "(zero-width non-joiner)",
|
||||
}
|
||||
"S(FA_DAL)": {
|
||||
"key": "FA_HMZA",
|
||||
"label": "ٔ",
|
||||
}
|
||||
"S(FA_PE)": {
|
||||
"key": "FA_HMZ",
|
||||
"label": "ء",
|
||||
}
|
||||
"S(FA_SLSH)": {
|
||||
"key": "FA_QSA",
|
||||
"label": "؟",
|
||||
}
|
||||
/* AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ ~ │ ` │ @ │ # │ $ │ % │ ^ │ & │ • │ │ │ _ │ − │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ ° │ │ € │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ ى │ │ │ ٱ │ │ ﴾ │ ﴿ │ ; │ " │ ‐ │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ | │ │ │ │ ٖ │ │ ٕ │ … │ , │ ' │ ? │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"ALGR(FA_ZWJ)": {
|
||||
"key": "FA_TILD",
|
||||
"label": "~",
|
||||
}
|
||||
"ALGR(FA_1A)": {
|
||||
"key": "FA_GRV",
|
||||
"label": "`",
|
||||
}
|
||||
"ALGR(FA_2A)": {
|
||||
"key": "FA_AT",
|
||||
"label": "@",
|
||||
}
|
||||
"ALGR(FA_3A)": {
|
||||
"key": "FA_HASH",
|
||||
"label": "#",
|
||||
}
|
||||
"ALGR(FA_4A)": {
|
||||
"key": "FA_DLR",
|
||||
"label": "$",
|
||||
}
|
||||
"ALGR(FA_5A)": {
|
||||
"key": "FA_PERC",
|
||||
"label": "%",
|
||||
}
|
||||
"ALGR(FA_6A)": {
|
||||
"key": "FA_CIRC",
|
||||
"label": "^",
|
||||
}
|
||||
"ALGR(FA_7A)": {
|
||||
"key": "FA_AMPR",
|
||||
"label": "&",
|
||||
}
|
||||
"ALGR(FA_8A)": {
|
||||
"key": "FA_BULT",
|
||||
"label": "•",
|
||||
}
|
||||
"ALGR(FA_9A)": {
|
||||
"key": "FA_LRM",
|
||||
"label": "(left-to-right mark)",
|
||||
}
|
||||
"ALGR(FA_0A)": {
|
||||
"key": "FA_RLM",
|
||||
"label": "(right-to-left mark)",
|
||||
}
|
||||
"ALGR(FA_MINS)": {
|
||||
"key": "FA_UNDS",
|
||||
"label": "_",
|
||||
}
|
||||
"ALGR(FA_EQL)": {
|
||||
"key": "FA_DMNS",
|
||||
"label": "− (dead)",
|
||||
}
|
||||
"ALGR(FA_ZAD)": {
|
||||
"key": "FA_DEG",
|
||||
"label": "°",
|
||||
}
|
||||
"ALGR(FA_SE)": {
|
||||
"key": "FA_EURO",
|
||||
"label": "€",
|
||||
}
|
||||
"ALGR(FA_HE)": {
|
||||
"key": "FA_LRO",
|
||||
"label": "(left-to-right override)",
|
||||
}
|
||||
"ALGR(FA_KHE)": {
|
||||
"key": "FA_RLO",
|
||||
"label": "(right-to-left override)",
|
||||
}
|
||||
"ALGR(FA_HEJ)": {
|
||||
"key": "FA_PDF",
|
||||
"label": "(pop directional formatting)",
|
||||
}
|
||||
"ALGR(FA_JIM)": {
|
||||
"key": "FA_LRE",
|
||||
"label": "(left-to-right embedding)",
|
||||
}
|
||||
"ALGR(FA_CHE)": {
|
||||
"key": "FA_RLE",
|
||||
"label": "(right-to-left embedding)",
|
||||
}
|
||||
"ALGR(FA_YE)": {
|
||||
"key": "FA_ALFM",
|
||||
"label": "ى",
|
||||
}
|
||||
"ALGR(FA_ALEF)": {
|
||||
"key": "FA_ALFW",
|
||||
"label": "ٱ",
|
||||
}
|
||||
"ALGR(FA_NOON)": {
|
||||
"key": "FA_LORP",
|
||||
"label": "﴾",
|
||||
}
|
||||
"ALGR(FA_MIM)": {
|
||||
"key": "FA_RORP",
|
||||
"label": "﴿",
|
||||
}
|
||||
"ALGR(FA_KAF)": {
|
||||
"key": "FA_SCLN",
|
||||
"label": ";",
|
||||
}
|
||||
"ALGR(FA_GAF)": {
|
||||
"key": "FA_DQT",
|
||||
"label": "\"",
|
||||
}
|
||||
"ALGR(FA_BSLS)": {
|
||||
"key": "FA_MINA",
|
||||
"label": "-",
|
||||
}
|
||||
"ALGR(FA_ZA)": {
|
||||
"key": "FA_PIPE",
|
||||
"label": "|",
|
||||
}
|
||||
"ALGR(FA_RA)": {
|
||||
"key": "FA_SUBA",
|
||||
"label": "ٖ",
|
||||
}
|
||||
"ALGR(FA_DAL)": {
|
||||
"key": "FA_HMZB",
|
||||
"label": "ء",
|
||||
}
|
||||
"ALGR(FA_PE)": {
|
||||
"key": "FA_ELLP",
|
||||
"label": "…",
|
||||
}
|
||||
"ALGR(FA_WAW)": {
|
||||
"key": "FA_COMM",
|
||||
"label": ",",
|
||||
}
|
||||
"ALGR(FA_DOT)": {
|
||||
"key": "FA_QUOT",
|
||||
"label": "'",
|
||||
}
|
||||
"ALGR(FA_SLSH)": {
|
||||
"key": "FA_QUES",
|
||||
"label": "?",
|
||||
}
|
||||
/* Shift+AltGr symbols
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
|
||||
* │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │ │ │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
|
||||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
|
||||
* │ │ ¦ │ │ │ │ │ │ │ │ │ │ │ │
|
||||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
|
||||
* │ │ │ │ │ │ │ │ │
|
||||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
|
||||
*/
|
||||
"S(ALGR(FA_1A))": {
|
||||
"key": "FA_1",
|
||||
"label": "1",
|
||||
}
|
||||
"S(ALGR(FA_2A))": {
|
||||
"key": "FA_2",
|
||||
"label": "2",
|
||||
}
|
||||
"S(ALGR(FA_3A))": {
|
||||
"key": "FA_3",
|
||||
"label": "3",
|
||||
}
|
||||
"S(ALGR(FA_4A))": {
|
||||
"key": "FA_4",
|
||||
"label": "4",
|
||||
}
|
||||
"S(ALGR(FA_5A))": {
|
||||
"key": "FA_5",
|
||||
"label": "5",
|
||||
}
|
||||
"S(ALGR(FA_6A))": {
|
||||
"key": "FA_6",
|
||||
"label": "6",
|
||||
}
|
||||
"S(ALGR(FA_7A))": {
|
||||
"key": "FA_7",
|
||||
"label": "7",
|
||||
}
|
||||
"S(ALGR(FA_8A))": {
|
||||
"key": "FA_8",
|
||||
"label": "8",
|
||||
}
|
||||
"S(ALGR(FA_9A))": {
|
||||
"key": "FA_9",
|
||||
"label": "9",
|
||||
}
|
||||
"S(ALGR(FA_0A))": {
|
||||
"key": "FA_0",
|
||||
"label": "0",
|
||||
}
|
||||
"S(ALGR(FA_LT))": {
|
||||
"key": "FA_BRKP",
|
||||
"label": "¦",
|
||||
}
|
||||
"S(ALGR(FA_SPC))": {
|
||||
"key": "FA_NNBS",
|
||||
"label": "(narrow non-breaking space)",
|
||||
}
|
||||
}
|
||||
}
|
@@ -84,7 +84,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_Gs"
|
||||
"MI_Gs",
|
||||
"MI_Ab"
|
||||
]
|
||||
},
|
||||
@@ -99,7 +99,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_As"
|
||||
"MI_As",
|
||||
"MI_Bb"
|
||||
]
|
||||
},
|
||||
|
@@ -2,131 +2,131 @@
|
||||
"keycodes": {
|
||||
"0x7E00": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_0",
|
||||
"key": "QK_KB_0"
|
||||
},
|
||||
"0x7E01": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_1",
|
||||
"key": "QK_KB_1"
|
||||
},
|
||||
"0x7E02": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_2",
|
||||
"key": "QK_KB_2"
|
||||
},
|
||||
"0x7E03": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_3",
|
||||
"key": "QK_KB_3"
|
||||
},
|
||||
"0x7E04": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_4",
|
||||
"key": "QK_KB_4"
|
||||
},
|
||||
"0x7E05": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_5",
|
||||
"key": "QK_KB_5"
|
||||
},
|
||||
"0x7E06": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_6",
|
||||
"key": "QK_KB_6"
|
||||
},
|
||||
"0x7E07": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_7",
|
||||
"key": "QK_KB_7"
|
||||
},
|
||||
"0x7E08": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_8",
|
||||
"key": "QK_KB_8"
|
||||
},
|
||||
"0x7E09": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_9",
|
||||
"key": "QK_KB_9"
|
||||
},
|
||||
"0x7E0A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_10",
|
||||
"key": "QK_KB_10"
|
||||
},
|
||||
"0x7E0B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_11",
|
||||
"key": "QK_KB_11"
|
||||
},
|
||||
"0x7E0C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_12",
|
||||
"key": "QK_KB_12"
|
||||
},
|
||||
"0x7E0D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_13",
|
||||
"key": "QK_KB_13"
|
||||
},
|
||||
"0x7E0E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_14",
|
||||
"key": "QK_KB_14"
|
||||
},
|
||||
"0x7E0F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_15",
|
||||
"key": "QK_KB_15"
|
||||
},
|
||||
"0x7E10": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_16",
|
||||
"key": "QK_KB_16"
|
||||
},
|
||||
"0x7E11": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_17",
|
||||
"key": "QK_KB_17"
|
||||
},
|
||||
"0x7E12": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_18",
|
||||
"key": "QK_KB_18"
|
||||
},
|
||||
"0x7E13": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_19",
|
||||
"key": "QK_KB_19"
|
||||
},
|
||||
"0x7E14": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_20",
|
||||
"key": "QK_KB_20"
|
||||
},
|
||||
"0x7E15": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_21",
|
||||
"key": "QK_KB_21"
|
||||
},
|
||||
"0x7E16": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_22",
|
||||
"key": "QK_KB_22"
|
||||
},
|
||||
"0x7E17": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_23",
|
||||
"key": "QK_KB_23"
|
||||
},
|
||||
"0x7E18": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_24",
|
||||
"key": "QK_KB_24"
|
||||
},
|
||||
"0x7E19": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_25",
|
||||
"key": "QK_KB_25"
|
||||
},
|
||||
"0x7E1A": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_26",
|
||||
},
|
||||
"key": "QK_KB_26"
|
||||
},
|
||||
"0x7E1B": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_27",
|
||||
"key": "QK_KB_27"
|
||||
},
|
||||
"0x7E1C": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_28",
|
||||
"key": "QK_KB_28"
|
||||
},
|
||||
"0x7E1D": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_29",
|
||||
"key": "QK_KB_29"
|
||||
},
|
||||
"0x7E1E": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_30",
|
||||
"key": "QK_KB_30"
|
||||
},
|
||||
"0x7E1F": {
|
||||
"group": "kb",
|
||||
"key": "QK_KB_31",
|
||||
},
|
||||
"key": "QK_KB_31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -86,7 +86,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_G_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_Gs"
|
||||
"MI_Gs",
|
||||
"MI_Ab"
|
||||
]
|
||||
},
|
||||
@@ -101,7 +101,7 @@
|
||||
"group": "midi",
|
||||
"key": "QK_MIDI_NOTE_A_SHARP_0",
|
||||
"aliases": [
|
||||
"MI_As"
|
||||
"MI_As",
|
||||
"MI_Bb"
|
||||
]
|
||||
},
|
||||
|
@@ -2,131 +2,131 @@
|
||||
"keycodes": {
|
||||
"0x7E40": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_0",
|
||||
"key": "QK_USER_0"
|
||||
},
|
||||
"0x7E41": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_1",
|
||||
"key": "QK_USER_1"
|
||||
},
|
||||
"0x7E42": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_2",
|
||||
"key": "QK_USER_2"
|
||||
},
|
||||
"0x7E43": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_3",
|
||||
"key": "QK_USER_3"
|
||||
},
|
||||
"0x7E44": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_4",
|
||||
"key": "QK_USER_4"
|
||||
},
|
||||
"0x7E45": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_5",
|
||||
"key": "QK_USER_5"
|
||||
},
|
||||
"0x7E46": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_6",
|
||||
"key": "QK_USER_6"
|
||||
},
|
||||
"0x7E47": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_7",
|
||||
"key": "QK_USER_7"
|
||||
},
|
||||
"0x7E48": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_8",
|
||||
"key": "QK_USER_8"
|
||||
},
|
||||
"0x7E49": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_9",
|
||||
"key": "QK_USER_9"
|
||||
},
|
||||
"0x7E4A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_10",
|
||||
"key": "QK_USER_10"
|
||||
},
|
||||
"0x7E4B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_11",
|
||||
"key": "QK_USER_11"
|
||||
},
|
||||
"0x7E4C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_12",
|
||||
"key": "QK_USER_12"
|
||||
},
|
||||
"0x7E4D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_13",
|
||||
"key": "QK_USER_13"
|
||||
},
|
||||
"0x7E4E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_14",
|
||||
"key": "QK_USER_14"
|
||||
},
|
||||
"0x7E4F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_15",
|
||||
"key": "QK_USER_15"
|
||||
},
|
||||
"0x7E50": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_16",
|
||||
"key": "QK_USER_16"
|
||||
},
|
||||
"0x7E51": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_17",
|
||||
"key": "QK_USER_17"
|
||||
},
|
||||
"0x7E52": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_18",
|
||||
"key": "QK_USER_18"
|
||||
},
|
||||
"0x7E53": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_19",
|
||||
"key": "QK_USER_19"
|
||||
},
|
||||
"0x7E54": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_20",
|
||||
"key": "QK_USER_20"
|
||||
},
|
||||
"0x7E55": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_21",
|
||||
"key": "QK_USER_21"
|
||||
},
|
||||
"0x7E56": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_22",
|
||||
"key": "QK_USER_22"
|
||||
},
|
||||
"0x7E57": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_23",
|
||||
"key": "QK_USER_23"
|
||||
},
|
||||
"0x7E58": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_24",
|
||||
"key": "QK_USER_24"
|
||||
},
|
||||
"0x7E59": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_25",
|
||||
"key": "QK_USER_25"
|
||||
},
|
||||
"0x7E5A": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_26",
|
||||
},
|
||||
"key": "QK_USER_26"
|
||||
},
|
||||
"0x7E5B": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_27",
|
||||
"key": "QK_USER_27"
|
||||
},
|
||||
"0x7E5C": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_28",
|
||||
"key": "QK_USER_28"
|
||||
},
|
||||
"0x7E5D": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_29",
|
||||
"key": "QK_USER_29"
|
||||
},
|
||||
"0x7E5E": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_30",
|
||||
"key": "QK_USER_30"
|
||||
},
|
||||
"0x7E5F": {
|
||||
"group": "user",
|
||||
"key": "QK_USER_31",
|
||||
},
|
||||
"key": "QK_USER_31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
175
data/constants/keycodes/keycodes_0.0.5_basic.hjson
Normal file
175
data/constants/keycodes/keycodes_0.0.5_basic.hjson
Normal file
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"keycodes": {
|
||||
"0x00CD": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_UP",
|
||||
"label": "Mouse cursor up",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_UP"
|
||||
]
|
||||
},
|
||||
"0x00CE": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_DOWN",
|
||||
"label": "Mouse cursor down",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_DOWN"
|
||||
]
|
||||
},
|
||||
"0x00CF": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_LEFT",
|
||||
"label": "Mouse cursor left",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_LEFT"
|
||||
]
|
||||
},
|
||||
"0x00D0": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_CURSOR_RIGHT",
|
||||
"label": "Mouse cursor right",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_RGHT"
|
||||
]
|
||||
},
|
||||
"0x00D1": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_1",
|
||||
"label": "Mouse button 1",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN1"
|
||||
]
|
||||
},
|
||||
"0x00D2": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_2",
|
||||
"label": "Mouse button 2",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN2"
|
||||
]
|
||||
},
|
||||
"0x00D3": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_3",
|
||||
"label": "Mouse button 3",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN3"
|
||||
]
|
||||
},
|
||||
"0x00D4": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_4",
|
||||
"label": "Mouse button 4",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN4"
|
||||
]
|
||||
},
|
||||
"0x00D5": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_5",
|
||||
"label": "Mouse button 5",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN5"
|
||||
]
|
||||
},
|
||||
"0x00D6": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_6",
|
||||
"label": "Mouse button 6",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN6"
|
||||
]
|
||||
},
|
||||
"0x00D7": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_7",
|
||||
"label": "Mouse button 7",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN7"
|
||||
]
|
||||
},
|
||||
"0x00D8": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_BUTTON_8",
|
||||
"label": "Mouse button 8",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_BTN8"
|
||||
]
|
||||
},
|
||||
"0x00D9": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_UP",
|
||||
"label": "Mouse wheel up",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLU"
|
||||
]
|
||||
},
|
||||
"0x00DA": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_DOWN",
|
||||
"label": "Mouse wheel down",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLD"
|
||||
]
|
||||
},
|
||||
"0x00DB": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_LEFT",
|
||||
"label": "Mouse wheel left",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLL"
|
||||
]
|
||||
},
|
||||
"0x00DC": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_WHEEL_RIGHT",
|
||||
"label": "Mouse wheel right",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_WHLR"
|
||||
]
|
||||
},
|
||||
"0x00DD": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_0",
|
||||
"label": "Set mouse acceleration to 0",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL0"
|
||||
]
|
||||
},
|
||||
"0x00DE": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_1",
|
||||
"label": "Set mouse acceleration to 1",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL1"
|
||||
]
|
||||
},
|
||||
"0x00DF": {
|
||||
"group": "mouse",
|
||||
"key": "QK_MOUSE_ACCELERATION_2",
|
||||
"label": "Set mouse acceleration to 2",
|
||||
"aliases": [
|
||||
"!reset!",
|
||||
"MS_ACL2"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
7
data/constants/keycodes/keycodes_0.0.6.hjson
Normal file
7
data/constants/keycodes/keycodes_0.0.6.hjson
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"ranges": {
|
||||
"0x52E0/0x001F": {
|
||||
"define": "QK_PERSISTENT_DEF_LAYER"
|
||||
}
|
||||
}
|
||||
}
|
115
data/constants/keycodes/keycodes_0.0.6_connection.hjson
Normal file
115
data/constants/keycodes/keycodes_0.0.6_connection.hjson
Normal file
@@ -0,0 +1,115 @@
|
||||
{
|
||||
"ranges": {
|
||||
"0x7780/0x003F": {
|
||||
"define": "QK_CONNECTION"
|
||||
}
|
||||
}
|
||||
"keycodes": {
|
||||
"0x7780": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_AUTO",
|
||||
"aliases": [
|
||||
"OU_AUTO"
|
||||
]
|
||||
},
|
||||
"0x7781": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NEXT",
|
||||
"aliases": [
|
||||
"OU_NEXT"
|
||||
]
|
||||
},
|
||||
"0x7782": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_PREV",
|
||||
"aliases": [
|
||||
"OU_PREV"
|
||||
]
|
||||
},
|
||||
"0x7783": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_NONE",
|
||||
"aliases": [
|
||||
"OU_NONE"
|
||||
]
|
||||
},
|
||||
"0x7784": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_USB",
|
||||
"aliases": [
|
||||
"OU_USB"
|
||||
]
|
||||
},
|
||||
"0x7785": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_2P4GHZ",
|
||||
"aliases": [
|
||||
"OU_2P4G"
|
||||
]
|
||||
},
|
||||
"0x7786": {
|
||||
"group": "connection",
|
||||
"key": "QK_OUTPUT_BLUETOOTH",
|
||||
"aliases": [
|
||||
"OU_BT"
|
||||
]
|
||||
},
|
||||
|
||||
"0x7790": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE_NEXT",
|
||||
"aliases": [
|
||||
"BT_NEXT"
|
||||
]
|
||||
},
|
||||
"0x7791": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE_PREV",
|
||||
"aliases": [
|
||||
"BT_PREV"
|
||||
]
|
||||
},
|
||||
"0x7792": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_UNPAIR",
|
||||
"aliases": [
|
||||
"BT_UNPR"
|
||||
]
|
||||
}
|
||||
"0x7793": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE1",
|
||||
"aliases": [
|
||||
"BT_PRF1"
|
||||
]
|
||||
},
|
||||
"0x7794": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE2",
|
||||
"aliases": [
|
||||
"BT_PRF2"
|
||||
]
|
||||
},
|
||||
"0x7795": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE3",
|
||||
"aliases": [
|
||||
"BT_PRF3"
|
||||
]
|
||||
},
|
||||
"0x7796": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE4",
|
||||
"aliases": [
|
||||
"BT_PRF4"
|
||||
]
|
||||
},
|
||||
"0x7797": {
|
||||
"group": "connection",
|
||||
"key": "QK_BLUETOOTH_PROFILE5",
|
||||
"aliases": [
|
||||
"BT_PRF5"
|
||||
]
|
||||
},
|
||||
}
|
||||
}
|
14
data/constants/keycodes/keycodes_0.0.6_quantum.hjson
Normal file
14
data/constants/keycodes/keycodes_0.0.6_quantum.hjson
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"keycodes": {
|
||||
"0x7C20": "!delete!", // old QK_OUTPUT_AUTO
|
||||
"0x7C21": "!delete!", // old QK_OUTPUT_USB
|
||||
"0x7C22": "!delete!", // old QK_OUTPUT_BLUETOOTH
|
||||
"0x7C7B": {
|
||||
"group": "quantum",
|
||||
"key": "QK_LAYER_LOCK",
|
||||
"aliases": [
|
||||
"QK_LLCK"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@@ -84,6 +84,11 @@
|
||||
"board": "STEMCELL",
|
||||
"bootloader": "tinyuf2",
|
||||
"processor": "STM32F411"
|
||||
},
|
||||
"svlinky": {
|
||||
"board": "QMK_PM2040",
|
||||
"bootloader": "rp2040",
|
||||
"processor": "RP2040"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -64,6 +64,9 @@
|
||||
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
|
||||
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
|
||||
|
||||
// Layer locking
|
||||
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
|
||||
|
||||
// Indicators
|
||||
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
|
||||
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
|
||||
@@ -72,6 +75,11 @@
|
||||
"LED_KANA_PIN": {"info_key": "indicators.kana"},
|
||||
"LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"},
|
||||
|
||||
// Joystick
|
||||
"JOYSTICK_AXIS_COUNT": {"info_key": "joystick.axis_count", "value_type": "int"},
|
||||
"JOYSTICK_AXIS_RESOLUTION": {"info_key": "joystick.axis_resolution", "value_type": "int"},
|
||||
"JOYSTICK_BUTTON_COUNT": {"info_key": "joystick.button_count", "value_type": "int"},
|
||||
|
||||
// Leader Key
|
||||
"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"},
|
||||
@@ -171,7 +179,7 @@
|
||||
"SECURE_UNLOCK_TIMEOUT": {"info_key": "secure.unlock_timeout", "value_type": "int"},
|
||||
|
||||
// Split Keyboard
|
||||
"SOFT_SERIAL_PIN": {"info_key": "split.soft_serial_pin"},
|
||||
"SOFT_SERIAL_PIN": {"info_key": "split.serial.pin"},
|
||||
"SOFT_SERIAL_SPEED": {"info_key": "split.soft_serial_speed"},
|
||||
"SPLIT_HAND_MATRIX_GRID": {"info_key": "split.handedness.matrix_grid", "value_type": "array", "to_c": false},
|
||||
"SPLIT_HAND_PIN": {"info_key": "split.handedness.pin"},
|
||||
|
@@ -25,6 +25,8 @@
|
||||
"ENCODER_DRIVER": {"info_key": "encoder.driver"},
|
||||
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
|
||||
"HAPTIC_DRIVER": {"info_key": "haptic.driver"},
|
||||
"JOYSTICK_DRIVER": {"info_key": "joystick.driver"},
|
||||
"JOYSTICK_ENABLE": {"info_key": "joystick.enabled", "value_type": "bool"},
|
||||
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
|
||||
"LAYOUTS": {"info_key": "community_layouts", "value_type": "list"},
|
||||
"LED_MATRIX_DRIVER": {"info_key": "led_matrix.driver"},
|
||||
@@ -41,6 +43,7 @@
|
||||
"RGB_MATRIX_DRIVER": {"info_key": "rgb_matrix.driver"},
|
||||
"RGBLIGHT_DRIVER": {"info_key": "rgblight.driver"},
|
||||
"SECURE_ENABLE": {"info_key": "secure.enabled", "value_type": "bool"},
|
||||
"SERIAL_DRIVER": {"info_key": "split.serial.driver"},
|
||||
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
|
||||
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
|
||||
"STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"},
|
||||
|
@@ -563,6 +563,15 @@
|
||||
"plain60": {
|
||||
"target": "evyd13/plain60"
|
||||
},
|
||||
"planck/ez": {
|
||||
"target": "zsa/planck_ez/base"
|
||||
},
|
||||
"planck/ez/base": {
|
||||
"target": "zsa/planck_ez/base"
|
||||
},
|
||||
"planck/ez/glow": {
|
||||
"target": "zsa/planck_ez/glow"
|
||||
},
|
||||
"ploopyco/trackball": {
|
||||
"target": "ploopyco/trackball/rev1_005"
|
||||
},
|
||||
@@ -1060,7 +1069,7 @@
|
||||
"target": "lyso1/lefishe"
|
||||
},
|
||||
"lets_split_eh/eh": {
|
||||
"target": "maple_computing/lets_split_eh/eh"
|
||||
"target": "maple_computing/lets_split_eh"
|
||||
},
|
||||
"ls_60": {
|
||||
"target": "weirdo/ls_60"
|
||||
@@ -1080,6 +1089,9 @@
|
||||
"macro1": {
|
||||
"target": "laneware/macro1"
|
||||
},
|
||||
"maple_computing/lets_split_eh/eh": {
|
||||
"target": "maple_computing/lets_split_eh"
|
||||
},
|
||||
"massdrop/thekey": {
|
||||
"target": "drop/thekey/v1"
|
||||
},
|
||||
@@ -1137,6 +1149,12 @@
|
||||
"mt980": {
|
||||
"target": "mt/mt980"
|
||||
},
|
||||
"mt/ncr80/hotswap": {
|
||||
"target": "mt/ncr80/r2/hotswap"
|
||||
},
|
||||
"mt/ncr80/solder": {
|
||||
"target": "mt/ncr80/r2/solder"
|
||||
},
|
||||
"nafuda": {
|
||||
"target": "salicylic_acid3/nafuda"
|
||||
},
|
||||
@@ -1347,6 +1365,12 @@
|
||||
"runner3680/5x8": {
|
||||
"target": "omkbd/runner3680/5x8"
|
||||
},
|
||||
"saevus/cor": {
|
||||
"target": "concreteflowers/cor"
|
||||
},
|
||||
"saevus/cor_tkl": {
|
||||
"target": "concreteflowers/cor_tkl"
|
||||
},
|
||||
"scarletbandana": {
|
||||
"target": "woodkeys/scarletbandana"
|
||||
},
|
||||
@@ -1525,5 +1549,8 @@
|
||||
},
|
||||
"kprepublic/jj50": {
|
||||
"target": "kprepublic/jj50/rev1"
|
||||
},
|
||||
"dnworks/9973": {
|
||||
"target": "dnworks/tkl87"
|
||||
}
|
||||
}
|
||||
|
@@ -16,12 +16,6 @@
|
||||
"type": "object",
|
||||
"additionalProperties": {"type": "boolean"}
|
||||
},
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "#/keyboard_keymap_tuple"},
|
||||
{"$ref": "#/json_file_path"}
|
||||
]
|
||||
},
|
||||
"filename": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
@@ -40,7 +34,8 @@
|
||||
"pattern": "^[0-9a-z_/\\-]+\\.json$"
|
||||
},
|
||||
"key_unit": {
|
||||
"type": "number"
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"keyboard": {
|
||||
"type": "string",
|
||||
@@ -52,6 +47,19 @@
|
||||
{"$ref": "#/keyboard"},
|
||||
{"$ref": "#/filename"}
|
||||
],
|
||||
"minItems": 2,
|
||||
"maxItems": 2,
|
||||
"unevaluatedItems": false
|
||||
},
|
||||
"keyboard_keymap_env": {
|
||||
"type": "array",
|
||||
"prefixItems": [
|
||||
{"$ref": "#/keyboard"},
|
||||
{"$ref": "#/filename"},
|
||||
{"$ref": "#/kvp_object"}
|
||||
],
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"unevaluatedItems": false
|
||||
},
|
||||
"keycode": {
|
||||
@@ -86,6 +94,10 @@
|
||||
"maxLength": 7,
|
||||
"pattern": "^[A-Z][A-Zs_0-9]*$"
|
||||
},
|
||||
"kvp_object": {
|
||||
"type": "object",
|
||||
"additionalProperties": {"type": "string"}
|
||||
},
|
||||
"layout_macro": {
|
||||
"oneOf": [
|
||||
{
|
||||
|
@@ -1 +0,0 @@
|
||||
false
|
@@ -45,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", "imera"]
|
||||
"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", "svlinky"]
|
||||
},
|
||||
"pin_compatible": {
|
||||
"type": "string",
|
||||
@@ -92,6 +92,7 @@
|
||||
"GD32VF103",
|
||||
"WB32F3G71",
|
||||
"WB32FQ95",
|
||||
"AT32F415",
|
||||
"atmega16u2",
|
||||
"atmega32u2",
|
||||
"atmega16u4",
|
||||
@@ -216,6 +217,7 @@
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"apm32-dfu",
|
||||
"at32-dfu",
|
||||
"atmel-dfu",
|
||||
"bootloadhid",
|
||||
"caterina",
|
||||
@@ -342,7 +344,43 @@
|
||||
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
|
||||
}
|
||||
},
|
||||
"joystick": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {"type": "boolean"},
|
||||
"driver": {"type": "string"},
|
||||
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"axes": {
|
||||
"type": "object",
|
||||
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}
|
||||
"additionalProperties": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"enum": ["virtual"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
|
||||
"layer_lock": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
|
||||
}
|
||||
},
|
||||
"layout_aliases": {
|
||||
"type": "object",
|
||||
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
|
||||
@@ -515,8 +553,8 @@
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
}
|
||||
@@ -601,8 +639,8 @@
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"x": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/key_unit"},
|
||||
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
|
||||
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
|
||||
}
|
||||
}
|
||||
@@ -793,12 +831,26 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
|
||||
"soft_serial_pin": {
|
||||
"$ref": "qmk.definitions.v1#/mcu_pin",
|
||||
"$comment": "Deprecated: use split.serial.pin instead"
|
||||
},
|
||||
"soft_serial_speed": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 5
|
||||
},
|
||||
"serial": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"driver": {
|
||||
"type": "string",
|
||||
"enum": ["bitbang", "usart", "vendor"]
|
||||
},
|
||||
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
|
||||
}
|
||||
},
|
||||
"transport": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
@@ -72,10 +72,5 @@
|
||||
"notes": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"keyboard",
|
||||
"layout",
|
||||
"layers"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
true
|
@@ -3,6 +3,14 @@
|
||||
"$id": "qmk.user_repo.v1",
|
||||
"title": "User Repository Information",
|
||||
"type": "object",
|
||||
"definitions": {
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
]
|
||||
},
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
"build_targets"
|
||||
@@ -15,7 +23,7 @@
|
||||
"build_targets": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "qmk.definitions.v1#/build_target"
|
||||
"$ref": "#/definitions/build_target"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
31
data/schemas/user_repo_v1_1.jsonschema
Normal file
31
data/schemas/user_repo_v1_1.jsonschema
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema#",
|
||||
"$id": "qmk.user_repo.v1_1",
|
||||
"title": "User Repository Information",
|
||||
"type": "object",
|
||||
"definitions": {
|
||||
"build_target": {
|
||||
"oneOf": [
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"},
|
||||
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"},
|
||||
{"$ref": "qmk.definitions.v1#/json_file_path"}
|
||||
]
|
||||
},
|
||||
},
|
||||
"required": [
|
||||
"userspace_version",
|
||||
"build_targets"
|
||||
],
|
||||
"properties": {
|
||||
"userspace_version": {
|
||||
"type": "string",
|
||||
"enum": ["1.1"]
|
||||
},
|
||||
"build_targets": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/build_target"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -2,8 +2,6 @@
|
||||
"keyboard_name": "%KEYBOARD%",
|
||||
"maintainer": "%USER_NAME%",
|
||||
"manufacturer": "%REAL_NAME%",
|
||||
"processor": "%MCU%",
|
||||
"bootloader": "%BOOTLOADER%",
|
||||
"diode_direction": "COL2ROW",
|
||||
"matrix_pins": {
|
||||
"cols": ["C2"],
|
||||
|
@@ -10,11 +10,11 @@ It is also now possible to define combos that have keys overlapping with other c
|
||||
|
||||
### Key Overrides ([#11422](https://github.com/qmk/qmk_firmware/pull/11422)) {#key-overrides}
|
||||
|
||||
QMK now has a new feature: [key overrides](../feature_key_overrides). This feature allows for overriding the output of key combinations involving modifiers. As an example, pressing <kbd>Shift+2</kbd> normally results in an <kbd>@</kbd> on US-ANSI keyboard layouts -- the new key overrides allow for adding similar functionality, but for any <kbd>modifier + key</kbd> press.
|
||||
QMK now has a new feature: [key overrides](../features/key_overrides). This feature allows for overriding the output of key combinations involving modifiers. As an example, pressing <kbd>Shift+2</kbd> normally results in an <kbd>@</kbd> on US-ANSI keyboard layouts -- the new key overrides allow for adding similar functionality, but for any <kbd>modifier + key</kbd> press.
|
||||
|
||||
To illustrate, it's now possible to use the key overrides feature to translate <kbd>Shift + Backspace</kbd> into <kbd>Delete</kbd> -- an often-requested example of where this functionality comes in handy.
|
||||
|
||||
There's far more to describe that what lives in this changelog, so head over to the [key overrides documentation](../feature_key_overrides) for more examples and info.
|
||||
There's far more to describe that what lives in this changelog, so head over to the [key overrides documentation](../features/key_overrides) for more examples and info.
|
||||
|
||||
### Digitizer support ([#12851](https://github.com/qmk/qmk_firmware/pull/12851))
|
||||
|
||||
|
@@ -31,7 +31,7 @@ QMK now has core-supplied support for the following pointing device peripherals:
|
||||
| `POINTING_DEVICE_DRIVER = pimoroni_trackball` | Pimoroni Trackball |
|
||||
| `POINTING_DEVICE_DRIVER = pmw3360` | PMW 3360 |
|
||||
|
||||
See the new documentation for the [Pointing Device](../feature_pointing_device) feature for more information on specific configuration for each driver.
|
||||
See the new documentation for the [Pointing Device](../features/pointing_device) feature for more information on specific configuration for each driver.
|
||||
|
||||
### Dynamic Tapping Term ([#11036](https://github.com/qmk/qmk_firmware/pull/11036)) {#dynamic-tapping-term}
|
||||
|
||||
@@ -116,7 +116,7 @@ Related to the previous section -- RGB Matrix modes have now been made to be opt
|
||||
|
||||
Most keyboards keep their original functionality, but over time the QMK maintainers have found that removal of animations ends up being the quickest way to free up space... and some keyboards have had animations such as reactive effects disabled by default in order to still fit within the flash space available.
|
||||
|
||||
The full list of configurables to turn specific animations back on can be found at on the [RGB Matrix documentation](../feature_rgb_matrix#rgb-matrix-effects) page.
|
||||
The full list of configurables to turn specific animations back on can be found at on the [RGB Matrix documentation](../features/rgb_matrix#rgb-matrix-effects) page.
|
||||
|
||||
### OLED task refactoring ([#14864](https://github.com/qmk/qmk_firmware/pull/14864)) {#oled-task-refactor}
|
||||
|
||||
|
@@ -12,7 +12,7 @@ Something something *Lets go gamers!*
|
||||
|
||||
Pointing devices can now be shared across a split keyboard with support for a single pointing device or a pointing device on each side.
|
||||
|
||||
See the [Pointing Device](../feature_pointing_device) documentation for further configuration options.
|
||||
See the [Pointing Device](../features/pointing_device) documentation for further configuration options.
|
||||
|
||||
## Changes Requiring User Action {#changes-requiring-user-action}
|
||||
|
||||
|
@@ -8,7 +8,7 @@ This is a new feature that allows for capslock-like functionality that turns its
|
||||
|
||||
For instance, if you wish to type "QMK" without holding shift the entire time, you can either tap both left and right shift, or double-tap shift, to turn on _Caps Word_ -- then type `qmk` (lowercase) without holding shift. Once you hit any key other than `a`--`z`, `0`--`9`, `-`, `_`, delete, or backspace, this will go back to normal typing!
|
||||
|
||||
There are other activation mechanisms as well as configurable options like timeout and the like -- see the [Caps Word documentation](../feature_caps_word) for more information.
|
||||
There are other activation mechanisms as well as configurable options like timeout and the like -- see the [Caps Word documentation](../features/caps_word) for more information.
|
||||
|
||||
### Quantum Painter ([#10174](https://github.com/qmk/qmk_firmware/pull/10174)) {#quantum-painter}
|
||||
|
||||
@@ -26,7 +26,7 @@ Quantum Painter is not supported on AVR due to complexity and size constraints.
|
||||
|
||||
### Encoder Mapping ([#13286](https://github.com/qmk/qmk_firmware/pull/13286)) {#encoder-mapping}
|
||||
|
||||
One of the long-standing complaints with Encoders is that there has been no easy way to configure them in user keymaps. [#13286](https://github.com/qmk/qmk_firmware/pull/13286) added support for [Encoder Mapping](../feature_encoders#encoder-map), which allows users to define encoder functionality in a similar way to their normal keymap.
|
||||
One of the long-standing complaints with Encoders is that there has been no easy way to configure them in user keymaps. [#13286](https://github.com/qmk/qmk_firmware/pull/13286) added support for [Encoder Mapping](../features/encoders#encoder-map), which allows users to define encoder functionality in a similar way to their normal keymap.
|
||||
|
||||
::: warning
|
||||
This is not yet supported by QMK Configurator. It is also unlikely to ever be supported by VIA.
|
||||
|
@@ -83,7 +83,7 @@ The now-EOL kbfirmware allowed people who aren't set up with QMK the ability to
|
||||
|
||||
QMK has had the ability to write to internal MCU flash in order to emulate EEPROM for some time now, but it was only limited to a small number of MCUs. The base HAL used by QMK for a large number of ARM devices provides a "proper" embedded MCU flash driver, so _@tzarc_ decoupled the wear-leveling algorithm from the old flash writing code, improved it, wrote some tests, and enabled its use for a much larger number of other devices... including RP2040's XIP flash, and external SPI NOR Flash.
|
||||
|
||||
See the [EEPROM Driver](../eeprom_driver) documentation for more information.
|
||||
See the [EEPROM Driver](../drivers/eeprom) documentation for more information.
|
||||
|
||||
### Pointing Device Improvements ([#16371](https://github.com/qmk/qmk_firmware/pull/16371), [#17111](https://github.com/qmk/qmk_firmware/pull/17111), [#17176](https://github.com/qmk/qmk_firmware/pull/17176), [#17482](https://github.com/qmk/qmk_firmware/pull/17482), [#17776](https://github.com/qmk/qmk_firmware/pull/17776), [#17613](https://github.com/qmk/qmk_firmware/pull/17613)) {#pointing-device-improvements}
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
|
||||
### Autocorrect ([#15699](https://github.com/qmk/qmk_firmware/pull/15699)) {#autocorrect}
|
||||
|
||||
_@getreuer_ in their infinite wisdom decided that autocorrect was a feature needed by QMK. As is customary, _@drashna_ adapted it to core and got it into a state that everyone else can use it. See [Feature: Autocorrect](../feature_autocorrect) for more ifnormation (grin).
|
||||
_@getreuer_ in their infinite wisdom decided that autocorrect was a feature needed by QMK. As is customary, _@drashna_ adapted it to core and got it into a state that everyone else can use it. See [Feature: Autocorrect](../features/autocorrect) for more ifnormation (grin).
|
||||
|
||||
## Changes Requiring User Action {#changes-requiring-user-action}
|
||||
|
||||
@@ -132,7 +132,7 @@ The equivalent transformations should be done for LED Matrix boards.
|
||||
|
||||
### Unicode mode refactoring {#unicode-mode-renaming}
|
||||
|
||||
Unicode modes were renamed in order to prevent collision with equivalent keycodes. The available values for `UNICODE_SELECTED_MODES` changed -- see [Feature: Unicode](../feature_unicode#setting-the-input-mode) for the new list of values and how to configure them.
|
||||
Unicode modes were renamed in order to prevent collision with equivalent keycodes. The available values for `UNICODE_SELECTED_MODES` changed -- see [Feature: Unicode](../features/unicode#setting-the-input-mode) for the new list of values and how to configure them.
|
||||
|
||||
## Notable core changes {#notable-core}
|
||||
|
||||
|
@@ -106,7 +106,7 @@ void leader_end_user(void) {
|
||||
}
|
||||
```
|
||||
|
||||
For more information please see the [Leader Key documentation](../feature_leader_key).
|
||||
For more information please see the [Leader Key documentation](../features/leader_key).
|
||||
|
||||
### Updated Keyboard Codebases {#updated-keyboard-codebases}
|
||||
|
||||
|
@@ -24,7 +24,7 @@ Of note for keyboard designers:
|
||||
|
||||
A new pair of keys has been added to QMK -- namely `QK_REPEAT_KEY` and `QK_ALT_REPEAT_KEY` (shortened: `QK_REP`/`QK_AREP`). These allow you to repeat the last key pressed, or in the case of the alternate key, press the "opposite" of the last key. For example, if you press `KC_LEFT`, pressing `QK_REPEAT_KEY` afterwards repeats `KC_LEFT`, but pressing `QK_ALT_REPEAT_KEY` instead sends `KC_RIGHT`.
|
||||
|
||||
The full list of default alternate keys is available on the [Repeat Key](../feature_repeat_key) documentation.
|
||||
The full list of default alternate keys is available on the [Repeat Key](../features/repeat_key) documentation.
|
||||
|
||||
To enable these keys, in your keymap's `rules.mk`, add:
|
||||
|
||||
@@ -93,7 +93,7 @@ Additionally, this ensures that builds on QMK Configurator produce some sort of
|
||||
|
||||
The "classic" OLED driver picked up support for additional sizes of OLED displays, support for the SH1107 controller, and SPI-based OLED support.
|
||||
|
||||
Other configurable items are available and can be found on the [OLED Driver page](../feature_oled_driver).
|
||||
Other configurable items are available and can be found on the [OLED Driver page](../features/oled_driver).
|
||||
|
||||
## Full changelist {#full-changelist}
|
||||
|
||||
|
@@ -42,7 +42,7 @@ AVR sees minimal (if any) benefit -- `double` was interpreted as `float` on AVR
|
||||
|
||||
### Remove encoder in-matrix workaround code ([#20389](https://github.com/qmk/qmk_firmware/pull/20389)) {#remove-encoder-in-matrix-workaround-code}
|
||||
|
||||
Some keyboards "hacked" encoder support into spare slots in the key matrix in order to interoperate with VIA. This workaround is no longer necessary, and the code has been removed. If you have a keyboard that uses this workaround, you will need to update your keymap to use the new [Encoder Map](../feature_encoders#encoder-map) API instead.
|
||||
Some keyboards "hacked" encoder support into spare slots in the key matrix in order to interoperate with VIA. This workaround is no longer necessary, and the code has been removed. If you have a keyboard that uses this workaround, you will need to update your keymap to use the new [Encoder Map](../features/encoders#encoder-map) API instead.
|
||||
|
||||
### Unicodemap keycodes rename ([#21092](https://github.com/qmk/qmk_firmware/pull/21092)) {#unicodemap-keycodes-rename}
|
||||
|
||||
|
@@ -120,7 +120,7 @@ In some cases, accidental automatic activation of the mouse layer made it diffic
|
||||
|
||||
### DIP Switch Mapping ([#22543](https://github.com/qmk/qmk_firmware/pull/22543)) {#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#dip-switch-map) for more information.
|
||||
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](../features/dip_switch#dip-switch-map) for more information.
|
||||
|
||||
```c
|
||||
#if defined(DIP_SWITCH_MAP_ENABLE)
|
||||
|
@@ -109,6 +109,16 @@ Essentially, changes were made in the internals of how QMK interacts with USB fo
|
||||
|
||||
Compliance checks were run against QMK firmwares for the most popular ARM microcontrollers, as well as suspend/resume tests. As far as we can tell, a whole host of hard-to-reproduce issues are mitigated by this change.
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### Migration of VIA keymaps to VIA team control
|
||||
|
||||
The QMK team has been in discussion with the VIA maintainers and all VIA-related keymaps in the `qmk_firmware` repository will transition to a `qmk_userspace`-style repository under the VIA team's control at the end of the next breaking changes period. This allows the VIA team to support many more custom keyboard configurations, as well as reduces the turnaround time for any changes to the VIA protocol they wish to make.
|
||||
|
||||
At the end of the breaking changes cycle ending 2024-08-25, VIA-enabled keymaps will no longer be accepted into the QMK repository. At the time of migration, any open PRs against `qmk_firmware` which include new VIA-related keymaps will be subsequently be asked to remove those keymaps and instead raise a PR against the userspace repository containing all VIA keymaps.
|
||||
|
||||
## Full changelist {#full-changelist}
|
||||
|
||||
Core:
|
||||
|
198
docs/ChangeLog/20240825.md
Normal file
198
docs/ChangeLog/20240825.md
Normal file
@@ -0,0 +1,198 @@
|
||||
# QMK Breaking Changes - 2024 August 25 Changelog
|
||||
|
||||
## Notable Features
|
||||
|
||||
August 2024 brings another maintenance release of QMK. Almost all PRs this cycle were to do with cleanup or re-organization of existing features and code.
|
||||
|
||||
One key item is that there are no longer any `via`-enabled keymaps in the QMK repository -- these have all transitioned to an [External Userspace](../newbs_external_userspace) repository under the VIA team's control. Going forward, all PRs to `qmk_firmware` must not contain `via` keymaps; these should instead be redirected to the [VIA QMK Userspace](https://github.com/the-via/qmk_userspace_via) repository.
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
One note with updated keyboard names -- historical keyboard names are still considered valid when using [External Userspace](../newbs_external_userspace) 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 |
|
||||
|----------------------------------|-------------------------------|
|
||||
| dnworks/9973 | dnworks/tkl87 |
|
||||
| maple_computing/lets_split_eh/eh | maple_computing/lets_split_eh |
|
||||
| planck/ez/base | zsa/planck_ez/base |
|
||||
|
||||
### SparkFun Pro Micro RP2040 converter renamed ([#24192](https://github.com/qmk/qmk_firmware/pull/24192))
|
||||
|
||||
The converter for the SparkFun Pro Micro RP2040 has been renamed.
|
||||
|
||||
| Old | New |
|
||||
|-------------------|-------------------|
|
||||
| `promicro_rp2040` | `sparkfun_rp2040` |
|
||||
|
||||
This change was made to avoid confusion between the clones named ProMicro RP2040 and the SparkFun Pro Micro RP2040. The clones should be using the `rp2040_ce` option.
|
||||
|
||||
### Key Override `keymap.c` signature change ([#24120](https://github.com/qmk/qmk_firmware/pull/24120))
|
||||
|
||||
Changes were made to key overrides in order to hook them into the keymap introspection system.
|
||||
|
||||
If you're using key overrides, your `keymap.c` will need a change to the signature of your list of key overrides, as well as removing the `NULL` terminator.
|
||||
|
||||
For example, you'll need to change existing code from (note the highlighted lines):
|
||||
|
||||
```c{1,4-5}
|
||||
const key_override_t **key_overrides = (const key_override_t *[]){
|
||||
&my_override_1,
|
||||
&my_override_2,
|
||||
NULL
|
||||
};
|
||||
```
|
||||
|
||||
to:
|
||||
|
||||
```c{1,4}
|
||||
const key_override_t *key_overrides[] = {
|
||||
&my_override_1,
|
||||
&my_override_2,
|
||||
};
|
||||
```
|
||||
|
||||
### ADNS9800 and PMW33xx firmware upload now opt-in ([#24001](https://github.com/qmk/qmk_firmware/pull/24001))
|
||||
|
||||
Due to ambiguity with licensing compatibility, QMK has made the firmware ROM uploads for the ADNS9800 and PMW33xx lines of pointing device sensors temporarily opt-in with the view to removing them. Historically they were included by default, but as of this PR this is now no longer the case.
|
||||
|
||||
Please get in touch with the QMK team if your sensor no longer functions without the firmware upload -- so far we've tested each device type and they still seem to function without a new firmware, but this has not been a 100% exhaustive validation.
|
||||
|
||||
To re-enable firmware upload for your own builds, add the following to your keymap's `config.h`:
|
||||
|
||||
| Sensor | Define |
|
||||
|----------|--------------------------------|
|
||||
| ADNS9800 | `#define ADNS9800_UPLOAD_SROM` |
|
||||
| PMW33xx | `#define PMW33XX_UPLOAD_SROM` |
|
||||
|
||||
:::info Note
|
||||
If no issues arise during this current breaking changes cycle, these sensor firmware ROMs will be removed from QMK entirely.
|
||||
:::
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### Migration of VIA keymaps to VIA team control
|
||||
|
||||
Last breaking changes cycle, the QMK team informed that [`via` keymaps are moving](./20240526#migration-of-via-keymaps-to-via-team-control) to the control of the VIA team. As of this merge, any `via`-enabled keymaps should now be PR'ed to the [VIA QMK Userspace](https://github.com/the-via/qmk_userspace_via) repository.
|
||||
|
||||
Any existing or newly-opened PRs against `qmk_firmware` will now be asked to remove any `via`-enabled keymaps from their submissions.
|
||||
|
||||
### ADNS9800 and PMW33xx sensor firmware ROM removal
|
||||
|
||||
As mentioned above, there's license compatibility issues between QMK and the firmware blobs historically uploaded for the ADNS9800 and PMW33xx sensors. This notice is to inform users that these firmware blobs will almost certainly be removed from QMK in the next breaking changes merge.
|
||||
|
||||
As previously noted this does not seem to have any detrimental effect to any of those devices, as they seem to include firmware on-chip without requiring one to be uploaded. Please get in touch with the QMK team on Discord if your sensor is no longer functional.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* EEPROM: Don't erase if we don't have to. Adding eeprom_driver_format abstraction. ([#18332](https://github.com/qmk/qmk_firmware/pull/18332))
|
||||
* Generate keymap dd keycodes to header ([#20273](https://github.com/qmk/qmk_firmware/pull/20273))
|
||||
* [wear_leveling] efl updates ([#22489](https://github.com/qmk/qmk_firmware/pull/22489))
|
||||
* GC9xxx LCD family drivers (GC9107 and GC9A01) ([#23091](https://github.com/qmk/qmk_firmware/pull/23091))
|
||||
* [build_test] set CONSOLE_ENABLE=yes if DEBUG > 0 ([#23097](https://github.com/qmk/qmk_firmware/pull/23097))
|
||||
* Enhance overlapping mouse keys control ([#23341](https://github.com/qmk/qmk_firmware/pull/23341))
|
||||
* APA102: API rework ([#23355](https://github.com/qmk/qmk_firmware/pull/23355))
|
||||
* [WIP] Adds bus acquire/release semantics to SPI start/stop. ([#23439](https://github.com/qmk/qmk_firmware/pull/23439))
|
||||
* add farsi keymap extras ([#23650](https://github.com/qmk/qmk_firmware/pull/23650))
|
||||
* Update atomic GPIO macros in keyboard custom matrix ([#23796](https://github.com/qmk/qmk_firmware/pull/23796))
|
||||
* Check LED flags for Pixel Fractal effect ([#23881](https://github.com/qmk/qmk_firmware/pull/23881))
|
||||
* Add STM32F405RG ld script for tinyuf2 ([#23885](https://github.com/qmk/qmk_firmware/pull/23885))
|
||||
* SPI flash API cleanup, add async erase capability. ([#23894](https://github.com/qmk/qmk_firmware/pull/23894))
|
||||
* Add process_keycode handlers for new RGB Matrix and Underglow keycodes ([#23896](https://github.com/qmk/qmk_firmware/pull/23896))
|
||||
* Decouple VIA from STM32 L0/L1 EEPROM implementation ([#23901](https://github.com/qmk/qmk_firmware/pull/23901))
|
||||
* Normalise mouse keycodes ([#23975](https://github.com/qmk/qmk_firmware/pull/23975))
|
||||
* Remove deprecated `led_set_user` ([#23979](https://github.com/qmk/qmk_firmware/pull/23979))
|
||||
* Change ADNS9800 and PMW33XX SROM uploads to opt in. ([#24001](https://github.com/qmk/qmk_firmware/pull/24001))
|
||||
* Rename encoder pins defines ([#24003](https://github.com/qmk/qmk_firmware/pull/24003))
|
||||
* Change suspend condition check order on ChibiOS ([#24020](https://github.com/qmk/qmk_firmware/pull/24020))
|
||||
* Tap dance introspection ([#24049](https://github.com/qmk/qmk_firmware/pull/24049))
|
||||
* Allow overriding `get_hardware_id()`. ([#24051](https://github.com/qmk/qmk_firmware/pull/24051))
|
||||
* Align LUFA suspend logic ([#24055](https://github.com/qmk/qmk_firmware/pull/24055))
|
||||
* Add support for key override introspection. ([#24120](https://github.com/qmk/qmk_firmware/pull/24120))
|
||||
* Dynamic macro callbacks ([#24142](https://github.com/qmk/qmk_firmware/pull/24142))
|
||||
* Rename promicro_rp2040 converter to sparkfun_pm2040 ([#24192](https://github.com/qmk/qmk_firmware/pull/24192))
|
||||
* Refactor starlight RGB matrix effects ([#24202](https://github.com/qmk/qmk_firmware/pull/24202))
|
||||
* Refactor riverflow RGB matrix loop ([#24203](https://github.com/qmk/qmk_firmware/pull/24203))
|
||||
|
||||
CLI:
|
||||
* Remove handling of keyboard level keymap templates ([#24234](https://github.com/qmk/qmk_firmware/pull/24234))
|
||||
* Small tweaks to keymap generation ([#24240](https://github.com/qmk/qmk_firmware/pull/24240))
|
||||
|
||||
Keyboards:
|
||||
* refactor: keyboard/ncr80/r2 ([#22670](https://github.com/qmk/qmk_firmware/pull/22670))
|
||||
* Implement data driven joysticks ([#22947](https://github.com/qmk/qmk_firmware/pull/22947))
|
||||
* Whitefacemountain Ampersand ([#23437](https://github.com/qmk/qmk_firmware/pull/23437))
|
||||
* Add TRKeyboard TRK1 keyboard ([#23642](https://github.com/qmk/qmk_firmware/pull/23642))
|
||||
* Rename dnworks/9973 to dnworks/tkl87 ([#23692](https://github.com/qmk/qmk_firmware/pull/23692))
|
||||
* Update Underglow keycodes ([#23765](https://github.com/qmk/qmk_firmware/pull/23765))
|
||||
* Add boardsource/the_q ([#23782](https://github.com/qmk/qmk_firmware/pull/23782))
|
||||
* BastardKB: remove legacy board `tbk` ([#23818](https://github.com/qmk/qmk_firmware/pull/23818))
|
||||
* Update ZSA Moonlander ([#23911](https://github.com/qmk/qmk_firmware/pull/23911))
|
||||
* Move Planck EZ to ZSA vendor folder ([#23917](https://github.com/qmk/qmk_firmware/pull/23917))
|
||||
* Migrate SPLIT_HAND_PIN to json ([#23924](https://github.com/qmk/qmk_firmware/pull/23924))
|
||||
* Migrate SERIAL_DRIVER to json ([#23925](https://github.com/qmk/qmk_firmware/pull/23925))
|
||||
* Migrate RGB Matrix layout for two boards ([#23963](https://github.com/qmk/qmk_firmware/pull/23963))
|
||||
* Migrate `led_update_kb` implementations to DD ([#23980](https://github.com/qmk/qmk_firmware/pull/23980))
|
||||
* Migrate `led_update_kb` implementations to DD ([#23981](https://github.com/qmk/qmk_firmware/pull/23981))
|
||||
* Migrate `led_update_kb` implementations to DD ([#23983](https://github.com/qmk/qmk_firmware/pull/23983))
|
||||
* Migrate `led_update_kb` implementations to DD ([#23985](https://github.com/qmk/qmk_firmware/pull/23985))
|
||||
* Relocate m256wh VIA logic ([#24006](https://github.com/qmk/qmk_firmware/pull/24006))
|
||||
* Relocate winry315 VIA logic ([#24008](https://github.com/qmk/qmk_firmware/pull/24008))
|
||||
* Relocate m256ws VIA logic ([#24009](https://github.com/qmk/qmk_firmware/pull/24009))
|
||||
* `atreus`: misc cleanups ([#24010](https://github.com/qmk/qmk_firmware/pull/24010))
|
||||
* Relocate work_louder VIA logic ([#24011](https://github.com/qmk/qmk_firmware/pull/24011))
|
||||
* Relocate xelus/pachi/rgb/rev2 VIA logic ([#24016](https://github.com/qmk/qmk_firmware/pull/24016))
|
||||
* Remove custom keycodes from nullbitsco/snap ([#24017](https://github.com/qmk/qmk_firmware/pull/24017))
|
||||
* added bear_face/v3 ([#24032](https://github.com/qmk/qmk_firmware/pull/24032))
|
||||
* Remove DEFAULT_FOLDER from maple_computing/lets_split_eh ([#24054](https://github.com/qmk/qmk_firmware/pull/24054))
|
||||
* refactor bear_face/v1, v2 ([#24060](https://github.com/qmk/qmk_firmware/pull/24060))
|
||||
* Convert `eeconfig_init_kb` implementations to config ([#24087](https://github.com/qmk/qmk_firmware/pull/24087))
|
||||
* Remove broken keymap from keebio/iris ([#24094](https://github.com/qmk/qmk_firmware/pull/24094))
|
||||
* Move LED Matrix LED config to data driven ([#24122](https://github.com/qmk/qmk_firmware/pull/24122))
|
||||
* Move split.soft_serial_pin to split.serial.pin ([#24127](https://github.com/qmk/qmk_firmware/pull/24127))
|
||||
* Remove pointless `RGB_MATRIX_LED_COUNT`s ([#24133](https://github.com/qmk/qmk_firmware/pull/24133))
|
||||
* `hs60/v1`: separate into ANSI and ISO revisions ([#24136](https://github.com/qmk/qmk_firmware/pull/24136))
|
||||
* Migrate half-duplex `SERIAL_USART_TX_PIN` to DD ([#24143](https://github.com/qmk/qmk_firmware/pull/24143))
|
||||
* Migrate split.soft_serial_pin to split.serial.pin O-Z ([#24146](https://github.com/qmk/qmk_firmware/pull/24146))
|
||||
* Migrate split.soft_serial_pin to split.serial.pin 0-H ([#24155](https://github.com/qmk/qmk_firmware/pull/24155))
|
||||
* Remove instances of MASTER_LEFT. ([#24163](https://github.com/qmk/qmk_firmware/pull/24163))
|
||||
* Rename EC Type-K ([#24180](https://github.com/qmk/qmk_firmware/pull/24180))
|
||||
* Migrate split.soft_serial_pin to split.serial.pin H-O ([#24185](https://github.com/qmk/qmk_firmware/pull/24185))
|
||||
* Remove split.transport.protocol=serial ([#24191](https://github.com/qmk/qmk_firmware/pull/24191))
|
||||
* Refactor use of `matrix_scan_kb` ([#24200](https://github.com/qmk/qmk_firmware/pull/24200))
|
||||
* Eliminate use of `#include "../default/keymap.c"`. ([#24215](https://github.com/qmk/qmk_firmware/pull/24215))
|
||||
* Remove keyboard level `QK_BOOT` implementations ([#24231](https://github.com/qmk/qmk_firmware/pull/24231))
|
||||
* Remove `handwired/pytest/has_template` ([#24232](https://github.com/qmk/qmk_firmware/pull/24232))
|
||||
* Refactor opendeck/32 ([#24233](https://github.com/qmk/qmk_firmware/pull/24233))
|
||||
* Refactor printedpad ([#24236](https://github.com/qmk/qmk_firmware/pull/24236))
|
||||
* Refactor orthocode ([#24237](https://github.com/qmk/qmk_firmware/pull/24237))
|
||||
* Remove unnecessary RGB Matrix shutdown hooks ([#24238](https://github.com/qmk/qmk_firmware/pull/24238))
|
||||
* Remove all via-enabled keymaps, including `via`. ([#24322](https://github.com/qmk/qmk_firmware/pull/24322))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix dogtag/info.json ([#23520](https://github.com/qmk/qmk_firmware/pull/23520))
|
||||
* splitkb/kyria: remove `CONVERT_TO` at keyboard level ([#23857](https://github.com/qmk/qmk_firmware/pull/23857))
|
||||
* Fixup mt/mt84 ([#23883](https://github.com/qmk/qmk_firmware/pull/23883))
|
||||
* Fix for encoders and support ENCODER_MAP_ENABLE on Planck rev7 ([#23967](https://github.com/qmk/qmk_firmware/pull/23967))
|
||||
* `handwired/swiftrax/bumblebee`: fix layout name ([#24064](https://github.com/qmk/qmk_firmware/pull/24064))
|
||||
* Fixup boardsource/the_q RGB matrix coordinates ([#24086](https://github.com/qmk/qmk_firmware/pull/24086))
|
||||
* Various fixes for keyboards not implementing callbacks correctly ([#24092](https://github.com/qmk/qmk_firmware/pull/24092))
|
||||
* Various fixes for keyboards not implementing callbacks correctly ([#24116](https://github.com/qmk/qmk_firmware/pull/24116))
|
||||
* Remove duplicate calls to `housekeeping_task_user` ([#24201](https://github.com/qmk/qmk_firmware/pull/24201))
|
||||
* Fixup `handwired/dactyl_minidox` ([#24253](https://github.com/qmk/qmk_firmware/pull/24253))
|
||||
* Fix build failure on zsa/moonlander with DYNAMIC_MACRO_ENABLE ([#24316](https://github.com/qmk/qmk_firmware/pull/24316))
|
||||
|
||||
Others:
|
||||
* LED drivers: extract documentation from LED/RGB Matrix pages ([#23630](https://github.com/qmk/qmk_firmware/pull/23630))
|
||||
* Implement data driven serial driver ([#23923](https://github.com/qmk/qmk_firmware/pull/23923))
|
||||
* Remove skipped schema files ([#23987](https://github.com/qmk/qmk_firmware/pull/23987))
|
||||
* Update RGBLight (Underglow) keycode names ([#23999](https://github.com/qmk/qmk_firmware/pull/23999))
|
||||
|
||||
Bugs:
|
||||
* Fix NKRO and Mouse Emulation on arm_atsam ([#23945](https://github.com/qmk/qmk_firmware/pull/23945))
|
||||
* Force `dump_lines()` to always use Unix line endings ([#23954](https://github.com/qmk/qmk_firmware/pull/23954))
|
||||
* Fixup home link. ([#24068](https://github.com/qmk/qmk_firmware/pull/24068))
|
122
docs/ChangeLog/20241124.md
Normal file
122
docs/ChangeLog/20241124.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# QMK Breaking Changes - 2024 November 24 Changelog
|
||||
|
||||
## Notable Features
|
||||
|
||||
November 2024 brings a relatively lightweight QMK release. As with previous cycles, almost all PRs were related to cleanup or re-organization of aspects of QMK.
|
||||
|
||||
One notable item is the removal of `arm_atsam` -- this affects users with `massdrop/ctrl` or `massdrop/alt` keyboards. These have no current replacement, but support for an alternative to the `arm_atsam` backend is nearing completion. Unfortunately the alternative backend didn't make this quarter's list of merges, so there's a temporary removal of these boards. Users who need to build for these targets should stay on the `0.26.x` version of QMK until these boards have been restored.
|
||||
|
||||
## Changes Requiring User Action
|
||||
|
||||
### Updated Keyboard Codebases
|
||||
|
||||
One note with updated keyboard names -- historical keyboard names are still considered valid when using [External Userspace](../newbs_external_userspace) 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 |
|
||||
|-------------------|-------------------------|
|
||||
| saevus/cor | concreteflowers/cor |
|
||||
| saevus/cor_tkl | concreteflowers/cor_tkl |
|
||||
|
||||
## Deprecation Notices
|
||||
|
||||
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
|
||||
|
||||
### RGB Keycode Overhaul ([#23679](https://github.com/qmk/qmk_firmware/pull/23679), [#24484](https://github.com/qmk/qmk_firmware/pull/24484), [#24490](https://github.com/qmk/qmk_firmware/pull/24490))
|
||||
|
||||
RGB keycodes have been reworked to allow for both rgblight and rgb_matrix to coexist for the handful of boards in the repo with both enabled. Previously, `RGB_xxx` style keycodes were available, but now for rgblight we have `UG_xxx` (underglow), and `RM_xxx` for rgb_matrix. Default keymaps have been updated to reflect whichever system the respective board enables.
|
||||
|
||||
Longer-term, `RGB_xxx` style keycodes will be removed, but for now they act as if they're `UG_xxx`, and `UG_xxx` keycodes act upon both rgblight and rgb_matrix simultaneously. Put simply, the existing `RGB_xxx` keycodes act as they always have, giving users time to transition across to the new keycodes instead.
|
||||
|
||||
### ADNS9800 and PMW33xx sensor firmware ROM removal ([#24428](https://github.com/qmk/qmk_firmware/pull/24428))
|
||||
|
||||
Following on from the last Breaking Changes cycle, Binary blobs for optical sensors have been removed from the QMK codebase. Hooks allowing users to supply their own have been put in place; users wishing to source firmware blobs and integrate them into their keymap may do so. Doing so renders their firmware un-distributable due to licensing incompatibility with the GPL -- as such user firmware containing such blobs must not be distributed.
|
||||
|
||||
Please get in touch with the QMK team on Discord if your sensor is no longer functional.
|
||||
|
||||
## Full changelist
|
||||
|
||||
Core:
|
||||
* Refactor F4 ld files to use common files ([#18059](https://github.com/qmk/qmk_firmware/pull/18059))
|
||||
* Add LD7032 support to QP. ([#20828](https://github.com/qmk/qmk_firmware/pull/20828))
|
||||
* Add combo key repress feature ([#22858](https://github.com/qmk/qmk_firmware/pull/22858))
|
||||
* Add Layer Lock feature ([#23430](https://github.com/qmk/qmk_firmware/pull/23430))
|
||||
* Added MCU support for ArteryTek AT32F415 ([#23445](https://github.com/qmk/qmk_firmware/pull/23445))
|
||||
* Allow codegen of `keymap.json` => `keymap.c` without requiring layers/layout etc. ([#23451](https://github.com/qmk/qmk_firmware/pull/23451))
|
||||
* Separate RGBLight/RGB Matrix keycode handling ([#23679](https://github.com/qmk/qmk_firmware/pull/23679))
|
||||
* Allow for inverted SPI CS logic ([#23699](https://github.com/qmk/qmk_firmware/pull/23699))
|
||||
* Add timer_save and _restore functions. ([#23887](https://github.com/qmk/qmk_firmware/pull/23887))
|
||||
* Allow for `get_hardware_id()` to be used for serial number. ([#24053](https://github.com/qmk/qmk_firmware/pull/24053))
|
||||
* Segregrate keycode at pre-process record quantum ([#24194](https://github.com/qmk/qmk_firmware/pull/24194))
|
||||
* Add ability to poweroff ADNS5050 sensor ([#24223](https://github.com/qmk/qmk_firmware/pull/24223))
|
||||
* quantum: util: add bit and bitmask helpers ([#24229](https://github.com/qmk/qmk_firmware/pull/24229))
|
||||
* Add new connection keycodes for Bluetooth, 2.4GHz. ([#24251](https://github.com/qmk/qmk_firmware/pull/24251))
|
||||
* `usb_device_state`: consolidate usb state handling across implementations ([#24258](https://github.com/qmk/qmk_firmware/pull/24258))
|
||||
* Remove global k_rgb_matrix_split ([#24348](https://github.com/qmk/qmk_firmware/pull/24348))
|
||||
* util: uf2families: sync with upstream ([#24351](https://github.com/qmk/qmk_firmware/pull/24351))
|
||||
* [Maintenance] builddefs: common_rules: overhaul debug information generation ([#24352](https://github.com/qmk/qmk_firmware/pull/24352))
|
||||
* Add easier way to set default single layer ([#24376](https://github.com/qmk/qmk_firmware/pull/24376))
|
||||
* Tweak OS detect, add OS_DETECTION_SINGLE_REPORT ([#24379](https://github.com/qmk/qmk_firmware/pull/24379))
|
||||
* Reinstate global `k_rgb_matrix_split` ([#24388](https://github.com/qmk/qmk_firmware/pull/24388))
|
||||
* Bring supported STM32F4 configs in line with F4x1 ([#24413](https://github.com/qmk/qmk_firmware/pull/24413))
|
||||
* Extended wheel reports ([#24422](https://github.com/qmk/qmk_firmware/pull/24422))
|
||||
* Remove binary blobs from optical sensors. ([#24428](https://github.com/qmk/qmk_firmware/pull/24428))
|
||||
* Remove `STM32_PWM_USE_ADVANCED` references ([#24432](https://github.com/qmk/qmk_firmware/pull/24432))
|
||||
* Remove `RING_BUFFERED_6KRO_REPORT_ENABLE` due to disuse. ([#24433](https://github.com/qmk/qmk_firmware/pull/24433))
|
||||
* Move pointing device driver code ([#24445](https://github.com/qmk/qmk_firmware/pull/24445))
|
||||
* Add svlinky converter ([#24449](https://github.com/qmk/qmk_firmware/pull/24449))
|
||||
* Update combo user function variable ([#24467](https://github.com/qmk/qmk_firmware/pull/24467))
|
||||
* `qmk find`: expand operator support ([#24468](https://github.com/qmk/qmk_firmware/pull/24468))
|
||||
* Rename RGB and HSV structs ([#24471](https://github.com/qmk/qmk_firmware/pull/24471))
|
||||
* RGBLight: Improve RGB Test animation ([#24477](https://github.com/qmk/qmk_firmware/pull/24477))
|
||||
* Change default ARM hardware PWM WS2812 tick frequency to 800kHz ([#24508](https://github.com/qmk/qmk_firmware/pull/24508))
|
||||
* Add pointing tests ([#24513](https://github.com/qmk/qmk_firmware/pull/24513))
|
||||
* Joystick: add support for 8-way hat switch ([#24515](https://github.com/qmk/qmk_firmware/pull/24515))
|
||||
* Refactor Riverflow matrix effect with runner ([#24520](https://github.com/qmk/qmk_firmware/pull/24520))
|
||||
* Update Pixel Rain to respect LED range limits ([#24532](https://github.com/qmk/qmk_firmware/pull/24532))
|
||||
* Update Jellybean Raindrops to respect LED range limits ([#24534](https://github.com/qmk/qmk_firmware/pull/24534))
|
||||
* Refactor Breathing effect with runner ([#24535](https://github.com/qmk/qmk_firmware/pull/24535))
|
||||
* Refactor LED Breathing effect with runner ([#24540](https://github.com/qmk/qmk_firmware/pull/24540))
|
||||
* Expose rgb_matrix_update_pwm_buffers to be available in keymaps ([#24573](https://github.com/qmk/qmk_firmware/pull/24573))
|
||||
* Simple Python script to show polling rate ([#24622](https://github.com/qmk/qmk_firmware/pull/24622))
|
||||
* Add keycode PDF(layer) to set the default layer in EEPROM ([#24630](https://github.com/qmk/qmk_firmware/pull/24630))
|
||||
* Provide method to save a single default layer in the full range of 0-31 ([#24639](https://github.com/qmk/qmk_firmware/pull/24639))
|
||||
|
||||
CLI:
|
||||
* Refactor painter arguments to table instead of commandline ([#24456](https://github.com/qmk/qmk_firmware/pull/24456))
|
||||
* `qmk new-keyboard`: separate dev board and MCU selection ([#24548](https://github.com/qmk/qmk_firmware/pull/24548))
|
||||
* Bump minimum required Python version ([#24554](https://github.com/qmk/qmk_firmware/pull/24554))
|
||||
|
||||
Submodule updates:
|
||||
* Remove `arm_atsam` platform ([#24337](https://github.com/qmk/qmk_firmware/pull/24337))
|
||||
|
||||
Keyboards:
|
||||
* add ergodox Community Layout for LAYOUT_ergodox keyboards ([#22963](https://github.com/qmk/qmk_firmware/pull/22963))
|
||||
* Cutie Club Fidelity Layout Additions ([#23838](https://github.com/qmk/qmk_firmware/pull/23838))
|
||||
* Add Ploopyco functions for host state control ([#23953](https://github.com/qmk/qmk_firmware/pull/23953))
|
||||
* Corne rev4 ([#24084](https://github.com/qmk/qmk_firmware/pull/24084))
|
||||
* Rename saevus to concreteflowers ([#24249](https://github.com/qmk/qmk_firmware/pull/24249))
|
||||
* Remove `60_tsangan_hhkb` community layout ([#24355](https://github.com/qmk/qmk_firmware/pull/24355))
|
||||
* add USART configuration to config.h for PS/2 mouse support ([#24398](https://github.com/qmk/qmk_firmware/pull/24398))
|
||||
* Add SteelSeries Prime+ mouse ([#24408](https://github.com/qmk/qmk_firmware/pull/24408))
|
||||
* Rename RGB/HSV structs: keyboard-level code ([#24476](https://github.com/qmk/qmk_firmware/pull/24476))
|
||||
* xiudi/xd002: Remove broken oversized `multilayer_rgb` keymap ([#24480](https://github.com/qmk/qmk_firmware/pull/24480))
|
||||
* Update keycodes for keyboards with RGB Matrix ([#24484](https://github.com/qmk/qmk_firmware/pull/24484))
|
||||
* Cipulot Updates ([#24539](https://github.com/qmk/qmk_firmware/pull/24539))
|
||||
* Update keymaps to use PDF keycode ([#24633](https://github.com/qmk/qmk_firmware/pull/24633))
|
||||
* Remove keyboard use of eeconfig_read_default_layer ([#24635](https://github.com/qmk/qmk_firmware/pull/24635))
|
||||
|
||||
Keyboard fixes:
|
||||
* Fix rendering of `keymap_config.no_gui` within `led_update_kb` ([#24473](https://github.com/qmk/qmk_firmware/pull/24473))
|
||||
* Fix duplication of core `GU_TOGG` keycode ([#24474](https://github.com/qmk/qmk_firmware/pull/24474))
|
||||
* keebio/nyquist: Remove invalid I2C config ([#24479](https://github.com/qmk/qmk_firmware/pull/24479))
|
||||
* horrortroll/nyx/rev1: Fix compilation of custom RGB effect ([#24481](https://github.com/qmk/qmk_firmware/pull/24481))
|
||||
|
||||
Others:
|
||||
* Improve consistency of syntax within `data/constants/keycodes` ([#24528](https://github.com/qmk/qmk_firmware/pull/24528))
|
||||
|
||||
Bugs:
|
||||
* WS2812 API rework ([#24364](https://github.com/qmk/qmk_firmware/pull/24364))
|
||||
* Backward compatibility for new RGB keycode handling ([#24490](https://github.com/qmk/qmk_firmware/pull/24490))
|
||||
* Fix compiliation issues with OS Detection ([#24502](https://github.com/qmk/qmk_firmware/pull/24502))
|
||||
* Revert removal of `QK_OUTPUT_AUTO`, fixup docs to reflect. ([#24593](https://github.com/qmk/qmk_firmware/pull/24593))
|
||||
* Review fixes for layer lock feature ([#24627](https://github.com/qmk/qmk_firmware/pull/24627))
|
@@ -41,7 +41,7 @@ Unrelated to styling, high-level tech.
|
||||

|
||||

|
||||
|
||||
<img src="./gitbook/images/color-wheel.svg" alt="HSV Color Wheel" width="250"/>
|
||||
<img src="./public/color-wheel.svg" alt="HSV Color Wheel" width="250"/>
|
||||
|
||||
### Lists
|
||||
|
||||
@@ -84,7 +84,7 @@ Nested mixed:
|
||||
* `lib/python/qmk/cli/generate/config_h.py`
|
||||
* `lib/python/qmk/cli/generate/rules_mk.py`
|
||||
|
||||
### Emoji :id=emoji
|
||||
### Emoji {#emoji}
|
||||
|
||||
#### Direct:
|
||||
|
||||
|
77
docs/_aliases.json
Normal file
77
docs/_aliases.json
Normal file
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"/adding_a_keyboard_to_qmk": "/hardware_keyboard_guidelines",
|
||||
"/build_environment_setup": "/newbs_getting_started",
|
||||
"/cli_dev_configuration": "/cli_configuration",
|
||||
"/dynamic_macros": "/feature_dynamic_macros",
|
||||
"/feature_common_shortcuts": "/feature_advanced_keycodes",
|
||||
"/flashing_bootloadhid": "/flashing",
|
||||
"/getting_started_build_tools": "/newbs_getting_started",
|
||||
"/getting_started_getting_help": "/support",
|
||||
"/glossary": "/reference_glossary",
|
||||
"/key_lock": "/feature_key_lock",
|
||||
"/make_instructions": "/getting_started_make_guide",
|
||||
"/python_development": "/cli_development",
|
||||
"/space_cadet_shift": "/feature_space_cadet_shift",
|
||||
"/tap_dance": "/feature_tap_dance",
|
||||
"/tutorial": "/newbs",
|
||||
"/unicode": "/feature_unicode",
|
||||
|
||||
"/features/bluetooth": "/features/wireless",
|
||||
|
||||
"/adc_driver": "/drivers/adc",
|
||||
"/apa102_driver": "/drivers/apa102",
|
||||
"/audio_driver": "/drivers/audio",
|
||||
"/eeprom_driver": "/drivers/eeprom",
|
||||
"/feature_audio": "/features/audio",
|
||||
"/feature_auto_shift": "/features/auto_shift",
|
||||
"/feature_autocorrect": "/features/autocorrect",
|
||||
"/feature_backlight": "/features/backlight",
|
||||
"/feature_bluetooth": "/features/wireless",
|
||||
"/feature_bootmagic": "/features/bootmagic",
|
||||
"/feature_caps_word": "/features/caps_word",
|
||||
"/feature_combo": "/features/combo",
|
||||
"/feature_command": "/features/command",
|
||||
"/feature_digitizer": "/features/digitizer",
|
||||
"/feature_dip_switch": "/features/dip_switch",
|
||||
"/feature_dynamic_macros": "/features/dynamic_macros",
|
||||
"/feature_encoders": "/features/encoders",
|
||||
"/feature_grave_esc": "/features/grave_esc",
|
||||
"/feature_haptic_feedback": "/features/haptic_feedback",
|
||||
"/feature_hd44780": "/features/hd44780",
|
||||
"/feature_joystick": "/features/joystick",
|
||||
"/feature_key_lock": "/features/key_lock",
|
||||
"/feature_key_overrides": "/features/key_overrides",
|
||||
"/feature_leader_key": "/features/leader_key",
|
||||
"/feature_led_indicators": "/features/led_indicators",
|
||||
"/feature_led_matrix": "/features/led_matrix",
|
||||
"/feature_midi": "/features/midi",
|
||||
"/feature_mouse_keys": "/features/mouse_keys",
|
||||
"/feature_oled_driver": "/features/oled_driver",
|
||||
"/feature_os_detection": "/features/os_detection",
|
||||
"/feature_pointing_device": "/features/pointing_device",
|
||||
"/feature_programmable_button": "/features/programmable_button",
|
||||
"/feature_ps2_mouse": "/features/ps2_mouse",
|
||||
"/feature_rawhid": "/features/rawhid",
|
||||
"/feature_repeat_key": "/features/repeat_key",
|
||||
"/feature_rgb_matrix": "/features/rgb_matrix",
|
||||
"/feature_rgblight": "/features/rgblight",
|
||||
"/feature_secure": "/features/secure",
|
||||
"/feature_send_string": "/features/send_string",
|
||||
"/feature_sequencer": "/features/sequencer",
|
||||
"/feature_space_cadet": "/features/space_cadet",
|
||||
"/feature_split_keyboard": "/features/split_keyboard",
|
||||
"/feature_st7565": "/features/st7565",
|
||||
"/feature_stenography": "/features/stenography",
|
||||
"/feature_swap_hands": "/features/swap_hands",
|
||||
"/feature_tap_dance": "/features/tap_dance",
|
||||
"/feature_tri_layer": "/features/tri_layer",
|
||||
"/feature_unicode": "/features/unicode",
|
||||
"/feature_wpm": "/features/wpm",
|
||||
"/flash_driver": "/drivers/flash",
|
||||
"/gpio_control": "/drivers/gpio",
|
||||
"/i2c_driver": "/drivers/i2c",
|
||||
"/serial_driver": "/drivers/serial",
|
||||
"/spi_driver": "/drivers/spi",
|
||||
"/uart_driver": "/drivers/uart",
|
||||
"/ws2812_driver": "/drivers/ws2812"
|
||||
}
|
@@ -64,13 +64,7 @@
|
||||
"text": "Development Environments",
|
||||
"items": [{ "text": "Docker Guide", "link": "/getting_started_docker" }]
|
||||
},
|
||||
{
|
||||
"text": "Flashing",
|
||||
"items": [
|
||||
{ "text": "Flashing", "link": "/flashing" },
|
||||
{ "text": "Flashing ATmega32A (ps2avrgb)", "link": "/flashing_bootloadhid" }
|
||||
]
|
||||
},
|
||||
{ "text": "Flashing", "link": "/flashing" },
|
||||
{
|
||||
"text": "IDEs",
|
||||
"items": [
|
||||
@@ -103,45 +97,46 @@
|
||||
{
|
||||
"text": "Advanced Keycodes",
|
||||
"items": [
|
||||
{ "text": "Command", "link": "/feature_command" },
|
||||
{ "text": "Dynamic Macros", "link": "/feature_dynamic_macros" },
|
||||
{ "text": "Grave Escape", "link": "/feature_grave_esc" },
|
||||
{ "text": "Leader Key", "link": "/feature_leader_key" },
|
||||
{ "text": "Command", "link": "/features/command" },
|
||||
{ "text": "Dynamic Macros", "link": "/features/dynamic_macros" },
|
||||
{ "text": "Grave Escape", "link": "/features/grave_esc" },
|
||||
{ "text": "Leader Key", "link": "/features/leader_key" },
|
||||
{ "text": "Mod-Tap", "link": "/mod_tap" },
|
||||
{ "text": "Macros", "link": "/feature_macros" },
|
||||
{ "text": "Mouse Keys", "link": "/feature_mouse_keys" },
|
||||
{ "text": "Programmable Button", "link": "/feature_programmable_button" },
|
||||
{ "text": "Repeat Key", "link": "/feature_repeat_key" },
|
||||
{ "text": "Space Cadet Shift", "link": "/feature_space_cadet" },
|
||||
{ "text": "Mouse Keys", "link": "/features/mouse_keys" },
|
||||
{ "text": "Programmable Button", "link": "/features/programmable_button" },
|
||||
{ "text": "Repeat Key", "link": "/features/repeat_key" },
|
||||
{ "text": "Space Cadet Shift", "link": "/features/space_cadet" },
|
||||
{ "text": "US ANSI Shifted Keys", "link": "/keycodes_us_ansi_shifted" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Software Features",
|
||||
"items": [
|
||||
{ "text": "Auto Shift", "link": "/feature_auto_shift" },
|
||||
{ "text": "Autocorrect", "link": "/feature_autocorrect" },
|
||||
{ "text": "Caps Word", "link": "/feature_caps_word" },
|
||||
{ "text": "Combos", "link": "/feature_combo" },
|
||||
{ "text": "Auto Shift", "link": "/features/auto_shift" },
|
||||
{ "text": "Autocorrect", "link": "/features/autocorrect" },
|
||||
{ "text": "Caps Word", "link": "/features/caps_word" },
|
||||
{ "text": "Combos", "link": "/features/combo" },
|
||||
{ "text": "Debounce API", "link": "/feature_debounce_type" },
|
||||
{ "text": "Digitizer", "link": "/feature_digitizer" },
|
||||
{ "text": "Digitizer", "link": "/features/digitizer" },
|
||||
{ "text": "EEPROM", "link": "/feature_eeprom" },
|
||||
{ "text": "Key Lock", "link": "/feature_key_lock" },
|
||||
{ "text": "Key Overrides", "link": "/feature_key_overrides" },
|
||||
{ "text": "Key Lock", "link": "/features/key_lock" },
|
||||
{ "text": "Key Overrides", "link": "/features/key_overrides" },
|
||||
{ "text": "Layers", "link": "/feature_layers" },
|
||||
{ "text": "Layer Lock", "link": "/features/layer_lock" },
|
||||
{ "text": "One Shot Keys", "link": "/one_shot_keys" },
|
||||
{ "text": "OS Detection", "link": "/feature_os_detection" },
|
||||
{ "text": "Raw HID", "link": "/feature_rawhid" },
|
||||
{ "text": "Secure", "link": "/feature_secure" },
|
||||
{ "text": "Send String", "link": "/feature_send_string" },
|
||||
{ "text": "Sequencer", "link": "/feature_sequencer" },
|
||||
{ "text": "Swap Hands", "link": "/feature_swap_hands" },
|
||||
{ "text": "Tap Dance", "link": "/feature_tap_dance" },
|
||||
{ "text": "OS Detection", "link": "/features/os_detection" },
|
||||
{ "text": "Raw HID", "link": "/features/rawhid" },
|
||||
{ "text": "Secure", "link": "/features/secure" },
|
||||
{ "text": "Send String", "link": "/features/send_string" },
|
||||
{ "text": "Sequencer", "link": "/features/sequencer" },
|
||||
{ "text": "Swap Hands", "link": "/features/swap_hands" },
|
||||
{ "text": "Tap Dance", "link": "/features/tap_dance" },
|
||||
{ "text": "Tap-Hold Configuration", "link": "/tap_hold" },
|
||||
{ "text": "Tri Layer", "link": "/feature_tri_layer" },
|
||||
{ "text": "Unicode", "link": "/feature_unicode" },
|
||||
{ "text": "Tri Layer", "link": "/features/tri_layer" },
|
||||
{ "text": "Unicode", "link": "/features/unicode" },
|
||||
{ "text": "Userspace", "link": "/feature_userspace" },
|
||||
{ "text": "WPM Calculation", "link": "/feature_wpm" }
|
||||
{ "text": "WPM Calculation", "link": "/features/wpm" }
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -157,35 +152,35 @@
|
||||
{ "text": "Quantum Painter LVGL Integration", "link": "/quantum_painter_lvgl" }
|
||||
]
|
||||
},
|
||||
{ "text": "HD44780 LCD Driver", "link": "/feature_hd44780" },
|
||||
{ "text": "ST7565 LCD Driver", "link": "/feature_st7565" },
|
||||
{ "text": "OLED Driver", "link": "/feature_oled_driver" }
|
||||
{ "text": "HD44780 LCD Driver", "link": "/features/hd44780" },
|
||||
{ "text": "ST7565 LCD Driver", "link": "/features/st7565" },
|
||||
{ "text": "OLED Driver", "link": "/features/oled_driver" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Lighting",
|
||||
"items": [
|
||||
{ "text": "Backlight", "link": "/feature_backlight" },
|
||||
{ "text": "LED Matrix", "link": "/feature_led_matrix" },
|
||||
{ "text": "RGB Lighting", "link": "/feature_rgblight" },
|
||||
{ "text": "RGB Matrix", "link": "/feature_rgb_matrix" }
|
||||
{ "text": "Backlight", "link": "/features/backlight" },
|
||||
{ "text": "LED Matrix", "link": "/features/led_matrix" },
|
||||
{ "text": "RGB Lighting", "link": "/features/rgblight" },
|
||||
{ "text": "RGB Matrix", "link": "/features/rgb_matrix" }
|
||||
]
|
||||
},
|
||||
{ "text": "Audio", "link": "/feature_audio" },
|
||||
{ "text": "Bluetooth", "link": "/feature_bluetooth" },
|
||||
{ "text": "Bootmagic Lite", "link": "/feature_bootmagic" },
|
||||
{ "text": "Audio", "link": "/features/audio" },
|
||||
{ "text": "Bootmagic", "link": "/features/bootmagic" },
|
||||
{ "text": "Converters", "link": "/feature_converters" },
|
||||
{ "text": "Custom Matrix", "link": "/custom_matrix" },
|
||||
{ "text": "DIP Switch", "link": "/feature_dip_switch" },
|
||||
{ "text": "Encoders", "link": "/feature_encoders" },
|
||||
{ "text": "Haptic Feedback", "link": "/feature_haptic_feedback" },
|
||||
{ "text": "Joystick", "link": "/feature_joystick" },
|
||||
{ "text": "LED Indicators", "link": "/feature_led_indicators" },
|
||||
{ "text": "MIDI", "link": "/feature_midi" },
|
||||
{ "text": "Pointing Device", "link": "/feature_pointing_device" },
|
||||
{ "text": "PS/2 Mouse", "link": "/feature_ps2_mouse" },
|
||||
{ "text": "Split Keyboard", "link": "/feature_split_keyboard" },
|
||||
{ "text": "Stenography", "link": "/feature_stenography" }
|
||||
{ "text": "DIP Switch", "link": "/features/dip_switch" },
|
||||
{ "text": "Encoders", "link": "/features/encoders" },
|
||||
{ "text": "Haptic Feedback", "link": "/features/haptic_feedback" },
|
||||
{ "text": "Joystick", "link": "/features/joystick" },
|
||||
{ "text": "LED Indicators", "link": "/features/led_indicators" },
|
||||
{ "text": "MIDI", "link": "/features/midi" },
|
||||
{ "text": "Pointing Device", "link": "/features/pointing_device" },
|
||||
{ "text": "PS/2 Mouse", "link": "/features/ps2_mouse" },
|
||||
{ "text": "Split Keyboard", "link": "/features/split_keyboard" },
|
||||
{ "text": "Stenography", "link": "/features/stenography" },
|
||||
{ "text": "Wireless", "link": "/features/wireless" }
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -210,9 +205,10 @@
|
||||
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
|
||||
{
|
||||
"text": "Most Recent ChangeLog",
|
||||
"link": "/ChangeLog/20240526"
|
||||
"link": "/ChangeLog/20241124"
|
||||
},
|
||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" }
|
||||
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
|
||||
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
|
||||
]
|
||||
},
|
||||
|
||||
@@ -226,19 +222,19 @@
|
||||
"text": "Drivers",
|
||||
"link": "hardware_drivers",
|
||||
"items": [
|
||||
{ "text": "ADC Driver", "link": "/adc_driver" },
|
||||
{ "text": "APA102 Driver", "link": "/apa102_driver" },
|
||||
{ "text": "Audio Driver", "link": "/audio_driver" },
|
||||
{ "text": "I2C Driver", "link": "/i2c_driver" },
|
||||
{ "text": "SPI Driver", "link": "/spi_driver" },
|
||||
{ "text": "WS2812 Driver", "link": "/ws2812_driver" },
|
||||
{ "text": "EEPROM Driver", "link": "/eeprom_driver" },
|
||||
{ "text": "Flash Driver", "link": "/flash_driver" },
|
||||
{ "text": "'serial' Driver", "link": "/serial_driver" },
|
||||
{ "text": "UART Driver", "link": "/uart_driver" }
|
||||
{ "text": "ADC Driver", "link": "/drivers/adc" },
|
||||
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
|
||||
{ "text": "Audio Driver", "link": "/drivers/audio" },
|
||||
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
|
||||
{ "text": "Flash Driver", "link": "/drivers/flash" },
|
||||
{ "text": "I2C Driver", "link": "/drivers/i2c" },
|
||||
{ "text": "'serial' Driver", "link": "/drivers/serial" },
|
||||
{ "text": "SPI Driver", "link": "/drivers/spi" },
|
||||
{ "text": "UART Driver", "link": "/drivers/uart" },
|
||||
{ "text": "WS2812 Driver", "link": "/drivers/ws2812" }
|
||||
]
|
||||
},
|
||||
{ "text": "GPIO Controls", "link": "/gpio_control" },
|
||||
{ "text": "GPIO Controls", "link": "/drivers/gpio" },
|
||||
{ "text": "Keyboard Guidelines", "link": "/hardware_keyboard_guidelines" }
|
||||
]
|
||||
},
|
||||
|
@@ -1,173 +0,0 @@
|
||||
# ADC Driver
|
||||
|
||||
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders).
|
||||
|
||||
This driver currently supports both AVR and a limited selection of ARM devices. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V for AVR, 3.3V only for ARM), however on ARM there is more flexibility in control of operation through `#define`s if you need more precision.
|
||||
|
||||
## Usage
|
||||
|
||||
To use this driver, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
Then place this include at the top of your code:
|
||||
|
||||
```c
|
||||
#include "analog.h"
|
||||
```
|
||||
|
||||
## Channels
|
||||
|
||||
### AVR
|
||||
|
||||
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328/P|
|
||||
|-------|-------------|-------------|---------|----------|
|
||||
|0 |`F0` |`F0` |`A0` |`C0` |
|
||||
|1 |`F1` |`F1` |`A1` |`C1` |
|
||||
|2 |`F2` | |`A2` |`C2` |
|
||||
|3 |`F3` | |`A3` |`C3` |
|
||||
|4 |`F4` |`F4` |`A4` |`C4` |
|
||||
|5 |`F5` |`F5` |`A5` |`C5` |
|
||||
|6 |`F6` |`F6` |`A6` |* |
|
||||
|7 |`F7` |`F7` |`A7` |* |
|
||||
|8 | |`D4` | | |
|
||||
|9 | |`D6` | | |
|
||||
|10 | |`D7` | | |
|
||||
|11 | |`B4` | | |
|
||||
|12 | |`B5` | | |
|
||||
|13 | |`B6` | | |
|
||||
|
||||
<sup>\* The ATmega328/P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
|
||||
|
||||
### ARM
|
||||
|
||||
#### STM32
|
||||
|
||||
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
|
||||
|
||||
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-indexed, whereas the F3 has 4 ADCs and the channels are 1-indexed. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|
||||
|
||||
|ADC|Channel|STM32F0xx|STM32F1xx|STM32F3xx|STM32F4xx|
|
||||
|---|-------|---------|---------|---------|---------|
|
||||
|1 |0 |`A0` |`A0` | |`A0` |
|
||||
|1 |1 |`A1` |`A1` |`A0` |`A1` |
|
||||
|1 |2 |`A2` |`A2` |`A1` |`A2` |
|
||||
|1 |3 |`A3` |`A3` |`A2` |`A3` |
|
||||
|1 |4 |`A4` |`A4` |`A3` |`A4` |
|
||||
|1 |5 |`A5` |`A5` |`F4` |`A5` |
|
||||
|1 |6 |`A6` |`A6` |`C0` |`A6` |
|
||||
|1 |7 |`A7` |`A7` |`C1` |`A7` |
|
||||
|1 |8 |`B0` |`B0` |`C2` |`B0` |
|
||||
|1 |9 |`B1` |`B1` |`C3` |`B1` |
|
||||
|1 |10 |`C0` |`C0` |`F2` |`C0` |
|
||||
|1 |11 |`C1` |`C1` | |`C1` |
|
||||
|1 |12 |`C2` |`C2` | |`C2` |
|
||||
|1 |13 |`C3` |`C3` | |`C3` |
|
||||
|1 |14 |`C4` |`C4` | |`C4` |
|
||||
|1 |15 |`C5` |`C5` | |`C5` |
|
||||
|1 |16 | | | | |
|
||||
|2 |0 | |`A0`¹ | |`A0`² |
|
||||
|2 |1 | |`A1`¹ |`A4` |`A1`² |
|
||||
|2 |2 | |`A2`¹ |`A5` |`A2`² |
|
||||
|2 |3 | |`A3`¹ |`A6` |`A3`² |
|
||||
|2 |4 | |`A4`¹ |`A7` |`A4`² |
|
||||
|2 |5 | |`A5`¹ |`C4` |`A5`² |
|
||||
|2 |6 | |`A6`¹ |`C0` |`A6`² |
|
||||
|2 |7 | |`A7`¹ |`C1` |`A7`² |
|
||||
|2 |8 | |`B0`¹ |`C2` |`B0`² |
|
||||
|2 |9 | |`B1`¹ |`C3` |`B1`² |
|
||||
|2 |10 | |`C0`¹ |`F2` |`C0`² |
|
||||
|2 |11 | |`C1`¹ |`C5` |`C1`² |
|
||||
|2 |12 | |`C2`¹ |`B2` |`C2`² |
|
||||
|2 |13 | |`C3`¹ | |`C3`² |
|
||||
|2 |14 | |`C4`¹ | |`C4`² |
|
||||
|2 |15 | |`C5`¹ | |`C5`² |
|
||||
|2 |16 | | | | |
|
||||
|3 |0 | |`A0`¹ | |`A0`² |
|
||||
|3 |1 | |`A1`¹ |`B1` |`A1`² |
|
||||
|3 |2 | |`A2`¹ |`E9` |`A2`² |
|
||||
|3 |3 | |`A3`¹ |`E13` |`A3`² |
|
||||
|3 |4 | |`F6`¹ | |`F6`² |
|
||||
|3 |5 | |`F7`¹ |`B13` |`F7`² |
|
||||
|3 |6 | |`F8`¹ |`E8` |`F8`² |
|
||||
|3 |7 | |`F9`¹ |`D10` |`F9`² |
|
||||
|3 |8 | |`F10`¹ |`D11` |`F10`² |
|
||||
|3 |9 | | |`D12` |`F3`² |
|
||||
|3 |10 | |`C0`¹ |`D13` |`C0`² |
|
||||
|3 |11 | |`C1`¹ |`D14` |`C1`² |
|
||||
|3 |12 | |`C2`¹ |`B0` |`C2`² |
|
||||
|3 |13 | |`C3`¹ |`E7` |`C3`² |
|
||||
|3 |14 | | |`E10` |`F4`² |
|
||||
|3 |15 | | |`E11` |`F5`² |
|
||||
|3 |16 | | |`E12` | |
|
||||
|4 |1 | | |`E14` | |
|
||||
|4 |2 | | |`E15` | |
|
||||
|4 |3 | | |`B12` | |
|
||||
|4 |4 | | |`B14` | |
|
||||
|4 |5 | | |`B15` | |
|
||||
|4 |6 | | |`E8` | |
|
||||
|4 |7 | | |`D10` | |
|
||||
|4 |8 | | |`D11` | |
|
||||
|4 |9 | | |`D12` | |
|
||||
|4 |10 | | |`D13` | |
|
||||
|4 |11 | | |`D14` | |
|
||||
|4 |12 | | |`D8` | |
|
||||
|4 |13 | | |`D9` | |
|
||||
|4 |14 | | | | |
|
||||
|4 |15 | | | | |
|
||||
|4 |16 | | | | |
|
||||
|
||||
<sup>¹ As of ChibiOS 20.3.4, the ADC driver for STM32F1xx devices supports only ADC1, therefore any configurations involving ADC2 or ADC3 cannot actually be used. In particular, pins `F6`…`F10`, which are present at least on some STM32F103x[C-G] devices, cannot be used as ADC inputs because of this driver limitation.</sup>
|
||||
|
||||
<sup>² Not all STM32F4xx devices have ADC2 and/or ADC3, therefore some configurations shown in this table may be unavailable; in particular, pins `F4`…`F10` cannot be used as ADC inputs on devices which do not have ADC3. Check the device datasheet to confirm which pin functions are supported.</sup>
|
||||
|
||||
#### RP2040
|
||||
|
||||
RP2040 has only a single ADC (`ADCD1` in ChibiOS); in the QMK API the index for that ADC is 0.
|
||||
|
||||
|Channel|Pin |
|
||||
|-------|-------------------|
|
||||
|0 |`GP26` |
|
||||
|1 |`GP27` |
|
||||
|2 |`GP28` |
|
||||
|3 |`GP29` |
|
||||
|4 |Temperature sensor*|
|
||||
|
||||
|
||||
<sup>* The temperature sensor is disabled by default and needs to be enabled by the RP2040-specific function: `adcRPEnableTS(&ADCD1)`. The ADC must be initialized before calling that function; an easy way to ensure that is to perform a dummy conversion.</sup>
|
||||
|
||||
## Functions
|
||||
|
||||
### AVR
|
||||
|
||||
|Function |Description |
|
||||
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
|
||||
|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `F6` for ADC6 on the ATmega32U4. |
|
||||
|`pinToMux(pin)` |Translates a given pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
||||
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
|
||||
|
||||
### ARM
|
||||
|
||||
|Function |Description |
|
||||
|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
|
||||
|`analogReadPinAdc(pin, adc)`|Reads the value from the specified pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function. |
|
||||
|`pinToMux(pin)` |Translates a given pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
||||
|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and ADC combination. See your MCU's datasheet for more information. |
|
||||
|
||||
## Configuration
|
||||
|
||||
## ARM
|
||||
|
||||
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.
|
||||
|
||||
|`#define` |Type |Default |Description |
|
||||
|---------------------|------|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |If `true`, then the implementation will use a circular buffer. |
|
||||
|`ADC_NUM_CHANNELS` |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`. |
|
||||
|`ADC_BUFFER_DEPTH` |`int` |`2` |Sets the depth of each result. Since we are only getting a 10-bit result by default, we set this to 2 bytes so we can contain our one value. This could be set to 1 if you opt for an 8-bit or lower result.|
|
||||
|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. |
|
||||
|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_10BIT` or `ADC_CFGR_RES_10BITS`|The resolution of your result. We choose 10 bit by default, but you can opt for 12, 10, 8, or 6 bit. Different MCUs use slightly different names for the resolution constants. |
|
@@ -1,49 +0,0 @@
|
||||
# APA102 Driver {#apa102-driver}
|
||||
|
||||
This driver provides support for APA102 addressable RGB LEDs. They are similar to the [WS2812](ws2812_driver) LEDs, but have increased data and refresh rates.
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
In most cases, the APA102 driver code is automatically included if you are using either the [RGBLight](feature_rgblight) or [RGB Matrix](feature_rgb_matrix) 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 {#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 {#api}
|
||||
|
||||
### `void apa102_setleds(rgb_led_t *start_led, uint16_t num_leds)`
|
||||
|
||||
Send RGB data to the APA102 LED chain.
|
||||
|
||||
#### Arguments {#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 {#api-apa102-set-brightness-arguments}
|
||||
|
||||
- `uint8_t brightness`
|
||||
The brightness level to set, from 0 to 31.
|
@@ -4,7 +4,7 @@ This page attempts to introduce developers to the QMK Compiler. It does not go i
|
||||
|
||||
# Overview
|
||||
|
||||
The QMK Compile API consists of a few movings parts:
|
||||
The QMK Compile API consists of a few moving parts:
|
||||
|
||||

|
||||
|
||||
|
@@ -1,239 +0,0 @@
|
||||
# Audio Driver {#audio-driver}
|
||||
|
||||
The [Audio feature](feature_audio) breaks the hardware specifics out into separate, exchangeable driver units, with a common interface to the audio-"core" - which itself handles playing songs and notes while tracking their progress in an internal state, initializing/starting/stopping the driver as needed.
|
||||
|
||||
Not all MCUs support every available driver, either the platform-support is not there (yet?) or the MCU simply does not have the required hardware peripheral.
|
||||
|
||||
|
||||
## AVR {#avr}
|
||||
|
||||
Boards built around an Atmega32U4 can use two sets of PWM capable pins, each driving a separate speaker.
|
||||
The possible configurations are:
|
||||
|
||||
| | Timer3 | Timer1 |
|
||||
|--------------|-------------|--------------|
|
||||
| one speaker | C4,C5 or C6 | |
|
||||
| one speaker | | B4, B5 or B7 |
|
||||
| two speakers | C4,C5 or C6 | B4, B5 or B7 |
|
||||
|
||||
Currently there is only one/default driver for AVR based boards, which is automatically configured to:
|
||||
|
||||
```make
|
||||
AUDIO_DRIVER = pwm_hardware
|
||||
```
|
||||
|
||||
|
||||
## ARM {#arm}
|
||||
|
||||
For Arm based boards, QMK depends on ChibiOS - hence any MCU supported by the later is likely usable, as long as certain hardware peripherals are available.
|
||||
|
||||
Supported wiring configurations, with their ChibiOS/MCU peripheral requirement are listed below;
|
||||
piezo speakers are marked with :one: for the first/primary and :two: for the secondary.
|
||||
|
||||
| driver | GPTD6<br>Tim6 | GPTD7<br>Tim7 | GPTD8<br>Tim8 | PWMD1<sup>1</sup><br>Tim1_Ch1 |
|
||||
|--------------|------------------------------------------|------------------------|---------------|-------------------------------|
|
||||
| dac_basic | A4+DACD1 = :one: | A5+DACD2 = :one: | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | A5+DACD2 = :two: + Gnd | state | |
|
||||
| | A4+DACD1 = :two: + Gnd | A5+DACD2 = :one: + Gnd | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | | state | |
|
||||
| | | A5+DACD2 = :one: + Gnd | state | |
|
||||
| dac_additive | A4+DACD1 = :one: + Gnd | | | |
|
||||
| | A5+DACD2 = :one: + Gnd | | | |
|
||||
| | A4+DACD1 + A5+DACD2 = :one: <sup>2</sup> | | | |
|
||||
| pwm_software | state-update | | | any = :one: |
|
||||
| pwm hardware | state-update | | | A8 = :one: <sup>3</sup> |
|
||||
|
||||
|
||||
<sup>1</sup>: the routing and alternate functions for PWM differ sometimes between STM32 MCUs, if in doubt consult the data-sheet
|
||||
<sup>2</sup>: one piezo connected to A4 and A5, with AUDIO_PIN_ALT_AS_NEGATIVE set
|
||||
<sup>3</sup>: TIM1_CH1 = A8 on STM32F103C8, other combinations are possible, see Data-sheet. configured with: AUDIO_PWM_DRIVER and AUDIO_PWM_CHANNEL
|
||||
|
||||
|
||||
|
||||
### DAC basic {#dac-basic}
|
||||
|
||||
The default driver for ARM boards, in absence of an overriding configuration.
|
||||
This driver needs one Timer per enabled/used DAC channel, to trigger conversion; and a third timer to trigger state updates with the audio-core.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
|
||||
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
#undef STM32_GPT_USE_TIM7
|
||||
#define STM32_GPT_USE_TIM7 TRUE
|
||||
#undef STM32_GPT_USE_TIM8
|
||||
#define STM32_GPT_USE_TIM8 TRUE
|
||||
```
|
||||
|
||||
::: tip
|
||||
Note: DAC1 (A4) uses TIM6, DAC2 (A5) uses TIM7, and the audio state timer uses TIM8 (configurable).
|
||||
:::
|
||||
|
||||
You can also change the timer used for the overall audio state by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD9
|
||||
```
|
||||
|
||||
### DAC additive {#dac-additive}
|
||||
|
||||
only needs one timer (GPTD6, Tim6) to trigger the DAC unit to do a conversion; the audio state updates are in turn triggered during the DAC callback.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
|
||||
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_DAC TRUE
|
||||
#define HAL_USE_GPT TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_DAC_USE_DAC1_CH1
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE
|
||||
#undef STM32_DAC_USE_DAC1_CH2
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE
|
||||
#undef STM32_GPT_USE_TIM6
|
||||
#define STM32_GPT_USE_TIM6 TRUE
|
||||
```
|
||||
|
||||
### DAC Config
|
||||
|
||||
| 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 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, number of simultaneous tones and buffer size, instead of using one of the listed presets.
|
||||
|
||||
| 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 {#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
|
||||
/* zero crossing (or approach, whereas zero == DAC_OFF_VALUE, which can be configured to anything from 0 to DAC_SAMPLE_MAX)
|
||||
* ============================*=*========================== AUDIO_DAC_SAMPLE_MAX
|
||||
* * *
|
||||
* * *
|
||||
* ---------------------------------------------------------
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* --------------------------------------------------------- AUDIO_DAC_OFF_VALUE
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* ---------------------------------------------------------
|
||||
* *
|
||||
* * *
|
||||
* * *
|
||||
* =====*=*================================================= 0x0
|
||||
*/
|
||||
```
|
||||
|
||||
|
||||
### PWM hardware {#pwm-hardware}
|
||||
|
||||
This driver uses the ChibiOS-PWM system to produce a square-wave on specific output pins that are connected to the PWM hardware.
|
||||
The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function.
|
||||
|
||||
A configuration example for the STM32F103C8 would be:
|
||||
```c
|
||||
//halconf.h:
|
||||
#define HAL_USE_PWM TRUE
|
||||
#define HAL_USE_PAL TRUE
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
|
||||
```c
|
||||
// mcuconf.h:
|
||||
#include_next <mcuconf.h>
|
||||
#undef STM32_PWM_USE_TIM1
|
||||
#define STM32_PWM_USE_TIM1 TRUE
|
||||
```
|
||||
|
||||
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
|
||||
- TIM1_CH1 = PA8 <- alternate0
|
||||
- TIM1_CH2 = PA9
|
||||
- TIM1_CH3 = PA10
|
||||
- TIM1_CH4 = PA11
|
||||
|
||||
with all this information, the configuration would contain these lines:
|
||||
```c
|
||||
//config.h:
|
||||
#define AUDIO_PIN A8
|
||||
#define AUDIO_PWM_DRIVER PWMD1
|
||||
#define AUDIO_PWM_CHANNEL 1
|
||||
```
|
||||
|
||||
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 {#pwm-software}
|
||||
|
||||
This driver uses the PWM callbacks from PWMD1 with TIM1_CH1 to toggle the selected AUDIO_PIN in software.
|
||||
During the same callback, with AUDIO_PIN_ALT_AS_NEGATIVE set, the AUDIO_PIN_ALT is toggled inversely to AUDIO_PIN. This is useful for setups that drive a piezo from two pins (instead of one and Gnd).
|
||||
|
||||
You can also change the timer used for software PWM by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD8
|
||||
```
|
||||
|
||||
|
||||
### Testing Notes {#testing-notes}
|
||||
|
||||
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
|
||||
|
||||
| | DAC basic | DAC additive | PWM hardware | PWM software |
|
||||
| ------------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
|
||||
| Atmega32U4 | :o: | :o: | :heavy_check_mark: | :o: |
|
||||
| RP2040 | :x: | :x: | :heavy_check_mark: | ? |
|
||||
| STM32F103C8 (bluepill) | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| STM32F303CCT6 (proton-c) | :heavy_check_mark: | :heavy_check_mark: | ? | :heavy_check_mark: |
|
||||
| STM32F405VG | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| L0xx | :x: (no Tim8) | ? | ? | ? |
|
||||
|
||||
:heavy_check_mark: : works and was tested
|
||||
:o: : does not apply
|
||||
:x: : not supported by MCU
|
||||
|
||||
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
|
@@ -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 Nov 24](ChangeLog/20241124)
|
||||
* [2024 Aug 25](ChangeLog/20240825)
|
||||
* [2024 May 26](ChangeLog/20240526)
|
||||
* [2024 Feb 25](ChangeLog/20240225)
|
||||
* [2023 Nov 26](ChangeLog/20231126)
|
||||
* [Older Breaking Changes](breaking_changes_history)
|
||||
|
||||
## When is the next Breaking Change?
|
||||
|
||||
The next Breaking Change is scheduled for August 25, 2024.
|
||||
The next Breaking Change is scheduled for February 23, 2025.
|
||||
|
||||
### Important Dates
|
||||
|
||||
* 2024 May 26 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2024 Jul 28 - `develop` closed to new PRs.
|
||||
* 2024 Jul 28 - Call for testers.
|
||||
* 2024 Aug 4 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2024 Aug 18 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2024 Aug 22 - `master` is locked, no PRs merged.
|
||||
* 2024 Aug 25 - Merge `develop` to `master`.
|
||||
* 2024 Aug 25 - `master` is unlocked. PRs can be merged again.
|
||||
* 2024 Nov 24 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
|
||||
* 2025 Jan 26 - `develop` closed to new PRs.
|
||||
* 2025 Jan 26 - Call for testers.
|
||||
* 2025 Feb 9 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
|
||||
* 2025 Feb 16 - `develop` is locked, only critical bugfix PRs merged.
|
||||
* 2024 Nov 21 - `master` is locked, no PRs merged.
|
||||
* 2025 Feb 23 - Merge `develop` to `master`.
|
||||
* 2025 Feb 23 - `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/20240526`.
|
||||
* The PR has a ChangeLog file describing the changes under `<qmk_firmware>/docs/Changelog/20241124`.
|
||||
* 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 Nov 24](ChangeLog/20241124) - version 0.27.0
|
||||
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0
|
||||
* [2024 May 26](ChangeLog/20240526) - version 0.25.0
|
||||
* [2024 Feb 25](ChangeLog/20240225) - version 0.24.0
|
||||
* [2023 Nov 26](ChangeLog/20231126) - version 0.23.0
|
||||
|
@@ -31,4 +31,4 @@ Commenting on your pull request and being responsive to questions, comments, and
|
||||
|
||||
### Ask for Help
|
||||
|
||||
Having your submission flagged may have caught you off guard. If you find yourself intimidated or overwhelmed, let us know. Comment on your pull request, or [reach out to the QMK team on Discord](https://discord.gg/Uq7gcHh).
|
||||
Having your submission flagged may have caught you off guard. If you find yourself intimidated or overwhelmed, let us know. Comment on your pull request, or [reach out to the QMK team on Discord](https://discord.gg/qmk).
|
||||
|
@@ -153,20 +153,26 @@ qmk cd
|
||||
|
||||
This command allows for searching through keyboard/keymap targets, filtering by specific criteria. `info.json` and `rules.mk` files contribute to the search data, as well as keymap configurations, and the results can be filtered using "dotty" syntax matching the overall `info.json` file format.
|
||||
|
||||
For example, one could search for all keyboards using STM32F411:
|
||||
For example, one could search for all keyboards powered by the STM32F411 microcontroller:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411'
|
||||
qmk find -f 'processor==STM32F411'
|
||||
```
|
||||
|
||||
...and one can further constrain the list to keyboards using STM32F411 as well as rgb_matrix support:
|
||||
The list can be further constrained by passing additional filter expressions:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411' -f 'features.rgb_matrix=true'
|
||||
qmk find -f 'processor==STM32F411' -f 'features.rgb_matrix==true'
|
||||
```
|
||||
|
||||
The following filter expressions are also supported:
|
||||
The following filter expressions are supported:
|
||||
|
||||
- `key == value`: Match targets where `key` is equal to `value`. May include wildcards such as `*` and `?`.
|
||||
- `key != value`: Match targets where `key` is not `value`. May include wildcards such as `*` and `?`.
|
||||
- `key < value`: Match targets where `key` is a number less than `value`.
|
||||
- `key > value`: Match targets where `key` is a number greater than `value`.
|
||||
- `key <= value`: Match targets where `key` is a number less than or equal to `value`.
|
||||
- `key >= value`: Match targets where `key` is a number greater than or equal to `value`.
|
||||
- `exists(key)`: Match targets where `key` is present.
|
||||
- `absent(key)`: Match targets where `key` is not present.
|
||||
- `contains(key, value)`: Match targets where `key` contains `value`. Can be used for strings, arrays and object keys.
|
||||
@@ -175,7 +181,7 @@ The following filter expressions are also supported:
|
||||
You can also list arbitrary values for each matched target with `--print`:
|
||||
|
||||
```
|
||||
qmk find -f 'processor=STM32F411' -p 'keyboard_name' -p 'features.rgb_matrix'
|
||||
qmk find -f 'processor==STM32F411' -p 'keyboard_name' -p 'features.rgb_matrix'
|
||||
```
|
||||
|
||||
**Usage**:
|
||||
@@ -749,7 +755,7 @@ options:
|
||||
|
||||
## `qmk generate-rgb-breathe-table`
|
||||
|
||||
This command generates a lookup table (LUT) header file for the [RGB Lighting](feature_rgblight) feature's breathing animation. Place this file in your keyboard or keymap directory as `rgblight_breathe_table.h` to override the default LUT in `quantum/rgblight/`.
|
||||
This command generates a lookup table (LUT) header file for the [RGB Lighting](features/rgblight) feature's breathing animation. Place this file in your keyboard or keymap directory as `rgblight_breathe_table.h` to override the default LUT in `quantum/rgblight/`.
|
||||
|
||||
**Usage**:
|
||||
|
||||
|
@@ -207,7 +207,7 @@ qmk format-python
|
||||
We use [yapf](https://github.com/google/yapf) to automatically format code. Our configuration is in the `[yapf]` section of `setup.cfg`.
|
||||
|
||||
::: tip
|
||||
Tip- Many editors can use yapf as a plugin to automatically format code as you type.
|
||||
Many editors can use yapf as a plugin to automatically format code as you type.
|
||||
:::
|
||||
|
||||
## Testing Details
|
||||
@@ -217,7 +217,7 @@ Our tests can be found in `lib/python/qmk/tests/`. You will find both unit and i
|
||||
If your PR does not include a comprehensive set of tests please add comments like this to your code so that other people know where they can help:
|
||||
|
||||
```python
|
||||
# TODO(unassigned/<your_github_username>): Write <unit|integration> tests
|
||||
# TODO(unassigned/<your_github_username>): Write <unit|integration> tests
|
||||
```
|
||||
|
||||
We use [nose2](https://nose2.readthedocs.io/en/latest/getting_started.html) to run our tests. You can refer to the nose2 documentation for more details on what you can do in your test functions.
|
||||
|
@@ -57,6 +57,10 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||
* [WB32F3G71xx](http://www.westberrytech.com)
|
||||
* [WB32FQ95xx](http://www.westberrytech.com)
|
||||
|
||||
### Artery (AT32)
|
||||
|
||||
* [AT32F415](https://www.arterychip.com/en/product/AT32F415.jsp)
|
||||
|
||||
### NXP (Kinetis)
|
||||
|
||||
* [MKL26Z64](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/kl-series-cortex-m0-plus/kinetis-kl2x-72-96-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||
@@ -75,10 +79,6 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
|
||||
|
||||
For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040).
|
||||
|
||||
## Atmel ATSAM
|
||||
|
||||
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware.
|
||||
|
||||
## RISC-V
|
||||
|
||||
### GigaDevice
|
||||
|
@@ -207,7 +207,7 @@ If you define these options you will enable the associated feature, which may in
|
||||
* `#define TAP_HOLD_CAPS_DELAY 80`
|
||||
* Sets the delay for Tap Hold keys (`LT`, `MT`) when using `KC_CAPS_LOCK` keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
|
||||
* `#define KEY_OVERRIDE_REPEAT_DELAY 500`
|
||||
* Sets the key repeat interval for [key overrides](feature_key_overrides).
|
||||
* Sets the key repeat interval for [key overrides](features/key_overrides).
|
||||
* `#define LEGACY_MAGIC_HANDLING`
|
||||
* Enables magic configuration handling for advanced keycodes (such as Mod Tap and Layer Tap)
|
||||
|
||||
@@ -217,14 +217,14 @@ If you define these options you will enable the associated feature, which may in
|
||||
* `#define WS2812_DI_PIN D7`
|
||||
* pin the DI on the WS2812 is hooked-up to
|
||||
* `#define RGBLIGHT_LAYERS`
|
||||
* Lets you define [lighting layers](feature_rgblight#lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
|
||||
* Lets you define [lighting layers](features/rgblight#lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
|
||||
* `#define RGBLIGHT_MAX_LAYERS`
|
||||
* Defaults to 8. Can be expanded up to 32 if more [lighting layers](feature_rgblight#lighting-layers) are needed.
|
||||
* Defaults to 8. Can be expanded up to 32 if more [lighting layers](features/rgblight#lighting-layers) are needed.
|
||||
* Note: Increasing the maximum will increase the firmware size and slow sync on split keyboards.
|
||||
* `#define RGBLIGHT_LAYER_BLINK`
|
||||
* Adds ability to [blink](feature_rgblight#lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action).
|
||||
* Adds ability to [blink](features/rgblight#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#overriding-rgb-lighting-onoff-status) will be shown even if RGB Light is off.
|
||||
* If defined, then [lighting layers](features/rgblight#overriding-rgb-lighting-onoff-status) will be shown even if RGB Light is off.
|
||||
* `#define RGBLIGHT_LED_COUNT 12`
|
||||
* number of LEDs
|
||||
* `#define RGBLIGHT_SPLIT`
|
||||
@@ -358,7 +358,7 @@ There are a few different ways to set handedness for split keyboards (listed in
|
||||
|
||||
* `#define SPLIT_TRANSACTION_IDS_KB .....`
|
||||
* `#define SPLIT_TRANSACTION_IDS_USER .....`
|
||||
* Allows for custom data sync with the slave when using the QMK-provided split transport. See [custom data sync between sides](feature_split_keyboard#custom-data-sync) for more information.
|
||||
* Allows for custom data sync with the slave when using the QMK-provided split transport. See [custom data sync between sides](features/split_keyboard#custom-data-sync) for more information.
|
||||
|
||||
# The `rules.mk` File
|
||||
|
||||
@@ -413,7 +413,7 @@ Use these to enable or disable building certain features. The more you have enab
|
||||
* `MAGIC_ENABLE`
|
||||
* MAGIC actions (BOOTMAGIC without the boot)
|
||||
* `BOOTMAGIC_ENABLE`
|
||||
* Enable Bootmagic Lite
|
||||
* Enable Bootmagic
|
||||
* `MOUSEKEY_ENABLE`
|
||||
* Mouse keys
|
||||
* `EXTRAKEY_ENABLE`
|
||||
@@ -426,8 +426,6 @@ Use these to enable or disable building certain features. The more you have enab
|
||||
* Key combo feature
|
||||
* `NKRO_ENABLE`
|
||||
* USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
* `RING_BUFFERED_6KRO_REPORT_ENABLE`
|
||||
* USB 6-Key Rollover - Instead of stopping any new input once 6 keys are pressed, the oldest key is released and the new key is pressed.
|
||||
* `AUDIO_ENABLE`
|
||||
* Enable the audio subsystem.
|
||||
* `KEY_OVERRIDE_ENABLE`
|
||||
|
@@ -54,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
|
||||
|
||||
[1] = LAYOUT_all(
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, BL_TOGG, BL_DOWN, BL_UP,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, UG_TOGG, UG_NEXT, UG_HUED, UG_HUEU, UG_SATD, UG_SATU, UG_VALD, UG_VALU, BL_TOGG, BL_DOWN, BL_UP,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
|
||||
@@ -82,7 +82,7 @@ The default keymap uses the `LAYOUT_all` macro, so that will be the value of the
|
||||
"KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "MO(1)", "KC_RGUI", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT"
|
||||
],
|
||||
[
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "RGB_TOG", "RGB_MOD", "RGB_HUD", "RGB_HUI", "RGB_SAD", "RGB_SAI", "RGB_VAD", "RGB_VAI", "BL_TOGG", "BL_DOWN", "BL_UP",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "UG_TOGG", "UG_NEXT", "UG_HUED", "UG_HUEU", "UG_SATD", "UG_SATU", "UG_VALD", "UG_VALU", "BL_TOGG", "BL_DOWN", "BL_UP",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_VOLU",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_MPLY", "KC_MNXT", "KC_VOLD",
|
||||
"KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS",
|
||||
|
@@ -16,7 +16,9 @@ I'll say that again because it's important:
|
||||
**MAKE SURE YOU SELECT THE RIGHT VERSION!**
|
||||
:::
|
||||
|
||||
If your keyboard has been advertised to be powered by QMK but is not in the list, chances are a developer hasn't gotten to it yet or we haven't had a chance to merge it in yet. File an issue at [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) requesting to support that particular keyboard, if there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) for it. There are also QMK powered keyboards that are in their manufacturer's own GitHub accounts. Double check for that as well. <!-- FIXME(skullydazed): This feels too wordy and I'm not sure we want to encourage these kinds of issues. Also, should we prompt them to bug the manufacutrer? -->
|
||||
Unfortunately if your keyboard has been advertised to be powered by QMK but is not in the list, you will **not** be able to use Configurator to customize your keyboard.
|
||||
|
||||
Chances are a developer hasn't gotten round to adding support or we haven't had a chance to merge it in yet. If there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard), contact the manufacturer and encourage them to add support.
|
||||
|
||||
## Step 2: Select Your Keyboard Layout
|
||||
|
||||
|
@@ -11,7 +11,7 @@ Third-party contributions help us grow and improve QMK. We want to make the pull
|
||||
|
||||
## I Don't Want to Read This Whole Thing! I Just Have a Question!
|
||||
|
||||
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Discord](https://discord.gg/Uq7gcHh).
|
||||
If you'd like to ask questions about QMK you can do so on the [OLKB Subreddit](https://reddit.com/r/olkb) or on [Discord](https://discord.gg/qmk).
|
||||
|
||||
Please keep these things in mind:
|
||||
|
||||
@@ -29,7 +29,7 @@ QMK is largely written in C, with specific features and parts written in C++. It
|
||||
|
||||
# Where Can I Go for Help?
|
||||
|
||||
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on Discord](https://discord.gg/Uq7gcHh).
|
||||
If you need help you can [open an issue](https://github.com/qmk/qmk_firmware/issues) or [chat on Discord](https://discord.gg/qmk).
|
||||
|
||||
# How Do I Make a Contribution?
|
||||
|
||||
@@ -105,7 +105,9 @@ enum my_keycodes {
|
||||
|
||||
Before opening a pull request, you can preview your changes if you have set up the development environment by running this command from the `qmk_firmware/` folder:
|
||||
|
||||
qmk docs
|
||||
```
|
||||
qmk docs
|
||||
```
|
||||
|
||||
and navigating to `http://localhost:5173/`.
|
||||
|
||||
@@ -126,7 +128,7 @@ We also ask that you follow these guidelines:
|
||||
|
||||
Before you put a lot of work into building your new feature you should make sure you are implementing it in the best way. You can get a basic understanding of QMK by reading [Understanding QMK](understanding_qmk), which will take you on a tour of the QMK program flow. From here you should talk to us to get a sense of the best way to implement your idea. There are two main ways to do this:
|
||||
|
||||
* [Chat on Discord](https://discord.gg/Uq7gcHh)
|
||||
* [Chat on Discord](https://discord.gg/qmk)
|
||||
* [Open an Issue](https://github.com/qmk/qmk_firmware/issues/new)
|
||||
|
||||
Feature and Bug Fix PRs affect all keyboards. We are also in the process of restructuring QMK. For this reason it is especially important for significant changes to be discussed before implementation has happened. If you open a PR without talking to us first please be prepared to do some significant rework if your choices do not mesh well with our planned direction.
|
||||
|
@@ -184,7 +184,7 @@ Whenever possible you should customize your keyboard by using `process_record_*(
|
||||
|
||||
### Example `matrix_scan_*` Implementation
|
||||
|
||||
This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/Uq7gcHh).
|
||||
This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
|
||||
|
||||
### `matrix_scan_*` Function Documentation
|
||||
|
||||
@@ -206,7 +206,7 @@ Similar to `matrix_scan_*`, these are called as often as the MCU can handle. To
|
||||
|
||||
### Example `void housekeeping_task_user(void)` implementation
|
||||
|
||||
This example will show you how to use `void housekeeping_task_user(void)` to turn off [RGB Light](feature_rgblight). For RGB Matrix, the [builtin](feature_rgb_matrix#additional-configh-options) `RGB_MATRIX_TIMEOUT` should be used.
|
||||
This example will show you how to use `void housekeeping_task_user(void)` to turn off [RGB Light](features/rgblight). For RGB Matrix, the [builtin](features/rgb_matrix#additional-configh-options) `RGB_MATRIX_TIMEOUT` should be used.
|
||||
|
||||
First, add the following lines to your keymap's `config.h`:
|
||||
|
||||
|
@@ -69,4 +69,4 @@ This page describes my cool feature. You can use my cool feature to make coffee
|
||||
|KC_SUGAR||Order Sugar|
|
||||
```
|
||||
|
||||
Place your documentation into `docs/feature_<my_cool_feature>.md`, and add that file to the appropriate place in `docs/_sidebar.json`. If you have added any keycodes be sure to add them to `docs/keycodes.md` with a link back to your feature page.
|
||||
Place your documentation into `docs/features/<my_cool_feature>.md`, and add that file to the appropriate place in `docs/_sidebar.json`. If you have added any keycodes be sure to add them to `docs/keycodes.md` with a link back to your feature page.
|
||||
|
@@ -8,8 +8,8 @@ We recommend the use of the [Zadig](https://zadig.akeo.ie/) utility. If you have
|
||||
|
||||
## Installation
|
||||
|
||||
Put your keyboard into bootloader mode, either by hitting the `QK_BOOT` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic Lite](feature_bootmagic) docs for more details). Some boards use [Command](feature_command) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
|
||||
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic Lite](feature_bootmagic) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
|
||||
Put your keyboard into bootloader mode, either by hitting the `QK_BOOT` keycode (which may be on a different layer), or by pressing the reset switch that's usually located on the underside of the board. If your keyboard has neither, try holding Escape or Space+`B` as you plug it in (see the [Bootmagic](features/bootmagic) docs for more details). Some boards use [Command](features/command) instead of Bootmagic; in this case, you can enter bootloader mode by hitting Left Shift+Right Shift+`B` or Left Shift+Right Shift+Escape at any point while the keyboard is plugged in.
|
||||
Some keyboards may have specific instructions for entering the bootloader. For example, the [Bootmagic](features/bootmagic) key (default: Escape) might be on a different key, e.g. Left Control; or the magic combination for Command (default: Left Shift+Right Shift) might require you to hold something else, e.g. Left Control+Right Control. Refer to the board's README file if you are unsure.
|
||||
|
||||
To put a device in bootloader mode with USBaspLoader, tap the `RESET` button while holding down the `BOOT` button.
|
||||
Alternatively, hold `BOOT` while inserting the USB cable.
|
||||
@@ -65,7 +65,7 @@ Run `pnputil /delete-driver oemXX.inf /uninstall`. This will delete the driver a
|
||||
As with the previous section, this process may need to be repeated multiple times, as multiple drivers can be applicable to the same device.
|
||||
|
||||
::: warning
|
||||
**WARNING:** Be *extremely careful* when doing this! You could potentially uninstall the driver for some other critical device. If you are unsure, double check the output of `/enum-drivers`, and omit the `/uninstall` flag when running `/delete-driver`.
|
||||
Be *extremely careful* when doing this! You could potentially uninstall the driver for some other critical device. If you are unsure, double check the output of `/enum-drivers`, and omit the `/uninstall` flag when running `/delete-driver`.
|
||||
:::
|
||||
|
||||
## List of Known Bootloaders
|
||||
@@ -98,6 +98,7 @@ The device name here is the name that appears in Zadig, and may not be what the
|
||||
|`bootloadhid` |HIDBoot |`16C0:05DF` |HidUsb |
|
||||
|`usbasploader`|USBasp |`16C0:05DC` |libusbK|
|
||||
|`apm32-dfu` |APM32 DFU ISP Mode |`314B:0106` |WinUSB |
|
||||
|`at32-dfu` |AT32 Bootloader DFU |`2E3C:DF11` |WinUSB |
|
||||
|`stm32-dfu` |STM32 BOOTLOADER |`0483:DF11` |WinUSB |
|
||||
|`gd32v-dfu` |GD32V BOOTLOADER |`28E9:0189` |WinUSB |
|
||||
|`kiibohd` |Kiibohd DFU Bootloader |`1C11:B007` |WinUSB |
|
||||
|
173
docs/drivers/adc.md
Normal file
173
docs/drivers/adc.md
Normal file
@@ -0,0 +1,173 @@
|
||||
# ADC Driver
|
||||
|
||||
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](../features/encoders).
|
||||
|
||||
This driver currently supports both AVR and a limited selection of ARM devices. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V for AVR, 3.3V only for ARM), however on ARM there is more flexibility in control of operation through `#define`s if you need more precision.
|
||||
|
||||
## Usage
|
||||
|
||||
To use this driver, add the following to your `rules.mk`:
|
||||
|
||||
```make
|
||||
ANALOG_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
Then place this include at the top of your code:
|
||||
|
||||
```c
|
||||
#include "analog.h"
|
||||
```
|
||||
|
||||
## Channels
|
||||
|
||||
### AVR
|
||||
|
||||
|Channel|AT90USB64/128|ATmega16/32U4|ATmega32A|ATmega328/P|
|
||||
|-------|-------------|-------------|---------|----------|
|
||||
|0 |`F0` |`F0` |`A0` |`C0` |
|
||||
|1 |`F1` |`F1` |`A1` |`C1` |
|
||||
|2 |`F2` | |`A2` |`C2` |
|
||||
|3 |`F3` | |`A3` |`C3` |
|
||||
|4 |`F4` |`F4` |`A4` |`C4` |
|
||||
|5 |`F5` |`F5` |`A5` |`C5` |
|
||||
|6 |`F6` |`F6` |`A6` |* |
|
||||
|7 |`F7` |`F7` |`A7` |* |
|
||||
|8 | |`D4` | | |
|
||||
|9 | |`D6` | | |
|
||||
|10 | |`D7` | | |
|
||||
|11 | |`B4` | | |
|
||||
|12 | |`B5` | | |
|
||||
|13 | |`B6` | | |
|
||||
|
||||
<sup>\* The ATmega328/P possesses two extra ADC channels; however, they are not present on the DIP pinout, and are not shared with GPIO pins. You can use `adc_read()` directly to gain access to these.</sup>
|
||||
|
||||
### ARM
|
||||
|
||||
#### STM32
|
||||
|
||||
Note that some of these pins are doubled-up on ADCs with the same channel. This is because the pins can be used for either ADC.
|
||||
|
||||
Also note that the F0 and F3 use different numbering schemes. The F0 has a single ADC and the channels are 0-indexed, whereas the F3 has 4 ADCs and the channels are 1-indexed. This is because the F0 uses the `ADCv1` implementation of the ADC, whereas the F3 uses the `ADCv3` implementation.
|
||||
|
||||
|ADC|Channel|STM32F0xx|STM32F1xx|STM32F3xx|STM32F4xx|
|
||||
|---|-------|---------|---------|---------|---------|
|
||||
|1 |0 |`A0` |`A0` | |`A0` |
|
||||
|1 |1 |`A1` |`A1` |`A0` |`A1` |
|
||||
|1 |2 |`A2` |`A2` |`A1` |`A2` |
|
||||
|1 |3 |`A3` |`A3` |`A2` |`A3` |
|
||||
|1 |4 |`A4` |`A4` |`A3` |`A4` |
|
||||
|1 |5 |`A5` |`A5` |`F4` |`A5` |
|
||||
|1 |6 |`A6` |`A6` |`C0` |`A6` |
|
||||
|1 |7 |`A7` |`A7` |`C1` |`A7` |
|
||||
|1 |8 |`B0` |`B0` |`C2` |`B0` |
|
||||
|1 |9 |`B1` |`B1` |`C3` |`B1` |
|
||||
|1 |10 |`C0` |`C0` |`F2` |`C0` |
|
||||
|1 |11 |`C1` |`C1` | |`C1` |
|
||||
|1 |12 |`C2` |`C2` | |`C2` |
|
||||
|1 |13 |`C3` |`C3` | |`C3` |
|
||||
|1 |14 |`C4` |`C4` | |`C4` |
|
||||
|1 |15 |`C5` |`C5` | |`C5` |
|
||||
|1 |16 | | | | |
|
||||
|2 |0 | |`A0`¹ | |`A0`² |
|
||||
|2 |1 | |`A1`¹ |`A4` |`A1`² |
|
||||
|2 |2 | |`A2`¹ |`A5` |`A2`² |
|
||||
|2 |3 | |`A3`¹ |`A6` |`A3`² |
|
||||
|2 |4 | |`A4`¹ |`A7` |`A4`² |
|
||||
|2 |5 | |`A5`¹ |`C4` |`A5`² |
|
||||
|2 |6 | |`A6`¹ |`C0` |`A6`² |
|
||||
|2 |7 | |`A7`¹ |`C1` |`A7`² |
|
||||
|2 |8 | |`B0`¹ |`C2` |`B0`² |
|
||||
|2 |9 | |`B1`¹ |`C3` |`B1`² |
|
||||
|2 |10 | |`C0`¹ |`F2` |`C0`² |
|
||||
|2 |11 | |`C1`¹ |`C5` |`C1`² |
|
||||
|2 |12 | |`C2`¹ |`B2` |`C2`² |
|
||||
|2 |13 | |`C3`¹ | |`C3`² |
|
||||
|2 |14 | |`C4`¹ | |`C4`² |
|
||||
|2 |15 | |`C5`¹ | |`C5`² |
|
||||
|2 |16 | | | | |
|
||||
|3 |0 | |`A0`¹ | |`A0`² |
|
||||
|3 |1 | |`A1`¹ |`B1` |`A1`² |
|
||||
|3 |2 | |`A2`¹ |`E9` |`A2`² |
|
||||
|3 |3 | |`A3`¹ |`E13` |`A3`² |
|
||||
|3 |4 | |`F6`¹ | |`F6`² |
|
||||
|3 |5 | |`F7`¹ |`B13` |`F7`² |
|
||||
|3 |6 | |`F8`¹ |`E8` |`F8`² |
|
||||
|3 |7 | |`F9`¹ |`D10` |`F9`² |
|
||||
|3 |8 | |`F10`¹ |`D11` |`F10`² |
|
||||
|3 |9 | | |`D12` |`F3`² |
|
||||
|3 |10 | |`C0`¹ |`D13` |`C0`² |
|
||||
|3 |11 | |`C1`¹ |`D14` |`C1`² |
|
||||
|3 |12 | |`C2`¹ |`B0` |`C2`² |
|
||||
|3 |13 | |`C3`¹ |`E7` |`C3`² |
|
||||
|3 |14 | | |`E10` |`F4`² |
|
||||
|3 |15 | | |`E11` |`F5`² |
|
||||
|3 |16 | | |`E12` | |
|
||||
|4 |1 | | |`E14` | |
|
||||
|4 |2 | | |`E15` | |
|
||||
|4 |3 | | |`B12` | |
|
||||
|4 |4 | | |`B14` | |
|
||||
|4 |5 | | |`B15` | |
|
||||
|4 |6 | | |`E8` | |
|
||||
|4 |7 | | |`D10` | |
|
||||
|4 |8 | | |`D11` | |
|
||||
|4 |9 | | |`D12` | |
|
||||
|4 |10 | | |`D13` | |
|
||||
|4 |11 | | |`D14` | |
|
||||
|4 |12 | | |`D8` | |
|
||||
|4 |13 | | |`D9` | |
|
||||
|4 |14 | | | | |
|
||||
|4 |15 | | | | |
|
||||
|4 |16 | | | | |
|
||||
|
||||
<sup>¹ As of ChibiOS 20.3.4, the ADC driver for STM32F1xx devices supports only ADC1, therefore any configurations involving ADC2 or ADC3 cannot actually be used. In particular, pins `F6`…`F10`, which are present at least on some STM32F103x[C-G] devices, cannot be used as ADC inputs because of this driver limitation.</sup>
|
||||
|
||||
<sup>² Not all STM32F4xx devices have ADC2 and/or ADC3, therefore some configurations shown in this table may be unavailable; in particular, pins `F4`…`F10` cannot be used as ADC inputs on devices which do not have ADC3. Check the device datasheet to confirm which pin functions are supported.</sup>
|
||||
|
||||
#### RP2040
|
||||
|
||||
RP2040 has only a single ADC (`ADCD1` in ChibiOS); in the QMK API the index for that ADC is 0.
|
||||
|
||||
|Channel|Pin |
|
||||
|-------|-------------------|
|
||||
|0 |`GP26` |
|
||||
|1 |`GP27` |
|
||||
|2 |`GP28` |
|
||||
|3 |`GP29` |
|
||||
|4 |Temperature sensor*|
|
||||
|
||||
|
||||
<sup>* The temperature sensor is disabled by default and needs to be enabled by the RP2040-specific function: `adcRPEnableTS(&ADCD1)`. The ADC must be initialized before calling that function; an easy way to ensure that is to perform a dummy conversion.</sup>
|
||||
|
||||
## Functions
|
||||
|
||||
### AVR
|
||||
|
||||
|Function |Description |
|
||||
|----------------------------|-------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReference(mode)` |Sets the analog voltage reference source. Must be one of `ADC_REF_EXTERNAL`, `ADC_REF_POWER` or `ADC_REF_INTERNAL`.|
|
||||
|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `F6` for ADC6 on the ATmega32U4. |
|
||||
|`pinToMux(pin)` |Translates a given pin to a mux value. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
||||
|`adc_read(mux)` |Reads the value from the ADC according to the specified mux. See your MCU's datasheet for more information. |
|
||||
|
||||
### ARM
|
||||
|
||||
|Function |Description |
|
||||
|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`analogReadPin(pin)` |Reads the value from the specified pin, eg. `A0` for channel 0 on the STM32F0 and ADC1 channel 1 on the STM32F3. Note that if a pin can be used for multiple ADCs, it will pick the lower numbered ADC for this function. eg. `C0` will be channel 6 of ADC 1 when it could be used for ADC 2 as well.|
|
||||
|`analogReadPinAdc(pin, adc)`|Reads the value from the specified pin and ADC, eg. `C0, 1` will read from channel 6, ADC 2 instead of ADC 1. Note that the ADCs are 0-indexed for this function. |
|
||||
|`pinToMux(pin)` |Translates a given pin to a channel and ADC combination. If an unsupported pin is given, returns the mux value for "0V (GND)". |
|
||||
|`adc_read(mux)` |Reads the value from the ADC according to the specified pin and ADC combination. See your MCU's datasheet for more information. |
|
||||
|
||||
## Configuration
|
||||
|
||||
## ARM
|
||||
|
||||
The ARM implementation of the ADC has a few additional options that you can override in your own keyboards and keymaps to change how it operates. Please consult the corresponding `hal_adc_lld.h` in ChibiOS for your specific microcontroller for further documentation on your available options.
|
||||
|
||||
|`#define` |Type |Default |Description |
|
||||
|---------------------|------|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
|`ADC_CIRCULAR_BUFFER`|`bool`|`false` |If `true`, then the implementation will use a circular buffer. |
|
||||
|`ADC_NUM_CHANNELS` |`int` |`1` |Sets the number of channels that will be scanned as part of an ADC operation. The current implementation only supports `1`. |
|
||||
|`ADC_BUFFER_DEPTH` |`int` |`2` |Sets the depth of each result. Since we are only getting a 10-bit result by default, we set this to 2 bytes so we can contain our one value. This could be set to 1 if you opt for an 8-bit or lower result.|
|
||||
|`ADC_SAMPLING_RATE` |`int` |`ADC_SMPR_SMP_1P5` |Sets the sampling rate of the ADC. By default, it is set to the fastest setting. |
|
||||
|`ADC_RESOLUTION` |`int` |`ADC_CFGR1_RES_10BIT` or `ADC_CFGR_RES_10BITS`|The resolution of your result. We choose 10 bit by default, but you can opt for 12, 10, 8, or 6 bit. Different MCUs use slightly different names for the resolution constants. |
|
80
docs/drivers/apa102.md
Normal file
80
docs/drivers/apa102.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# APA102 Driver {#apa102-driver}
|
||||
|
||||
This driver provides support for APA102 addressable RGB LEDs. They are similar to the [WS2812](ws2812) LEDs, but have increased data and refresh rates.
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
In most cases, the APA102 driver code is automatically included if you are using either the [RGBLight](../features/rgblight) or [RGB Matrix](../features/rgb_matrix) 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 {#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 {#api}
|
||||
|
||||
### `void apa102_init(void)` {#api-apa102-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
---
|
||||
|
||||
### `void apa102_set_color(uint16_t index, uint8_t red, uint8_t green, uint8_t blue)` {#api-apa102-set-color}
|
||||
|
||||
Set the color of a single LED. This function does not immediately update the LEDs; call `apa102_flush()` after you are finished.
|
||||
|
||||
#### Arguments {#api-apa102-set-color-arguments}
|
||||
|
||||
- `uint16_t index`
|
||||
The LED index in the APA102 chain.
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void apa102_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-apa102-set-color-all}
|
||||
|
||||
Set the color of all LEDs.
|
||||
|
||||
#### Arguments {#api-apa102-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void apa102_flush(void)` {#api-apa102-flush}
|
||||
|
||||
Flush the PWM values to the LED chain.
|
||||
|
||||
---
|
||||
|
||||
### `void apa102_set_brightness(uint8_t brightness)` {#api-apa102-set-brightness}
|
||||
|
||||
Set the global brightness.
|
||||
|
||||
#### Arguments {#api-apa102-set-brightness-arguments}
|
||||
|
||||
- `uint8_t brightness`
|
||||
The brightness level to set, from 0 to 31.
|
255
docs/drivers/audio.md
Normal file
255
docs/drivers/audio.md
Normal file
@@ -0,0 +1,255 @@
|
||||
# Audio Driver {#audio-driver}
|
||||
|
||||
The [Audio feature](../features/audio) breaks the hardware specifics out into separate, exchangeable driver units, with a common interface to the audio-"core" - which itself handles playing songs and notes while tracking their progress in an internal state, initializing/starting/stopping the driver as needed.
|
||||
|
||||
Not all MCUs support every available driver, either the platform-support is not there (yet?) or the MCU simply does not have the required hardware peripheral.
|
||||
|
||||
|
||||
## AVR {#avr}
|
||||
|
||||
Boards built around an Atmega32U4 can use two sets of PWM capable pins, each driving a separate speaker.
|
||||
The possible configurations are:
|
||||
|
||||
| | Timer3 | Timer1 |
|
||||
|--------------|-------------|--------------|
|
||||
| one speaker | C4,C5 or C6 | |
|
||||
| one speaker | | B4, B5 or B7 |
|
||||
| two speakers | C4,C5 or C6 | B4, B5 or B7 |
|
||||
|
||||
Currently there is only one/default driver for AVR based boards, which is automatically configured to:
|
||||
|
||||
```make
|
||||
AUDIO_DRIVER = pwm_hardware
|
||||
```
|
||||
|
||||
|
||||
## ARM {#arm}
|
||||
|
||||
For Arm based boards, QMK depends on ChibiOS - hence any MCU supported by the later is likely usable, as long as certain hardware peripherals are available.
|
||||
|
||||
Supported wiring configurations, with their ChibiOS/MCU peripheral requirement are listed below;
|
||||
piezo speakers are marked with :one: for the first/primary and :two: for the secondary.
|
||||
|
||||
| driver | GPTD6<br>Tim6 | GPTD7<br>Tim7 | GPTD8<br>Tim8 | PWMD1<sup>1</sup><br>Tim1_Ch1 |
|
||||
|--------------|------------------------------------------|------------------------|---------------|-------------------------------|
|
||||
| dac_basic | A4+DACD1 = :one: | A5+DACD2 = :one: | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | A5+DACD2 = :two: + Gnd | state | |
|
||||
| | A4+DACD1 = :two: + Gnd | A5+DACD2 = :one: + Gnd | state | |
|
||||
| | A4+DACD1 = :one: + Gnd | | state | |
|
||||
| | | A5+DACD2 = :one: + Gnd | state | |
|
||||
| dac_additive | A4+DACD1 = :one: + Gnd | | | |
|
||||
| | A5+DACD2 = :one: + Gnd | | | |
|
||||
| | A4+DACD1 + A5+DACD2 = :one: <sup>2</sup> | | | |
|
||||
| pwm_software | state-update | | | any = :one: |
|
||||
| pwm hardware | state-update | | | A8 = :one: <sup>3</sup> |
|
||||
|
||||
|
||||
<sup>1</sup>: the routing and alternate functions for PWM differ sometimes between STM32 MCUs, if in doubt consult the data-sheet
|
||||
<sup>2</sup>: one piezo connected to A4 and A5, with AUDIO_PIN_ALT_AS_NEGATIVE set
|
||||
<sup>3</sup>: TIM1_CH1 = A8 on STM32F103C8, other combinations are possible, see Data-sheet. configured with: AUDIO_PWM_DRIVER and AUDIO_PWM_CHANNEL
|
||||
|
||||
|
||||
|
||||
### DAC basic {#dac-basic}
|
||||
|
||||
The default driver for ARM boards, in absence of an overriding configuration.
|
||||
This driver needs one Timer per enabled/used DAC channel, to trigger conversion; and a third timer to trigger state updates with the audio-core.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timers 6, 7 and 8:
|
||||
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_DAC TRUE // [!code focus]
|
||||
#define HAL_USE_GPT TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM7 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM7 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM8 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM8 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Note: DAC1 (A4) uses TIM6, DAC2 (A5) uses TIM7, and the audio state timer uses TIM8 (configurable).
|
||||
:::
|
||||
|
||||
You can also change the timer used for the overall audio state by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD9
|
||||
```
|
||||
|
||||
### DAC additive {#dac-additive}
|
||||
|
||||
only needs one timer (GPTD6, Tim6) to trigger the DAC unit to do a conversion; the audio state updates are in turn triggered during the DAC callback.
|
||||
|
||||
Additionally, in the board config, you'll want to make changes to enable the DACs, GPT for Timer 6:
|
||||
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_DAC TRUE // [!code focus]
|
||||
#define HAL_USE_GPT TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_DAC_USE_DAC1_CH1 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH1 TRUE // [!code focus]
|
||||
#undef STM32_DAC_USE_DAC1_CH2 // [!code focus]
|
||||
#define STM32_DAC_USE_DAC1_CH2 TRUE // [!code focus]
|
||||
#undef STM32_GPT_USE_TIM6 // [!code focus]
|
||||
#define STM32_GPT_USE_TIM6 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
### DAC Config
|
||||
|
||||
| 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 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, number of simultaneous tones and buffer size, instead of using one of the listed presets.
|
||||
|
||||
| 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 {#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
|
||||
/* zero crossing (or approach, whereas zero == DAC_OFF_VALUE, which can be configured to anything from 0 to DAC_SAMPLE_MAX)
|
||||
* ============================*=*========================== AUDIO_DAC_SAMPLE_MAX
|
||||
* * *
|
||||
* * *
|
||||
* ---------------------------------------------------------
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* --------------------------------------------------------- AUDIO_DAC_OFF_VALUE
|
||||
* * * } AUDIO_DAC_SAMPLE_MAX/100
|
||||
* ---------------------------------------------------------
|
||||
* *
|
||||
* * *
|
||||
* * *
|
||||
* =====*=*================================================= 0x0
|
||||
*/
|
||||
```
|
||||
|
||||
|
||||
### PWM hardware {#pwm-hardware}
|
||||
|
||||
This driver uses the ChibiOS-PWM system to produce a square-wave on specific output pins that are connected to the PWM hardware.
|
||||
The hardware directly toggles the pin via its alternate function. See your MCU's data-sheet for which pin can be driven by what timer - looking for TIMx_CHy and the corresponding alternate function.
|
||||
|
||||
A configuration example for the STM32F103C8 would be:
|
||||
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_PWM TRUE // [!code focus]
|
||||
#define HAL_USE_PAL TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_PWM_USE_TIM1 // [!code focus]
|
||||
#define STM32_PWM_USE_TIM1 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
If we now target pin A8, looking through the data-sheet of the STM32F103C8, for the timers and alternate functions
|
||||
- TIM1_CH1 = PA8 <- alternate0
|
||||
- TIM1_CH2 = PA9
|
||||
- TIM1_CH3 = PA10
|
||||
- TIM1_CH4 = PA11
|
||||
|
||||
with all this information, the configuration would contain these lines:
|
||||
```c
|
||||
//config.h:
|
||||
#define AUDIO_PIN A8
|
||||
#define AUDIO_PWM_DRIVER PWMD1
|
||||
#define AUDIO_PWM_CHANNEL 1
|
||||
```
|
||||
|
||||
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 {#pwm-software}
|
||||
|
||||
This driver uses the PWM callbacks from PWMD1 with TIM1_CH1 to toggle the selected AUDIO_PIN in software.
|
||||
During the same callback, with AUDIO_PIN_ALT_AS_NEGATIVE set, the AUDIO_PIN_ALT is toggled inversely to AUDIO_PIN. This is useful for setups that drive a piezo from two pins (instead of one and Gnd).
|
||||
|
||||
You can also change the timer used for software PWM by defining the driver. For instance:
|
||||
|
||||
```c
|
||||
#define AUDIO_STATE_TIMER GPTD8
|
||||
```
|
||||
|
||||
|
||||
### Testing Notes {#testing-notes}
|
||||
|
||||
While not an exhaustive list, the following table provides the scenarios that have been partially validated:
|
||||
|
||||
| | DAC basic | DAC additive | PWM hardware | PWM software |
|
||||
| ------------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
|
||||
| Atmega32U4 | :o: | :o: | :heavy_check_mark: | :o: |
|
||||
| RP2040 | :x: | :x: | :heavy_check_mark: | ? |
|
||||
| STM32F103C8 (bluepill) | :x: | :x: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| STM32F303CCT6 (proton-c) | :heavy_check_mark: | :heavy_check_mark: | ? | :heavy_check_mark: |
|
||||
| STM32F405VG | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| L0xx | :x: (no Tim8) | ? | ? | ? |
|
||||
|
||||
:heavy_check_mark: : works and was tested
|
||||
:o: : does not apply
|
||||
:x: : not supported by MCU
|
||||
|
||||
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
|
133
docs/drivers/aw20216s.md
Normal file
133
docs/drivers/aw20216s.md
Normal file
@@ -0,0 +1,133 @@
|
||||
# AW20216S Driver {#aw20216s-driver}
|
||||
|
||||
SPI 18x12 LED matrix driver by Awinic. Supports a maximum of four drivers, each controlling up to 216 single-color LEDs, or 72 RGB LEDs.
|
||||
|
||||
[AW20216S Datasheet](https://doc.awinic.com/doc/20230609wm/b6a9c70b-e1bd-495b-925f-bcbed3fc2620.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The AW20216S driver code is automatically included if you are using the [RGB Matrix](../features/rgb_matrix) feature with the `aw20216s` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led
|
||||
SRC += aw20216s.c
|
||||
SPI_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|-----------------------------|-------------|-------------------------------------------------------------|
|
||||
|`AW20216S_CS_PIN_1` |*Not defined*|The GPIO pin connected to the first driver's Chip Select pin |
|
||||
|`AW20216S_CS_PIN_2` |*Not defined*|The GPIO pin connected to the second driver's Chip Select pin|
|
||||
|`AW20216S_EN_PIN` |*Not defined*|The GPIO pin connected to the drivers' Enable pins |
|
||||
|`AW20216S_SPI_MODE` |`0` |The SPI mode to use |
|
||||
|`AW20216S_SPI_DIVISOR` |`4` |The SPI divisor to use |
|
||||
|`AW20216S_SCALING_MAX` |`150` |The scaling value |
|
||||
|`AW20216S_GLOBAL_CURRENT_MAX`|`150` |The global current control value |
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. To adjust it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define AW20216S_GLOBAL_CURRENT_MAX 150
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure SPI](spi#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const aw20216s_led_t PROGMEM g_aw20216s_leds[AW20216S_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the first LED index on driver 0 has its red channel on `SW1_CS1`, green on `SW1_CS2` and blue on `SW1_CS3`.
|
||||
|
||||
These values correspond to the matrix locations as shown in the datasheet on page 16, figure 16.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct aw20216s_led_t` {#api-aw20216s-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-aw20216s-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel.
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel.
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void aw20216s_init(pin_t cs_pin)` {#api-aw20216s-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-aw20216s-init-arguments}
|
||||
|
||||
- `pin_t cs_pin`
|
||||
The GPIO connected to the Chip Select pin of the LED driver to initialize.
|
||||
|
||||
---
|
||||
|
||||
### `void aw20216s_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-aw20216s-set-color}
|
||||
|
||||
Set the color of a single LED. This function does not immediately update the LEDs; call `aw20216s_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-aw20216s-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_aw20216s_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void aw20216s_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-aw20216s-set-color-all}
|
||||
|
||||
Set the color of all LEDs.
|
||||
|
||||
#### Arguments {#api-aw20216s-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void aw20216s_update_pwm_buffers(pin_t cs_pin, uint8_t index)` {#api-aw20216s-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-aw20216s-update-pwm-buffers-arguments}
|
||||
|
||||
- `pin_t cs_pin`
|
||||
The GPIO connected to the Chip Select pin of the driver.
|
||||
- `uint8_t index`
|
||||
The index of the driver.
|
181
docs/drivers/eeprom.md
Normal file
181
docs/drivers/eeprom.md
Normal file
@@ -0,0 +1,181 @@
|
||||
# EEPROM Driver Configuration {#eeprom-driver-configuration}
|
||||
|
||||
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
|
||||
|
||||
Selecting the EEPROM driver is done in your keyboard's `rules.mk`:
|
||||
|
||||
Driver | Description
|
||||
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
|
||||
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
|
||||
`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
|
||||
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
|
||||
`EEPROM_DRIVER = wear_leveling` | Frontend driver for the wear_leveling system, allowing for EEPROM emulation on top of flash -- both in-MCU and external SPI NOR flash.
|
||||
|
||||
## Vendor Driver Configuration {#vendor-eeprom-driver-configuration}
|
||||
|
||||
#### STM32 L0/L1 Configuration {#stm32l0l1-eeprom-driver-configuration}
|
||||
|
||||
::: warning
|
||||
Resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.
|
||||
:::
|
||||
|
||||
`config.h` override | Description | Default Value
|
||||
------------------------------------|--------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------
|
||||
`#define STM32_ONBOARD_EEPROM_SIZE` | The size of the EEPROM to use, in bytes. Erase times can be high, so it's configurable here, if not using the default value. | Minimum required to cover base _eeconfig_ data, or `1024` if VIA is enabled.
|
||||
|
||||
## I2C Driver Configuration {#i2c-eeprom-driver-configuration}
|
||||
|
||||
Currently QMK supports 24xx-series chips over I2C. As such, requires a working i2c_master driver configuration. You can override the driver configuration via your config.h:
|
||||
|
||||
`config.h` override | Description | Default Value
|
||||
------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------
|
||||
`#define EXTERNAL_EEPROM_I2C_BASE_ADDRESS` | Base I2C address for the EEPROM -- shifted left by 1 as per i2c_master requirements | 0b10100000
|
||||
`#define EXTERNAL_EEPROM_I2C_ADDRESS(addr)` | Calculated I2C address for the EEPROM | `(EXTERNAL_EEPROM_I2C_BASE_ADDRESS)`
|
||||
`#define EXTERNAL_EEPROM_BYTE_COUNT` | Total size of the EEPROM in bytes | 8192
|
||||
`#define EXTERNAL_EEPROM_PAGE_SIZE` | Page size of the EEPROM in bytes, as specified in the datasheet | 32
|
||||
`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | The number of bytes to transmit for the memory location within the EEPROM | 2
|
||||
`#define EXTERNAL_EEPROM_WRITE_TIME` | Write cycle time of the EEPROM, as specified in the datasheet | 5
|
||||
`#define EXTERNAL_EEPROM_WP_PIN` | If defined the WP pin will be toggled appropriately when writing to the EEPROM. | _none_
|
||||
|
||||
Some I2C EEPROM manufacturers explicitly recommend against hardcoding the WP pin to ground. This is in order to protect the eeprom memory content during power-up/power-down/brown-out conditions at low voltage where the eeprom is still operational, but the i2c master output might be unpredictable. If a WP pin is configured, then having an external pull-up on the WP pin is recommended.
|
||||
|
||||
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_i2c.h`.
|
||||
|
||||
Alternatively, there are pre-defined hardware configurations for available chips/modules:
|
||||
|
||||
Module | Equivalent `#define` | Source
|
||||
-----------------|---------------------------------|------------------------------------------
|
||||
CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` | <https://www.sparkfun.com/products/14764>
|
||||
RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` | <https://www.sparkfun.com/products/14764>
|
||||
24LC32A EEPROM | `#define EEPROM_I2C_24LC32A` | <https://www.microchip.com/en-us/product/24LC32A>
|
||||
24LC64 EEPROM | `#define EEPROM_I2C_24LC64` | <https://www.microchip.com/en-us/product/24LC64>
|
||||
24LC128 EEPROM | `#define EEPROM_I2C_24LC128` | <https://www.microchip.com/en-us/product/24LC128>
|
||||
24LC256 EEPROM | `#define EEPROM_I2C_24LC256` | <https://www.sparkfun.com/products/525>
|
||||
MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/product/1895>
|
||||
|
||||
::: tip
|
||||
If you find that the EEPROM is not cooperating, ensure you've correctly shifted up your EEPROM address by 1. For example, the datasheet might state the address as `0b01010000` -- the correct value of `EXTERNAL_EEPROM_I2C_BASE_ADDRESS` needs to be `0b10100000`.
|
||||
:::
|
||||
|
||||
## SPI Driver Configuration {#spi-eeprom-driver-configuration}
|
||||
|
||||
Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
|
||||
|
||||
`config.h` override | Default Value | Description
|
||||
-----------------------------------------------|---------------|-------------------------------------------------------------------------------------
|
||||
`#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | _none_ | SPI Slave select pin in order to inform that the EEPROM is currently being addressed
|
||||
`#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | `64` | Clock divisor used to divide the peripheral clock to derive the SPI frequency
|
||||
`#define EXTERNAL_EEPROM_BYTE_COUNT` | `8192` | Total size of the EEPROM in bytes
|
||||
`#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>
|
||||
|
||||
::: warning
|
||||
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 {#transient-eeprom-driver-configuration}
|
||||
|
||||
The only configurable item for the transient EEPROM driver is its size:
|
||||
|
||||
`config.h` override | Description | Default Value
|
||||
------------------------------- | ----------------------------------------- | -------------
|
||||
`#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64
|
||||
|
||||
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`.
|
||||
|
||||
## Wear-leveling Driver Configuration {#wear_leveling-eeprom-driver-configuration}
|
||||
|
||||
The wear-leveling driver uses an algorithm to minimise the number of erase cycles on the underlying MCU flash memory.
|
||||
|
||||
There is no specific configuration for this driver, but the wear-leveling system used by this driver may need configuration. See the [wear-leveling configuration](#wear_leveling-configuration) section for more information.
|
||||
|
||||
# Wear-leveling Configuration {#wear_leveling-configuration}
|
||||
|
||||
The wear-leveling driver has a few possible _backing stores_ that may be used by adding to your keyboard's `rules.mk` file:
|
||||
|
||||
Driver | Description
|
||||
----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
`WEAR_LEVELING_DRIVER = embedded_flash` | This driver is used for emulating EEPROM by writing to embedded flash on the MCU.
|
||||
`WEAR_LEVELING_DRIVER = spi_flash` | This driver is used to address external SPI NOR Flash peripherals.
|
||||
`WEAR_LEVELING_DRIVER = rp2040_flash` | This driver is used to write to the same storage the RP2040 executes code from.
|
||||
`WEAR_LEVELING_DRIVER = legacy` | This driver is the "legacy" emulated EEPROM provided in historical revisions of QMK. Currently used for STM32F0xx and STM32F4x1, but slated for deprecation and removal once `embedded_flash` support for those MCU families is complete.
|
||||
|
||||
::: warning
|
||||
All wear-leveling drivers require an amount of RAM equivalent to the selected logical EEPROM size. Increasing the size to 32kB of EEPROM requires 32kB of RAM, which a significant number of MCUs simply do not have.
|
||||
:::
|
||||
|
||||
## Wear-leveling Embedded Flash Driver Configuration {#wear_leveling-efl-driver-configuration}
|
||||
|
||||
This driver performs writes to the embedded flash storage embedded in the MCU. In most circumstances, the last few of sectors of flash are used in order to minimise the likelihood of collision with program code.
|
||||
|
||||
Configurable options in your keyboard's `config.h`:
|
||||
|
||||
`config.h` override | Default | Description
|
||||
---------------------------------------------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
`#define WEAR_LEVELING_EFL_FIRST_SECTOR` | _unset_ | The first sector on the MCU to use. By default this is not defined and calculated at runtime based on the MCU. However, different flash sizes on MCUs may require custom configuration.
|
||||
`#define WEAR_LEVELING_EFL_FLASH_SIZE` | _unset_ | Allows overriding the flash size available for use for wear-leveling. Under normal circumstances this is automatically calculated and should not need to be overridden. Specifying a size larger than the amount actually available in flash will usually prevent the MCU from booting.
|
||||
`#define WEAR_LEVELING_EFL_OMIT_LAST_SECTOR_COUNT` | `0` | Number of sectors to omit at the end of the flash. These sectors will not be allocated to the driver and the usable flash block will be offset, but keeping the set flash size. Useful on devices with bootloaders requiring a check flag at the end of flash to be present in order to confirm a valid, bootable firmware.
|
||||
`#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.
|
||||
|
||||
::: warning
|
||||
If your MCU does not boot after swapping to the EFL wear-leveling driver, it's likely that the flash size is incorrectly detected, usually as an MCU with larger flash and may require overriding.
|
||||
:::
|
||||
|
||||
## Wear-leveling SPI Flash Driver Configuration {#wear_leveling-flash_spi-driver-configuration}
|
||||
|
||||
This driver performs writes to an external SPI NOR Flash peripheral. It also requires a working configuration for the SPI NOR Flash peripheral -- see the [flash driver](flash) documentation for more information.
|
||||
|
||||
Configurable options in your keyboard's `config.h`:
|
||||
|
||||
`config.h` override | Default | Description
|
||||
----------------------------------------------------|--------------------------------|--------------------------------------------------------------------------------------------------------------------------------
|
||||
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT` | `1` | Number of blocks in the external flash used by the wear-leveling algorithm.
|
||||
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET` | `0` | The index first block in the external flash used by the wear-leveling algorithm.
|
||||
`#define WEAR_LEVELING_LOGICAL_SIZE` | `((block_count*block_size)/2)` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM. Result must be <= 64kB.
|
||||
`#define WEAR_LEVELING_BACKING_SIZE` | `(block_count*block_size)` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
|
||||
`#define BACKING_STORE_WRITE_SIZE` | `8` | The write width used whenever a write is performed on the external flash peripheral.
|
||||
|
||||
::: warning
|
||||
There is currently a limit of 64kB for the EEPROM subsystem within QMK, so using a larger flash is not going to be beneficial as the logical size cannot be increased beyond 65536. The backing size may be increased to a larger value, but erase timing may suffer as a result.
|
||||
:::
|
||||
|
||||
## Wear-leveling RP2040 Driver Configuration {#wear_leveling-rp2040-driver-configuration}
|
||||
|
||||
This driver performs writes to the same underlying storage that the RP2040 executes its code.
|
||||
|
||||
Configurable options in your keyboard's `config.h`:
|
||||
|
||||
`config.h` override | Default | Description
|
||||
------------------------------------------|----------------------------|--------------------------------------------------------------------------------------------------------------------------------
|
||||
`#define WEAR_LEVELING_RP2040_FLASH_SIZE` | `PICO_FLASH_SIZE_BYTES` | Number of bytes of flash on the board.
|
||||
`#define WEAR_LEVELING_RP2040_FLASH_BASE` | `(flash_size-sector_size)` | The byte-wise location that the backing storage should be located.
|
||||
`#define WEAR_LEVELING_LOGICAL_SIZE` | `(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.
|
||||
|
||||
## Wear-leveling Legacy EEPROM Emulation Driver Configuration {#wear_leveling-legacy-driver-configuration}
|
||||
|
||||
This driver performs writes to the embedded flash storage embedded in the MCU much like the normal Embedded Flash Driver, and is only for use with STM32F0xx and STM32F4x1 devices. This flash implementation is still currently provided as the EFL driver is currently non-functional for the previously mentioned families.
|
||||
|
||||
By default, `1024` bytes of emulated EEPROM is provided:
|
||||
|
||||
MCU | EEPROM Provided | Flash Used
|
||||
----------|-----------------|--------------
|
||||
STM32F042 | `1024` bytes | `2048` bytes
|
||||
STM32F070 | `1024` bytes | `2048` bytes
|
||||
STM32F072 | `1024` bytes | `2048` bytes
|
||||
STM32F401 | `1024` bytes | `16384` bytes
|
||||
STM32F411 | `1024` bytes | `16384` bytes
|
||||
|
||||
Under normal circumstances configuration of this driver requires intimate knowledge of the MCU's flash structure -- reconfiguration is at your own risk and will require referring to the code.
|
44
docs/drivers/gpio.md
Normal file
44
docs/drivers/gpio.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# GPIO Control {#gpio-control}
|
||||
|
||||
QMK has a GPIO control abstraction layer which is microcontroller agnostic. This is done to allow easy access to pin control across different platforms.
|
||||
|
||||
## Macros {#macros}
|
||||
|
||||
The following macros provide basic control of GPIOs and are found in `platforms/<platform>/gpio.h`.
|
||||
|
||||
|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) |
|
||||
|`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 {#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. 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}
|
||||
|
||||
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.
|
||||
|
||||
eg.
|
||||
```c
|
||||
void some_function(void) {
|
||||
// some process
|
||||
ATOMIC_BLOCK_FORCEON {
|
||||
// Atomic Processing
|
||||
}
|
||||
// some process
|
||||
}
|
||||
```
|
||||
|
||||
`ATOMIC_BLOCK_FORCEON` forces interrupts to be disabled before the block is executed, without regard to whether they are enabled or disabled. Then, after the block is executed, the interrupt is enabled.
|
||||
|
||||
Note that `ATOMIC_BLOCK_FORCEON` can therefore be used if you know that interrupts are enabled before the execution of the block, or if you know that it is OK to enable interrupts at the completion of the block.
|
297
docs/drivers/i2c.md
Normal file
297
docs/drivers/i2c.md
Normal file
@@ -0,0 +1,297 @@
|
||||
# I2C Master Driver {#i2c-master-driver}
|
||||
|
||||
The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs.
|
||||
|
||||
## Usage {#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](../features/oled_driver).
|
||||
|
||||
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 {#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
|
||||
the lower bit (indicating read/write) will be done by the respective functions. Almost all I2C addresses listed
|
||||
on datasheets and the internet will be represented as 7 bits occupying the lower 7 bits and will need to be
|
||||
shifted to the left (more significant) by one bit. This is easy to do via the bitwise shift operator `<< 1`.
|
||||
|
||||
You can either do this on each call to the functions below, or once in your definition of the address. For example, if your device has an address of `0x18`:
|
||||
|
||||
```c
|
||||
#define MY_I2C_ADDRESS (0x18 << 1)
|
||||
```
|
||||
|
||||
See https://www.robot-electronics.co.uk/i2c-tutorial for more information about I2C addressing and other technical details.
|
||||
|
||||
## AVR Configuration {#avr-configuration}
|
||||
|
||||
The following defines can be used to configure the I2C master driver:
|
||||
|
||||
|`config.h` Override|Description |Default |
|
||||
|-------------------|---------------------|--------|
|
||||
|`F_SCL` |Clock frequency in Hz|`400000`|
|
||||
|
||||
No further setup is required - just connect the `SDA` and `SCL` pins of your I2C devices to the matching pins on the MCU:
|
||||
|
||||
|MCU |`SCL`|`SDA`|
|
||||
|------------------|-----|-----|
|
||||
|ATmega16/32U4 |`D0` |`D1` |
|
||||
|AT90USB64/128 |`D0` |`D1` |
|
||||
|ATmega32A |`C0` |`C1` |
|
||||
|ATmega328/P |`C5` |`C4` |
|
||||
|
||||
::: tip
|
||||
The ATmega16/32U2 does not possess I2C functionality, and so cannot use this driver.
|
||||
:::
|
||||
|
||||
## ChibiOS/ARM Configuration {#arm-configuration}
|
||||
|
||||
You'll need to determine which pins can be used for I2C -- a an example, STM32 parts generally have multiple I2C peripherals, labeled I2C1, I2C2, I2C3 etc.
|
||||
|
||||
To enable I2C, modify your board's `halconf.h` to enable I2C, then modify your board's `mcuconf.h` to enable the peripheral you've chosen:
|
||||
|
||||
::: code-group
|
||||
```c [halconf.h]
|
||||
#pragma once
|
||||
|
||||
#define HAL_USE_I2C TRUE // [!code focus]
|
||||
|
||||
#include_next <halconf.h>
|
||||
```
|
||||
```c [mcuconf.h]
|
||||
#pragma once
|
||||
|
||||
#include_next <mcuconf.h>
|
||||
|
||||
#undef STM32_I2C_USE_I2C2 // [!code focus]
|
||||
#define STM32_I2C_USE_I2C2 TRUE // [!code focus]
|
||||
```
|
||||
:::
|
||||
|
||||
|`mcuconf.h` Setting |Description |Default|
|
||||
|----------------------------|----------------------------------------------------------------------------------|-------|
|
||||
|`STM32_I2C_BUSY_TIMEOUT` |Time in milliseconds until the I2C command is aborted if no response is received |`50` |
|
||||
|`STM32_I2C_XXX_IRQ_PRIORITY`|Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |`10` |
|
||||
|`STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit|`TRUE` |
|
||||
|`STM32_I2C_XXX_DMA_PRIORITY`|Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |`1` |
|
||||
|
||||
Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
|
||||
|
||||
|`config.h` Overrride |Description |Default|
|
||||
|------------------------|--------------------------------------------------------------|-------|
|
||||
|`I2C_DRIVER` |I2C peripheral to use - I2C1 -> `I2CD1`, I2C2 -> `I2CD2` etc. |`I2CD1`|
|
||||
|`I2C1_SCL_PIN` |The pin definition for SCL |`B6` |
|
||||
|`I2C1_SCL_PAL_MODE` |The alternate function mode for SCL |`4` |
|
||||
|`I2C1_SDA_PIN` |The pin definition for SDA |`B7` |
|
||||
|`I2C1_SDA_PAL_MODE` |The alternate function mode for SDA |`4` |
|
||||
|
||||
The following configuration values depend on the specific MCU in use.
|
||||
|
||||
### I2Cv1 {#arm-configuration-i2cv1}
|
||||
|
||||
* STM32F1xx
|
||||
* STM32F2xx
|
||||
* STM32F4xx
|
||||
* STM32L0xx
|
||||
* STM32L1xx
|
||||
|
||||
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#7_I2Cv1_configuration_structure) for the I2Cv1 configuration structure.
|
||||
|
||||
|`config.h` Override|Default |
|
||||
|-------------------|----------------|
|
||||
|`I2C1_OPMODE` |`OPMODE_I2C` |
|
||||
|`I2C1_CLOCK_SPEED` |`100000` |
|
||||
|`I2C1_DUTY_CYCLE` |`STD_DUTY_CYCLE`|
|
||||
|
||||
### I2Cv2 {#arm-configuration-i2cv2}
|
||||
|
||||
* STM32F0xx
|
||||
* STM32F3xx
|
||||
* STM32F7xx
|
||||
* STM32L4xx
|
||||
|
||||
See [this page](https://www.playembedded.org/blog/stm32-i2c-chibios/#8_I2Cv2_I2Cv3_configuration_structure) for the I2Cv2 configuration structure.
|
||||
|
||||
|`config.h` Override |Default|
|
||||
|---------------------|-------|
|
||||
|`I2C1_TIMINGR_PRESC` |`0U` |
|
||||
|`I2C1_TIMINGR_SCLDEL`|`7U` |
|
||||
|`I2C1_TIMINGR_SDADEL`|`0U` |
|
||||
|`I2C1_TIMINGR_SCLH` |`38U` |
|
||||
|`I2C1_TIMINGR_SCLL` |`129U` |
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `void i2c_init(void)` {#api-i2c-init}
|
||||
|
||||
Initialize the I2C driver. This function must be called only once, before any of the below functions can be called.
|
||||
|
||||
This function is weakly defined, meaning it can be overridden if necessary for your particular use case:
|
||||
|
||||
```c
|
||||
void i2c_init(void) {
|
||||
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
|
||||
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### `i2c_status_t i2c_transmit(uint8_t address, uint8_t *data, uint16_t length, uint16_t timeout)` {#api-i2c-transmit}
|
||||
|
||||
Send multiple bytes to the selected I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-transmit-arguments}
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#api-i2c-transmit-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_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-receive}
|
||||
|
||||
Receive multiple bytes from the selected I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-receive-arguments}
|
||||
|
||||
- `uint8_t address`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t *data`
|
||||
A pointer to the buffer to read into.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#api-i2c-receive-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_write_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register}
|
||||
|
||||
Writes to a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-write-register-arguments}
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to write to.
|
||||
- `uint8_t *data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#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_write_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-write-register16}
|
||||
|
||||
Writes to a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-write-register16-arguments}
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint16_t regaddr`
|
||||
The register address to write to.
|
||||
- `uint8_t *data`
|
||||
A pointer to the data to transmit.
|
||||
- `uint16_t length`
|
||||
The number of bytes to write. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#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_read_register(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register}
|
||||
|
||||
Reads from a register with an 8-bit address on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-read-register-arguments}
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint8_t regaddr`
|
||||
The register address to read from.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#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_read_register16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout)` {#api-i2c-read-register16}
|
||||
|
||||
Reads from a register with a 16-bit address (big endian) on the I2C device.
|
||||
|
||||
#### Arguments {#api-i2c-read-register16-arguments}
|
||||
|
||||
- `uint8_t devaddr`
|
||||
The 7-bit I2C address of the device.
|
||||
- `uint16_t regaddr`
|
||||
The register address to read from.
|
||||
- `uint16_t length`
|
||||
The number of bytes to read. Take care not to overrun the length of `data`.
|
||||
- `uint16_t timeout`
|
||||
The time in milliseconds to wait for a response from the target device.
|
||||
|
||||
#### Return Value {#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_ping_address(uint8_t address, uint16_t timeout)` {#api-i2c-ping-address}
|
||||
|
||||
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`.
|
194
docs/drivers/is31fl3218.md
Normal file
194
docs/drivers/is31fl3218.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# IS31FL3218 Driver {#is31fl3218-driver}
|
||||
|
||||
I²C LED driver by Lumissil. Supports up to 18 single-color LEDs, or 6 RGB LEDs.
|
||||
|
||||
[IS31FL3218 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3218_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3218 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3218` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3218-mono.c # For single-color
|
||||
SRC += is31fl3218.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|-------------|---------------------------------------------------|
|
||||
|`IS31FL3218_SDB_PIN` |*Not defined*|The GPIO pin connected to the driver's shutdown pin|
|
||||
|`IS31FL3218_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3218_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3218's 7-bit I²C address is `0x54`, available as `IS31FL3218_I2C_ADDRESS`.
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT] = {
|
||||
/* R G B */
|
||||
{OUT1, OUT2, OUT3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index all have their anodes connected to `VCC`, and their cathodes on the `OUT1`, `OUT2` and `OUT3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3218_led_t PROGMEM g_is31fl3218_leds[IS31FL3218_LED_COUNT] = {
|
||||
/* V */
|
||||
{OUT1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3218_led_t` {#api-is31fl3218-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3218-led-t-members}
|
||||
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_init(void)` {#api-is31fl3218-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_write_register(uint8_t reg, uint8_t data)` {#api-is31fl3218-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3218-write-register-arguments}
|
||||
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3218-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3218_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3218_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3218-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_value(int index, uint8_t value)` {#api-is31fl3218-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3218_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3218_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_value_all(uint8_t value)` {#api-is31fl3218-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3218-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3218_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3218_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3218-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3218_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3218-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3218_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_update_pwm_buffers(void)` {#api-is31fl3218-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3218_update_led_control_registers(void)` {#api-is31fl3218-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
228
docs/drivers/is31fl3236.md
Normal file
228
docs/drivers/is31fl3236.md
Normal file
@@ -0,0 +1,228 @@
|
||||
# IS31FL3236 Driver {#is31fl3236-driver}
|
||||
|
||||
I²C LED driver by Lumissil. Supports a maximum of four drivers, each controlling up to 36 single-color LEDs, or 12 RGB LEDs.
|
||||
|
||||
[IS31FL3236 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3236_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3236 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3236` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3236-mono.c # For single-color
|
||||
SRC += is31fl3236.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|-------------|----------------------------------------------------|
|
||||
|`IS31FL3236_SDB_PIN` |*Not defined*|The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3236_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3236_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3236_I2C_ADDRESS_1` |*Not defined*|The I²C address of driver 0 |
|
||||
|`IS31FL3236_I2C_ADDRESS_2` |*Not defined*|The I²C address of driver 1 |
|
||||
|`IS31FL3236_I2C_ADDRESS_3` |*Not defined*|The I²C address of driver 2 |
|
||||
|`IS31FL3236_I2C_ADDRESS_4` |*Not defined*|The I²C address of driver 3 |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3236 has four possible 7-bit I²C addresses, depending on how the `AD` pin is connected.
|
||||
|
||||
To configure this, set the `IS31FL3236_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|----------------------------|------|
|
||||
|`IS31FL3236_I2C_ADDRESS_GND`|`0x3C`|
|
||||
|`IS31FL3236_I2C_ADDRESS_SCL`|`0x3D`|
|
||||
|`IS31FL3236_I2C_ADDRESS_SDA`|`0x3E`|
|
||||
|`IS31FL3236_I2C_ADDRESS_VCC`|`0x3F`|
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT] = {
|
||||
/* Driver
|
||||
| R G B */
|
||||
{0, OUT1, OUT2, OUT3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their anodes connected to `VCC`, and their cathodes on the `OUT1`, `OUT2` and `OUT3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3236_led_t PROGMEM g_is31fl3236_leds[IS31FL3236_LED_COUNT] = {
|
||||
/* Driver
|
||||
| V */
|
||||
{0, OUT1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3236_led_t` {#api-is31fl3236-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3236-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_init(uint8_t index)` {#api-is31fl3236-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3236-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3236-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3236-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3236-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3236_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3236_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3236-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_value(int index, uint8_t value)` {#api-is31fl3236-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3236_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3236_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_value_all(uint8_t value)` {#api-is31fl3236-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3236-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3236_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3236_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3236-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3236_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3236-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3236_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_update_pwm_buffers(uint8_t index)` {#api-is31fl3236-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3236-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3236_update_led_control_registers(uint8_t index)` {#api-is31fl3236-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3236-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
300
docs/drivers/is31fl3729.md
Normal file
300
docs/drivers/is31fl3729.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# IS31FL3729 Driver {#is31fl3729-driver}
|
||||
|
||||
I²C 16x8/15x9 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 135 single-color LEDs, or 45 RGB LEDs.
|
||||
|
||||
[IS31FL3729 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3729_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3729 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3729` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3729-mono.c # For single-color
|
||||
SRC += is31fl3729.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|--------------------------------------|----------------------------------------------------|
|
||||
|`IS31FL3729_SDB_PIN` |*Not defined* |The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3729_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3729_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3729_I2C_ADDRESS_1` |*Not defined* |The I²C address of driver 0 |
|
||||
|`IS31FL3729_I2C_ADDRESS_2` |*Not defined* |The I²C address of driver 1 |
|
||||
|`IS31FL3729_I2C_ADDRESS_3` |*Not defined* |The I²C address of driver 2 |
|
||||
|`IS31FL3729_I2C_ADDRESS_4` |*Not defined* |The I²C address of driver 3 |
|
||||
|`IS31FL3729_PWM_FREQUENCY` |`IS31FL3729_PWM_FREQUENCY_32K_HZ` |The PWM frequency of the LEDs |
|
||||
|`IS31FL3729_SW_PULLDOWN` |`IS31FL3729_SW_PULLDOWN_2K_OHM_SW_OFF`|The `SWx` pullup resistor value |
|
||||
|`IS31FL3729_CS_PULLUP` |`IS31FL3729_CS_PULLUP_2K_OHM_CS_OFF` |The `CSx` pulldown resistor value |
|
||||
|`IS31FL3729_GLOBAL_CURRENT` |`0x40` |The global current control value |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3729 has four possible 7-bit I²C addresses, depending on how the `AD` pin is connected.
|
||||
|
||||
To configure this, set the `IS31FL3729_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|----------------------------|------|
|
||||
|`IS31FL3729_I2C_ADDRESS_GND`|`0x34`|
|
||||
|`IS31FL3729_I2C_ADDRESS_SCL`|`0x35`|
|
||||
|`IS31FL3729_I2C_ADDRESS_SDA`|`0x36`|
|
||||
|`IS31FL3729_I2C_ADDRESS_VCC`|`0x37`|
|
||||
|
||||
### PWM Frequency {#pwm-frequency}
|
||||
|
||||
The PWM frequency can be adjusted by adding the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3729_PWM_FREQUENCY IS31FL3729_PWM_FREQUENCY_32K_HZ
|
||||
```
|
||||
|
||||
Valid values are:
|
||||
|
||||
|Define |Frequency |
|
||||
|----------------------------------|----------------|
|
||||
|`IS31FL3729_PWM_FREQUENCY_55K_HZ` |55 kHz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_32K_HZ` |32 kHz (default)|
|
||||
|`IS31FL3729_PWM_FREQUENCY_4K_HZ` |4 kHz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_2K_HZ` |2 kHz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_1K_HZ` |1 kHz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_500_HZ` |500 Hz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_250_HZ` |250 Hz |
|
||||
|`IS31FL3729_PWM_FREQUENCY_80K_HZ` |80 kHz |
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
These settings control the pulldown and pullup resistor values on the `SWy` and `CSx` pins respectively, for the purposes of eliminating ghosting. Refer to the datasheet (p. 18) for more information on how and why this occurs.
|
||||
|
||||
To adjust the resistor values, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3729_SW_PULLDOWN IS31FL3729_SW_PULLDOWN_2K_OHM_SW_OFF
|
||||
#define IS31FL3729_CS_PULLUP IS31FL3729_CS_PULLUP_2K_OHM_CS_OFF
|
||||
```
|
||||
|
||||
Valid values for `IS31FL3729_SW_PULLDOWN` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|---------------------------------------|------------------------------|
|
||||
|`IS31FL3729_SW_PULLDOWN_0_OHM` |None |
|
||||
|`IS31FL3729_SW_PULLDOWN_0K5_OHM_SW_OFF`|0.5 kΩ in SWy off time |
|
||||
|`IS31FL3729_SW_PULLDOWN_1K_OHM_SW_OFF` |1 kΩ in SWy off time |
|
||||
|`IS31FL3729_SW_PULLDOWN_2K_OHM_SW_OFF` |2 kΩ in SWy off time (default)|
|
||||
|`IS31FL3729_SW_PULLDOWN_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3729_SW_PULLDOWN_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3729_SW_PULLDOWN_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3729_SW_PULLDOWN_8K_OHM` |8 kΩ |
|
||||
|
||||
Valid values for `IS31FL3729_CS_PULLUP` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|-------------------------------------|------------------------------|
|
||||
|`IS31FL3729_CS_PULLUP_0_OHM` |None |
|
||||
|`IS31FL3729_CS_PULLUP_0K5_OHM_CS_OFF`|0.5 kΩ in CSx off time |
|
||||
|`IS31FL3729_CS_PULLUP_1K_OHM_CS_OFF` |1 kΩ in CSx off time |
|
||||
|`IS31FL3729_CS_PULLUP_2K_OHM_CS_OFF` |2 kΩ in CSx off time (default)|
|
||||
|`IS31FL3729_CS_PULLUP_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3729_CS_PULLUP_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3729_CS_PULLUP_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3729_CS_PULLUP_8K_OHM` |8 kΩ |
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. By default, the value is 64, but if you need to adjust it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3729_GLOBAL_CURRENT 0x40
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3729_led_t PROGMEM g_is31fl3729_leds[IS31FL3729_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their anodes connected to the `SW1` pin, and their cathodes on the `CS1`, `CS2` and `CS3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3729_led_t PROGMEM g_is31fl3729_leds[IS31FL3729_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, SW1_CS1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 12, figure 9.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3729_led_t` {#api-is31fl3729-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3729-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_init(uint8_t index)` {#api-is31fl3729-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3729-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3729-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3729-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3729-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3729_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3729_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3729-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_value(int index, uint8_t value)` {#api-is31fl3729-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3729_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3729_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_value_all(uint8_t value)` {#api-is31fl3729-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_scaling_register(uint8_t index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3729-set-scaling-register-rgb}
|
||||
|
||||
Configure the scaling registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3729_update_scaling_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-scaling-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3729_leds` array).
|
||||
- `uint8_t red`
|
||||
The scaling value for the red channel.
|
||||
- `uint8_t green`
|
||||
The scaling value for the green channel.
|
||||
- `uint8_t blue`
|
||||
The scaling value for the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_set_scaling_register(uint8_t index, uint8_t value)` {#api-is31fl3729-set-scaling-register-mono}
|
||||
|
||||
Configure the scaling registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3729_update_scaling_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3729-set-scaling-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3729_leds` array).
|
||||
- `uint8_t value`
|
||||
The scaling value for the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_update_pwm_buffers(uint8_t index)` {#api-is31fl3729-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3729-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3729_update_scaling_registers(uint8_t index)` {#api-is31fl3729-update-scaling-registers}
|
||||
|
||||
Flush the scaling register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3729-update-scaling-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
254
docs/drivers/is31fl3731.md
Normal file
254
docs/drivers/is31fl3731.md
Normal file
@@ -0,0 +1,254 @@
|
||||
# IS31FL3731 Driver {#is31fl3731-driver}
|
||||
|
||||
I²C Charlieplexed 16x9 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 144 single-color LEDs, or 48 RGB LEDs.
|
||||
|
||||
[IS31FL3731 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3731_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3731 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3731` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3731-mono.c # For single-color
|
||||
SRC += is31fl3731.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|-------------|----------------------------------------------------|
|
||||
|`IS31FL3731_SDB_PIN` |*Not defined*|The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3731_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3731_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3731_I2C_ADDRESS_1` |*Not defined*|The I²C address of driver 0 |
|
||||
|`IS31FL3731_I2C_ADDRESS_2` |*Not defined*|The I²C address of driver 1 |
|
||||
|`IS31FL3731_I2C_ADDRESS_3` |*Not defined*|The I²C address of driver 2 |
|
||||
|`IS31FL3731_I2C_ADDRESS_4` |*Not defined*|The I²C address of driver 3 |
|
||||
|`IS31FL3731_DEGHOST` |*Not defined*|Enable ghost image prevention |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3731 has four possible 7-bit I²C addresses, depending on how the `AD` pin is connected.
|
||||
|
||||
To configure this, set the `IS31FL3731_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|----------------------------|------|
|
||||
|`IS31FL3731_I2C_ADDRESS_GND`|`0x74`|
|
||||
|`IS31FL3731_I2C_ADDRESS_SCL`|`0x75`|
|
||||
|`IS31FL3731_I2C_ADDRESS_SDA`|`0x76`|
|
||||
|`IS31FL3731_I2C_ADDRESS_VCC`|`0x77`|
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
This setting enables the de-ghosting feature on the IS31FL3731. See this [Application Note](https://www.lumissil.com/assets/pdf/core/IS31FL3731_AN.pdf) (p. 15) for more information.
|
||||
|
||||
To enable, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3731_DEGHOST
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, C1_1, C1_2, C1_3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their cathodes connected to the `CA1` pin, and their anodes on the `CA2`, `CA3` and `CA4` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[IS31FL3731_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, C1_1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 11, figure 8.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3731_led_t` {#api-is31fl3731-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3731-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_init(uint8_t index)` {#api-is31fl3731-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3731-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3731-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3731-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_select_page(uint8_t index, uint8_t page)` {#api-is31fl3731-select-page}
|
||||
|
||||
Change the current page for configuring the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3731-select-page-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t page`
|
||||
The page number to select.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3731-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3731_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3731_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3731-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_value(int index, uint8_t value)` {#api-is31fl3731-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3731_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3731_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_value_all(uint8_t value)` {#api-is31fl3731-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3731-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3731_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3731_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3731-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3731_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3731-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3731_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_update_pwm_buffers(uint8_t index)` {#api-is31fl3731-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3731-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3731_update_led_control_registers(uint8_t index)` {#api-is31fl3731-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3731-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
338
docs/drivers/is31fl3733.md
Normal file
338
docs/drivers/is31fl3733.md
Normal file
@@ -0,0 +1,338 @@
|
||||
# IS31FL3733 Driver {#is31fl3733-driver}
|
||||
|
||||
I²C 12x16 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 192 single-color LEDs, or 64 RGB LEDs.
|
||||
|
||||
[IS31FL3733 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3733_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3733 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3733` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3733-mono.c # For single-color
|
||||
SRC += is31fl3733.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|---------------------------------|----------------------------------------------------|
|
||||
|`IS31FL3733_SDB_PIN` |*Not defined* |The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3733_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3733_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3733_I2C_ADDRESS_1` |*Not defined* |The I²C address of driver 0 |
|
||||
|`IS31FL3733_I2C_ADDRESS_2` |*Not defined* |The I²C address of driver 1 |
|
||||
|`IS31FL3733_I2C_ADDRESS_3` |*Not defined* |The I²C address of driver 2 |
|
||||
|`IS31FL3733_I2C_ADDRESS_4` |*Not defined* |The I²C address of driver 3 |
|
||||
|`IS31FL3733_SYNC_1` |`IS31FL3733_SYNC_NONE` |The sync configuration for driver 0 |
|
||||
|`IS31FL3733_SYNC_2` |`IS31FL3733_SYNC_NONE` |The sync configuration for driver 1 |
|
||||
|`IS31FL3733_SYNC_3` |`IS31FL3733_SYNC_NONE` |The sync configuration for driver 2 |
|
||||
|`IS31FL3733_SYNC_4` |`IS31FL3733_SYNC_NONE` |The sync configuration for driver 3 |
|
||||
|`IS31FL3733_PWM_FREQUENCY` |`IS31FL3733_PWM_FREQUENCY_8K4_HZ`|The PWM frequency of the LEDs (IS31FL3733B only) |
|
||||
|`IS31FL3733_SW_PULLUP` |`IS31FL3733_PUR_0_OHM` |The `SWx` pullup resistor value |
|
||||
|`IS31FL3733_CS_PULLDOWN` |`IS31FL3733_PDR_0_OHM` |The `CSx` pulldown resistor value |
|
||||
|`IS31FL3733_GLOBAL_CURRENT` |`0xFF` |The global current control value |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3733 has 16 possible 7-bit I²C addresses, depending on how the `ADDR1` and `ADDR2` pins are connected.
|
||||
|
||||
To configure this, set the `IS31FL3733_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|--------------------------------|------|
|
||||
|`IS31FL3733_I2C_ADDRESS_GND_GND`|`0x50`|
|
||||
|`IS31FL3733_I2C_ADDRESS_GND_SCL`|`0x51`|
|
||||
|`IS31FL3733_I2C_ADDRESS_GND_SDA`|`0x52`|
|
||||
|`IS31FL3733_I2C_ADDRESS_GND_VCC`|`0x53`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SCL_GND`|`0x54`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SCL_SCL`|`0x55`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SCL_SDA`|`0x56`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SCL_VCC`|`0x57`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SDA_GND`|`0x58`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SDA_SCL`|`0x59`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SDA_SDA`|`0x5A`|
|
||||
|`IS31FL3733_I2C_ADDRESS_SDA_VCC`|`0x5B`|
|
||||
|`IS31FL3733_I2C_ADDRESS_VCC_GND`|`0x5C`|
|
||||
|`IS31FL3733_I2C_ADDRESS_VCC_SCL`|`0x5D`|
|
||||
|`IS31FL3733_I2C_ADDRESS_VCC_SDA`|`0x5E`|
|
||||
|`IS31FL3733_I2C_ADDRESS_VCC_VCC`|`0x5F`|
|
||||
|
||||
### Multi-Driver Synchronization {#multi-driver-synchronization}
|
||||
|
||||
Multiple IS31FL3733 drivers can be synchronized by connecting the `SYNC` pins together. One driver must be designated as the "master", and the others configured as "slave".
|
||||
|
||||
To do this, set the `IS31FL3733_SYNC_n` defines accordingly in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|------------------------|---------------------------|
|
||||
|`IS31FL3733_SYNC_NONE` |No synchronization |
|
||||
|`IS31FL3733_SYNC_MASTER`|Driver configured as master|
|
||||
|`IS31FL3733_SYNC_SLAVE` |Driver configured as slave |
|
||||
|
||||
### PWM Frequency {#pwm-frequency}
|
||||
|
||||
The PWM frequency can be adjusted (for IS31FL3733B only) by adding the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3733_PWM_FREQUENCY IS31FL3733_PWM_FREQUENCY_8K4_HZ
|
||||
```
|
||||
|
||||
Valid values are:
|
||||
|
||||
|Define |Frequency |
|
||||
|----------------------------------|-----------------|
|
||||
|`IS31FL3733_PWM_FREQUENCY_8K4_HZ` |8.4 kHz (default)|
|
||||
|`IS31FL3733_PWM_FREQUENCY_4K2_HZ` |4.2 kHz |
|
||||
|`IS31FL3733_PWM_FREQUENCY_26K7_HZ`|26.7 kHz |
|
||||
|`IS31FL3733_PWM_FREQUENCY_2K1_HZ` |2.1 kHz |
|
||||
|`IS31FL3733_PWM_FREQUENCY_1K05_HZ`|1.05 kHz |
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
These settings control the pullup and pulldown resistor values on the `SWy` and `CSx` pins respectively, for the purposes of eliminating ghosting. Refer to the datasheet (p. 23) for more information on how and why this occurs.
|
||||
|
||||
To adjust the resistor values, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3733_SW_PULLUP IS31FL3733_PUR_0_OHM
|
||||
#define IS31FL3733_CS_PULLDOWN IS31FL3733_PUR_0_OHM
|
||||
```
|
||||
|
||||
Valid values for `IS31FL3733_SW_PULLUP` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3733_PUR_0_OHM` |None (default)|
|
||||
|`IS31FL3733_PUR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3733_PUR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3733_PUR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3733_PUR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3733_PUR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3733_PUR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3733_PUR_32K_OHM`|32 kΩ |
|
||||
|
||||
Valid values for `IS31FL3733_CS_PULLDOWN` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3733_PDR_0_OHM` |None (default)|
|
||||
|`IS31FL3733_PDR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3733_PDR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3733_PDR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3733_PDR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3733_PDR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3733_PDR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3733_PDR_32K_OHM`|32 kΩ |
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. By default, the value is the maximum (255), but if you need to lower it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3733_GLOBAL_CURRENT 0xFF
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their cathodes connected to the `SW1` pin, and their anodes on the `CS1`, `CS2` and `CS3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3733_led_t PROGMEM g_is31fl3733_leds[IS31FL3733_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, SW1_CS1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 15, figure 9.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3733_led_t` {#api-is31fl3733-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3733-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_init(uint8_t index)` {#api-is31fl3733-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3733-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3733-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3733-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_select_page(uint8_t index, uint8_t page)` {#api-is31fl3733-select-page}
|
||||
|
||||
Change the current page for configuring the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3733-select-page-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t page`
|
||||
The page number to select.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3733-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3733_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3733_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3733-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_value(int index, uint8_t value)` {#api-is31fl3733-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3733_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3733_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_value_all(uint8_t value)` {#api-is31fl3733-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3733-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3733_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3733_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3733-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3733_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3733-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3733_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_update_pwm_buffers(uint8_t index)` {#api-is31fl3733-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3733-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3733_update_led_control_registers(uint8_t index)` {#api-is31fl3733-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3733-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
322
docs/drivers/is31fl3736.md
Normal file
322
docs/drivers/is31fl3736.md
Normal file
@@ -0,0 +1,322 @@
|
||||
# IS31FL3736 Driver {#is31fl3736-driver}
|
||||
|
||||
I²C 12x8 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 96 single-color LEDs, or 32 RGB LEDs.
|
||||
|
||||
[IS31FL3736 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3736_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3736 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3736` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3736-mono.c # For single-color
|
||||
SRC += is31fl3736.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|---------------------------------|----------------------------------------------------|
|
||||
|`IS31FL3736_SDB_PIN` |*Not defined* |The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3736_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3736_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3736_I2C_ADDRESS_1` |*Not defined* |The I²C address of driver 0 |
|
||||
|`IS31FL3736_I2C_ADDRESS_2` |*Not defined* |The I²C address of driver 1 |
|
||||
|`IS31FL3736_I2C_ADDRESS_3` |*Not defined* |The I²C address of driver 2 |
|
||||
|`IS31FL3736_I2C_ADDRESS_4` |*Not defined* |The I²C address of driver 3 |
|
||||
|`IS31FL3736_PWM_FREQUENCY` |`IS31FL3736_PWM_FREQUENCY_8K4_HZ`|The PWM frequency of the LEDs (IS31FL3736B only) |
|
||||
|`IS31FL3736_SW_PULLUP` |`IS31FL3736_PUR_0_OHM` |The `SWx` pullup resistor value |
|
||||
|`IS31FL3736_CS_PULLDOWN` |`IS31FL3736_PDR_0_OHM` |The `CSx` pulldown resistor value |
|
||||
|`IS31FL3736_GLOBAL_CURRENT` |`0xFF` |The global current control value |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3736 has 16 possible 7-bit I²C addresses, depending on how the `ADDR1` and `ADDR2` pins are connected.
|
||||
|
||||
To configure this, set the `IS31FL3736_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|--------------------------------|------|
|
||||
|`IS31FL3736_I2C_ADDRESS_GND_GND`|`0x50`|
|
||||
|`IS31FL3736_I2C_ADDRESS_GND_SCL`|`0x51`|
|
||||
|`IS31FL3736_I2C_ADDRESS_GND_SDA`|`0x52`|
|
||||
|`IS31FL3736_I2C_ADDRESS_GND_VCC`|`0x53`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SCL_GND`|`0x54`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SCL_SCL`|`0x55`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SCL_SDA`|`0x56`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SCL_VCC`|`0x57`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SDA_GND`|`0x58`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SDA_SCL`|`0x59`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SDA_SDA`|`0x5A`|
|
||||
|`IS31FL3736_I2C_ADDRESS_SDA_VCC`|`0x5B`|
|
||||
|`IS31FL3736_I2C_ADDRESS_VCC_GND`|`0x5C`|
|
||||
|`IS31FL3736_I2C_ADDRESS_VCC_SCL`|`0x5D`|
|
||||
|`IS31FL3736_I2C_ADDRESS_VCC_SDA`|`0x5E`|
|
||||
|`IS31FL3736_I2C_ADDRESS_VCC_VCC`|`0x5F`|
|
||||
|
||||
### PWM Frequency {#pwm-frequency}
|
||||
|
||||
The PWM frequency can be adjusted (for IS31FL3736B only) by adding the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3736_PWM_FREQUENCY IS31FL3736_PWM_FREQUENCY_8K4_HZ
|
||||
```
|
||||
|
||||
Valid values are:
|
||||
|
||||
|Define |Frequency |
|
||||
|----------------------------------|-----------------|
|
||||
|`IS31FL3736_PWM_FREQUENCY_8K4_HZ` |8.4 kHz (default)|
|
||||
|`IS31FL3736_PWM_FREQUENCY_4K2_HZ` |4.2 kHz |
|
||||
|`IS31FL3736_PWM_FREQUENCY_26K7_HZ`|26.7 kHz |
|
||||
|`IS31FL3736_PWM_FREQUENCY_2K1_HZ` |2.1 kHz |
|
||||
|`IS31FL3736_PWM_FREQUENCY_1K05_HZ`|1.05 kHz |
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
These settings control the pullup and pulldown resistor values on the `SWy` and `CSx` pins respectively, for the purposes of eliminating ghosting. Refer to the datasheet (p. 25) for more information on how and why this occurs.
|
||||
|
||||
To adjust the resistor values, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3736_SW_PULLUP IS31FL3736_PUR_0_OHM
|
||||
#define IS31FL3736_CS_PULLDOWN IS31FL3736_PDR_0_OHM
|
||||
```
|
||||
|
||||
Valid values for `IS31FL3736_SW_PULLUP` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3736_PUR_0_OHM` |None (default)|
|
||||
|`IS31FL3736_PUR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3736_PUR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3736_PUR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3736_PUR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3736_PUR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3736_PUR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3736_PUR_32K_OHM`|32 kΩ |
|
||||
|
||||
Valid values for `IS31FL3736_CS_PULLDOWN` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3736_PDR_0_OHM` |None (default)|
|
||||
|`IS31FL3736_PDR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3736_PDR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3736_PDR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3736_PDR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3736_PDR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3736_PDR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3736_PDR_32K_OHM`|32 kΩ |
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. By default, the value is the maximum (255), but if you need to lower it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3736_GLOBAL_CURRENT 0xFF
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their cathodes connected to the `SW1` pin, and their anodes on the `CS1`, `CS2` and `CS3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3736_led_t PROGMEM g_is31fl3736_leds[IS31FL3736_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, SW1_CS1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 16, figure 9.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3736_led_t` {#api-is31fl3736-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3736-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_init(uint8_t index)` {#api-is31fl3736-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3736-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3736-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3736-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_select_page(uint8_t index, uint8_t page)` {#api-is31fl3736-select-page}
|
||||
|
||||
Change the current page for configuring the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3736-select-page-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t page`
|
||||
The page number to select.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3736-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3736_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3736_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3736-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_value(int index, uint8_t value)` {#api-is31fl3736-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3736_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3736_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_value_all(uint8_t value)` {#api-is31fl3736-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3736-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3736_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3736_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3736-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3736_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3736-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3736_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_update_pwm_buffers(uint8_t index)` {#api-is31fl3736-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3736-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3736_update_led_control_registers(uint8_t index)` {#api-is31fl3736-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3736-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
310
docs/drivers/is31fl3737.md
Normal file
310
docs/drivers/is31fl3737.md
Normal file
@@ -0,0 +1,310 @@
|
||||
# IS31FL3737 Driver {#is31fl3737-driver}
|
||||
|
||||
I²C 12x12 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 144 single-color LEDs, or 48 RGB LEDs.
|
||||
|
||||
[IS31FL3737 Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3737_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3737 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3737` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3737-mono.c # For single-color
|
||||
SRC += is31fl3737.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|---------------------------------|----------------------------------------------------|
|
||||
|`IS31FL3737_SDB_PIN` |*Not defined* |The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3737_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3737_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3737_I2C_ADDRESS_1` |*Not defined* |The I²C address of driver 0 |
|
||||
|`IS31FL3737_I2C_ADDRESS_2` |*Not defined* |The I²C address of driver 1 |
|
||||
|`IS31FL3737_I2C_ADDRESS_3` |*Not defined* |The I²C address of driver 2 |
|
||||
|`IS31FL3737_I2C_ADDRESS_4` |*Not defined* |The I²C address of driver 3 |
|
||||
|`IS31FL3737_PWM_FREQUENCY` |`IS31FL3737_PWM_FREQUENCY_8K4_HZ`|The PWM frequency of the LEDs (IS31FL3737B only) |
|
||||
|`IS31FL3737_SW_PULLUP` |`IS31FL3737_PUR_0_OHM` |The `SWx` pullup resistor value |
|
||||
|`IS31FL3737_CS_PULLDOWN` |`IS31FL3737_PDR_0_OHM` |The `CSx` pulldown resistor value |
|
||||
|`IS31FL3737_GLOBAL_CURRENT` |`0xFF` |The global current control value |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3737 has four possible 7-bit I²C addresses, depending on how the `ADDR` pin is connected.
|
||||
|
||||
To configure this, set the `IS31FL3737_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|----------------------------|------|
|
||||
|`IS31FL3737_I2C_ADDRESS_GND`|`0x50`|
|
||||
|`IS31FL3737_I2C_ADDRESS_SCL`|`0x55`|
|
||||
|`IS31FL3737_I2C_ADDRESS_SDA`|`0x5A`|
|
||||
|`IS31FL3737_I2C_ADDRESS_VCC`|`0x5F`|
|
||||
|
||||
### PWM Frequency {#pwm-frequency}
|
||||
|
||||
The PWM frequency can be adjusted (for IS31FL3737B only) by adding the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3737_PWM_FREQUENCY IS31FL3737_PWM_FREQUENCY_8K4_HZ
|
||||
```
|
||||
|
||||
Valid values are:
|
||||
|
||||
|Define |Frequency |
|
||||
|----------------------------------|-----------------|
|
||||
|`IS31FL3737_PWM_FREQUENCY_8K4_HZ` |8.4 kHz (default)|
|
||||
|`IS31FL3737_PWM_FREQUENCY_4K2_HZ` |4.2 kHz |
|
||||
|`IS31FL3737_PWM_FREQUENCY_26K7_HZ`|26.7 kHz |
|
||||
|`IS31FL3737_PWM_FREQUENCY_2K1_HZ` |2.1 kHz |
|
||||
|`IS31FL3737_PWM_FREQUENCY_1K05_HZ`|1.05 kHz |
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
These settings control the pullup and pulldown resistor values on the `SWy` and `CSx` pins respectively, for the purposes of eliminating ghosting. Refer to the datasheet (p. 23) for more information on how and why this occurs.
|
||||
|
||||
To adjust the resistor values, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3737_SW_PULLUP IS31FL3737_PUR_0_OHM
|
||||
#define IS31FL3737_CS_PULLDOWN IS31FL3737_PDR_0_OHM
|
||||
```
|
||||
|
||||
Valid values for `IS31FL3737_SW_PULLUP` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3737_PUR_0_OHM` |None (default)|
|
||||
|`IS31FL3737_PUR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3737_PUR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3737_PUR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3737_PUR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3737_PUR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3737_PUR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3737_PUR_32K_OHM`|32 kΩ |
|
||||
|
||||
Valid values for `IS31FL3737_CS_PULLDOWN` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|--------------|
|
||||
|`IS31FL3737_PDR_0_OHM` |None (default)|
|
||||
|`IS31FL3737_PDR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3737_PDR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3737_PDR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3737_PDR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3737_PDR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3737_PDR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3737_PDR_32K_OHM`|32 kΩ |
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. By default, the value is the maximum (255), but if you need to lower it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3737_GLOBAL_CURRENT 0xFF
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their cathodes connected to the `SW1` pin, and their anodes on the `CS1`, `CS2` and `CS3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, SW1_CS1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 15, figure 9.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3737_led_t` {#api-is31fl3737-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3737-led-t-members}
|
||||
|
||||
- `uint8_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint8_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint8_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint8_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint8_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_init(uint8_t index)` {#api-is31fl3737-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3737-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3737-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3737-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_select_page(uint8_t index, uint8_t page)` {#api-is31fl3737-select-page}
|
||||
|
||||
Change the current page for configuring the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3737-select-page-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t page`
|
||||
The page number to select.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3737-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3737_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3737_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3737-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_value(int index, uint8_t value)` {#api-is31fl3737-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3737_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3737_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_value_all(uint8_t value)` {#api-is31fl3737-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3737-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3737_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3737_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3737-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3737_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3737-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3737_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_update_pwm_buffers(uint8_t index)` {#api-is31fl3737-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3737-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3737_update_led_control_registers(uint8_t index)` {#api-is31fl3737-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3737-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
310
docs/drivers/is31fl3741.md
Normal file
310
docs/drivers/is31fl3741.md
Normal file
@@ -0,0 +1,310 @@
|
||||
# IS31FL3741 Driver {#is31fl3741-driver}
|
||||
|
||||
I²C 39x9 LED matrix driver by Lumissil. Supports a maximum of four drivers, each controlling up to 351 single-color LEDs, or 117 RGB LEDs.
|
||||
|
||||
[IS31FL3741A Datasheet](https://www.lumissil.com/assets/pdf/core/IS31FL3741A_DS.pdf)
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
The IS31FL3741 driver code is automatically included if you are using the [LED Matrix](../features/led_matrix) or [RGB Matrix](../features/rgb_matrix) feature with the `is31fl3741` driver set, and you would use those APIs instead.
|
||||
|
||||
However, if you need to use the driver standalone, add this to your `rules.mk`:
|
||||
|
||||
```make
|
||||
COMMON_VPATH += $(DRIVER_PATH)/led/issi
|
||||
SRC += is31fl3741-mono.c # For single-color
|
||||
SRC += is31fl3741.c # For RGB
|
||||
I2C_DRIVER_REQUIRED = yes
|
||||
```
|
||||
|
||||
## Basic Configuration {#basic-configuration}
|
||||
|
||||
Add the following to your `config.h`:
|
||||
|
||||
|Define |Default |Description |
|
||||
|----------------------------|---------------------------------|----------------------------------------------------|
|
||||
|`IS31FL3741_SDB_PIN` |*Not defined* |The GPIO pin connected to the drivers' shutdown pins|
|
||||
|`IS31FL3741_I2C_TIMEOUT` |`100` |The I²C timeout in milliseconds |
|
||||
|`IS31FL3741_I2C_PERSISTENCE`|`0` |The number of times to retry I²C transmissions |
|
||||
|`IS31FL3741_I2C_ADDRESS_1` |*Not defined* |The I²C address of driver 0 |
|
||||
|`IS31FL3741_I2C_ADDRESS_2` |*Not defined* |The I²C address of driver 1 |
|
||||
|`IS31FL3741_I2C_ADDRESS_3` |*Not defined* |The I²C address of driver 2 |
|
||||
|`IS31FL3741_I2C_ADDRESS_4` |*Not defined* |The I²C address of driver 3 |
|
||||
|`IS31FL3741_CONFIGURATION` |`1` |The value of the configuration register |
|
||||
|`IS31FL3741_PWM_FREQUENCY` |`IS31FL3741_PWM_FREQUENCY_29K_HZ`|The PWM frequency of the LEDs (IS31FL3741A only) |
|
||||
|`IS31FL3741_SW_PULLUP` |`IS31FL3741_PUR_32K_OHM` |The `SWx` pullup resistor value |
|
||||
|`IS31FL3741_CS_PULLDOWN` |`IS31FL3741_PDR_32K_OHM` |The `CSx` pulldown resistor value |
|
||||
|`IS31FL3741_GLOBAL_CURRENT` |`0xFF` |The global current control value |
|
||||
|
||||
### I²C Addressing {#i2c-addressing}
|
||||
|
||||
The IS31FL3741 has four possible 7-bit I²C addresses, depending on how the `ADDR` pin is connected.
|
||||
|
||||
To configure this, set the `IS31FL3741_I2C_ADDRESS_n` defines to one of the following in your `config.h`, where *n* denotes the driver index:
|
||||
|
||||
|Define |Value |
|
||||
|----------------------------|------|
|
||||
|`IS31FL3741_I2C_ADDRESS_GND`|`0x30`|
|
||||
|`IS31FL3741_I2C_ADDRESS_SCL`|`0x31`|
|
||||
|`IS31FL3741_I2C_ADDRESS_SDA`|`0x32`|
|
||||
|`IS31FL3741_I2C_ADDRESS_VCC`|`0x33`|
|
||||
|
||||
### PWM Frequency {#pwm-frequency}
|
||||
|
||||
The PWM frequency can be adjusted (for IS31FL3741A only) by adding the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3741_PWM_FREQUENCY IS31FL3741_PWM_FREQUENCY_29K_HZ
|
||||
```
|
||||
|
||||
Valid values are:
|
||||
|
||||
|Define |Frequency |
|
||||
|---------------------------------|----------------|
|
||||
|`IS31FL3741_PWM_FREQUENCY_29K_HZ`|29 kHz (default)|
|
||||
|`IS31FL3741_PWM_FREQUENCY_3K6_HZ`|3.6 kHz |
|
||||
|`IS31FL3741_PWM_FREQUENCY_1K8_HZ`|1.8 kHz |
|
||||
|`IS31FL3741_PWM_FREQUENCY_900_HZ`|900 Hz |
|
||||
|
||||
### De-Ghosting {#de-ghosting}
|
||||
|
||||
These settings control the pullup and pulldown resistor values on the `CSx` and `SWy` pins respectively, for the purposes of eliminating ghosting. Refer to the datasheet (p. 18) for more information on how and why this occurs.
|
||||
|
||||
To adjust the resistor values, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3741_SW_PULLUP IS31FL3741_PUR_32K_OHM
|
||||
#define IS31FL3741_CS_PULLDOWN IS31FL3741_PDR_32K_OHM
|
||||
```
|
||||
|
||||
Valid values for `IS31FL3741_SW_PULLUP` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|---------------|
|
||||
|`IS31FL3741_PUR_0_OHM` |None |
|
||||
|`IS31FL3741_PUR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3741_PUR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3741_PUR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3741_PUR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3741_PUR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3741_PUR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3741_PUR_32K_OHM`|32 kΩ (default)|
|
||||
|
||||
Valid values for `IS31FL3741_CS_PULLDOWN` are:
|
||||
|
||||
|Define |Resistance |
|
||||
|------------------------|---------------|
|
||||
|`IS31FL3741_PDR_0_OHM` |None |
|
||||
|`IS31FL3741_PDR_0K5_OHM`|0.5 kΩ |
|
||||
|`IS31FL3741_PDR_1K_OHM` |1 kΩ |
|
||||
|`IS31FL3741_PDR_2K_OHM` |2 kΩ |
|
||||
|`IS31FL3741_PDR_4K_OHM` |4 kΩ |
|
||||
|`IS31FL3741_PDR_8K_OHM` |8 kΩ |
|
||||
|`IS31FL3741_PDR_16K_OHM`|16 kΩ |
|
||||
|`IS31FL3741_PDR_32K_OHM`|32 kΩ (default)|
|
||||
|
||||
### Global Current Control {#global-current-control}
|
||||
|
||||
This setting controls the current sunk by the `CSx` pins, from 0 to 255. By default, the value is the maximum (255), but if you need to lower it, add the following to your `config.h`:
|
||||
|
||||
```c
|
||||
#define IS31FL3741_GLOBAL_CURRENT 0xFF
|
||||
```
|
||||
|
||||
## ARM/ChibiOS Configuration {#arm-configuration}
|
||||
|
||||
Depending on the ChibiOS board configuration, you may need to [enable and configure I²C](i2c#arm-configuration) at the keyboard level.
|
||||
|
||||
## LED Mapping {#led-mapping}
|
||||
|
||||
In order to use this driver, each output must be mapped to an LED index, by adding the following to your `<keyboardname>.c`:
|
||||
|
||||
```c
|
||||
const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | R G B */
|
||||
{0, SW1_CS1, SW1_CS2, SW1_CS3},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
In this example, the red, green and blue channels for the first LED index on driver 0 all have their anodes connected to the `SW1` pin, and their cathodes on the `CS1`, `CS2` and `CS3` pins respectively.
|
||||
|
||||
For the single-color driver, the principle is the same, but there is only one channel:
|
||||
|
||||
```c
|
||||
const is31fl3741_led_t PROGMEM g_is31fl3741_leds[IS31FL3741_LED_COUNT] = {
|
||||
/* Driver
|
||||
* | V */
|
||||
{0, SW1_CS1},
|
||||
// etc...
|
||||
};
|
||||
```
|
||||
|
||||
These values correspond to the register indices as shown in the datasheet on page 12, figure 8.
|
||||
|
||||
## API {#api}
|
||||
|
||||
### `struct is31fl3741_led_t` {#api-is31fl3741-led-t}
|
||||
|
||||
Contains the PWM register addresses for a single RGB LED.
|
||||
|
||||
#### Members {#api-is31fl3741-led-t-members}
|
||||
|
||||
- `uint32_t driver`
|
||||
The driver index of the LED, from 0 to 3.
|
||||
- `uint32_t r`
|
||||
The output PWM register address for the LED's red channel (RGB driver only).
|
||||
- `uint32_t g`
|
||||
The output PWM register address for the LED's green channel (RGB driver only).
|
||||
- `uint32_t b`
|
||||
The output PWM register address for the LED's blue channel (RGB driver only).
|
||||
- `uint32_t v`
|
||||
The output PWM register address for the LED (single-color driver only).
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_init(uint8_t index)` {#api-is31fl3741-init}
|
||||
|
||||
Initialize the LED driver. This function should be called first.
|
||||
|
||||
#### Arguments {#api-is31fl3741-init-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_write_register(uint8_t index, uint8_t reg, uint8_t data)` {#api-is31fl3741-write-register}
|
||||
|
||||
Set the value of the given register.
|
||||
|
||||
#### Arguments {#api-is31fl3741-write-register-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t reg`
|
||||
The register address.
|
||||
- `uint8_t data`
|
||||
The value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_select_page(uint8_t index, uint8_t page)` {#api-is31fl3741-select-page}
|
||||
|
||||
Change the current page for configuring the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3741-select-page-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
- `uint8_t page`
|
||||
The page number to select.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3741-set-color}
|
||||
|
||||
Set the color of a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3741_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-color-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3741_leds` array).
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_color_all(uint8_t red, uint8_t green, uint8_t blue)` {#api-is31fl3741-set-color-all}
|
||||
|
||||
Set the color of all LEDs (RGB driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-color-all-arguments}
|
||||
|
||||
- `uint8_t red`
|
||||
The red value to set.
|
||||
- `uint8_t green`
|
||||
The green value to set.
|
||||
- `uint8_t blue`
|
||||
The blue value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_value(int index, uint8_t value)` {#api-is31fl3741-set-value}
|
||||
|
||||
Set the brightness of a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3741_update_pwm_buffers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-value-arguments}
|
||||
|
||||
- `int index`
|
||||
The LED index (ie. the index into the `g_is31fl3741_leds` array).
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_value_all(uint8_t value)` {#api-is31fl3741-set-value-all}
|
||||
|
||||
Set the brightness of all LEDs (single-color driver only).
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-value-all-arguments}
|
||||
|
||||
- `uint8_t value`
|
||||
The brightness value to set.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_led_control_register(uint8_t index, bool red, bool green, bool blue)` {#api-is31fl3741-set-led-control-register-rgb}
|
||||
|
||||
Configure the LED control registers for a single LED (RGB driver only). This function does not immediately update the LEDs; call `is31fl3741_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-led-control-register-rgb-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3741_leds` array).
|
||||
- `bool red`
|
||||
Enable or disable the red channel.
|
||||
- `bool green`
|
||||
Enable or disable the green channel.
|
||||
- `bool blue`
|
||||
Enable or disable the blue channel.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_set_led_control_register(uint8_t index, bool value)` {#api-is31fl3741-set-led-control-register-mono}
|
||||
|
||||
Configure the LED control registers for a single LED (single-color driver only). This function does not immediately update the LEDs; call `is31fl3741_update_led_control_registers()` after you are finished.
|
||||
|
||||
#### Arguments {#api-is31fl3741-set-led-control-register-mono-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The LED index (ie. the index into the `g_is31fl3741_leds` array).
|
||||
- `bool value`
|
||||
Enable or disable the LED.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_update_pwm_buffers(uint8_t index)` {#api-is31fl3741-update-pwm-buffers}
|
||||
|
||||
Flush the PWM values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3741-update-pwm-buffers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
||||
|
||||
---
|
||||
|
||||
### `void is31fl3741_update_led_control_registers(uint8_t index)` {#api-is31fl3741-update-led-control-registers}
|
||||
|
||||
Flush the LED control register values to the LED driver.
|
||||
|
||||
#### Arguments {#api-is31fl3741-update-led-control-registers-arguments}
|
||||
|
||||
- `uint8_t index`
|
||||
The driver index.
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user