Compare commits
1059 Commits
Author | SHA1 | Date | |
---|---|---|---|
732a115b32 | |||
b6c60333e4 | |||
0c351fa98b | |||
bd39e91f78 | |||
44832127d7 | |||
7eebdd4760 | |||
1d6a18db99 | |||
cecf783e14 | |||
91c6113cba | |||
988941cc0a | |||
ee0135fb81 | |||
e179dbd9e6 | |||
7041055ace | |||
ae6b803ad6 | |||
51e44fd6c5 | |||
80707d529c | |||
41fa638aa8 | |||
71feac5717 | |||
78aebe0631 | |||
de0a058da7 | |||
999b35c7f8 | |||
ec720ac1ea | |||
fa4a492677 | |||
3e4f2f5590 | |||
3d3999d863 | |||
b8899b48b4 | |||
9c582fc797 | |||
477bd4b948 | |||
c2096bb515 | |||
aa26464480 | |||
28a4e90565 | |||
b2010cd478 | |||
d0d81eecef | |||
623b1cd866 | |||
b8c1f25072 | |||
931ad66ffa | |||
2003cee609 | |||
c3bdddb637 | |||
c95f08c439 | |||
7e84b0e3b3 | |||
704794bae3 | |||
e229dcadb5 | |||
bb2a8c3611 | |||
e7fccabb1c | |||
d24da945d1 | |||
453877422b | |||
9851e6f3b1 | |||
492115a611 | |||
fa1b92fbb1 | |||
6d12588cdf | |||
6b994ecd82 | |||
81e85a1a4e | |||
6a0b13191b | |||
0a4a966c66 | |||
b003669934 | |||
a9ef02105d | |||
6d08de5c67 | |||
e4f1b238b3 | |||
7a4ec3bd92 | |||
690957cdbd | |||
006ba4bf36 | |||
b9cf386b21 | |||
ad420e7205 | |||
a965e5b735 | |||
ef1714f443 | |||
6536b1ce2a | |||
e90a00c88c | |||
870aaa0a7e | |||
be4ece0f3e | |||
9359abf33e | |||
260ddd3290 | |||
b3eeb9d84a | |||
0e174fcb48 | |||
3ed2147a88 | |||
ec86fac6ee | |||
4f1007952b | |||
53b094934f | |||
f9a301761f | |||
8cd9d26246 | |||
d2ad5afaa6 | |||
3588bd694e | |||
68b8f37853 | |||
33f886ad74 | |||
0cd8eb02c7 | |||
c7e9e643fa | |||
d380ed1f75 | |||
684a02ae3f | |||
b3bff6404c | |||
046c5d332f | |||
5e28f88707 | |||
d678899c83 | |||
2df879cbe3 | |||
9c284786e7 | |||
85df687348 | |||
0d8c73dc8d | |||
aaa01d0a4e | |||
8da442f411 | |||
a74e69e9fa | |||
3c5b915078 | |||
fcef83a5d0 | |||
e5ed23c0b3 | |||
2513912975 | |||
52562eaaea | |||
3a7e0dd2f6 | |||
e0689c000b | |||
997a847f8c | |||
60daffbe5d | |||
e5b0095e6c | |||
819f0998bd | |||
7cbbf62f5f | |||
5d965a8d41 | |||
eb660ef218 | |||
b2b72058e5 | |||
888026ae73 | |||
25c6ca750f | |||
84395e8a04 | |||
b9b2244b82 | |||
63d9698d5c | |||
37f6f92765 | |||
7b7e285a98 | |||
acd3e97b83 | |||
99877cdff3 | |||
b9895771ed | |||
95ac79cb67 | |||
694db4130e | |||
7f4cf32af9 | |||
e7da52c7de | |||
43d1e05b31 | |||
05a6449d2d | |||
849ed5a6a0 | |||
4fe58aa6ec | |||
04069c94cc | |||
a82e752f64 | |||
b767719fc8 | |||
8ddbf7f59f | |||
b412bb8d8c | |||
d6ce42b01c | |||
de2c51b7ca | |||
eb3f80b924 | |||
bd2c0b9648 | |||
9a8904a9c0 | |||
153eb95ab2 | |||
d9b70cc1c9 | |||
b11a5be62c | |||
0b050f6c33 | |||
05b356dea7 | |||
7a7b57ffb1 | |||
84a358845b | |||
22738df5f5 | |||
d099266853 | |||
ba90cf422c | |||
f2fcab96a8 | |||
29df2be2a9 | |||
3381254c65 | |||
d28d390ad6 | |||
49046f621b | |||
9e7448ea89 | |||
b2083e21a2 | |||
cb60fe393f | |||
a1e156a3d2 | |||
10a7cd7e5a | |||
8e94c9b4cb | |||
2704c163da | |||
3af95509b5 | |||
425f0a768b | |||
4b50ea15a9 | |||
436d661775 | |||
5e2a999278 | |||
40fe30e4d6 | |||
7f3b1232c4 | |||
38b076d22d | |||
c5cef025ec | |||
7ce94eb468 | |||
26b51383b2 | |||
29026ec023 | |||
2d732f484c | |||
d1d2b87f97 | |||
43aa59c703 | |||
343f8d368e | |||
2f28652dcc | |||
c8ac556e63 | |||
1201d4910f | |||
4ff40a551a | |||
ff512ea5b4 | |||
9122b34a47 | |||
18b4d24cc3 | |||
7180e195e8 | |||
584b804ee3 | |||
838aae1645 | |||
d8f1949029 | |||
cdef372f57 | |||
425e7348d8 | |||
26bbfd7812 | |||
cd30a60d0e | |||
196740a0bb | |||
5a809ac178 | |||
7bd4559b4b | |||
9fa7a788d3 | |||
627dd8a73c | |||
46826adba8 | |||
d6386b108b | |||
4cc41de50b | |||
e2a5dfdba6 | |||
d27ff5ccf6 | |||
24994046d6 | |||
2e62ff9807 | |||
7f3224b117 | |||
187c78f3cb | |||
a793e094bc | |||
973e91078b | |||
215dd126d0 | |||
460b5f8751 | |||
43fd889d7e | |||
95242fe0f1 | |||
4760b26bec | |||
ff4ad46dca | |||
43964438fb | |||
3c3be98a06 | |||
e27c50669a | |||
f9d226ca50 | |||
3c7db55ec5 | |||
ce0efa6b9a | |||
430a8e1750 | |||
34130d56f1 | |||
0a8df2c5e3 | |||
b844fe7efd | |||
3a00aafd39 | |||
fecb932945 | |||
be0afd24bf | |||
d926ba22a2 | |||
7a16a30e6a | |||
a25d4a90c3 | |||
5bc0c4a011 | |||
3fa0b66289 | |||
ffa4c72a89 | |||
93b2f23bba | |||
41d45afd2a | |||
e11cb44926 | |||
a3aadd888f | |||
ae8ac581c0 | |||
acd63bc03c | |||
f637ab69c2 | |||
a343188dcf | |||
a22286e834 | |||
4634e3802c | |||
c4f93e237e | |||
f9aa75fe95 | |||
9d4050586d | |||
857600aa4b | |||
7e930626eb | |||
22afddb8e8 | |||
3bfe4cdb4f | |||
1bab72383c | |||
ccabf70aeb | |||
6c30fd04d3 | |||
b133b74897 | |||
a9f4596062 | |||
f076f16e13 | |||
4810a4a812 | |||
bc7b1843ba | |||
b5e8327755 | |||
94b14bdd6a | |||
0b31a63dd4 | |||
5c251b5575 | |||
41a46c7c8e | |||
f90321bdcb | |||
d68294615f | |||
d8e2ff2964 | |||
07fc34e962 | |||
abda6ff7bb | |||
08b9eb26c5 | |||
109ae2f1e8 | |||
a619b93e38 | |||
df30d18458 | |||
737c1fe641 | |||
bbe8876c8d | |||
738b8d2b9c | |||
e950d4e12f | |||
2d1528c69f | |||
f7b59427fa | |||
12159e782c | |||
db6d7207b5 | |||
6535804776 | |||
a4ef86034c | |||
f39e9928eb | |||
224fc8a20f | |||
a43cb6c0af | |||
dddbcc2af3 | |||
592ff53e41 | |||
73625a603a | |||
835adb7848 | |||
d3301c0f8b | |||
456570efa4 | |||
30ad505dd0 | |||
0de2597f7c | |||
b7f1ea967a | |||
e5f610b70e | |||
446b34edec | |||
91b11bb4dd | |||
1d5567a3a9 | |||
f9c62aa363 | |||
1b0f5e4803 | |||
c876bb8748 | |||
dc96fa24e4 | |||
65b7bf6878 | |||
c5d2b7ff16 | |||
306353bf06 | |||
c6ca996f4e | |||
ed1710589f | |||
3074269c4a | |||
df67169d42 | |||
3eb8785e87 | |||
995002fa91 | |||
3994fb1e79 | |||
b7041d06ae | |||
64d63ab422 | |||
1e7585e767 | |||
5ba228b684 | |||
5815c5d317 | |||
05530b193f | |||
05bc4880dd | |||
fa6da78ff3 | |||
65e8127c91 | |||
5fbaf31dc2 | |||
39385144e7 | |||
9a4ce28683 | |||
951b6f33a0 | |||
f113f95440 | |||
bc97413bf7 | |||
e6f7a8a47a | |||
a8f5897b97 | |||
2b24d35846 | |||
503565d174 | |||
6039a4f6ed | |||
f5c8941652 | |||
bb86be1f1f | |||
aee9b10e92 | |||
a875299d9a | |||
a11053bda8 | |||
3899bec4b6 | |||
9237b95ebe | |||
6b0842760b | |||
bcf70c0203 | |||
3607522c12 | |||
303bc6999e | |||
8813365ec5 | |||
3a5f9faca9 | |||
7e38541124 | |||
1054d5554a | |||
e77a5e1751 | |||
154305ce1b | |||
1ca879687c | |||
32e55f9182 | |||
34836a16ed | |||
b65282f69f | |||
36757de1a7 | |||
891d17f028 | |||
4f48dd7c83 | |||
0e7a2a77de | |||
b096b57b0b | |||
54f69d02d5 | |||
78cf15384e | |||
8b218857ed | |||
20d69e2ad4 | |||
46179fbb7b | |||
c0a8953405 | |||
a07b83fe8e | |||
816ef19f41 | |||
2e78c19054 | |||
ffffd1b6c1 | |||
8e7be3adda | |||
236826e7c1 | |||
e18768aa77 | |||
d75a44a02b | |||
53951ee086 | |||
27aa185222 | |||
bee9183e7f | |||
1454d466e7 | |||
3ac9259742 | |||
fbd9d04559 | |||
13c882a1fb | |||
ed9c18e866 | |||
133ed52466 | |||
e3aeab356a | |||
d90ac76295 | |||
563961328b | |||
d0cfaba6d2 | |||
4e51c1e3ca | |||
de52bd5d89 | |||
48f4c5997b | |||
344ebbac43 | |||
da53f3a529 | |||
8b3fa01667 | |||
ef4a7a0aa0 | |||
1d8e3da233 | |||
e2e8b7b799 | |||
570b4605b2 | |||
c034b61b1a | |||
7873046479 | |||
3e41cde9f9 | |||
e7347ff0de | |||
9e72b7e7e9 | |||
0f7a51cef5 | |||
649d08742a | |||
15ddaa7f19 | |||
f5d78c739d | |||
10105f645a | |||
c9dd11d5ab | |||
af7430b896 | |||
7614c6b7a7 | |||
8b206e1e75 | |||
f8ed4ed573 | |||
e508b5e04e | |||
049f906b5e | |||
021edb6ec6 | |||
c74f47555c | |||
605c4129cc | |||
3448d5d487 | |||
ec35fea264 | |||
2b4efaba53 | |||
caab4d7e45 | |||
d1e66e2e07 | |||
7e54332890 | |||
b9225a28f2 | |||
200ae0c519 | |||
eedb767279 | |||
ccbdf90f02 | |||
3a1ee48cda | |||
d029e23260 | |||
f39bad2a7d | |||
46977da417 | |||
1a675efc4f | |||
3627a50e63 | |||
97d6184ed0 | |||
5fb058eb34 | |||
b441468795 | |||
3f3f208113 | |||
32c511c918 | |||
8994fca4ee | |||
d359b55520 | |||
338edcabd7 | |||
d145a1192f | |||
923d32a0ef | |||
571f39da66 | |||
71da013995 | |||
2366ebfbbd | |||
c782b269b6 | |||
4d2be0281c | |||
258e2afbbf | |||
c3f7df992d | |||
942f2ccee4 | |||
d6e51d2008 | |||
23839b8c6d | |||
b83ae5ae5c | |||
49f547dd8e | |||
6de7e5d8dc | |||
85cac39529 | |||
3fdc45b4e9 | |||
411cd4fae2 | |||
f504082f7f | |||
256abc64d5 | |||
1b821eca66 | |||
37b7539af3 | |||
c72ca58528 | |||
48dfc77718 | |||
62faa20ef6 | |||
d5ee0194ab | |||
5e4daf1c6d | |||
7e37daa2ce | |||
216f669276 | |||
cc2fb56ed8 | |||
fa09189195 | |||
71857ebc3f | |||
6e688ad5c2 | |||
99b7b50130 | |||
c948404739 | |||
8a0cf32cf5 | |||
0f986a1951 | |||
a7811781c5 | |||
417202109b | |||
2104900030 | |||
221b27c508 | |||
b9b9a59f22 | |||
512eb5e1d5 | |||
b6b85ed413 | |||
b6280d0cac | |||
a47e916635 | |||
a03d946d0c | |||
3c3388d7f6 | |||
0605107f13 | |||
18bc47ebab | |||
004a92d9a6 | |||
a32436d5a1 | |||
a89ee25db8 | |||
c0a6c5f806 | |||
2407b27243 | |||
739249ff0d | |||
25f2295ba8 | |||
8775a13658 | |||
63e47a6425 | |||
0520341ce4 | |||
edfb50ea56 | |||
e5c5902e95 | |||
f3e3ff29a3 | |||
91776772fd | |||
2573e581a5 | |||
d5f56e91e4 | |||
bb413383ee | |||
092416325b | |||
be0cfbb97e | |||
732a7f2be9 | |||
ebb46694e5 | |||
1f7b8a0343 | |||
d1865db599 | |||
80270a2791 | |||
30f4507492 | |||
65317a3a02 | |||
423c68c210 | |||
3a7083d810 | |||
a4bdd6d084 | |||
d012b01108 | |||
6167d7937c | |||
dfb5a0e8f4 | |||
f0962bce50 | |||
dce3847ebb | |||
0ec07ddc1c | |||
d7f2bd2964 | |||
34c5f8094e | |||
b10d950708 | |||
3399e39297 | |||
b37f510f32 | |||
a3a304db9a | |||
db2da37561 | |||
df874a228a | |||
7e9ca9a976 | |||
a43ae7c92f | |||
4a97ef6c48 | |||
d7fc236540 | |||
76b9a2662a | |||
561da65606 | |||
ca544ecfb6 | |||
19fd20261b | |||
3766f902a0 | |||
70d83afff9 | |||
e123ed8d5f | |||
3c11a8d241 | |||
e03ddbe118 | |||
4b1d0c5859 | |||
c7cddfc539 | |||
6ca1c49d38 | |||
0c8f71e3c7 | |||
24d1745951 | |||
683754bce8 | |||
0c0a8ee187 | |||
73a70a2c1c | |||
cf28f7bfda | |||
d9efa02cfb | |||
1753c9383e | |||
9895e376e7 | |||
96bde794d8 | |||
b19e34c81e | |||
5ae0cfeef5 | |||
ce0b8ea676 | |||
82cbe71bb5 | |||
fa44e8d4dc | |||
29e7003fc2 | |||
4880e72b77 | |||
eab0166f83 | |||
1968ec4c24 | |||
25a7c94174 | |||
24ec8f5097 | |||
fec3b78d78 | |||
fbbf618a46 | |||
7e518e1d8f | |||
0d9bceb2fe | |||
68808b22c0 | |||
515b4dd1f7 | |||
0734f56940 | |||
d11962aeb2 | |||
82d9abf9f3 | |||
71855087cf | |||
d91e09f116 | |||
871ac5058a | |||
976c856966 | |||
b911e1966f | |||
a64ae10662 | |||
b69b214d52 | |||
ea14ed122f | |||
1000799d1e | |||
525be99ee9 | |||
99fc4a330e | |||
ebc6948e96 | |||
474f7ee3fd | |||
498dfdd02c | |||
9b40dd796e | |||
873fee8038 | |||
74518260b8 | |||
4d13a8063d | |||
0e54e9d528 | |||
3cefa5cc82 | |||
24be0efd4b | |||
39b51573e6 | |||
603e3fd2f6 | |||
729fe5d8d4 | |||
c008ac79bf | |||
203d90d9fe | |||
6fb9c094ec | |||
6e88c5014b | |||
2c89a77e67 | |||
1d69ccd729 | |||
bf6f7a623d | |||
64eecfc530 | |||
5abe05147c | |||
ed15973a3f | |||
d1fe24ad9f | |||
ae0752dff5 | |||
5e6097f015 | |||
dd8f8e6bae | |||
7c5e510fe2 | |||
f67aefc522 | |||
a4163466cb | |||
f2b2e05f12 | |||
e405ab4bc6 | |||
5ae1411fc3 | |||
40a8a88e72 | |||
c61b5d88a8 | |||
89529a9f17 | |||
ab7ffc877a | |||
93cd47d491 | |||
7990cd2c92 | |||
bcc86a09d5 | |||
7d29d5f091 | |||
e546b7655c | |||
5f9532ea66 | |||
6868497557 | |||
4c9dae0e3b | |||
44cd6aa41a | |||
0bffb86721 | |||
36f8936b03 | |||
359245bcc6 | |||
7da82a6833 | |||
ab5d4ae803 | |||
6d16d282bf | |||
e9b1958df2 | |||
62aacd06ed | |||
b51d9d5d3f | |||
921884de5d | |||
30bf618864 | |||
d9527a2f74 | |||
56e9a286b5 | |||
cdef9bd02f | |||
8d88997ffd | |||
a3b575b740 | |||
f9a7dd6cca | |||
35d9010c63 | |||
42f167eb57 | |||
e86e6431fc | |||
b5d35e43c7 | |||
b5af4e6dda | |||
c23a2fc928 | |||
8bc52c0e86 | |||
ac3753937a | |||
53fde9a1ff | |||
5730599d18 | |||
2cbd99b663 | |||
b7501868a0 | |||
d817d8743e | |||
d791dd7c91 | |||
ce8d46d74f | |||
cad54d5313 | |||
3c766d29e2 | |||
7053347efd | |||
67c4186a9e | |||
a2a216d316 | |||
26fda6bfa3 | |||
18c09dd154 | |||
2793758db7 | |||
218bd63294 | |||
ede95297d3 | |||
b663cb63c0 | |||
0b809313d0 | |||
459f206ec7 | |||
e1dd99ea74 | |||
b0efdf8795 | |||
e6a45c5092 | |||
896a48bac0 | |||
e1dc3377a4 | |||
d2e7b8b469 | |||
fcbcff8020 | |||
615dc93fba | |||
ca1ec7b121 | |||
118287420f | |||
6fa6e6c4c6 | |||
80d5649f25 | |||
1dabceb197 | |||
ea20a064b9 | |||
2210a55e98 | |||
7741f2a498 | |||
c94efed1e6 | |||
eb5b52c6c6 | |||
5df4372c81 | |||
ba27a11288 | |||
f43e6f224b | |||
6862ab1609 | |||
64f9779fe5 | |||
cf97749fb7 | |||
719f6f0293 | |||
4894150094 | |||
134c354fc5 | |||
902d5077cd | |||
4d7105c2cf | |||
eddc161d5d | |||
4d905b17f4 | |||
060f075fd1 | |||
d1fb51976a | |||
c3ebd9e61b | |||
f936a3d5c2 | |||
cdece6811d | |||
453cd25ab8 | |||
8a7daf34a2 | |||
bd43954a70 | |||
eadb1afbd0 | |||
4344273c95 | |||
7b798789f9 | |||
5f79da2d5f | |||
e97a2215c7 | |||
aa491523ab | |||
24a61213aa | |||
3a1e9890dc | |||
6cf5c7e7f4 | |||
50dd22d1bf | |||
cb5a8feeb2 | |||
4f163b006e | |||
dbeda99de1 | |||
89799309d7 | |||
761b4e04bf | |||
29ea5f92ca | |||
07b0a4144e | |||
66ec000886 | |||
9413e3958a | |||
8b66d71521 | |||
01c7475d12 | |||
420074d37f | |||
db7de0d47c | |||
8cad52d8f3 | |||
b1a2c4cd59 | |||
6b7e4a9bc9 | |||
8567544174 | |||
d5de7e20fd | |||
8347993d6b | |||
e364b2267a | |||
128640a7df | |||
646d1f83a5 | |||
143a4ff78f | |||
00010b47bc | |||
757a79636b | |||
35737ee07f | |||
d51ad5db0f | |||
223494e691 | |||
3df44ecfc8 | |||
858efff8e5 | |||
6a54982324 | |||
5942b0f103 | |||
0eebccb283 | |||
d524b3f5e5 | |||
c0a04929f2 | |||
9adb6f777b | |||
5c277651a3 | |||
69581f47d5 | |||
bc68d4ef2c | |||
4bba3be825 | |||
228e4add0b | |||
b7b94bfb13 | |||
18cc05e2f7 | |||
b420185f5b | |||
b8b2a55973 | |||
80bc598585 | |||
c8a0ab1867 | |||
f91f0a715d | |||
032712866f | |||
1074642c36 | |||
942b78e8c2 | |||
1cefc94082 | |||
e7fb34a910 | |||
67868d39f8 | |||
8d61e884f2 | |||
7a9a5d0e62 | |||
166f428a2b | |||
99521a4482 | |||
79343f1c6c | |||
0fb82c15a5 | |||
4587248cda | |||
b0ade6dc98 | |||
bdca5c22fe | |||
7571474874 | |||
dbf13e9c98 | |||
0523657923 | |||
592b90dd22 | |||
9216bc7377 | |||
b251f2582e | |||
b22b1fd5fb | |||
f9cf4f75ae | |||
b493f6a4ed | |||
80c5ada339 | |||
f388bb5bda | |||
4c0aa02b2e | |||
c07ef5c6ab | |||
59bef40aab | |||
8dd422ffe1 | |||
063328344a | |||
61eb35191a | |||
91b1aa0994 | |||
7920063035 | |||
f41d540e81 | |||
b7533e0abf | |||
e69e4c1ef2 | |||
e3c3170610 | |||
8cd3a84025 | |||
a03d72f597 | |||
c66b090d4c | |||
d352a8bc29 | |||
ae7c3a0692 | |||
22e234f9b5 | |||
26d6b90dde | |||
6fc5d446f5 | |||
d1c35b1255 | |||
cab29b61e4 | |||
abfc9265c4 | |||
6b67129c51 | |||
c6d0da9a37 | |||
e04aff10fa | |||
049e5916a4 | |||
71614e5b98 | |||
b803589e29 | |||
2b0b5d804a | |||
29664234e2 | |||
e5e7dbebf6 | |||
6778c175f5 | |||
a38fc1beae | |||
79f28ac3bd | |||
5a7d3dce95 | |||
aee41b1293 | |||
6b368a8edc | |||
e13934c60a | |||
611ca00918 | |||
5eef65f9b4 | |||
9b9a1a946e | |||
78783e23d8 | |||
943d1cc673 | |||
f4b5b8486f | |||
006a1f806a | |||
0e5b64f092 | |||
c4f5db9351 | |||
266aae0ebc | |||
85d56eea38 | |||
97fe4201aa | |||
32df47053b | |||
8bccc5d217 | |||
b3f45e2efd | |||
f743e65ab7 | |||
5133bb146e | |||
f95480e3ca | |||
053b3b9847 | |||
53278bc658 | |||
4a34a192b5 | |||
a5bf8cc4e1 | |||
9335aa3965 | |||
f791834c68 | |||
b681171774 | |||
e6423f50a4 | |||
dd5bfb6f3e | |||
de235b3e07 | |||
23c6af02c2 | |||
1b495b94a9 | |||
33b55c11a8 | |||
59adb168b4 | |||
f3b7863b56 | |||
bf88dfa5db | |||
4e9170156e | |||
fbbf8b501f | |||
304be86c80 | |||
45ce7048d5 | |||
79a23399e8 | |||
77a877f5d3 | |||
7139a0704b | |||
869e6316d0 | |||
70cf332498 | |||
b2d1c4950c | |||
0e8f5b0d91 | |||
d03be6dbcb | |||
1ef3dee821 | |||
79aa1f3484 | |||
a5fc9c9165 | |||
03c1f72594 | |||
8002d8dc29 | |||
c38bac480b | |||
483de13114 | |||
06e9019a06 | |||
caf197b905 | |||
ee732d7753 | |||
2196a5facf | |||
d28ecc1e4a | |||
eeaef60ffa | |||
6e1a6d1981 | |||
50e0b35560 | |||
f7ae70962c | |||
1b0fec884f | |||
7328ba0f3b | |||
9d25855bb0 | |||
08f1bde358 | |||
db193b8cf9 | |||
8d47fe7bc7 | |||
6163f0ea51 | |||
8008a8a9dc | |||
c8f3e845e7 | |||
14466e820d | |||
86fa48e1ee | |||
7c8a062cd7 | |||
bd9d75701c | |||
d5bbecc134 | |||
3290a75dd0 | |||
b216768cef | |||
c797334f51 | |||
f98e803e5c | |||
c84d220b07 | |||
3ea6555f88 | |||
13b8908951 | |||
4a37910295 | |||
2945841985 | |||
08e31e7995 | |||
7d3dda21a5 | |||
e451b38848 | |||
dcc1abcdd5 | |||
94ccc65542 | |||
c25b5b0093 | |||
2c22bbda5a | |||
410bc48e5a | |||
cd71aeb63e | |||
81545bbe10 | |||
b4f1638643 | |||
c9b11560bf | |||
ff1130f76d | |||
3e0c1937f4 | |||
398c4feed4 | |||
5d7a4e3059 | |||
ac01b69edf | |||
5031ae08bf | |||
2c11165fb6 | |||
9761907332 | |||
2931b8c18c | |||
0eff2b199d | |||
5e5aee44e5 | |||
506c776300 | |||
d6141c0bce | |||
b64631d02c | |||
b321f44ff6 | |||
1650d4692c | |||
64e64e5153 | |||
12e5912c9a | |||
756706a704 | |||
126ba262ef | |||
8bb74c6062 | |||
c716bc0234 | |||
7c80d1d777 | |||
416f946463 | |||
9f02c070ca | |||
00ec258e31 | |||
3c27d7b048 | |||
28c9339859 | |||
07baa1b65d | |||
b33cd7d7ec | |||
111593b6d8 | |||
4785e6d228 | |||
a94c683ab9 | |||
f27207e807 | |||
2f44de6240 | |||
59c8a733e6 | |||
2acb2f0937 | |||
4b46263952 | |||
48a3cbf9b3 | |||
edfb9363dd | |||
75cb446d36 | |||
464b9a80d4 | |||
b105d83bce | |||
69fe8cf232 | |||
bf5638e511 | |||
f7172ff5a6 | |||
cca7b10727 | |||
d4437d6694 | |||
4178b00533 | |||
686476fa93 | |||
2a7bd276a4 | |||
e40086b2fe | |||
bdafdf1ef8 | |||
083c77390a | |||
1793bfd096 | |||
b129491366 | |||
ae8ddde1cf | |||
43f121497f | |||
3d9d4bfe3e | |||
67416629e3 | |||
00a8847daf | |||
c5dfee04af | |||
e6d58d5ac2 | |||
e52a7cf448 | |||
9e51e54240 | |||
fb3c7c0572 | |||
b4eea94baa | |||
f91c584a44 | |||
7219c4a4b6 | |||
6ec6c8017f | |||
8daad815e8 | |||
30bbfe92b3 | |||
3c446334e9 | |||
520ddc19a1 | |||
f1ed69fa7b | |||
b828fff788 | |||
7fad7ddb0b | |||
ea13eaf1c0 | |||
50a763a460 | |||
fa9ce5771f | |||
b1a827aaa6 | |||
62d5ca9b81 | |||
2dbd047aa5 | |||
9893fac5c5 | |||
22d1aeb409 | |||
6fc76b224b | |||
7963233140 | |||
0f34b9fd44 | |||
d3388d3468 | |||
cecb912e53 | |||
2f0837bd6e | |||
0e03275c40 | |||
ae74a81356 | |||
43669fb270 | |||
01a218f36b | |||
5383d37925 | |||
10932b8f90 | |||
a25df9432b | |||
bf6d2b5ebd | |||
700a77a0f3 | |||
4464a288a1 | |||
f893628865 | |||
ab4f24a16a | |||
fb94b97e48 | |||
e7069410ff | |||
cd7cba54fe | |||
ef9902f5ed | |||
51e37dc5cd | |||
81055457fa | |||
5e2f882230 | |||
50fc1a5a5b | |||
7a8e9cc136 | |||
1a0be5e750 | |||
767690aa59 | |||
1f419424c4 | |||
444e7cc53b | |||
f427a6c6d8 | |||
b0365c7ac3 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,5 +1,6 @@
|
||||
.dep
|
||||
*.o
|
||||
*.bin
|
||||
*.eep
|
||||
*.elf
|
||||
*.hex
|
||||
@ -21,6 +22,7 @@ quantum/version.h
|
||||
.idea/
|
||||
CMakeLists.txt
|
||||
.DS_STORE
|
||||
/util/wsl_downloaded
|
||||
|
||||
# Eclipse/PyCharm/Other IDE Settings
|
||||
.cproject
|
||||
|
@ -11,6 +11,8 @@ env:
|
||||
- secure: vBTSL34BDPxDilKUuTXqU4CJ26Pv5hogD2nghatkxSQkI1/jbdnLj/DQdPUrMJFDIY6TK3AltsBx72MaMsLQ1JO/Ou24IeHINHXzUC1FlS9yQa48cpxnhX5kzXNyGs3oa0qaFbvnr7RgYRWtmD52n4bIZuSuW+xpBv05x2OCizdT2ZonH33nATaHGFasxROm4qYZ241VfzcUv766V6RVHgL4x9V08warugs+RENVkfzxxwhk3NmkrISabze0gSVJLHBPHxroZC6EUcf/ocobcuDrCwFqtEt90i7pNIAFUE7gZsN2uE75LmpzAWin21G7lLPcPL2k4FJVd8an1HiP2WmscJU6U89fOfMb2viObnKcCzebozBCmKGtHEuXZo9FcReOx49AnQSpmESJGs+q2dL/FApkTjQiyT4J6O5dJpoww0/r57Wx0cmmqjETKBb5rSgXM51Etk3wO09mvcPHsEwrT7qH8r9XWdyCDoEn7FCLX3/LYnf/D4SmZ633YPl5gv3v9XEwxR5+04akjgnvWDSNIaDbWBdxHNb7l4pMc+WR1bwCyMyA7KXj0RrftEGOrm9ZRLe6BkbT4cycA+j77nbPOMcyZChliV9pPQos+4TOJoTzcK2L8yWVoY409aDNVuAjdP6Yum0R2maBGl/etLmIMpJC35C5/lZ+dUNjJAM=
|
||||
before_install:
|
||||
- wget http://www.atmel.com/images/avr8-gnu-toolchain-3.5.4.1709-linux.any.x86_64.tar.gz
|
||||
- openssl aes-256-cbc -K $encrypted_b0ee987fd0fc_key -iv $encrypted_b0ee987fd0fc_iv -in secrets.tar.enc -out secrets.tar -d
|
||||
- tar xvf secrets.tar
|
||||
install:
|
||||
- tar -zxf avr8-gnu-toolchain-3.5.4.1709-linux.any.x86_64.tar.gz
|
||||
- export PATH="$PATH:$TRAVIS_BUILD_DIR/avr8-gnu-toolchain-linux_x86_64/bin"
|
||||
|
@ -1,8 +1,7 @@
|
||||
FROM debian:jessie
|
||||
MAINTAINER Erik Dasque <erik@frenchguys.com>
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install --no-install-recommends -y build-essential \
|
||||
RUN apt-get update && apt-get install --no-install-recommends -y build-essential \
|
||||
gcc \
|
||||
unzip \
|
||||
wget \
|
||||
@ -15,10 +14,8 @@ RUN apt-get install --no-install-recommends -y build-essential \
|
||||
gcc-arm-none-eabi \
|
||||
binutils-arm-none-eabi \
|
||||
libnewlib-arm-none-eabi \
|
||||
git
|
||||
|
||||
RUN apt-get clean
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
git \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV keyboard=ergodox
|
||||
ENV subproject=ez
|
||||
|
21
Makefile
21
Makefile
@ -21,6 +21,8 @@ override SILENT := false
|
||||
|
||||
ON_ERROR := error_occurred=1
|
||||
|
||||
BREAK_ON_ERRORS = no
|
||||
|
||||
STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST))
|
||||
ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST))
|
||||
ROOT_DIR := $(dir $(ROOT_MAKEFILE))
|
||||
@ -462,20 +464,25 @@ endef
|
||||
|
||||
include $(ROOT_DIR)/message.mk
|
||||
|
||||
ifeq ($(strip $(BREAK_ON_ERRORS)), yes)
|
||||
HANDLE_ERROR = exit 1
|
||||
else
|
||||
HANDLE_ERROR = echo $$error_occurred > $(ERROR_FILE)
|
||||
endif
|
||||
|
||||
# The empty line is important here, as it will force a new shell to be created for each command
|
||||
# Otherwise the command line will become too long with a lot of keyboards and keymaps
|
||||
define RUN_COMMAND
|
||||
+error_occurred=0;\
|
||||
$(COMMAND_$(SILENT_MODE)_$(COMMAND))\
|
||||
if [ $$error_occurred -gt 0 ]; then echo $$error_occurred > $(ERROR_FILE); fi;
|
||||
if [ $$error_occurred -gt 0 ]; then $(HANDLE_ERROR); fi;
|
||||
|
||||
|
||||
endef
|
||||
define RUN_TEST
|
||||
+error_occurred=0;\
|
||||
$($(TEST)_COMMAND)\
|
||||
if [ $$error_occurred -gt 0 ]; then echo $$error_occurred > $(ERROR_FILE); fi;
|
||||
|
||||
if [ $$error_occurred -gt 0 ]; then $(HANDLE_ERROR); fi;
|
||||
endef
|
||||
|
||||
# Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps
|
||||
@ -527,14 +534,22 @@ test: test-all
|
||||
.PHONY: test-clean
|
||||
test-clean: test-all-clean
|
||||
|
||||
ifdef SKIP_VERSION
|
||||
SKIP_GIT := yes
|
||||
endif
|
||||
|
||||
# Generate the version.h file
|
||||
ifndef SKIP_GIT
|
||||
GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
|
||||
else
|
||||
GIT_VERSION := NA
|
||||
endif
|
||||
ifndef SKIP_VERSION
|
||||
BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
|
||||
$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h)
|
||||
$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
|
||||
else
|
||||
BUILD_DATE := NA
|
||||
endif
|
||||
|
||||
include $(ROOT_DIR)/testlist.mk
|
||||
|
23
book.json
Normal file
23
book.json
Normal file
@ -0,0 +1,23 @@
|
||||
{
|
||||
"structure": {
|
||||
"readme": "Home.md"
|
||||
},
|
||||
"plugins" : ["toolbar", "edit-link", "anchors"],
|
||||
"pluginsConfig": {
|
||||
"edit-link": {
|
||||
"base": "https://github.com/qmk/qmk_firmware/edit/master/docs",
|
||||
"label": "Suggest an edit"
|
||||
},
|
||||
"toolbar": {
|
||||
"buttons":
|
||||
[
|
||||
{
|
||||
"label": "QMK Firmware",
|
||||
"icon": "fa fa-github",
|
||||
"url": "https://github.com/qmk/qmk_firmware"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"root": "./docs/"
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
7
docs/Adding-features-to-QMK.md
Normal file
7
docs/Adding-features-to-QMK.md
Normal file
@ -0,0 +1,7 @@
|
||||
If you have an idea for a custom feature or extra hardware connection, we'd love to accept it into QMK! These are generally done via [pull request](https://github.com/qmk/qmk_firmware/pulls) after forking, and here are some things to keep in mind when creating one:
|
||||
|
||||
* **Disable by default** - memory is a pretty limited on most chips QMK supports, and it's important that current keymaps aren't broken, so please allow your feature to be turned **on**, rather than being turned off. If you think it should be on by default, or reduces the size of the code, [open an issue](https://github.com/qmk/qmk_firmware/issues) for everyone to discuss it!
|
||||
* **Compile locally before submitting** - hopefully this one is obvious, but things need to compile! Our Travis system will catch any issues, but it's generally faster for you to compile a few keyboards locally instead of waiting for the results to come back.
|
||||
* **Consider subprojects and different chip-bases** - there are several keyboards that have subprojects that have allow for slightly different configurations, and even different chip-bases. Try to make a feature supported in ARM and AVR, or automatically disabled in one that doesn't work.
|
||||
* **Explain your feature** - submitting a markdown write-up of what your feature does with your PR may be needed, and it will allow a collaborator to easily copy it into the wiki for documentation (after proofing and editing).
|
||||
* **Don't refactor code** - to maintain a clear vision of how things are laid out in QMK, we try to plan out refactors in-depth, and have a collaborator make the changes. If you have an idea for refactoring, or suggestions, [open an issue](https://github.com/qmk/qmk_firmware/issues).
|
@ -96,7 +96,7 @@ The keyboard `config.h` is included only if the keymap one doesn't exist. The fo
|
||||
```
|
||||
#undef MY_SETTING
|
||||
#define MY_SETTING 4
|
||||
```c
|
||||
```
|
||||
|
||||
For a value of `4` for this imaginary setting. So we `undef` it first, then `define` it.
|
||||
|
7
docs/Becoming-a-QMK-Collaborator.md
Normal file
7
docs/Becoming-a-QMK-Collaborator.md
Normal file
@ -0,0 +1,7 @@
|
||||
A QMK collaborator is a keyboard maker/designer that is interested in helping QMK grow and fully support their keyboard(s), and encouraging their users/customers to submit features, ideas, and keymaps. We're always looking to add more keyboards and collaborators, but we ask that they fulfill these requirements:
|
||||
|
||||
* **Have a PCB available for sale** - unfortunately there's just too much variation and complications with handwired keyboards.
|
||||
* **Maintain the your keyboard's directory** - this may just require an initial setup to get your keyboard working, but it could also include accommodating changes made to QMK's core.
|
||||
* **Approve and merge your keyboard's keymap pull requests** - we like to encourage users to contribute their keymaps for others to see and work from when creating their own.
|
||||
|
||||
If you feel you meet these requirements, shoot us an email at hello@qmk.fm with an introduction and some links to your keyboard!
|
119
docs/Build-Environment-Setup.md
Normal file
119
docs/Build-Environment-Setup.md
Normal file
@ -0,0 +1,119 @@
|
||||
### Windows 10
|
||||
|
||||
#### Creators Update
|
||||
If you have Windows 10 with Creators Update or later, you can build and flash the firmware directly. Before the Creators Update, only building was possible. If you don't have it yet or if are unsure, follow [these instructions](https://support.microsoft.com/en-us/instantanswers/d4efb316-79f0-1aa1-9ef3-dcada78f3fa0/get-the-windows-10-creators-update).
|
||||
|
||||
#### Windows Subsystem for Linux
|
||||
In addition to the Creators Update, you need Windows 10 Subystem for Linux, so install it following [these instructions](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/). If you already have the Windows 10 Subsystem for Linux from the Anniversary update it's recommended that you [upgrade](https://betanews.com/2017/04/14/upgrade-windows-subsystem-for-linux/) it to 16.04LTS, because some keyboards don't compile with the toolchains included in 14.04LTS. Note that you need to know what your are doing if you chose the `sudo do-release-upgrade` method.
|
||||
|
||||
#### Git
|
||||
If you already have cloned the repository on your Windows file system you can ignore this section.
|
||||
|
||||
You will need to clone the repository to your Windows file system using the normal Git for Windows and **not** the WSL Git. So if you haven't installed Git before, [download](https://git-scm.com/download/win) and install it. Then [set it up](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup), it's important that you setup the e-mail and user name, especially if you are planning to contribute.
|
||||
|
||||
Once Git is installed, open the Git bash command and change the directory to where you want to clone QMK, note that you have to use forward slashes, and that your c drive is accessed like this `/c/path/to/where/you/want/to/go`. Then run `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`, this will create a new folder `qmk_firmware` as a subfolder of the current one.
|
||||
|
||||
#### Toolchain setup
|
||||
The Toolchain setup is done through the Windows Subsystem for Linux, and the process is fully automated. If you want to do everything manually, there are no other instructions than the scripts themselves, but you can always open issues and ask for more information.
|
||||
|
||||
1. Open "Bash On Ubuntu On Windows" from the start menu.
|
||||
2. Go to the directory where you cloned `qmk_firmware`. Note that the paths start with `/mnt/` in the WSL, so you have to write for example `cd /mnt/c/path/to/qmk_firmware`.
|
||||
3. Run `util/wsl_install.sh` and follow the on-screen instructions.
|
||||
4. Close the Bash command window, and re-open it.
|
||||
5. You are ready to compile and flash the firmware!
|
||||
|
||||
#### Some important things to keep in mind
|
||||
* You can run `util/wsl_install.sh` again to get all the newest updates.
|
||||
* Your QMK repository need to be on a Windows file system path, since WSL can't run executables outside it.
|
||||
* The WSL Git is **not** compatible with the Windows Git, so use the Windows Git Bash or a windows Git GUI for all Git operations
|
||||
* You can edit files either inside WSL or normally using Windows, but note that if you edit makefiles or shell scripts, make sure you are using an editor that saves the files with Unix line endings. Otherwise the compilation might not work.
|
||||
|
||||
### Windows (Vista and later)
|
||||
1. If you have ever installed WinAVR, uninstall it.
|
||||
2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**.
|
||||
3. If you are going to flash Infinity based keyboards you will need to install dfu-util, refer to the instructions by [Input Club](https://github.com/kiibohd/controller/wiki/Loading-DFU-Firmware).
|
||||
4. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
|
||||
5. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/qmk/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
|
||||
6. Open the `\util` folder.
|
||||
7. Double-click on the `1-setup-path-win` batch script to run it. You'll need to accept a User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
|
||||
8. Right-click on the `2-setup-environment-win` batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
|
||||
|
||||
If you have trouble and want to ask for help, it is useful to generate a *Win_Check_Output.txt* file by running `Win_Check.bat` in the `\util` folder.
|
||||
|
||||
### Mac
|
||||
If you're using [homebrew,](http://brew.sh/) you can use the following commands:
|
||||
|
||||
brew tap osx-cross/avr
|
||||
brew install avr-libc
|
||||
brew install dfu-programmer
|
||||
|
||||
This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of avr-libc can take over 20 minutes and exhibit high CPU usage.
|
||||
|
||||
You can also try these instructions:
|
||||
|
||||
1. Install Xcode from the App Store.
|
||||
2. Install the Command Line Tools from `Xcode->Preferences->Downloads`.
|
||||
3. Install [DFU-Programmer](https://dfu-programmer.github.io/).
|
||||
|
||||
If you are going to flash Infinity based keyboards you will also need dfu-util
|
||||
|
||||
brew install dfu-util
|
||||
|
||||
### Linux
|
||||
|
||||
To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.**
|
||||
|
||||
You can also install things manually, but this documentation might not be always up to date with all requirements.
|
||||
|
||||
The current requirements are the following, but not all might be needed depending on what you do. Also note that some systems might not have all the dependencies available as packages, or they might be named differently.
|
||||
|
||||
```
|
||||
build-essential
|
||||
gcc
|
||||
unzip
|
||||
wget
|
||||
zip
|
||||
gcc-avr
|
||||
binutils-avr
|
||||
avr-libc
|
||||
dfu-programmer
|
||||
dfu-util
|
||||
gcc-arm-none-eabi
|
||||
binutils-arm-none-eabi
|
||||
libnewlib-arm-none-eabi
|
||||
git
|
||||
```
|
||||
|
||||
Install the dependencies with your favorite package manager.
|
||||
|
||||
Debian/Ubuntu example:
|
||||
|
||||
sudo apt-get update
|
||||
sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
|
||||
|
||||
### Docker
|
||||
|
||||
If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap:
|
||||
|
||||
```bash
|
||||
# You'll run this every time you want to build a keymap
|
||||
# modify the keymap and keyboard assigment to compile what you want
|
||||
# defaults are ergodox/default
|
||||
|
||||
docker run -e keymap=gwen -e subproject=ez -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
|
||||
|
||||
# On windows docker seems to have issue with VOLUME tag in Dockerfile, and $('pwd') won't print a windows compliant path, use full path instead like this
|
||||
docker run -e keymap=default -e subproject=ez -e keyboard=ergobox --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware
|
||||
|
||||
```
|
||||
|
||||
This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash.
|
||||
|
||||
### Vagrant
|
||||
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](https://github.com/qmk/qmk_firmware/blob/master/doc/VAGRANT_GUIDE.md).
|
||||
|
||||
## Verify Your Installation
|
||||
1. If you haven't already, obtain this repository ([https://github.com/qmk/qmk_firmware](https://github.com/qmk/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application.
|
||||
2. Open up a terminal or command prompt and navigate to the `qmk_firmware` folder using the `cd` command. The command prompt will typically open to your home directory. If, for example, you cloned the repository to your Documents folder, then you would type `cd Documents/qmk_firmware`. If you extracted the file from a zip, then it may be named `qmk_firmware-master` instead.
|
||||
3. To confirm that you're in the correct location, you can display the contents of your current folder using the `dir` command on Windows, or the `ls` command on Linux or Mac. You should see several files, including `readme.md` and a `quantum` folder. From here, you need to navigate to the appropriate folder under `keyboards/`. For example, if you're building for a Planck, run `cd keyboards/planck`.
|
||||
4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process. More information about the `make` command can be found below.
|
0
doc/CYGWIN_GUIDE.md → docs/CYGWIN_GUIDE.md
Executable file → Normal file
0
doc/CYGWIN_GUIDE.md → docs/CYGWIN_GUIDE.md
Executable file → Normal file
25
docs/Compatible-Microcontrollers.md
Normal file
25
docs/Compatible-Microcontrollers.md
Normal file
@ -0,0 +1,25 @@
|
||||
# Atmel AVR
|
||||
|
||||
QMK should run on any Atmel AVR processor with enough Flash. It has been tested on the following:
|
||||
|
||||
* ATmega32U4 ([PJRC Teensy 2.0](http://www.pjrc.com/teensy/))
|
||||
* AT90USB1286 ([PJRC Teensy++ 2.0](http://www.pjrc.com/teensy/))
|
||||
* AT90USB1287 ([Atmel USBKEY](http://www.atmel.com/tools/AT90USBKEY.aspx))
|
||||
* ATmega168P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
||||
* ATmega328P with using [V-USB](http://www.obdev.at/products/vusb/index.html)
|
||||
* ATmega32U2
|
||||
* AT90USB1286, 646, 647 should work
|
||||
* AT90USB162 testing...
|
||||
|
||||
NOTE: To enable full features of firmware you'll need 32KB flash size.
|
||||
|
||||
Please add any tested microcontrollers to this list.
|
||||
|
||||
# ARM
|
||||
|
||||
You can also use any ARM processor that [ChibiOS](http://www.chibios.org) supports. The following processors have been tested:
|
||||
|
||||
* [Kinetis MKL26Z64](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/l-series-ultra-low-power-m0-plus/kinetis-kl2x-48-mhz-usb-ultra-low-power-microcontrollers-mcus-based-on-arm-cortex-m0-plus-core:KL2x)
|
||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
||||
* [Kinetis MK20DX128](http://www.nxp.com/assets/documents/data/en/data-sheets/K20P64M50SF0.pdf)
|
||||
* [Kinetis MK20DX256](http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/k-series-performance-m4/k2x-usb/kinetis-k20-72-mhz-full-speed-usb-mixed-signal-integration-microcontrollers-mcus-based-on-arm-cortex-m4-core:K20_72)
|
123
docs/Custom-Quantum-Functions.md
Normal file
123
docs/Custom-Quantum-Functions.md
Normal file
@ -0,0 +1,123 @@
|
||||
A custom keyboard is about more than sending button presses to your computer. QMK has designed hooks to allow you to inject code, override functionality, and otherwise customize how your keyboard responds in different situations.
|
||||
|
||||
## A Word on Keyboards vs Keymap
|
||||
|
||||
We have structured QMK as a hierarchy:
|
||||
|
||||
* Core
|
||||
* Keyboard/Revision (`_kb`)
|
||||
* Keymap (`_user`)
|
||||
|
||||
Each of the functions described below can be defined with a `_kb()` suffix or an `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
|
||||
|
||||
When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called.
|
||||
|
||||
## Matrix Initialization Code
|
||||
|
||||
* Keyboard/Revision: `void matrix_init_kb(void)`
|
||||
* Keymap: `void matrix_init_user(void)`
|
||||
|
||||
This function gets called when the matrix is initiated. You should use this function to initialize any custom hardware you may have, such as speakers, LED drivers, or other features which need to be setup after the keyboard powers on.
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
void matrix_init_kb(void) {
|
||||
// put your keyboard start-up code here
|
||||
// runs once when the firmware starts up
|
||||
matrix_init_user();
|
||||
|
||||
// JTAG disable for PORT F. write JTD bit twice within four cycles.
|
||||
MCUCR |= (1<<JTD);
|
||||
MCUCR |= (1<<JTD);
|
||||
|
||||
// * Set our LED pins as output
|
||||
DDRB |= (1<<0);
|
||||
DDRB |= (1<<1);
|
||||
DDRB |= (1<<2);
|
||||
DDRB |= (1<<3);
|
||||
DDRB |= (1<<4);
|
||||
}
|
||||
```
|
||||
|
||||
## Matrix Scanning Code
|
||||
|
||||
* Keyboard/Revision: `void matrix_scan_kb(void)`
|
||||
* Keymap: `void matrix_scan_user(void)`
|
||||
|
||||
This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
|
||||
|
||||
You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LED's or a display) or other functionality that you want to trigger regularly even when the user isn't typing.
|
||||
|
||||
## Hook Into Key Presses
|
||||
|
||||
* Keyboard/Revision: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
|
||||
* Keymap: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
|
||||
|
||||
This function gets called every time a key is pressed or released. This is particularly useful when defining custom keys or overriding the behavior of existing keys.
|
||||
|
||||
The return value is whether or not QMK should continue processing the keycode - returning `false` stops the execution.
|
||||
|
||||
The `keycode` variable is whatever is defined in your keymap, eg `MO(1)`, `KC_L`, etc. and can be switch-cased to execute code whenever a particular code is pressed.
|
||||
|
||||
The `record` variable contains infomation about the actual press:
|
||||
|
||||
```
|
||||
keyrecord_t record {
|
||||
keyevent_t event {
|
||||
keypos_t key {
|
||||
uint8_t col
|
||||
uint8_t row
|
||||
}
|
||||
bool pressed
|
||||
uint16_t time
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The conditional `if (record->event.pressed)` can tell if the key is being pressed or released, and you can execute code based on that.
|
||||
|
||||
## LED Control
|
||||
|
||||
* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
|
||||
* Keymap: `void led_set_user(uint8_t usb_led)`
|
||||
|
||||
This allows you to control the 5 LED's defined as part of the USB Keyboard spec. It will be called when the state of one of those 5 LEDs changes.
|
||||
|
||||
* `USB_LED_NUM_LOCK`
|
||||
* `USB_LED_CAPS_LOCK`
|
||||
* `USB_LED_SCROLL_LOCK`
|
||||
* `USB_LED_COMPOSE`
|
||||
* `USB_LED_KANA`
|
||||
|
||||
### Example:
|
||||
|
||||
```
|
||||
void led_set_kb(uint8_t usb_led) {
|
||||
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
|
||||
PORTB |= (1<<0);
|
||||
} else {
|
||||
PORTB &= ~(1<<0);
|
||||
}
|
||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
|
||||
PORTB |= (1<<1);
|
||||
} else {
|
||||
PORTB &= ~(1<<1);
|
||||
}
|
||||
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
|
||||
PORTB |= (1<<2);
|
||||
} else {
|
||||
PORTB &= ~(1<<2);
|
||||
}
|
||||
if (usb_led & (1<<USB_LED_COMPOSE_LOCK)) {
|
||||
PORTB |= (1<<3);
|
||||
} else {
|
||||
PORTB &= ~(1<<3);
|
||||
}
|
||||
if (usb_led & (1<<USB_LED_KANA_LOCK)) {
|
||||
PORTB |= (1<<4);
|
||||
} else {
|
||||
PORTB &= ~(1<<4);
|
||||
}
|
||||
}
|
||||
```
|
7
docs/Differences-from-TMK.md
Normal file
7
docs/Differences-from-TMK.md
Normal file
@ -0,0 +1,7 @@
|
||||
Understanding the essential changes made on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) should help you understand the QMK Firmware.
|
||||
|
||||
| Firmware |TMK |QMK |
|
||||
|------------------------------|-----------------------|-------------------------|
|
||||
| Maintainer |hasu (@tmk) |Jack Humbert et al. |
|
||||
| Build path customization | `TMK_DIR = ...` | `include .../Makefile` |
|
||||
| `keymaps` array data | 3D array of `uint8_t` holding **keycode** | 3D array of `uint16_t` holding **keycode** |
|
84
docs/Eclipse.md
Normal file
84
docs/Eclipse.md
Normal file
@ -0,0 +1,84 @@
|
||||
[Eclipse](https://en.wikipedia.org/wiki/Eclipse_(software)) is an open-source [Integrated Development Environment](https://en.wikipedia.org/wiki/Integrated_development_environment) (IDE) widely used for Java development, but with an extensible plugin system that allows to customize it for other languages and usages.
|
||||
|
||||
Using an IDE such as Eclipse provides many advantages over a plain text editor, such as:
|
||||
* intelligent code completion
|
||||
* convenient navigation in the code
|
||||
* refactoring tools
|
||||
* build automation (no need for the command-line)
|
||||
* a GUI for GIT
|
||||
* static code analysis
|
||||
* many other tools such as debugging, code formatting, showing call hierarchies etc.
|
||||
|
||||
The purpose of the is page is to document how to set-up Eclipse for developing AVR software, and working on the QMK code base.
|
||||
|
||||
Note that this set-up has been tested on Ubuntu 16.04 only for the moment.
|
||||
|
||||
# Prerequisites
|
||||
## Build environment
|
||||
Before starting, you must have followed the [Getting Started](/Home.md#getting-started) section corresponding to your system. In particular, you must have been able to build the firmware with [the `make` command](../#the-make-command).
|
||||
|
||||
## Java
|
||||
Eclipse is a Java application, so you will need to install Java 8 or more recent to be able to run it. You may choose between the JRE or the JDK, the latter being useful if you intend to do Java development.
|
||||
|
||||
# Install Eclipse and its plugins
|
||||
Eclipse comes in [several flavours](http://www.eclipse.org/downloads/eclipse-packages/) depending on the target usage that you will have. There is no package comprising the AVR stack, so we will need to start from Eclipse CDT (C/C++ Development Tooling) and install the necessary plugins.
|
||||
|
||||
## Download and install Eclipse CDT
|
||||
If you already have Eclipse CDT on your system, you can skip this step. However it is advised to keep it up-to-date for better support.
|
||||
|
||||
If you have another Eclipse package installed, it is normally possible to [install the CDT plugin over it](https://eclipse.org/cdt/downloads.php). However it is probably better to reinstall it from scratch to keep it light and avoid the clutter of tools that you don't need for the projects you will be working on.
|
||||
|
||||
Installation is very simple: follow the [5 Steps to Install Eclipse](https://eclipse.org/downloads/eclipse-packages/?show_instructions=TRUE), and choose **Eclipse IDE for C/C++ Developers** at Step 3.
|
||||
|
||||
Alternatively, you can also directly [download Eclipse IDE for C/C++ Developers](http://www.eclipse.org/downloads/eclipse-packages/) ([direct link to current version](http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/neonr)) and extract the package to the location of your choice (this creates an `eclipse` folder).
|
||||
|
||||
## First Launch
|
||||
When installation is complete, click the <kbd>Launch</kbd> button. (If you extracted the package manually, open the Eclipse installation folder and double-click the `eclipse` executable)
|
||||
|
||||
When you are prompted with the Workspace Selector, select a directory that will hold Eclipse metadata and usually your projects. **Do not select the `qmk_firmware` directory**, this will be the project directory. Select the parent folder instead, or another (preferably empty) folder of your choice (the default is fine if you do not use it yet).
|
||||
|
||||
Once started, click the <kbd>Workbench</kbd> button at the top right to switch to the workbench view (there is a also checkbox at the bottom to skip the welcome screen at startup).
|
||||
|
||||
## Install the necessary plugins
|
||||
Note: you do not need to restart Eclipse after installing each plugin. Simply restart once all plugins are installed.
|
||||
|
||||
### [The AVR plugin](http://avr-eclipse.sourceforge.net/)
|
||||
This is the most important plugin as it will allow Eclipse to _understand_ AVR C code. Follow [the instructions for using the update site](http://avr-eclipse.sourceforge.net/wiki/index.php/Plugin_Download#Update_Site), and agree with the security warning for unsigned content.
|
||||
|
||||
### [ANSI Escape in Console](https://marketplace.eclipse.org/content/ansi-escape-console)
|
||||
This plugin is necessary to properly display the colored build output generated by the QMK makefile.
|
||||
|
||||
1. Open <kbd><kbd>Help</kbd> > <kbd>Eclipse Marketplace…</kbd></kbd>
|
||||
2. Search for _ANSI Escape in Console_
|
||||
3. Click the <samp>Install</samp> button of the plugin
|
||||
4. Follow the instructions and agree again with the security warning for unsigned content.
|
||||
|
||||
Once both plugins are installed, restart Eclipse as prompted.
|
||||
|
||||
# Configure Eclipse for QMK
|
||||
## Importing the project
|
||||
1. Click <kbd><kbd>File</kbd> > <kbd>New</kbd> > <kbd>Makefile Project with Existing Code</kbd></kbd>
|
||||
2. On the next screen:
|
||||
* Select the directory where you cloned the repository as _Existing Code Location_;
|
||||
* (Optional) Give a different name to the project¹, e.g. _QMK_ or _Quantum_;
|
||||
* Select the _AVR-GCC Toolchain_;
|
||||
* Keep the rest as-is and click <kbd>Finish</kbd>
|
||||
|
||||

|
||||
|
||||
3. The project will now be loaded and indexed. Its files can be browsed easily through the _Project Explorer_ on the left.
|
||||
|
||||
¹ There might be issues for importing the project with a custom name. If it does not work properly, try leaving the default project name (i.e. the name of the directory, probably `qmk_firmware`).
|
||||
|
||||
## Build your keyboard
|
||||
We will now configure a make target that cleans the project and builds the keymap of your choice.
|
||||
|
||||
1. On the right side of the screen, select the <kbd>Make Target</kbd> tab
|
||||
2. Expand the folder structure to the keyboard of your choice, e.g. `qmk_firmware/keyboards/ergodox`
|
||||
3. Right-click on the keyboard folder and select <kbd>New…</kbd> (or select the folder and click the <kbd>New Make Target</kbd> icon above the tree)
|
||||
4. Choose a name for your build target, e.g. _clean \<your keymap\>_
|
||||
5. Make Target: this is the arguments that you give to `make` when building from the command line. If your target name does not match these arguments, uncheck <kbd>Same as target name</kbd> and input the correct arguments, e.g. `clean <your keymap>`
|
||||
6. Leave the other options checked and click <kbd>OK</kbd>. Your make target will now appear under the selected keyboard.
|
||||
7. (Optional) Toggle the <kbd>Hide Empty Folders</kbd> icon button above the targets tree to only show your build target.
|
||||
8. Double-click the build target you created to trigger a build.
|
||||
9. Select the <kbd>Console</kbd> view at the bottom to view the running build.
|
64
docs/Embedding.md
Normal file
64
docs/Embedding.md
Normal file
@ -0,0 +1,64 @@
|
||||
# WARNING: Until issue [#173](https://github.com/tmk/tmk_keyboard/issues/173) goes through, the [core][1] repository will not be up-to-date with the latest changes and fixes, but can still be used.
|
||||
|
||||
If you want to use TMK for your own keyboard project, you've got three options for embedding the [core][1].
|
||||
The recommended option is [subtrees](#1-git-subtree).
|
||||
|
||||
After adding the embed you'll need to [modify the Makefile](#modifications-to-the-makefile) of your project to point to the core correctly.
|
||||
|
||||
## 1. git subtree
|
||||
|
||||
In order to set up the subtree in your project, first add the core repository as a remote:
|
||||
```
|
||||
git remote add -f core https://github.com/tmk/tmk_core
|
||||
```
|
||||
|
||||
Then add the core as a subtree (directory) in your local repository:
|
||||
```
|
||||
git subtree add -P tmk_core core master --squash
|
||||
```
|
||||
|
||||
And that's it!
|
||||
|
||||
When you want to update the subtree in your repository to match the master on [tmk_core][1], do this:
|
||||
```
|
||||
git subtree pull -P tmk_core core master --squash
|
||||
```
|
||||
|
||||
## 2. git submodule
|
||||
|
||||
In order to set up the submodule in your project, first add a new submodule:
|
||||
```
|
||||
git submodule add https://github.com/tmk/tmk_core tmk_core
|
||||
```
|
||||
|
||||
Then pull, sync and update the submodule:
|
||||
```
|
||||
git pull
|
||||
git submodule sync --recursive
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
And that's it!
|
||||
|
||||
When you want to update the subtree in your repository to match the master on [tmk_core][1], follow the same steps as above.
|
||||
|
||||
If you want to clone a repository from GitHub that has submodule(s) in it, pass <kbd>--recursive</kbd> when cloning, like so:
|
||||
`git clone --recursive https://github.com/<username>/<repository>`
|
||||
|
||||
## 3. Manually (without git)
|
||||
|
||||
*Note: This is not recommended in any way, but it's still possible.*
|
||||
|
||||
Download a zipped version of the [tmk_core][1] repository using this link:
|
||||
<https://github.com/tmk/tmk_core/archive/master.zip>
|
||||
|
||||
Extract the zip in your project's directory, then rename the folder to <kbd>tmk_core</kbd>.
|
||||
|
||||
## Modifications to the *Makefile*
|
||||
|
||||
The one thing you have to make sure to change in the *Makefile* (compared to [tmk_keyboard](https://github.com/tmk/tmk_keyboard) drivers' *[Makefile](https://github.com/tmk/tmk_keyboard/blob/master/keyboard/gh60/Makefile#L45)*) is the "TMK_DIR" variable, which needs to point to the embed directory:
|
||||
```Makefile
|
||||
TMK_DIR = ./tmk_core
|
||||
```
|
||||
|
||||
[1]: https://github.com/tmk/tmk_core
|
151
docs/FAQ-Build.md
Normal file
151
docs/FAQ-Build.md
Normal file
@ -0,0 +1,151 @@
|
||||
## READ FIRST
|
||||
- https://github.com/jackhumbert/qmk_firmware/blob/master/doc/BUILD_GUIDE.md
|
||||
|
||||
In short,
|
||||
|
||||
$ make [-f Makefile.<variant>] [KEYMAP=...] clean
|
||||
$ make [-f Makefile.<variant>] [KEYMAP=...]
|
||||
$ make [-f Makefile.<variant>] [KEYMAP=...] dfu
|
||||
|
||||
|
||||
## Can't program on Linux and Mac
|
||||
You will need proper permission to operate a device. For Linux users see udev rules below.
|
||||
Easy way is to use `sudo` command, if you are not familiar with this command check its manual with `man sudo` or this page on line.
|
||||
|
||||
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/sudo.8.html
|
||||
|
||||
In short when your controller is ATMega32u4,
|
||||
|
||||
$ sudo dfu-programmer atmega32u4 erase --force
|
||||
$ sudo dfu-programmer atmega32u4 flash your.hex
|
||||
$ sudo dfu-programmer atmega32u4 reset
|
||||
|
||||
or just
|
||||
|
||||
$ sudo make dfu
|
||||
|
||||
But to run `make` with root privilege is not good idea. Use former method as possible.
|
||||
|
||||
## Do 'make clean' before 'make'
|
||||
You'll need `make clean` after you edit **config.h** or change options like `KEYMAP`.
|
||||
|
||||
Frist remove all files made in previous build,
|
||||
|
||||
$ make clean
|
||||
|
||||
then build new firmware.
|
||||
|
||||
$ make [KEYMAP=...]
|
||||
|
||||
Also you can always try `make clean` when you get other strange result during build.
|
||||
|
||||
|
||||
## WINAVR is obsolete
|
||||
It is no longer recommended and may cause some problem.
|
||||
See [Issue #99](https://github.com/tmk/tmk_keyboard/issues/99).
|
||||
|
||||
## USB stack: LUFA or PJRC?
|
||||
Use **LUFA**.
|
||||
|
||||
**PJRC** stack won't be supported actively anymore. There is no reason to hesitate to use LUFA except for binary size(about 1KB lager?). But **PJRC** is still very useful for debug and development purpose.
|
||||
See also [Issue #50](https://github.com/tmk/tmk_keyboard/issues/50) and [Issue #58](https://github.com/tmk/tmk_keyboard/issues/58).
|
||||
|
||||
## Edit configuration but not change
|
||||
You will need followings after editing `CONSOLE_ENABLE`, `NKRO_ENABLE`, `EXTRAKEY_ENABLE` or `MOUSEKEY_ENABLE` option in **Makefile**.
|
||||
|
||||
### 1. make clean
|
||||
This will be needed when you edit **config.h**.
|
||||
|
||||
### 2. Remove Drivers from Device Manager(Windows)
|
||||
**Windows only.** Linux, OSX and other OS's doesn't require this. It looks like Windows keeps using driver installed when device was connected first time even after the device changes its configuration. To load proper drivers for new configuration you need to remove existent drivers from **Drvice Manager**.
|
||||
|
||||
### 3. Build with different VID:PID
|
||||
**Windows only.** If method 2. does't work fou you try this. Change Vendor ID or Product ID in **config.h** and build firmware. Windows should recognize it as whole new device and start drivers install process.
|
||||
|
||||
### 4. Just try other ports
|
||||
This will be useful and the easiest workaround for **Windows**.
|
||||
|
||||
|
||||
|
||||
## USB VID and PID
|
||||
You can use any ID you want with editing `config.h`. Using any presumably unused ID will be no problem in fact except for very least chance of collision with other product.
|
||||
|
||||
For example TMK uses following numbers by default.
|
||||
```
|
||||
keyboard:
|
||||
hhkb: FEED:CAFE
|
||||
gh60: FEED:6060
|
||||
|
||||
converter:
|
||||
x68k: FEED:6800
|
||||
ps2: FEED:6512
|
||||
adb: FEED:0ADB
|
||||
ibm4704: FEED:4704
|
||||
pc98: FEED:9898
|
||||
```
|
||||
|
||||
Also see this.
|
||||
https://github.com/tmk/tmk_keyboard/issues/150
|
||||
|
||||
You can buy a really unique VID:PID here. I don't think you need this for personal use.
|
||||
- http://www.obdev.at/products/vusb/license.html
|
||||
- http://www.mcselec.com/index.php?page=shop.product_details&flypage=shop.flypage&product_id=92&option=com_phpshop&Itemid=1
|
||||
|
||||
|
||||
## Linux udev rules
|
||||
On Linux you need proper privilege to access device file of MCU, you'll have to use `sudo` when flashing firmware. You can circumvent this with placing these files in `/etc/udev/rules.d/`.
|
||||
|
||||
**/etc/udev/rules.d/50-atmel-dfu.rules:**
|
||||
```
|
||||
# Atmel ATMega32U4
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", MODE:="0666"
|
||||
# Atmel USBKEY AT90USB1287
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", MODE:="0666"
|
||||
# Atmel ATMega32U2
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="0666"
|
||||
```
|
||||
|
||||
**/etc/udev/rules.d/52-tmk-keyboard.rules:**
|
||||
```
|
||||
# tmk keyboard products https://github.com/tmk/tmk_keyboard
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Cortex: cstddef: No such file or directory
|
||||
GCC 4.8 of Ubuntu 14.04 had this problem and had to update to 4.9 with this PPA.
|
||||
https://launchpad.net/~terry.guo/+archive/ubuntu/gcc-arm-embedded
|
||||
|
||||
https://github.com/tmk/tmk_keyboard/issues/212
|
||||
https://github.com/tmk/tmk_keyboard/wiki/mbed-cortex-porting#compile-error-cstddef
|
||||
https://developer.mbed.org/forum/mbed/topic/5205/
|
||||
|
||||
|
||||
## 'clock_prescale_set' and 'clock_div_1' not available
|
||||
Your toolchain is too old to support the MCU. For example WinAVR 20100110 doesn't support ATMega32u2.
|
||||
|
||||
```
|
||||
Compiling C: ../../tmk_core/protocol/lufa/lufa.c
|
||||
avr-gcc -c -mmcu=atmega32u2 -gdwarf-2 -DF_CPU=16000000UL -DINTERRUPT_CONTROL_ENDPOINT -DBOOTLOADER_SIZE=4096 -DF_USB=16000000UL -DARCH=ARCH_AVR8 -DUSB_DEVICE_ONLY -DUSE_FLASH_DESCRIPTORS -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -DFIXED_CONTROL_ENDPOINT_SIZE=8 -DFIXED_NUM_CONFIGURATIONS=1 -DPROTOCOL_LUFA -DEXTRAKEY_ENABLE -DCONSOLE_ENABLE -DCOMMAND_ENABLE -DVERSION=unknown -Os -funsigned-char -funsigned-bitfields -ffunction-sections -fdata-sections -fno-inline-small-functions -fpack-struct -fshort-enums -fno-strict-aliasing -Wall -Wstrict-prototypes -Wa,-adhlns=obj_alps64/protocol/lufa/lufa.lst -I. -I../../tmk_core -I../../tmk_core/protocol/lufa -I../../tmk_core/protocol/lufa/LUFA-git -I../../tmk_core/common -std=gnu99 -include config.h -MMD -MP -MF .dep/obj_alps64_protocol_lufa_lufa.o.d ../../tmk_core/protocol/lufa/lufa.c -o obj_alps64/protocol/lufa/lufa.o
|
||||
../../tmk_core/protocol/lufa/lufa.c: In function 'setup_mcu':
|
||||
../../tmk_core/protocol/lufa/lufa.c:575: warning: implicit declaration of function 'clock_prescale_set'
|
||||
../../tmk_core/protocol/lufa/lufa.c:575: error: 'clock_div_1' undeclared (first use in this function)
|
||||
../../tmk_core/protocol/lufa/lufa.c:575: error: (Each undeclared identifier is reported only once
|
||||
../../tmk_core/protocol/lufa/lufa.c:575: error: for each function it appears in.)
|
||||
make: *** [obj_alps64/protocol/lufa/lufa.o] Error 1
|
||||
```
|
||||
|
||||
|
||||
## BOOTLOADER_SIZE for AVR
|
||||
Note that Teensy2.0++ bootloader size is 2048byte. Some Makefiles may have wrong comment.
|
||||
|
||||
```
|
||||
# Boot Section Size in *bytes*
|
||||
# Teensy halfKay 512
|
||||
# Teensy++ halfKay 2048
|
||||
# Atmel DFU loader 4096 (TMK Alt Controller)
|
||||
# LUFA bootloader 4096
|
||||
# USBaspLoader 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=2048
|
||||
```
|
248
docs/FAQ-Keymap.md
Normal file
248
docs/FAQ-Keymap.md
Normal file
@ -0,0 +1,248 @@
|
||||
## READ FIRST
|
||||
https://github.com/tmk/tmk_core/blob/master/doc/keymap.md
|
||||
|
||||
## How to get keycode
|
||||
See [Keycodes](Keycodes). Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h).
|
||||
|
||||
## Sysrq key
|
||||
Use keycode for Print Screen(`KC_PSCREEN` or `KC_PSCR`) instead of `KC_SYSREQ`. Key combination of 'Alt + Print Screen' is recognized as 'System request'.
|
||||
|
||||
See [issue #168](https://github.com/tmk/tmk_keyboard/issues/168) and
|
||||
- http://en.wikipedia.org/wiki/Magic_SysRq_key
|
||||
- http://en.wikipedia.org/wiki/System_request
|
||||
|
||||
## Power key doesn't work
|
||||
Use `KC_PWR` instead of `KC_POWER` or vice versa.
|
||||
- `KC_PWR` works with Windows and Linux, not with OSX.
|
||||
- `KC_POWER` works with OSX and Linux, not with Windows.
|
||||
|
||||
http://geekhack.org/index.php?topic=14290.msg1327264#msg1327264
|
||||
|
||||
## Oneshot modifier
|
||||
Solves my personal 'the' problem. I often got 'the' or 'THe' wrongly instead of 'The'. Oneshot Shift mitgates this for me.
|
||||
https://github.com/tmk/tmk_keyboard/issues/67
|
||||
|
||||
## Modifier/Layer stuck
|
||||
Modifier keys or layers can be stuck unless layer switching is configured properly.
|
||||
For Modifier keys and layer actions you have to place `KC_TRANS` on same position of destination layer to unregister the modifier key or return to previous layer on release event.
|
||||
|
||||
- https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#31-momentary-switching
|
||||
- http://geekhack.org/index.php?topic=57008.msg1492604#msg1492604
|
||||
- https://github.com/tmk/tmk_keyboard/issues/248
|
||||
|
||||
|
||||
## Mechanical Lock Switch Support
|
||||
https://github.com/tmk/tmk_keyboard#mechanical-locking-support
|
||||
|
||||
This feature is for *mechanical lock switch* like this Alps one.
|
||||
http://deskthority.net/wiki/Alps_SKCL_Lock
|
||||
|
||||
Using enabling this feature and using keycodes `LCAP`, `LNUM` or `LSCR` in keymap you can use physical locking CapsLock, NumLock or ScrollLock keys as you expected.
|
||||
|
||||
Old vintage mechanical keyboards occasionally have lock switches but modern ones don't have. ***You don't need this feature in most case and just use keycodes `CAPS`, `NLCK` and `SLCK`.***
|
||||
|
||||
|
||||
## Input special charactors other than ASCII like Cédille 'Ç'
|
||||
NO UNIVERSAL METHOD TO INPUT THOSE WORKS OVER ALL SYSTEMS. You have to define **MACRO** in way specific to your OS or layout.
|
||||
|
||||
See this post for example **MACRO** code.
|
||||
|
||||
http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478-120.html#p195620
|
||||
|
||||
On **Windows** you can use `AltGr` key or **Alt code**.
|
||||
- http://en.wikipedia.org/wiki/AltGr_key
|
||||
- http://en.wikipedia.org/wiki/Alt_code
|
||||
|
||||
On **Mac** OS defines `Option` key combinations.
|
||||
- http://en.wikipedia.org/wiki/Option_key#Alternative_keyboard_input
|
||||
|
||||
On **Xorg** you can use `compose` key, instead.
|
||||
- http://en.wikipedia.org/wiki/Compose_key
|
||||
|
||||
And see this for **Unicode** input.
|
||||
- http://en.wikipedia.org/wiki/Unicode_input
|
||||
|
||||
|
||||
## Apple/Mac keyboard Fn
|
||||
Not supported.
|
||||
|
||||
Apple/Mac keyboard sends keycode for Fn unlike most of other keyboards.
|
||||
I think you can send Apple Fn key using Apple venter specific Page 0xff01 and usage 0x0003. But you have to change HID Report Descriptor for this, of course.
|
||||
|
||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/AppleHIDUsageTables.h
|
||||
|
||||
|
||||
## Media control keys in Mac OSX
|
||||
#### KC_MNXT and KC_MPRV does not work on Mac
|
||||
Use `KC_MFFD`(`KC_MEDIA_FAST_FORWARD`) and `KC_MRWD`(`KC_MEDIA_REWIND`) instead of `KC_MNXT` and `KC_MPRV`.
|
||||
See https://github.com/tmk/tmk_keyboard/issues/195
|
||||
|
||||
|
||||
## Keys supported in Mac OSX?
|
||||
You can know which keycodes are supported in OSX from this source code.
|
||||
|
||||
`usb_2_adb_keymap` array maps Keyboard/Keypad Page usages to ADB scancodes(OSX internal keycodes).
|
||||
|
||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/Cosmo_USB2ADB.c
|
||||
|
||||
And `IOHIDConsumer::dispatchConsumerEvent` handles Consumer page usages.
|
||||
|
||||
https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-606.1.7/IOHIDFamily/IOHIDConsumer.cpp
|
||||
|
||||
|
||||
## JIS keys in Mac OSX
|
||||
Japanese JIS keyboard specific keys like `無変換(Muhenkan)`, `変換(Henkan)`, `ひらがな(hiragana)` are not recognized on OSX. You can use **Seil** to enable those keys, try following options.
|
||||
|
||||
* Enable NFER Key on PC keyboard
|
||||
* Enable XFER Key on PC keyboard
|
||||
* Enable KATAKANA Key on PC keyboard
|
||||
|
||||
https://pqrs.org/osx/karabiner/seil.html
|
||||
|
||||
|
||||
## RN-42 Bluetooth doesn't work with Karabiner
|
||||
Karabiner - Keymapping tool on Mac OSX - ignores inputs from RN-42 module by default. You have to enable this option to make Karabiner working with your keyboard.
|
||||
https://github.com/tekezo/Karabiner/issues/403#issuecomment-102559237
|
||||
|
||||
See these for the deail of this problem.
|
||||
https://github.com/tmk/tmk_keyboard/issues/213
|
||||
https://github.com/tekezo/Karabiner/issues/403
|
||||
|
||||
|
||||
## Esc and `~ on a key
|
||||
|
||||
|
||||
You can define FC660 and Poker style ESC with `ACTION_LAYER_MODS`.
|
||||
https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers
|
||||
|
||||
```
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
/* Leopold FC660
|
||||
* https://elitekeyboards.com/products.php?sub=leopold,compact&pid=fc660c
|
||||
* Shift + Esc = ~
|
||||
* Fn + Esc = `
|
||||
*
|
||||
* Votex Poker II
|
||||
* https://adprice.fedorapeople.org/poker2_manual.pdf
|
||||
* Fn + Esc = `
|
||||
* Fn + Shift + Esc = ~
|
||||
*/
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* 0: qwerty */
|
||||
[0] = KEYMAP( \
|
||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
|
||||
LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \
|
||||
FN0, NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,ESC, \
|
||||
LCTL,LGUI,LALT, SPC, RALT,FN1, RGUI,RCTL),
|
||||
[1] = KEYMAP( \
|
||||
GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
|
||||
[2] = KEYMAP( \
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
// https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#35-momentary-switching-with-modifiers
|
||||
[0] = ACTION_LAYER_MODS(1, MOD_LSFT),
|
||||
[1] = ACTION_LAYER_MOMENTARY(2),
|
||||
};
|
||||
```
|
||||
|
||||
Otherwise, you can write code, see this.
|
||||
https://github.com/p3lim/keyboard_firmware/commit/fd799c12b69a5ab5addd1d4c03380a1b8ef8e9dc
|
||||
|
||||
|
||||
## 32 Fn keys are not enough?
|
||||
### actionmap
|
||||
It uses 16 bit codes and has no limitation of 32 Fn at the expense of memory space. TMK keymap is actually is 8 bit codes as subset of the actionmap.
|
||||
https://github.com/tmk/tmk_keyboard/issues?utf8=%E2%9C%93&q=is%3Aissue+actionmap
|
||||
|
||||
### extension for modified keys
|
||||
https://geekhack.org/index.php?topic=41989.msg1885526#msg1885526
|
||||
|
||||
|
||||
## Arrow on Right Modifier keys with Dual-Role
|
||||
This turns right modifer keys into arrow keys when the keys are tapped while still modifiers when the keys are hold. In TMK the dual-role function is dubbed **TAP**.
|
||||
```
|
||||
#include "keymap_common.h"
|
||||
|
||||
|
||||
/* Arrow keys on right modifier keys with TMK dual role feature
|
||||
*
|
||||
* https://github.com/tmk/tmk_core/blob/master/doc/keymap.md#213-modifier-with-tap-keydual-role
|
||||
* https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys
|
||||
*/
|
||||
const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
/* 0: qwerty */
|
||||
[0] = KEYMAP( \
|
||||
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
|
||||
LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, \
|
||||
LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH,FN0, ESC, \
|
||||
FN4, LGUI,LALT, SPC, APP, FN2, FN1, FN3),
|
||||
[1] = KEYMAP( \
|
||||
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,\
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \
|
||||
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN5, TRNS, \
|
||||
TRNS,TRNS,TRNS, TRNS, TRNS,FN7, FN6, FN8),
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_UP),
|
||||
[1] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_DOWN),
|
||||
[2] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_LEFT),
|
||||
[3] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RIGHT),
|
||||
[4] = ACTION_LAYER_MOMENTARY(1),
|
||||
[5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_PGUP),
|
||||
[6] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_PGDN),
|
||||
[7] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_HOME),
|
||||
[8] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_END),
|
||||
};
|
||||
|
||||
```
|
||||
|
||||
|
||||
Dual-role key: https://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys
|
||||
|
||||
|
||||
## Eject on Mac OSX
|
||||
`EJCT` keycode works on OSX. https://github.com/tmk/tmk_keyboard/issues/250
|
||||
It seems Windows 10 ignores the code and Linux/Xorg recognizes but has no mapping by default.
|
||||
|
||||
Not sure what keycode Eject is on genuine Apple keyboard actually. HHKB uses `F20` for Eject key(`Fn+f`) on Mac mode but this is not same as Apple Eject keycode probably.
|
||||
|
||||
|
||||
|
||||
## What's weak_mods and real_mods in action_util.c
|
||||
___TO BE IMPROVED___
|
||||
|
||||
real_mods is intended to retains state of real/physical modifier key state, while
|
||||
weak_mods retains state of virtual or temprary modifiers which should not affect state real modifier key.
|
||||
|
||||
Let's say you hold down physical left shift key and type ACTION_MODS_KEY(LSHIFT, KC_A),
|
||||
|
||||
with weak_mods,
|
||||
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
||||
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): weak_mods |= MOD_BIT(LSHIFT)
|
||||
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): waek_mods &= ~MOD_BIT(LSHIFT)
|
||||
real_mods still keeps modifier state.
|
||||
|
||||
without weak mods,
|
||||
* (1) hold down left shift: real_mods |= MOD_BIT(LSHIFT)
|
||||
* (2) press ACTION_MODS_KEY(LSHIFT, KC_A): real_mods |= MOD_BIT(LSHIFT)
|
||||
* (3) release ACTION_MODS_KEY(LSHIFT, KC_A): real_mods &= ~MOD_BIT(LSHIFT)
|
||||
here real_mods lost state for 'physical left shift'.
|
||||
|
||||
weak_mods is ORed with real_mods when keyboard report is sent.
|
||||
https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57
|
238
docs/FAQ.md
Normal file
238
docs/FAQ.md
Normal file
@ -0,0 +1,238 @@
|
||||
## READ FIRST
|
||||
- **README** of top directory : https://github.com/tmk/tmk_keyboard/blob/master/README.md
|
||||
- **README** of target project(keyboard/converter) directory.
|
||||
|
||||
Note that you'll need to read **both**.
|
||||
|
||||
|
||||
# Build
|
||||
- [[FAQ/Build]]
|
||||
|
||||
|
||||
# Keymap
|
||||
- [[FAQ/Keymap]]
|
||||
|
||||
|
||||
# Debug Console
|
||||
## hid_listen can't recognize device
|
||||
When debug console of your device is not ready you will see like this:
|
||||
|
||||
Waiting for device:.........
|
||||
|
||||
once the device is pluged in then *hid_listen* finds it you will get this message:
|
||||
|
||||
Waiting for new device:.........................
|
||||
Listening:
|
||||
|
||||
Check if you can't get this 'Listening:' message:
|
||||
- build with `CONSOLE_ENABLE=yes` in **Makefile**.
|
||||
|
||||
You may need privilege to access the device on OS like Linux.
|
||||
- try `sudo hid_listen`
|
||||
|
||||
## Can't get message on console
|
||||
Check:
|
||||
- *hid_listen* finds your device. See above.
|
||||
- Enable debug with pressing **Magic**+d. See [Magic Commands](https://github.com/tmk/tmk_keyboard#magic-commands).
|
||||
- set `debug_enable=true` usually in `matrix_init()` in **matrix.c**.
|
||||
- try using 'print' function instead of debug print. See **common/print.h**.
|
||||
- disconnect other devices with console function. See [Issue #97](https://github.com/tmk/tmk_keyboard/issues/97).
|
||||
|
||||
## Linux or UNIX like system requires Super User privilege
|
||||
Just use 'sudo' to execute *hid_listen* with privilege.
|
||||
```
|
||||
$ sudo hid_listen
|
||||
```
|
||||
|
||||
Or add an *udev rule* for TMK devices with placing a file in rules directory. The directory may vary on each system.
|
||||
|
||||
File: /etc/udev/rules.d/52-tmk-keyboard.rules(in case of Ubuntu)
|
||||
```
|
||||
# tmk keyboard products https://github.com/tmk/tmk_keyboard
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666"
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Miscellaneous
|
||||
## NKRO Doesn't work
|
||||
First you have to compile frimware with this build option `NKRO_ENABLE` in **Makefile**.
|
||||
|
||||
Try `Magic` **N** command(`LShift+RShift+N` by default) when **NKRO** still doesn't work. You can use this command to toggle between **NKRO** and **6KRO** mode temporarily. In some situations **NKRO** doesn't work you need to switch to **6KRO** mode, in particular when you are in BIOS.
|
||||
|
||||
If your firmeare built with `BOOTMAGIC_ENABLE` you need to turn its switch on by `BootMagic` **N** command(`Space+N` by default). This setting is stored in EEPROM and keeped over power cycles.
|
||||
|
||||
https://github.com/tmk/tmk_keyboard#boot-magic-configuration---virtual-dip-switch
|
||||
|
||||
|
||||
## TrackPoint needs reset circuit(PS/2 mouse support)
|
||||
Without reset circuit you will have inconsistent reuslt due to improper initialize of the hardware. See circuit schematic of TPM754.
|
||||
|
||||
- http://geekhack.org/index.php?topic=50176.msg1127447#msg1127447
|
||||
- http://www.mikrocontroller.net/attachment/52583/tpm754.pdf
|
||||
|
||||
|
||||
## Can't read column of matrix beyond 16
|
||||
Use `1UL<<16` instead of `1<<16` in `read_cols()` in **matrix.h** when your columns goes beyond 16.
|
||||
|
||||
In C `1` means one of **int** type which is **16bit** in case of AVR so you can't shift left more than 15. You will get unexpected zero when you say `1<<16`. You have to use **unsigned long** type with `1UL`.
|
||||
|
||||
http://deskthority.net/workshop-f7/rebuilding-and-redesigning-a-classic-thinkpad-keyboard-t6181-60.html#p146279
|
||||
|
||||
|
||||
|
||||
## Pull-up Resistor
|
||||
In some case converters needed to have pull-up resistors to work correctly. Place the resistor between VCC and signal line in parallel.
|
||||
|
||||
For example:
|
||||
```
|
||||
Keyboard Conveter
|
||||
,------.
|
||||
5V------+------|VCC |
|
||||
| | |
|
||||
R | |
|
||||
| | |
|
||||
Signal--+------|PD0 |
|
||||
| |
|
||||
GND------------|GND |
|
||||
`------'
|
||||
R: 1K Ohm resistor
|
||||
```
|
||||
|
||||
https://github.com/tmk/tmk_keyboard/issues/71
|
||||
|
||||
|
||||
## Arduino Micro's pin naming is confusing
|
||||
Note that Arduino Micro PCB marking is different from real AVR port name. D0 of Arduino Micro is not PD0, PD0 is D3. Check schematic yourself.
|
||||
http://arduino.cc/en/uploads/Main/arduino-micro-schematic.pdf
|
||||
|
||||
|
||||
|
||||
## Bootloader jump doesn't work
|
||||
Properly configure bootloader size in **Makefile**. With wrong section size bootloader won't probably start with **Magic command** and **Boot Magic**.
|
||||
```
|
||||
# Size of Bootloaders in bytes:
|
||||
# Atmel DFU loader(ATmega32U4) 4096
|
||||
# Atmel DFU loader(AT90USB128) 8192
|
||||
# LUFA bootloader(ATmega32U4) 4096
|
||||
# Arduino Caterina(ATmega32U4) 4096
|
||||
# USBaspLoader(ATmega***) 2048
|
||||
# Teensy halfKay(ATmega32U4) 512
|
||||
# Teensy++ halfKay(AT90USB128) 2048
|
||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
|
||||
```
|
||||
AVR Boot section size are defined by setting **BOOTSZ** fuse in fact. Consult with your MCU datasheet.
|
||||
Note that **Word**(2 bytes) size and address are used in datasheet while TMK uses **Byte**.
|
||||
|
||||
AVR Boot section is located at end of Flash memory like the followings.
|
||||
```
|
||||
byte Atmel/LUFA(ATMega32u4) byte Atmel(AT90SUB1286)
|
||||
0x0000 +---------------+ 0x00000 +---------------+
|
||||
| | | |
|
||||
| | | |
|
||||
| Application | | Application |
|
||||
| | | |
|
||||
= = = =
|
||||
| | 32KB-4KB | | 128KB-8KB
|
||||
0x6000 +---------------+ 0x1E000 +---------------+
|
||||
| Bootloader | 4KB | Bootloader | 8KB
|
||||
0x7FFF +---------------+ 0x1FFFF +---------------+
|
||||
|
||||
|
||||
byte Teensy(ATMega32u4) byte Teensy++(AT90SUB1286)
|
||||
0x0000 +---------------+ 0x00000 +---------------+
|
||||
| | | |
|
||||
| | | |
|
||||
| Application | | Application |
|
||||
| | | |
|
||||
= = = =
|
||||
| | 32KB-512B | | 128KB-2KB
|
||||
0x7E00 +---------------+ 0x1FC00 +---------------+
|
||||
| Bootloader | 512B | Bootloader | 2KB
|
||||
0x7FFF +---------------+ 0x1FFFF +---------------+
|
||||
```
|
||||
|
||||
And see this discussion for further reference.
|
||||
https://github.com/tmk/tmk_keyboard/issues/179
|
||||
|
||||
|
||||
## Special Extra key doesn't work(System, Audio control keys)
|
||||
You need to define `EXTRAKEY_ENABLE` in **makefile** to use them in TMK.
|
||||
```
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
```
|
||||
http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478-60.html#p157919
|
||||
|
||||
|
||||
## Wakeup from sleep doesn't work
|
||||
In Windows check `Allow this device to wake the computer` setting in Power **Management property** tab of **Device Manager**. Also check BIOS setting.
|
||||
|
||||
Pressing any key during sleep should wake host.
|
||||
|
||||
|
||||
## Using Arduino?
|
||||
**Note that Arduino pin naming is different from actual chip.** For example, Arduino pin `D0` is not `PD0`. Check circuit with its schematics yourself.
|
||||
|
||||
- http://arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf
|
||||
- http://arduino.cc/en/uploads/Main/arduino-micro-schematic.pdf
|
||||
|
||||
Arduino leonardo and micro have **ATMega32U4** and can be used for TMK, though Arduino bootloader may be a problem.
|
||||
|
||||
|
||||
## Using PF4-7 pins of USB AVR?
|
||||
You need to set JTD bit of MCUCR yourself to use PF4-7 as GPIO. Those pins are configured to serve JTAG function by default. MCUs like ATMega*U* or AT90USB* are affeteced with this.
|
||||
|
||||
If you are using Teensy this isn't needed. Teensy is shipped with JTAGEN fuse bit unprogrammed to disable the function.
|
||||
|
||||
See this code.
|
||||
```
|
||||
// JTAG disable for PORT F. write JTD bit twice within four cycles.
|
||||
MCUCR |= (1<<JTD);
|
||||
MCUCR |= (1<<JTD);
|
||||
```
|
||||
https://github.com/tmk/tmk_keyboard/blob/master/keyboard/hbkb/matrix.c#L67
|
||||
|
||||
And read **26.5.1 MCU Control Register – MCUCR** of ATMega32U4 datasheet.
|
||||
|
||||
|
||||
## Adding LED indicators of Lock keys
|
||||
You need your own LED indicators for CapsLock, ScrollLock and NumLock? See this post.
|
||||
|
||||
http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478-120.html#p191560
|
||||
|
||||
## Program Arduino Micro/Leonardo
|
||||
Push reset button and then run command like this within 8 seconds.
|
||||
|
||||
```
|
||||
avrdude -patmega32u4 -cavr109 -b57600 -Uflash:w:adb_usb.hex -P/dev/ttyACM0
|
||||
```
|
||||
|
||||
Device name will vary depending on your system.
|
||||
|
||||
http://arduino.cc/en/Main/ArduinoBoardMicro
|
||||
https://geekhack.org/index.php?topic=14290.msg1563867#msg1563867
|
||||
|
||||
|
||||
## USB 3 compatibility
|
||||
I heard some people have a problem with USB 3 port, try USB 2 port.
|
||||
|
||||
|
||||
## Mac compatibility
|
||||
### OS X 10.11 and Hub
|
||||
https://geekhack.org/index.php?topic=14290.msg1884034#msg1884034
|
||||
|
||||
|
||||
## Problem on BIOS(UEFI)/Resume(Sleep&Wake)/Power cycles
|
||||
Some people reported their keyboard stops working on BIOS and/or after resume(power cycles).
|
||||
|
||||
As of now root of its cause is not clear but some build options seem to be related. In Makefile try to disable those options like `CONSOLE_ENABLE`, `NKRO_ENABLE`, `SLEEP_LED_ENABLE` and/or others.
|
||||
|
||||
https://github.com/tmk/tmk_keyboard/issues/266
|
||||
https://geekhack.org/index.php?topic=41989.msg1967778#msg1967778
|
||||
|
||||
|
||||
|
||||
## FLIP doesn't work
|
||||
### AtLibUsbDfu.dll not found
|
||||
Remove current driver and reinstall one FLIP provides from DeviceManager.
|
||||
http://imgur.com/a/bnwzy
|
7
docs/Git-subtree.md
Normal file
7
docs/Git-subtree.md
Normal file
@ -0,0 +1,7 @@
|
||||
## Update core branch procedure
|
||||
git co master
|
||||
git subtree split -P tmk_core -b <tmp_branch>
|
||||
git co core
|
||||
git merge <tmp_branch>
|
||||
git co master
|
||||
git subtree merge -P tmk_core --squash
|
5
docs/HHKB-Alt-controller.md
Normal file
5
docs/HHKB-Alt-controller.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Alternative Controller for HHKB
|
||||
|
||||
* [Geekhack.org thread](https://geekhack.org/index.php?topic=12047.0)
|
||||
|
||||
* [Connector unmate](https://geekhack.org/index.php?topic=12047.msg1543860#msg1543860)
|
183
docs/Home.md
Normal file
183
docs/Home.md
Normal file
@ -0,0 +1,183 @@
|
||||
# Quantum Mechanical Keyboard Firmware
|
||||
|
||||
You have found the QMK Firmware documentation site. This is a keyboard firmware based on the [tmk\_keyboard firmware](http://github.com/tmk/tmk_keyboard) \([view differences](/Differences-from-TMK.md)\) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). It has also been ported to ARM chips using ChibiOS. You can use it to power your own hand-wired or custom keyboard PCB.
|
||||
|
||||
# Getting started
|
||||
|
||||
Before you are able to compile, you'll need to install an environment for AVR or ARM development. You'll find the instructions for any OS below. If you find another/better way to set things up from scratch, please consider [making a pull request](https://github.com/qmk/qmk_firmware/pulls) with your changes!
|
||||
|
||||
* [Build Environment Setup](/Build-Environment-Setup.md)
|
||||
* [QMK Overview](/QMK-Overview.md)
|
||||
|
||||
# Configuring QMK Firmware
|
||||
|
||||
The QMK Firmware can be configured via the `keymaps` array data. For simply generating a [basic keycode](/Keycodes.md), you add it as an element of your `keymaps` array data. For more complicated actions, there are more advanced keycodes that are organized carefully to represent common operations, some of which can be found on the [Key Functions](/Key-Functions.md) page.
|
||||
|
||||
For more details of the `keymaps` array, see [Keymap Overview](/Keymap.md) page.
|
||||
|
||||
## Space Cadet Shift: The future, built in
|
||||
|
||||
Steve Losh [described](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/) the Space Cadet Shift quite well. Essentially, you hit the left Shift on its own, and you get an opening parenthesis; hit the right Shift on its own, and you get the closing one. When hit with other keys, the Shift key keeps working as it always does. Yes, it's as cool as it sounds. Head on over to the [Space Cadet Shift](/Space-Cadet-Shift.md) page to read about it.
|
||||
|
||||
## The Leader key: A new kind of modifier
|
||||
|
||||
Most modifiers have to be held or toggled. But what if you had a key that indicated the start of a sequence? You could press that key and then rapidly press 1-3 more keys to trigger a macro, or enter a special layer, or anything else you might want to do. To learn more about it check out the [Leader Key](/Leader-Key.md) page.
|
||||
|
||||
## Tap Dance: A single key can do 3, 5, or 100 different things
|
||||
|
||||
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. Read more about it on the [Tap Dance](/Tap-Dance.md) page.
|
||||
|
||||
## Temporarily setting the default layer
|
||||
|
||||
`DF(layer)` - sets default layer to _layer_. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
|
||||
|
||||
## Macro shortcuts: Send a whole string when pressing just one key
|
||||
|
||||
How would you like a single keypress to send a whole word, sentence, paragraph, or even document? Head on over to the [Macros](/Macros.md) page to read up on all aspects of Simple and Dynamic Macros.
|
||||
|
||||
## Additional keycode aliases for software-implemented layouts \(Colemak, Dvorak, etc\)
|
||||
|
||||
Everything is assuming you're in Qwerty \(in software\) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
|
||||
|
||||
```
|
||||
#include <keymap_colemak.h>
|
||||
```
|
||||
|
||||
If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to:
|
||||
|
||||
* `CM_*` for all of the Colemak-equivalent characters
|
||||
* `DV_*` for all of the Dvorak-equivalent characters
|
||||
|
||||
These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features.
|
||||
|
||||
To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F`. Using `KC_F` under these same circumstances would result in `T`.
|
||||
|
||||
## Backlight Breathing
|
||||
|
||||
In order to enable backlight breathing, the following line must be added to your config.h file.
|
||||
|
||||
```
|
||||
#define BACKLIGHT_BREATHING
|
||||
```
|
||||
|
||||
The following function calls are used to control the breathing effect.
|
||||
|
||||
* `breathing_enable()` - Enable the free-running breathing effect.
|
||||
* `breathing_disable()` - Disable the free-running breathing effect immediately.
|
||||
* `breathing_self_disable()` - Disable the free-running breathing effect after the current effect ends.
|
||||
* `breathing_toggle()` - Toggle the free-running breathing effect.
|
||||
* `breathing_defaults()` - Reset the speed and brightness settings of the breathing effect.
|
||||
|
||||
The following function calls are used to control the maximum brightness of the breathing effect.
|
||||
|
||||
* `breathing_intensity_set(value)` - Set the brightness of the breathing effect when it is at its max value.
|
||||
* `breathing_intensity_default()` - Reset the brightness of the breathing effect to the default value based on the current backlight intensity.
|
||||
|
||||
The following function calls are used to control the cycling speed of the breathing effect.
|
||||
|
||||
* `breathing_speed_set(value)` - Set the speed of the breathing effect - how fast it cycles.
|
||||
* `breathing_speed_inc(value)` - Increase the speed of the breathing effect by a fixed value.
|
||||
* `breathing_speed_dec(value)` - Decrease the speed of the breathing effect by a fixed value.
|
||||
* `breathing_speed_default()` - Reset the speed of the breathing effect to the default value.
|
||||
|
||||
The following example shows how to enable the backlight breathing effect when the FUNCTION layer macro button is pressed:
|
||||
|
||||
```
|
||||
case MACRO_FUNCTION:
|
||||
if (record->event.pressed)
|
||||
{
|
||||
breathing_speed_set(3);
|
||||
breathing_enable();
|
||||
layer_on(LAYER_FUNCTION);
|
||||
}
|
||||
else
|
||||
{
|
||||
breathing_speed_set(1);
|
||||
breathing_self_disable();
|
||||
layer_off(LAYER_FUNCTION);
|
||||
}
|
||||
break;
|
||||
```
|
||||
|
||||
The following example shows how to pulse the backlight on-off-on when the RAISED layer macro button is pressed:
|
||||
|
||||
```
|
||||
case MACRO_RAISED:
|
||||
if (record->event.pressed)
|
||||
{
|
||||
layer_on(LAYER_RAISED);
|
||||
breathing_speed_set(2);
|
||||
breathing_pulse();
|
||||
update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
|
||||
}
|
||||
else
|
||||
{
|
||||
layer_off(LAYER_RAISED);
|
||||
update_tri_layer(LAYER_LOWER, LAYER_RAISED, LAYER_ADJUST);
|
||||
}
|
||||
break;
|
||||
```
|
||||
|
||||
## Other firmware shortcut keycodes
|
||||
|
||||
* `RESET` - puts the MCU in DFU mode for flashing new firmware \(with `make dfu`\)
|
||||
* `DEBUG` - the firmware into debug mode - you'll need hid\_listen to see things
|
||||
* `BL_ON` - turns the backlight on
|
||||
* `BL_OFF` - turns the backlight off
|
||||
* `BL_<n>` - sets the backlight to level _n_
|
||||
* `BL_INC` - increments the backlight level by one
|
||||
* `BL_DEC` - decrements the backlight level by one
|
||||
* `BL_TOGG` - toggles the backlight
|
||||
* `BL_STEP` - steps through the backlight levels
|
||||
|
||||
Enable the backlight from the Makefile.
|
||||
|
||||
# Custom Quantum functions
|
||||
|
||||
All of these functions are available in the `*_kb()` or `*_user()` variety. `kb` ones should only be used in the `<keyboard>/<keyboard>.c` file, and `user` ones should only be used in the `keymap.c`. The keyboard ones call the user ones - it's necessary to keep these calls to allow the keymap functions to work correctly.
|
||||
|
||||
## `void matrix_init_*(void)`
|
||||
|
||||
This function gets called when the matrix is initiated, and can contain start-up code for your keyboard/keymap.
|
||||
|
||||
## `void matrix_scan_*(void)`
|
||||
|
||||
This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
|
||||
|
||||
## `bool process_record_*(uint16_t keycode, keyrecord_t *record)`
|
||||
|
||||
This function gets called on every keypress/release, and is where you can define custom functionality. The return value is whether or not QMK should continue processing the keycode - returning `false` stops the execution.
|
||||
|
||||
The `keycode` variable is whatever is defined in your keymap, eg `MO(1)`, `KC_L`, etc. and can be switch-cased to execute code whenever a particular code is pressed.
|
||||
|
||||
The `record` variable contains infomation about the actual press:
|
||||
|
||||
```
|
||||
keyrecord_t record {
|
||||
keyevent_t event {
|
||||
keypos_t key {
|
||||
uint8_t col
|
||||
uint8_t row
|
||||
}
|
||||
bool pressed
|
||||
uint16_t time
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The conditional `if (record->event.pressed)` can tell if the key is being pressed or released, and you can execute code based on that.
|
||||
|
||||
## `void led_set_*(uint8_t usb_led)`
|
||||
|
||||
This gets called whenever there is a state change on your host LEDs \(eg caps lock, scroll lock, etc\). The LEDs are defined as:
|
||||
|
||||
```
|
||||
#define USB_LED_NUM_LOCK 0
|
||||
#define USB_LED_CAPS_LOCK 1
|
||||
#define USB_LED_SCROLL_LOCK 2
|
||||
#define USB_LED_COMPOSE 3
|
||||
#define USB_LED_KANA 4
|
||||
```
|
||||
|
||||
and can be tested against the `usb_led` with a conditional like `if (usb_led & (1<<USB_LED_CAPS_LOCK))` - if this is true, you can turn your LED on, otherwise turn it off.
|
||||
|
94
docs/Key-Functions.md
Normal file
94
docs/Key-Functions.md
Normal file
@ -0,0 +1,94 @@
|
||||
# Quick Aliases To Common Actions
|
||||
|
||||
Your keymap can include shortcuts to common operations (called "function actions" in tmk).
|
||||
|
||||
These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk `ACTION_*` functions, please see the [TMK documentation](https://github.com/qmk/qmk_firmware/blob/master/doc/keymap.md#2-action).
|
||||
|
||||
Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them.
|
||||
|
||||
### Switching and toggling layers
|
||||
|
||||
`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack.
|
||||
|
||||
`OSL(layer)` - momentary switch to *layer*, as a one-shot operation. So if you have a key that's defined as `OSL(1)`, and you tap that key, then only the very next keystroke would come from layer 1. You would drop back to layer zero immediately after that one keystroke. That's handy if you have a layer full of custom shortcuts -- for example, a dedicated key for closing a window. So you tap your one-shot layer mod, then tap that magic 'close window' key, and keep typing like a boss. Layer 1 would remain active as long as you hold that key down, too (so you can use it like a momentary toggle-layer key with extra powers).
|
||||
|
||||
`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer).
|
||||
|
||||
`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack.
|
||||
|
||||
`TO(layer)` - Goes to a layer. This code is special, because it lets you go either up or down the stack -- just goes directly to the layer you want. So while other codes only let you go _up_ the stack (from layer 0 to layer 3, for example), `TO(2)` is going to get you to layer 2, no matter where you activate it from -- even if you're currently on layer 5. This gets activated on keydown (as soon as the key is pressed).
|
||||
|
||||
`TT(layer)` - Layer Tap-Toggle. If you hold the key down, the layer becomes active, and then deactivates when you let go. And if you tap it, the layer simply becomes active (toggles on). It needs 5 taps by default, but you can set it by defining `TAPPING_TOGGLE`, for example, `#define TAPPING_TOGGLE 1` for just one tap.
|
||||
|
||||
|
||||
### Fun with modifier keys
|
||||
|
||||
* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias
|
||||
* `RSFT(kc)` - applies right Shift to *kc*
|
||||
* `LCTL(kc)` - applies left Control to *kc*
|
||||
* `RCTL(kc)` - applies right Control to *kc*
|
||||
* `LALT(kc)` - applies left Alt to *kc*
|
||||
* `RALT(kc)` - applies right Alt to *kc*
|
||||
* `LGUI(kc)` - applies left GUI (command/win) to *kc*
|
||||
* `RGUI(kc)` - applies right GUI (command/win) to *kc*
|
||||
* `HYPR(kc)` - applies Hyper (all modifiers) to *kc*
|
||||
* `MEH(kc)` - applies Meh (all modifiers except Win/Cmd) to *kc*
|
||||
* `LCAG(kc)` - applies CtrlAltGui to *kc*
|
||||
|
||||
You can also chain these, like this:
|
||||
|
||||
LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
|
||||
|
||||
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `quantum/quantum_keycodes.h`.
|
||||
|
||||
KC_TILD ~
|
||||
KC_EXLM !
|
||||
KC_QUES ?
|
||||
KC_AT @
|
||||
KC_HASH #
|
||||
KC_DLR $
|
||||
KC_PERC %
|
||||
KC_CIRC ^
|
||||
KC_AMPR &
|
||||
KC_ASTR *
|
||||
KC_LPRN (
|
||||
KC_RPRN )
|
||||
KC_UNDS _
|
||||
KC_PLUS +
|
||||
KC_DQUO "
|
||||
KC_LCBR {
|
||||
KC_RCBR }
|
||||
KC_LABK <
|
||||
KC_RABK >
|
||||
KC_PIPE |
|
||||
KC_COLN :
|
||||
|
||||
`OSM(mod)` - this is a "one shot" modifier. So let's say you have your left Shift key defined as `OSM(MOD_LSFT)`. Tap it, let go, and Shift is "on" -- but only for the next character you'll type. So to write "The", you don't need to hold down Shift -- you tap it, tap t, and move on with life. And if you hold down the left Shift key, it just works as a left Shift key, as you would expect (so you could type THE). There's also a magical, secret way to "lock" a modifier by tapping it multiple times. If you want to learn more about that, open an issue. :)
|
||||
|
||||
`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down.
|
||||
|
||||
These are the values you can use for the `mod` in `MT()` and `OSM()`:
|
||||
|
||||
* MOD_LCTL
|
||||
* MOD_LSFT
|
||||
* MOD_LALT
|
||||
* MOD_LGUI
|
||||
* MOD_RCTL
|
||||
* MOD_RSFT
|
||||
* MOD_RALT
|
||||
* MOD_RGUI
|
||||
* MOD_HYPR
|
||||
* MOD_MEH
|
||||
|
||||
These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. Note however, that you cannot mix right and left side modifiers.
|
||||
|
||||
We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact:
|
||||
|
||||
* `CTL_T(kc)` - is LCTL when held and *kc* when tapped
|
||||
* `SFT_T(kc)` - is LSFT when held and *kc* when tapped
|
||||
* `ALT_T(kc)` - is LALT when held and *kc* when tapped
|
||||
* `ALGR_T(kc)` - is AltGr when held and *kc* when tapped
|
||||
* `GUI_T(kc)` - is LGUI when held and *kc* when tapped
|
||||
* `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)
|
||||
* `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped
|
||||
* `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift.
|
228
docs/Keycodes.md
Normal file
228
docs/Keycodes.md
Normal file
@ -0,0 +1,228 @@
|
||||
# Overview
|
||||
|
||||
When defining a [keymap](https://github.com/qmk/qmk_firmware/blob/master/doc/keymap.md) each key needs a valid key definition.
|
||||
|
||||
This page documents the symbols that correspond to keycodes that are available to you in QMK.
|
||||
|
||||
To customize your board, they can be used by themselves or as **action codes** in combination with one of the [many C macros](https://github.com/qmk/qmk_firmware/wiki#c-macros-for-action-code).
|
||||
|
||||
The source of truth for these codes is [tmk_core/common/keycode.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/keycode.h) file in the qmk source code.
|
||||
|
||||
# The Keycodes
|
||||
|
||||
Keycodes in QMK are based on [HID Usage Keyboard/Keypad Page(0x07)](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) with following exceptions:
|
||||
|
||||
* `KC_NO` = 0 for no action
|
||||
* `KC_TRNS` = 1 for layer transparency
|
||||
* internal special keycodes in the `0xA5-DF` range (tmk heritage).
|
||||
|
||||
## Letters and Numbers
|
||||
|
||||
|KC_1|KC_2|KC_3|KC_4|KC_5|KC_6|KC_7|KC_8|
|
||||
|----|----|----|----|----|----|----|----|
|
||||
|KC_9|KC_0|KC_F1|KC_F2|KC_F3|KC_F4|KC_F5|KC_F6|
|
||||
|KC_F7|KC_F8|KC_F9|KC_F10|KC_F11|KC_F12|KC_F13|KC_F14|
|
||||
|KC_F15|KC_F16|KC_F17|KC_F18|KC_F19|KC_F20|KC_F21|KC_F22|
|
||||
|KC_F23|KC_F24|KC_A|KC_B|KC_C|KC_D|KC_E|KC_F|
|
||||
|KC_G|KC_H|KC_I|KC_J|KC_K|KC_L|KC_M|KC_N|
|
||||
|KC_O|KC_P|KC_Q|KC_R|KC_S|KC_T|KC_U|KC_V|
|
||||
|KC_W|KC_X|KC_Y|KC_Z|||||
|
||||
|
||||
## Punctuation
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_ENTER|KC_ENT|`Return (ENTER)`|
|
||||
|KC_ESCAPE|KC_ESC|`ESCAPE`|
|
||||
|KC_BSPACE|KC_BSPC|`DELETE (Backspace)`|
|
||||
|KC_TAB||`Tab`|
|
||||
|KC_SPACE|KC_SPC|Spacebar|
|
||||
|KC_MINUS|KC_MINS|`-` and `_`|
|
||||
|KC_EQUAL|KC_EQL|`=` and `+`|
|
||||
|KC_LBRACKET|KC_LBRC|`[` and `{`|
|
||||
|KC_RBRACKET|KC_RBRC|`]` and `}`|
|
||||
|KC_BSLASH|KC_BSLS|`\` and <code>|</code> |
|
||||
|KC_NONUS_HASH|KC_NUHS|Non-US `#` and `~`|
|
||||
|KC_NONUS_BSLASH|KC_NUBS|Non-US `\` and <code>|</code> |
|
||||
|KC_INT1|KC_RO|JIS `\` and <code>|</code> |
|
||||
|KC_INT2|KC_KANA|International216|
|
||||
|KC_INT3|KC_JYEN|Yen Symbol (`¥`)|
|
||||
|KC_SCOLON|KC_SCLN|`;` and `:`|
|
||||
|KC_QUOTE|KC_QUOT|`‘` and `“`|
|
||||
|KC_GRAVE|KC_GRV|Grave Accent and Tilde|
|
||||
|KC_COMMA|KC_COMM|`,` and `<`|
|
||||
|KC_DOT||`.` and `>`|
|
||||
|KC_SLASH|KC_SLSH|`/` and `?`|
|
||||
|KC_CAPSLOCK|KC_CAPS|Caps Lock|
|
||||
|
||||
## Modifiers
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_LCTRL|KC_LCTL|LeftControl|
|
||||
|KC_LSHIFT|KC_LSFT|LeftShift|
|
||||
|KC_LALT||LeftAlt|
|
||||
|KC_LGUI||Left GUI(Windows/Apple/Meta key)|
|
||||
|KC_RCTRL|KC_RCTL|RightControl|
|
||||
|KC_RSHIFT|KC_RSFT|RightShift|
|
||||
|KC_RALT||RightAlt|
|
||||
|KC_RGUI||Right GUI(Windows/Apple/Meta key)|
|
||||
|KC_LOCKING_CAPS||Locking Caps Lock12|
|
||||
|KC_LOCKING_NUM||Locking Num Lock12|
|
||||
|KC_LOCKING_SCROLL||Locking Scroll Lock12|
|
||||
|KC_INT4|KC_HENK|JIS Henken|
|
||||
|KC_INT5|KC_MHEN|JIS Muhenken|
|
||||
|
||||
## Commands
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_PSCREEN|KC_PSCR|PrintScreen1|
|
||||
|KC_SCKLOCK|KC_SLCK|Scroll Lock11|
|
||||
|KC_PAUSE|KC_PAUS|Pause1|
|
||||
|KC_INSERT|KC_INS|Insert1|
|
||||
|KC_HOME||Home1|
|
||||
|KC_PGUP||PageUp1|
|
||||
|KC_DELETE|KC_DEL|Delete Forward|
|
||||
|KC_END||End1|
|
||||
|KC_PGDOWN|KC_PGDN|PageDown1|
|
||||
|KC_RIGHT|KC_RGHT|RightArrow1|
|
||||
|KC_LEFT||LeftArrow1|
|
||||
|KC_DOWN||DownArrow1|
|
||||
|KC_UP||UpArrow1|
|
||||
|KC_APPLICATION|KC_APP|Application10|
|
||||
|KC_POWER||Power9|
|
||||
|KC_EXECUTE||Execute|
|
||||
|KC_HELP||Help|
|
||||
|KC_MENU||Menu|
|
||||
|KC_SELECT||Select|
|
||||
|KC_AGAIN||Again|
|
||||
|KC_UNDO||Undo|
|
||||
|KC_CUT||Cut|
|
||||
|KC_COPY||Copy|
|
||||
|KC_PASTE||Paste|
|
||||
|KC_FIND||Find|
|
||||
|KC_ALT_ERASE||Alternate Erase7|
|
||||
|KC_SYSREQ||SysReq/Attention1|
|
||||
|KC_CANCEL||Cancel|
|
||||
|KC_CLEAR||Clear|
|
||||
|KC_PRIOR||Prior|
|
||||
|KC_RETURN||Return|
|
||||
|KC_SEPARATOR||Separator|
|
||||
|KC_OUT||Out|
|
||||
|KC_OPER||Oper|
|
||||
|KC_CLEAR_AGAIN||Clear/Again|
|
||||
|KC_CRSEL||CrSel/Props|
|
||||
|KC_EXSEL||ExSel|
|
||||
|KC_SYSTEM_POWER|KC_PWR|System Power Down|
|
||||
|KC_SYSTEM_SLEEP|KC_SLEP|System Sleep|
|
||||
|KC_SYSTEM_WAKE|KC_WAKE|System Wake|
|
||||
|KC_MAIL|KC_MAIL||
|
||||
|KC_CALCULATOR|KC_CALC||
|
||||
|KC_MY_COMPUTER|KC_MYCM||
|
||||
|KC_WWW_SEARCH|KC_WSCH||
|
||||
|KC_WWW_HOME|KC_WHOM||
|
||||
|KC_WWW_BACK|KC_WBAK||
|
||||
|KC_WWW_FORWARD|KC_WFWD||
|
||||
|KC_WWW_STOP|KC_WSTP||
|
||||
|KC_WWW_REFRESH|KC_WREF||
|
||||
|KC_WWW_FAVORITES|KC_WFAV||
|
||||
|
||||
## Media Keys
|
||||
|
||||
Windows and Mac use different key codes for next track and previous track. Make sure you choose the keycode that corresponds to your OS.
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_STOP||Stop|
|
||||
|KC__MUTE||Mute|
|
||||
|KC__VOLUP||Volume Up|
|
||||
|KC__VOLDOWN||Volume Down|
|
||||
|KC_AUDIO_MUTE|KC_MUTE||
|
||||
|KC_AUDIO_VOL_UP|KC_VOLU||
|
||||
|KC_AUDIO_VOL_DOWN|KC_VOLD||
|
||||
|KC_MEDIA_NEXT_TRACK|KC_MNXT|Next Track (Windows)|
|
||||
|KC_MEDIA_PREV_TRACK|KC_MPRV|Previous Track (Windows)|
|
||||
|KC_MEDIA_FAST_FORWARD|KC_MFFD|Next Track (macOS)|
|
||||
|KC_MEDIA_REWIND|KC_MRWD|Previous Track (macOS)|
|
||||
|KC_MEDIA_STOP|KC_MSTP||
|
||||
|KC_MEDIA_PLAY_PAUSE|KC_MPLY||
|
||||
|KC_MEDIA_SELECT|KC_MSEL||
|
||||
|
||||
## Numpad
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_NUMLOCK|KC_NLCK|Keypad Num Lock and Clear11|
|
||||
|KC_KP_SLASH|KC_PSLS|Keypad /|
|
||||
|KC_KP_ASTERISK|KC_PAST|Keypad *|
|
||||
|KC_KP_MINUS|KC_PMNS|Keypad -|
|
||||
|KC_KP_PLUS|KC_PPLS|Keypad +|
|
||||
|KC_KP_ENTER|KC_PENT|Keypad ENTER5|
|
||||
|KC_KP_1|KC_P1|Keypad 1 and End|
|
||||
|KC_KP_2|KC_P2|Keypad 2 and Down Arrow|
|
||||
|KC_KP_3|KC_P3|Keypad 3 and PageDn|
|
||||
|KC_KP_4|KC_P4|Keypad 4 and Left Arrow|
|
||||
|KC_KP_5|KC_P5|Keypad 5|
|
||||
|KC_KP_6|KC_P6|Keypad 6 and Right Arrow|
|
||||
|KC_KP_7|KC_P7|Keypad 7 and Home|
|
||||
|KC_KP_8|KC_P8|Keypad 8 and Up Arrow|
|
||||
|KC_KP_9|KC_P9|Keypad 9 and PageUp|
|
||||
|KC_KP_0|KC_P0|Keypad 0 and Insert|
|
||||
|KC_KP_DOT|KC_PDOT|Keypad . and Delete|
|
||||
|KC_KP_EQUAL|KC_PEQL|Keypad =|
|
||||
|KC_KP_COMMA|KC_PCMM|Keypad Comma27|
|
||||
|KC_KP_EQUAL_AS400||Keypad Equal Sign29|
|
||||
|
||||
## Special Keys
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_NO||Ignore this key. (NOOP) |
|
||||
|
||||
## Mousekey
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|KC_MS_UP|KC_MS_U|Mouse Cursor Up|
|
||||
|KC_MS_DOWN|KC_MS_D|Mouse Cursor Down|
|
||||
|KC_MS_LEFT|KC_MS_L|Mouse Cursor Left|
|
||||
|KC_MS_RIGHT|KC_MS_R|Mouse Cursor Right|
|
||||
|KC_MS_BTN1|KC_BTN1|Mouse Button 1|
|
||||
|KC_MS_BTN2|KC_BTN2|Mouse Button 2|
|
||||
|KC_MS_BTN3|KC_BTN3|Mouse Button 3|
|
||||
|KC_MS_BTN4|KC_BTN4|Mouse Button 4|
|
||||
|KC_MS_BTN5|KC_BTN5|Mouse Button 5|
|
||||
|KC_MS_WH_UP|KC_WH_U|Mouse Wheel Up|
|
||||
|KC_MS_WH_DOWN|KC_WH_D|Mouse Wheel Down|
|
||||
|KC_MS_WH_LEFT|KC_WH_L|Mouse Wheel Left|
|
||||
|KC_MS_WH_RIGHT|KC_WH_R|Mouse Wheel Right|
|
||||
|KC_MS_ACCEL0|KC_ACL0|Mouse Acceleration 0|
|
||||
|KC_MS_ACCEL1|KC_ACL1|Mouse Acceleration 1|
|
||||
|KC_MS_ACCEL2|KC_ACL2|Mouse Acceleration 2|
|
||||
|
||||
## Magic Keys
|
||||
|
||||
The following keys can be used to turn on and off various "Magic" features. These include Boot Magic (holding certain keys down while plugging the keyboard in) and the Magic Key.
|
||||
|
||||
|Long Name|Short Name|Description|
|
||||
|---------|----------|-----------|
|
||||
|MAGIC_SWAP_CONTROL_CAPSLOCK||Swap Capslock and Control|
|
||||
|MAGIC_CAPSLOCK_TO_CONTROL||Change Capslock to Control|
|
||||
|MAGIC_SWAP_ALT_GUI||Swap ALT and GUI|
|
||||
|MAGIC_SWAP_LALT_LGUI||Swap LALT and LGUI|
|
||||
|MAGIC_SWAP_RALT_RGUI||Swap RALT and RGUI|
|
||||
|MAGIC_NO_GUI||Disable off the GUI key|
|
||||
|MAGIC_SWAP_GRAVE_ESC||Swap the GRAVE (~ `) and Esc keys|
|
||||
|MAGIC_SWAP_BACKSLASH_BACKSPACE||Swap Backslash and Backspace|
|
||||
|MAGIC_UNSWAP_CONTROL_CAPSLOCK||Disable the Control/Caps Swap|
|
||||
|MAGIC_UNCAPSLOCK_TO_CONTROL||Turn Capslock back into Capslock|
|
||||
|MAGIC_UNSWAP_ALT_GUI||Turn the ALT/GUI swap off|
|
||||
|MAGIC_UNSWAP_LALT_LGUI||Turn the LALT/LGUI swap off|
|
||||
|MAGIC_UNSWAP_RALT_RGUI||Turn the RALT/RGUI swap off|
|
||||
|MAGIC_UNNO_GUI||Enable the GUI key|
|
||||
|MAGIC_UNSWAP_GRAVE_ESC||Turn the GRAVE/ESC swap off|
|
||||
|MAGIC_UNSWAP_BACKSLASH_BACKSPACE||Turn the Backslash/Backspace swap off|
|
||||
|MAGIC_HOST_NKRO||Turn NKRO on|
|
||||
|MAGIC_UNHOST_NKRO||Turn NKRO off|
|
||||
|MAGIC_TOGGLE_NKRO||Toggle NKRO on or off|
|
37
docs/Keymap-examples.md
Normal file
37
docs/Keymap-examples.md
Normal file
@ -0,0 +1,37 @@
|
||||
# Share your keymap idea here!
|
||||
https://github.com/tmk/tmk_keyboard/issues/265
|
||||
|
||||
---
|
||||
|
||||
## Reverse-shifted for numbers
|
||||
With pressing Shift and '1' key you get **1** while with just '1' key you get **!**.
|
||||
- https://geekhack.org/index.php?topic=41989.msg1959718#msg1959718
|
||||
|
||||
|
||||
## KBT Pure layout
|
||||
Keymap code on Alps64
|
||||
https://github.com/thisisshi/tmk_keyboard/blob/15fe63e8d181a8a95988dcc71929f0024df55caa/keyboard/alps64/keymap_pure.c
|
||||
|
||||
and guide.
|
||||
https://github.com/thisisshi/tmk_keyboard/blob/77ac0805ade565fb23657e3644c920ada71edccf/keyboard/alps64/Guide.md
|
||||
|
||||
## Prevent stuck modifiers
|
||||
|
||||
Consider the following scenario:
|
||||
|
||||
1. Layer 0 has a key defined as Shift.
|
||||
2. The same key is defined on layer 1 as the letter A.
|
||||
3. User presses Shift.
|
||||
4. User switches to layer 1 for whatever reason.
|
||||
5. User releases Shift, or rather the letter A.
|
||||
6. User switches back to layer 0.
|
||||
|
||||
Shift was actually never released and is still considered pressed.
|
||||
|
||||
If such situation bothers you add this to your `config.h`:
|
||||
|
||||
#define PREVENT_STUCK_MODIFIERS
|
||||
|
||||
This option uses 5 bytes of memory per every 8 keys on the keyboard
|
||||
rounded up (5 bits per key). For example on Planck (48 keys) it uses
|
||||
(48/8)\*5 = 30 bytes.
|
222
docs/Keymap.md
Normal file
222
docs/Keymap.md
Normal file
@ -0,0 +1,222 @@
|
||||
# Keymap Overview
|
||||
|
||||
QMK keymaps are defined inside a C source file. The data structure is an array of arrays. The outer array is a list of layer arrays while the inner layer array is a list of keys. Most keyboards define a `KEYMAP()` macro to help you create this array of arrays.
|
||||
|
||||
|
||||
## Keymap and layers
|
||||
In QMK, **`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`** holds multiple **layers** of keymap information in **16 bit** data holding the **action code**. You can define **32 layers** at most.
|
||||
|
||||
For trivial key definitions, the higher 8 bits of the **action code** are all 0 and the lower 8 bits holds the USB HID usage code generated by the key as **keycode**.
|
||||
|
||||
Respective layers can be validated simultaneously. Layers are indexed with 0 to 31 and higher layer has precedence.
|
||||
|
||||
Keymap: 32 Layers Layer: action code matrix
|
||||
----------------- ---------------------
|
||||
stack of layers array_of_action_code[row][column]
|
||||
____________ precedence _______________________
|
||||
/ / | high / ESC / F1 / F2 / F3 ....
|
||||
31 /___________// | /-----/-----/-----/-----
|
||||
30 /___________// | / TAB / Q / W / E ....
|
||||
29 /___________/ | /-----/-----/-----/-----
|
||||
: _:_:_:_:_:__ | : /LCtrl/ A / S / D ....
|
||||
: / : : : : : / | : / : : : :
|
||||
2 /___________// | 2 `--------------------------
|
||||
1 /___________// | 1 `--------------------------
|
||||
0 /___________/ V low 0 `--------------------------
|
||||
|
||||
|
||||
Sometimes, the action code stored in keymap may be referred as keycode in some documents due to the TMK history.
|
||||
|
||||
### Keymap layer status
|
||||
Keymap layer has its state in two 32 bit parameters:
|
||||
|
||||
* **`default_layer_state`** indicates a base keymap layer(0-31) which is always valid and to be referred.
|
||||
* **`layer_state`** () has current on/off status of the layer on its each bit.
|
||||
|
||||
Keymap has its state in two parameter **`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit.
|
||||
Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`.
|
||||
To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty.
|
||||
|
||||
Initial state of Keymap Change base layout
|
||||
----------------------- ------------------
|
||||
|
||||
31 31
|
||||
30 30
|
||||
29 29
|
||||
: :
|
||||
: : ____________
|
||||
2 ____________ 2 / /
|
||||
1 / / ,->1 /___________/
|
||||
,->0 /___________/ | 0
|
||||
| |
|
||||
`--- default_layer = 0 `--- default_layer = 1
|
||||
layer_state = 0x00000001 layer_state = 0x00000002
|
||||
|
||||
On the other hand, you shall change `layer_state` to overlay base layer with some layers for feature such as navigation keys, function key(F1-F12), media keys or special actions.
|
||||
|
||||
Overlay feature layer
|
||||
--------------------- bit|status
|
||||
____________ ---+------
|
||||
31 / / 31 | 0
|
||||
30 /___________// -----> 30 | 1
|
||||
29 /___________/ -----> 29 | 1
|
||||
: : | :
|
||||
: ____________ : | :
|
||||
2 / / 2 | 0
|
||||
,->1 /___________/ -----> 1 | 1
|
||||
| 0 0 | 0
|
||||
| +
|
||||
`--- default_layer = 1 |
|
||||
layer_state = 0x60000002 <-'
|
||||
|
||||
|
||||
|
||||
### Layer Precedence and Transparency
|
||||
Note that ***higher layer has higher priority on stack of layers***, namely firmware falls down from top layer to bottom to look up keycode. Once it spots keycode other than **`KC_TRNS`**(transparent) on a layer it stops searching and lower layers aren't referred.
|
||||
|
||||
You can place `KC_TRANS` on overlay layer changes just part of layout to fall back on lower or base layer.
|
||||
Key with `KC_TRANS` (`KC_TRNS` and `_______` are the alias) doesn't has its own keycode and refers to lower valid layers for keycode, instead.
|
||||
|
||||
## Anatomy Of A `keymap.c`
|
||||
|
||||
For this example we will walk through the [default Clueboard keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/clueboard/keymaps/default/keymap.c). You'll find it helpful to open that file in another browser window so you can look at everything in context.
|
||||
|
||||
There are 3 main sections of a `keymap.c` file you'll want to concern yourself with:
|
||||
|
||||
* [The Definitions](#definitions)
|
||||
* [The Layer/Keymap Datastructure](#layers-and-keymaps)
|
||||
* [Custom Functions](#custom-functions), if any
|
||||
|
||||
### Definitions
|
||||
|
||||
At the top of the file you'll find this:
|
||||
|
||||
#include "clueboard.h"
|
||||
|
||||
// Helpful defines
|
||||
#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
|
||||
#define _______ KC_TRNS
|
||||
|
||||
// Each layer gets a name for readability.
|
||||
// The underscores don't mean anything - you can
|
||||
// have a layer called STUFF or any other name.
|
||||
// Layer names don't all need to be of the same
|
||||
// length, and you can also skip them entirely
|
||||
// and just use numbers.
|
||||
#define _BL 0
|
||||
#define _FL 1
|
||||
#define _CL 2
|
||||
|
||||
These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function. The `_______` define makes it easier to see what keys a layer is overriding, while the `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers.
|
||||
|
||||
### Layers and Keymaps
|
||||
|
||||
The main part of this file is the `keymaps[]` definition. This is where you list your layers and the contents of those layers. This part of the file begins with this definition:
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
After this you'll find a list of KEYMAP() macros. A KEYMAP() is simply a list of keys to define a single layer. Typically you'll have one or more "base layers" (such as QWERTY, Dvorak, or Colemak) and then you'll layer on top of that one or more "function" layers. Due to the way layers are processed you can't overlay a "lower" layer on top of a "higher" layer.
|
||||
|
||||
`keymaps[][MATRIX_ROWS][MATRIX_COLS]` in QMK holds the 16 bit action code (sometimes referred as the quantum keycode) in it. For the keycode representing typical keys, its high byte is 0 and its low byte is the USB HID usage ID for keyboard.
|
||||
|
||||
> TMK from which QMK was forked uses `const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]` instead and holds the 8 bit keycode. Some keycode values are reserved to induce execution of certain action codes via the `fn_actions[]` array.
|
||||
|
||||
#### Base Layer
|
||||
|
||||
Here is an example of the Clueboard's base layer:
|
||||
|
||||
/* Keymap _BL: Base Layer (Default Layer)
|
||||
*/
|
||||
[_BL] = KEYMAP(
|
||||
F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \
|
||||
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT),
|
||||
|
||||
Some interesting things to note about this:
|
||||
|
||||
* From a C source point of view it's only a single array, but we have embedded whitespace to more easily visualize where each key is on the physical device.
|
||||
* Plain keyboard scancodes are prefixed with KC_, while "special" keys are not.
|
||||
* The upper left key activates custom function 0 (`F(0)`)
|
||||
* The "Fn" key is defined with `MO(_FL)`, which moves to the `_FL` layer while that key is being held down.
|
||||
|
||||
#### Function Overlay Layer
|
||||
|
||||
Our function layer is, from a code point of view, no different from the base layer. Conceptually, however, you will build that layer as an overlay, not a replacement. For many people this distinction does not matter, but as you build more complicated layering setups it matters more and more.
|
||||
|
||||
[_FL] = KEYMAP(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL, BL_STEP, \
|
||||
_______, _______, _______,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK, KC_PAUS, _______, _______, _______, _______, \
|
||||
_______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \
|
||||
_______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \
|
||||
_______, _______, _______, _______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END),
|
||||
|
||||
Some interesting things to note:
|
||||
|
||||
* We have used our `_______` definition to turn `KC_TRNS` into `_______`. This makes it easier to spot the keys that have changed on this layer.
|
||||
* While in this layer if you press one of the `_______` keys it will activate the key in the next lowest active layer.
|
||||
|
||||
### Custom Functions
|
||||
|
||||
At the bottom of the file we've defined a single custom function. This function defines a key that sends `KC_ESC` when pressed without modifiers and `KC_GRAVE` when modifiers are held. There are a couple pieces that need to be in place for this to work, and we will go over both of them.
|
||||
|
||||
#### `fn_actions[]`
|
||||
|
||||
We define the `fn_actions[]` array to point to custom functions. `F(N)` in a keymap will call element N of that array. For the Clueboard's that looks like this:
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
[0] = ACTION_FUNCTION(0), // Calls action_function()
|
||||
};
|
||||
|
||||
In this case we've instructed QMK to call the `ACTION_FUNCTION` callback, which we will define in the next section.
|
||||
|
||||
> This `fn_actions[]` interface is mostly for backward compatibility. In QMK, you don't need to use `fn_actions[]`. You can directly use `ACTION_FUNCTION(N)` or any other action code value itself normally generated by the macro in `keymaps[][MATRIX_ROWS][MATRIX_COLS]`. N in `F(N)` can only be 0 to 31. Use of the action code directly in `keymaps` unlocks this limitation.
|
||||
|
||||
#### `action_function()`
|
||||
|
||||
To actually handle the keypress event we define an `action_function()`. This function will be called when the key is pressed, and then again when the key is released. We have to handle both situations within our code, as well as determining whether to send/release `KC_ESC` or `KC_GRAVE`.
|
||||
|
||||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
static uint8_t mods_pressed;
|
||||
|
||||
switch (id) {
|
||||
case 0:
|
||||
/* Handle the combined Grave/Esc key
|
||||
*/
|
||||
mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed
|
||||
|
||||
if (record->event.pressed) {
|
||||
/* The key is being pressed.
|
||||
*/
|
||||
if (mods_pressed) {
|
||||
add_key(KC_GRV);
|
||||
send_keyboard_report();
|
||||
} else {
|
||||
add_key(KC_ESC);
|
||||
send_keyboard_report();
|
||||
}
|
||||
} else {
|
||||
/* The key is being released.
|
||||
*/
|
||||
if (mods_pressed) {
|
||||
del_key(KC_GRV);
|
||||
send_keyboard_report();
|
||||
} else {
|
||||
del_key(KC_ESC);
|
||||
send_keyboard_report();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
# Nitty Gritty Details
|
||||
|
||||
This should have given you a basic overview for creating your own keymap. For more details see the following resources:
|
||||
|
||||
* https://github.com/qmk/qmk_firmware/wiki/Keycodes
|
||||
* https://github.com/qmk/qmk_firmware/wiki/FAQ-Keymap
|
||||
* https://github.com/qmk/qmk_firmware/wiki/Keymap-examples
|
||||
|
||||
We are actively working to improve these docs. If you have suggestions for how they could be made better please [file an issue](https://github.com/qmk/qmk_firmware/issues/new)!
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user