Compare commits
4373 Commits
2.0.7_Merg
...
master
Author | SHA1 | Date | |
---|---|---|---|
c7bd3ef462 | |||
9f4c131ec8 | |||
691d011459 | |||
|
3334582f86 | ||
|
b2d72de494 | ||
|
cfa747ed08 | ||
|
92b2076dda | ||
|
eff6c407a5 | ||
|
569bbb18d0 | ||
|
471330b56e | ||
|
2a724bd94e | ||
|
cea2ab1d7f | ||
|
5198a55457 | ||
|
cbb56e3536 | ||
|
b3f4eaf6fd | ||
|
7815b20051 | ||
|
ffbf6acd6c | ||
|
8bafc1d9ae | ||
|
ac05f0cb8b | ||
|
ec6349f2ac | ||
|
d082223fee | ||
|
e07a059b2d | ||
|
313716e7fc | ||
|
726555901c | ||
|
3ad684b10b | ||
|
408a53bcdd | ||
|
eae339b8dc | ||
|
79b88471f0 | ||
|
86a3362bf6 | ||
|
0efeedf262 | ||
|
c86f20010d | ||
|
5a97ffc414 | ||
|
2737286021 | ||
|
86a10dc459 | ||
|
ecdf07f055 | ||
|
686ce0c0e2 | ||
|
3c550e0f19 | ||
|
071dae0c28 | ||
|
df2a2488a8 | ||
|
c3090bd4e8 | ||
|
0fadb56150 | ||
|
eb125c95b6 | ||
|
26edeefeb9 | ||
|
96b8c28376 | ||
|
db3865520f | ||
|
51c1645ceb | ||
|
5eb39d5277 | ||
|
0537e78572 | ||
|
95019bf526 | ||
|
6f5ad55953 | ||
|
57f6c93192 | ||
|
d2ece1e713 | ||
|
12017887f4 | ||
|
3a28a1fd1d | ||
|
360e03797f | ||
|
6185b50dbe | ||
|
b2b8407a75 | ||
|
c1684a1dbe | ||
|
7d0f1dd17c | ||
|
b6051fe847 | ||
|
b9bed1ca69 | ||
|
b8ba9d60bb | ||
|
8fd42eeeb6 | ||
|
19b73a6f29 | ||
|
db60e0e7dc | ||
|
505d73d2ba | ||
|
d05419a8d9 | ||
|
9772f7806b | ||
|
473d2b888a | ||
|
968f04defb | ||
|
30a885a7ef | ||
|
847391cfc1 | ||
|
6ea192abe9 | ||
|
0de4ec4099 | ||
|
c9fa680db9 | ||
|
379d388b07 | ||
|
7002e72f1c | ||
|
fc2f3cdf40 | ||
|
7feeffdf06 | ||
|
ac5464c37c | ||
|
a121c80e1a | ||
|
2778b00765 | ||
|
4737af7d70 | ||
|
38375cf7a7 | ||
|
ddec5faf5a | ||
|
cbdafd36e0 | ||
|
9f5b0b8567 | ||
|
d9ffae6578 | ||
|
1540e8e1d4 | ||
|
9a4715f31a | ||
|
a9969d92ea | ||
|
d87d7474c9 | ||
|
4ce2f1e5ba | ||
|
44636f3b74 | ||
|
e812540f26 | ||
|
c1f0f26bff | ||
|
5765449867 | ||
|
c8b2d0c0fd | ||
|
bdd5da5098 | ||
|
4d9bf91edc | ||
|
682a9b6fbe | ||
|
a913b2437b | ||
|
6b1d738995 | ||
|
dd224b4eb9 | ||
|
2e2abbcb48 | ||
|
485fb77596 | ||
|
29294007ef | ||
|
256ac01ca2 | ||
|
ca1968a842 | ||
|
6a084e3704 | ||
|
9ae0789166 | ||
|
031ff2d024 | ||
|
b3e7d1e91e | ||
|
f39f4d0288 | ||
|
a4d58e8876 | ||
|
c52cf77d0a | ||
|
bfcb8c704a | ||
|
0047b3064d | ||
|
5c195078ff | ||
|
1a6f9daee8 | ||
|
505f0a647e | ||
|
62b7db9bb7 | ||
|
3c870f2d4b | ||
|
0203e32c73 | ||
|
8481264566 | ||
|
b0f02b8f9e | ||
|
d6ff8f0062 | ||
|
8b37b60e58 | ||
|
5c68d26d4e | ||
|
74435b0dcb | ||
|
f17a07df99 | ||
|
a58f27763f | ||
|
5aca6ff4f2 | ||
|
7b000966f0 | ||
|
6ae0708840 | ||
|
44e4a9c7b1 | ||
|
215fcefc1b | ||
|
827f9ae792 | ||
|
e44f156535 | ||
|
f1a05d19b0 | ||
|
a7a493d795 | ||
|
d9967f5395 | ||
|
5ee74668cf | ||
|
be149336f0 | ||
|
1f72c8341f | ||
|
3d03f96205 | ||
|
c996bfddb7 | ||
|
647d459a15 | ||
|
29156ffe5d | ||
|
eff60964da | ||
|
5fe1f66478 | ||
|
2fc97aa240 | ||
|
aa28358267 | ||
|
e04e18a590 | ||
|
bdb7f3af3f | ||
|
2f24c31454 | ||
|
96d050c7ba | ||
|
aabd3e9e19 | ||
|
38b3105900 | ||
|
02810616cc | ||
|
7daff755f2 | ||
|
53564fb6f3 | ||
|
9d9f303c5e | ||
|
b9428bf087 | ||
|
0642cd8a83 | ||
|
d2b1467ab3 | ||
|
03aba439f6 | ||
|
85a47d61e6 | ||
|
78577b13cb | ||
|
b29cd4c510 | ||
|
0eb6a8d12e | ||
|
8a8218a8f2 | ||
|
3a18ba0412 | ||
|
2828f1d1db | ||
|
63507acf98 | ||
|
cc2cc7d081 | ||
|
b676b43874 | ||
|
2f1b89bd1f | ||
|
1a2e591d03 | ||
|
dc65e299fa | ||
|
033bca1773 | ||
|
e350acb360 | ||
|
7d8d2e2c58 | ||
|
3c6b3e5af4 | ||
|
d5e9b25a31 | ||
|
9313c2fd18 | ||
|
d8a280bf53 | ||
|
d244389998 | ||
|
d140be0281 | ||
|
27bea56025 | ||
|
98ee3fc2b5 | ||
|
e8394c391e | ||
|
e24d5f9315 | ||
|
ef1cf0d5a1 | ||
|
f088722ae8 | ||
|
68c5e97fd7 | ||
|
a8cf886aa5 | ||
|
a31e65e30b | ||
|
d94a41527f | ||
|
37a7da075f | ||
|
5145266b0d | ||
|
bdd5f3678e | ||
|
b4af335b7a | ||
|
cfe1d52bf2 | ||
|
ff09ea13a4 | ||
|
d93c41a257 | ||
|
98e6aacbef | ||
|
0adee8fae0 | ||
|
c154302ece | ||
|
b5ccddbe35 | ||
|
d69893309e | ||
|
fc3ea96ff9 | ||
|
3892d08b06 | ||
|
857dc73be5 | ||
|
419a145fa3 | ||
|
398cae7625 | ||
|
8192cc12d3 | ||
|
7f2a836251 | ||
|
b02c3258b5 | ||
|
a0462eb017 | ||
|
a1704c10b9 | ||
|
7196f13125 | ||
|
e06340abd1 | ||
|
98095ddad6 | ||
|
2f4b121709 | ||
|
a0409289c8 | ||
|
2ccdc4f9ed | ||
|
bbf2033211 | ||
|
9a42d1e577 | ||
|
17794e18ae | ||
|
3b30951e83 | ||
|
c3f2586445 | ||
|
c0cb7e35af | ||
|
fd319928d2 | ||
|
5dad7e0d03 | ||
|
9ee558afe1 | ||
|
bbaccd342e | ||
|
6134d55360 | ||
|
868e76b965 | ||
|
5f105e254d | ||
|
9534c6e903 | ||
|
ec9a2ee557 | ||
|
d8db00e31f | ||
|
e7c262dc30 | ||
|
cee9da6132 | ||
|
a24b9e16ff | ||
|
1e9232723d | ||
|
66369f8236 | ||
|
0ca76bf9ed | ||
|
0f3c3c419e | ||
|
89e9ae0662 | ||
|
5b8f7686cb | ||
|
6e02f15dd6 | ||
|
c9445cfc41 | ||
|
beacb73d93 | ||
|
53a57ff7bf | ||
|
d726f641a5 | ||
|
feafa321d7 | ||
|
f5b972bb10 | ||
|
196795c0cc | ||
|
c3085d666f | ||
|
807f2ef969 | ||
|
f752fe75ee | ||
|
97a73147fa | ||
|
915203f545 | ||
|
173eb3ff71 | ||
|
96d3c66b64 | ||
|
cc4fc28fe0 | ||
|
0a164a88fe | ||
|
c72fe1a2f9 | ||
|
2add8ca4eb | ||
|
779c24122d | ||
|
6ac3f2738e | ||
|
77c6d9af20 | ||
|
929e12bf49 | ||
|
fd18ac5667 | ||
|
06c1409843 | ||
|
ec95e66ff0 | ||
|
53ee7fce5b | ||
|
10f5f878ce | ||
|
733ca940c0 | ||
|
c880c7ed45 | ||
|
e5e4cf920d | ||
|
3315f6faa4 | ||
|
4a6ad1c98b | ||
|
3c9789fda8 | ||
|
3a19d34c75 | ||
|
6b19a58f03 | ||
|
9283859b1e | ||
|
e840015cad | ||
|
efe04e1016 | ||
|
f543b3cb84 | ||
|
6a86c5bad3 | ||
|
7207a32434 | ||
|
678474d55c | ||
|
24c211307d | ||
|
0c78a6f657 | ||
|
79a332b57e | ||
|
d9ecbdcdbb | ||
|
527fe2496a | ||
|
6c2ffe9d34 | ||
|
0fdedfa2fb | ||
|
e93a1dd2fa | ||
|
03760fd79e | ||
|
d3aed23e18 | ||
|
893707711e | ||
|
d965303a7a | ||
|
5b6c46db29 | ||
|
8f40a2f257 | ||
|
e4f85e8fbc | ||
|
678955949f | ||
|
923d34550a | ||
|
ed643e634f | ||
|
3f4c8c31c6 | ||
|
171ed66de0 | ||
|
5f2e4487e7 | ||
|
80c7abd727 | ||
|
814b53750f | ||
|
23e93c51fd | ||
|
afbdcc8eee | ||
|
4820947203 | ||
|
d44aef8b6b | ||
|
c1c0496073 | ||
|
a48831d600 | ||
|
c076094fa9 | ||
|
57c137a60f | ||
|
05bdc5640d | ||
|
83784bd8b7 | ||
|
23f19e9ce8 | ||
|
0435b2220a | ||
|
ab2fceda2c | ||
|
88dc360e9d | ||
|
f5bdb8b4d2 | ||
|
3e01e08989 | ||
|
4694a7fe74 | ||
|
537af0bb03 | ||
|
0dc59311ec | ||
|
0523874e9c | ||
|
106537ff43 | ||
|
ad96c36730 | ||
|
a3629a7c28 | ||
|
b7e1b6b893 | ||
|
253e35e066 | ||
|
831e1b5ecf | ||
|
c89ca2deb8 | ||
|
85e94038aa | ||
|
7c85f25042 | ||
|
eca5e46d17 | ||
|
78b42ed387 | ||
|
95339c9561 | ||
|
da6c16a9cd | ||
|
cc27cfb660 | ||
|
25c0593c9b | ||
|
5fff7bbef4 | ||
|
3fd592e64b | ||
|
c34dd64469 | ||
|
7677368aaf | ||
|
ece124fdea | ||
|
9aa499dbe9 | ||
|
78a3ea0ed4 | ||
|
c605c1ebb5 | ||
|
b2c4fb5f3a | ||
|
60cedf63f2 | ||
|
1156557a47 | ||
|
ea22640d78 | ||
|
d886320799 | ||
|
a65189c637 | ||
|
dfc8acf376 | ||
|
48d03ca0a9 | ||
|
85e8d1f9fa | ||
|
679f4608ab | ||
|
5c225ba887 | ||
|
2685119332 | ||
|
fc350701b2 | ||
|
0ad695d45a | ||
|
f1802bc7fe | ||
|
d6c673b9de | ||
|
6a2a592c26 | ||
|
c4ac695c15 | ||
|
8465818754 | ||
|
3c482a9ba1 | ||
|
ecfe7b6400 | ||
|
85599abba7 | ||
|
494a2fc80c | ||
|
f7bea2846f | ||
|
d56731cd07 | ||
|
0041de1a8a | ||
|
d58497bc8e | ||
|
fd13a928c1 | ||
|
369542db3b | ||
|
40d96c3460 | ||
|
d7a71beaf4 | ||
|
f3b593ae73 | ||
|
1d8d8dccf4 | ||
|
1e127a93c4 | ||
|
fcef8d946c | ||
|
0253500ccd | ||
|
0d783a7690 | ||
|
e784e04132 | ||
|
11d68e3127 | ||
|
8b8b2a7ed3 | ||
|
fc1a620b87 | ||
|
9799907dc9 | ||
|
6fc4dbbbc4 | ||
|
74596ad4d7 | ||
|
28f8646aa6 | ||
|
9a74bcd4cf | ||
|
07cd248b91 | ||
|
209c792ef7 | ||
|
dbd00d9927 | ||
|
4ae54a6229 | ||
|
ce0af56d0a | ||
|
6c557a2480 | ||
|
a6ce9bf559 | ||
|
21c838cb1b | ||
|
3443a9e18b | ||
|
b2b5b85045 | ||
|
2086cc9f4e | ||
|
8eccfd4a6f | ||
|
9ab654adcb | ||
|
0ae982188c | ||
|
bed0788f72 | ||
|
deb1ba73bb | ||
|
57f0ac88af | ||
|
915bce495c | ||
|
800a936caa | ||
|
ccf39b1c42 | ||
|
d19179ce28 | ||
|
4a6ae1b64d | ||
|
0daaef589c | ||
|
4831cbebd8 | ||
|
e0deb75764 | ||
|
a0fe4f4895 | ||
|
4d65d7f142 | ||
|
1b879f0ee4 | ||
|
b6abc760ce | ||
|
0ae061713c | ||
|
1d12e72bf6 | ||
|
c97cf10956 | ||
|
b72f9277e9 | ||
|
06c4a9acdb | ||
|
8a301196e1 | ||
|
1e7219f4a6 | ||
|
02c267f542 | ||
|
fe77fc66c0 | ||
|
268a16b1ef | ||
|
8351b1431f | ||
|
718806761f | ||
|
78c7fedcea | ||
|
c4b8339b84 | ||
|
94ed67e36e | ||
|
03b819bdb2 | ||
|
2204f05dca | ||
|
a13cceaad1 | ||
|
5c25ed60c8 | ||
|
1c516bdd5e | ||
|
425684e2ff | ||
|
63aecad7ee | ||
|
dcd769b4a1 | ||
|
f9b7f00d1e | ||
|
a6ff63d506 | ||
|
7d37ae2b2b | ||
|
a7d40ec654 | ||
|
7ed339cfa0 | ||
|
cb4ad020af | ||
|
0805f9bf3f | ||
|
d235bc9e1c | ||
|
d5f472a6cf | ||
|
d67fa98cf6 | ||
|
d3fe0caa7f | ||
|
bd09f8acff | ||
|
a9aca5f5e8 | ||
|
13d1eb7241 | ||
|
238ab1dd06 | ||
|
a7e4061d12 | ||
|
31c87adba8 | ||
|
727e7e7fd7 | ||
|
975b90c0b7 | ||
|
8f0180802a | ||
|
aa4c991755 | ||
|
9ab1a57d72 | ||
|
044bf8ab7e | ||
|
4bdec5e993 | ||
|
7444933d5d | ||
|
f35404f853 | ||
|
7fa2dcedda | ||
|
4c84769a81 | ||
|
8fb3074901 | ||
|
230db90b70 | ||
|
28d2bc353e | ||
|
7b5e2cd786 | ||
|
4b456078dd | ||
|
8d3c84a6d9 | ||
|
cbc6f23a8a | ||
|
bed8abe5b6 | ||
|
74565890f3 | ||
|
4ec9af42b8 | ||
|
b0d621d8b9 | ||
|
995221e68e | ||
|
54e543872b | ||
|
7b39604d6f | ||
|
01c9c26661 | ||
|
27b1484428 | ||
|
7f1c5ad7aa | ||
|
4fd7d1b056 | ||
|
7ffe4de021 | ||
|
eada17ed69 | ||
|
cd5c5ea60e | ||
|
e9ea82e78d | ||
|
18b17fc97d | ||
|
89d5ed0c9e | ||
|
a56bf9045d | ||
|
c23d035149 | ||
|
7ff4b70694 | ||
|
421c38ff2e | ||
|
ec447dba04 | ||
|
be6535e5f7 | ||
|
99252cf0cd | ||
|
f6f31434b8 | ||
|
2f3960904e | ||
|
2dc4c642e7 | ||
|
70ea0e7c34 | ||
|
a81fd009f0 | ||
|
e667d4e6e4 | ||
|
2d0af75d37 | ||
|
5e68a86968 | ||
|
8bd1547c3b | ||
|
a5e083603f | ||
|
c5f7547e8c | ||
|
5c5b380fda | ||
|
bb0e0cf7f3 | ||
|
5ee99dfc49 | ||
|
a083b1280e | ||
|
b7b5cee88b | ||
|
7456fd68a4 | ||
|
20154718b5 | ||
|
a6794c1862 | ||
|
bd5c6bf23c | ||
|
68ee64283a | ||
|
dd29394bbe | ||
|
ceb99e89a0 | ||
|
6112277f9b | ||
|
81f403025c | ||
|
eeda8b451a | ||
|
c7e8ba7857 | ||
|
071e5c336a | ||
|
be08d4c4f0 | ||
|
e99104a004 | ||
|
edc4089121 | ||
|
3bce266ef7 | ||
|
c89d0114ac | ||
|
0e693854d0 | ||
|
9324132a40 | ||
|
5632ad65f5 | ||
|
eccbfbcede | ||
|
5ef4fb378e | ||
|
21f0945d2c | ||
|
b2a318af9a | ||
|
1c89c0470f | ||
|
2ee4a667e1 | ||
|
f8e177a43e | ||
|
9ac1c73041 | ||
|
4a8b99d505 | ||
|
b094a3fc0d | ||
|
2d99a608fd | ||
|
fba8805c0c | ||
|
039a22649f | ||
|
ced0ad8e09 | ||
|
10a0c9a9b3 | ||
|
abfb041180 | ||
|
72f207f489 | ||
|
7186037f20 | ||
|
b0a400da72 | ||
|
cc4c2c2f98 | ||
|
5dae8a6734 | ||
|
05dea4e30a | ||
|
7e88ee8c5c | ||
|
cc8e485e1c | ||
|
c7a2ecc31a | ||
|
260b40d145 | ||
|
c87eded8f6 | ||
|
2f2a999368 | ||
|
2558b323e8 | ||
|
1db6855939 | ||
|
62f298aca3 | ||
|
8d20c5aadf | ||
|
61b470249c | ||
|
4ffa88f814 | ||
|
8257040faf | ||
|
5d9ab7e71e | ||
|
1a76d4d467 | ||
|
4028c1cfc7 | ||
|
c49f26a7ae | ||
|
f82b133595 | ||
|
2c3f2a1471 | ||
|
4817efcf81 | ||
|
16271377e2 | ||
|
61fb382868 | ||
|
7dae720de5 | ||
|
c6f4b38877 | ||
|
eabeac29fd | ||
|
b045c91f26 | ||
|
56955c179d | ||
|
4eb1326355 | ||
|
b669aa49cc | ||
|
152ec49b8b | ||
|
e4ca822dcf | ||
|
0fafcd20cd | ||
|
bd72df3bb6 | ||
|
fd582dc863 | ||
|
2986bc3b76 | ||
|
e082a141f6 | ||
|
575c3150f9 | ||
|
43d4e30668 | ||
|
9b17699b9b | ||
|
0337602bbe | ||
|
fbfe0642b6 | ||
|
41a51e9527 | ||
|
2d648e4dd9 | ||
|
35d11070b4 | ||
|
feafb7d49a | ||
|
39001bd8d2 | ||
|
3db2fecaa4 | ||
|
c0288590b3 | ||
|
d2cd3f2e68 | ||
|
893c662438 | ||
|
b0fdbede9c | ||
|
8e11a2bb83 | ||
|
9588f21d2e | ||
|
80e569015b | ||
|
be70352203 | ||
|
980c009fc7 | ||
|
8a02646f52 | ||
|
7ec2167a73 | ||
|
56cec9690a | ||
|
428b67db31 | ||
|
1b2715ccf2 | ||
|
ac76ed7ece | ||
|
4ba4ab1c75 | ||
|
c0f6d2f78c | ||
|
0b4f5298f5 | ||
|
195383bc33 | ||
|
4199191e99 | ||
|
7da28768f7 | ||
|
172cd2eefb | ||
|
341113bcfb | ||
|
5f0e1a15df | ||
|
3abf4de4ae | ||
|
cc1a48ad2d | ||
|
2a584cea96 | ||
|
9f57f6f36f | ||
|
59548410b8 | ||
|
65c4f14a9e | ||
|
3e18cf2b6a | ||
|
11071c7472 | ||
|
38484c6eb6 | ||
|
b964d2fff0 | ||
|
973366e6aa | ||
|
e255e4a69f | ||
|
942f088522 | ||
|
c4341a4e35 | ||
|
6e23ffd12c | ||
|
58239c65cb | ||
|
82ae3646cb | ||
|
8799837d75 | ||
|
cdcf31453b | ||
|
a23ecf0d2f | ||
|
f5046a41cd | ||
|
0d07c49c1d | ||
|
f193729f54 | ||
|
22db62d95a | ||
|
50ffacfb90 | ||
|
21935b41f0 | ||
|
15eabba11d | ||
|
b2d0f2fd8c | ||
|
a07d7e4b8a | ||
|
d4801461f5 | ||
|
f42c1b4cae | ||
|
f8571fc18f | ||
|
fbbf556e08 | ||
|
1cdaddaaf2 | ||
|
4d8976bf6b | ||
|
c02bc3887a | ||
|
68dfc50564 | ||
|
c7b0626b02 | ||
|
30d1f0ba81 | ||
|
758dc7af9d | ||
|
361dab93b3 | ||
|
f0f1d33980 | ||
|
38e0e92e9d | ||
|
2dcc3ddeed | ||
|
33c89547f0 | ||
|
a4ea8bc1e1 | ||
|
9f06079549 | ||
|
2f48c30445 | ||
|
5090687682 | ||
|
2d032b734c | ||
|
2142456a25 | ||
|
99f3b8b4a8 | ||
|
de0bc19230 | ||
|
17099e7973 | ||
|
63f3e347d9 | ||
|
32ff8c1489 | ||
|
369ba99fdb | ||
|
f33ec4aacf | ||
|
1d0ca179b5 | ||
|
8ea172cafe | ||
|
7b4f5108ac | ||
|
6f82d1befb | ||
|
5d5be55ef9 | ||
|
e704de9bb0 | ||
|
8695f462b7 | ||
|
d8c5e49281 | ||
|
4e72df9a28 | ||
|
ac6c1a9e12 | ||
|
3f4112aee4 | ||
|
31ec8f2449 | ||
|
d18558bbd3 | ||
|
70f03ad852 | ||
|
ab40c99893 | ||
|
420f074915 | ||
|
4f2ed67324 | ||
|
a80cafbcfc | ||
|
01cb7c19f9 | ||
|
44249b1380 | ||
|
d7287e7db8 | ||
|
cf654bbba2 | ||
|
5617edbb96 | ||
|
39e4310c7b | ||
|
0204547c09 | ||
|
7b79d53de0 | ||
|
c478ed08c8 | ||
|
67e5298a34 | ||
|
2ca1d844d7 | ||
|
b435487da7 | ||
|
d7b7b570c7 | ||
|
2690bb1bc2 | ||
|
b6c37960e8 | ||
|
c1d3e4634c | ||
|
9df0dbc981 | ||
|
d418f3bfba | ||
|
2893060302 | ||
|
ad945017d6 | ||
|
52a92ca24e | ||
|
ba2f6c66d3 | ||
|
19e193410e | ||
|
b9cef2e2e3 | ||
|
186d2ba6b4 | ||
|
4dfd398d7d | ||
|
bfdb7c7135 | ||
|
bf067738f2 | ||
|
e028a3c441 | ||
|
9847470b38 | ||
|
51209667a5 | ||
|
db4172b5fa | ||
|
242192d03d | ||
|
7135c3b185 | ||
|
c91d033b5d | ||
|
0470fbe0a1 | ||
|
eb8d819325 | ||
|
41f80a4498 | ||
|
e0f75d4f06 | ||
|
42449b8683 | ||
|
e23c696566 | ||
|
035f9b8e13 | ||
|
49f8171f7a | ||
|
75d0e94d5b | ||
|
915f610782 | ||
|
2231e00b2c | ||
|
63f2b15396 | ||
|
f503722c45 | ||
|
4fd1de7fb7 | ||
|
93126c0d02 | ||
|
80f77ea807 | ||
|
9ff8220b8a | ||
|
7754860289 | ||
|
4efe4788af | ||
|
2faf4e2a99 | ||
|
9956e62674 | ||
|
a732427329 | ||
|
974883d2f6 | ||
|
1170ed995e | ||
|
24f9c3a777 | ||
|
5ec384f40c | ||
|
6d7ffa6add | ||
|
dadd7516b5 | ||
|
f99732ba75 | ||
|
5a9635aa58 | ||
|
1552c6d2a5 | ||
|
06c2ed3c99 | ||
|
430c5da54c | ||
|
5b9f3bd4b1 | ||
|
ccc66a8528 | ||
|
8abe314b18 | ||
|
dc470eb10f | ||
|
4c5e57ae89 | ||
|
5d7328df46 | ||
|
99c237e05e | ||
|
56adbc3ebf | ||
|
4cfe812c18 | ||
|
27d2471ea3 | ||
|
61b9248c35 | ||
|
c9561a8826 | ||
|
58c84f17ba | ||
|
73b8320e9c | ||
|
1c3f2498b1 | ||
|
4202baa409 | ||
|
f471eab1a2 | ||
|
9b13ae2399 | ||
|
06f36dc746 | ||
|
98eca9cb23 | ||
|
6268795003 | ||
|
b4f0922a7c | ||
|
aef613acd3 | ||
|
9ecfa1d252 | ||
|
e0bed1e344 | ||
|
d21fa25ab8 | ||
|
0dc1a58b24 | ||
|
f2ca70e232 | ||
|
a6bed22839 | ||
|
efd67cf80d | ||
|
15204470a8 | ||
|
48358d6a5c | ||
|
d7abb891cd | ||
|
52a44eb200 | ||
|
9b1c0a75e1 | ||
|
d75e7784e5 | ||
|
0e60c8b7e0 | ||
|
018c7b1cf4 | ||
|
af1d603374 | ||
|
884308f964 | ||
|
7269990413 | ||
|
2a90d93b17 | ||
|
6e284f8823 | ||
|
a2349fc411 | ||
|
a3964b2b40 | ||
|
226ee7c1f3 | ||
|
2c12171f46 | ||
|
d034a9c295 | ||
|
d2c7104bb3 | ||
|
570c7e8638 | ||
|
cc4578a3d3 | ||
|
1db84be66a | ||
|
77c9668fe2 | ||
|
22cf9b444e | ||
|
97798d1e47 | ||
|
f4b808456a | ||
|
6264736968 | ||
|
7a5f103bcf | ||
|
1a8307b196 | ||
|
13a1c86ae8 | ||
|
15656201d2 | ||
|
f3e372cb4c | ||
|
c781ecc437 | ||
|
daa8fff6c6 | ||
|
d481bba327 | ||
|
32b08ae04c | ||
|
f00a0356c7 | ||
|
9871800874 | ||
|
39c2c038be | ||
|
285d6488a3 | ||
|
eecbd09a46 | ||
|
8d4e4ac115 | ||
|
b77a5d4c8d | ||
|
c3b8b3e7e6 | ||
|
7123b15801 | ||
|
8a2f13d657 | ||
|
251d9fc1d7 | ||
|
5eeb9650b5 | ||
|
c0addd1d33 | ||
|
05b57278d4 | ||
|
aa3ec2fbfd | ||
|
4468516aa2 | ||
|
95d006b406 | ||
|
5b057b4bcf | ||
|
77af48e547 | ||
|
0f7f709aad | ||
|
a8c0e11cb1 | ||
|
0556da85b0 | ||
|
93652e5c6f | ||
|
f3fc1d15a3 | ||
|
3148060550 | ||
|
5f08864d1f | ||
|
184fc36a08 | ||
|
281ed99868 | ||
|
2cc4a1b326 | ||
|
c5bd08755c | ||
|
99f58f63f2 | ||
|
c2a674d2c1 | ||
|
feffc19867 | ||
|
f637e1c501 | ||
|
78240a279b | ||
|
656034d2d9 | ||
|
39a81d167e | ||
|
cb1570d162 | ||
|
8cb646cc20 | ||
|
3cccb21dc9 | ||
|
7f4a49cc44 | ||
|
e0c439fe91 | ||
|
49e233e06f | ||
|
b662dd1f92 | ||
|
700cae43ab | ||
|
1c74c6e7ac | ||
|
757a9477db | ||
|
59d43408f6 | ||
|
1d8941d008 | ||
|
17f853d99c | ||
|
6f9f25dbb2 | ||
|
0273a68587 | ||
|
58a26fcaac | ||
|
489aca03ff | ||
|
f32e19e1c6 | ||
|
57bd04b6ce | ||
|
396df93220 | ||
|
9b76b58b79 | ||
|
9fffed7160 | ||
|
fd136d5501 | ||
|
89ec1c71f0 | ||
|
fc2020c6ec | ||
|
f97635de36 | ||
|
a0a57406a2 | ||
|
5efef86cfa | ||
|
20c747753d | ||
|
08a9c61587 | ||
|
0d91b07797 | ||
|
b033da1782 | ||
|
4dcd872be5 | ||
|
7e9e2a7435 | ||
|
0b84194127 | ||
|
efd9329c81 | ||
|
5cbb820e29 | ||
|
5a0166489e | ||
|
692c9a6312 | ||
|
545d14f9a5 | ||
|
7b9e01eb2b | ||
|
8562f0ec44 | ||
|
6f59d8171f | ||
|
d29a9014f2 | ||
|
205d867e4b | ||
|
84f9490149 | ||
|
1fd4258423 | ||
|
e8a55972a7 | ||
|
aef413202e | ||
|
cbc7dadf42 | ||
|
c508ecc414 | ||
|
384a31765f | ||
|
0f2c4fc40b | ||
|
66a274452c | ||
|
12f8168d1e | ||
|
2142e1dae4 | ||
|
8d21ea55a2 | ||
|
a0da7e8a1f | ||
|
e2452d6c57 | ||
|
5173a3140d | ||
|
e44f2b7d2d | ||
|
ed78f7f4e6 | ||
|
aa198e41dd | ||
|
18b38fb58a | ||
|
5d79d8fad6 | ||
|
e7a746966d | ||
|
555f35d46f | ||
|
de77dfcbbd | ||
|
af08f16efc | ||
|
01a0f3a8cf | ||
|
f80bcdcc5c | ||
|
1ead7ce681 | ||
|
dffa56463e | ||
|
ae98d2e5ea | ||
|
5b1ef638ee | ||
|
f3be03da20 | ||
|
64128a5bcb | ||
|
0018c94a79 | ||
|
d48cb11537 | ||
|
d9f7de7a24 | ||
|
3d102a77ca | ||
|
492d70424d | ||
|
24dbeceb45 | ||
|
cabd538fdd | ||
|
9cf1c3cf05 | ||
|
c3ae221a10 | ||
|
7626d859a6 | ||
|
360311f232 | ||
|
433eedd50f | ||
|
46c53f6730 | ||
|
2b9ae0cc33 | ||
|
433a27e475 | ||
|
1de265ea5d | ||
|
854ce63358 | ||
|
170f77fada | ||
|
72b99bf1ba | ||
|
1a8583f4fc | ||
|
49e8defda1 | ||
|
e5c4e77eb0 | ||
|
8dd3f38ae9 | ||
|
044a7db370 | ||
|
8cecc626c6 | ||
|
ee26fd0e05 | ||
|
a7ea6b5925 | ||
|
2b8a804997 | ||
|
908335367e | ||
|
a7415a052e | ||
|
f51e07b196 | ||
|
5f35c539ce | ||
|
59503c6bbb | ||
|
0309fce1fd | ||
|
f6d211f779 | ||
|
f179e25cc6 | ||
|
5b478cd5f6 | ||
|
e852732ea8 | ||
|
c9718e1ec0 | ||
|
30158424e9 | ||
|
5f6d9e9f42 | ||
|
b108741a8e | ||
|
b4904cc53e | ||
|
2c6fe45847 | ||
|
fed72e4607 | ||
|
c3a4e6b3c8 | ||
|
5bfc5c1010 | ||
|
1112d66fef | ||
|
61b574f2ce | ||
|
522cdd5272 | ||
|
641bae625b | ||
|
d10e20d6d2 | ||
|
b18aa933d1 | ||
|
0f519ebf85 | ||
|
031f17b4f3 | ||
|
036f763eaa | ||
|
d137f307eb | ||
|
66048a5f27 | ||
|
b8c32e24d8 | ||
|
99d51af90f | ||
|
f47ece0725 | ||
|
975089a954 | ||
|
995230f597 | ||
|
adf7072fa8 | ||
|
40cb7cf8d6 | ||
|
d0c0630c1f | ||
|
11c829fb28 | ||
|
e0dda61501 | ||
|
a185ce22cf | ||
|
2a4ee1a482 | ||
|
3a82b8a251 | ||
|
765b2b43f6 | ||
|
2e602b9b88 | ||
|
5d3e75905d | ||
|
eacb660e4b | ||
|
021ceeba0b | ||
|
25a131b942 | ||
|
b4c025a451 | ||
|
604a01cd1a | ||
|
064f91e9b0 | ||
|
34c9f64925 | ||
|
060b705dab | ||
|
262cd757fc | ||
|
dc4d2165f2 | ||
|
bcd2a483da | ||
|
d338872e85 | ||
|
2c30b75268 | ||
|
3deb54d0fd | ||
|
9ae6351a02 | ||
|
b7f95dc8d4 | ||
|
99647fa940 | ||
|
ea3df94213 | ||
|
a37580e4e8 | ||
|
b3fd03198a | ||
|
71b8a22d96 | ||
|
669b68497c | ||
|
6014dd9c7b | ||
|
5a54ba8316 | ||
|
be8e8260e2 | ||
|
5d8ca7c944 | ||
|
0e8e215d4e | ||
|
6cf95509cd | ||
|
ded719cc14 | ||
|
2630eefcc4 | ||
|
2b54a9c0ff | ||
|
bb1eb39ecb | ||
|
8b818f4ae5 | ||
|
4d113c2efd | ||
|
ab9609146f | ||
|
e7a25a45e6 | ||
|
023eaabc1c | ||
|
03d7fbd755 | ||
|
89898181bd | ||
|
e705a7724e | ||
|
5b593da04d | ||
|
9c4f9bc62a | ||
|
84d1619127 | ||
|
1386e78369 | ||
|
224371dfc6 | ||
|
033043218e | ||
|
fcbd99d941 | ||
|
209e5c27ca | ||
|
92eb819aee | ||
|
de4eed33e4 | ||
|
59ad93560e | ||
|
50e52c0fdb | ||
|
e679fafaaf | ||
|
6de25804eb | ||
|
ded8ee0a1d | ||
|
44d54a0d01 | ||
|
6e1c997a0a | ||
|
17c9450f0c | ||
|
d6a87aa75b | ||
|
64acb9fe78 | ||
|
22bf774d61 | ||
|
e2a790b759 | ||
|
ee1c1034e5 | ||
|
b661795ae5 | ||
|
6d96c221bd | ||
|
a596faf4e5 | ||
|
3ee27e7e35 | ||
|
6cf2cf7bd4 | ||
|
54416f780d | ||
|
9d73fcb959 | ||
|
f434915ad6 | ||
|
bbce951666 | ||
|
8a4fec9460 | ||
|
3a83516232 | ||
|
03344a0947 | ||
|
72d7bbbbf6 | ||
|
253f91765d | ||
|
4c7f8696ab | ||
|
f94de97cdb | ||
|
bae19a3737 | ||
|
cc3abcd2c5 | ||
|
9e18a543fa | ||
|
13bccd8441 | ||
|
5af3dbdb30 | ||
|
9f43452fbd | ||
|
61364906b3 | ||
|
105fd73c28 | ||
|
b4b69c0de3 | ||
|
a37be7236b | ||
|
bba7c0069f | ||
|
8916b05cb4 | ||
|
99028376e6 | ||
|
c2796fbf3b | ||
|
37777a78bf | ||
|
0da0aa9b2e | ||
|
9ffd3ed2e4 | ||
|
1176c10860 | ||
|
2e9f819d5f | ||
|
19353fc98c | ||
|
b21d62543f | ||
|
a42ecb843e | ||
|
93ff2cb086 | ||
|
086fa0f0a7 | ||
|
5e97f37a78 | ||
|
c14b162b9e | ||
|
61c000d96f | ||
|
c06a183f28 | ||
|
d1db17c6f5 | ||
|
d336a4d71b | ||
|
796309c903 | ||
|
53df1dfe4d | ||
|
6769718264 | ||
|
7704d84419 | ||
|
9b0e196ba2 | ||
|
fd594ab176 | ||
|
8cadcf6bb6 | ||
|
22fdfa9629 | ||
|
a0ebe7c8ff | ||
|
125c5bc345 | ||
|
95f27cf339 | ||
|
02ae4bc9b9 | ||
|
6bf2be66ed | ||
|
d8ef23eda7 | ||
|
73ef26a106 | ||
|
d51e70083d | ||
|
dc5ae16861 | ||
|
0aa87af82f | ||
|
0be98b98a7 | ||
|
f7ce107ac6 | ||
|
3f772df568 | ||
|
caa6ec0519 | ||
|
30665737dc | ||
|
0c401bddad | ||
|
eb0d80cb19 | ||
|
e62486a610 | ||
|
51d954a4fd | ||
|
416234f43a | ||
|
9ddb4de70a | ||
|
9741be5966 | ||
|
ecb625a666 | ||
|
de7f6c425b | ||
|
718227a94c | ||
|
bb12ebcca6 | ||
|
2e14bf15dd | ||
|
11070b79a3 | ||
|
4219ae9106 | ||
|
f803d74bc9 | ||
|
f0bca66d45 | ||
|
b3c8d9bec8 | ||
|
4a7d3a336b | ||
|
65e39116cb | ||
|
0c97a2afdc | ||
|
9c19d4705e | ||
|
be55401e3c | ||
|
c612b56bc1 | ||
|
8385be25cd | ||
|
2a323d0a8e | ||
|
c544711f14 | ||
|
a348f8e02c | ||
|
42d9b4c91f | ||
|
7d0efb452a | ||
|
418743cf6a | ||
|
eafd0ed765 | ||
|
0c0f84b659 | ||
|
166324fc7b | ||
|
3924545912 | ||
|
86e78410d6 | ||
|
157c60c93b | ||
|
d7f3228ec6 | ||
|
c56ac0c34a | ||
|
e71fa2b649 | ||
|
fefde2a644 | ||
|
a668a9d302 | ||
|
e3c294dc9b | ||
|
dc67705049 | ||
|
e0fa6ed4f8 | ||
|
a4cd654e48 | ||
|
06b963d9ea | ||
|
a36a6685ae | ||
|
83b8a0f2ac | ||
|
1866f51d08 | ||
|
4b2fdbeeb1 | ||
|
eeac85642f | ||
|
0bbe85d3e7 | ||
|
0af762d609 | ||
|
b567717762 | ||
|
2b2a8355c9 | ||
|
ac64d6915f | ||
|
1bee38a1c1 | ||
|
4e54fa2320 | ||
|
eba0ae4ee1 | ||
|
d49a26bcc6 | ||
|
a2759bc245 | ||
|
f642d8b79e | ||
|
bc773e9c96 | ||
|
ffde284288 | ||
|
e3b05dd6c2 | ||
|
8e84d24737 | ||
|
981191660d | ||
|
245b6e0884 | ||
|
c753071961 | ||
|
22ef6362ae | ||
|
80f8ec94aa | ||
|
381c5908b4 | ||
|
fbb5732dee | ||
|
90ed772590 | ||
|
3e559d5c1c | ||
|
eb8649ba42 | ||
|
99f917c022 | ||
|
55cf3bd5ee | ||
|
776ededca4 | ||
|
b16a72a7e6 | ||
|
f9809ca75a | ||
|
e402f43c02 | ||
|
2aad79fa15 | ||
|
89e84fec61 | ||
|
8d34a99d8f | ||
|
15cf97f0d5 | ||
|
c158d8023e | ||
|
bc68664c3b | ||
|
924e4f95c8 | ||
|
35df24e1cb | ||
|
74b0133bc9 | ||
|
12581bcc44 | ||
|
c7c56ac45f | ||
|
603b65e843 | ||
|
2e5e5c4a1d | ||
|
bcc31f68c6 | ||
|
f8f68f9259 | ||
|
7773504afa | ||
|
6b73b6c966 | ||
|
29dde9be2b | ||
|
b6cb56f396 | ||
|
8283f1577a | ||
|
0e9eb5f6ce | ||
|
61d0b08298 | ||
|
b57f73a488 | ||
|
40b99d8084 | ||
|
c944e4fc60 | ||
|
eebab93358 | ||
|
0074ea5e0b | ||
|
e190684fe6 | ||
|
69c1e79c30 | ||
|
b3a3d81406 | ||
|
f1161a9a5f | ||
|
95f0970d85 | ||
|
31a3cc6278 | ||
|
6e7c20e78e | ||
|
165ae139d5 | ||
|
42eb2347d4 | ||
|
3ab6789807 | ||
|
5054dc6ea2 | ||
|
ee54cd4bd7 | ||
|
399a240f84 | ||
|
fef76a76a3 | ||
|
a5459a68a6 | ||
|
b44d4746c8 | ||
|
6f9194eb29 | ||
|
6b2370fd7c | ||
|
ee64081696 | ||
|
a35c234ce1 | ||
|
5026797310 | ||
|
8334e92b6f | ||
|
8cf15e8546 | ||
|
7ae099f2be | ||
|
6d191d12c9 | ||
|
e213246ab9 | ||
|
650e1dd1d2 | ||
|
87cc387321 | ||
|
a7cfdeef21 | ||
|
3750ab5c8b | ||
|
a0704cb14f | ||
|
cad2f69687 | ||
|
31fbec9a00 | ||
|
b1c5afaf3c | ||
|
bc459a76f4 | ||
|
dd8ac689c3 | ||
|
24f0613b9f | ||
|
00b27b1aa7 | ||
|
f76b063e58 | ||
|
c746b1a2ae | ||
|
be13220e32 | ||
|
78c2eb6876 | ||
|
fea4e06484 | ||
|
91f11e0d41 | ||
|
573b8a62d9 | ||
|
eafb94e72d | ||
|
69b44c2309 | ||
|
e9a1c10b34 | ||
|
304a926b0a | ||
|
1bb61f27e9 | ||
|
091bdb79e6 | ||
|
968c3b7e4e | ||
|
ed14d14819 | ||
|
cae391bb48 | ||
|
2753b4eeaa | ||
|
6d05da0e5e | ||
|
4235e23c7b | ||
|
cd01421ac3 | ||
|
aa13c78458 | ||
|
b1c5dd985e | ||
|
3109a297d6 | ||
|
b878127ea0 | ||
|
6ea6556d09 | ||
|
2b37a71eba | ||
|
e3ae76d76d | ||
|
b24508907e | ||
|
ec3daadf43 | ||
|
ae76011e75 | ||
|
34066c1717 | ||
|
19fe3d5e79 | ||
|
ec518e6e7b | ||
|
003ce25acf | ||
|
3e5d867276 | ||
|
b1bcb387fa | ||
|
0fbd8c52bb | ||
|
08895e6cb0 | ||
|
38e775496a | ||
|
47631167f9 | ||
|
185e0dc7b7 | ||
|
bcf6ca59df | ||
|
1ba694cebb | ||
|
906fa05bd6 | ||
|
651f15f833 | ||
|
ef41c1f452 | ||
|
8050813d32 | ||
|
25e7e2fce0 | ||
|
a0f7f0e9e2 | ||
|
f3e0bc7a4b | ||
|
49ff1e837a | ||
|
4f8191b481 | ||
|
927a1a1738 | ||
|
f2f23e8097 | ||
|
cce585f6ca | ||
|
5bfb465ab4 | ||
|
ce7bbafb8f | ||
|
5ffc4bfe3a | ||
|
3ecc99e95d | ||
|
f22c5d3cc6 | ||
|
d8df8e0eed | ||
|
e38958f256 | ||
|
d7c77403fd | ||
|
c8898b5ca0 | ||
|
781257bc64 | ||
|
dec083dcc1 | ||
|
cdd9507493 | ||
|
dba877311e | ||
|
31fd3be6eb | ||
|
2b4284df81 | ||
|
d84e2d6e29 | ||
|
56355159c6 | ||
|
a7135d429b | ||
|
3b0a40cd5d | ||
|
83c74802f8 | ||
|
adc17933cd | ||
|
68c52673d6 | ||
|
2aa35577f2 | ||
|
14ffc66c45 | ||
|
2ea0832e0f | ||
|
ab050878e9 | ||
|
707a04022e | ||
|
d12c357793 | ||
|
ddf8668e16 | ||
|
3491e49c5f | ||
|
d322e495b2 | ||
|
5d80f7006a | ||
|
3e7a9e5d20 | ||
|
33e8769226 | ||
|
59842edbcb | ||
|
507e1e436e | ||
|
b27447ef48 | ||
|
c9a3ba99be | ||
|
967942460e | ||
|
bfa257902e | ||
|
3f103c91f0 | ||
|
2fd9971f41 | ||
|
a3063a9392 | ||
|
d8a02bbbdb | ||
|
76d4a395d1 | ||
|
c515bfb5fb | ||
|
83430be580 | ||
|
9bd9f91722 | ||
|
e6ef43e51a | ||
|
16bca67f2d | ||
|
d65eea550c | ||
|
46080b367a | ||
|
317afae37c | ||
|
930a608236 | ||
|
6e3c45580c | ||
|
e3df7d7bc8 | ||
|
c1fca91103 | ||
|
d3c56a76e7 | ||
|
4194cdda5b | ||
|
f5f999d7bf | ||
|
b4b607681c | ||
|
1e75eba27b | ||
|
f3f3d202ac | ||
|
c90fa530db | ||
|
aeb8097cbc | ||
|
04bea72787 | ||
|
ce95f56ac8 | ||
|
aff45fd455 | ||
|
c8f28d9d09 | ||
|
f3697e5e02 | ||
|
557ba20ff4 | ||
|
dd0e5c26d1 | ||
|
c9a3f41152 | ||
|
d13ffa0aba | ||
|
fb0be29604 | ||
|
7ca1550775 | ||
|
665a71b471 | ||
|
9268a4b28c | ||
|
529bbfad10 | ||
|
e7945c2277 | ||
|
5ee91c73ed | ||
|
2116e4202b | ||
|
19521d16cd | ||
|
057302b936 | ||
|
d62619c9c8 | ||
|
9c80a89597 | ||
|
00834ef03d | ||
|
5b7b065b96 | ||
|
a739af823f | ||
|
493eb446b7 | ||
|
1b45b3802a | ||
|
7898307d78 | ||
|
8da8aa140f | ||
|
4572af2bce | ||
|
6dc17f0e6e | ||
|
3fcf3f69ca | ||
|
a9fd2769f3 | ||
|
9adaf92674 | ||
|
e75c3b6c54 | ||
|
61f2bb1228 | ||
|
d1502f74ea | ||
|
83f9413196 | ||
|
cdc3e18d99 | ||
|
55a6315862 | ||
|
cf447a5442 | ||
|
7597b4fb40 | ||
|
7cd0f2a32a | ||
|
4dae5890e9 | ||
|
738ae4be33 | ||
|
e573611021 | ||
|
f60965a107 | ||
|
3995e8373c | ||
|
ddc82b84e2 | ||
|
87a943756a | ||
|
8e28731f96 | ||
|
cdbd438a04 | ||
|
3220c49f1b | ||
|
94e67a036a | ||
|
c977e82074 | ||
|
9878a5ab58 | ||
|
2de914c38c | ||
|
49b05ba989 | ||
|
85fa8c55c9 | ||
|
57eef65d9c | ||
|
894c954e8f | ||
|
046bac6769 | ||
|
765720e98b | ||
|
26a244325b | ||
|
f7d28ce1d6 | ||
|
c85633b47f | ||
|
6861b1ec82 | ||
|
003cb20b9f | ||
|
f1f622de01 | ||
|
dbb8f3db09 | ||
|
5d7c72db5a | ||
|
755adb8973 | ||
|
0977429138 | ||
|
1dfa6cbc80 | ||
|
e3998dc3df | ||
|
b6e1838fa6 | ||
|
908caba735 | ||
|
121f3b1096 | ||
|
9e373617dc | ||
|
5298fa357c | ||
|
2c15bc5d39 | ||
|
159f9c85a6 | ||
|
1d1f318752 | ||
|
40a9d82ae9 | ||
|
72c28d3462 | ||
|
ed224ca7d8 | ||
|
02e131b5fd | ||
|
5afb5e03b0 | ||
|
52a23b969b | ||
|
afcc7ea22b | ||
|
c463b81819 | ||
|
f688c7d20d | ||
|
0167bba371 | ||
|
7004fb702d | ||
|
2f2dd3322d | ||
|
31d3a781a8 | ||
|
a7fd6b68be | ||
|
6a1e78e614 | ||
|
770edea577 | ||
|
08a51b2820 | ||
|
ac11c689f7 | ||
|
f3e199fcd2 | ||
|
ffcbe68570 | ||
|
06e965e29c | ||
|
e865cc0249 | ||
|
5d8d03da03 | ||
|
0b3da61ac7 | ||
|
a24eb691fb | ||
|
c5c8ef436c | ||
|
83309c1ac8 | ||
|
ec2f4f512e | ||
|
ad991734c4 | ||
|
03184e1c31 | ||
|
cca5844ba9 | ||
|
45d3866f97 | ||
|
94edfc0a8f | ||
|
9fa9eebe51 | ||
|
4518506559 | ||
|
c1fb84e1a6 | ||
|
ea34aa2d3e | ||
|
d6cb657c85 | ||
|
0df9f30f14 | ||
|
d3e902af76 | ||
|
0b3420a012 | ||
|
5cf0975913 | ||
|
db90a180c2 | ||
|
d174d610bd | ||
|
e69e56ea52 | ||
|
0c66c713b6 | ||
|
95230c9792 | ||
|
7eea0ac6de | ||
|
b19a1f602a | ||
|
789235b925 | ||
|
00722c3294 | ||
|
cb4e3889ec | ||
|
76ec7040f1 | ||
|
b41365b495 | ||
|
6e18af6f81 | ||
|
12bc28bc8c | ||
|
3fa3be1f31 | ||
|
a468701511 | ||
|
f67cd07328 | ||
|
5cbdf51b4a | ||
|
7378afc6d8 | ||
|
7957408497 | ||
|
53fc13ba7f | ||
|
a0ea7cbf26 | ||
|
6310e023a7 | ||
|
5f594ce5d3 | ||
|
64a7dfbe7d | ||
|
5d0e94c11c | ||
|
0ca1170b6d | ||
|
addc91a409 | ||
|
450f329f05 | ||
|
1f72b4f65b | ||
|
50195ec990 | ||
|
2d9557cf40 | ||
|
5625ceec7d | ||
|
888e9cb60b | ||
|
d00f6cbe12 | ||
|
8abef30a75 | ||
|
158b26b875 | ||
|
d92decb774 | ||
|
af9d3c027e | ||
|
47c148628e | ||
|
e7c2a3a1da | ||
|
d32575ee74 | ||
|
f6b0398ca8 | ||
|
d5c6762332 | ||
|
a1154b226d | ||
|
731a018905 | ||
|
f45f4a8d54 | ||
|
e306abaf8a | ||
|
bc28aed5b1 | ||
|
93afb02994 | ||
|
0db64af9b2 | ||
|
4da3f45f41 | ||
|
8a8aeba17c | ||
|
e640d9246d | ||
|
81d7a6b81d | ||
|
08537dc891 | ||
|
c2741affe9 | ||
|
301cc85fec | ||
|
3433bfc3bd | ||
|
62ec696cae | ||
|
0d0ec3ec89 | ||
|
1d4c2454bc | ||
|
0fb606fa0a | ||
|
0ec489d6f2 | ||
|
7e3cf82a40 | ||
|
84e8d4c603 | ||
|
8373bd1b71 | ||
|
6202b2d324 | ||
|
e46f81af22 | ||
|
888cabff27 | ||
|
c6b6437761 | ||
|
1830629472 | ||
|
12ca73947b | ||
|
c39c17c1b5 | ||
|
27a26fcfeb | ||
|
48d5fae514 | ||
|
3153080301 | ||
|
309d82b6aa | ||
|
b9715c5a03 | ||
|
3ae0557258 | ||
|
02b6c0e881 | ||
|
cf5ea1ccdc | ||
|
011a344500 | ||
|
1570005683 | ||
|
899fcf51e6 | ||
|
7d5714fedd | ||
|
9f22aaea2f | ||
|
4ab19e7882 | ||
|
ecc419fce0 | ||
|
d5e62a8255 | ||
|
5859860a02 | ||
|
b8aeaa3bf4 | ||
|
a866a8f2fb | ||
|
214324aaa2 | ||
|
181e1280af | ||
|
2316fb2d05 | ||
|
81ab756759 | ||
|
c50a9ef055 | ||
|
3d3c0591e8 | ||
|
e0f60c3811 | ||
|
59e55ea6fb | ||
|
df36d759fc | ||
|
fe24aa2254 | ||
|
1a44270284 | ||
|
a860f7f5f7 | ||
|
e5fc3f3a62 | ||
|
276fd6b077 | ||
|
27754a76dc | ||
|
b586b64119 | ||
|
9c86eef98b | ||
|
db054ba757 | ||
|
2e726c46c8 | ||
|
791edd0cec | ||
|
e4760ea2b0 | ||
|
61ee5b1d76 | ||
|
b6ce7a9f74 | ||
|
99fa641a24 | ||
|
c67e115f61 | ||
|
027a5a872d | ||
|
973f65f80c | ||
|
643f04681c | ||
|
713e606b28 | ||
|
ce18713f57 | ||
|
761d283d6d | ||
|
4512bcd72c | ||
|
47dbea9334 | ||
|
326b1c1225 | ||
|
e26eebfb2f | ||
|
107dd313bd | ||
|
02a99e3f0b | ||
|
896123513e | ||
|
562f3e43bc | ||
|
ed477abbd5 | ||
|
21518fbd4e | ||
|
52f928700a | ||
|
c96340980a | ||
|
8384582116 | ||
|
ac5b39b354 | ||
|
0f7161785e | ||
|
49fba5a82a | ||
|
fb7bdabb70 | ||
|
5ab64708c5 | ||
|
f14d0e0983 | ||
|
ca84e5b1f2 | ||
|
c66cbf0d69 | ||
|
f69ce3e02b | ||
|
2251038ab8 | ||
|
42d63258e9 | ||
|
d34a143d82 | ||
|
4e9eb95830 | ||
|
9a31702a75 | ||
|
34f7142323 | ||
|
00ea75ce82 | ||
|
6d9aaf8de5 | ||
|
a82b3955bb | ||
|
c9a7fd1722 | ||
|
1bd35072cb | ||
|
c8c83e9f52 | ||
|
ab2441c088 | ||
|
2c73964b2b | ||
|
ee21e31a17 | ||
|
93dfd411fc | ||
|
c197ecc99b | ||
|
c2c73215b2 | ||
|
1ba0ed8121 | ||
|
c5ab0a66b7 | ||
|
f3510db367 | ||
|
c46c2c4f3c | ||
|
0b5c25aa7c | ||
|
ba5644376c | ||
|
c4379db8fc | ||
|
cdd2450a97 | ||
|
84445b82e4 | ||
|
05d7d37872 | ||
|
a8f8201c90 | ||
|
7297cc13b0 | ||
|
4f174afc1a | ||
|
96bdc4c830 | ||
|
9fbce867ee | ||
|
fea4835941 | ||
|
47a13263f6 | ||
|
82e6a2ed62 | ||
|
b1be96e40e | ||
|
a4d5f96e9a | ||
|
a4f1623012 | ||
|
fe99bb4b9b | ||
|
259115bb3f | ||
|
a572e2ed12 | ||
|
5ad7118aea | ||
|
16af2148b9 | ||
|
e787cdd1cb | ||
|
2b0fcc79c5 | ||
|
4e77fe50a4 | ||
|
9902e6fb9f | ||
|
f18da95d38 | ||
|
368fcaee54 | ||
|
badbb4a500 | ||
|
b96c3a063f | ||
|
84a2746d05 | ||
|
2059c6e4d0 | ||
|
bf3fce3550 | ||
|
19078966d9 | ||
|
f734f79f5b | ||
|
627331aa68 | ||
|
3ed4503c30 | ||
|
f1986545da | ||
|
9f48314cb4 | ||
|
7c275285ea | ||
|
4ffb95a736 | ||
|
943a8ebdc6 | ||
|
8d73a6c4e2 | ||
|
e817db62a4 | ||
|
85eb179acf | ||
|
3d70b645b6 | ||
|
c83b6217f9 | ||
|
a97f6c4c74 | ||
|
710b1bcb6d | ||
|
b4617e7904 | ||
|
a9f022dacf | ||
|
5ff4476ccb | ||
|
98a6015d3a | ||
|
05b281ad9e | ||
|
3c9ffa77f9 | ||
|
2a32d14dc4 | ||
|
e087271d48 | ||
|
375404290d | ||
|
5c8f7c7ea3 | ||
|
c6774812fa | ||
|
af13128430 | ||
|
6b7a92035c | ||
|
9e8b158ee1 | ||
|
3226e12037 | ||
|
2a011779e9 | ||
|
faa1118ca7 | ||
|
3341e4f88c | ||
|
976403d10d | ||
|
ff729744e5 | ||
|
d924adef75 | ||
|
dca4c2904e | ||
|
e806c3376a | ||
|
c9674cd809 | ||
|
259d8f19b3 | ||
|
9a1c4f91fe | ||
|
4bdc303f6c | ||
|
5b0dc4d325 | ||
|
39c30d6fd6 | ||
|
e50af65a1b | ||
|
c4d757c6f7 | ||
|
ac4f3c0c7e | ||
|
107cc1f6a1 | ||
|
f49dc90655 | ||
|
7cfaa50148 | ||
|
dec9b9ad2f | ||
|
7973b954b4 | ||
|
e0711d87a0 | ||
|
3bbcfb0185 | ||
|
86a8e8970a | ||
|
f5d612b213 | ||
|
a2d2e19f84 | ||
|
35c32602f4 | ||
|
0d04dcd9ae | ||
|
f6f5ed166f | ||
|
b644aca98c | ||
|
e5ab4a7283 | ||
|
f36eb4646b | ||
|
0c3eb04a37 | ||
|
09233129a8 | ||
|
2480c82d76 | ||
|
7fb04b3656 | ||
|
166d4a26f3 | ||
|
b6169a957d | ||
|
ead6d99069 | ||
|
59a9be5f5a | ||
|
d81838e9fa | ||
|
894688c547 | ||
|
059e6514ca | ||
|
a729999f55 | ||
|
f332cca4a7 | ||
|
242ef2b2b4 | ||
|
5c0f909949 | ||
|
633491833c | ||
|
b713ca2638 | ||
|
46246c8db6 | ||
|
e1cca6d97b | ||
|
01f3dc6d41 | ||
|
0e1a1959de | ||
|
6c70402161 | ||
|
6652c7c435 | ||
|
7f3208ba79 | ||
|
b680ddc66c | ||
|
7a5a6ca53f | ||
|
b80ec493ed | ||
|
d4a6014578 | ||
|
6ee61c8380 | ||
|
db4d9b7fcf | ||
|
95136abc47 | ||
|
5b586ea4d8 | ||
|
05a124930e | ||
|
423c4e4636 | ||
|
6c6beeee70 | ||
|
74457dc989 | ||
|
34b76c6f80 | ||
|
35355d1f1b | ||
|
7c37a82821 | ||
|
5a01cdb81c | ||
|
6cfd190107 | ||
|
10ec13b2c3 | ||
|
8a3d0b23cf | ||
|
c90927cf54 | ||
|
f187a5304b | ||
|
d5b09fdbf5 | ||
|
c8b73b00be | ||
|
ee74cee5d4 | ||
|
99eedf77b5 | ||
|
d61e7dd685 | ||
|
864d27d460 | ||
|
3c86eb18a5 | ||
|
c4fe072751 | ||
|
0e61b4a982 | ||
|
92da7659f4 | ||
|
be8b547261 | ||
|
ef57a3e585 | ||
|
b71f1e1edd | ||
|
f3db2551a6 | ||
|
7eace53eb7 | ||
|
c6e82160e4 | ||
|
c8cd824be2 | ||
|
854ab04ee4 | ||
|
4e6ed43198 | ||
|
2d4a1cd428 | ||
|
fd5f1f1f5d | ||
|
fbb30a2570 | ||
|
043bd34e2b | ||
|
e4a67c8496 | ||
|
0a097b7a1e | ||
|
4343de3ee2 | ||
|
3f34916c57 | ||
|
0e6e7b0608 | ||
|
334bafc9c1 | ||
|
8eedec04a1 | ||
|
5aa9cc82a8 | ||
|
6183cd0731 | ||
|
971fb8729a | ||
|
124fb331cc | ||
|
d20375c185 | ||
|
fff95b7173 | ||
|
130dfbe11c | ||
|
68e50a725a | ||
|
3f9fe2dac4 | ||
|
e1283b8a86 | ||
|
653608e931 | ||
|
80aac1b711 | ||
|
b428a53b7a | ||
|
94d1637221 | ||
|
3a5ac12321 | ||
|
c9d757fc0e | ||
|
532dbb8064 | ||
|
adf26fd69e | ||
|
13dee4d059 | ||
|
fc09581aa3 | ||
|
52c539eced | ||
|
5fdab77cc2 | ||
|
00ceeeae7a | ||
|
7240c2172b | ||
|
f3d15b995c | ||
|
b71af6a50f | ||
|
362776c38d | ||
|
e6bf89e82b | ||
|
19c38f1a8a | ||
|
ac5f2a9300 | ||
|
088b5cfec2 | ||
|
b33afb790e | ||
|
73332f4df1 | ||
|
7cb286bb6e | ||
|
e9d62822bd | ||
|
8d05a823e9 | ||
|
c051a2ecae | ||
|
dc0247c57e | ||
|
8fca59f63b | ||
|
1ab1c62f03 | ||
|
a19c79d714 | ||
|
dc11874abe | ||
|
61753bb5e3 | ||
|
3f1a8c2a1c | ||
|
bdb67b4397 | ||
|
c4fcf8bfd7 | ||
|
7e8b02145c | ||
|
a09d7a59b4 | ||
|
27721c564f | ||
|
2e040d03df | ||
|
2724816152 | ||
|
03396922ab | ||
|
b4a3013c28 | ||
|
903c2915ed | ||
|
3ca2195ed0 | ||
|
c759b2d2a6 | ||
|
adbe152256 | ||
|
3883853817 | ||
|
ead41ac491 | ||
|
8a35c9a1a0 | ||
|
10da0f92a0 | ||
|
ca79af7a46 | ||
|
ba4ce63858 | ||
|
f31a8f4086 | ||
|
9c47a9256d | ||
|
8ec86b810d | ||
|
69fcd9210f | ||
|
b95e60dbbd | ||
|
8bca8e5ba0 | ||
|
92b5f06bf9 | ||
|
4316522146 | ||
|
c0d1fd14f8 | ||
|
f740226a82 | ||
|
54f401506b | ||
|
4d75c2e0f9 | ||
|
7361fbfe28 | ||
|
897291c470 | ||
|
6320928795 | ||
|
9acd2e176d | ||
|
c7efb2d964 | ||
|
41ab63897f | ||
|
77f48d2bad | ||
|
897d29ea31 | ||
|
13f0e4729c | ||
|
86fd38ef42 | ||
|
127a4ada93 | ||
|
1aae6395c6 | ||
|
1bf469411a | ||
|
47b872f5d0 | ||
|
80c1be919f | ||
|
243c8b4e1a | ||
|
d7fbb1512a | ||
|
8416edd127 | ||
|
77966135e8 | ||
|
6054052248 | ||
|
bbb49c43e1 | ||
|
9437c72ef6 | ||
|
bb511195b8 | ||
|
582458998f | ||
|
bb5c643dfb | ||
|
bf631046c0 | ||
|
0d7c02d2c6 | ||
|
129e9151da | ||
|
4771379302 | ||
|
62a65d3fdc | ||
|
032152c41d | ||
|
da80fd782c | ||
|
460cdf4c09 | ||
|
0badef42d5 | ||
|
811b3d0f08 | ||
|
8de850fd07 | ||
|
1e5995335c | ||
|
4153b6a30b | ||
|
c631fb79d5 | ||
|
9ae204df9c | ||
|
e7658ec5f5 | ||
|
b3656c387f | ||
|
164199614c | ||
|
219f92c4ca | ||
|
0e37370b0c | ||
|
845b99feb7 | ||
|
4b9f2f13b1 | ||
|
b44de74b91 | ||
|
59d16eb189 | ||
|
c7004d100c | ||
|
07a3ed1d7e | ||
|
cc545a73a1 | ||
|
efa1e56369 | ||
|
8da8e7d17b | ||
|
b10b76e882 | ||
|
be058430b4 | ||
|
7a559e4733 | ||
|
5fb8818ae5 | ||
|
cdefc19129 | ||
|
918894fd84 | ||
|
1bc65be70f | ||
|
b9d19291fe | ||
|
2aaff47c9d | ||
|
a582d1dc2f | ||
|
5acd8f36a4 | ||
|
efaff24145 | ||
|
b059c9e5c0 | ||
|
82122fe9cd | ||
|
3beb6a9df3 | ||
|
a576ab83e9 | ||
|
70ee5e94fd | ||
|
69da8719cf | ||
|
4ce87eeb91 | ||
|
24a801b660 | ||
|
786bba39ff | ||
|
bed027f41f | ||
|
17a4ef6730 | ||
|
56383d3ca0 | ||
|
60c9a9e654 | ||
|
5398bfab36 | ||
|
a8a6040b78 | ||
|
22db4c0448 | ||
|
7bbf958e5c | ||
|
0b7de80a6f | ||
|
de37fbffa3 | ||
|
f4a3db8db8 | ||
|
c409a6df5e | ||
|
71be210795 | ||
|
67942622f1 | ||
|
5252a32de4 | ||
|
5e5c0d65f3 | ||
|
3dde2722bd | ||
|
befcdeb74d | ||
|
0c62fd02b0 | ||
|
8d2f1851eb | ||
|
b355f4605e | ||
|
f6c4c26937 | ||
|
c334151294 | ||
|
faf4cb1b74 | ||
|
ccbff12d6a | ||
|
a02e884415 | ||
|
1fdf283e5d | ||
|
910059adcb | ||
|
a8bd376fd4 | ||
|
c69f9b9883 | ||
|
69b873b766 | ||
|
6162560b69 | ||
|
f101e19257 | ||
|
7836b85c96 | ||
|
522c78b5e6 | ||
|
aabd40a7a2 | ||
|
e351ea2ee8 | ||
|
efc396bd05 | ||
|
ae53998a88 | ||
|
d814d8f954 | ||
|
63e3117510 | ||
|
cab93c2ad8 | ||
|
3acf86510d | ||
|
418524b1be | ||
|
a5d2180bf5 | ||
|
0364ae4908 | ||
|
a7c97182f7 | ||
|
1e7426e549 | ||
|
fd6501207f | ||
|
7f8188ccb6 | ||
|
f5341da94d | ||
|
a588f69f16 | ||
|
86bf374fc4 | ||
|
a3d6442d02 | ||
|
62d20c8b37 | ||
|
726e2e9bc0 | ||
|
eedd9c2bda | ||
|
5c181562f6 | ||
|
104aceb44a | ||
|
bee794e598 | ||
|
483804bafd | ||
|
55709b9d2c | ||
|
8eb32cef24 | ||
|
92f847c8f7 | ||
|
be3caa4686 | ||
|
fa6a2f52e2 | ||
|
7e188c48e1 | ||
|
928cd1b8ab | ||
|
4145d85ef1 | ||
|
9901b4e9f1 | ||
|
4e46de66d3 | ||
|
7c7d28345e | ||
|
8690f4862d | ||
|
c9a9c00f61 | ||
|
6a60d47b90 | ||
|
f19a1833bd | ||
|
074d3f6266 | ||
|
92eee0386f | ||
|
32caeecffb | ||
|
5ef0475dc5 | ||
|
aa5ac6c3b2 | ||
|
fd7e34312a | ||
|
d10c734730 | ||
|
c64a5a4b8f | ||
|
e3cd293f4e | ||
|
d324f3b16a | ||
|
01c9d49f09 | ||
|
cc1b8c2d0b | ||
|
ed7698efaa | ||
|
efe2859227 | ||
|
4b4498be93 | ||
|
eff2330ce1 | ||
|
8884b1f9a6 | ||
|
bb747bcd62 | ||
|
b1f0671541 | ||
|
abeefaac7f | ||
|
90c04ee15d | ||
|
d3d8fd6d9b | ||
|
c6c5cc7246 | ||
|
d5465f1ad8 | ||
|
3f8a83b285 | ||
|
385152b3d2 | ||
|
66c69aef6a | ||
|
f4f152bd01 | ||
|
eaeb9d1b20 | ||
|
a42755a061 | ||
|
5d35e3ccf5 | ||
|
7ef03a761b | ||
|
f570791e19 | ||
|
25152a8cef | ||
|
14b7eb1c5a | ||
|
3b4c5f982c | ||
|
2c58d0881b | ||
|
7a748bd565 | ||
|
cf996949fa | ||
|
79672d51f6 | ||
|
c3dc74bba0 | ||
|
f539e319f0 | ||
|
eda5a884c6 | ||
|
7b33ceebbb | ||
|
8aa453d75b | ||
|
ed1c0b71df | ||
|
63f083db96 | ||
|
a74d4609af | ||
|
427a2fca4d | ||
|
910908fb32 | ||
|
a8800d5b0a | ||
|
adca49e432 | ||
|
214f6cb6e3 | ||
|
3395d10e82 | ||
|
2e93923e24 | ||
|
892e83e872 | ||
|
10482ca49c | ||
|
9947072d2d | ||
|
6d3e22dd4a | ||
|
e3d7603d54 | ||
|
f9dd484381 | ||
|
48bf80d190 | ||
|
089bfad490 | ||
|
f1bf1e1835 | ||
|
35e1917655 | ||
|
121d4bf52a | ||
|
fadc8a1944 | ||
|
a5dd4028ac | ||
|
a510c16838 | ||
|
156b5f4749 | ||
|
fa89a7b0bc | ||
|
a24298f625 | ||
|
ec83a96484 | ||
|
a03ebfda52 | ||
|
323bf47738 | ||
|
ad15890a81 | ||
|
60aeed99c6 | ||
|
c529209c8f | ||
|
be3e45d759 | ||
|
7c8cff0d3c | ||
|
256e94980e | ||
|
aa65c6e477 | ||
|
59b5cb6fe2 | ||
|
a33c689c40 | ||
|
30d9839631 | ||
|
f0b7f27029 | ||
|
a1313c7066 | ||
|
31c84d4559 | ||
|
076f12e82d | ||
|
231e5a5eed | ||
|
350dc4ca05 | ||
|
ff2f6cb110 | ||
|
b667722184 | ||
|
bc3f2f246f | ||
|
28548e7ea2 | ||
|
023ef753b9 | ||
|
b799d0d073 | ||
|
be6e1ccba2 | ||
|
2a58aa2181 | ||
|
525cdeae19 | ||
|
c831aabe14 | ||
|
642110b072 | ||
|
56e2f39175 | ||
|
3e26e23e60 | ||
|
588fec6474 | ||
|
87fbb89330 | ||
|
a4701fbd3e | ||
|
e02fd232ba | ||
|
f7f531e59d | ||
|
51e3d8f08b | ||
|
02b65de6a2 | ||
|
c3a1cd10ab | ||
|
e5d094d2bd | ||
|
d6efe75251 | ||
|
f50abfcb1b | ||
|
bee6b8af8f | ||
|
1b6db623a7 | ||
|
a45603a344 | ||
|
fa9463528d | ||
|
82b6044dbb | ||
|
be7aab204f | ||
|
f82b3f0f51 | ||
|
3d7680a426 | ||
|
878305671b | ||
|
46d2dc9bee | ||
|
e188b3e28c | ||
|
a59164d5c8 | ||
|
0b0eb6a119 | ||
|
e6b3c74069 | ||
|
20bd54f6d3 | ||
|
6599e4ea53 | ||
|
5617d64119 | ||
|
b81a9e54a3 | ||
|
cbe27daafb | ||
|
430855fdca | ||
|
e9bde7e6fc | ||
|
5aebc9fb0c | ||
|
d0c2b643f8 | ||
|
c0ad4718a4 | ||
|
8f188adc32 | ||
|
74042d368e | ||
|
2a5b32f109 | ||
|
0c383b858f | ||
|
aecfd95592 | ||
|
9f740d1872 | ||
|
70d393b5cd | ||
|
f193cda03b | ||
|
e3e9982fec | ||
|
4ca3c0bc86 | ||
|
38bb3b86d2 | ||
|
ad7fe15154 | ||
|
91e9599554 | ||
|
47fd7fcaea | ||
|
50247fc894 | ||
|
37dd0fd2d6 | ||
|
1932e70e72 | ||
|
ea81790d48 | ||
|
2384e5c9c9 | ||
|
72eda1d3ae | ||
|
3a73f04fd3 | ||
|
107834f899 | ||
|
b6cd7aaf17 | ||
|
4b6fa1b54d | ||
|
284cc8f62d | ||
|
ef35fc60c1 | ||
|
ec2843bcf3 | ||
|
8a18bb8440 | ||
|
21b15a0a09 | ||
|
c400c54b86 | ||
|
1a618b1b31 | ||
|
a09d096b87 | ||
|
c88a7935d6 | ||
|
43bbf04764 | ||
|
10b8737c7d | ||
|
dab29dddc3 | ||
|
20ea00e7f6 | ||
|
6a8ab8f1e6 | ||
|
eba2937715 | ||
|
07954edadc | ||
|
1c695e130e | ||
|
f42d15437b | ||
|
564e2e865c | ||
|
c76f179487 | ||
|
29a962320c | ||
|
e927ef94a6 | ||
|
f929123a7b | ||
|
d34bbee304 | ||
|
74c509d36e | ||
|
448cf2c357 | ||
|
f22b677906 | ||
|
272265c636 | ||
|
a8ba3c4e2e | ||
|
523bc7d355 | ||
|
1dd17d857e | ||
|
a54b07d3ae | ||
|
f63a7b978d | ||
|
04483dd307 | ||
|
3c5c36de50 | ||
|
deb8df8eff | ||
|
3231741cd2 | ||
|
747bde7e64 | ||
|
7c9c897dac | ||
|
fc1deea2b8 | ||
|
7421282d9a | ||
|
9d5a391b54 | ||
|
6ec6d1d39d | ||
|
e2c57f6d47 | ||
|
664e9d6dfe | ||
|
0c24347cdb | ||
|
c86ede8cfb | ||
|
38a62f0d5b | ||
|
27b2e2d3e7 | ||
|
4e940ffcc2 | ||
|
109c08e9e5 | ||
|
03cdfafc2a | ||
|
6cca5a9f92 | ||
|
629f0e21c9 | ||
|
a711e22b17 | ||
|
82663c7d11 | ||
|
8cd25f35c2 | ||
|
300a944af6 | ||
|
5e57e60692 | ||
|
28cd6eca88 | ||
|
82c1bac4e3 | ||
|
08717ef117 | ||
|
56c0608e4d | ||
|
9c9fd8714e | ||
|
69b61fef67 | ||
|
add6b836df | ||
|
a95a41ef73 | ||
|
f3805edbd6 | ||
|
7f91ff07c4 | ||
|
d5e13f255d | ||
|
9ebe050646 | ||
|
7f84a7a85e | ||
|
264e921d3f | ||
|
7ad127668d | ||
|
35d3e74267 | ||
|
2abde8a068 | ||
|
afd3ee264b | ||
|
2e193b9a29 | ||
|
48c2065a17 | ||
|
7729a0c3bb | ||
|
f1b32b808f | ||
|
5ef1d053eb | ||
|
0264841dc4 | ||
|
40071c3fb9 | ||
|
d92f69f137 | ||
|
15febdfe07 | ||
|
1040f14da4 | ||
|
11f08804d1 | ||
|
29d45b1144 | ||
|
bd38e59479 | ||
|
b6d2671260 | ||
|
5f9ccb361a | ||
|
ef51bd16dc | ||
|
125ad2003d | ||
|
ccac37613b | ||
|
292e83466e | ||
|
172cc0dd03 | ||
|
26d3caf97c | ||
|
7848096acb | ||
|
18869c666f | ||
|
1c81a126c5 | ||
|
180fe914b6 | ||
|
dc644df9bc | ||
|
550306d1b6 | ||
|
78eb12958a | ||
|
cc9df782ce | ||
|
562c41af4e | ||
|
b5e7b8e29e | ||
|
2979504b9c | ||
|
a01fab662c | ||
|
daa2a04fc9 | ||
|
983bb89063 | ||
|
3d9b453000 | ||
|
90f647b6be | ||
|
7f7c27be30 | ||
|
2b63a1b4e1 | ||
|
90f3d1f7a6 | ||
|
65a5eb47b3 | ||
|
6b5ddfe235 | ||
|
2f57b1d529 | ||
|
7e535022ab | ||
|
cb1d2de838 | ||
|
96acbb2506 | ||
|
030f745b08 | ||
|
dc949f5488 | ||
|
7b745345f7 | ||
|
3ee61e2084 | ||
|
26a1cd9a00 | ||
|
27c74d2f72 | ||
|
a5ee22baa2 | ||
|
02c3c314fe | ||
|
012745b218 | ||
|
d4b86322a9 | ||
|
ac74786c2b | ||
|
cf43c9901f | ||
|
3030bf4274 | ||
|
dc144fb910 | ||
|
45b242d5f7 | ||
|
42b37da1e7 | ||
|
8eb5950ebd | ||
|
ccb5e34052 | ||
|
ee48fc6544 | ||
|
2365df532f | ||
|
24c2ce6a87 | ||
|
791fba3187 | ||
|
367c447ff8 | ||
|
ca730314e7 | ||
|
b2d6b8c567 | ||
|
170ba87648 | ||
|
44f689320b | ||
|
7da62cc9f7 | ||
|
841f0d5778 | ||
|
367e717aeb | ||
|
5bf82b34c6 | ||
|
734dd1c293 | ||
|
4052ef7097 | ||
|
dfb6dd2ad2 | ||
|
426d555f6e | ||
|
b129652597 | ||
|
ec5b2aab15 | ||
|
af5cf823ea | ||
|
7e94079b5b | ||
|
d81c1961c2 | ||
|
45e0dd1966 | ||
|
a1ec49feda | ||
|
3afa6e526b | ||
|
ecabbb6974 | ||
|
989ef47bde | ||
|
5a918e2b2e | ||
|
2dd1522e30 | ||
|
e49f267c4a | ||
|
afed97bf0e | ||
|
9ba113bc05 | ||
|
35d7618117 | ||
|
10c8647c1b | ||
|
1767a3bd70 | ||
|
5082106145 | ||
|
b643a07b66 | ||
|
dd92c79339 | ||
|
b767a82bd8 | ||
|
67d58ccb98 | ||
|
bbfac75f19 | ||
|
930aad6d31 | ||
|
65383dd616 | ||
|
2ae8014da7 | ||
|
b79e2d1e8d | ||
|
172996f2b3 | ||
|
3c512648da | ||
|
e335e74379 | ||
|
5c90d0d0ae | ||
|
95fb749923 | ||
|
d9a47ec075 | ||
|
c9c17b8863 | ||
|
2a61ce80b8 | ||
|
3eaeaa8af3 | ||
|
261e8df837 | ||
|
d18ab2d206 | ||
|
08f2735e86 | ||
|
aec215aaf3 | ||
|
4b08e06fa6 | ||
|
2774b70fbf | ||
|
3dbe4ac593 | ||
|
ba28660acb | ||
|
cec9075361 | ||
|
176cb29eab | ||
|
3cb7128116 | ||
|
88e88743b9 | ||
|
e6092ad146 | ||
|
59914df5b7 | ||
|
67fbee389e | ||
|
b590cee35a | ||
|
0c81d86cd4 | ||
|
d6e93bb9c7 | ||
|
2bb94b4329 | ||
|
fa0614516a | ||
|
d08511c5dc | ||
|
2a4cdf5a5d | ||
|
f5f6170858 | ||
|
d7d1ef8228 | ||
|
d4669dbf6a | ||
|
f43f71646e | ||
|
aecf545446 | ||
|
3b42e0263a | ||
|
5a74114e23 | ||
|
3bab0fccc2 | ||
|
2a8fdb8ee4 | ||
|
6c103b72a2 | ||
|
ea9e28bb69 | ||
|
c94afc7592 | ||
|
80909e4424 | ||
|
c59f64ce49 | ||
|
e232f93018 | ||
|
62d578de9e | ||
|
a625fee035 | ||
|
b586a30e7b | ||
|
676354f1d1 | ||
|
e44a97a096 | ||
|
35597ae336 | ||
|
c3e8b46284 | ||
|
d3ee5d7dfe | ||
|
2fed3982d6 | ||
|
f9b04af650 | ||
|
b1b2ecba6c | ||
|
6601ca7a22 | ||
|
1b51000736 | ||
|
994cda3b6b | ||
|
2becb5ebf7 | ||
|
32433fae61 | ||
|
99ce660aed | ||
|
01b9badb51 | ||
|
f27b61cb0f | ||
|
52bc509fcf | ||
|
2984960793 | ||
|
e32bdf6a93 | ||
|
35d75c354e | ||
|
9f85a15955 | ||
|
b1b8161447 | ||
|
c6f17ac01e | ||
|
53a4b8fa33 | ||
|
a90b90e98d | ||
|
ff9a27ee9f | ||
|
cf0a817db1 | ||
|
e00745c548 | ||
|
af956bbb32 | ||
|
4343a96fac | ||
|
9124f1d7c8 | ||
|
32ca42ead3 | ||
|
25bb249ac6 | ||
|
332adafa23 | ||
|
a44aae268a | ||
|
52c090dfbe | ||
|
141f6825ce | ||
|
fff5649b6a | ||
|
34c16bb395 | ||
|
cedc5d340f | ||
|
3becc3ad63 | ||
|
19498040ef | ||
|
060b2f4989 | ||
|
2ecc3bb560 | ||
|
d5340675ae | ||
|
dea995e19f | ||
|
473abe8eb4 | ||
|
386e643179 | ||
|
1fa19e1fc2 | ||
|
13720ce6b2 | ||
|
02b668baf5 | ||
|
57dc1a0649 | ||
|
8ae8e1e455 | ||
|
7905aa64fa | ||
|
d81abf1d50 | ||
|
6a5799fc7d | ||
|
3e4d9aa9bb | ||
|
2004080c9d | ||
|
70dc2ee9bb | ||
|
7825fc63a0 | ||
|
33b2f0700e | ||
|
647981ef44 | ||
|
252fd66b76 | ||
|
1ef1ea0b3e | ||
|
14fe7ee414 | ||
|
bd22194438 | ||
|
ea65e10dc7 | ||
|
48a24202ef | ||
|
9b1ed45b3e | ||
|
f163f1940d | ||
|
fdcd28a0ec | ||
|
d2863466ac | ||
|
5047979340 | ||
|
7ab74d22c4 | ||
|
c1729330c5 | ||
|
2dafba1ad2 | ||
|
67e0e6d5ad | ||
|
8b4f82cd07 | ||
|
2c7b5fe1f2 | ||
|
a30e8baf3e | ||
|
2e01eb9189 | ||
|
2adac87c45 | ||
|
72f9fdc05f | ||
|
cbed6f4241 | ||
|
50de8bd6fb | ||
|
7e09160ba3 | ||
|
3facf34f5f | ||
|
2553a18f40 | ||
|
0b13608bad | ||
|
8143d70829 | ||
|
92bbf3ba18 | ||
|
5441ee5a7a | ||
|
fde169d3ef | ||
|
3516c3f936 | ||
|
e6de60d04e | ||
|
cd839a251f | ||
|
fadee1b46b | ||
|
3e9c6c6297 | ||
|
45385e737c | ||
|
c86e14c6ff | ||
|
b5da52007b | ||
|
22ef4fe26c | ||
|
ebca2efb24 | ||
|
61d500462c | ||
|
6002dc634e | ||
|
563bd01789 | ||
|
cc863ba378 | ||
|
fb28e0cba9 | ||
|
cd33062a81 | ||
|
1ac7cf2ab6 | ||
|
53b7ad3a92 | ||
|
01c161d380 | ||
|
af4c2dab8d | ||
|
2a755d68d9 | ||
|
770f2b1e02 | ||
|
85c6ffb364 | ||
|
bf3f7ae5b9 | ||
|
9804677669 | ||
|
c5614c8529 | ||
|
6bafa69f8f | ||
|
a2c4c4a916 | ||
|
de42ef017f | ||
|
69917690f3 | ||
|
02b17886c9 | ||
|
0507df61b2 | ||
|
0af95b188a | ||
|
bf3b36ae6a | ||
|
58ce9a85c1 | ||
|
dc5f86e039 | ||
|
46c8775542 | ||
|
059d966d7b | ||
|
2069ab3a15 | ||
|
bb90bc6165 | ||
|
de4f882a22 | ||
|
9aff5cb095 | ||
|
782b9ce69e | ||
|
806c908091 | ||
|
04a712dacc | ||
|
3453d2d17a | ||
|
25bf561aed | ||
|
ad3c475dd1 | ||
|
85573909d1 | ||
|
63e6437d66 | ||
|
58deab1915 | ||
|
ac900b17e0 | ||
|
a11ba51389 | ||
|
5cd004defe | ||
|
03a5c7f52a | ||
|
717de1e703 | ||
|
33f291d769 | ||
|
7f93173659 | ||
|
4648351270 | ||
|
4bd1ecf8a7 | ||
|
584c836918 | ||
|
ac0511f02a | ||
|
32b854a98b | ||
|
943a594ba0 | ||
|
def328eec1 | ||
|
e26edbc623 | ||
|
d06e526dc2 | ||
|
9a2de1570c | ||
|
3065e4f941 | ||
|
0fedd76819 | ||
|
fd83407991 | ||
|
3d521a2e34 | ||
|
affb5e53df | ||
|
d6b1563655 | ||
|
9d02cedfed | ||
|
449a31dea9 | ||
|
bfa6cd3693 | ||
|
f588d50d57 | ||
|
27c067612c | ||
|
a3a5b334c4 | ||
|
cbaba010f2 | ||
|
8b69d697dd | ||
|
632ac54440 | ||
|
873b5db13d | ||
|
1978a29678 | ||
|
f34ea44d73 | ||
|
bc081473f2 | ||
|
0b18034055 | ||
|
d1eeb692c1 | ||
|
05680a4662 | ||
|
a08217a33c | ||
|
5ccb2c62a9 | ||
|
9dd49b6c6a | ||
|
b52a2176fe | ||
|
d2a36b38ca | ||
|
33788c8405 | ||
|
32cd5a3dc4 | ||
|
ee1232051c | ||
|
b3890d385c | ||
|
5a35595a3a | ||
|
584a8cd1a8 | ||
|
7a0d655292 | ||
|
2f483a25e9 | ||
|
7735be367f | ||
|
a50633d8e0 | ||
|
dc7e2965d6 | ||
|
9065a8da89 | ||
|
9d60047018 | ||
|
9d5f978d00 | ||
|
23376b8a31 | ||
|
70c5871910 | ||
|
9d1b1cf073 | ||
|
90dea98a14 | ||
|
9cdb8ca244 | ||
|
7e56e6c4ea | ||
|
c407c08b0b | ||
|
08a7dedbc9 | ||
|
68c98811a1 | ||
|
07f13c28ee | ||
|
fbd812ebb3 | ||
|
34d0b5de90 | ||
|
d3f88a2482 | ||
|
8debad803c | ||
|
9aceb3711b | ||
|
8e3ac54de3 | ||
|
2877dc9794 | ||
|
c6e35ce066 | ||
|
7742e70865 | ||
|
4fdfdaf2e6 | ||
|
2396b4e27f | ||
|
a941faccb0 | ||
|
196a72b29e | ||
|
c1dcbab932 | ||
|
4d14667266 | ||
|
c517c2ea65 | ||
|
ee32e3eb40 | ||
|
09d1bf37e7 | ||
|
bf6ce68ed1 | ||
|
ad5e73d772 | ||
|
26492ff0ea | ||
|
ade9476721 | ||
|
a2a53406c8 | ||
|
5e3d051b6a | ||
|
e48b283e39 | ||
|
3adb07aa00 | ||
|
136b7a5305 | ||
|
d6bbcd020b | ||
|
42619a3a81 | ||
|
8393c6a63d | ||
|
13f2915b65 | ||
|
f7885bbdde | ||
|
ba6659f6be | ||
|
2af9e2f759 | ||
|
e6cf959170 | ||
|
ea39d3c45e | ||
|
a8904d25ba | ||
|
784016a25e | ||
|
5fcfecc56e | ||
|
09a5014b3c | ||
|
f5dc18730c | ||
|
0bd7a2fc7e | ||
|
b186ab90a2 | ||
|
c360705e6a | ||
|
9172271c7f | ||
|
a1860ed680 | ||
|
643f192515 | ||
|
a8db9f52ec | ||
|
83dba77955 | ||
|
e79af802b1 | ||
|
3a1145b999 | ||
|
24fbfae0fd | ||
|
563bd5b5bc | ||
|
c1d9e8d571 | ||
|
f7cb9455c8 | ||
|
d94b5b5ad0 | ||
|
e2625db1dd | ||
|
47753d8a01 | ||
|
94809feac7 | ||
|
6a511b6ea7 | ||
|
ffba220ae8 | ||
|
43e40524c4 | ||
|
4f1a14532b | ||
|
c113984b32 | ||
|
edba363d54 | ||
|
919ea2a76d | ||
|
755a4440e7 | ||
|
c7335bcd4d | ||
|
881bb7bf0a | ||
|
2212bf85b7 | ||
|
0c85e2838c | ||
|
7967590682 | ||
|
df7e35ccd7 | ||
|
414136f33a | ||
|
ee572856e9 | ||
|
7d2e4481c7 | ||
|
d10f7eae31 | ||
|
757ab484ac | ||
|
d62933fba5 | ||
|
a6829838c6 | ||
|
fd1731a7b9 | ||
|
9419331500 | ||
|
8a24c33151 | ||
|
f5e94cd7f1 | ||
|
7769f19bf5 | ||
|
3b4779fa15 | ||
|
5059586fc3 | ||
|
8670f475b8 | ||
|
1b129ede4e | ||
|
6844ef21d4 | ||
|
6043f5d5d0 | ||
|
0070a0642b | ||
|
9bf6ddd4f1 | ||
|
0decb50fcd | ||
|
40b89456af | ||
|
008362cd77 | ||
|
9d2241efe7 | ||
|
f473145d42 | ||
|
b93a4bae45 | ||
|
42604cf4b2 | ||
|
19a237bbb0 | ||
|
ba3b995e58 | ||
|
e7b730528e | ||
|
db04bcb727 | ||
|
f3d0b49928 | ||
|
fe89f5fdff | ||
|
05d2bb0df5 | ||
|
98ec7b61a9 | ||
|
8565f1e681 | ||
|
3aa5b45768 | ||
|
e02fb4a862 | ||
|
ee19e1d3ff | ||
|
fe1e880ffe | ||
|
a5dc42c47c | ||
|
070412a6a5 | ||
|
0ffd5aa743 | ||
|
744f74506f | ||
|
46744e8433 | ||
|
038945110f | ||
|
7852b06038 | ||
|
dded56c4bb | ||
|
7dea6c53ed | ||
|
fd0a3df315 | ||
|
a1bdc1974a | ||
|
24636eb7f1 | ||
|
737a5453d9 | ||
|
f860152a35 | ||
|
87d2c471db | ||
|
ca54d67814 | ||
|
615af841f0 | ||
|
c43d264d3e | ||
|
d1aed52280 | ||
|
7e7e870eae | ||
|
f7dade8c2c | ||
|
24139c6ff0 | ||
|
16c1e80491 | ||
|
5a7979b435 | ||
|
349bddc652 | ||
|
acc90ad09f | ||
|
7a750156ef | ||
|
8075eafe91 | ||
|
58975fc8b5 | ||
|
8320c43589 | ||
|
73d1a98ce6 | ||
|
f9f514a46c | ||
|
16f2f2bce7 | ||
|
8258a76c9b | ||
|
c9ddbaa2c0 | ||
|
a99c844296 | ||
|
492f49c06a | ||
|
80480ae919 | ||
|
1327eaa83b | ||
|
eee101b9dd | ||
|
77ab354a5a | ||
|
1801eb6393 | ||
|
28d6dc38af | ||
|
dc6e3d083e | ||
|
4e7c5f19fe | ||
|
3dfbdbc66c | ||
|
95f373448d | ||
|
648b253f41 | ||
|
3e2b272239 | ||
|
489143f160 | ||
|
3eafce4683 | ||
|
b23da503fa | ||
|
cae4c76b56 | ||
|
069993e880 | ||
|
a13834b9f9 | ||
|
c82ff17d3b | ||
|
ca8fbbc2be | ||
|
b94b3e6315 | ||
|
ab61bcafa3 | ||
|
9e44df9c5f | ||
|
438a9bb4aa | ||
|
6f686b1801 | ||
|
d7d3827f47 | ||
|
ad30383b46 | ||
|
9af3b06fc2 | ||
|
f395960741 | ||
|
02eb4bd806 | ||
|
24f0c9da11 | ||
|
3dc0f9c0b4 | ||
|
8af8ef4404 | ||
|
7a8e99de7d | ||
|
8d6a263c1c | ||
|
cb18b858d4 | ||
|
cd977c70ca | ||
|
57c3b0e0b7 | ||
|
0e70d8bacb | ||
|
8f0cd470ae | ||
|
48ddaf35fb | ||
|
9493682e49 | ||
|
da6e5ce3db | ||
|
f4894b7140 | ||
|
7d3be90159 | ||
|
76eff24718 | ||
|
e8dc7cad18 | ||
|
4201a48ecf | ||
|
c0d031cd1e | ||
|
1a50260ebd | ||
|
38a24ce6c9 | ||
|
a0a87c2b81 | ||
|
a100306b00 | ||
|
17bbcce52b | ||
|
0b2bd123ef | ||
|
ea53abbca7 | ||
|
7f69f8e680 | ||
|
301569bee6 | ||
|
e82e94be5b | ||
|
0c07e7a96f | ||
|
7dd7d6dda6 | ||
|
3bb1f0a7df | ||
|
a0d25379b2 | ||
|
643b31a6a1 | ||
|
0e2013d244 | ||
|
e6c95762ba | ||
|
b66df5fa3c | ||
|
afb51d1de3 | ||
|
db290201ea | ||
|
ed5ae0a2f7 | ||
|
8f8b0d84ae | ||
|
3fbc002bad | ||
|
60cc56b31c | ||
|
fc12ffcb30 | ||
|
0c1bf01cf7 | ||
|
bb21d79321 | ||
|
c63c069d58 | ||
|
513d3172cb | ||
|
5c699ab406 | ||
|
a87114fbfa | ||
|
29e900977f | ||
|
796471a7c6 | ||
|
524613b610 | ||
|
b765bfa5a5 | ||
|
c0d8542a85 | ||
|
36ef9327ef | ||
|
f2205b1725 | ||
|
25c7577779 | ||
|
9ece3cfdaf | ||
|
c5108687c5 | ||
|
e52bfeb491 | ||
|
dd1503d5a8 | ||
|
082fce5e3e | ||
|
2e0a1f1aff | ||
|
f7f88b7187 | ||
|
f04b2a9390 | ||
|
516fe131be | ||
|
ee016e605c | ||
|
69d85cce2d | ||
|
fe7f5ca7f4 | ||
|
9c7344487a | ||
|
5f9aac2027 | ||
|
43fc1bd21c | ||
|
a981c33bad | ||
|
36ec7ab150 | ||
|
5301ec618b | ||
|
a0a24e9380 | ||
|
e9618f1ba2 | ||
|
40d789ce18 | ||
|
641bca87bc | ||
|
5ad473fc62 | ||
|
7aeb6b5200 | ||
|
e250f6a275 | ||
|
0f9e096d6e | ||
|
e59192b9ea | ||
|
a1ee5124d3 | ||
|
a280077820 | ||
|
13f3ccb85d | ||
|
770e539859 | ||
|
993f9f3efd | ||
|
f3c7b61f29 | ||
|
3b8f83a5ae | ||
|
836c4e0198 | ||
|
dfcccb63a1 | ||
|
6f5800bd74 | ||
|
d3a2c6a0b4 | ||
|
7a8e3cc258 | ||
|
e7f26cabfe | ||
|
a29aefc9c0 | ||
|
a73dce4a56 | ||
|
f424da498a | ||
|
8b5e7429d7 | ||
|
5dfe28db2a | ||
|
949d2d9e50 | ||
|
0fe30d14a8 | ||
|
46f272b669 | ||
|
c4620bb528 | ||
|
384e09aa7c | ||
|
54ad22a455 | ||
|
3bddbb1110 | ||
|
72e3d2492f | ||
|
51a61c5431 | ||
|
4e10f46899 | ||
|
392d01555d | ||
|
a729cdcfdd | ||
|
a58276c4c1 | ||
|
f075dd0db3 | ||
|
4d34d16bd8 | ||
|
57d0f0ce2e | ||
|
778b8a45e9 | ||
|
3c46a4062e | ||
|
2a7ba427dd | ||
|
d87a71bd04 | ||
|
6bb10b1898 | ||
|
f52351d116 | ||
|
7d72004742 | ||
|
09de17fb59 | ||
|
2c2984fd29 | ||
|
d5143c2c15 | ||
|
59fd6428ae | ||
|
07c5a4fa04 | ||
|
550a806d77 | ||
|
dc6c977766 | ||
|
86397df32d | ||
|
8e60b19662 | ||
|
c508c2213e | ||
|
89f7a19691 | ||
|
5d8727a59c | ||
|
e8af38cc2d | ||
|
b8cf818dac | ||
|
bca4652c5e | ||
|
3c4308b7b6 | ||
|
464b2242e2 | ||
|
553487cc8a | ||
|
73f6426114 | ||
|
07cac80fb0 | ||
|
253ee0c407 | ||
|
2d1d628340 | ||
|
c6c6c56186 | ||
|
528b9bd872 | ||
|
32dba5e0c7 | ||
|
58cc4b7043 | ||
|
795253a9d5 | ||
|
c0673dbdf1 | ||
|
3cdf363cce | ||
|
63673d3ce0 | ||
|
2d8ee3a496 | ||
|
0561d5bea3 | ||
|
cc5297d637 | ||
|
1595fdb54b | ||
|
d705a5b45e | ||
|
0e9836649e | ||
|
4849d313fd | ||
|
3ec5cd312b | ||
|
138340ee99 | ||
|
a5f0075a60 | ||
|
84c79d7531 | ||
|
fd99ea09ec | ||
|
4e314ef6d4 | ||
|
776c1e66db | ||
|
e0ed57db67 | ||
|
41eb5813e0 | ||
|
5fb3ee6101 | ||
|
3517fbdcbd | ||
|
7f56538602 | ||
|
4044ed8783 | ||
|
a5d6f6ac98 | ||
|
41c55a30cd | ||
|
4a1d2d816c | ||
|
1e357b3c74 | ||
|
f69da7d00d | ||
|
24a095c5c1 | ||
|
1742fb8655 | ||
|
76cc736755 | ||
|
c35e271dba | ||
|
6ab7baa413 | ||
|
1114bdbb04 | ||
|
f86423972f | ||
|
62f992af23 | ||
|
37e671612e | ||
|
3b3a3fa845 | ||
|
4cba40f9fd | ||
|
8048d1411f | ||
|
1a2cbe100c | ||
|
19320a1f8f | ||
|
7124326808 | ||
|
ecd5ae890f | ||
|
aa2601bb9e | ||
|
3e1b9e11d7 | ||
|
1879eede0d | ||
|
facbbba789 | ||
|
d61bc2d136 | ||
|
5ab220fa76 | ||
|
b483a8d652 | ||
|
ed14731146 | ||
|
746eae15f3 | ||
|
121b606f9c | ||
|
61af08d499 | ||
|
a6105ef37f | ||
|
993609b5aa | ||
|
e3116eed2e | ||
|
98d6c751d3 | ||
|
9165749321 | ||
|
75b790376d | ||
|
8da8bf7e87 | ||
|
8b6718c632 | ||
|
98b2b45264 | ||
|
dda2f58588 | ||
|
c4b69fcddd | ||
|
a628559258 | ||
|
895e40190b | ||
|
c442485137 | ||
|
dd76a50683 | ||
|
9d0e82788a | ||
|
d0d5003f45 | ||
|
c2b72c0e73 | ||
|
9d0b6c5730 | ||
|
3229100025 | ||
|
0dde8f8968 | ||
|
235ba92602 | ||
|
6747d350a5 | ||
|
45c1432946 | ||
|
05b39623b0 | ||
|
62f37669dc | ||
|
600ef1e47c | ||
|
4d17613050 | ||
|
bfdd1f4662 | ||
|
be775ed72d | ||
|
8d083eb248 | ||
|
7573524a14 | ||
|
20d2061f22 | ||
|
df297b6ca3 | ||
|
6175802693 | ||
|
0f23090545 | ||
|
f43b250ed2 | ||
|
6e0b79a33b | ||
|
139c149486 | ||
|
3f7cd45df4 | ||
|
c298095000 | ||
|
d30b5481f5 | ||
|
f587a4e3f3 | ||
|
3b73b115ca | ||
|
71e789943e | ||
|
1caf8a1f5b | ||
|
1d3f28da2e | ||
|
86ba0cde35 | ||
|
a335cf2edf | ||
|
33ccf1b931 | ||
|
ccdbffbf3f | ||
|
8f509b0ae0 | ||
|
001c77d1f7 | ||
|
c45b91aa94 | ||
|
5d0e6c21aa | ||
|
5991836e1f | ||
|
532df198da | ||
|
241d2e3fa3 | ||
|
c55d53daa6 | ||
|
8a67846872 | ||
|
704b8cd83c | ||
|
84b961cb20 | ||
|
8bf6b190ff | ||
|
69c6ffa90b | ||
|
e989bf3b0e | ||
|
cfdeab70cd | ||
|
de1161536b | ||
|
589bb921ae | ||
|
b59a4331fa | ||
|
832059967c | ||
|
30e7e2c276 | ||
|
3ae892bf91 | ||
|
930752d46e | ||
|
d172c71376 | ||
|
fd8207dd9a | ||
|
e7596d92c7 | ||
|
3ced55aa93 | ||
|
2d2291d00e | ||
|
da4b6896f7 | ||
|
8fca37f373 | ||
|
155dea6f14 | ||
|
e5ff55a1be | ||
|
07c24e72ac | ||
|
a8ea6e6463 | ||
|
58f0330d3f | ||
|
f7aaa2e1c7 | ||
|
cfa6c7d45b | ||
|
df1ef496d1 | ||
|
e3a12c3c28 | ||
|
dd92c8e927 | ||
|
10c14bcc05 | ||
|
eee726ec7d | ||
|
22fc59ab59 | ||
|
50a6ffa952 | ||
|
2b621eb45d | ||
|
c44ff3eb3d | ||
|
3e7d830f57 | ||
|
26db51fa9d | ||
|
fb9502e0fb | ||
|
d0ea2b2867 | ||
|
5573d98ecc | ||
|
38b44e3fc9 | ||
|
d4ab2024f5 | ||
|
790bba1556 | ||
|
b51aed8aa5 | ||
|
1f52112d72 | ||
|
ad907a51e2 | ||
|
6673359d89 | ||
|
560448afed | ||
|
deaefbf1dc | ||
|
9823a37362 | ||
|
15bda88d04 | ||
|
de73b9b934 | ||
|
2fc854eda0 | ||
|
60607ed18d | ||
|
546e56ef3d | ||
|
dc78e0a250 | ||
|
5ffa6f3331 | ||
|
1a23ffd776 | ||
|
c07f99d5e4 | ||
|
ae8be31247 | ||
|
4f6910c131 | ||
|
d787cd3076 | ||
|
cc3e878f90 | ||
|
b9b9a3115a | ||
|
b9065195f1 | ||
|
36d3b6aa95 | ||
|
911cd1a6d3 | ||
|
da84b59ee4 | ||
|
aba28ef0bc | ||
|
11343bb0ea | ||
|
e9f7003b70 | ||
|
3107d8a0f4 | ||
|
7f1fa0d1ff | ||
|
604c5dedf4 | ||
|
71f2617263 | ||
|
8532c2b9b6 | ||
|
1affbe2100 | ||
|
9dc2712c47 | ||
|
d3d1f82f73 | ||
|
2439c44779 | ||
|
6e1024737d | ||
|
03a41021de | ||
|
19b94ec325 | ||
|
b9fa72d582 | ||
|
a73cff8e4f | ||
|
8857fc6c4b | ||
|
f671e6d138 | ||
|
4d6ebf95fc | ||
|
8c512191b2 | ||
|
f147a8990a | ||
|
048f6b4731 | ||
|
9cba3c87ef | ||
|
dbd28eecc9 | ||
|
2c62886c71 | ||
|
fe0b770033 | ||
|
b75e682c50 | ||
|
bb6d718e19 | ||
|
28a136d7f4 | ||
|
10ec5c7f34 | ||
|
55c31fbe9a | ||
|
2f1fd4bbaa | ||
|
18a10c0db1 | ||
|
aad0f517b4 | ||
|
1b9ff68f8c | ||
|
aa054471f2 | ||
|
f2ff75f3a2 | ||
|
5dc8f5cfab | ||
|
ced1bb9404 | ||
|
9f14127fd6 | ||
|
b95e548ddb | ||
|
87bef13a4c | ||
|
72cc5a49e6 | ||
|
b26516b3ac | ||
|
a94fa7b476 | ||
|
43b712d42b | ||
|
2c5967925f | ||
|
4182cf3e9e | ||
|
a1796ecace | ||
|
3eb8e26174 | ||
|
d05bf563a2 | ||
|
3ea56ba4c7 | ||
|
f56929d0df | ||
|
101f09aabd | ||
|
a0d312396a | ||
|
6903a2ffc5 | ||
|
8dee12ff05 | ||
|
9299f4e98a | ||
|
6225870aa9 | ||
|
dad486c01b | ||
|
0b7e857614 | ||
|
431f6bf3a5 | ||
|
9372aa99af | ||
|
81c29ecc7e | ||
|
dd388aedfd | ||
|
a46e025725 | ||
|
fd270ddc6c | ||
|
369ffe518d | ||
|
0afa4cc957 | ||
|
872f031405 | ||
|
35791c6371 | ||
|
2f97505b93 | ||
|
137f70b122 | ||
|
dfa33082bb | ||
|
b2bc85f6f6 | ||
|
21372c3d4e | ||
|
7ee9aefed7 | ||
|
8c9a59c29e | ||
|
28404f9e87 | ||
|
e66e51fa6d | ||
|
2b9842e094 | ||
|
f52cba6aff | ||
|
713de872ce | ||
|
1aa421efe5 | ||
|
dd42831cba | ||
|
f0b662ff58 | ||
|
e8ca077f30 | ||
|
2328f8b9b8 | ||
|
680172a084 | ||
|
254b25296b | ||
|
903d0b91fc | ||
|
54ccfcc705 | ||
|
dfacd260bb | ||
|
04b83d50a2 | ||
|
1236585693 | ||
|
c76008bd6a | ||
|
e0aa9ce372 | ||
|
ee7701c15b | ||
|
6e1c133e33 | ||
|
969268166e | ||
|
83a156ef47 | ||
|
6136959a6a | ||
|
4f840c211c | ||
|
db5967472b | ||
|
e65a84f6ea | ||
|
526924559f | ||
|
24623d398c | ||
|
56462cf082 | ||
|
f384f81253 | ||
|
427b5d61f4 | ||
|
e27fba0c06 | ||
|
7a1ec78563 | ||
|
ec42be346d | ||
|
ccf990a0d7 | ||
|
fd77251fdd | ||
|
f7d9305786 | ||
|
bcda46e3f3 | ||
|
7fc75fc482 | ||
|
45fff07a4c | ||
|
08d54b3d78 | ||
|
735c1b6183 | ||
|
bb1039d4c9 | ||
|
a21d4c06ae | ||
|
12468f5e9f | ||
|
468e437390 | ||
|
d167af4c38 | ||
|
3061a31c92 | ||
|
73e354b7a0 | ||
|
0cc03f912c | ||
|
f003e52009 | ||
|
13c4eef637 | ||
|
d5b06624fb | ||
|
a3a10b62f2 | ||
|
03160719eb | ||
|
b276a7fd17 | ||
|
37e2250992 | ||
|
bdb8c07bb2 | ||
|
27f9437d31 | ||
|
ba301fd800 | ||
|
53d7ae4e9b | ||
|
7a027be255 | ||
|
ece06c26a9 | ||
|
8d28853774 | ||
|
fb8b421aac | ||
|
b3ecede429 | ||
|
b8d7925d0d | ||
|
95e0ed2826 | ||
|
11e11b8767 | ||
|
a4c73860a1 | ||
|
241297b6d6 | ||
|
65e24f812f | ||
|
fd455be55c | ||
|
7e172bf456 | ||
|
a211dc03b3 | ||
|
490d4a504a | ||
|
c076a7f7a2 | ||
|
7b23f41fd4 | ||
|
f2b9becd7e | ||
|
f298cde47e | ||
|
28fa18874b | ||
|
e699f9cbf6 | ||
|
31a434b9d7 | ||
|
d86910ce94 | ||
|
79ee2fa20a | ||
|
9e0fc44210 | ||
|
35e9c131d6 | ||
|
e27a2a96a0 | ||
|
29fa369f71 | ||
|
db82a25177 | ||
|
b2f77bb050 | ||
|
d9e79fd728 | ||
|
52e8d8db54 | ||
|
cbf325a6b8 | ||
|
8fd88eee2b | ||
|
98a27bff0d | ||
|
00985cffea | ||
|
0fe1051101 | ||
|
fd2477923c | ||
|
d4fb372899 | ||
|
ce1ec22704 | ||
|
03789c4d97 | ||
|
e0ca244623 | ||
|
3c41f108df | ||
|
7069d03ab2 | ||
|
01215f5015 | ||
|
42d00b13df | ||
|
1f21a499d4 | ||
|
274c729fd3 | ||
|
9d24ee8daf | ||
|
dd5e0f724a | ||
|
653d73ff07 | ||
|
662d81c801 | ||
|
187602dfaf | ||
|
8707ae23e2 | ||
|
0127763ade | ||
|
e7c711996b | ||
|
1e726fe405 | ||
|
24e18a9fbd | ||
|
5f824c5708 | ||
|
57e4b82b66 | ||
|
6dcb77f7b5 | ||
|
42761acf4f | ||
|
01756b6b02 | ||
|
b35bfeb1c3 | ||
|
af4e8b171c | ||
|
5233e66762 | ||
|
52c246ae19 | ||
|
e34f279295 | ||
|
ee66d9ccf9 | ||
|
1c19af2c8f | ||
|
10aaab6350 | ||
|
62f060a389 | ||
|
004bed8a7f | ||
|
a971233068 | ||
|
67ae845b3c | ||
|
708ea3d0bb | ||
|
49564e5310 | ||
|
604afd52d1 | ||
|
6dac71e618 | ||
|
d58bbd5da1 | ||
|
68299c6a5e | ||
|
d079634c5e | ||
|
9025c63c43 | ||
|
c6ef86029c | ||
|
e3deb6e9a5 | ||
|
6eec242a07 | ||
|
28b8bf566b | ||
|
0ce3f6efe0 | ||
|
617f5dfe5e | ||
|
1f12273de1 | ||
|
65483dcc95 | ||
|
32d859eede | ||
|
c74f972627 | ||
|
33c78d2bb2 | ||
|
7626ef57b9 | ||
|
07b4cc145b | ||
|
27366197f3 | ||
|
d49969ddf3 | ||
|
c91a91008c | ||
|
92b4c05090 | ||
|
d45ad8f827 | ||
|
fa3bd72eea | ||
|
d3068125c5 | ||
|
e269e936e3 | ||
|
0d2645b3e1 | ||
|
9d0e64a725 | ||
|
9e004a9496 | ||
|
5ac08a44c6 | ||
|
c72b1c5893 | ||
|
c65bf64756 | ||
|
7201433060 | ||
|
7bbdbcfb6d | ||
|
3f01b222b2 | ||
|
c929fb52dd | ||
|
11b407045a | ||
|
811bb7997c | ||
|
d932cd9be1 | ||
|
5e5dfff6fe | ||
|
107f692de8 | ||
|
a1019413f4 | ||
|
b95f5c5bea | ||
|
8c0cb6cce8 | ||
|
ee93101b24 | ||
|
7f4c5b86db | ||
|
9bf33e4dcd | ||
|
876c2586b9 | ||
|
b9ed139546 | ||
|
85d61de61c | ||
|
b8186b5081 | ||
|
fb67b9bdad | ||
|
2c983d6c7a | ||
|
7c28d6b869 | ||
|
53035de136 | ||
|
d7ca3ea27c | ||
|
c12be1f98c | ||
|
90be1c3fa7 | ||
|
727bf7dd8c | ||
|
e9425d711d | ||
|
9d42beb2e6 | ||
|
ea8d682664 | ||
|
8f7bac4999 | ||
|
3921369f98 | ||
|
a243996aca | ||
|
0f612d5021 | ||
|
14567f3459 | ||
|
a54154e760 | ||
|
ac10fdc50f | ||
|
90c0194598 | ||
|
09d07f76b3 | ||
|
d33fe2378c | ||
|
7b9f7d8aba | ||
|
0681b8096c | ||
|
d879853e8f | ||
|
0a279cf666 | ||
|
c0870d417a | ||
|
ac82dc418a | ||
|
144272e735 | ||
|
d62aa6221b | ||
|
68abaeab19 | ||
|
00bc094914 | ||
|
84a47a6691 | ||
|
03b53ffde1 | ||
|
ef14b18f8e | ||
|
3f90ecfd77 | ||
|
a275e4e5b8 | ||
|
fd45854000 | ||
|
a10626705d | ||
|
0cbc44d8bf | ||
|
5c93b49a6f | ||
|
df238fe6a0 | ||
|
f1d4713097 | ||
|
d0f953218f | ||
|
fda9fb563b | ||
|
49b5e1d9bf | ||
|
eb84acaf5b | ||
|
e9364c7cba | ||
|
08f392cdd3 | ||
|
bb597dcf66 | ||
|
fec58157ac | ||
|
6be8ffb771 | ||
|
1b19eed195 | ||
|
fb41413b76 | ||
|
40c8f2001d | ||
|
b41f41589a | ||
|
69a6d26c80 | ||
|
0fef29b6e3 | ||
|
f7e2467da1 | ||
|
dc44edc1b8 | ||
|
ca53d88284 | ||
|
5e46f63e17 | ||
|
43a91e5963 | ||
|
1d5862a39b | ||
|
7c786506e1 | ||
|
d03c3980de | ||
|
9bbe9455cf | ||
|
6376b683c7 | ||
|
9dba7cd371 | ||
|
49e252df03 | ||
|
8049db20ff | ||
|
ecf5f5d21d | ||
|
12a39450b0 | ||
|
c753fc690f | ||
|
35c1b330ec | ||
|
5ee1087959 | ||
|
a88ae2080c | ||
|
e8aa6ab735 | ||
|
f2726399dd | ||
|
d47e694048 | ||
|
44c57ab05a | ||
|
4a89731025 | ||
|
2b928b4754 | ||
|
923ca6f104 | ||
|
4472ba2b6b | ||
|
7f3dcb3e8a | ||
|
a26f2fb00b | ||
|
6596a50c90 | ||
|
8ff87c120a | ||
|
730833f96c | ||
|
4327b5c1b0 | ||
|
d6de6de1bb | ||
|
9eecb2f542 | ||
|
54debf855c | ||
|
acda53aa1c | ||
|
71921bc9b2 | ||
|
bc5c52dc95 | ||
|
cf1f8aff77 | ||
|
d78f2926ec | ||
|
46916d322e | ||
|
299f849ffa | ||
|
bbf06152da | ||
|
8ffae97128 | ||
|
d4ac8bc67b | ||
|
8e1637a2cc | ||
|
4e8d92bece | ||
|
4eedeabb51 | ||
|
3009707723 | ||
|
8edcf03715 | ||
|
abea8ff8f4 | ||
|
3dd1fe4211 | ||
|
d2969d2326 | ||
|
e3831c146d | ||
|
218de578e0 | ||
|
87fbda8344 | ||
|
e9ab6c10cf | ||
|
1eb592550c | ||
|
dc3cfd0d9d | ||
|
2f17f2207a | ||
|
d2e1e9a0ac | ||
|
c0a3931595 | ||
|
55d1938977 | ||
|
3a99d001ff | ||
|
7033003c36 | ||
|
21c7e699f1 | ||
|
208200a3cc | ||
|
ba2cadb479 | ||
|
ca47dffa35 | ||
|
548d5603ea | ||
|
6b458676b1 | ||
|
63448f3244 | ||
|
2d88bcb67e | ||
|
effc37362a | ||
|
3ba80d11eb | ||
|
edea49f9a9 | ||
|
1d63fe6542 | ||
|
87d32647f1 | ||
|
56a5d0b287 | ||
|
f86765a760 | ||
|
3efbd45443 | ||
|
a87e5197cf | ||
|
5b33afb1dd | ||
|
b0585e13d8 | ||
|
e685950d97 | ||
|
5eaa10e2ad | ||
|
9f53738339 | ||
|
b9d9e74f2c | ||
|
4402a0578a | ||
|
815c636449 | ||
|
c840bbc970 | ||
|
b530db948e | ||
|
a9d18f0f57 | ||
|
811b5f8bc3 | ||
|
4ad633bae2 | ||
|
41e4124af9 | ||
|
84ab088b40 | ||
|
d6a56b882f | ||
|
624bf10ab5 | ||
|
90a2b482e6 | ||
|
aff4fccfc3 | ||
|
aa4119a849 | ||
|
a8c361c93b | ||
|
a3fac744c7 | ||
|
9eaa69874a | ||
|
28a3d95cda | ||
|
185e31d322 | ||
|
2ce9fa4b9c | ||
|
cfcfc8047a | ||
|
91c350e793 | ||
|
84a1fff302 | ||
|
e83b7edefc | ||
|
81d7bd8f41 | ||
|
31af49e507 | ||
|
45996fd20a | ||
|
f423edd938 | ||
|
d00c89946d | ||
|
198b3ae0f8 | ||
|
719404803b | ||
|
331ca6a800 | ||
|
e2480d40d1 | ||
|
4b860f1092 | ||
|
1fc0dcdc97 | ||
|
820cc69d0a | ||
|
20073246bb | ||
|
57e94fb838 | ||
|
e6c15eee45 | ||
|
f0c29afe21 | ||
|
4d6b6bcffc | ||
|
f8c6de0cdc | ||
|
9a60f7a793 | ||
|
844a8c7074 | ||
|
2d88a2cfb7 | ||
|
59de35e749 | ||
|
2844086772 | ||
|
2be027f92e | ||
|
34d9cb6778 | ||
|
6af6a35d9d | ||
|
6ec4e744c0 | ||
|
c87c354403 | ||
|
56fac55a39 | ||
|
de9c0eda36 | ||
|
c559fc8227 | ||
|
cfad5cb435 | ||
|
0b3b4da7d0 | ||
|
a0c8d348a0 | ||
|
08dcd1f680 | ||
|
91730d71ff | ||
|
5e3be83dbb | ||
|
c1b900aae9 | ||
|
094e822070 | ||
|
82540be931 | ||
|
36aff1e464 | ||
|
ba1176108a | ||
|
9b3e16cdd0 | ||
|
34b6bca006 | ||
|
6429be6efc | ||
|
ba16c53218 | ||
|
0d95f67f2e | ||
|
3ec59b36eb | ||
|
c7ecfe28e7 | ||
|
7afd274d0c | ||
|
71bec0824c | ||
|
4764e2c544 | ||
|
777c50a1ec | ||
|
d8687512b1 | ||
|
62cc65cafe | ||
|
0a99f8feed | ||
|
6dfcd491d0 | ||
|
2963229dfa | ||
|
7a168205eb | ||
|
9a8f8f8284 | ||
|
57f4d0523e | ||
|
45b11553f4 | ||
|
e5d0b27aaf | ||
|
a33ae10c56 | ||
|
017d97fd0e | ||
|
b167cd2427 | ||
|
fae3c860a1 | ||
|
e9677594ea | ||
|
7b9ff164cc | ||
|
978d93af88 | ||
|
31337826a3 | ||
|
fbcc07261d | ||
|
20b3af1cc2 | ||
|
6d47baee5d | ||
|
c6dcf9d006 | ||
|
f934b774a1 | ||
|
e6fdf530b8 | ||
|
1c4f125cb0 | ||
|
3f93b8baed | ||
|
637123f340 | ||
|
7243ea549d | ||
|
686bb056a4 | ||
|
1be16e3d8c | ||
|
69999f962a | ||
|
5a6fc3e5b7 | ||
|
7be57ff9f0 | ||
|
81a0206df8 | ||
|
80bde7b6b5 | ||
|
e349a44c60 | ||
|
fbefe55102 | ||
|
dee475cee1 | ||
|
9fd358f10c | ||
|
f74015b4e5 | ||
|
8c05053951 | ||
|
b0392be4bf | ||
|
c824086825 | ||
|
1a9644cef9 | ||
|
8723440d1d | ||
|
ea9b4dc82c | ||
|
2eab920935 | ||
|
087a6fea13 | ||
|
9c9113e225 | ||
|
8f008ac75d | ||
|
8a4f8e72df | ||
|
43222d5879 | ||
|
04a3bd0d34 | ||
|
af70e80816 | ||
|
22de37ad50 | ||
|
6cf4b888e1 | ||
|
6557751199 | ||
|
6e4925e6b6 | ||
|
3404cb1fc4 | ||
|
f3bddc4e4e | ||
|
3e68e4b418 | ||
|
edb2a83e71 | ||
|
2a4f8acd62 | ||
|
885b0d2ec5 | ||
|
66834cf324 | ||
|
9ead6a30f2 | ||
|
af20db4512 | ||
|
fee375f31f | ||
|
182fdd95c3 | ||
|
7f20184ebc | ||
|
b04914fb72 | ||
|
2ecb4fad72 | ||
|
ee4c2b36b8 | ||
|
00143f77d0 | ||
|
1a04c8c7bb | ||
|
6f4589b375 | ||
|
139a33c9fc | ||
|
a3f6e48eb6 | ||
|
a8dffdebd4 | ||
|
889695b6ba | ||
|
bf4c08bce1 | ||
|
9e68c9a214 | ||
|
7a6b742d12 | ||
|
2dbd2063f8 | ||
|
e8ed880e62 | ||
|
2c8f566231 | ||
|
eb254ef70b | ||
|
21ee7b1c86 | ||
|
5fdd949115 | ||
|
0a03ef4b6f | ||
|
71db4f0426 | ||
|
465840e1fb | ||
|
d17db47775 | ||
|
517bcd2b5d | ||
|
3eddbc7286 | ||
|
a1f319d5b6 | ||
|
31352f8a8a | ||
|
2878876064 | ||
|
7bf04d1526 | ||
|
a4d6908d55 | ||
|
a4618309ce | ||
|
3327568142 | ||
|
257dc6d173 | ||
|
753cf994b6 | ||
|
c353eab898 | ||
|
7226f6834e | ||
|
2e010909ac | ||
|
0d080cea83 | ||
|
6f4381df53 | ||
|
db8fb9a03a | ||
|
87ede6fa1b | ||
|
fd35d1b8a6 | ||
|
8fd8772a6f | ||
|
0f9ac3026d | ||
|
df0a0c9490 | ||
|
f2b9be6e70 | ||
|
39abda8743 | ||
|
dcb101224f | ||
|
e7e1dcf190 | ||
|
d466ac12ea | ||
|
1c7f53bbb2 | ||
|
0acd751e2d | ||
|
bab660ca7d | ||
|
109f68f7df | ||
|
819ec462b8 | ||
|
b6a32500c4 | ||
|
c61a311c0d | ||
|
5cae4e9f55 | ||
|
58ac815822 | ||
|
3ba374a29e | ||
|
7ce675e604 | ||
|
aa2ced96e0 | ||
|
8c59212ca4 | ||
|
4f4843a845 | ||
|
3a396a25dc | ||
|
18853defdd | ||
|
649965ae32 | ||
|
afe5027a39 | ||
|
04c4c6004e | ||
|
2693e35cae | ||
|
e38abef720 | ||
|
0eae28a663 | ||
|
b28b2ca266 | ||
|
296a2ad7e4 | ||
|
e9431b5445 | ||
|
4258ff1a68 | ||
|
65983b4288 | ||
|
ef12425bef | ||
|
62680bb356 | ||
|
94fea59e9d | ||
|
a4e1132048 | ||
|
58eaad703a | ||
|
6f272e13c5 | ||
|
9dedd121bf | ||
|
315cb6d001 | ||
|
48b0abc3a8 | ||
|
d8a3b9eb3a | ||
|
60e8c7afb2 | ||
|
e19c016c74 | ||
|
89b56ca5c2 | ||
|
ca83e1a26f | ||
|
7a04df47f2 | ||
|
8db72d027e | ||
|
6851909f90 | ||
|
7e902b7e29 | ||
|
f8e83f79c5 | ||
|
1d631b7280 | ||
|
615bf2a6f1 | ||
|
474be6058b | ||
|
fb3f6a46c1 | ||
|
b3bd47b4b2 | ||
|
28e315cd69 | ||
|
0e3d86579b | ||
|
a26a21d19a | ||
|
d8557547dd | ||
|
fe88fb7ed9 | ||
|
19d0c985be | ||
|
4a0fc4d699 | ||
|
931df1231a | ||
|
b51c6d4737 | ||
|
3893114c86 | ||
|
fcc29fc189 | ||
|
d7aea9608e | ||
|
4c5a58a5db | ||
|
c059ea0ea0 | ||
|
6a8ac21f80 | ||
|
08c5557026 | ||
|
cb2ec628df | ||
|
acdfbbeb86 | ||
|
8b72cbebde | ||
|
41529b6598 | ||
|
11b811820f | ||
|
39305aa47c | ||
|
caeac3851a | ||
|
04a3ece3e0 | ||
|
f1cdd02d4c | ||
|
c1920f31ca | ||
|
ecd8227de0 | ||
|
5768ee0f9e | ||
|
50a77ef7f0 | ||
|
75924edcf8 | ||
|
1cceae89cd | ||
f7eac586fb | |||
|
26ac992242 | ||
|
8c4a06d855 | ||
|
51a1561ae9 | ||
|
a15ab85557 | ||
|
9b2e810bdf | ||
|
b57ca6e4ac | ||
|
7930fd9ce8 | ||
|
9767e59e6c | ||
|
c12e6933f5 | ||
|
59d2871b59 | ||
|
4dd2496530 | ||
|
110e0d782f | ||
|
e955dce3dc | ||
|
101d57d093 | ||
|
ea371618da | ||
|
cab83ba840 | ||
|
8d20a83e09 | ||
|
c5e411f492 | ||
|
189306d24e | ||
|
f9e54331ba | ||
|
a97a1ae218 | ||
|
a6ff61d52e | ||
|
c710b6e06c | ||
|
072b15784f | ||
|
1d43e81be0 | ||
|
ddc997c81f | ||
|
988fc202e2 | ||
|
6aea00289c | ||
|
fbc2d2d726 | ||
|
1b0a5abd73 | ||
|
99c377b4e4 | ||
|
288eb06708 | ||
|
eb3d6a5333 | ||
|
37b56e09a3 | ||
|
0cccc60409 | ||
|
2282801172 | ||
|
f4e9f3654e | ||
|
40d442fde2 | ||
|
6ccb4b93b1 | ||
|
ddc23c6224 | ||
|
7216b8f804 | ||
|
bd6e60f56d | ||
|
5b9aeb2e5f | ||
|
0465e0ae3a | ||
|
3b68e44d9a | ||
|
d4ba94479b | ||
|
87ce545e15 | ||
|
f8ee6f8b31 | ||
|
f15fef90a9 | ||
|
53e79224fc | ||
|
2abb674c87 | ||
|
60aadd2a02 | ||
|
6ce1eeb4ae | ||
|
a70fdfaeba | ||
|
f17394d677 | ||
|
12ba2ad77e | ||
|
59eca253e1 | ||
|
4ace02f4c2 | ||
|
c753d2b7f4 | ||
|
d5fdc75c82 | ||
|
3c318d0dc7 | ||
|
5013fdaf79 | ||
|
06bf3ccfb7 | ||
|
dcb0f5dc3b | ||
|
18fb4b1ce1 | ||
|
45116128e8 | ||
|
7beebcd315 | ||
|
883347bc11 | ||
|
b5ef699523 | ||
|
2da25d67e1 | ||
|
6954772ece | ||
|
2fdeceda58 | ||
|
53cc8a0d6e | ||
|
10fd9ed896 | ||
|
bb7dbceb5c | ||
|
a439892d7a | ||
|
bd872d5dcf | ||
|
bdfedf249a | ||
|
4785b04aa1 | ||
|
8c052e43f1 | ||
|
85d094bbb4 | ||
|
97d7af7a23 | ||
|
0a64f197d9 | ||
|
af75e24c2e | ||
|
78e10d346a | ||
|
c574bcce88 | ||
|
ce90447531 | ||
|
f924344cc5 | ||
|
323b3a63d6 | ||
|
077b9201ef | ||
|
1f6612dfc4 | ||
|
c43ca39ec2 | ||
|
0407828027 | ||
|
a1cce36c1e | ||
|
4fe1adc383 | ||
|
2a78fe0f81 | ||
|
ea5886c77d | ||
|
e9053654a7 | ||
|
0be276482e | ||
|
7e55cbf798 | ||
|
f131f58124 | ||
|
5a4a6285bb | ||
|
e7ebb66200 | ||
|
5deca5a18f | ||
|
05033bb9d6 | ||
|
83097657d5 | ||
|
12e8861a1c | ||
|
22bf2b49c6 | ||
|
4a39c8cd53 | ||
|
c05beb74a9 | ||
|
cd89fa141b | ||
|
76f4dd34e0 | ||
|
da60dcbf2e | ||
|
368a581de9 | ||
|
24c5259005 | ||
|
2110739138 | ||
|
a4a487b0cc | ||
|
ba2939b1dc | ||
|
6071a0835a | ||
|
a272c019f9 | ||
|
dde86a4179 | ||
|
f8d57370d0 | ||
|
de315c97b1 | ||
|
1247f73754 | ||
|
50ba20fe1f | ||
|
b6856dcb99 | ||
|
54ec6a0ce2 | ||
|
dca7c5d1ad | ||
|
7473241438 | ||
|
be0c9ff705 | ||
|
3f644b6275 | ||
|
838220e4b3 | ||
|
18a5000718 | ||
|
21674b2879 | ||
|
12dec2563a | ||
|
603e4d66ac | ||
|
90fcb82a3e | ||
|
94a6844521 | ||
|
bdb3f1ae2f | ||
|
e3f1f7cd85 | ||
|
c0b4f4eb47 | ||
|
68ef3ac675 | ||
|
ee7476a0bf | ||
|
2cae26ee35 | ||
|
83aa3dbfa6 | ||
|
82ac8a1e76 | ||
|
c60696dbae | ||
|
75b0e3246a | ||
|
a74e82fbae | ||
|
8cf672104e | ||
|
8bdde8d7a0 | ||
|
c4f3f67537 | ||
|
ec23e37a4a | ||
|
00fbe50bbe | ||
|
2e48d6cf70 | ||
|
ec04517710 | ||
|
8cc0369d97 | ||
|
f7cdc05937 | ||
|
ea0afd0b4d | ||
|
62ba799d72 | ||
|
b6508c4bd1 | ||
|
853d01de68 | ||
|
311b65b225 | ||
|
b632b52b11 | ||
|
9630c2683c | ||
|
f53d5a0872 | ||
|
5917b5cf5c | ||
|
2a6d48bf9e | ||
|
0967c87a8f | ||
|
0ffee29a11 | ||
|
c75e98dc84 | ||
|
c7f7f2403d | ||
|
4533a197d5 | ||
|
1ed853f5d6 | ||
|
f83bbce3a3 | ||
|
4fccb92e07 | ||
|
ec596315bd | ||
|
9aee6674bb | ||
|
88a2ac92d5 | ||
|
3ccb3801f2 | ||
|
cc7fbabc96 | ||
|
28a9708ddb | ||
|
7d64de646a | ||
|
1e4691f02a | ||
|
4fe4fb0585 | ||
|
cf74248949 | ||
|
072f996af7 | ||
|
1f7c085527 | ||
|
a596969049 | ||
|
11badea962 | ||
|
d04ec15849 | ||
|
69d55cabd4 | ||
|
9baa944460 | ||
|
92767f5513 | ||
|
b320b1a3c2 | ||
|
35b9e9b4a5 | ||
|
21ce39aa9b | ||
|
ea80b2c8fc | ||
|
f501930728 | ||
|
8285953c1b | ||
|
6375829448 | ||
|
b0f0dc683d | ||
|
c2802d35bb | ||
|
2693d0eb27 | ||
|
6fed11896b | ||
|
178721a329 | ||
|
263f29a96a | ||
|
e99f967372 | ||
|
313efa33ae | ||
|
eaf6777a66 | ||
|
0f6fc48f85 | ||
|
1e13a7161a | ||
|
3ed0b24831 | ||
|
050ba0e0a0 | ||
|
418b3e5ee2 | ||
|
d896dedf9b | ||
|
00709017e2 | ||
|
b7d9b05952 | ||
|
f7f1224941 | ||
|
fd8d83b7c8 | ||
|
52fc0b896d | ||
|
ba045d6852 | ||
|
54bdcb4691 | ||
|
2a2666326b | ||
|
3bba5d55bf | ||
|
5d07d83e78 | ||
|
37f97bc013 | ||
|
6d31bbe2bf | ||
|
e2e1776a14 | ||
|
bd196e7efc | ||
|
dffe7b9072 | ||
|
2b326ebc84 | ||
|
f4ff6a673f | ||
|
cc915a25ed | ||
|
600870f22b | ||
|
04882e2f34 | ||
|
c6cf3da276 | ||
|
8a5c3782b8 | ||
|
beb17d8855 | ||
|
4ee717f7c4 | ||
|
e680196c59 | ||
|
ce92abfe47 | ||
|
50410aaeaa | ||
|
35c40bc376 | ||
|
aae644c507 | ||
|
ce830f8a71 | ||
|
d3d423a322 | ||
|
8b060a3902 | ||
|
faae900747 | ||
|
11662bf2b6 | ||
|
887e2637c0 | ||
|
958f05e4b4 | ||
|
9126a2e654 | ||
|
5070fae231 | ||
|
454f9d6319 | ||
|
59b6b32e6e | ||
|
6d9709e20d | ||
|
7a484959d5 | ||
|
78060f55e6 | ||
|
3fca19fbab | ||
|
b8700e0aa8 | ||
|
d66bc5cec2 | ||
|
fb28c6041a | ||
|
0f9d57e03a | ||
|
32377849da | ||
|
0975c487f0 | ||
|
d07ad63016 | ||
|
1a5a3cf253 | ||
|
6f6901180c | ||
|
9cc6297292 | ||
|
cf53bc2dd2 | ||
|
f4f4ea05e1 | ||
|
2b845e5a75 | ||
|
6fcbf11454 | ||
|
8a69147adf | ||
|
f8ceedea5c | ||
|
a4e4226578 | ||
|
e76fd6bd33 | ||
|
437bee418b | ||
|
31238de937 | ||
|
cb8c99c4f8 | ||
|
2fe81d0cb2 | ||
|
fb7d7ee7b4 | ||
|
d99fdcf526 | ||
|
e4d2234a04 | ||
|
bea919da6e | ||
|
2fb22cc116 | ||
|
d4b6542ce1 | ||
|
7d47ee732e | ||
|
6ceacd62f9 | ||
|
2ce6741731 | ||
|
2213eb3317 | ||
|
b947590082 | ||
|
20bcaa78f6 | ||
|
9834a36a17 | ||
|
90801f8815 | ||
|
4d1357e318 | ||
|
8d090cbdbb | ||
|
ec5b78d18b | ||
|
d33317eadb | ||
|
f8375a3ea2 | ||
|
5a02959d18 | ||
|
cc123bc657 | ||
|
4f6a0605bf | ||
|
b89700ed35 | ||
|
ca853fbe19 | ||
|
1ba2548fb2 | ||
|
1332be77a5 | ||
|
aa901ac4a2 | ||
|
0b80841c38 | ||
|
e370834c35 | ||
|
9b9cd698a5 | ||
|
a4b89e67c6 | ||
|
814db9d7c9 | ||
|
7f83231385 | ||
|
5247bb11f7 | ||
|
763544585a | ||
|
8a885dc61b | ||
|
f74b5a6b9b | ||
|
72e3238c3f | ||
|
f86c6851fc | ||
|
f6ffbe548c | ||
|
04c27573d6 | ||
|
9a23fb5863 | ||
|
90d364fc37 | ||
|
79d51581ba | ||
|
9507c49b18 | ||
|
87b07d6f2f | ||
|
64711e0d56 | ||
|
bf33b2f862 | ||
|
54315252c7 | ||
|
733eb127e9 | ||
|
2132efa981 | ||
|
da79674f84 | ||
|
ae36ed3903 | ||
|
cc4db8e4a9 | ||
|
f9f8fd37de | ||
|
193c0a52d9 | ||
|
f5139f8bf4 | ||
|
c0920bbf6a | ||
|
bcf65aa503 | ||
|
a866a758cc | ||
|
e7838c5f79 | ||
|
f21b91f1a7 | ||
|
edda32e6b4 | ||
|
639b0b8f50 | ||
|
18dd0d00a6 | ||
|
24fd19259d | ||
|
bdd555990b | ||
|
c762b7c91b | ||
|
45731bd022 | ||
|
492ba2a111 | ||
|
349465b168 | ||
|
98427ea92a | ||
|
a90edd5eb4 | ||
|
6fdaaf3d20 | ||
|
406f8363bc | ||
|
a7f334387c | ||
|
8e03a4cb93 | ||
|
1403260487 | ||
|
6831341ab4 | ||
|
0988af453c | ||
|
631457ffea | ||
|
bec1844954 | ||
|
e6d0a8ef66 | ||
|
70ab146cbb | ||
|
33b2e12886 | ||
|
1de29026d5 | ||
|
854af7a4bf | ||
|
f72c559824 | ||
|
321afd5fef | ||
|
91df2bea80 | ||
|
5de2946999 | ||
|
c650b752f1 | ||
|
c12f41ec6f | ||
|
2c6ec0c999 | ||
|
f1e563d8cf | ||
|
6de179eb7d | ||
|
584ffc6f52 | ||
|
2c99c1e06f | ||
|
f95a2f6d91 | ||
|
b31e358270 | ||
|
673835e5d9 | ||
|
f5bae208cc | ||
|
c25c31b1de | ||
|
343441d746 | ||
|
78fc4c8947 | ||
|
86165ceca5 | ||
|
8989353fab | ||
|
7e0524109e | ||
|
d88e694d06 | ||
|
44d50c2bd3 | ||
|
58548f5051 | ||
|
782eabc226 | ||
|
0ff3ae3cc6 | ||
|
8088c7dcd5 | ||
|
604d10d307 | ||
|
8dcc72ce9c | ||
|
d06bcd6dd3 | ||
|
b3c2ee56f9 | ||
|
435e98ceed | ||
|
7d21dfc938 | ||
|
2e1ba73926 | ||
|
e8a62ee3cf | ||
|
4e8eea8e78 | ||
|
d83baf8925 | ||
|
348570fd68 | ||
|
cf61562196 | ||
|
d02d7a95d1 | ||
|
ba07c26761 | ||
|
e56295851f | ||
|
f7d93dadeb | ||
|
5c87762f9e | ||
|
ea78514ff3 | ||
|
2616feb3df | ||
|
f4255b14e8 |
@ -4,16 +4,20 @@ root = true
|
|||||||
[{*.patch,syntax_test_*}]
|
[{*.patch,syntax_test_*}]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h}]
|
[{*.c,*.cpp,*.h,*.ino}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,Makefile}]
|
[{*.c,*.cpp,*.h,*.ino,Makefile}]
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[{*.py,*.conf,*.sublime-project}]
|
[{*.py}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[{*.conf,*.sublime-project}]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -17,3 +17,5 @@
|
|||||||
*.png binary
|
*.png binary
|
||||||
*.jpg binary
|
*.jpg binary
|
||||||
*.fon binary
|
*.fon binary
|
||||||
|
*.bin binary
|
||||||
|
*.woff binary
|
||||||
|
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,43 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Report a bug in Marlin
|
|
||||||
title: "[BUG] (short description)"
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md
|
|
||||||
|
|
||||||
Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use one of the support links at https://github.com/MarlinFirmware/Marlin/issues/new/choose
|
|
||||||
|
|
||||||
Before filing an issue be sure to test the "bugfix" branches to see whether the issue has been resolved.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Bug Description
|
|
||||||
|
|
||||||
<!-- Description of the bug -->
|
|
||||||
|
|
||||||
### My Configurations
|
|
||||||
|
|
||||||
**Required:** Please include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files.
|
|
||||||
|
|
||||||
### Steps to Reproduce
|
|
||||||
|
|
||||||
<!-- Please describe the steps needed to reproduce the issue -->
|
|
||||||
|
|
||||||
1. [First Step]
|
|
||||||
2. [Second Step]
|
|
||||||
3. [and so on...]
|
|
||||||
|
|
||||||
**Expected behavior:** [What you expect to happen]
|
|
||||||
|
|
||||||
**Actual behavior:** [What actually happens]
|
|
||||||
|
|
||||||
#### Additional Information
|
|
||||||
|
|
||||||
* Provide pictures or links to videos that clearly demonstrate the issue.
|
|
||||||
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
|
17
.github/ISSUE_TEMPLATE/config.yml
vendored
17
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1,17 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Marlin Documentation
|
|
||||||
url: http://marlinfw.org/
|
|
||||||
about: Lots of documentation on installing and using Marlin.
|
|
||||||
- name: MarlinFirmware Facebook group
|
|
||||||
url: https://www.facebook.com/groups/1049718498464482
|
|
||||||
about: Please ask and answer questions here.
|
|
||||||
- name: Marlin on Discord
|
|
||||||
url: https://discord.gg/n5NJ59y
|
|
||||||
about: Join the Discord server for support and discussion.
|
|
||||||
- name: Marlin Discussion Forum
|
|
||||||
url: http://forums.reprap.org/list.php?415
|
|
||||||
about: A searchable web forum hosted by RepRap dot org.
|
|
||||||
- name: Marlin Videos on YouTube
|
|
||||||
url: https://www.youtube.com/results?search_query=marlin+firmware
|
|
||||||
about: Tutorials and more from Marlin users all around the world. Great for new users!
|
|
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
35
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,35 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Request a Feature
|
|
||||||
title: "[FR] (feature request title)"
|
|
||||||
labels: 'T: Feature Request'
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md
|
|
||||||
|
|
||||||
Do you want to ask a question? Are you looking for support? Please don't post here. Instead please use one of the support links at https://github.com/MarlinFirmware/Marlin/issues/new/choose
|
|
||||||
|
|
||||||
Before filing an issue be sure to test the "bugfix" branches to see whether the issue has been resolved.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
<!-- Description of the requested feature -->
|
|
||||||
|
|
||||||
### Feature Workflow
|
|
||||||
|
|
||||||
<!-- Please describe the feature's behavior, user interaction, etc. -->
|
|
||||||
|
|
||||||
1. [First Action]
|
|
||||||
2. [Second Action]
|
|
||||||
3. [and so on...]
|
|
||||||
|
|
||||||
#### Additional Information
|
|
||||||
|
|
||||||
* Provide pictures or links that demonstrate a similar feature or concept.
|
|
||||||
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
|
17
.github/contributing.md
vendored
17
.github/contributing.md
vendored
@ -34,8 +34,11 @@ This project and everyone participating in it is governed by the [Marlin Code of
|
|||||||
|
|
||||||
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
||||||
|
|
||||||
* [Marlin RepRap forum](https://reprap.org/forum/list.php?415)
|
- [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation
|
||||||
* [MarlinFirmware on Facebook](https://www.facebook.com/groups/1049718498464482/)
|
- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/)
|
||||||
|
- RepRap.org [Marlin Forum](https://forums.reprap.org/list.php?415)
|
||||||
|
- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/)
|
||||||
|
- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube
|
||||||
|
|
||||||
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
||||||
|
|
||||||
@ -50,13 +53,13 @@ If chat is more your speed, you can join the MarlinFirmware Discord server:
|
|||||||
|
|
||||||
This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
|
This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
|
||||||
|
|
||||||
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](issue_template.md), the information it asks for helps us resolve issues faster.
|
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
|
||||||
|
|
||||||
> **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
> **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Bug Report?
|
#### How Do I Submit A (Good) Bug Report?
|
||||||
|
|
||||||
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](issue_template.md).
|
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](ISSUE_TEMPLATE/bug_report.yml).
|
||||||
|
|
||||||
Explain the problem and include additional details to help maintainers reproduce the problem:
|
Explain the problem and include additional details to help maintainers reproduce the problem:
|
||||||
|
|
||||||
@ -88,12 +91,12 @@ Include details about your configuration and environment:
|
|||||||
|
|
||||||
This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
|
This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
|
||||||
|
|
||||||
Before creating a suggestion, please check [this list](#before-submitting-a-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](issue_template.md), including the steps that you imagine you would take if the feature you're requesting existed.
|
Before creating a suggestion, please check [this list](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-feature-request). Fill in [the template](ISSUE_TEMPLATE/feature_request.yml), including the steps that you imagine you would take if the feature you're requesting existed.
|
||||||
|
|
||||||
#### Before Submitting a Feature Request
|
#### Before Submitting a Feature Request
|
||||||
|
|
||||||
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
||||||
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aissue)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Feature Request?
|
#### How Do I Submit A (Good) Feature Request?
|
||||||
|
|
||||||
@ -116,7 +119,7 @@ Unsure where to begin contributing to Marlin? You can start by looking through t
|
|||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
|
|
||||||
Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x` and/or `bugfix-2.0.x`) and never to release branches (e.g., `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
Pull Requests should always be targeted to working branches (e.g., `bugfix-2.1.x` and/or `bugfix-1.1.x`) and never to release branches (e.g., `2.0.x` and/or `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
||||||
|
|
||||||
* Fill in [the required template](pull_request_template.md).
|
* Fill in [the required template](pull_request_template.md).
|
||||||
* Don't include issue numbers in the PR title.
|
* Don't include issue numbers in the PR title.
|
||||||
|
11
.github/issue_template.md
vendored
11
.github/issue_template.md
vendored
@ -1,11 +0,0 @@
|
|||||||
# NO SUPPORT REQUESTS PLEASE
|
|
||||||
|
|
||||||
Do you want to ask a question? Are you looking for support? Please don't post here. Support Requests posted here will be automatically closed!
|
|
||||||
|
|
||||||
Instead use one of the following options:
|
|
||||||
|
|
||||||
- The Marlin Firmware forum at https://reprap.org/forum/list.php?415
|
|
||||||
- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/
|
|
||||||
- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y.
|
|
||||||
|
|
||||||
Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed.
|
|
40
.github/lock.yml
vendored
40
.github/lock.yml
vendored
@ -1,40 +0,0 @@
|
|||||||
#
|
|
||||||
# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
|
|
||||||
#
|
|
||||||
|
|
||||||
# Number of days of inactivity before a closed issue or pull request is locked
|
|
||||||
daysUntilLock: 60
|
|
||||||
|
|
||||||
# Skip issues and pull requests created before a given timestamp. Timestamp must
|
|
||||||
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
|
|
||||||
skipCreatedBefore: false
|
|
||||||
|
|
||||||
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
|
|
||||||
exemptLabels: [ 'no-locking' ]
|
|
||||||
|
|
||||||
# Label to add before locking, such as `outdated`. Set to `false` to disable
|
|
||||||
lockLabel: false
|
|
||||||
|
|
||||||
# Comment to post before locking. Set to `false` to disable
|
|
||||||
lockComment: >
|
|
||||||
This thread has been automatically locked since there has not been
|
|
||||||
any recent activity after it was closed. Please open a new issue for
|
|
||||||
related bugs.
|
|
||||||
|
|
||||||
# Assign `resolved` as the reason for locking. Set to `false` to disable
|
|
||||||
setLockReason: true
|
|
||||||
|
|
||||||
# Limit to only `issues` or `pulls`
|
|
||||||
# only: issues
|
|
||||||
|
|
||||||
# Optionally, specify configuration settings just for `issues` or `pulls`
|
|
||||||
# issues:
|
|
||||||
# exemptLabels:
|
|
||||||
# - help-wanted
|
|
||||||
# lockLabel: outdated
|
|
||||||
|
|
||||||
# pulls:
|
|
||||||
# daysUntilLock: 30
|
|
||||||
|
|
||||||
# Repository to extend settings from
|
|
||||||
# _extends: repo
|
|
22
.github/pull_request_template.md
vendored
22
.github/pull_request_template.md
vendored
@ -1,23 +1,33 @@
|
|||||||
### Requirements
|
<!--
|
||||||
|
|
||||||
* Filling out this template is required. Pull Requests without a clear description may be closed at the maintainers' discretion.
|
Submitting a Pull Request
|
||||||
|
|
||||||
|
- Please fill out all sections of this form. You can delete the helpful comments.
|
||||||
|
- Pull Requests without clear information will take longer and may even be rejected.
|
||||||
|
- We get a high volume of submissions so please be patient during review.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
We must be able to understand your proposed change from this description. If we can't understand what the code will do from this description, the Pull Request may be closed at the maintainers' discretion. Keep in mind that the maintainer reviewing this PR may not be familiar with or have worked with the code recently, so please walk us through the concepts.
|
Clearly describe the submitted changes with lots of details. Include images where helpful. Initial reviewers may not be familiar with the subject, so be as thorough as possible. You can use MarkDown syntax to improve readability with bullet lists, code blocks, and so on. PREVIEW and fix up formatting before submitting.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
<!-- Does this PR require a specific board, LCD, etc.? -->
|
||||||
|
|
||||||
### Benefits
|
### Benefits
|
||||||
|
|
||||||
<!-- What does this fix or improve? -->
|
<!-- What does this PR fix or improve? -->
|
||||||
|
|
||||||
### Configurations
|
### Configurations
|
||||||
|
|
||||||
<!-- Attach any Configuration.h, Configuration_adv.h, or platformio.ini files needed to compile/test your Pull Request. -->
|
<!-- Attach Configurations ZIP and any other files needed to test this PR. -->
|
||||||
|
|
||||||
### Related Issues
|
### Related Issues
|
||||||
|
|
||||||
<!-- Whether this fixes a bug or fulfills a feature request, please list any related Issues here. -->
|
<!-- Does this PR fix a bug or fulfill a Feature Request? Link related Issues here. -->
|
||||||
|
35
.github/workflows/bump-date.yml
vendored
35
.github/workflows/bump-date.yml
vendored
@ -1,35 +0,0 @@
|
|||||||
#
|
|
||||||
# bump-date.yml
|
|
||||||
# Bump the distribution date once per day
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Bump Distribution Date
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
bump_date:
|
|
||||||
name: Bump Distribution Date
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Check out bugfix-2.0.x
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
ref: bugfix-2.0.x
|
|
||||||
|
|
||||||
- name: Bump Distribution Date
|
|
||||||
run: |
|
|
||||||
# Inline Bump Script
|
|
||||||
DIST=$( date +"%Y-%m-%d" )
|
|
||||||
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \
|
|
||||||
git config user.name "${GITHUB_ACTOR}" && \
|
|
||||||
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
|
|
||||||
git add . && \
|
|
||||||
git commit -m "[cron] Bump distribution date ($DIST)" && \
|
|
||||||
git push
|
|
33
.github/workflows/check-pr.yml
vendored
33
.github/workflows/check-pr.yml
vendored
@ -1,33 +0,0 @@
|
|||||||
#
|
|
||||||
# check-pr.yml
|
|
||||||
# Close PRs directed at release branches
|
|
||||||
#
|
|
||||||
|
|
||||||
name: PR Bad Target
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- 1.0.x
|
|
||||||
- 1.1.x
|
|
||||||
- 2.0.x
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
bad_target:
|
|
||||||
name: PR Bad Target
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: peter-evans/close-pull@v1
|
|
||||||
with:
|
|
||||||
delete-branch: false
|
|
||||||
comment: >
|
|
||||||
Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases.
|
|
||||||
|
|
||||||
Please redo this PR starting with the `bugfix-2.0.x` branch and be careful to target `bugfix-2.0.x` when resubmitting the PR.
|
|
||||||
|
|
||||||
It may help to set your fork's default branch to `bugfix-2.0.x`.
|
|
||||||
|
|
||||||
See [this page](http://marlinfw.org/docs/development/getting_started_pull_requests.html) for full instructions.
|
|
27
.github/workflows/close-stale.yml
vendored
27
.github/workflows/close-stale.yml
vendored
@ -1,27 +0,0 @@
|
|||||||
#
|
|
||||||
# close-stale.yml
|
|
||||||
# Close open issues after a period of inactivity
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Close Stale Issues
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "22 1 * * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
stale:
|
|
||||||
name: Close Stale Issues
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/stale@v3
|
|
||||||
with:
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
stale-issue-message: 'This issue has had no activity in the last 30 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 7 days.'
|
|
||||||
days-before-stale: 30
|
|
||||||
days-before-close: 7
|
|
||||||
stale-issue-label: 'stale-closing-soon'
|
|
||||||
exempt-issue-labels: 'T: Feature Request'
|
|
32
.github/workflows/lock-closed.yml
vendored
32
.github/workflows/lock-closed.yml
vendored
@ -1,32 +0,0 @@
|
|||||||
#
|
|
||||||
# lock-closed.yml
|
|
||||||
# Lock closed issues after a period of inactivity
|
|
||||||
#
|
|
||||||
|
|
||||||
name: Lock Closed Issues
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 1/13 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock:
|
|
||||||
name: Lock Closed Issues
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: dessant/lock-threads@v2
|
|
||||||
with:
|
|
||||||
github-token: ${{ github.token }}
|
|
||||||
process-only: 'issues'
|
|
||||||
issue-lock-inactive-days: '60'
|
|
||||||
issue-exclude-created-before: ''
|
|
||||||
issue-exclude-labels: 'no-locking'
|
|
||||||
issue-lock-labels: ''
|
|
||||||
issue-lock-comment: >
|
|
||||||
This issue has been automatically locked since there
|
|
||||||
has not been any recent activity after it was closed.
|
|
||||||
Please open a new issue for related bugs.
|
|
||||||
issue-lock-reason: ''
|
|
123
.github/workflows/test-builds.yml
vendored
123
.github/workflows/test-builds.yml
vendored
@ -1,123 +0,0 @@
|
|||||||
#
|
|
||||||
# test-builds.yml
|
|
||||||
# Do test builds to catch compile errors
|
|
||||||
#
|
|
||||||
|
|
||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.0.x
|
|
||||||
paths-ignore:
|
|
||||||
- config/**
|
|
||||||
- data/**
|
|
||||||
- docs/**
|
|
||||||
- '**/*.md'
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- bugfix-2.0.x
|
|
||||||
paths-ignore:
|
|
||||||
- config/**
|
|
||||||
- data/**
|
|
||||||
- docs/**
|
|
||||||
- '**/*.md'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test_builds:
|
|
||||||
name: Run All Tests
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
test-platform:
|
|
||||||
# Base Environments
|
|
||||||
|
|
||||||
- DUE
|
|
||||||
- esp32
|
|
||||||
- linux_native
|
|
||||||
- mega2560
|
|
||||||
- teensy31
|
|
||||||
- teensy35
|
|
||||||
- teensy41
|
|
||||||
- SAMD51_grandcentral_m4
|
|
||||||
|
|
||||||
# Extended AVR Environments
|
|
||||||
|
|
||||||
- FYSETC_F6_13
|
|
||||||
- mega1280
|
|
||||||
- rambo
|
|
||||||
- sanguino1284p
|
|
||||||
- sanguino644p
|
|
||||||
|
|
||||||
# Extended STM32 Environments
|
|
||||||
|
|
||||||
- STM32F103RC_btt
|
|
||||||
- STM32F103RC_btt_USB
|
|
||||||
- STM32F103RE_btt
|
|
||||||
- STM32F103RE_btt_USB
|
|
||||||
- STM32F103RC_fysetc
|
|
||||||
- STM32F103RC_meeb
|
|
||||||
- jgaurora_a5s_a1
|
|
||||||
- STM32F103VE_longer
|
|
||||||
- STM32F407VE_black
|
|
||||||
- STM32F401VE_STEVAL
|
|
||||||
- BIGTREE_BTT002
|
|
||||||
- BIGTREE_SKR_PRO
|
|
||||||
- BIGTREE_GTR_V1_0
|
|
||||||
- mks_robin
|
|
||||||
- mks_robin_stm32
|
|
||||||
- ARMED
|
|
||||||
- FYSETC_S6
|
|
||||||
- STM32F070CB_malyan
|
|
||||||
- STM32F070RB_malyan
|
|
||||||
- malyan_M300
|
|
||||||
- mks_robin_lite
|
|
||||||
- FLYF407ZG
|
|
||||||
- rumba32
|
|
||||||
- mks_robin_pro
|
|
||||||
- STM32F103RET6_creality
|
|
||||||
- LERDGEX
|
|
||||||
- mks_robin_nano35
|
|
||||||
|
|
||||||
# Put lengthy tests last
|
|
||||||
|
|
||||||
- LPC1768
|
|
||||||
- LPC1769
|
|
||||||
|
|
||||||
# STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working.
|
|
||||||
|
|
||||||
#- STM32F4
|
|
||||||
#- STM32F7
|
|
||||||
|
|
||||||
# Non-working environment tests
|
|
||||||
#- at90usb1286_cdc
|
|
||||||
#- at90usb1286_dfu
|
|
||||||
#- STM32F103CB_malyan
|
|
||||||
#- mks_robin_mini
|
|
||||||
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Select Python 3.7
|
|
||||||
uses: actions/setup-python@v1
|
|
||||||
with:
|
|
||||||
python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax.
|
|
||||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
|
||||||
|
|
||||||
- name: Install PlatformIO
|
|
||||||
run: |
|
|
||||||
pip install -U https://github.com/platformio/platformio-core/archive/develop.zip
|
|
||||||
platformio update
|
|
||||||
|
|
||||||
- name: Check out the PR
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Run ${{ matrix.test-platform }} Tests
|
|
||||||
run: |
|
|
||||||
# Inline tests script
|
|
||||||
chmod +x buildroot/bin/*
|
|
||||||
chmod +x buildroot/tests/*
|
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH}
|
|
||||||
run_tests . ${{ matrix.test-platform }}
|
|
22
.github/workflows/unlock-reopened.yml
vendored
22
.github/workflows/unlock-reopened.yml
vendored
@ -1,22 +0,0 @@
|
|||||||
#
|
|
||||||
# unlock-reopened.yml
|
|
||||||
# Unlock an issue whenever it is re-opened
|
|
||||||
#
|
|
||||||
|
|
||||||
name: "Unlock reopened issue"
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [reopened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
unlock:
|
|
||||||
name: Unlock Reopened
|
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: OSDKDev/unlock-issues@v1.1
|
|
||||||
with:
|
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
52
.gitignore
vendored
52
.gitignore
vendored
@ -19,15 +19,19 @@
|
|||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
# Our automatic versioning scheme generates the following file
|
# Generated files
|
||||||
# NEVER put it in the repository
|
|
||||||
_Version.h
|
_Version.h
|
||||||
|
bdf2u8g
|
||||||
|
marlin_config.json
|
||||||
|
mczip.h
|
||||||
|
*.gen
|
||||||
|
*.sublime-workspace
|
||||||
|
|
||||||
#
|
#
|
||||||
# OS
|
# OS
|
||||||
#
|
#
|
||||||
applet/
|
applet/
|
||||||
*.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc
|
# Misc
|
||||||
@ -37,7 +41,6 @@ applet/
|
|||||||
*.rej
|
*.rej
|
||||||
*.bak
|
*.bak
|
||||||
*.idea
|
*.idea
|
||||||
*.s
|
|
||||||
*.i
|
*.i
|
||||||
*.ii
|
*.ii
|
||||||
*.swp
|
*.swp
|
||||||
@ -77,7 +80,6 @@ tags
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# C
|
# C
|
||||||
#
|
#
|
||||||
@ -123,29 +125,6 @@ tags
|
|||||||
.gcc-flags.json
|
.gcc-flags.json
|
||||||
/lib/
|
/lib/
|
||||||
|
|
||||||
# Workaround for Deviot+platformio quirks
|
|
||||||
Marlin/lib
|
|
||||||
Marlin/platformio.ini
|
|
||||||
Marlin/*/platformio.ini
|
|
||||||
Marlin/*/*/platformio.ini
|
|
||||||
Marlin/*/*/*/platformio.ini
|
|
||||||
Marlin/*/*/*/*/platformio.ini
|
|
||||||
Marlin/.travis.yml
|
|
||||||
Marlin/*/.travis.yml
|
|
||||||
Marlin/*/*/.travis.yml
|
|
||||||
Marlin/*/*/*/.travis.yml
|
|
||||||
Marlin/*/*/*/*/.travis.yml
|
|
||||||
Marlin/.gitignore
|
|
||||||
Marlin/*/.gitignore
|
|
||||||
Marlin/*/*/.gitignore
|
|
||||||
Marlin/*/*/*/.gitignore
|
|
||||||
Marlin/*/*/*/*/.gitignore
|
|
||||||
Marlin/readme.txt
|
|
||||||
Marlin/*/readme.txt
|
|
||||||
Marlin/*/*/readme.txt
|
|
||||||
Marlin/*/*/*/readme.txt
|
|
||||||
Marlin/*/*/*/*/readme.txt
|
|
||||||
|
|
||||||
# Secure Credentials
|
# Secure Credentials
|
||||||
Configuration_Secure.h
|
Configuration_Secure.h
|
||||||
|
|
||||||
@ -161,16 +140,20 @@ __vm/
|
|||||||
vc-fileutils.settings
|
vc-fileutils.settings
|
||||||
|
|
||||||
# Visual Studio Code
|
# Visual Studio Code
|
||||||
.vscode
|
.vscode/*
|
||||||
.vscode/.browse.c_cpp.db*
|
!.vscode/extensions.json
|
||||||
.vscode/c_cpp_properties.json
|
|
||||||
.vscode/launch.json
|
#Simulation
|
||||||
.vscode/*.db
|
imgui.ini
|
||||||
|
eeprom.dat
|
||||||
|
spi_flash.bin
|
||||||
|
fs.img
|
||||||
|
|
||||||
#cmake
|
#cmake
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
src/CMakeLists.txt
|
src/CMakeLists.txt
|
||||||
CMakeListsPrivate.txt
|
CMakeListsPrivate.txt
|
||||||
|
build/
|
||||||
|
|
||||||
# CLion
|
# CLion
|
||||||
cmake-build-*
|
cmake-build-*
|
||||||
@ -184,3 +167,6 @@ cmake-build-*
|
|||||||
|
|
||||||
# Python
|
# Python
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
|
# IOLogger logs
|
||||||
|
*_log.csv
|
||||||
|
11
.vscode/extensions.json
vendored
Normal file
11
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||||
|
// for the documentation about the extensions.json format
|
||||||
|
"recommendations": [
|
||||||
|
"marlinfirmware.auto-build",
|
||||||
|
"platformio.platformio-ide"
|
||||||
|
],
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
"ms-vscode.cpptools-extension-pack"
|
||||||
|
]
|
||||||
|
}
|
52
Makefile
Normal file
52
Makefile
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
help:
|
||||||
|
@echo "Tasks for local development:"
|
||||||
|
@echo "* tests-single-ci: Run a single test from inside the CI"
|
||||||
|
@echo "* tests-single-local: Run a single test locally"
|
||||||
|
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
|
||||||
|
@echo "* tests-all-local: Run all tests locally"
|
||||||
|
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
|
||||||
|
@echo "* setup-local-docker: Setup local docker-compose"
|
||||||
|
@echo ""
|
||||||
|
@echo "Options for testing:"
|
||||||
|
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||||
|
@echo " test. If you set it to ALL it will run all "
|
||||||
|
@echo " tests, but some of them are broken: use "
|
||||||
|
@echo " tests-all-* instead to run only the ones that "
|
||||||
|
@echo " run on GitHub CI"
|
||||||
|
@echo " ONLY_TEST Limit tests to only those that contain this, or"
|
||||||
|
@echo " the index of the test (1-based)"
|
||||||
|
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
||||||
|
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
||||||
|
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
||||||
|
.PHONY: help
|
||||||
|
|
||||||
|
tests-single-ci:
|
||||||
|
export GIT_RESET_HARD=true
|
||||||
|
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
|
||||||
|
.PHONY: tests-single-ci
|
||||||
|
|
||||||
|
tests-single-local:
|
||||||
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
||||||
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
|
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
||||||
|
.PHONY: tests-single-local
|
||||||
|
|
||||||
|
tests-single-local-docker:
|
||||||
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
||||||
|
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||||
|
.PHONY: tests-single-local-docker
|
||||||
|
|
||||||
|
tests-all-local:
|
||||||
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
|
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
||||||
|
.PHONY: tests-all-local
|
||||||
|
|
||||||
|
tests-all-local-docker:
|
||||||
|
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
||||||
|
.PHONY: tests-all-local-docker
|
||||||
|
|
||||||
|
setup-local-docker:
|
||||||
|
docker-compose build
|
||||||
|
.PHONY: setup-local-docker
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
309
Marlin/Makefile
309
Marlin/Makefile
@ -22,8 +22,10 @@
|
|||||||
# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file
|
# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file
|
||||||
# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*).
|
# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*).
|
||||||
#
|
#
|
||||||
# 3. Set the line containing "MCU" to match your board's processor.
|
# 3. Set the line containing "MCU" to match your board's processor. Set
|
||||||
# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth
|
# "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the
|
||||||
|
# following command to get a list of correspondences: `avrdude -c alf -p x`
|
||||||
|
# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth
|
||||||
# or Diecimila have the atmega168. If you're using a LilyPad Arduino,
|
# or Diecimila have the atmega168. If you're using a LilyPad Arduino,
|
||||||
# change F_CPU to 8000000. If you are using Gen7 electronics, you
|
# change F_CPU to 8000000. If you are using Gen7 electronics, you
|
||||||
# probably need to use 20000000. Either way, you must regenerate
|
# probably need to use 20000000. Either way, you must regenerate
|
||||||
@ -34,18 +36,18 @@
|
|||||||
# 5. Type "make upload", reset your Arduino board, and press enter to
|
# 5. Type "make upload", reset your Arduino board, and press enter to
|
||||||
# upload your program to the Arduino board.
|
# upload your program to the Arduino board.
|
||||||
#
|
#
|
||||||
# Note that all settings at the top of this file can be overriden from
|
# Note that all settings at the top of this file can be overridden from
|
||||||
# the command line with, for example, "make HARDWARE_MOTHERBOARD=71"
|
# the command line with, for example, "make HARDWARE_MOTHERBOARD=71"
|
||||||
#
|
#
|
||||||
# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use...
|
# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use...
|
||||||
#
|
#
|
||||||
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
||||||
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino
|
# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino
|
||||||
#
|
#
|
||||||
# To compile and upload simply add "upload" to the end of the line...
|
# To compile and upload simply add "upload" to the end of the line...
|
||||||
#
|
#
|
||||||
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \
|
||||||
# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino upload
|
# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload
|
||||||
#
|
#
|
||||||
# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or
|
# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or
|
||||||
# start upload manually (using stk500) like so:
|
# start upload manually (using stk500) like so:
|
||||||
@ -57,7 +59,26 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
# This defines the board to compile for (see boards.h for your board's ID)
|
# This defines the board to compile for (see boards.h for your board's ID)
|
||||||
HARDWARE_MOTHERBOARD ?= 11
|
HARDWARE_MOTHERBOARD ?= 1020
|
||||||
|
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
# Windows
|
||||||
|
ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
else
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
# Linux
|
||||||
|
ARDUINO_INSTALL_DIR ?= /usr/share/arduino
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
# Darwin (macOS)
|
||||||
|
ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java
|
||||||
|
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino
|
||||||
|
AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# Arduino source install directory, and version number
|
# Arduino source install directory, and version number
|
||||||
# On most linuxes this will be /usr/share/arduino
|
# On most linuxes this will be /usr/share/arduino
|
||||||
@ -67,32 +88,38 @@ ARDUINO_VERSION ?= 106
|
|||||||
# The installed Libraries are in the User folder
|
# The installed Libraries are in the User folder
|
||||||
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
||||||
|
|
||||||
# You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin)
|
# You can optionally set a path to the avr-gcc tools.
|
||||||
|
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
|
||||||
AVR_TOOLS_PATH ?=
|
AVR_TOOLS_PATH ?=
|
||||||
|
|
||||||
# Programmer configuration
|
# Programmer configuration
|
||||||
UPLOAD_RATE ?= 57600
|
UPLOAD_RATE ?= 57600
|
||||||
AVRDUDE_PROGRAMMER ?= arduino
|
AVRDUDE_PROGRAMMER ?= arduino
|
||||||
# on most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1
|
# On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1
|
||||||
UPLOAD_PORT ?= /dev/ttyUSB0
|
UPLOAD_PORT ?= /dev/ttyUSB0
|
||||||
|
|
||||||
#Directory used to build files in, contains all the build files, from object files to the final hex file
|
# Directory used to build files in, contains all the build files, from object
|
||||||
#on linux it is best to put an absolute path like /home/username/tmp .
|
# files to the final hex file on linux it is best to put an absolute path
|
||||||
|
# like /home/username/tmp .
|
||||||
BUILD_DIR ?= applet
|
BUILD_DIR ?= applet
|
||||||
|
|
||||||
# This defines whether Liquid_TWI2 support will be built
|
# This defines whether Liquid_TWI2 support will be built
|
||||||
LIQUID_TWI2 ?= 0
|
LIQUID_TWI2 ?= 0
|
||||||
|
|
||||||
# this defines if Wire is needed
|
# This defines if Wire is needed
|
||||||
WIRE ?= 0
|
WIRE ?= 0
|
||||||
|
|
||||||
# this defines if U8GLIB is needed (may require RELOC_WORKAROUND)
|
# This defines if Tone is needed (i.e., SPEAKER is defined in Configuration.h)
|
||||||
U8GLIB ?= 1
|
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory.
|
||||||
|
TONE ?= 1
|
||||||
|
|
||||||
# this defines whether to include the Trinamic TMCStepper library
|
# This defines if U8GLIB is needed (may require RELOC_WORKAROUND)
|
||||||
TMC ?= 1
|
U8GLIB ?= 0
|
||||||
|
|
||||||
# this defines whether to include the AdaFruit NeoPixel library
|
# This defines whether to include the Trinamic TMCStepper library
|
||||||
|
TMC ?= 0
|
||||||
|
|
||||||
|
# This defines whether to include the AdaFruit NeoPixel library
|
||||||
NEOPIXEL ?= 0
|
NEOPIXEL ?= 0
|
||||||
|
|
||||||
############
|
############
|
||||||
@ -105,7 +132,7 @@ CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ )
|
|||||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
||||||
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
||||||
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
||||||
@echo This version of GCC is likely broken. Enabling relocation workaround.
|
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
||||||
RELOC_WORKAROUND = 1
|
RELOC_WORKAROUND = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -180,11 +207,11 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1105)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
|
||||||
# MKS BASE v1.0
|
# MKS BASE v1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
|
||||||
# MKS v1.4 with A4982 stepper drivers
|
# MKS BASE v1.4 with Allegro A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
|
||||||
# MKS v1.5 with Allegro A4982 stepper drivers
|
# MKS BASE v1.5 with Allegro A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
|
||||||
# MKS v1.6 with Allegro A4982 stepper drivers
|
# MKS BASE v1.6 with Allegro A4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
|
||||||
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
|
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
||||||
@ -192,92 +219,110 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
||||||
# MKS GEN L
|
# MKS GEN L
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
||||||
# zrib V2.0 control board (Chinese knock off RAMPS replica)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
|
||||||
# BigTreeTech or BIQU KFB2.0
|
# BigTreeTech or BIQU KFB2.0
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
||||||
|
# zrib V2.0 (Chinese RAMPS replica)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
||||||
# Felix 2.0+ Electronics Board (RAMPS like)
|
# zrib V5.2 (Chinese RAMPS replica)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
||||||
# Invent-A-Part RigidBoard
|
# Felix 2.0+ Electronics Board (RAMPS like)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
||||||
# Invent-A-Part RigidBoard V2
|
# Invent-A-Part RigidBoard
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
||||||
# Sainsmart 2-in-1 board
|
# Invent-A-Part RigidBoard V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
||||||
# Ultimaker
|
# Sainsmart 2-in-1 board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
||||||
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
# Ultimaker
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
||||||
MCU ?= atmega1280
|
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
||||||
|
|
||||||
# Azteeg X3
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
||||||
# Azteeg X3 Pro
|
MCU ?= atmega1280
|
||||||
|
PROG_MCU ?= m1280
|
||||||
|
# Azteeg X3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
||||||
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
# Azteeg X3 Pro
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
||||||
# Rumba
|
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
||||||
# Raise3D Rumba
|
# Rumba
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
||||||
# Rapide Lite RL200 Rumba
|
# Raise3D N series Rumba derivative
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
||||||
# Formbot T-Rex 2 Plus
|
# Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
||||||
# Formbot T-Rex 3
|
# Formbot T-Rex 2 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
||||||
# Formbot Raptor
|
# Formbot T-Rex 3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
||||||
# Formbot Raptor 2
|
# Formbot Raptor
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
||||||
# bq ZUM Mega 3D
|
# Formbot Raptor 2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
||||||
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
|
# bq ZUM Mega 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
||||||
# TriGorilla Anycubic version 1.3 based on RAMPS EFB
|
# MakeBoard Mini v2.1.2 by MicroMake
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
||||||
# TriGorilla Anycubic version 1.4 based on RAMPS EFB
|
# TriGorilla Anycubic version 1.3-based on RAMPS EFB
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
||||||
# TriGorilla Anycubic version 1.4 Rev 1.1
|
# ... Ver 1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
||||||
# Creality: Ender-4, CR-8
|
# ... Rev 1.1 (new servo pin order)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
||||||
# Creality: CR10S, CR20, CR-X
|
# Creality: Ender-4, CR-8
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
||||||
# Dagoma F5
|
# Creality: CR10S, CR20, CR-X
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||||
# FYSETC F6 1.3
|
# Dagoma F5
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||||
# FYSETC F6 1.5
|
# FYSETC F6 1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||||
# Duplicator i3 Plus
|
# FYSETC F6 1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||||
# VORON
|
# Wanhao Duplicator i3 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||||
# TRONXY V3 1.0
|
# VORON Design
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||||
# Z-Bolt X Series
|
# Tronxy TRONXY-V3-1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||||
# TT OSCAR
|
# Z-Bolt X Series
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||||
# Overlord/Overlord Pro
|
# TT OSCAR
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||||
# ADIMLab Gantry v1
|
# Overlord/Overlord Pro
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||||
# ADIMLab Gantry v2
|
# ADIMLab Gantry v1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||||
# BIQU Tango V1
|
# ADIMLab Gantry v2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||||
# MKS GEN L V2
|
# BIQU Tango V1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||||
# MKS GEN L V2.1
|
# MKS GEN L V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||||
# Copymaster 3D
|
# MKS GEN L V2.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||||
# Ortur 4
|
# Copymaster 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||||
# Tenlog D3 Hero
|
# Ortur 4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||||
|
# Tenlog D3 Hero IDEX printer
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||||
|
# Tenlog D3,5,6 Pro IDEX printers
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||||
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||||
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||||
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||||
|
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||||
|
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||||
|
# Zonestar zrib V5.3 (Chinese RAMPS replica)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||||
|
# Pxmalion Core I3
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMBo and derivatives
|
# RAMBo and derivatives
|
||||||
@ -295,6 +340,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
||||||
# abee Scoovo X9H
|
# abee Scoovo X9H
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
||||||
|
# Rambo ThinkerV2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1206)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other ATmega1280, ATmega2560
|
# Other ATmega1280, ATmega2560
|
||||||
@ -328,20 +375,38 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1311)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1312)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1312)
|
||||||
# Mega controller
|
# Mega controller
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1313)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1313)
|
||||||
# Geeetech GT2560 Rev B for Mecreator2
|
# Geeetech GT2560 Rev A
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1314)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1314)
|
||||||
# Geeetech GT2560 Rev. A
|
# Geeetech GT2560 Rev A+ (with auto level probe)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1315)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1315)
|
||||||
# Geeetech GT2560 Rev. A+ (with auto level probe)
|
# Geeetech GT2560 Rev B
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1316)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1316)
|
||||||
# Geeetech GT2560 Rev B for A10(M/D)
|
# Geeetech GT2560 Rev B for A10(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1317)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1317)
|
||||||
# Geeetech GT2560 Rev B for A20(M/D)
|
# Geeetech GT2560 Rev B for A10(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
|
||||||
# Einstart retrofit
|
# Geeetech GT2560 Rev B for Mecreator2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
||||||
# Wanhao 0ne+ i3 Mini
|
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
||||||
|
# Einstart retrofit
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
||||||
|
# Wanhao 0ne+ i3 Mini
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||||
|
# Leapfrog Xeed 2015
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||||
|
# PICA Shield (original version)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||||
|
# PICA Shield (rev C or later)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||||
|
# Intamsys 4.0 (Funmat HT)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||||
|
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||||
|
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||||
|
# Mega controller & Protoneer CNC Shield V3.00
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||||
|
|
||||||
#
|
#
|
||||||
# ATmega1281, ATmega2561
|
# ATmega1281, ATmega2561
|
||||||
@ -350,9 +415,11 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
|||||||
# Minitronics v1.0/1.1
|
# Minitronics v1.0/1.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1400)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1400)
|
||||||
MCU ?= atmega1281
|
MCU ?= atmega1281
|
||||||
|
PROG_MCU ?= m1281
|
||||||
# Silvergate v1.0
|
# Silvergate v1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
||||||
MCU ?= atmega1281
|
MCU ?= atmega1281
|
||||||
|
PROG_MCU ?= m1281
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sanguinololu and Derivatives - ATmega644P, ATmega1284P
|
# Sanguinololu and Derivatives - ATmega644P, ATmega1284P
|
||||||
@ -362,46 +429,62 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1401)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1500)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1500)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Sanguinololu 1.2 and above
|
# Sanguinololu 1.2 and above
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1501)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1501)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Melzi
|
# Melzi
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1502)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1502)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Melzi V2.0
|
# Melzi V2.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1503)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1503)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi with ATmega1284 (MaKr3d version)
|
# Melzi with ATmega1284 (MaKr3d version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1504)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1504)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi Creality3D board (for CR-10 etc)
|
# Melzi Creality3D board (for CR-10 etc)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1505)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1505)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Melzi Malyan M150 board
|
# Melzi Malyan M150 board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1506)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1506)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Tronxy X5S
|
# Tronxy X5S
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1507)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1507)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# STB V1.1
|
# STB V1.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1508)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1508)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Azteeg X1
|
# Azteeg X1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1509)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1509)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
# Anet 1.0 (Melzi clone)
|
# Anet 1.0 (Melzi clone)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
|
# ZoneStar ZMIB V2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||||
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
|
|
||||||
#
|
#
|
||||||
# Other ATmega644P, ATmega644, ATmega1284P
|
# Other ATmega644P, ATmega644, ATmega1284P
|
||||||
@ -411,50 +494,61 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1600)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1600)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen3+
|
# Gen3+
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1601)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1601)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen6
|
# Gen6
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1602)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1602)
|
||||||
HARDWARE_VARIANT ?= Gen6
|
HARDWARE_VARIANT ?= Gen6
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen6 deluxe
|
# Gen6 deluxe
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1603)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1603)
|
||||||
HARDWARE_VARIANT ?= Gen6
|
HARDWARE_VARIANT ?= Gen6
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Gen7 custom (Alfons3 Version)
|
# Gen7 custom (Alfons3 Version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1604)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1604)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644
|
MCU ?= atmega644
|
||||||
|
PROG_MCU ?= m644
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.1, v1.2
|
# Gen7 v1.1, v1.2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1605)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1605)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.3
|
# Gen7 v1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1606)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1606)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Gen7 v1.4
|
# Gen7 v1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1607)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1607)
|
||||||
HARDWARE_VARIANT ?= Gen7
|
HARDWARE_VARIANT ?= Gen7
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
|
PROG_MCU ?= m1284p
|
||||||
F_CPU ?= 20000000
|
F_CPU ?= 20000000
|
||||||
# Alpha OMCA board
|
# Alpha OMCA board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1608)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1608)
|
||||||
HARDWARE_VARIANT ?= SanguinoA
|
HARDWARE_VARIANT ?= SanguinoA
|
||||||
MCU ?= atmega644
|
MCU ?= atmega644
|
||||||
|
PROG_MCU ?= m644
|
||||||
# Final OMCA board
|
# Final OMCA board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1609)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1609)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
# Sethi 3D_1
|
# Sethi 3D_1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega644p
|
MCU ?= atmega644p
|
||||||
|
PROG_MCU ?= m644p
|
||||||
|
|
||||||
#
|
#
|
||||||
# Teensyduino - AT90USB1286, AT90USB1286P
|
# Teensyduino - AT90USB1286, AT90USB1286P
|
||||||
@ -464,51 +558,60 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1610)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1700)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1700)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Printrboard (AT90USB1286)
|
# Printrboard (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1701)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1701)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Printrboard Revision F (AT90USB1286)
|
# Printrboard Revision F (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1702)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1702)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Brainwave (AT90USB646)
|
# Brainwave (AT90USB646)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1703)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1703)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb646
|
MCU ?= at90usb646
|
||||||
|
PROG_MCU ?= usb646
|
||||||
# Brainwave Pro (AT90USB1286)
|
# Brainwave Pro (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1704)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1704)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# SAV Mk-I (AT90USB1286)
|
# SAV Mk-I (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1705)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1705)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# Teensy++2.0 (AT90USB1286)
|
# Teensy++2.0 (AT90USB1286)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1706)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1706)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
# 5DPrint D8 Driver Board
|
# 5DPrint D8 Driver Board
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
||||||
HARDWARE_VARIANT ?= Teensy
|
HARDWARE_VARIANT ?= Teensy
|
||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
|
PROG_MCU ?= usb1286
|
||||||
|
|
||||||
# UltiMachine Archim1 (with DRV8825 drivers)
|
# UltiMachine Archim1 (with DRV8825 drivers)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
||||||
HARDWARE_VARIANT ?= archim
|
HARDWARE_VARIANT ?= archim
|
||||||
MCPU = cortex-m3
|
MCPU = cortex-m3
|
||||||
F_CPU = 84000000L
|
F_CPU = 84000000
|
||||||
IS_MCU = 0
|
IS_MCU = 0
|
||||||
# UltiMachine Archim2 (with TMC2130 drivers)
|
# UltiMachine Archim2 (with TMC2130 drivers)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),3024)
|
else ifeq ($(HARDWARE_MOTHERBOARD),3024)
|
||||||
HARDWARE_VARIANT ?= archim
|
HARDWARE_VARIANT ?= archim
|
||||||
MCPU = cortex-m3
|
MCPU = cortex-m3
|
||||||
F_CPU = 84000000L
|
F_CPU = 84000000
|
||||||
IS_MCU = 0
|
IS_MCU = 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py
|
# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py
|
||||||
# if you are setting this to something other than 16MHz
|
# if you are setting this to something other than 16MHz
|
||||||
|
# Do not put the UL suffix, it's done later on.
|
||||||
# Set to 16Mhz if not yet set.
|
# Set to 16Mhz if not yet set.
|
||||||
F_CPU ?= 16000000
|
F_CPU ?= 16000000
|
||||||
|
|
||||||
@ -519,6 +622,7 @@ ifeq ($(IS_MCU),1)
|
|||||||
# Set to arduino, ATmega2560 if not yet set.
|
# Set to arduino, ATmega2560 if not yet set.
|
||||||
HARDWARE_VARIANT ?= arduino
|
HARDWARE_VARIANT ?= arduino
|
||||||
MCU ?= atmega2560
|
MCU ?= atmega2560
|
||||||
|
PROG_MCU ?= m2560
|
||||||
|
|
||||||
TOOL_PREFIX = avr
|
TOOL_PREFIX = avr
|
||||||
MCU_FLAGS = -mmcu=$(MCU)
|
MCU_FLAGS = -mmcu=$(MCU)
|
||||||
@ -549,27 +653,36 @@ VPATH += $(BUILD_DIR)
|
|||||||
VPATH += $(HARDWARE_SRC)
|
VPATH += $(HARDWARE_SRC)
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino))
|
ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino))
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(IS_MCU),1)
|
ifeq ($(IS_MCU),1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
|
||||||
|
|
||||||
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
||||||
|
|
||||||
ifeq ($(LIQUID_TWI2), 1)
|
ifeq ($(LIQUID_TWI2), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire
|
WIRE = 1
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility
|
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2
|
||||||
endif
|
endif
|
||||||
ifeq ($(WIRE), 1)
|
ifeq ($(WIRE), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire
|
# Old libraries (avr-core 1.6.21 / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
|
||||||
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src
|
||||||
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility
|
||||||
endif
|
endif
|
||||||
ifeq ($(NEOPIXEL), 1)
|
ifeq ($(NEOPIXEL), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
||||||
@ -641,13 +754,23 @@ ifeq ($(WIRE), 1)
|
|||||||
LIB_CXXSRC += Wire.cpp
|
LIB_CXXSRC += Wire.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TONE), 1)
|
||||||
|
LIB_CXXSRC += Tone.cpp
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(U8GLIB), 1)
|
ifeq ($(U8GLIB), 1)
|
||||||
LIB_CXXSRC += U8glib.cpp
|
LIB_CXXSRC += U8glib.cpp
|
||||||
LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c
|
LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \
|
||||||
|
u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \
|
||||||
|
u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(TMC), 1)
|
ifeq ($(TMC), 1)
|
||||||
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
||||||
|
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
|
||||||
|
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
|
||||||
|
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||||
|
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(RELOC_WORKAROUND), 1)
|
ifeq ($(RELOC_WORKAROUND), 1)
|
||||||
@ -689,7 +812,7 @@ REMOVE = rm -f
|
|||||||
MV = mv -f
|
MV = mv -f
|
||||||
|
|
||||||
# Place -D or -U options here
|
# Place -D or -U options here
|
||||||
CDEFS = -DF_CPU=$(F_CPU) ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION)
|
CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION)
|
||||||
CXXDEFS = $(CDEFS)
|
CXXDEFS = $(CDEFS)
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), Teensy)
|
ifeq ($(HARDWARE_VARIANT), Teensy)
|
||||||
@ -698,8 +821,14 @@ ifeq ($(HARDWARE_VARIANT), Teensy)
|
|||||||
LIB_CXXSRC += usb_api.cpp
|
LIB_CXXSRC += usb_api.cpp
|
||||||
|
|
||||||
else ifeq ($(HARDWARE_VARIANT), archim)
|
else ifeq ($(HARDWARE_VARIANT), archim)
|
||||||
CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSB_VID=0x27b1 -DUSB_PID=0x0001 -DUSBCON '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"'
|
CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__
|
||||||
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp PluggableUSB.cpp USBCore.cpp
|
CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON
|
||||||
|
CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"'
|
||||||
|
|
||||||
|
LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \
|
||||||
|
UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp \
|
||||||
|
PluggableUSB.cpp USBCore.cpp
|
||||||
|
|
||||||
LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c
|
LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c
|
||||||
|
|
||||||
ifeq ($(U8GLIB), 1)
|
ifeq ($(U8GLIB), 1)
|
||||||
@ -725,16 +854,20 @@ CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \
|
|||||||
ifneq ($(HARDWARE_MOTHERBOARD),)
|
ifneq ($(HARDWARE_MOTHERBOARD),)
|
||||||
CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD}
|
CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD}
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
||||||
CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti
|
CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti
|
||||||
CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD)
|
CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD)
|
||||||
CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD)
|
CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD)
|
||||||
ASFLAGS := $(CDEFS)
|
ASFLAGS := $(CDEFS)
|
||||||
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), archim)
|
ifeq ($(HARDWARE_VARIANT), archim)
|
||||||
LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align
|
LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align
|
||||||
LD_SUFFIX = $(LDLIBS)
|
LD_SUFFIX = $(LDLIBS)
|
||||||
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
|
|
||||||
|
LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty
|
||||||
|
LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid
|
||||||
else
|
else
|
||||||
LD_PREFIX = -Wl,--gc-sections,--relax
|
LD_PREFIX = -Wl,--gc-sections,--relax
|
||||||
LDFLAGS = -lm
|
LDFLAGS = -lm
|
||||||
@ -750,7 +883,7 @@ else
|
|||||||
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
||||||
endif
|
endif
|
||||||
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
||||||
-p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
-p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
||||||
-b$(UPLOAD_RATE)
|
-b$(UPLOAD_RATE)
|
||||||
|
|
||||||
# Since Marlin 2.0, the source files may be distributed into several
|
# Since Marlin 2.0, the source files may be distributed into several
|
||||||
@ -865,7 +998,7 @@ extcoff: $(TARGET).elf
|
|||||||
|
|
||||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
||||||
$(Pecho) " CXX $@"
|
$(Pecho) " CXX $@"
|
||||||
$P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
||||||
|
|
||||||
# Object files that were found in "src" will be stored in $(BUILD_DIR)
|
# Object files that were found in "src" will be stored in $(BUILD_DIR)
|
||||||
# in directories that mirror the structure of "src"
|
# in directories that mirror the structure of "src"
|
||||||
@ -900,5 +1033,5 @@ clean:
|
|||||||
|
|
||||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter
|
||||||
|
|
||||||
# Automaticaly include the dependency files created by gcc
|
# Automatically include the dependency files created by gcc
|
||||||
-include ${patsubst %.o, %.d, ${OBJ}}
|
-include ${patsubst %.o, %.d, ${OBJ}}
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin release version identifier
|
* Marlin release version identifier
|
||||||
*/
|
*/
|
||||||
//#define SHORT_BUILD_VERSION "2.0.7"
|
//#define SHORT_BUILD_VERSION "2.1.2"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verbose version identifier which should contain a reference to the location
|
* Verbose version identifier which should contain a reference to the location
|
||||||
@ -41,7 +41,7 @@
|
|||||||
* here we define this default string as the date where the latest release
|
* here we define this default string as the date where the latest release
|
||||||
* version was tagged.
|
* version was tagged.
|
||||||
*/
|
*/
|
||||||
//#define STRING_DISTRIBUTION_DATE "2020-07-09"
|
//#define STRING_DISTRIBUTION_DATE "2022-12-17"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||||
@ -54,7 +54,7 @@
|
|||||||
* has a distinct Github fork— the Source Code URL should just be the main
|
* has a distinct Github fork— the Source Code URL should just be the main
|
||||||
* Marlin repository.
|
* Marlin repository.
|
||||||
*/
|
*/
|
||||||
//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin"
|
//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default generic printer UUID.
|
* Default generic printer UUID.
|
||||||
@ -65,7 +65,7 @@
|
|||||||
* The WEBSITE_URL is the location where users can get more information such as
|
* The WEBSITE_URL is the location where users can get more information such as
|
||||||
* documentation about a specific Marlin release.
|
* documentation about a specific Marlin release.
|
||||||
*/
|
*/
|
||||||
//#define WEBSITE_URL "https://marlinfw.org"
|
//#define WEBSITE_URL "marlinfw.org"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changable
|
* Set the vendor info the serial USB interface, if changable
|
||||||
|
211
Marlin/config.ini
Normal file
211
Marlin/config.ini
Normal file
@ -0,0 +1,211 @@
|
|||||||
|
#
|
||||||
|
# Marlin Firmware
|
||||||
|
# config.ini - Options to apply before the build
|
||||||
|
#
|
||||||
|
[config:base]
|
||||||
|
ini_use_config = none
|
||||||
|
|
||||||
|
# Load all config: sections in this file
|
||||||
|
;ini_use_config = all
|
||||||
|
# Load config file relative to Marlin/
|
||||||
|
;ini_use_config = another.ini
|
||||||
|
# Download configurations from GitHub
|
||||||
|
;ini_use_config = example/Creality/Ender-5 Plus @ bugfix-2.1.x
|
||||||
|
# Download configurations from your server
|
||||||
|
;ini_use_config = https://me.myserver.com/path/to/configs
|
||||||
|
# Evaluate config:base and do a config dump
|
||||||
|
;ini_use_config = base
|
||||||
|
;config_export = 2
|
||||||
|
|
||||||
|
[config:minimal]
|
||||||
|
motherboard = BOARD_RAMPS_14_EFB
|
||||||
|
serial_port = 0
|
||||||
|
baudrate = 250000
|
||||||
|
|
||||||
|
use_watchdog = on
|
||||||
|
thermal_protection_hotends = on
|
||||||
|
thermal_protection_hysteresis = 4
|
||||||
|
thermal_protection_period = 40
|
||||||
|
|
||||||
|
bufsize = 4
|
||||||
|
block_buffer_size = 16
|
||||||
|
max_cmd_size = 96
|
||||||
|
|
||||||
|
extruders = 1
|
||||||
|
temp_sensor_0 = 1
|
||||||
|
|
||||||
|
temp_hysteresis = 3
|
||||||
|
heater_0_mintemp = 5
|
||||||
|
heater_0_maxtemp = 275
|
||||||
|
preheat_1_temp_hotend = 180
|
||||||
|
|
||||||
|
bang_max = 255
|
||||||
|
pidtemp = on
|
||||||
|
pid_k1 = 0.95
|
||||||
|
pid_max = BANG_MAX
|
||||||
|
pid_functional_range = 10
|
||||||
|
|
||||||
|
default_kp = 22.20
|
||||||
|
default_ki = 1.08
|
||||||
|
default_kd = 114.00
|
||||||
|
|
||||||
|
x_driver_type = A4988
|
||||||
|
y_driver_type = A4988
|
||||||
|
z_driver_type = A4988
|
||||||
|
e0_driver_type = A4988
|
||||||
|
|
||||||
|
x_bed_size = 200
|
||||||
|
x_min_pos = 0
|
||||||
|
x_max_pos = X_BED_SIZE
|
||||||
|
|
||||||
|
y_bed_size = 200
|
||||||
|
y_min_pos = 0
|
||||||
|
y_max_pos = Y_BED_SIZE
|
||||||
|
|
||||||
|
z_min_pos = 0
|
||||||
|
z_max_pos = 200
|
||||||
|
|
||||||
|
x_home_dir = -1
|
||||||
|
y_home_dir = -1
|
||||||
|
z_home_dir = -1
|
||||||
|
|
||||||
|
use_xmin_plug = on
|
||||||
|
use_ymin_plug = on
|
||||||
|
use_zmin_plug = on
|
||||||
|
|
||||||
|
x_min_endstop_inverting = false
|
||||||
|
y_min_endstop_inverting = false
|
||||||
|
z_min_endstop_inverting = false
|
||||||
|
|
||||||
|
default_axis_steps_per_unit = { 80, 80, 400, 500 }
|
||||||
|
axis_relative_modes = { false, false, false, false }
|
||||||
|
default_max_feedrate = { 300, 300, 5, 25 }
|
||||||
|
default_max_acceleration = { 3000, 3000, 100, 10000 }
|
||||||
|
|
||||||
|
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
||||||
|
homing_bump_divisor = { 2, 2, 4 }
|
||||||
|
|
||||||
|
x_enable_on = 0
|
||||||
|
y_enable_on = 0
|
||||||
|
z_enable_on = 0
|
||||||
|
e_enable_on = 0
|
||||||
|
|
||||||
|
invert_x_dir = false
|
||||||
|
invert_y_dir = true
|
||||||
|
invert_z_dir = false
|
||||||
|
invert_e0_dir = false
|
||||||
|
|
||||||
|
invert_e_step_pin = false
|
||||||
|
invert_x_step_pin = false
|
||||||
|
invert_y_step_pin = false
|
||||||
|
invert_z_step_pin = false
|
||||||
|
|
||||||
|
disable_x = false
|
||||||
|
disable_y = false
|
||||||
|
disable_z = false
|
||||||
|
disable_e = false
|
||||||
|
|
||||||
|
proportional_font_ratio = 1.0
|
||||||
|
default_nominal_filament_dia = 1.75
|
||||||
|
|
||||||
|
junction_deviation_mm = 0.013
|
||||||
|
|
||||||
|
default_acceleration = 3000
|
||||||
|
default_travel_acceleration = 3000
|
||||||
|
default_retract_acceleration = 3000
|
||||||
|
|
||||||
|
default_minimumfeedrate = 0.0
|
||||||
|
default_mintravelfeedrate = 0.0
|
||||||
|
|
||||||
|
minimum_planner_speed = 0.05
|
||||||
|
min_steps_per_segment = 6
|
||||||
|
default_minsegmenttime = 20000
|
||||||
|
|
||||||
|
[config:basic]
|
||||||
|
bed_overshoot = 10
|
||||||
|
busy_while_heating = on
|
||||||
|
default_ejerk = 5.0
|
||||||
|
default_keepalive_interval = 2
|
||||||
|
default_leveling_fade_height = 0.0
|
||||||
|
disable_inactive_extruder = on
|
||||||
|
display_charset_hd44780 = JAPANESE
|
||||||
|
eeprom_boot_silent = on
|
||||||
|
eeprom_chitchat = on
|
||||||
|
endstoppullups = on
|
||||||
|
extrude_maxlength = 200
|
||||||
|
extrude_mintemp = 170
|
||||||
|
host_keepalive_feature = on
|
||||||
|
hotend_overshoot = 15
|
||||||
|
jd_handle_small_segments = on
|
||||||
|
lcd_info_screen_style = 0
|
||||||
|
lcd_language = en
|
||||||
|
max_bed_power = 255
|
||||||
|
mesh_inset = 0
|
||||||
|
min_software_endstops = on
|
||||||
|
max_software_endstops = on
|
||||||
|
min_software_endstop_x = on
|
||||||
|
min_software_endstop_y = on
|
||||||
|
min_software_endstop_z = on
|
||||||
|
max_software_endstop_x = on
|
||||||
|
max_software_endstop_y = on
|
||||||
|
max_software_endstop_z = on
|
||||||
|
preheat_1_fan_speed = 0
|
||||||
|
preheat_1_label = "PLA"
|
||||||
|
preheat_1_temp_bed = 70
|
||||||
|
prevent_cold_extrusion = on
|
||||||
|
prevent_lengthy_extrude = on
|
||||||
|
printjob_timer_autostart = on
|
||||||
|
probing_margin = 10
|
||||||
|
show_bootscreen = on
|
||||||
|
soft_pwm_scale = 0
|
||||||
|
string_config_h_author = "(none, default config)"
|
||||||
|
temp_bed_hysteresis = 3
|
||||||
|
temp_bed_residency_time = 10
|
||||||
|
temp_bed_window = 1
|
||||||
|
temp_residency_time = 10
|
||||||
|
temp_window = 1
|
||||||
|
validate_homing_endstops = on
|
||||||
|
xy_probe_feedrate = (133*60)
|
||||||
|
z_clearance_between_probes = 5
|
||||||
|
z_clearance_deploy_probe = 10
|
||||||
|
z_clearance_multi_probe = 5
|
||||||
|
|
||||||
|
[config:advanced]
|
||||||
|
arc_support = on
|
||||||
|
auto_report_temperatures = on
|
||||||
|
autotemp = on
|
||||||
|
autotemp_oldweight = 0.98
|
||||||
|
bed_check_interval = 5000
|
||||||
|
default_stepper_deactive_time = 120
|
||||||
|
default_volumetric_extruder_limit = 0.00
|
||||||
|
disable_inactive_e = true
|
||||||
|
disable_inactive_x = true
|
||||||
|
disable_inactive_y = true
|
||||||
|
disable_inactive_z = true
|
||||||
|
e0_auto_fan_pin = -1
|
||||||
|
encoder_100x_steps_per_sec = 80
|
||||||
|
encoder_10x_steps_per_sec = 30
|
||||||
|
encoder_rate_multiplier = on
|
||||||
|
extended_capabilities_report = on
|
||||||
|
extruder_auto_fan_speed = 255
|
||||||
|
extruder_auto_fan_temperature = 50
|
||||||
|
fanmux0_pin = -1
|
||||||
|
fanmux1_pin = -1
|
||||||
|
fanmux2_pin = -1
|
||||||
|
faster_gcode_parser = on
|
||||||
|
homing_bump_mm = { 5, 5, 2 }
|
||||||
|
max_arc_segment_mm = 1.0
|
||||||
|
min_arc_segment_mm = 0.1
|
||||||
|
min_circle_segments = 72
|
||||||
|
n_arc_correction = 25
|
||||||
|
serial_overrun_protection = on
|
||||||
|
slowdown = on
|
||||||
|
slowdown_divisor = 2
|
||||||
|
temp_sensor_bed = 0
|
||||||
|
thermal_protection_bed_hysteresis = 2
|
||||||
|
thermocouple_max_errors = 15
|
||||||
|
tx_buffer_size = 0
|
||||||
|
watch_bed_temp_increase = 2
|
||||||
|
watch_bed_temp_period = 60
|
||||||
|
watch_temp_increase = 2
|
||||||
|
watch_temp_period = 20
|
@ -23,18 +23,45 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#ifdef USBCON
|
||||||
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#ifdef BLUETOOTH
|
||||||
|
BTSerial btSerial(false, bluetoothSerial);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
//uint8_t MCUSR;
|
// Don't initialize/override variable (which would happen in .init4)
|
||||||
|
uint8_t MarlinHAL::reset_reason __attribute__((section(".noinit")));
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
void HAL_init() {
|
__attribute__((naked)) // Don't output function pro- and epilogue
|
||||||
|
__attribute__((used)) // Output the function, even if "not used"
|
||||||
|
__attribute__((section(".init3"))) // Put in an early user definable section
|
||||||
|
void save_reset_reason() {
|
||||||
|
#if ENABLED(OPTIBOOT_RESET_REASON)
|
||||||
|
__asm__ __volatile__(
|
||||||
|
A("STS %0, r2")
|
||||||
|
: "=m"(hal.reset_reason)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
hal.reset_reason = MCUSR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Clear within 16ms since WDRF bit enables a 16ms watchdog timer -> Boot loop
|
||||||
|
hal.clear_reset_source();
|
||||||
|
wdt_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinHAL::init() {
|
||||||
// Init Servo Pins
|
// Init Servo Pins
|
||||||
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
|
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
|
||||||
#if HAS_SERVO_0
|
#if HAS_SERVO_0
|
||||||
@ -49,8 +76,75 @@ void HAL_init() {
|
|||||||
#if HAS_SERVO_3
|
#if HAS_SERVO_3
|
||||||
INIT_SERVO(3);
|
INIT_SERVO(3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
init_pwm_timers(); // Init user timers to default frequency - 1000HZ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MarlinHAL::reboot() {
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
while (1) { /* run out the watchdog */ }
|
||||||
|
#else
|
||||||
|
void (*resetFunc)() = 0; // Declare resetFunc() at address 0
|
||||||
|
resetFunc(); // Jump to address 0
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Watchdog Timer
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
|
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
||||||
|
void MarlinHAL::watchdog_init() {
|
||||||
|
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
|
||||||
|
#define WDTO_NS WDTO_8S
|
||||||
|
#else
|
||||||
|
#define WDTO_NS WDTO_4S
|
||||||
|
#endif
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
// Enable the watchdog timer, but only for the interrupt.
|
||||||
|
// Take care, as this requires the correct order of operation, with interrupts disabled.
|
||||||
|
// See the datasheet of any AVR chip for details.
|
||||||
|
wdt_reset();
|
||||||
|
cli();
|
||||||
|
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
|
||||||
|
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
|
||||||
|
// So worked for up to WDTO_2S
|
||||||
|
sei();
|
||||||
|
wdt_reset();
|
||||||
|
#else
|
||||||
|
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
|
||||||
|
#endif
|
||||||
|
//delay(10000); // test it!
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//=================================== ISR ===================================
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
ISR(WDT_vect) {
|
||||||
|
sei(); // With the interrupt driven serial we need to allow interrupts.
|
||||||
|
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
||||||
|
minkill(); // interrupt-safe final kill and infinite loop
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset watchdog. MUST be called at least every 4 seconds after the
|
||||||
|
// first watchdog_init or AVR will go into emergency procedures.
|
||||||
|
void MarlinHAL::watchdog_refresh() { wdt_reset(); }
|
||||||
|
|
||||||
|
#endif // USE_WATCHDOG
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Free Memory Accessor
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
|
|
||||||
#include "../../sd/SdFatUtil.h"
|
#include "../../sd/SdFatUtil.h"
|
||||||
|
@ -19,17 +19,20 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HAL for Arduino AVR
|
||||||
|
*/
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
#else
|
#else
|
||||||
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
#define BOARD_NO_NATIVE_USB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -39,6 +42,19 @@
|
|||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Default graphical display delays
|
||||||
|
//
|
||||||
|
#if F_CPU >= 20000000
|
||||||
|
#define CPU_ST7920_DELAY_1 150
|
||||||
|
#define CPU_ST7920_DELAY_2 0
|
||||||
|
#define CPU_ST7920_DELAY_3 150
|
||||||
|
#elif F_CPU == 16000000
|
||||||
|
#define CPU_ST7920_DELAY_1 125
|
||||||
|
#define CPU_ST7920_DELAY_2 0
|
||||||
|
#define CPU_ST7920_DELAY_3 188
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef pgm_read_ptr
|
#ifndef pgm_read_ptr
|
||||||
// Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
|
// Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for
|
||||||
// Windows Subsystem for Linux on Windows 10 as of 10/18/2019
|
// Windows Subsystem for Linux on Windows 10 as of 10/18/2019
|
||||||
@ -61,9 +77,9 @@
|
|||||||
#define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
|
#define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli()
|
||||||
#define CRITICAL_SECTION_END() SREG = _sreg
|
#define CRITICAL_SECTION_END() SREG = _sreg
|
||||||
#endif
|
#endif
|
||||||
#define ISRS_ENABLED() TEST(SREG, SREG_I)
|
|
||||||
#define ENABLE_ISRS() sei()
|
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||||
#define DISABLE_ISRS() cli()
|
#define PWM_FREQUENCY 1000 // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
@ -71,35 +87,56 @@
|
|||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
|
||||||
#define HAL_SERVO_LIB Servo
|
|
||||||
|
class Servo;
|
||||||
|
typedef Servo hal_servo_t;
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public Variables
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
//extern uint8_t MCUSR;
|
|
||||||
|
|
||||||
// Serial ports
|
// Serial ports
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
#define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial)
|
#include "../../core/serial_hook.h"
|
||||||
#else
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
extern DefaultSerial1 MSerial0;
|
||||||
#error "SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#ifdef BLUETOOTH
|
||||||
|
typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial;
|
||||||
|
extern BTSerial btSerial;
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL0 customizedSerial1
|
|
||||||
|
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
||||||
|
#else
|
||||||
|
#if !WITHIN(SERIAL_PORT, 0, 3)
|
||||||
|
#error "SERIAL_PORT must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL1 customizedSerial1
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
#if !WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_2 must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL1 customizedSerial2
|
#define MYSERIAL2 customizedSerial2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef SERIAL_PORT_3
|
||||||
|
#if !WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
|
#error "SERIAL_PORT_3 must be from 0 to 3."
|
||||||
|
#endif
|
||||||
|
#define MYSERIAL3 customizedSerial3
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
#if !WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
|
#error "MMU2_SERIAL_PORT must be from 0 to 3"
|
||||||
|
#endif
|
||||||
|
#define MMU2_SERIAL mmuSerial
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
#if !WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define LCD_SERIAL lcdSerial
|
#define LCD_SERIAL lcdSerial
|
||||||
#if HAS_DGUS_LCD
|
#if HAS_DGUS_LCD
|
||||||
@ -107,58 +144,20 @@ typedef int8_t pin_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
//
|
||||||
// Public functions
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
void HAL_init();
|
|
||||||
|
|
||||||
//void cli();
|
|
||||||
|
|
||||||
//void _delay_ms(const int delay);
|
|
||||||
|
|
||||||
inline void HAL_clear_reset_source() { MCUSR = 0; }
|
|
||||||
inline uint8_t HAL_get_reset_source() { return MCUSR; }
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
extern "C" {
|
|
||||||
int freeMemory();
|
|
||||||
}
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
// ADC
|
// ADC
|
||||||
#ifdef DIDR2
|
//
|
||||||
#define HAL_ANALOG_SELECT(ind) do{ if (ind < 8) SBI(DIDR0, ind); else SBI(DIDR2, ind & 0x07); }while(0)
|
|
||||||
#else
|
|
||||||
#define HAL_ANALOG_SELECT(ind) SBI(DIDR0, ind);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inline void HAL_adc_init() {
|
|
||||||
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
|
|
||||||
DIDR0 = 0;
|
|
||||||
#ifdef DIDR2
|
|
||||||
DIDR2 = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SET_ADMUX_ADCSRA(ch) ADMUX = _BV(REFS0) | (ch & 0x07); SBI(ADCSRA, ADSC)
|
|
||||||
#ifdef MUX5
|
|
||||||
#define HAL_START_ADC(ch) if (ch > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
|
|
||||||
#else
|
|
||||||
#define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HAL_ADC_VREF 5.0
|
#define HAL_ADC_VREF 5.0
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
#define HAL_READ_ADC() ADC
|
|
||||||
#define HAL_ADC_READY() !TEST(ADCSRA, ADSC)
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Pin Mapping for M42, M43, M226
|
||||||
|
//
|
||||||
#define GET_PIN_MAP_PIN(index) index
|
#define GET_PIN_MAP_PIN(index) index
|
||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
#define GET_PIN_MAP_INDEX(pin) pin
|
||||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||||
|
|
||||||
#define HAL_SENSITIVE_PINS 0, 1
|
#define HAL_SENSITIVE_PINS 0, 1,
|
||||||
|
|
||||||
#ifdef __AVR_AT90USB1286__
|
#ifdef __AVR_AT90USB1286__
|
||||||
#define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
|
#define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
|
||||||
@ -167,23 +166,113 @@ inline void HAL_adc_init() {
|
|||||||
// AVR compatibility
|
// AVR compatibility
|
||||||
#define strtof strtod
|
#define strtof strtod
|
||||||
|
|
||||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
// ------------------------
|
||||||
|
// Free Memory Accessor
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" int freeMemory();
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// MarlinHAL Class
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
class MarlinHAL {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Earliest possible init, before setup()
|
||||||
|
MarlinHAL() {}
|
||||||
|
|
||||||
|
// Watchdog
|
||||||
|
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
|
||||||
|
static void init(); // Called early in setup()
|
||||||
|
static void init_board() {} // Called less early in setup()
|
||||||
|
static void reboot(); // Restart the firmware from 0x0
|
||||||
|
|
||||||
|
// Interrupts
|
||||||
|
static bool isr_state() { return TEST(SREG, SREG_I); }
|
||||||
|
static void isr_on() { sei(); }
|
||||||
|
static void isr_off() { cli(); }
|
||||||
|
|
||||||
|
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||||
|
|
||||||
|
// Tasks, called from idle()
|
||||||
|
static void idletask() {}
|
||||||
|
|
||||||
|
// Reset
|
||||||
|
static uint8_t reset_reason;
|
||||||
|
static uint8_t get_reset_source() { return reset_reason; }
|
||||||
|
static void clear_reset_source() { MCUSR = 0; }
|
||||||
|
|
||||||
|
// Free SRAM
|
||||||
|
static int freeMemory() { return ::freeMemory(); }
|
||||||
|
|
||||||
|
//
|
||||||
|
// ADC Methods
|
||||||
|
//
|
||||||
|
|
||||||
|
// Called by Temperature::init once at startup
|
||||||
|
static void adc_init() {
|
||||||
|
ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07;
|
||||||
|
DIDR0 = 0;
|
||||||
|
#ifdef DIDR2
|
||||||
|
DIDR2 = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called by Temperature::init for each sensor at startup
|
||||||
|
static void adc_enable(const uint8_t ch) {
|
||||||
|
#ifdef DIDR2
|
||||||
|
if (ch > 7) { SBI(DIDR2, ch & 0x07); return; }
|
||||||
|
#endif
|
||||||
|
SBI(DIDR0, ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin ADC sampling on the given channel. Called from Temperature::isr!
|
||||||
|
static void adc_start(const uint8_t ch) {
|
||||||
|
#ifdef MUX5
|
||||||
|
ADCSRB = ch > 7 ? _BV(MUX5) : 0;
|
||||||
|
#else
|
||||||
|
ADCSRB = 0;
|
||||||
|
#endif
|
||||||
|
ADMUX = _BV(REFS0) | (ch & 0x07);
|
||||||
|
SBI(ADCSRA, ADSC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the ADC ready for reading?
|
||||||
|
static bool adc_ready() { return !TEST(ADCSRA, ADSC); }
|
||||||
|
|
||||||
|
// The current value of the ADC register
|
||||||
|
static __typeof__(ADC) adc_value() { return ADC; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set_pwm_frequency
|
* init_pwm_timers
|
||||||
* Sets the frequency of the timer corresponding to the provided pin
|
* Set the default frequency for timers 2-5 to 1000HZ
|
||||||
* as close as possible to the provided desired frequency. Internally
|
*/
|
||||||
* calculates the required waveform generation mode, prescaler and
|
static void init_pwm_timers();
|
||||||
* resolution values required and sets the timer registers accordingly.
|
|
||||||
|
/**
|
||||||
|
* Set the PWM duty cycle for the pin to the given value.
|
||||||
|
* Optionally invert the duty cycle [default = false]
|
||||||
|
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
|
||||||
|
*/
|
||||||
|
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the frequency of the timer for the given pin as close as
|
||||||
|
* possible to the provided desired frequency. Internally calculate
|
||||||
|
* the required waveform generation mode, prescaler, and resolution
|
||||||
|
* values and set timer registers accordingly.
|
||||||
* NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B)
|
* NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B)
|
||||||
* NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST FAN PWM Settings)
|
* NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST_PWM_FAN Settings)
|
||||||
*/
|
*/
|
||||||
void set_pwm_frequency(const pin_t pin, int f_desired);
|
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
|
||||||
|
};
|
||||||
/**
|
|
||||||
* set_pwm_duty
|
|
||||||
* Sets the PWM duty cycle of the provided pin to the provided value
|
|
||||||
* Optionally allows inverting the duty cycle [default = false]
|
|
||||||
* Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255]
|
|
||||||
*/
|
|
||||||
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
|
|
||||||
|
@ -34,21 +34,21 @@
|
|||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
OUT_WRITE(SS_PIN, HIGH);
|
#if PIN_EXISTS(SD_SS)
|
||||||
SET_OUTPUT(SCK_PIN);
|
// Do not init HIGH for boards with pin 4 used as Fans or Heaters or otherwise, not likely to have multiple SPI devices anyway.
|
||||||
SET_INPUT(MISO_PIN);
|
#if defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
||||||
SET_OUTPUT(MOSI_PIN);
|
|
||||||
|
|
||||||
#if DISABLED(SOFTWARE_SPI)
|
|
||||||
// SS must be in output mode even it is not chip select
|
// SS must be in output mode even it is not chip select
|
||||||
//SET_OUTPUT(SS_PIN);
|
SET_OUTPUT(SD_SS_PIN);
|
||||||
|
#else
|
||||||
// set SS high - may be chip select for another SPI device
|
// set SS high - may be chip select for another SPI device
|
||||||
//#if SET_SPI_SS_HIGH
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
//WRITE(SS_PIN, HIGH);
|
|
||||||
//#endif
|
|
||||||
// set a default rate
|
|
||||||
spiInit(1);
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
|
SET_INPUT(SD_MISO_PIN);
|
||||||
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
|
|
||||||
|
IF_DISABLED(SOFTWARE_SPI, spiInit(SPI_HALF_SPEED));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI)
|
#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI)
|
||||||
@ -74,7 +74,8 @@ void spiBegin() {
|
|||||||
#elif defined(PRR0)
|
#elif defined(PRR0)
|
||||||
PRR0
|
PRR0
|
||||||
#endif
|
#endif
|
||||||
, PRSPI);
|
, PRSPI
|
||||||
|
);
|
||||||
|
|
||||||
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
|
SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1);
|
||||||
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
|
SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
|
||||||
@ -195,19 +196,19 @@ void spiBegin() {
|
|||||||
// no interrupts during byte receive - about 8µs
|
// no interrupts during byte receive - about 8µs
|
||||||
cli();
|
cli();
|
||||||
// output pin high - like sending 0xFF
|
// output pin high - like sending 0xFF
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
|
|
||||||
nop; // adjust so SCK is nice
|
nop; // adjust so SCK is nice
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
|
|
||||||
if (READ(MISO_PIN)) data |= 1;
|
if (READ(SD_MISO_PIN)) data |= 1;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
@ -225,10 +226,10 @@ void spiBegin() {
|
|||||||
// no interrupts during byte send - about 8µs
|
// no interrupts during byte send - about 8µs
|
||||||
cli();
|
cli();
|
||||||
LOOP_L_N(i, 8) {
|
LOOP_L_N(i, 8) {
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
WRITE(MOSI_PIN, data & 0x80);
|
WRITE(SD_MOSI_PIN, data & 0x80);
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
nop; // hold SCK high for a few ns
|
nop; // hold SCK high for a few ns
|
||||||
@ -236,7 +237,7 @@ void spiBegin() {
|
|||||||
nop;
|
nop;
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
* Based on Sprinter and grbl.
|
* Based on Sprinter and grbl.
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
@ -21,5 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void watchdog_init();
|
#include <SPI.h>
|
||||||
void HAL_watchdog_refresh();
|
|
||||||
|
using MarlinSPI = SPIClass;
|
@ -486,7 +486,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||||
|
|
||||||
// If global interrupts are disabled (as the result of being called from an ISR)...
|
// If global interrupts are disabled (as the result of being called from an ISR)...
|
||||||
if (!ISRS_ENABLED()) {
|
if (!hal.isr_state()) {
|
||||||
|
|
||||||
// Make room by polling if it is possible to transmit, and do so!
|
// Make room by polling if it is possible to transmit, and do so!
|
||||||
while (i == tx_buffer.tail) {
|
while (i == tx_buffer.tail) {
|
||||||
@ -534,7 +534,7 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
if (!_written) return;
|
if (!_written) return;
|
||||||
|
|
||||||
// If global interrupts are disabled (as the result of being called from an ISR)...
|
// If global interrupts are disabled (as the result of being called from an ISR)...
|
||||||
if (!ISRS_ENABLED()) {
|
if (!hal.isr_state()) {
|
||||||
|
|
||||||
// Wait until everything was transmitted - We must do polling, as interrupts are disabled
|
// Wait until everything was transmitted - We must do polling, as interrupts are disabled
|
||||||
while (tx_buffer.head != tx_buffer.tail || !B_TXC) {
|
while (tx_buffer.head != tx_buffer.tail || !B_TXC) {
|
||||||
@ -556,161 +556,6 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) { print('-'); n = -n; }
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits) rounding *= 0.1;
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hookup ISR handlers
|
// Hookup ISR handlers
|
||||||
ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) {
|
ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) {
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::store_rxd_char();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::store_rxd_char();
|
||||||
@ -720,11 +565,9 @@ ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) {
|
|||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
// Because of the template definition above, it's required to instantiate the template to have all methods generated
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
||||||
|
MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
||||||
// Instantiate
|
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
|
|
||||||
@ -737,13 +580,26 @@ MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::_tx_udr_empty_irq();
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
||||||
|
MSerialT2 customizedSerial2(MSerialT2::HasEmergencyParser);
|
||||||
|
|
||||||
// Instantiate
|
#endif // SERIAL_PORT_2
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
|
||||||
|
|
||||||
#endif
|
#ifdef SERIAL_PORT_3
|
||||||
|
|
||||||
|
// Hookup ISR handlers
|
||||||
|
ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _RX_vect)) {
|
||||||
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_3>>::store_rxd_char();
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(SERIAL_REGNAME(USART, SERIAL_PORT_3, _UDRE_vect)) {
|
||||||
|
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_3>>::_tx_udr_empty_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
||||||
|
MSerialT3 customizedSerial3(MSerialT3::HasEmergencyParser);
|
||||||
|
|
||||||
|
#endif // SERIAL_PORT_3
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
|
||||||
@ -755,13 +611,10 @@ MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|||||||
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
|
||||||
template class MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> >;
|
template class MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> >;
|
||||||
|
MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser);
|
||||||
|
|
||||||
// Instantiate
|
#endif // MMU2_SERIAL_PORT
|
||||||
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>> mmuSerial;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
|
|
||||||
@ -773,11 +626,8 @@ MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|||||||
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>>::_tx_udr_empty_irq();
|
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
|
||||||
template class MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> >;
|
template class MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> >;
|
||||||
|
MSerialLCD lcdSerial(MSerialLCD::HasEmergencyParser);
|
||||||
// Instantiate
|
|
||||||
MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>> lcdSerial;
|
|
||||||
|
|
||||||
#if HAS_DGUS_LCD
|
#if HAS_DGUS_LCD
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@ -790,13 +640,13 @@ MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif // LCD_SERIAL_PORT
|
||||||
|
|
||||||
#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H)
|
#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H)
|
||||||
|
|
||||||
// For AT90USB targets use the UART for BT interfacing
|
// For AT90USB targets use the UART for BT interfacing
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
||||||
HardwareSerial bluetoothSerial;
|
MSerialBT bluetoothSerial(false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
#ifndef SERIAL_PORT
|
||||||
#define SERIAL_PORT 0
|
#define SERIAL_PORT 0
|
||||||
@ -135,10 +136,6 @@
|
|||||||
UART_DECL(3);
|
UART_DECL(3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
#define BYTE 0
|
#define BYTE 0
|
||||||
|
|
||||||
// Templated type selector
|
// Templated type selector
|
||||||
@ -194,21 +191,19 @@
|
|||||||
rx_framing_errors;
|
rx_framing_errors;
|
||||||
static ring_buffer_pos_t rx_max_enqueued;
|
static ring_buffer_pos_t rx_max_enqueued;
|
||||||
|
|
||||||
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head();
|
FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_head();
|
||||||
|
|
||||||
static volatile bool rx_tail_value_not_stable;
|
static volatile bool rx_tail_value_not_stable;
|
||||||
static volatile uint16_t rx_tail_value_backup;
|
static volatile uint16_t rx_tail_value_backup;
|
||||||
|
|
||||||
static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value);
|
FORCE_INLINE static void atomic_set_rx_tail(ring_buffer_pos_t value);
|
||||||
static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail();
|
FORCE_INLINE static ring_buffer_pos_t atomic_read_rx_tail();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
FORCE_INLINE static void store_rxd_char();
|
FORCE_INLINE static void store_rxd_char();
|
||||||
FORCE_INLINE static void _tx_udr_empty_irq();
|
FORCE_INLINE static void _tx_udr_empty_irq();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarlinSerial() {};
|
|
||||||
static void begin(const long);
|
static void begin(const long);
|
||||||
static void end();
|
static void end();
|
||||||
static int peek();
|
static int peek();
|
||||||
@ -221,41 +216,13 @@
|
|||||||
static ring_buffer_pos_t get_tx_buffer_free();
|
static ring_buffer_pos_t get_tx_buffer_free();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
enum { HasEmergencyParser = Cfg::EMERGENCYPARSER };
|
||||||
|
static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = BYTE);
|
|
||||||
static void print(unsigned char, int = BYTE);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = BYTE);
|
|
||||||
static void println(unsigned char, int = BYTE);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
@ -270,12 +237,18 @@
|
|||||||
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS);
|
||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
#ifdef SERIAL_PORT_3
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // !USBCON
|
#endif // !USBCON
|
||||||
@ -284,17 +257,18 @@
|
|||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct MMU2SerialCfg {
|
struct MMU2SerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
|
static constexpr unsigned int RX_SIZE = 32;
|
||||||
|
static constexpr unsigned int TX_SIZE = 32;
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = false;
|
static constexpr bool EMERGENCYPARSER = false;
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
static constexpr unsigned int RX_SIZE = 32;
|
|
||||||
static constexpr unsigned int TX_SIZE = 32;
|
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
static constexpr bool RX_OVERRUNS = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>> mmuSerial;
|
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2;
|
||||||
|
extern MSerialMMU2 mmuSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
@ -302,31 +276,22 @@
|
|||||||
template <uint8_t serial>
|
template <uint8_t serial>
|
||||||
struct LCDSerialCfg {
|
struct LCDSerialCfg {
|
||||||
static constexpr int PORT = serial;
|
static constexpr int PORT = serial;
|
||||||
|
static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64);
|
||||||
|
static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128);
|
||||||
static constexpr bool XONOFF = false;
|
static constexpr bool XONOFF = false;
|
||||||
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER);
|
||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
#if HAS_DGUS_LCD
|
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
||||||
static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE;
|
|
||||||
static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE;
|
|
||||||
static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
|
||||||
#elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON)
|
|
||||||
static constexpr unsigned int RX_SIZE = 64;
|
|
||||||
static constexpr unsigned int TX_SIZE = 128;
|
|
||||||
static constexpr bool RX_OVERRUNS = false;
|
|
||||||
#else
|
|
||||||
static constexpr unsigned int RX_SIZE = 64;
|
|
||||||
static constexpr unsigned int TX_SIZE = 128;
|
|
||||||
static constexpr bool RX_OVERRUNS = false
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MarlinSerial<LCDSerialCfg<LCD_SERIAL_PORT>> lcdSerial;
|
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
||||||
|
extern MSerialLCD lcdSerial;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use the UART for Bluetooth in AT90USB configurations
|
// Use the UART for Bluetooth in AT90USB configurations
|
||||||
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
#if defined(USBCON) && ENABLED(BLUETOOTH)
|
||||||
extern HardwareSerial bluetoothSerial;
|
typedef Serial1Class<HardwareSerial> MSerialBT;
|
||||||
|
extern MSerialBT bluetoothSerial;
|
||||||
#endif
|
#endif
|
||||||
|
@ -66,27 +66,26 @@ static volatile int8_t Channel[_Nbr_16timers]; // counter for the s
|
|||||||
|
|
||||||
/************ static functions common to all instances ***********************/
|
/************ static functions common to all instances ***********************/
|
||||||
|
|
||||||
static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
|
static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
|
||||||
if (Channel[timer] < 0)
|
int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
|
||||||
*TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer
|
if (cho < 0) // Channel -1 indicates the refresh interval completed...
|
||||||
else {
|
*TCNTn = 0; // ...so reset the timer
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive)
|
else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
|
||||||
}
|
|
||||||
|
|
||||||
Channel[timer]++; // increment to the next channel
|
Channel[timer] = ++cho; // Handle the next channel (or 0)
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) {
|
if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
|
||||||
*OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks;
|
*OCRnA = *TCNTn + SERVO(timer, cho).ticks; // set compare to current ticks plus duration
|
||||||
if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated
|
if (SERVO(timer, cho).Pin.isActive) // activated?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// finished all channels so wait for the refresh period to expire before starting over
|
// finished all channels so wait for the refresh period to expire before starting over
|
||||||
if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed
|
const unsigned int cval = ((unsigned)*TCNTn) + 32 / (SERVO_TIMER_PRESCALER), // allow 32 cycles to ensure the next OCR1A not missed
|
||||||
*OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL);
|
ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
|
||||||
else
|
*OCRnA = max(cval, ival);
|
||||||
*OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed
|
|
||||||
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel
|
Channel[timer] = -1; // reset the timer counter to 0 on the next call
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,9 +122,12 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t
|
|||||||
|
|
||||||
/****************** end of static functions ******************************/
|
/****************** end of static functions ******************************/
|
||||||
|
|
||||||
void initISR(timer16_Sequence_t timer) {
|
void initISR(const timer16_Sequence_t timer_index) {
|
||||||
|
switch (timer_index) {
|
||||||
|
default: break;
|
||||||
|
|
||||||
#ifdef _useTimer1
|
#ifdef _useTimer1
|
||||||
if (timer == _timer1) {
|
case _timer1:
|
||||||
TCCR1A = 0; // normal counting mode
|
TCCR1A = 0; // normal counting mode
|
||||||
TCCR1B = _BV(CS11); // set prescaler of 8
|
TCCR1B = _BV(CS11); // set prescaler of 8
|
||||||
TCNT1 = 0; // clear the timer count
|
TCNT1 = 0; // clear the timer count
|
||||||
@ -140,11 +142,11 @@ void initISR(timer16_Sequence_t timer) {
|
|||||||
#ifdef WIRING
|
#ifdef WIRING
|
||||||
timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
|
timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
|
||||||
#endif
|
#endif
|
||||||
}
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _useTimer3
|
#ifdef _useTimer3
|
||||||
if (timer == _timer3) {
|
case _timer3:
|
||||||
TCCR3A = 0; // normal counting mode
|
TCCR3A = 0; // normal counting mode
|
||||||
TCCR3B = _BV(CS31); // set prescaler of 8
|
TCCR3B = _BV(CS31); // set prescaler of 8
|
||||||
TCNT3 = 0; // clear the timer count
|
TCNT3 = 0; // clear the timer count
|
||||||
@ -158,56 +160,64 @@ void initISR(timer16_Sequence_t timer) {
|
|||||||
#ifdef WIRING
|
#ifdef WIRING
|
||||||
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
|
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
|
||||||
#endif
|
#endif
|
||||||
}
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _useTimer4
|
#ifdef _useTimer4
|
||||||
if (timer == _timer4) {
|
case _timer4:
|
||||||
TCCR4A = 0; // normal counting mode
|
TCCR4A = 0; // normal counting mode
|
||||||
TCCR4B = _BV(CS41); // set prescaler of 8
|
TCCR4B = _BV(CS41); // set prescaler of 8
|
||||||
TCNT4 = 0; // clear the timer count
|
TCNT4 = 0; // clear the timer count
|
||||||
TIFR4 = _BV(OCF4A); // clear any pending interrupts;
|
TIFR4 = _BV(OCF4A); // clear any pending interrupts;
|
||||||
TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
|
TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
|
||||||
}
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _useTimer5
|
#ifdef _useTimer5
|
||||||
if (timer == _timer5) {
|
case _timer5:
|
||||||
TCCR5A = 0; // normal counting mode
|
TCCR5A = 0; // normal counting mode
|
||||||
TCCR5B = _BV(CS51); // set prescaler of 8
|
TCCR5B = _BV(CS51); // set prescaler of 8
|
||||||
TCNT5 = 0; // clear the timer count
|
TCNT5 = 0; // clear the timer count
|
||||||
TIFR5 = _BV(OCF5A); // clear any pending interrupts;
|
TIFR5 = _BV(OCF5A); // clear any pending interrupts;
|
||||||
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
|
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
|
||||||
}
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void finISR(timer16_Sequence_t timer) {
|
void finISR(const timer16_Sequence_t timer_index) {
|
||||||
// Disable use of the given timer
|
// Disable use of the given timer
|
||||||
#ifdef WIRING
|
#ifdef WIRING
|
||||||
if (timer == _timer1) {
|
switch (timer_index) {
|
||||||
|
default: break;
|
||||||
|
|
||||||
|
case _timer1:
|
||||||
CBI(
|
CBI(
|
||||||
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
TIMSK1
|
TIMSK1
|
||||||
#else
|
#else
|
||||||
TIMSK
|
TIMSK
|
||||||
#endif
|
#endif
|
||||||
, OCIE1A); // disable timer 1 output compare interrupt
|
, OCIE1A // disable timer 1 output compare interrupt
|
||||||
|
);
|
||||||
timerDetach(TIMER1OUTCOMPAREA_INT);
|
timerDetach(TIMER1OUTCOMPAREA_INT);
|
||||||
}
|
break;
|
||||||
else if (timer == _timer3) {
|
|
||||||
|
case _timer3:
|
||||||
CBI(
|
CBI(
|
||||||
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
TIMSK3
|
TIMSK3
|
||||||
#else
|
#else
|
||||||
ETIMSK
|
ETIMSK
|
||||||
#endif
|
#endif
|
||||||
, OCIE3A); // disable the timer3 output compare A interrupt
|
, OCIE3A // disable the timer3 output compare A interrupt
|
||||||
|
);
|
||||||
timerDetach(TIMER3OUTCOMPAREA_INT);
|
timerDetach(TIMER3OUTCOMPAREA_INT);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#else // !WIRING
|
#else // !WIRING
|
||||||
// For arduino - in future: call here to a currently undefined function to reset the timer
|
// For arduino - in future: call here to a currently undefined function to reset the timer
|
||||||
UNUSED(timer);
|
UNUSED(timer_index);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,13 +40,13 @@ bool PersistentStore::access_start() { return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
|
@ -124,7 +124,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MAX_PIN);
|
pciSetup(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -132,7 +132,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X_MIN_PIN);
|
pciSetup(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -140,7 +140,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MAX_PIN);
|
pciSetup(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -148,7 +148,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y_MIN_PIN);
|
pciSetup(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -156,7 +156,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MAX_PIN);
|
pciSetup(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -164,15 +164,105 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PIN);
|
pciSetup(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if HAS_I_MAX
|
||||||
|
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_I_MIN
|
||||||
|
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(I_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(I_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_J_MAX
|
||||||
|
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_J_MIN
|
||||||
|
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(J_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(J_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_K_MAX
|
||||||
|
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_K_MIN
|
||||||
|
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(K_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(K_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_U_MAX
|
||||||
|
#if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(U_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(U_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_U_MIN
|
||||||
|
#if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(U_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(U_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_V_MAX
|
||||||
|
#if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(V_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(V_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_V_MIN
|
||||||
|
#if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(V_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(V_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if HAS_W_MAX
|
||||||
|
#if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(W_MAX_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
|
||||||
|
pciSetup(W_MAX_PIN);
|
||||||
|
#endif
|
||||||
|
#elif HAS_W_MIN
|
||||||
|
#if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
|
_ATTACH(W_MIN_PIN);
|
||||||
|
#else
|
||||||
|
static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
|
||||||
|
pciSetup(W_MIN_PIN);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if HAS_X2_MAX
|
#if HAS_X2_MAX
|
||||||
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MAX_PIN);
|
_ATTACH(X2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MAX_PIN);
|
pciSetup(X2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -180,7 +270,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MIN_PIN);
|
_ATTACH(X2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(X2_MIN_PIN);
|
pciSetup(X2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -188,7 +278,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MAX_PIN);
|
_ATTACH(Y2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MAX_PIN);
|
pciSetup(Y2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -196,7 +286,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MIN_PIN);
|
_ATTACH(Y2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Y2_MIN_PIN);
|
pciSetup(Y2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -204,7 +294,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MAX_PIN);
|
pciSetup(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -212,7 +302,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z2_MIN_PIN);
|
pciSetup(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -220,7 +310,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MAX_PIN);
|
pciSetup(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -228,7 +318,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z3_MIN_PIN);
|
pciSetup(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -236,7 +326,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MAX_PIN);
|
pciSetup(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -244,7 +334,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z4_MIN_PIN);
|
pciSetup(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -252,7 +342,7 @@ void setup_endstop_interrupts() {
|
|||||||
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(Z_MIN_PROBE_PIN);
|
pciSetup(Z_MIN_PROBE_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -21,11 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef __AVR__
|
#ifdef __AVR__
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM
|
|
||||||
|
|
||||||
#include "HAL.h"
|
|
||||||
|
|
||||||
struct Timer {
|
struct Timer {
|
||||||
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
|
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
|
||||||
@ -33,250 +29,194 @@ struct Timer {
|
|||||||
volatile uint16_t* ICRn; // max 1 ICR register per timer
|
volatile uint16_t* ICRn; // max 1 ICR register per timer
|
||||||
uint8_t n; // the timer number [0->5]
|
uint8_t n; // the timer number [0->5]
|
||||||
uint8_t q; // the timer output [0->2] (A->C)
|
uint8_t q; // the timer output [0->2] (A->C)
|
||||||
|
bool isPWM; // True if pin is a "hardware timer"
|
||||||
|
bool isProtected; // True if timer is protected
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Macros for the Timer structure
|
||||||
|
#define _SET_WGMnQ(T, V) do{ \
|
||||||
|
*(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \
|
||||||
|
*(T.TCCRnQ)[1] = (*(T.TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \
|
||||||
|
}while(0)
|
||||||
|
|
||||||
|
// Set TCCR CS bits
|
||||||
|
#define _SET_CSn(T, V) (*(T.TCCRnQ)[1] = (*(T.TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0))
|
||||||
|
|
||||||
|
// Set TCCR COM bits
|
||||||
|
#define _SET_COMnQ(T, Q, V) (*(T.TCCRnQ)[0] = (*(T.TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q))))
|
||||||
|
|
||||||
|
// Set OCRnQ register
|
||||||
|
#define _SET_OCRnQ(T, Q, V) (*(T.OCRnQ)[Q] = int(V) & 0xFFFF)
|
||||||
|
|
||||||
|
// Set ICRn register (one per timer)
|
||||||
|
#define _SET_ICRn(T, V) (*(T.ICRn) = int(V) & 0xFFFF)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get_pwm_timer
|
* Return a Timer struct describing a pin's timer.
|
||||||
* Get the timer information and register of the provided pin.
|
|
||||||
* Return a Timer struct containing this information.
|
|
||||||
* Used by set_pwm_frequency, set_pwm_duty
|
|
||||||
*/
|
*/
|
||||||
Timer get_pwm_timer(const pin_t pin) {
|
const Timer get_pwm_timer(const pin_t pin) {
|
||||||
|
|
||||||
uint8_t q = 0;
|
uint8_t q = 0;
|
||||||
|
|
||||||
switch (digitalPinToTimer(pin)) {
|
switch (digitalPinToTimer(pin)) {
|
||||||
// Protect reserved timers (TIMER0 & TIMER1)
|
|
||||||
#ifdef TCCR0A
|
#ifdef TCCR0A
|
||||||
#if !AVR_AT90USB1286_FAMILY
|
IF_DISABLED(AVR_AT90USB1286_FAMILY, case TIMER0A:)
|
||||||
case TIMER0A:
|
|
||||||
#endif
|
|
||||||
case TIMER0B:
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCCR1A
|
#ifdef TCCR1A
|
||||||
case TIMER1A: case TIMER1B:
|
case TIMER1A: case TIMER1B:
|
||||||
#endif
|
#endif
|
||||||
break;
|
|
||||||
#if defined(TCCR2) || defined(TCCR2A)
|
break; // Protect reserved timers (TIMER0 & TIMER1)
|
||||||
#ifdef TCCR2
|
|
||||||
case TIMER2: {
|
#ifdef TCCR0A
|
||||||
Timer timer = {
|
case TIMER0B: // Protected timer, but allow setting the duty cycle on OCR0B for pin D4 only
|
||||||
/*TCCRnQ*/ { &TCCR2, nullptr, nullptr },
|
return Timer({ { &TCCR0A, nullptr, nullptr }, { (uint16_t*)&OCR0A, (uint16_t*)&OCR0B, nullptr }, nullptr, 0, 1, true, true });
|
||||||
/*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr },
|
#endif
|
||||||
/*ICRn*/ nullptr,
|
|
||||||
/*n, q*/ 2, 0
|
#if HAS_TCCR2
|
||||||
};
|
case TIMER2:
|
||||||
}
|
return Timer({ { &TCCR2, nullptr, nullptr }, { (uint16_t*)&OCR2, nullptr, nullptr }, nullptr, 2, 0, true, false });
|
||||||
|
#elif ENABLED(USE_OCR2A_AS_TOP)
|
||||||
|
case TIMER2A: break; // Protect TIMER2A since its OCR is used by TIMER2B
|
||||||
|
case TIMER2B:
|
||||||
|
return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, 1, true, false });
|
||||||
#elif defined(TCCR2A)
|
#elif defined(TCCR2A)
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
case TIMER2B: ++q; case TIMER2A:
|
||||||
case TIMER2A: break; // protect TIMER2A
|
return Timer({ { &TCCR2A, &TCCR2B, nullptr }, { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, nullptr, 2, q, true, false });
|
||||||
case TIMER2B: {
|
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
|
|
||||||
/*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
|
|
||||||
/*ICRn*/ nullptr,
|
|
||||||
/*n, q*/ 2, 1
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
case TIMER2B: ++q;
|
|
||||||
case TIMER2A: {
|
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr },
|
|
||||||
/*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr },
|
|
||||||
/*ICRn*/ nullptr,
|
|
||||||
2, q
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OCR3C
|
#ifdef OCR3C
|
||||||
case TIMER3C: ++q;
|
case TIMER3C: ++q; case TIMER3B: ++q; case TIMER3A:
|
||||||
case TIMER3B: ++q;
|
return Timer({ { &TCCR3A, &TCCR3B, &TCCR3C }, { &OCR3A, &OCR3B, &OCR3C }, &ICR3, 3, q, true, false });
|
||||||
case TIMER3A: {
|
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C },
|
|
||||||
/*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C },
|
|
||||||
/*ICRn*/ &ICR3,
|
|
||||||
/*n, q*/ 3, q
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#elif defined(OCR3B)
|
#elif defined(OCR3B)
|
||||||
case TIMER3B: ++q;
|
case TIMER3B: ++q; case TIMER3A:
|
||||||
case TIMER3A: {
|
return Timer({ { &TCCR3A, &TCCR3B, nullptr }, { &OCR3A, &OCR3B, nullptr }, &ICR3, 3, q, true, false });
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR3A, &TCCR3B, nullptr },
|
|
||||||
/*OCRnQ*/ { &OCR3A, &OCR3B, nullptr },
|
|
||||||
/*ICRn*/ &ICR3,
|
|
||||||
/*n, q*/ 3, q
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TCCR4A
|
#ifdef TCCR4A
|
||||||
case TIMER4C: ++q;
|
case TIMER4C: ++q; case TIMER4B: ++q; case TIMER4A:
|
||||||
case TIMER4B: ++q;
|
return Timer({ { &TCCR4A, &TCCR4B, &TCCR4C }, { &OCR4A, &OCR4B, &OCR4C }, &ICR4, 4, q, true, false });
|
||||||
case TIMER4A: {
|
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C },
|
|
||||||
/*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C },
|
|
||||||
/*ICRn*/ &ICR4,
|
|
||||||
/*n, q*/ 4, q
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef TCCR5A
|
#ifdef TCCR5A
|
||||||
case TIMER5C: ++q;
|
case TIMER5C: ++q; case TIMER5B: ++q; case TIMER5A:
|
||||||
case TIMER5B: ++q;
|
return Timer({ { &TCCR5A, &TCCR5B, &TCCR5C }, { &OCR5A, &OCR5B, &OCR5C }, &ICR5, 5, q, true, false });
|
||||||
case TIMER5A: {
|
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C },
|
|
||||||
/*OCRnQ*/ { &OCR5A, &OCR5B, &OCR5C },
|
|
||||||
/*ICRn*/ &ICR5,
|
|
||||||
/*n, q*/ 5, q
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
Timer timer = {
|
|
||||||
/*TCCRnQ*/ { nullptr, nullptr, nullptr },
|
return Timer();
|
||||||
/*OCRnQ*/ { nullptr, nullptr, nullptr },
|
|
||||||
/*ICRn*/ nullptr,
|
|
||||||
0, 0
|
|
||||||
};
|
|
||||||
return timer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_pwm_frequency(const pin_t pin, int f_desired) {
|
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
||||||
Timer timer = get_pwm_timer(pin);
|
const Timer timer = get_pwm_timer(pin);
|
||||||
if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
|
if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
|
||||||
uint16_t size;
|
|
||||||
if (timer.n == 2) size = 255; else size = 65535;
|
|
||||||
|
|
||||||
uint16_t res = 255; // resolution (TOP value)
|
const bool is_timer2 = timer.n == 2;
|
||||||
uint8_t j = 0; // prescaler index
|
const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
|
||||||
uint8_t wgm = 1; // waveform generation mode
|
|
||||||
|
uint16_t res = 0xFF; // resolution (TOP value)
|
||||||
|
uint8_t j = CS_NONE; // prescaler index
|
||||||
|
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
|
||||||
|
|
||||||
// Calculating the prescaler and resolution to use to achieve closest frequency
|
// Calculating the prescaler and resolution to use to achieve closest frequency
|
||||||
if (f_desired != 0) {
|
if (f_desired != 0) {
|
||||||
int f = (F_CPU) / (2 * 1024 * size) + 1; // Initialize frequency as lowest (non-zero) achievable
|
constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
|
||||||
uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 };
|
uint16_t f = (F_CPU) / (2 * 1024 * maxtop) + 1; // Start with the lowest non-zero frequency achievable (1 or 31)
|
||||||
|
|
||||||
// loop over prescaler values
|
LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values
|
||||||
LOOP_S_L_N(i, 1, 8) {
|
const uint16_t p = prescaler[i];
|
||||||
uint16_t res_temp_fast = 255, res_temp_phase_correct = 255;
|
uint16_t res_fast_temp, res_pc_temp;
|
||||||
if (timer.n == 2) {
|
if (is_timer2) {
|
||||||
// No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
|
#if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
const uint16_t rft = (F_CPU) / (p * f_desired);
|
||||||
const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired);
|
res_fast_temp = rft - 1;
|
||||||
res_temp_fast = rtf - 1;
|
res_pc_temp = rft / 2;
|
||||||
res_temp_phase_correct = rtf / 2;
|
#else
|
||||||
|
res_fast_temp = res_pc_temp = maxtop;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Skip TIMER2 specific prescalers when not TIMER2
|
if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
|
||||||
if (i == 3 || i == 5) continue;
|
const uint16_t rft = (F_CPU) / (p * f_desired);
|
||||||
const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired);
|
res_fast_temp = rft - 1;
|
||||||
res_temp_fast = rtf - 1;
|
res_pc_temp = rft / 2;
|
||||||
res_temp_phase_correct = rtf / 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LIMIT(res_temp_fast, 1u, size);
|
LIMIT(res_fast_temp, 1U, maxtop);
|
||||||
LIMIT(res_temp_phase_correct, 1u, size);
|
LIMIT(res_pc_temp, 1U, maxtop);
|
||||||
|
|
||||||
// Calculate frequencies of test prescaler and resolution values
|
// Calculate frequencies of test prescaler and resolution values
|
||||||
const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)),
|
const uint16_t f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
|
||||||
f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct),
|
f_pc_temp = (F_CPU) / (2 * p * res_pc_temp);
|
||||||
f_diff = ABS(f - f_desired),
|
const int f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
|
||||||
f_fast_diff = ABS(f_temp_fast - f_desired),
|
f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
|
||||||
f_phase_diff = ABS(f_temp_phase_correct - f_desired);
|
f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
|
||||||
|
|
||||||
// If FAST values are closest to desired f
|
if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
|
||||||
if (f_fast_diff < f_diff && f_fast_diff <= f_phase_diff) {
|
|
||||||
// Remember this combination
|
|
||||||
f = f_temp_fast;
|
|
||||||
res = res_temp_fast;
|
|
||||||
j = i;
|
|
||||||
// Set the Wave Generation Mode to FAST PWM
|
// Set the Wave Generation Mode to FAST PWM
|
||||||
if (timer.n == 2) {
|
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
|
||||||
wgm = (
|
// Remember this combination
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
f = f_fast_temp; res = res_fast_temp; j = i + 1;
|
||||||
WGM2_FAST_PWM_OCR2A
|
|
||||||
#else
|
|
||||||
WGM2_FAST_PWM
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else wgm = WGM_FAST_PWM_ICRn;
|
else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
|
||||||
}
|
|
||||||
// If PHASE CORRECT values are closes to desired f
|
|
||||||
else if (f_phase_diff < f_diff) {
|
|
||||||
f = f_temp_phase_correct;
|
|
||||||
res = res_temp_phase_correct;
|
|
||||||
j = i;
|
|
||||||
// Set the Wave Generation Mode to PWM PHASE CORRECT
|
// Set the Wave Generation Mode to PWM PHASE CORRECT
|
||||||
if (timer.n == 2) {
|
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
|
||||||
wgm = (
|
f = f_pc_temp; res = res_pc_temp; j = i + 1;
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
|
||||||
WGM2_PWM_PC_OCR2A
|
|
||||||
#else
|
|
||||||
WGM2_PWM_PC
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else wgm = WGM_PWM_PC_ICRn;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_SET_WGMnQ(timer.TCCRnQ, wgm);
|
|
||||||
_SET_CSn(timer.TCCRnQ, j);
|
|
||||||
|
|
||||||
if (timer.n == 2) {
|
_SET_WGMnQ(timer, wgm);
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
_SET_CSn(timer, j);
|
||||||
_SET_OCRnQ(timer.OCRnQ, 0, res); // Set OCR2A value (TOP) = res
|
|
||||||
#endif
|
if (is_timer2) {
|
||||||
|
TERN_(USE_OCR2A_AS_TOP, _SET_OCRnQ(timer, 0, res)); // Set OCR2A value (TOP) = res
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res
|
_SET_ICRn(timer, res); // Set ICRn value (TOP) = res
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
|
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) {
|
||||||
// If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
|
// If v is 0 or v_size (max), digitalWrite to LOW or HIGH.
|
||||||
// Note that digitalWrite also disables pwm output for us (sets COM bit to 0)
|
// Note that digitalWrite also disables PWM output for us (sets COM bit to 0)
|
||||||
if (v == 0)
|
if (v == 0)
|
||||||
digitalWrite(pin, invert);
|
digitalWrite(pin, invert);
|
||||||
else if (v == v_size)
|
else if (v == v_size)
|
||||||
digitalWrite(pin, !invert);
|
digitalWrite(pin, !invert);
|
||||||
else {
|
else {
|
||||||
Timer timer = get_pwm_timer(pin);
|
const Timer timer = get_pwm_timer(pin);
|
||||||
if (timer.n == 0) return; // Don't proceed if protected timer or not recognised
|
if (timer.isPWM) {
|
||||||
// Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted)
|
if (timer.n == 0) {
|
||||||
_SET_COMnQ(timer.TCCRnQ, (timer.q
|
_SET_COMnQ(timer, timer.q, COM_CLEAR_SET); // Only allow a TIMER0B select...
|
||||||
#ifdef TCCR2
|
_SET_OCRnQ(timer, timer.q, v); // ...and OCR0B duty update. For output pin D4 no frequency changes are permitted.
|
||||||
+ (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro
|
}
|
||||||
#endif
|
else if (!timer.isProtected) {
|
||||||
), COM_CLEAR_SET + invert
|
const uint16_t top = timer.n == 2 ? TERN(USE_OCR2A_AS_TOP, *timer.OCRnQ[0], 255) : *timer.ICRn;
|
||||||
);
|
_SET_COMnQ(timer, SUM_TERN(HAS_TCCR2, timer.q, timer.q == 2), COM_CLEAR_SET + invert); // COM20 is on bit 4 of TCCR2, so +1 for q==2
|
||||||
|
_SET_OCRnQ(timer, timer.q, uint16_t(uint32_t(v) * top / v_size)); // Scale 8/16-bit v to top value
|
||||||
uint16_t top;
|
}
|
||||||
if (timer.n == 2) { // if TIMER2
|
|
||||||
top = (
|
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP)
|
|
||||||
*timer.OCRnQ[0] // top = OCR2A
|
|
||||||
#else
|
|
||||||
255 // top = 0xFF (max)
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
top = *timer.ICRn; // top = ICRn
|
digitalWrite(pin, v < v_size / 2 ? LOW : HIGH);
|
||||||
|
|
||||||
_SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // NEEDS_HARDWARE_PWM
|
void MarlinHAL::init_pwm_timers() {
|
||||||
|
// Init some timer frequencies to a default 1KHz
|
||||||
|
const pin_t pwm_pin[] = {
|
||||||
|
#ifdef __AVR_ATmega2560__
|
||||||
|
10, 5, 6, 46
|
||||||
|
#elif defined(__AVR_ATmega1280__)
|
||||||
|
12, 31
|
||||||
|
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284__)
|
||||||
|
15, 6
|
||||||
|
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_mega64) || defined(__AVR_mega128)
|
||||||
|
16, 24
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
LOOP_L_N(i, COUNT(pwm_pin))
|
||||||
|
set_pwm_frequency(pwm_pin[i], 1000);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
@ -241,11 +241,11 @@ uint8_t extDigitalRead(const int8_t pin) {
|
|||||||
*
|
*
|
||||||
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
||||||
*/
|
*/
|
||||||
uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) {
|
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
|
||||||
float count = 0;
|
float count = 0;
|
||||||
if (hz > 0 && (dca || dcb || dcc)) {
|
if (hz > 0 && (dca || dcb || dcc)) {
|
||||||
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||||
uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31)
|
uint16_t prescaler; // Range of 30.5Hz (65535) 64.5kHz (>31)
|
||||||
|
|
||||||
if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
|
if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); }
|
||||||
else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
|
else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); }
|
||||||
@ -267,17 +267,17 @@ uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb,
|
|||||||
SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
|
SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP
|
||||||
|
|
||||||
//SERIAL_ECHOLNPGM("Timer 5 Settings:");
|
//SERIAL_ECHOLNPGM("Timer 5 Settings:");
|
||||||
//SERIAL_ECHOLNPAIR(" Prescaler=", prescaler);
|
//SERIAL_ECHOLNPGM(" Prescaler=", prescaler);
|
||||||
//SERIAL_ECHOLNPAIR(" TOP=", ICR5);
|
//SERIAL_ECHOLNPGM(" TOP=", ICR5);
|
||||||
//SERIAL_ECHOLNPAIR(" OCR5A=", OCR5A);
|
//SERIAL_ECHOLNPGM(" OCR5A=", OCR5A);
|
||||||
//SERIAL_ECHOLNPAIR(" OCR5B=", OCR5B);
|
//SERIAL_ECHOLNPGM(" OCR5B=", OCR5B);
|
||||||
//SERIAL_ECHOLNPAIR(" OCR5C=", OCR5C);
|
//SERIAL_ECHOLNPGM(" OCR5C=", OCR5C);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Restore the default for Timer 5
|
// Restore the default for Timer 5
|
||||||
SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
|
SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct)
|
||||||
SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
|
SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing
|
||||||
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250KHz
|
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
||||||
OCR5A = OCR5B = OCR5C = 0;
|
OCR5A = OCR5B = OCR5C = 0;
|
||||||
}
|
}
|
||||||
return round(count);
|
return round(count);
|
||||||
|
@ -118,7 +118,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Waveform Generation Modes
|
// Waveform Generation Modes
|
||||||
enum WaveGenMode : char {
|
enum WaveGenMode : uint8_t {
|
||||||
WGM_NORMAL, // 0
|
WGM_NORMAL, // 0
|
||||||
WGM_PWM_PC_8, // 1
|
WGM_PWM_PC_8, // 1
|
||||||
WGM_PWM_PC_9, // 2
|
WGM_PWM_PC_9, // 2
|
||||||
@ -138,7 +138,7 @@ enum WaveGenMode : char {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Wavefore Generation Modes (Timer 2 only)
|
// Wavefore Generation Modes (Timer 2 only)
|
||||||
enum WaveGenMode2 : char {
|
enum WaveGenMode2 : uint8_t {
|
||||||
WGM2_NORMAL, // 0
|
WGM2_NORMAL, // 0
|
||||||
WGM2_PWM_PC, // 1
|
WGM2_PWM_PC, // 1
|
||||||
WGM2_CTC_OCR2A, // 2
|
WGM2_CTC_OCR2A, // 2
|
||||||
@ -150,7 +150,7 @@ enum WaveGenMode2 : char {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Compare Modes
|
// Compare Modes
|
||||||
enum CompareMode : char {
|
enum CompareMode : uint8_t {
|
||||||
COM_NORMAL, // 0
|
COM_NORMAL, // 0
|
||||||
COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL
|
COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL
|
||||||
COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down
|
COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down
|
||||||
@ -158,7 +158,7 @@ enum CompareMode : char {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Clock Sources
|
// Clock Sources
|
||||||
enum ClockSource : char {
|
enum ClockSource : uint8_t {
|
||||||
CS_NONE, // 0
|
CS_NONE, // 0
|
||||||
CS_PRESCALER_1, // 1
|
CS_PRESCALER_1, // 1
|
||||||
CS_PRESCALER_8, // 2
|
CS_PRESCALER_8, // 2
|
||||||
@ -170,7 +170,7 @@ enum ClockSource : char {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Clock Sources (Timer 2 only)
|
// Clock Sources (Timer 2 only)
|
||||||
enum ClockSource2 : char {
|
enum ClockSource2 : uint8_t {
|
||||||
CS2_NONE, // 0
|
CS2_NONE, // 0
|
||||||
CS2_PRESCALER_1, // 1
|
CS2_PRESCALER_1, // 1
|
||||||
CS2_PRESCALER_8, // 2
|
CS2_PRESCALER_8, // 2
|
||||||
@ -203,40 +203,33 @@ enum ClockSource2 : char {
|
|||||||
TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \
|
TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \
|
||||||
}while(0)
|
}while(0)
|
||||||
#define SET_WGM(T,V) _SET_WGM(T,WGM_##V)
|
#define SET_WGM(T,V) _SET_WGM(T,WGM_##V)
|
||||||
// Runtime (see set_pwm_frequency):
|
|
||||||
#define _SET_WGMnQ(TCCRnQ, V) do{ \
|
|
||||||
*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \
|
|
||||||
*(TCCRnQ)[1] = (*(TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
// Set Clock Select bits
|
// Set Clock Select bits
|
||||||
// Ex: SET_CS3(PRESCALER_64);
|
// Ex: SET_CS3(PRESCALER_64);
|
||||||
|
#ifdef TCCR2
|
||||||
|
#define HAS_TCCR2 1
|
||||||
|
#endif
|
||||||
#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0))
|
#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0))
|
||||||
#define _SET_CS0(V) _SET_CS(0,V)
|
#define _SET_CS0(V) _SET_CS(0,V)
|
||||||
#define _SET_CS1(V) _SET_CS(1,V)
|
#define _SET_CS1(V) _SET_CS(1,V)
|
||||||
#ifdef TCCR2
|
|
||||||
#define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20))
|
|
||||||
#else
|
|
||||||
#define _SET_CS2(V) _SET_CS(2,V)
|
|
||||||
#endif
|
|
||||||
#define _SET_CS3(V) _SET_CS(3,V)
|
#define _SET_CS3(V) _SET_CS(3,V)
|
||||||
#define _SET_CS4(V) _SET_CS(4,V)
|
#define _SET_CS4(V) _SET_CS(4,V)
|
||||||
#define _SET_CS5(V) _SET_CS(5,V)
|
#define _SET_CS5(V) _SET_CS(5,V)
|
||||||
#define SET_CS0(V) _SET_CS0(CS_##V)
|
#define SET_CS0(V) _SET_CS0(CS_##V)
|
||||||
#define SET_CS1(V) _SET_CS1(CS_##V)
|
#define SET_CS1(V) _SET_CS1(CS_##V)
|
||||||
#ifdef TCCR2
|
|
||||||
|
#if HAS_TCCR2
|
||||||
|
#define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20))
|
||||||
#define SET_CS2(V) _SET_CS2(CS2_##V)
|
#define SET_CS2(V) _SET_CS2(CS2_##V)
|
||||||
#else
|
#else
|
||||||
|
#define _SET_CS2(V) _SET_CS(2,V)
|
||||||
#define SET_CS2(V) _SET_CS2(CS_##V)
|
#define SET_CS2(V) _SET_CS2(CS_##V)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SET_CS3(V) _SET_CS3(CS_##V)
|
#define SET_CS3(V) _SET_CS3(CS_##V)
|
||||||
#define SET_CS4(V) _SET_CS4(CS_##V)
|
#define SET_CS4(V) _SET_CS4(CS_##V)
|
||||||
#define SET_CS5(V) _SET_CS5(CS_##V)
|
#define SET_CS5(V) _SET_CS5(CS_##V)
|
||||||
#define SET_CS(T,V) SET_CS##T(V)
|
#define SET_CS(T,V) SET_CS##T(V)
|
||||||
// Runtime (see set_pwm_frequency)
|
|
||||||
#define _SET_CSn(TCCRnQ, V) do{ \
|
|
||||||
(*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0)); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
// Set Compare Mode bits
|
// Set Compare Mode bits
|
||||||
// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET);
|
// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET);
|
||||||
@ -246,22 +239,6 @@ enum ClockSource2 : char {
|
|||||||
#define SET_COMB(T,V) SET_COM(T,B,V)
|
#define SET_COMB(T,V) SET_COM(T,B,V)
|
||||||
#define SET_COMC(T,V) SET_COM(T,C,V)
|
#define SET_COMC(T,V) SET_COM(T,C,V)
|
||||||
#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0)
|
#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0)
|
||||||
// Runtime (see set_pwm_duty)
|
|
||||||
#define _SET_COMnQ(TCCRnQ, Q, V) do{ \
|
|
||||||
(*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q)))); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
// Set OCRnQ register
|
|
||||||
// Runtime (see set_pwm_duty):
|
|
||||||
#define _SET_OCRnQ(OCRnQ, Q, V) do{ \
|
|
||||||
(*(OCRnQ)[(Q)] = (0x0000) | (int(V) & 0xFFFF)); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
// Set ICRn register (one per timer)
|
|
||||||
// Runtime (see set_pwm_frequency)
|
|
||||||
#define _SET_ICRn(ICRn, V) do{ \
|
|
||||||
(*(ICRn) = (0x0000) | (int(V) & 0xFFFF)); \
|
|
||||||
}while(0)
|
|
||||||
|
|
||||||
// Set Noise Canceler bit
|
// Set Noise Canceler bit
|
||||||
// Ex: SET_ICNC(2,1)
|
// Ex: SET_ICNC(2,1)
|
||||||
@ -284,8 +261,8 @@ enum ClockSource2 : char {
|
|||||||
* PWM availability macros
|
* PWM availability macros
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Determine which harware PWMs are already in use
|
// Determine which hardware PWMs are already in use
|
||||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN)
|
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
||||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
#if PIN_EXISTS(CONTROLLER_FAN)
|
||||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
||||||
#else
|
#else
|
||||||
@ -316,11 +293,11 @@ enum ClockSource2 : char {
|
|||||||
|
|
||||||
#if HAS_MOTOR_CURRENT_PWM
|
#if HAS_MOTOR_CURRENT_PWM
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY)
|
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_E0 || P == MOTOR_CURRENT_PWM_E1 || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY)
|
||||||
#elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
#elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z)
|
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_E0 || P == MOTOR_CURRENT_PWM_E1 || P == MOTOR_CURRENT_PWM_Z)
|
||||||
#else
|
#else
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E)
|
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_E0 || P == MOTOR_CURRENT_PWM_E1)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) false
|
#define PWM_CHK_MOTOR_CURRENT(P) false
|
||||||
|
@ -25,25 +25,67 @@
|
|||||||
* Test AVR-specific configuration values for errors at compile-time.
|
* Test AVR-specific configuration values for errors at compile-time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for common serial pin conflicts
|
||||||
|
*/
|
||||||
|
#define CHECK_SERIAL_PIN(N) ( \
|
||||||
|
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|
||||||
|
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|
||||||
|
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|
||||||
|
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|
||||||
|
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|
||||||
|
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|
||||||
|
|| BTN_EN1 == N || BTN_EN2 == N \
|
||||||
|
)
|
||||||
|
#if SERIAL_IN_USE(0)
|
||||||
|
// D0-D1. No known conflicts.
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(1)
|
||||||
|
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
|
||||||
|
#if CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19)
|
||||||
|
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11)
|
||||||
|
#error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
|
||||||
|
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
|
||||||
|
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#undef CHECK_SERIAL_PIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks for FAST PWM
|
* Checks for FAST PWM
|
||||||
*/
|
*/
|
||||||
#if ENABLED(FAST_PWM_FAN) && (ENABLED(USE_OCR2A_AS_TOP) && defined(TCCR2))
|
#if ALL(FAST_PWM_FAN, USE_OCR2A_AS_TOP, HAS_TCCR2)
|
||||||
#error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2"
|
#error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for SOFT PWM
|
||||||
|
*/
|
||||||
|
#if HAS_FAN0 && FAN_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
|
||||||
|
#error "FAN_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
|
||||||
|
#error "Disable SPEAKER or enable FAN_SOFT_PWM."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanity checks for Spindle / Laser PWM
|
* Sanity checks for Spindle / Laser PWM
|
||||||
*/
|
*/
|
||||||
#if ENABLED(SPINDLE_LASER_PWM)
|
#if ENABLED(SPINDLE_LASER_USE_PWM)
|
||||||
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
|
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
|
||||||
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
|
||||||
#elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
#elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5)
|
||||||
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
|
||||||
#endif
|
#endif
|
||||||
#elif defined(SPINDLE_LASER_FREQUENCY)
|
#elif SPINDLE_LASER_FREQUENCY
|
||||||
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM."
|
#error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,3 +98,14 @@
|
|||||||
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
||||||
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Postmortem debugging
|
||||||
|
*/
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
#error "POSTMORTEM_DEBUGGING is not supported on AVR boards."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USING_PULLDOWNS
|
||||||
|
#error "PULLDOWN pin mode is not available on AVR boards."
|
||||||
|
#endif
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
// C B A is longIn1
|
// C B A is longIn1
|
||||||
// D C B A is longIn2
|
// D C B A is longIn2
|
||||||
//
|
//
|
||||||
static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
|
FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
|
||||||
uint8_t tmp1;
|
uint8_t tmp1;
|
||||||
uint8_t tmp2;
|
uint8_t tmp2;
|
||||||
uint16_t intRes;
|
uint16_t intRes;
|
||||||
@ -89,7 +89,7 @@ static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2
|
|||||||
// uses:
|
// uses:
|
||||||
// r26 to store 0
|
// r26 to store 0
|
||||||
// r27 to store the byte 1 of the 24 bit result
|
// r27 to store the byte 1 of the 24 bit result
|
||||||
static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) {
|
FORCE_INLINE static uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) {
|
||||||
uint8_t tmp;
|
uint8_t tmp;
|
||||||
uint16_t intRes;
|
uint16_t intRes;
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@ -38,7 +41,7 @@
|
|||||||
// portModeRegister takes a different argument
|
// portModeRegister takes a different argument
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p)
|
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||||
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||||
|
|
||||||
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
||||||
@ -71,7 +74,7 @@
|
|||||||
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
void PRINT_ARRAY_NAME(uint8_t x) {
|
void PRINT_ARRAY_NAME(uint8_t x) {
|
||||||
char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name);
|
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
|
||||||
LOOP_L_N(y, MAX_NAME_LENGTH) {
|
LOOP_L_N(y, MAX_NAME_LENGTH) {
|
||||||
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
||||||
if (temp_char != 0)
|
if (temp_char != 0)
|
||||||
@ -99,7 +102,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
|
|||||||
return true; \
|
return true; \
|
||||||
} else return false
|
} else return false
|
||||||
|
|
||||||
|
#define ABTEST(N) defined(TCCR##N##A) && defined(COM##N##A1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print a pin's PWM status.
|
* Print a pin's PWM status.
|
||||||
@ -110,7 +113,7 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
|
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
|
|
||||||
#if defined(TCCR0A) && defined(COM0A1)
|
#if ABTEST(0)
|
||||||
#ifdef TIMER0A
|
#ifdef TIMER0A
|
||||||
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
|
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
|
||||||
PWM_CASE(0, A);
|
PWM_CASE(0, A);
|
||||||
@ -119,7 +122,7 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
PWM_CASE(0, B);
|
PWM_CASE(0, B);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR1A) && defined(COM1A1)
|
#if ABTEST(1)
|
||||||
PWM_CASE(1, A);
|
PWM_CASE(1, A);
|
||||||
PWM_CASE(1, B);
|
PWM_CASE(1, B);
|
||||||
#if defined(COM1C1) && defined(TIMER1C)
|
#if defined(COM1C1) && defined(TIMER1C)
|
||||||
@ -127,12 +130,12 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR2A) && defined(COM2A1)
|
#if ABTEST(2)
|
||||||
PWM_CASE(2, A);
|
PWM_CASE(2, A);
|
||||||
PWM_CASE(2, B);
|
PWM_CASE(2, B);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR3A) && defined(COM3A1)
|
#if ABTEST(3)
|
||||||
PWM_CASE(3, A);
|
PWM_CASE(3, A);
|
||||||
PWM_CASE(3, B);
|
PWM_CASE(3, B);
|
||||||
#ifdef COM3C1
|
#ifdef COM3C1
|
||||||
@ -146,7 +149,7 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
PWM_CASE(4, C);
|
PWM_CASE(4, C);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR5A) && defined(COM5A1)
|
#if ABTEST(5)
|
||||||
PWM_CASE(5, A);
|
PWM_CASE(5, A);
|
||||||
PWM_CASE(5, B);
|
PWM_CASE(5, B);
|
||||||
PWM_CASE(5, C);
|
PWM_CASE(5, C);
|
||||||
@ -163,16 +166,16 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
const volatile uint8_t* const PWM_other[][3] PROGMEM = {
|
const volatile uint8_t* const PWM_other[][3] PROGMEM = {
|
||||||
{ &TCCR0A, &TCCR0B, &TIMSK0 },
|
{ &TCCR0A, &TCCR0B, &TIMSK0 },
|
||||||
{ &TCCR1A, &TCCR1B, &TIMSK1 },
|
{ &TCCR1A, &TCCR1B, &TIMSK1 },
|
||||||
#if defined(TCCR2A) && defined(COM2A1)
|
#if ABTEST(2)
|
||||||
{ &TCCR2A, &TCCR2B, &TIMSK2 },
|
{ &TCCR2A, &TCCR2B, &TIMSK2 },
|
||||||
#endif
|
#endif
|
||||||
#if defined(TCCR3A) && defined(COM3A1)
|
#if ABTEST(3)
|
||||||
{ &TCCR3A, &TCCR3B, &TIMSK3 },
|
{ &TCCR3A, &TCCR3B, &TIMSK3 },
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCCR4A
|
#ifdef TCCR4A
|
||||||
{ &TCCR4A, &TCCR4B, &TIMSK4 },
|
{ &TCCR4A, &TCCR4B, &TIMSK4 },
|
||||||
#endif
|
#endif
|
||||||
#if defined(TCCR5A) && defined(COM5A1)
|
#if ABTEST(5)
|
||||||
{ &TCCR5A, &TCCR5B, &TIMSK5 },
|
{ &TCCR5A, &TCCR5B, &TIMSK5 },
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -192,11 +195,11 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
|||||||
{ (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 },
|
{ (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR2A) && defined(COM2A1)
|
#if ABTEST(2)
|
||||||
{ &OCR2A, &OCR2B, 0 },
|
{ &OCR2A, &OCR2B, 0 },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR3A) && defined(COM3A1)
|
#if ABTEST(3)
|
||||||
#ifdef COM3C1
|
#ifdef COM3C1
|
||||||
{ (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C },
|
{ (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C },
|
||||||
#else
|
#else
|
||||||
@ -208,7 +211,7 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
|||||||
{ (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C },
|
{ (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C },
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR5A) && defined(COM5A1)
|
#if ABTEST(5)
|
||||||
{ (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C },
|
{ (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C },
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -235,9 +238,9 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin");
|
|||||||
|
|
||||||
inline void com_print(const uint8_t N, const uint8_t Z) {
|
inline void com_print(const uint8_t N, const uint8_t Z) {
|
||||||
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
||||||
SERIAL_ECHOPGM(" COM");
|
SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
|
||||||
SERIAL_CHAR('0' + N, Z);
|
SERIAL_CHAR(Z);
|
||||||
SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
SERIAL_ECHOPGM(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03));
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
|
void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout
|
||||||
@ -247,8 +250,8 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1))));
|
||||||
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1);
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TIMER");
|
SERIAL_ECHOPGM(" TIMER", AS_DIGIT(T));
|
||||||
SERIAL_CHAR(T + '0', L);
|
SERIAL_CHAR(L);
|
||||||
SERIAL_ECHO_SP(3);
|
SERIAL_ECHO_SP(3);
|
||||||
|
|
||||||
if (N == 3) {
|
if (N == 3) {
|
||||||
@ -259,22 +262,14 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
|
const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A');
|
||||||
PWM_PRINT(*OCRVAL16);
|
PWM_PRINT(*OCRVAL16);
|
||||||
}
|
}
|
||||||
SERIAL_ECHOPAIR(" WGM: ", WGM);
|
SERIAL_ECHOPGM(" WGM: ", WGM);
|
||||||
com_print(T,L);
|
com_print(T,L);
|
||||||
SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
SERIAL_ECHOPGM(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) ));
|
||||||
|
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "A: ", *TCCRA);
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
SERIAL_ECHOPGM(" TCCR", AS_DIGIT(T), "B: ", *TCCRB);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("A: ", *TCCRA);
|
|
||||||
|
|
||||||
SERIAL_ECHOPGM(" TCCR");
|
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR("B: ", *TCCRB);
|
|
||||||
|
|
||||||
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
const uint8_t *TMSK = (uint8_t*)TIMSK(T);
|
||||||
SERIAL_ECHOPGM(" TIMSK");
|
SERIAL_ECHOPGM(" TIMSK", AS_DIGIT(T), ": ", *TMSK);
|
||||||
SERIAL_CHAR(T + '0');
|
|
||||||
SERIAL_ECHOPAIR(": ", *TMSK);
|
|
||||||
|
|
||||||
const uint8_t OCIE = L - 'A' + 1;
|
const uint8_t OCIE = L - 'A' + 1;
|
||||||
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); }
|
||||||
@ -286,7 +281,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
static void pwm_details(uint8_t pin) {
|
static void pwm_details(uint8_t pin) {
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
|
|
||||||
#if defined(TCCR0A) && defined(COM0A1)
|
#if ABTEST(0)
|
||||||
#ifdef TIMER0A
|
#ifdef TIMER0A
|
||||||
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
|
#if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs
|
||||||
case TIMER0A: timer_prefix(0, 'A', 3); break;
|
case TIMER0A: timer_prefix(0, 'A', 3); break;
|
||||||
@ -295,7 +290,7 @@ static void pwm_details(uint8_t pin) {
|
|||||||
case TIMER0B: timer_prefix(0, 'B', 3); break;
|
case TIMER0B: timer_prefix(0, 'B', 3); break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR1A) && defined(COM1A1)
|
#if ABTEST(1)
|
||||||
case TIMER1A: timer_prefix(1, 'A', 4); break;
|
case TIMER1A: timer_prefix(1, 'A', 4); break;
|
||||||
case TIMER1B: timer_prefix(1, 'B', 4); break;
|
case TIMER1B: timer_prefix(1, 'B', 4); break;
|
||||||
#if defined(COM1C1) && defined(TIMER1C)
|
#if defined(COM1C1) && defined(TIMER1C)
|
||||||
@ -303,12 +298,12 @@ static void pwm_details(uint8_t pin) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR2A) && defined(COM2A1)
|
#if ABTEST(2)
|
||||||
case TIMER2A: timer_prefix(2, 'A', 3); break;
|
case TIMER2A: timer_prefix(2, 'A', 3); break;
|
||||||
case TIMER2B: timer_prefix(2, 'B', 3); break;
|
case TIMER2B: timer_prefix(2, 'B', 3); break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR3A) && defined(COM3A1)
|
#if ABTEST(3)
|
||||||
case TIMER3A: timer_prefix(3, 'A', 4); break;
|
case TIMER3A: timer_prefix(3, 'A', 4); break;
|
||||||
case TIMER3B: timer_prefix(3, 'B', 4); break;
|
case TIMER3B: timer_prefix(3, 'B', 4); break;
|
||||||
#ifdef COM3C1
|
#ifdef COM3C1
|
||||||
@ -322,7 +317,7 @@ static void pwm_details(uint8_t pin) {
|
|||||||
case TIMER4C: timer_prefix(4, 'C', 4); break;
|
case TIMER4C: timer_prefix(4, 'C', 4); break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(TCCR5A) && defined(COM5A1)
|
#if ABTEST(5)
|
||||||
case TIMER5A: timer_prefix(5, 'A', 4); break;
|
case TIMER5A: timer_prefix(5, 'A', 4); break;
|
||||||
case TIMER5B: timer_prefix(5, 'B', 4); break;
|
case TIMER5B: timer_prefix(5, 'B', 4); break;
|
||||||
case TIMER5C: timer_prefix(5, 'C', 4); break;
|
case TIMER5C: timer_prefix(5, 'C', 4); break;
|
||||||
@ -356,7 +351,6 @@ static void pwm_details(uint8_t pin) {
|
|||||||
#endif
|
#endif
|
||||||
} // pwm_details
|
} // pwm_details
|
||||||
|
|
||||||
|
|
||||||
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
|
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
|
||||||
int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed
|
int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed
|
||||||
const uint8_t port = digitalPinToPort_DEBUG(pin);
|
const uint8_t port = digitalPinToPort_DEBUG(pin);
|
||||||
@ -401,3 +395,6 @@ static void pwm_details(uint8_t pin) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
|
||||||
|
#undef ABTEST
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
@ -51,15 +51,15 @@
|
|||||||
#define AVR_SS_PIN 16
|
#define AVR_SS_PIN 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN AVR_SCK_PIN
|
#define SD_SCK_PIN AVR_SCK_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN AVR_MISO_PIN
|
#define SD_MISO_PIN AVR_MISO_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN AVR_MOSI_PIN
|
#define SD_MOSI_PIN AVR_MOSI_PIN
|
||||||
#endif
|
#endif
|
||||||
#ifndef SS_PIN
|
#ifndef SD_SS_PIN
|
||||||
#define SS_PIN AVR_SS_PIN
|
#define SD_SS_PIN AVR_SS_PIN
|
||||||
#endif
|
#endif
|
||||||
|
@ -34,14 +34,14 @@ typedef uint16_t hal_timer_t;
|
|||||||
|
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
||||||
|
|
||||||
#ifndef STEP_TIMER_NUM
|
#ifndef MF_TIMER_STEP
|
||||||
#define STEP_TIMER_NUM 1
|
#define MF_TIMER_STEP 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef PULSE_TIMER_NUM
|
#ifndef MF_TIMER_PULSE
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||||
#endif
|
#endif
|
||||||
#ifndef TEMP_TIMER_NUM
|
#ifndef MF_TIMER_TEMP
|
||||||
#define TEMP_TIMER_NUM 0
|
#define MF_TIMER_TEMP 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
||||||
@ -58,13 +58,13 @@ typedef uint16_t hal_timer_t;
|
|||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
||||||
#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
|
#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A)
|
||||||
|
|
||||||
#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B)
|
#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0A)
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B)
|
#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0A)
|
||||||
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B)
|
#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0A)
|
||||||
|
|
||||||
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
||||||
switch (timer_num) {
|
switch (timer_num) {
|
||||||
case STEP_TIMER_NUM:
|
case MF_TIMER_STEP:
|
||||||
// waveform generation = 0100 = CTC
|
// waveform generation = 0100 = CTC
|
||||||
SET_WGM(1, CTC_OCRnA);
|
SET_WGM(1, CTC_OCRnA);
|
||||||
|
|
||||||
@ -84,10 +84,10 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
|||||||
TCNT1 = 0;
|
TCNT1 = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TEMP_TIMER_NUM:
|
case MF_TIMER_TEMP:
|
||||||
// Use timer0 for temperature measurement
|
// Use timer0 for temperature measurement
|
||||||
// Interleave temperature interrupt with millies interrupt
|
// Interleave temperature interrupt with millies interrupt
|
||||||
OCR0B = 128;
|
OCR0A = 128;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -109,12 +109,12 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
|||||||
* (otherwise, characters will be lost due to UART overflow).
|
* (otherwise, characters will be lost due to UART overflow).
|
||||||
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
||||||
*/
|
*/
|
||||||
#define HAL_timer_isr_prologue(TIMER_NUM)
|
#define HAL_timer_isr_prologue(T) NOOP
|
||||||
#define HAL_timer_isr_epilogue(TIMER_NUM)
|
#define HAL_timer_isr_epilogue(T) NOOP
|
||||||
|
|
||||||
/* 18 cycles maximum latency */
|
|
||||||
#ifndef HAL_STEP_TIMER_ISR
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
|
|
||||||
|
/* 18 cycles maximum latency */
|
||||||
#define HAL_STEP_TIMER_ISR() \
|
#define HAL_STEP_TIMER_ISR() \
|
||||||
extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
||||||
extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
||||||
@ -180,7 +180,7 @@ void TIMER1_COMPA_vect() { \
|
|||||||
: \
|
: \
|
||||||
: [timsk0] "i" ((uint16_t)&TIMSK0), \
|
: [timsk0] "i" ((uint16_t)&TIMSK0), \
|
||||||
[timsk1] "i" ((uint16_t)&TIMSK1), \
|
[timsk1] "i" ((uint16_t)&TIMSK1), \
|
||||||
[msk0] "M" ((uint8_t)(1<<OCIE0B)),\
|
[msk0] "M" ((uint8_t)(1<<OCIE0A)),\
|
||||||
[msk1] "M" ((uint8_t)(1<<OCIE1A)) \
|
[msk1] "M" ((uint8_t)(1<<OCIE1A)) \
|
||||||
: \
|
: \
|
||||||
); \
|
); \
|
||||||
@ -193,9 +193,9 @@ void TIMER1_COMPA_vect_bottom()
|
|||||||
|
|
||||||
/* 14 cycles maximum latency */
|
/* 14 cycles maximum latency */
|
||||||
#define HAL_TEMP_TIMER_ISR() \
|
#define HAL_TEMP_TIMER_ISR() \
|
||||||
extern "C" void TIMER0_COMPB_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
extern "C" void TIMER0_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \
|
||||||
extern "C" void TIMER0_COMPB_vect_bottom() asm ("TIMER0_COMPB_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
extern "C" void TIMER0_COMPA_vect_bottom() asm ("TIMER0_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \
|
||||||
void TIMER0_COMPB_vect() { \
|
void TIMER0_COMPA_vect() { \
|
||||||
__asm__ __volatile__ ( \
|
__asm__ __volatile__ ( \
|
||||||
A("push r16") /* 2 Save R16 */ \
|
A("push r16") /* 2 Save R16 */ \
|
||||||
A("in r16, __SREG__") /* 1 Get SREG */ \
|
A("in r16, __SREG__") /* 1 Get SREG */ \
|
||||||
@ -223,7 +223,7 @@ void TIMER0_COMPB_vect() { \
|
|||||||
A("push r30") \
|
A("push r30") \
|
||||||
A("push r31") \
|
A("push r31") \
|
||||||
A("clr r1") /* C runtime expects this register to be 0 */ \
|
A("clr r1") /* C runtime expects this register to be 0 */ \
|
||||||
A("call TIMER0_COMPB_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
A("call TIMER0_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \
|
||||||
A("pop r31") \
|
A("pop r31") \
|
||||||
A("pop r30") \
|
A("pop r30") \
|
||||||
A("pop r27") \
|
A("pop r27") \
|
||||||
@ -251,10 +251,10 @@ void TIMER0_COMPB_vect() { \
|
|||||||
A("reti") /* 4 Return from interrupt */ \
|
A("reti") /* 4 Return from interrupt */ \
|
||||||
: \
|
: \
|
||||||
: [timsk0] "i"((uint16_t)&TIMSK0), \
|
: [timsk0] "i"((uint16_t)&TIMSK0), \
|
||||||
[msk0] "M" ((uint8_t)(1<<OCIE0B)) \
|
[msk0] "M" ((uint8_t)(1<<OCIE0A)) \
|
||||||
: \
|
: \
|
||||||
); \
|
); \
|
||||||
} \
|
} \
|
||||||
void TIMER0_COMPB_vect_bottom()
|
void TIMER0_COMPA_vect_bottom()
|
||||||
|
|
||||||
#endif // HAL_TEMP_TIMER_ISR
|
#endif // HAL_TEMP_TIMER_ISR
|
||||||
|
@ -62,10 +62,10 @@
|
|||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
#include "../shared/Delay.h"
|
#include "../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
|
static uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock;
|
||||||
volatile uint8_t *u8g_outData, *u8g_outClock;
|
static volatile uint8_t *u8g_outData, *u8g_outClock;
|
||||||
|
|
||||||
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
|
static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) {
|
||||||
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
u8g_outData = portOutputRegister(digitalPinToPort(dataPin));
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef __AVR__
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
|
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
|
||||||
void watchdog_init() {
|
|
||||||
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
|
|
||||||
#define WDTO_NS WDTO_8S
|
|
||||||
#else
|
|
||||||
#define WDTO_NS WDTO_4S
|
|
||||||
#endif
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
// Enable the watchdog timer, but only for the interrupt.
|
|
||||||
// Take care, as this requires the correct order of operation, with interrupts disabled.
|
|
||||||
// See the datasheet of any AVR chip for details.
|
|
||||||
wdt_reset();
|
|
||||||
cli();
|
|
||||||
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
|
|
||||||
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
|
|
||||||
// So worked for up to WDTO_2S
|
|
||||||
sei();
|
|
||||||
wdt_reset();
|
|
||||||
#else
|
|
||||||
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
|
|
||||||
#endif
|
|
||||||
//delay(10000); // test it!
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//=================================== ISR ===================================
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
ISR(WDT_vect) {
|
|
||||||
sei(); // With the interrupt driven serial we need to allow interrupts.
|
|
||||||
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
|
||||||
minkill(); // interrupt-safe final kill and infinite loop
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // USE_WATCHDOG
|
|
||||||
#endif // __AVR__
|
|
@ -1,342 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../core/macros.h"
|
|
||||||
#include "../../core/serial.h"
|
|
||||||
|
|
||||||
#include "../shared/backtrace/unwinder.h"
|
|
||||||
#include "../shared/backtrace/unwmemaccess.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
// Debug monitor that dumps to the Programming port all status when
|
|
||||||
// an exception or WDT timeout happens - And then resets the board
|
|
||||||
|
|
||||||
// All the Monitor routines must run with interrupts disabled and
|
|
||||||
// under an ISR execution context. That is why we cannot reuse the
|
|
||||||
// Serial interrupt routines or any C runtime, as we don't know the
|
|
||||||
// state we are when running them
|
|
||||||
|
|
||||||
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
|
||||||
#define sw_barrier() __asm__ volatile("": : :"memory");
|
|
||||||
|
|
||||||
// (re)initialize UART0 as a monitor output to 250000,n,8,1
|
|
||||||
static void TXBegin() {
|
|
||||||
|
|
||||||
// Disable UART interrupt in NVIC
|
|
||||||
NVIC_DisableIRQ( UART_IRQn );
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// Disable clock
|
|
||||||
pmc_disable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Configure PMC
|
|
||||||
pmc_enable_periph_clk( ID_UART );
|
|
||||||
|
|
||||||
// Disable PDC channel
|
|
||||||
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
|
||||||
|
|
||||||
// Reset and disable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
|
||||||
|
|
||||||
// Configure mode: 8bit, No parity, 1 bit stop
|
|
||||||
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
|
||||||
|
|
||||||
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
|
||||||
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
|
||||||
|
|
||||||
// Enable receiver and transmitter
|
|
||||||
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send character through UART with no interrupts
|
|
||||||
static void TX(char c) {
|
|
||||||
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
|
||||||
UART->UART_THR = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send String through UART
|
|
||||||
static void TX(const char* s) {
|
|
||||||
while (*s) TX(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TXDigit(uint32_t d) {
|
|
||||||
if (d < 10) TX((char)(d+'0'));
|
|
||||||
else if (d < 16) TX((char)(d+'A'-10));
|
|
||||||
else TX('?');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Hex number thru UART
|
|
||||||
static void TXHex(uint32_t v) {
|
|
||||||
TX("0x");
|
|
||||||
for (uint8_t i = 0; i < 8; i++, v <<= 4)
|
|
||||||
TXDigit((v >> 28) & 0xF);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send Decimal number thru UART
|
|
||||||
static void TXDec(uint32_t v) {
|
|
||||||
if (!v) {
|
|
||||||
TX('0');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char nbrs[14];
|
|
||||||
char *p = &nbrs[0];
|
|
||||||
while (v != 0) {
|
|
||||||
*p++ = '0' + (v % 10);
|
|
||||||
v /= 10;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
p--;
|
|
||||||
TX(*p);
|
|
||||||
} while (p != &nbrs[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dump a backtrace entry
|
|
||||||
static bool UnwReportOut(void* ctx, const UnwReport* bte) {
|
|
||||||
int* p = (int*)ctx;
|
|
||||||
|
|
||||||
(*p)++;
|
|
||||||
TX('#'); TXDec(*p); TX(" : ");
|
|
||||||
TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function);
|
|
||||||
TX('+'); TXDec(bte->address - bte->function);
|
|
||||||
TX(" PC:");TXHex(bte->address); TX('\n');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
void UnwPrintf(const char* format, ...) {
|
|
||||||
char dest[256];
|
|
||||||
va_list argptr;
|
|
||||||
va_start(argptr, format);
|
|
||||||
vsprintf(dest, format, argptr);
|
|
||||||
va_end(argptr);
|
|
||||||
TX(&dest[0]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Table of function pointers for passing to the unwinder */
|
|
||||||
static const UnwindCallbacks UnwCallbacks = {
|
|
||||||
UnwReportOut,
|
|
||||||
UnwReadW,
|
|
||||||
UnwReadH,
|
|
||||||
UnwReadB
|
|
||||||
#ifdef UNW_DEBUG
|
|
||||||
, UnwPrintf
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* HardFaultHandler_C:
|
|
||||||
* This is called from the HardFault_HandlerAsm with a pointer the Fault stack
|
|
||||||
* as the parameter. We can then read the values from the stack and place them
|
|
||||||
* into local variables for ease of reading.
|
|
||||||
* We then read the various Fault Status and Address Registers to help decode
|
|
||||||
* cause of the fault.
|
|
||||||
* The function ends with a BKPT instruction to force control back into the debugger
|
|
||||||
*/
|
|
||||||
extern "C"
|
|
||||||
void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) {
|
|
||||||
|
|
||||||
static const char* causestr[] = {
|
|
||||||
"NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC"
|
|
||||||
};
|
|
||||||
|
|
||||||
UnwindFrame btf;
|
|
||||||
|
|
||||||
// Dump report to the Programming port (interrupts are DISABLED)
|
|
||||||
TXBegin();
|
|
||||||
TX("\n\n## Software Fault detected ##\n");
|
|
||||||
TX("Cause: "); TX(causestr[cause]); TX('\n');
|
|
||||||
|
|
||||||
TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n');
|
|
||||||
TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n');
|
|
||||||
TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n');
|
|
||||||
TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n');
|
|
||||||
TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n');
|
|
||||||
TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n');
|
|
||||||
TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n');
|
|
||||||
TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n');
|
|
||||||
|
|
||||||
// Configurable Fault Status Register
|
|
||||||
// Consists of MMSR, BFSR and UFSR
|
|
||||||
TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n');
|
|
||||||
|
|
||||||
// Hard Fault Status Register
|
|
||||||
TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n');
|
|
||||||
|
|
||||||
// Debug Fault Status Register
|
|
||||||
TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n');
|
|
||||||
|
|
||||||
// Auxiliary Fault Status Register
|
|
||||||
TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n');
|
|
||||||
|
|
||||||
// Read the Fault Address Registers. These may not contain valid values.
|
|
||||||
// Check BFARVALID/MMARVALID to see if they are valid values
|
|
||||||
// MemManage Fault Address Register
|
|
||||||
TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n');
|
|
||||||
|
|
||||||
// Bus Fault Address Register
|
|
||||||
TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n');
|
|
||||||
|
|
||||||
TX("ExcLR: "); TXHex(lr); TX('\n');
|
|
||||||
TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n');
|
|
||||||
|
|
||||||
btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer
|
|
||||||
btf.fp = btf.sp;
|
|
||||||
btf.lr = ((unsigned long)sp[5]);
|
|
||||||
btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it
|
|
||||||
|
|
||||||
// Perform a backtrace
|
|
||||||
TX("\nBacktrace:\n\n");
|
|
||||||
int ctr = 0;
|
|
||||||
UnwindStart(&btf, &UnwCallbacks, &ctr);
|
|
||||||
|
|
||||||
// Disable all NVIC interrupts
|
|
||||||
NVIC->ICER[0] = 0xFFFFFFFF;
|
|
||||||
NVIC->ICER[1] = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
// Relocate VTOR table to default position
|
|
||||||
SCB->VTOR = 0;
|
|
||||||
|
|
||||||
// Disable USB
|
|
||||||
otg_disable();
|
|
||||||
|
|
||||||
// Restart watchdog
|
|
||||||
WDT_Restart(WDT);
|
|
||||||
|
|
||||||
// Reset controller
|
|
||||||
NVIC_SystemReset();
|
|
||||||
for (;;) WDT_Restart(WDT);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void NMI_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#0")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void HardFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#1")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void MemManage_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#2")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void BusFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#3")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void UsageFault_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#4")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void DebugMon_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#5")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */
|
|
||||||
__attribute__((naked)) void WDT_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#6")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((naked)) void RSTC_Handler() {
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
".syntax unified" "\n\t"
|
|
||||||
A("tst lr, #4")
|
|
||||||
A("ite eq")
|
|
||||||
A("mrseq r0, msp")
|
|
||||||
A("mrsne r0, psp")
|
|
||||||
A("mov r1,lr")
|
|
||||||
A("mov r2,#7")
|
|
||||||
A("b HardFault_HandlerC")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
|
@ -19,15 +19,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include "usb/usb_task.h"
|
#include "usb/usb_task.h"
|
||||||
@ -36,36 +34,33 @@
|
|||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
uint16_t HAL_adc_result;
|
uint16_t MarlinHAL::adc_result;
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
// HAL initialization task
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
void HAL_init() {
|
extern void install_min_serial();
|
||||||
// Initialize the USB stack
|
#endif
|
||||||
|
|
||||||
|
void MarlinHAL::init() {
|
||||||
#if ENABLED(SDSUPPORT)
|
#if ENABLED(SDSUPPORT)
|
||||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init();
|
usb_task_init(); // Initialize the USB stack
|
||||||
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// HAL idle task
|
void MarlinHAL::init_board() {
|
||||||
void HAL_idletask() {
|
#ifdef BOARD_INIT
|
||||||
// Perform USB stack housekeeping
|
BOARD_INIT();
|
||||||
usb_task_idle();
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable interrupts
|
void MarlinHAL::idletask() { usb_task_idle(); } // Perform USB stack housekeeping
|
||||||
void cli() { noInterrupts(); }
|
|
||||||
|
|
||||||
// Enable interrupts
|
uint8_t MarlinHAL::get_reset_source() {
|
||||||
void sei() { interrupts(); }
|
|
||||||
|
|
||||||
void HAL_clear_reset_source() { }
|
|
||||||
|
|
||||||
uint8_t HAL_get_reset_source() {
|
|
||||||
switch ((RSTC->RSTC_SR >> 8) & 0x07) {
|
switch ((RSTC->RSTC_SR >> 8) & 0x07) {
|
||||||
case 0: return RST_POWER_ON;
|
case 0: return RST_POWER_ON;
|
||||||
case 1: return RST_BACKUP;
|
case 1: return RST_BACKUP;
|
||||||
@ -76,11 +71,105 @@ uint8_t HAL_get_reset_source() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _delay_ms(const int delay_ms) {
|
void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); }
|
||||||
// Todo: port for Due?
|
|
||||||
delay(delay_ms);
|
// ------------------------
|
||||||
|
// Watchdog Timer
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
// Initialize watchdog - On SAM3X, Watchdog was already configured
|
||||||
|
// and enabled or disabled at startup, so no need to reconfigure it
|
||||||
|
// here.
|
||||||
|
void MarlinHAL::watchdog_init() { WDT_Restart(WDT); } // Reset watchdog to start clean
|
||||||
|
|
||||||
|
// Reset watchdog. MUST be called at least every 4 seconds after the
|
||||||
|
// first watchdog_init or AVR will go into emergency procedures.
|
||||||
|
void MarlinHAL::watchdog_refresh() { watchdogReset(); }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Override Arduino runtime to either config or disable the watchdog
|
||||||
|
//
|
||||||
|
// We need to configure the watchdog as soon as possible in the boot
|
||||||
|
// process, because watchdog initialization at hardware reset on SAM3X8E
|
||||||
|
// is unreliable, and there is risk of unintended resets if we delay
|
||||||
|
// that initialization to a later time.
|
||||||
|
void watchdogSetup() {
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
// 4 seconds timeout
|
||||||
|
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||||
|
|
||||||
|
// Calculate timeout value in WDT counter ticks: This assumes
|
||||||
|
// the slow clock is running at 32.768 kHz watchdog
|
||||||
|
// frequency is therefore 32768 / 128 = 256 Hz
|
||||||
|
timeout = (timeout << 8) / 1000;
|
||||||
|
if (timeout == 0)
|
||||||
|
timeout = 1;
|
||||||
|
else if (timeout > 0xFFF)
|
||||||
|
timeout = 0xFFF;
|
||||||
|
|
||||||
|
// We want to enable the watchdog with the specified timeout
|
||||||
|
uint32_t value =
|
||||||
|
WDT_MR_WDV(timeout) | // With the specified timeout
|
||||||
|
WDT_MR_WDD(timeout) | // and no invalid write window
|
||||||
|
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
|
||||||
|
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
|
||||||
|
// to keep PIO controller state
|
||||||
|
#endif
|
||||||
|
WDT_MR_WDDBGHLT | // WDT stops in debug state.
|
||||||
|
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
|
||||||
|
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
// We enable the watchdog timer, but only for the interrupt.
|
||||||
|
|
||||||
|
// Configure WDT to only trigger an interrupt
|
||||||
|
value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
|
||||||
|
|
||||||
|
// Disable WDT interrupt (just in case, to avoid triggering it!)
|
||||||
|
NVIC_DisableIRQ(WDT_IRQn);
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Initialize WDT with the given parameters
|
||||||
|
WDT_Enable(WDT, value);
|
||||||
|
|
||||||
|
// Configure and enable WDT interrupt.
|
||||||
|
NVIC_ClearPendingIRQ(WDT_IRQn);
|
||||||
|
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
|
||||||
|
NVIC_EnableIRQ(WDT_IRQn);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// a WDT fault triggers a reset
|
||||||
|
value |= WDT_MR_WDRSTEN;
|
||||||
|
|
||||||
|
// Initialize WDT with the given parameters
|
||||||
|
WDT_Enable(WDT, value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset the watchdog
|
||||||
|
WDT_Restart(WDT);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Make sure to completely disable the Watchdog
|
||||||
|
WDT_Disable(WDT);
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Free Memory Accessor
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern unsigned int _ebss; // end of bss section
|
extern unsigned int _ebss; // end of bss section
|
||||||
}
|
}
|
||||||
@ -92,16 +181,21 @@ int freeMemory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// ADC
|
// Serial Ports
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
void HAL_adc_start_conversion(const uint8_t ch) {
|
// Forward the default serial ports
|
||||||
HAL_adc_result = analogRead(ch);
|
#if USING_HW_SERIAL0
|
||||||
}
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
#endif
|
||||||
uint16_t HAL_adc_get_result() {
|
#if USING_HW_SERIAL1
|
||||||
// nop
|
DefaultSerial2 MSerial1(false, Serial1);
|
||||||
return HAL_adc_result;
|
#endif
|
||||||
}
|
#if USING_HW_SERIAL2
|
||||||
|
DefaultSerial3 MSerial2(false, Serial2);
|
||||||
|
#endif
|
||||||
|
#if USING_HW_SERIAL3
|
||||||
|
DefaultSerial4 MSerial3(false, Serial3);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@ -22,9 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
@ -34,103 +32,106 @@
|
|||||||
#include "../shared/math_32bit.h"
|
#include "../shared/math_32bit.h"
|
||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define _MSERIAL(X) Serial##X
|
#include "../../core/serial_hook.h"
|
||||||
#define MSERIAL(X) _MSERIAL(X)
|
|
||||||
#define Serial0 Serial
|
// ------------------------
|
||||||
|
// Serial ports
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
||||||
|
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
||||||
|
extern DefaultSerial1 MSerial0;
|
||||||
|
extern DefaultSerial2 MSerial1;
|
||||||
|
extern DefaultSerial3 MSerial2;
|
||||||
|
extern DefaultSerial4 MSerial3;
|
||||||
|
|
||||||
|
#define _MSERIAL(X) MSerial##X
|
||||||
|
#define MSERIAL(X) _MSERIAL(X)
|
||||||
|
|
||||||
// Define MYSERIAL0/1 before MarlinSerial includes!
|
|
||||||
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL0 customizedSerial1
|
#define MYSERIAL1 customizedSerial1
|
||||||
#elif WITHIN(SERIAL_PORT, 0, 3)
|
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#define MYSERIAL0 MSERIAL(SERIAL_PORT)
|
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
#define MYSERIAL1 customizedSerial2
|
#define MYSERIAL2 customizedSerial2
|
||||||
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#define MYSERIAL1 MSERIAL(SERIAL_PORT_2)
|
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||||
#else
|
#else
|
||||||
#error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration."
|
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SERIAL_PORT_3
|
||||||
|
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||||
|
#define MYSERIAL3 customizedSerial3
|
||||||
|
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
|
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||||
|
#else
|
||||||
|
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MMU2_SERIAL_PORT
|
||||||
|
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
|
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
||||||
|
#else
|
||||||
|
#error "MMU2_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if LCD_SERIAL_PORT == -1
|
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
#define LCD_SERIAL lcdSerial
|
|
||||||
#elif WITHIN(LCD_SERIAL_PORT, 0, 3)
|
|
||||||
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||||
#else
|
#else
|
||||||
#error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration."
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
|
|
||||||
// On AVR this is in math.h?
|
// ------------------------
|
||||||
#define square(x) ((x)*(x))
|
// Types
|
||||||
|
// ------------------------
|
||||||
#ifndef strncpy_P
|
|
||||||
#define strncpy_P(dest, src, num) strncpy((dest), (src), (num))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Fix bug in pgm_read_ptr
|
|
||||||
#undef pgm_read_ptr
|
|
||||||
#define pgm_read_ptr(addr) (*((void**)(addr)))
|
|
||||||
#undef pgm_read_word
|
|
||||||
#define pgm_read_word(addr) (*((uint16_t*)(addr)))
|
|
||||||
|
|
||||||
typedef int8_t pin_t;
|
typedef int8_t pin_t;
|
||||||
|
|
||||||
#define SHARED_SERVOS HAS_SERVOS
|
#define SHARED_SERVOS HAS_SERVOS // Use shared/servos.cpp
|
||||||
#define HAL_SERVO_LIB Servo
|
|
||||||
|
class Servo;
|
||||||
|
typedef Servo hal_servo_t;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Interrupts
|
// Interrupts
|
||||||
//
|
//
|
||||||
#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq()
|
#define sei() interrupts()
|
||||||
#define CRITICAL_SECTION_END() if (!primask) __enable_irq()
|
#define cli() noInterrupts()
|
||||||
#define ISRS_ENABLED() (!__get_PRIMASK())
|
|
||||||
#define ENABLE_ISRS() __enable_irq()
|
|
||||||
#define DISABLE_ISRS() __disable_irq()
|
|
||||||
|
|
||||||
void cli(); // Disable interrupts
|
#define CRITICAL_SECTION_START() const bool _irqon = hal.isr_state(); hal.isr_off()
|
||||||
void sei(); // Enable interrupts
|
#define CRITICAL_SECTION_END() if (_irqon) hal.isr_on()
|
||||||
|
|
||||||
void HAL_clear_reset_source(); // clear reset reason
|
|
||||||
uint8_t HAL_get_reset_source(); // get reset reason
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
//
|
//
|
||||||
extern uint16_t HAL_adc_result; // result of last ADC conversion
|
|
||||||
|
|
||||||
#ifndef analogInputToDigitalPin
|
|
||||||
#define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HAL_ANALOG_SELECT(ch)
|
|
||||||
|
|
||||||
inline void HAL_adc_init() {}//todo
|
|
||||||
|
|
||||||
#define HAL_ADC_VREF 3.3
|
#define HAL_ADC_VREF 3.3
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch)
|
|
||||||
#define HAL_READ_ADC() HAL_adc_result
|
|
||||||
#define HAL_ADC_READY() true
|
|
||||||
|
|
||||||
void HAL_adc_start_conversion(const uint8_t ch);
|
#ifndef analogInputToDigitalPin
|
||||||
uint16_t HAL_adc_get_result();
|
#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Pin Map
|
// Pin Mapping for M42, M43, M226
|
||||||
//
|
//
|
||||||
#define GET_PIN_MAP_PIN(index) index
|
#define GET_PIN_MAP_PIN(index) index
|
||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
#define GET_PIN_MAP_INDEX(pin) pin
|
||||||
@ -139,23 +140,18 @@ uint16_t HAL_adc_get_result();
|
|||||||
//
|
//
|
||||||
// Tone
|
// Tone
|
||||||
//
|
//
|
||||||
void toneInit();
|
|
||||||
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
||||||
void noTone(const pin_t _pin);
|
void noTone(const pin_t _pin);
|
||||||
|
|
||||||
// Enable hooks into idle and setup for HAL
|
// ------------------------
|
||||||
#define HAL_IDLETASK 1
|
// Class Utilities
|
||||||
void HAL_idletask();
|
// ------------------------
|
||||||
void HAL_init();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Utility functions
|
|
||||||
//
|
|
||||||
void _delay_ms(const int delay);
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
int freeMemory();
|
#endif
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -165,3 +161,73 @@ char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Return free RAM between end of heap (or end bss) and whatever is current
|
||||||
|
int freeMemory();
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// MarlinHAL Class
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
class MarlinHAL {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Earliest possible init, before setup()
|
||||||
|
MarlinHAL() {}
|
||||||
|
|
||||||
|
// Watchdog
|
||||||
|
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
|
||||||
|
static void init(); // Called early in setup()
|
||||||
|
static void init_board(); // Called less early in setup()
|
||||||
|
static void reboot(); // Restart the firmware
|
||||||
|
|
||||||
|
// Interrupts
|
||||||
|
static bool isr_state() { return !__get_PRIMASK(); }
|
||||||
|
static void isr_on() { __enable_irq(); }
|
||||||
|
static void isr_off() { __disable_irq(); }
|
||||||
|
|
||||||
|
static void delay_ms(const int ms) { delay(ms); }
|
||||||
|
|
||||||
|
// Tasks, called from idle()
|
||||||
|
static void idletask();
|
||||||
|
|
||||||
|
// Reset
|
||||||
|
static uint8_t get_reset_source();
|
||||||
|
static void clear_reset_source() {}
|
||||||
|
|
||||||
|
// Free SRAM
|
||||||
|
static int freeMemory() { return ::freeMemory(); }
|
||||||
|
|
||||||
|
//
|
||||||
|
// ADC Methods
|
||||||
|
//
|
||||||
|
|
||||||
|
static uint16_t adc_result;
|
||||||
|
|
||||||
|
// Called by Temperature::init once at startup
|
||||||
|
static void adc_init() {}
|
||||||
|
|
||||||
|
// Called by Temperature::init for each sensor at startup
|
||||||
|
static void adc_enable(const uint8_t /*ch*/) {}
|
||||||
|
|
||||||
|
// Begin ADC sampling on the given channel. Called from Temperature::isr!
|
||||||
|
static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }
|
||||||
|
|
||||||
|
// Is the ADC ready for reading?
|
||||||
|
static bool adc_ready() { return true; }
|
||||||
|
|
||||||
|
// The current value of the ADC register
|
||||||
|
static uint16_t adc_value() { return adc_result; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the PWM duty cycle for the pin to the given value.
|
||||||
|
* No inverting the duty cycle in this HAL.
|
||||||
|
* No changing the maximum size of the provided value to enable finer PWM duty control in this HAL.
|
||||||
|
*/
|
||||||
|
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t=255, const bool=false) {
|
||||||
|
analogWrite(pin, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
@ -30,9 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
@ -69,10 +67,10 @@
|
|||||||
|
|
||||||
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t idx = 0;
|
uint32_t idx = 0;
|
||||||
|
|
||||||
/* Negate bout, as the assembler requires a negated value */
|
/* Negate bout, as the assembler requires a negated value */
|
||||||
@ -154,9 +152,9 @@
|
|||||||
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
static uint8_t spiTransferRx0(uint8_t) { // using Mode 0
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@ -225,36 +223,36 @@
|
|||||||
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
static uint8_t spiTransfer1(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
DELAY_NS(125); // 10 cycles @ 84mhz
|
DELAY_NS(125); // 10 cycles @ 84mhz
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
// all the others
|
// all the others
|
||||||
static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz
|
static uint16_t spiDelayNS = 4000; // 4000ns => 125khz
|
||||||
|
|
||||||
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
static uint8_t spiTransferX(uint8_t b) { // using Mode 0
|
||||||
int bits = 8;
|
int bits = 8;
|
||||||
do {
|
do {
|
||||||
WRITE(MOSI_PIN, b & 0x80);
|
WRITE(SD_MOSI_PIN, b & 0x80);
|
||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_NS_VAR(spiDelayNS);
|
||||||
|
|
||||||
b |= (READ(MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
__delay_4cycles(spiDelayCyclesX4);
|
DELAY_NS_VAR(spiDelayNS);
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
@ -271,10 +269,10 @@
|
|||||||
|
|
||||||
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
// Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded)
|
||||||
static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
|
static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */
|
uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN);
|
uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN);
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t txval = 0;
|
uint32_t txval = 0;
|
||||||
|
|
||||||
@ -352,9 +350,9 @@
|
|||||||
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
||||||
uint32_t bin = 0;
|
uint32_t bin = 0;
|
||||||
uint32_t work = 0;
|
uint32_t work = 0;
|
||||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */
|
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */
|
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||||
uint32_t SCK_MASK = PIN_MASK(SCK_PIN);
|
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||||
|
|
||||||
/* The software SPI routine */
|
/* The software SPI routine */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@ -437,27 +435,27 @@
|
|||||||
} while (--todo);
|
} while (--todo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pointers to generic functions for block tranfers
|
// Pointers to generic functions for block transfers
|
||||||
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
|
|
||||||
#if MB(ALLIGATOR)
|
#if MB(ALLIGATOR)
|
||||||
#define _SS_WRITE(S) WRITE(SS_PIN, S)
|
#define _SS_WRITE(S) WRITE(SD_SS_PIN, S)
|
||||||
#else
|
#else
|
||||||
#define _SS_WRITE(S) NOOP
|
#define _SS_WRITE(S) NOOP
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
SET_OUTPUT(SS_PIN);
|
SET_OUTPUT(SD_SS_PIN);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
SET_OUTPUT(SCK_PIN);
|
SET_OUTPUT(SD_SCK_PIN);
|
||||||
SET_INPUT(MISO_PIN);
|
SET_INPUT(SD_MISO_PIN);
|
||||||
SET_OUTPUT(MOSI_PIN);
|
SET_OUTPUT(SD_MOSI_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t spiRec() {
|
uint8_t spiRec() {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
uint8_t b = spiTransferRx(0xFF);
|
uint8_t b = spiTransferRx(0xFF);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
return b;
|
return b;
|
||||||
@ -466,7 +464,7 @@
|
|||||||
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
void spiRead(uint8_t *buf, uint16_t nbyte) {
|
||||||
if (nbyte) {
|
if (nbyte) {
|
||||||
_SS_WRITE(LOW);
|
_SS_WRITE(LOW);
|
||||||
WRITE(MOSI_PIN, HIGH); // Output 1s 1
|
WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1
|
||||||
spiRxBlock(buf, nbyte);
|
spiRxBlock(buf, nbyte);
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
}
|
}
|
||||||
@ -510,7 +508,7 @@
|
|||||||
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
spiRxBlock = (pfnSpiRxBlock)spiRxBlockX;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate);
|
spiDelayNS = 4000 >> (6 - spiRate); // spiRate of 2 gives the maximum error with current CPU
|
||||||
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
spiTransferTx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
spiTransferRx = (pfnSpiTransfer)spiTransferX;
|
||||||
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
spiTxBlock = (pfnSpiTxBlock)spiTxBlockX;
|
||||||
@ -519,8 +517,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
_SS_WRITE(HIGH);
|
_SS_WRITE(HIGH);
|
||||||
WRITE(MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
WRITE(SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Begin SPI transaction, set clock, bit order, data mode */
|
/** Begin SPI transaction, set clock, bit order, data mode */
|
||||||
@ -575,38 +573,34 @@
|
|||||||
|
|
||||||
// Configure SPI pins
|
// Configure SPI pins
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SCK_PIN].pPort,
|
g_APinDescription[SD_SCK_PIN].pPort,
|
||||||
g_APinDescription[SCK_PIN].ulPinType,
|
g_APinDescription[SD_SCK_PIN].ulPinType,
|
||||||
g_APinDescription[SCK_PIN].ulPin,
|
g_APinDescription[SD_SCK_PIN].ulPin,
|
||||||
g_APinDescription[SCK_PIN].ulPinConfiguration);
|
g_APinDescription[SD_SCK_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MOSI_PIN].pPort,
|
g_APinDescription[SD_MOSI_PIN].pPort,
|
||||||
g_APinDescription[MOSI_PIN].ulPinType,
|
g_APinDescription[SD_MOSI_PIN].ulPinType,
|
||||||
g_APinDescription[MOSI_PIN].ulPin,
|
g_APinDescription[SD_MOSI_PIN].ulPin,
|
||||||
g_APinDescription[MOSI_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MOSI_PIN].ulPinConfiguration);
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[MISO_PIN].pPort,
|
g_APinDescription[SD_MISO_PIN].pPort,
|
||||||
g_APinDescription[MISO_PIN].ulPinType,
|
g_APinDescription[SD_MISO_PIN].ulPinType,
|
||||||
g_APinDescription[MISO_PIN].ulPin,
|
g_APinDescription[SD_MISO_PIN].ulPin,
|
||||||
g_APinDescription[MISO_PIN].ulPinConfiguration);
|
g_APinDescription[SD_MISO_PIN].ulPinConfiguration);
|
||||||
|
|
||||||
// set master mode, peripheral select, fault detection
|
// set master mode, peripheral select, fault detection
|
||||||
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS);
|
||||||
SPI_Enable(SPI0);
|
SPI_Enable(SPI0);
|
||||||
|
|
||||||
SET_OUTPUT(DAC0_SYNC);
|
SET_OUTPUT(DAC0_SYNC_PIN);
|
||||||
#if HAS_MULTI_EXTRUDER
|
#if HAS_MULTI_EXTRUDER
|
||||||
SET_OUTPUT(DAC1_SYNC);
|
OUT_WRITE(DAC1_SYNC_PIN, HIGH);
|
||||||
WRITE(DAC1_SYNC, HIGH);
|
|
||||||
#endif
|
#endif
|
||||||
SET_OUTPUT(SPI_EEPROM1_CS);
|
WRITE(DAC0_SYNC_PIN, HIGH);
|
||||||
SET_OUTPUT(SPI_EEPROM2_CS);
|
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
||||||
SET_OUTPUT(SPI_FLASH_CS);
|
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
||||||
WRITE(DAC0_SYNC, HIGH);
|
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
||||||
WRITE(SPI_EEPROM1_CS, HIGH);
|
WRITE(SD_SS_PIN, HIGH);
|
||||||
WRITE(SPI_EEPROM2_CS, HIGH);
|
|
||||||
WRITE(SPI_FLASH_CS, HIGH);
|
|
||||||
WRITE(SS_PIN, HIGH);
|
|
||||||
|
|
||||||
OUT_WRITE(SDSS, LOW);
|
OUT_WRITE(SDSS, LOW);
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
practice, we need alignment to 256 bytes to make this work in all
|
practice, we need alignment to 256 bytes to make this work in all
|
||||||
cases */
|
cases */
|
||||||
__attribute__ ((aligned(256)))
|
__attribute__ ((aligned(256)))
|
||||||
static DeviceVectors ram_tab = { nullptr };
|
static DeviceVectors ram_tab[61] = { nullptr };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function checks if the exception/interrupt table is already in SRAM or not.
|
* This function checks if the exception/interrupt table is already in SRAM or not.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
* Based on Sprinter and grbl.
|
* Based on Sprinter and grbl.
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
@ -21,7 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
extern IWDG_HandleTypeDef hiwdg;
|
#include <SPI.h>
|
||||||
|
|
||||||
void watchdog_init();
|
using MarlinSPI = SPIClass;
|
||||||
void HAL_watchdog_refresh();
|
|
@ -382,7 +382,7 @@ void MarlinSerial<Cfg>::flush() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
void MarlinSerial<Cfg>::write(const uint8_t c) {
|
size_t MarlinSerial<Cfg>::write(const uint8_t c) {
|
||||||
_written = true;
|
_written = true;
|
||||||
|
|
||||||
if (Cfg::TX_SIZE == 0) {
|
if (Cfg::TX_SIZE == 0) {
|
||||||
@ -400,13 +400,13 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// XOFF char at the RX isr, but it is properly handled there
|
// XOFF char at the RX isr, but it is properly handled there
|
||||||
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) {
|
||||||
HWUART->UART_THR = c;
|
HWUART->UART_THR = c;
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1);
|
||||||
|
|
||||||
// If global interrupts are disabled (as the result of being called from an ISR)...
|
// If global interrupts are disabled (as the result of being called from an ISR)...
|
||||||
if (!ISRS_ENABLED()) {
|
if (!hal.isr_state()) {
|
||||||
|
|
||||||
// Make room by polling if it is possible to transmit, and do so!
|
// Make room by polling if it is possible to transmit, and do so!
|
||||||
while (i == tx_buffer.tail) {
|
while (i == tx_buffer.tail) {
|
||||||
@ -428,6 +428,7 @@ void MarlinSerial<Cfg>::write(const uint8_t c) {
|
|||||||
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
// Enable TX isr - Non atomic, but it will eventually enable TX isr
|
||||||
HWUART->UART_IER = UART_IER_TXRDY;
|
HWUART->UART_IER = UART_IER_TXRDY;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
@ -453,7 +454,7 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
if (!_written) return;
|
if (!_written) return;
|
||||||
|
|
||||||
// If global interrupts are disabled (as the result of being called from an ISR)...
|
// If global interrupts are disabled (as the result of being called from an ISR)...
|
||||||
if (!ISRS_ENABLED()) {
|
if (!hal.isr_state()) {
|
||||||
|
|
||||||
// Wait until everything was transmitted - We must do polling, as interrupts are disabled
|
// Wait until everything was transmitted - We must do polling, as interrupts are disabled
|
||||||
while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) {
|
while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) {
|
||||||
@ -473,169 +474,21 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) { print('-'); n = -n; }
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Cfg>
|
|
||||||
void MarlinSerial<Cfg>::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits) rounding *= 0.1;
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If not using the USB port as serial port
|
// If not using the USB port as serial port
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1; // Instantiate
|
MSerialT1 customizedSerial1(MarlinSerialCfg<SERIAL_PORT>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
template class MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>>; // Define
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> >;
|
||||||
MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2; // Instantiate
|
MSerialT2 customizedSerial2(MarlinSerialCfg<SERIAL_PORT_2>::EMERGENCYPARSER);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> >;
|
||||||
|
MSerialT3 customizedSerial3(MarlinSerialCfg<SERIAL_PORT_3>::EMERGENCYPARSER);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@ -30,11 +30,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#define DEC 10
|
|
||||||
#define HEX 16
|
|
||||||
#define OCT 8
|
|
||||||
#define BIN 2
|
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
@ -119,44 +115,15 @@ public:
|
|||||||
static int read();
|
static int read();
|
||||||
static void flush();
|
static void flush();
|
||||||
static ring_buffer_pos_t available();
|
static ring_buffer_pos_t available();
|
||||||
static void write(const uint8_t c);
|
static size_t write(const uint8_t c);
|
||||||
static void flushTX();
|
static void flushTX();
|
||||||
|
|
||||||
static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
static bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; }
|
||||||
|
|
||||||
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; }
|
||||||
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; }
|
||||||
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; }
|
||||||
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; }
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Serial port configuration
|
// Serial port configuration
|
||||||
@ -173,10 +140,17 @@ struct MarlinSerialCfg {
|
|||||||
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED);
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT> > > MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0
|
||||||
extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT_2>> customizedSerial2;
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_2> > > MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SERIAL_PORT_3) && SERIAL_PORT_3 >= 0
|
||||||
|
typedef Serial1Class< MarlinSerial< MarlinSerialCfg<SERIAL_PORT_3> > > MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
* MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE
|
||||||
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
* Copyright (c) 2017 Eduardo José Tagle. All right reserved
|
||||||
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
* Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
@ -33,10 +33,6 @@
|
|||||||
|
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
#include "../../feature/e_parser.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Imports from Atmel USB Stack/CDC implementation
|
// Imports from Atmel USB Stack/CDC implementation
|
||||||
extern "C" {
|
extern "C" {
|
||||||
bool usb_task_cdc_isenabled();
|
bool usb_task_cdc_isenabled();
|
||||||
@ -45,15 +41,11 @@ extern "C" {
|
|||||||
int udi_cdc_getc();
|
int udi_cdc_getc();
|
||||||
bool udi_cdc_is_tx_ready();
|
bool udi_cdc_is_tx_ready();
|
||||||
int udi_cdc_putc(int value);
|
int udi_cdc_putc(int value);
|
||||||
};
|
}
|
||||||
|
|
||||||
// Pending character
|
// Pending character
|
||||||
static int pending_char = -1;
|
static int pending_char = -1;
|
||||||
|
|
||||||
#if ENABLED(EMERGENCY_PARSER)
|
|
||||||
static EmergencyParser::State emergency_state; // = EP_RESET
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Public Methods
|
// Public Methods
|
||||||
void MarlinSerialUSB::begin(const long) {}
|
void MarlinSerialUSB::begin(const long) {}
|
||||||
|
|
||||||
@ -73,7 +65,7 @@ int MarlinSerialUSB::peek() {
|
|||||||
|
|
||||||
pending_char = udi_cdc_getc();
|
pending_char = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)pending_char));
|
||||||
|
|
||||||
return pending_char;
|
return pending_char;
|
||||||
}
|
}
|
||||||
@ -95,29 +87,27 @@ int MarlinSerialUSB::read() {
|
|||||||
|
|
||||||
int c = udi_cdc_getc();
|
int c = udi_cdc_getc();
|
||||||
|
|
||||||
TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c));
|
TERN_(EMERGENCY_PARSER, emergency_parser.update(static_cast<MSerialT1*>(this)->emergency_state, (char)c));
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MarlinSerialUSB::available() {
|
int MarlinSerialUSB::available() {
|
||||||
/* If Pending chars */
|
if (pending_char > 0) return pending_char;
|
||||||
return pending_char >= 0 ||
|
return pending_char == 0 ||
|
||||||
/* or USB CDC enumerated and configured on the PC side and some
|
// or USB CDC enumerated and configured on the PC side and some bytes where sent to us */
|
||||||
bytes where sent to us */
|
|
||||||
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
(usb_task_cdc_isenabled() && udi_cdc_is_rx_ready());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinSerialUSB::flush() { }
|
void MarlinSerialUSB::flush() { }
|
||||||
void MarlinSerialUSB::flushTX() { }
|
|
||||||
|
|
||||||
void MarlinSerialUSB::write(const uint8_t c) {
|
size_t MarlinSerialUSB::write(const uint8_t c) {
|
||||||
|
|
||||||
/* Do not even bother sending anything if USB CDC is not enumerated
|
/* Do not even bother sending anything if USB CDC is not enumerated
|
||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages */
|
listening to our messages */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
/* Wait until the PC has read the pending to be sent data */
|
/* Wait until the PC has read the pending to be sent data */
|
||||||
while (usb_task_cdc_isenabled() &&
|
while (usb_task_cdc_isenabled() &&
|
||||||
@ -129,161 +119,23 @@ void MarlinSerialUSB::write(const uint8_t c) {
|
|||||||
or not configured on the PC side or there is no program on the PC
|
or not configured on the PC side or there is no program on the PC
|
||||||
listening to our messages at this point */
|
listening to our messages at this point */
|
||||||
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active())
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
// Fifo full
|
// Fifo full
|
||||||
// udi_cdc_signal_overrun();
|
// udi_cdc_signal_overrun();
|
||||||
udi_cdc_putc(c);
|
udi_cdc_putc(c);
|
||||||
}
|
return 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Imports from print.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(char c, int base) {
|
|
||||||
print((long)c, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned char b, int base) {
|
|
||||||
print((unsigned long)b, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(int n, int base) {
|
|
||||||
print((long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned int n, int base) {
|
|
||||||
print((unsigned long)n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(long n, int base) {
|
|
||||||
if (base == 0)
|
|
||||||
write(n);
|
|
||||||
else if (base == 10) {
|
|
||||||
if (n < 0) {
|
|
||||||
print('-');
|
|
||||||
n = -n;
|
|
||||||
}
|
|
||||||
printNumber(n, 10);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(unsigned long n, int base) {
|
|
||||||
if (base == 0) write(n);
|
|
||||||
else printNumber(n, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::print(double n, int digits) {
|
|
||||||
printFloat(n, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println() {
|
|
||||||
print('\r');
|
|
||||||
print('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const String& s) {
|
|
||||||
print(s);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(const char c[]) {
|
|
||||||
print(c);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(char c, int base) {
|
|
||||||
print(c, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned char b, int base) {
|
|
||||||
print(b, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned int n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(unsigned long n, int base) {
|
|
||||||
print(n, base);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::println(double n, int digits) {
|
|
||||||
print(n, digits);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Private Methods
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) {
|
|
||||||
if (n) {
|
|
||||||
unsigned char buf[8 * sizeof(long)]; // Enough space for base 2
|
|
||||||
int8_t i = 0;
|
|
||||||
while (n) {
|
|
||||||
buf[i++] = n % base;
|
|
||||||
n /= base;
|
|
||||||
}
|
|
||||||
while (i--)
|
|
||||||
print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
print('0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void MarlinSerialUSB::printFloat(double number, uint8_t digits) {
|
|
||||||
// Handle negative numbers
|
|
||||||
if (number < 0.0) {
|
|
||||||
print('-');
|
|
||||||
number = -number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round correctly so that print(1.999, 2) prints as "2.00"
|
|
||||||
double rounding = 0.5;
|
|
||||||
LOOP_L_N(i, digits)
|
|
||||||
rounding *= 0.1;
|
|
||||||
|
|
||||||
number += rounding;
|
|
||||||
|
|
||||||
// Extract the integer part of the number and print it
|
|
||||||
unsigned long int_part = (unsigned long)number;
|
|
||||||
double remainder = number - (double)int_part;
|
|
||||||
print(int_part);
|
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
|
||||||
if (digits) {
|
|
||||||
print('.');
|
|
||||||
// Extract digits from the remainder one at a time
|
|
||||||
while (digits--) {
|
|
||||||
remainder *= 10.0;
|
|
||||||
int toPrint = int(remainder);
|
|
||||||
print(toPrint);
|
|
||||||
remainder -= toPrint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Preinstantiate
|
// Preinstantiate
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
MarlinSerialUSB customizedSerial1;
|
MSerialT1 customizedSerial1(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
MarlinSerialUSB customizedSerial2;
|
MSerialT2 customizedSerial2(TERN0(EMERGENCY_PARSER, true));
|
||||||
|
#endif
|
||||||
|
#if SERIAL_PORT_3 == -1
|
||||||
|
MSerialT3 customizedSerial3(TERN0(EMERGENCY_PARSER, true));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#endif // HAS_USB_SERIAL
|
||||||
|
@ -27,73 +27,39 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
#if HAS_USB_SERIAL
|
|
||||||
|
|
||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#define DEC 10
|
struct MarlinSerialUSB {
|
||||||
#define HEX 16
|
void begin(const long);
|
||||||
#define OCT 8
|
void end();
|
||||||
#define BIN 2
|
int peek();
|
||||||
|
int read();
|
||||||
class MarlinSerialUSB {
|
void flush();
|
||||||
|
int available();
|
||||||
public:
|
size_t write(const uint8_t c);
|
||||||
MarlinSerialUSB() {};
|
|
||||||
static void begin(const long);
|
|
||||||
static void end();
|
|
||||||
static int peek();
|
|
||||||
static int read();
|
|
||||||
static void flush();
|
|
||||||
static void flushTX();
|
|
||||||
static bool available();
|
|
||||||
static void write(const uint8_t c);
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE static uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||||
FORCE_INLINE static int rxMaxEnqueued() { return 0; }
|
FORCE_INLINE int rxMaxEnqueued() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); }
|
|
||||||
FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); }
|
|
||||||
FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); }
|
|
||||||
FORCE_INLINE static void print(const char* str) { write(str); }
|
|
||||||
|
|
||||||
static void print(char, int = 0);
|
|
||||||
static void print(unsigned char, int = 0);
|
|
||||||
static void print(int, int = DEC);
|
|
||||||
static void print(unsigned int, int = DEC);
|
|
||||||
static void print(long, int = DEC);
|
|
||||||
static void print(unsigned long, int = DEC);
|
|
||||||
static void print(double, int = 2);
|
|
||||||
|
|
||||||
static void println(const String& s);
|
|
||||||
static void println(const char[]);
|
|
||||||
static void println(char, int = 0);
|
|
||||||
static void println(unsigned char, int = 0);
|
|
||||||
static void println(int, int = DEC);
|
|
||||||
static void println(unsigned int, int = DEC);
|
|
||||||
static void println(long, int = DEC);
|
|
||||||
static void println(unsigned long, int = DEC);
|
|
||||||
static void println(double, int = 2);
|
|
||||||
static void println();
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void printNumber(unsigned long, const uint8_t);
|
|
||||||
static void printFloat(double, uint8_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SERIAL_PORT == -1
|
#if SERIAL_PORT == -1
|
||||||
extern MarlinSerialUSB customizedSerial1;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT1;
|
||||||
|
extern MSerialT1 customizedSerial1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SERIAL_PORT_2 == -1
|
#if SERIAL_PORT_2 == -1
|
||||||
extern MarlinSerialUSB customizedSerial2;
|
typedef Serial1Class<MarlinSerialUSB> MSerialT2;
|
||||||
|
extern MSerialT2 customizedSerial2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_USB_SERIAL
|
#if SERIAL_PORT_3 == -1
|
||||||
|
typedef Serial1Class<MarlinSerialUSB> MSerialT3;
|
||||||
|
extern MSerialT3 customizedSerial3;
|
||||||
|
#endif
|
||||||
|
91
Marlin/src/HAL/DUE/MinSerial.cpp
Normal file
91
Marlin/src/HAL/DUE/MinSerial.cpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
|
||||||
|
#include "../shared/MinSerial.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
static void TXBegin() {
|
||||||
|
// Disable UART interrupt in NVIC
|
||||||
|
NVIC_DisableIRQ( UART_IRQn );
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Disable clock
|
||||||
|
pmc_disable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Configure PMC
|
||||||
|
pmc_enable_periph_clk( ID_UART );
|
||||||
|
|
||||||
|
// Disable PDC channel
|
||||||
|
UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||||
|
|
||||||
|
// Reset and disable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;
|
||||||
|
|
||||||
|
// Configure mode: 8bit, No parity, 1 bit stop
|
||||||
|
UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO;
|
||||||
|
|
||||||
|
// Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds
|
||||||
|
UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4));
|
||||||
|
|
||||||
|
// Enable receiver and transmitter
|
||||||
|
UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A SW memory barrier, to ensure GCC does not overoptimize loops
|
||||||
|
#define sw_barrier() __asm__ volatile("": : :"memory");
|
||||||
|
static void TX(char c) {
|
||||||
|
while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); };
|
||||||
|
UART->UART_THR = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void install_min_serial() {
|
||||||
|
HAL_min_serial_init = &TXBegin;
|
||||||
|
HAL_min_serial_out = &TX;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DISABLED(DYNAMIC_VECTORTABLE)
|
||||||
|
extern "C" {
|
||||||
|
__attribute__((naked)) void JumpHandler_ASM() {
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"b CommonHandler_ASM\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // POSTMORTEM_DEBUGGING
|
||||||
|
#endif // ARDUINO_ARCH_SAM
|
@ -47,12 +47,12 @@
|
|||||||
#include "../shared/servo.h"
|
#include "../shared/servo.h"
|
||||||
#include "../shared/servo_private.h"
|
#include "../shared/servo_private.h"
|
||||||
|
|
||||||
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
|
static Flags<_Nbr_16timers> DisablePending; // ISR should disable the timer at the next timer reset
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
/// Interrupt handler for the TC0 channel 1.
|
/// Interrupt handler for the TC0 channel 1.
|
||||||
// ------------------------
|
// ------------------------
|
||||||
void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel);
|
void Servo_Handler(const timer16_Sequence_t, Tc*, const uint8_t);
|
||||||
|
|
||||||
#ifdef _useTimer1
|
#ifdef _useTimer1
|
||||||
void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
|
void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
|
||||||
@ -70,88 +70,92 @@ void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel);
|
|||||||
void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
|
void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) {
|
void Servo_Handler(const timer16_Sequence_t timer, Tc *tc, const uint8_t channel) {
|
||||||
// clear interrupt
|
static int8_t Channel[_Nbr_16timers]; // Servo counters to pulse (or -1 for refresh interval)
|
||||||
tc->TC_CHANNEL[channel].TC_SR;
|
int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
|
||||||
if (Channel[timer] < 0)
|
if (cho < 0) { // Channel -1 indicates the refresh interval completed...
|
||||||
tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer
|
tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // ...so reset the timer
|
||||||
else if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive)
|
if (DisablePending[timer]) {
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated
|
// Disabling only after the full servo period expires prevents
|
||||||
|
// pulses being too close together if immediately re-enabled.
|
||||||
|
DisablePending.clear(timer);
|
||||||
|
TC_Stop(tc, channel);
|
||||||
|
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
|
||||||
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
|
||||||
|
|
||||||
Channel[timer]++; // increment to the next channel
|
Channel[timer] = ++cho; // go to the next channel (or 0)
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) {
|
if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
|
||||||
tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks;
|
tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer, cho).ticks;
|
||||||
if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated
|
if (SERVO(timer, cho).Pin.isActive) // activated?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // its an active channel so pulse it high
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// finished all channels so wait for the refresh period to expire before starting over
|
// finished all channels so wait for the refresh period to expire before starting over
|
||||||
tc->TC_CHANNEL[channel].TC_RA =
|
const unsigned int cval = tc->TC_CHANNEL[channel].TC_CV + 128 / (SERVO_TIMER_PRESCALER), // allow 128 cycles to ensure the next CV not missed
|
||||||
tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4
|
ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
|
||||||
? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed
|
tc->TC_CHANNEL[channel].TC_RA = max(cval, ival);
|
||||||
: tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed
|
|
||||||
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel
|
Channel[timer] = -1; // reset the timer CCR on the next call
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
|
static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
|
||||||
pmc_enable_periph_clk(id);
|
pmc_enable_periph_clk(id);
|
||||||
TC_Configure(tc, channel,
|
TC_Configure(tc, channel,
|
||||||
TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32
|
TC_CMR_WAVE // Waveform mode
|
||||||
TC_CMR_WAVE | // Waveform mode
|
| TC_CMR_WAVSEL_UP_RC // Counter running up and reset when equal to RC
|
||||||
TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC
|
| (SERVO_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0) // MCK/2
|
||||||
|
| (SERVO_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0) // MCK/8
|
||||||
|
| (SERVO_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0) // MCK/32
|
||||||
|
| (SERVO_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0) // MCK/128
|
||||||
|
);
|
||||||
|
|
||||||
/* 84MHz, MCK/32, for 1.5ms: 3937 */
|
// Wait 1ms before the first ISR
|
||||||
TC_SetRA(tc, channel, 2625); // 1ms
|
TC_SetRA(tc, channel, (F_CPU) / (SERVO_TIMER_PRESCALER) / 1000UL); // 1ms
|
||||||
|
|
||||||
/* Configure and enable interrupt */
|
// Configure and enable interrupt
|
||||||
NVIC_EnableIRQ(irqn);
|
NVIC_EnableIRQ(irqn);
|
||||||
// TC_IER_CPAS: RA Compare
|
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; // TC_IER_CPAS: RA Compare
|
||||||
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS;
|
|
||||||
|
|
||||||
// Enables the timer clock and performs a software reset to start the counting
|
// Enables the timer clock and performs a software reset to start the counting
|
||||||
TC_Start(tc, channel);
|
TC_Start(tc, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initISR(timer16_Sequence_t timer) {
|
void initISR(const timer16_Sequence_t timer_index) {
|
||||||
|
CRITICAL_SECTION_START();
|
||||||
|
const bool disable_soon = DisablePending[timer_index];
|
||||||
|
DisablePending.clear(timer_index);
|
||||||
|
CRITICAL_SECTION_END();
|
||||||
|
|
||||||
|
if (!disable_soon) switch (timer_index) {
|
||||||
|
default: break;
|
||||||
#ifdef _useTimer1
|
#ifdef _useTimer1
|
||||||
if (timer == _timer1)
|
case _timer1: return _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
|
||||||
_initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _useTimer2
|
#ifdef _useTimer2
|
||||||
if (timer == _timer2)
|
case _timer2: return _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
|
||||||
_initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _useTimer3
|
#ifdef _useTimer3
|
||||||
if (timer == _timer3)
|
case _timer3: return _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
|
||||||
_initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _useTimer4
|
#ifdef _useTimer4
|
||||||
if (timer == _timer4)
|
case _timer4: return _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
|
||||||
_initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _useTimer5
|
#ifdef _useTimer5
|
||||||
if (timer == _timer5)
|
case _timer5: return _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
|
||||||
_initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void finISR(timer16_Sequence_t) {
|
void finISR(const timer16_Sequence_t timer_index) {
|
||||||
#ifdef _useTimer1
|
// Timer is disabled from the ISR, to ensure proper final pulse length.
|
||||||
TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1);
|
DisablePending.set(timer_index);
|
||||||
#endif
|
|
||||||
#ifdef _useTimer2
|
|
||||||
TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer3
|
|
||||||
TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer4
|
|
||||||
TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer5
|
|
||||||
TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_SERVOS
|
#endif // HAS_SERVOS
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
#define _useTimer5
|
#define _useTimer5
|
||||||
|
|
||||||
#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
|
#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
|
||||||
#define SERVO_TIMER_PRESCALER 32 // timer prescaler
|
#define SERVO_TIMER_PRESCALER 2 // timer prescaler
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TC0, chan 0 => TC0_Handler
|
TC0, chan 0 => TC0_Handler
|
||||||
|
@ -35,20 +35,20 @@
|
|||||||
static pin_t tone_pin;
|
static pin_t tone_pin;
|
||||||
volatile static int32_t toggles;
|
volatile static int32_t toggles;
|
||||||
|
|
||||||
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) {
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration/*=0*/) {
|
||||||
tone_pin = _pin;
|
tone_pin = _pin;
|
||||||
toggles = 2 * frequency * duration / 1000;
|
toggles = 2 * frequency * duration / 1000;
|
||||||
HAL_timer_start(TONE_TIMER_NUM, 2 * frequency);
|
HAL_timer_start(MF_TIMER_TONE, 2 * frequency);
|
||||||
}
|
}
|
||||||
|
|
||||||
void noTone(const pin_t _pin) {
|
void noTone(const pin_t _pin) {
|
||||||
HAL_timer_disable_interrupt(TONE_TIMER_NUM);
|
HAL_timer_disable_interrupt(MF_TIMER_TONE);
|
||||||
extDigitalWrite(_pin, LOW);
|
extDigitalWrite(_pin, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_TONE_TIMER_ISR() {
|
HAL_TONE_TIMER_ISR() {
|
||||||
static uint8_t pin_state = 0;
|
static uint8_t pin_state = 0;
|
||||||
HAL_timer_isr_prologue(TONE_TIMER_NUM);
|
HAL_timer_isr_prologue(MF_TIMER_TONE);
|
||||||
|
|
||||||
if (toggles) {
|
if (toggles) {
|
||||||
toggles--;
|
toggles--;
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Based on u8g_com_msp430_hw_spi.c
|
* Based on u8g_com_msp430_hw_spi.c
|
||||||
*
|
*
|
||||||
@ -60,16 +59,15 @@
|
|||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#include "../../../MarlinCore.h"
|
#include "../../../MarlinCore.h"
|
||||||
|
|
||||||
void spiBegin();
|
#ifndef LCD_SPI_SPEED
|
||||||
void spiInit(uint8_t spiRate);
|
#define LCD_SPI_SPEED SPI_QUARTER_SPEED
|
||||||
void spiSend(uint8_t b);
|
#endif
|
||||||
void spiSend(const uint8_t* buf, size_t n);
|
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/HAL_SPI.h"
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) {
|
||||||
@ -100,11 +98,7 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
|
|
||||||
spiBegin();
|
spiBegin();
|
||||||
|
|
||||||
#ifndef SPI_SPEED
|
spiInit(LCD_SPI_SPEED);
|
||||||
#define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card
|
|
||||||
#endif
|
|
||||||
spiInit(2);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
|
||||||
|
@ -57,11 +57,12 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(U8GLIB_ST7920)
|
#if IS_U8GLIB_ST7920
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
@ -145,7 +146,7 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
#include "../../../lcd/ultralcd.h"
|
#include "../../../lcd/marlinui.h"
|
||||||
#include "../../shared/HAL_ST7920.h"
|
#include "../../shared/HAL_ST7920.h"
|
||||||
|
|
||||||
#define ST7920_CS_PIN LCD_PINS_RS
|
#define ST7920_CS_PIN LCD_PINS_RS
|
||||||
@ -181,5 +182,5 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
|
|||||||
}
|
}
|
||||||
#endif // LIGHTWEIGHT_UI
|
#endif // LIGHTWEIGHT_UI
|
||||||
|
|
||||||
#endif // U8GLIB_ST7920
|
#endif // IS_U8GLIB_ST7920
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@ -57,17 +57,14 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
|
#if HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
|
||||||
|
|
||||||
#undef SPI_SPEED
|
|
||||||
#define SPI_SPEED 2 // About 2 MHz
|
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#if ENABLED(FYSETC_MINI_12864)
|
#if ENABLED(FYSETC_MINI_12864)
|
||||||
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
|
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
|
||||||
@ -144,5 +141,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
|
#endif // HAS_MARLINUI_U8GLIB && !IS_U8GLIB_ST7920
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
@ -59,9 +59,10 @@
|
|||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
#include "u8g_com_HAL_DUE_sw_spi_shared.h"
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
#include "../../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include <U8glib.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
|
void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index);
|
||||||
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
|
void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level);
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
#define EEPROMSize 4096
|
#define EEPROMSize 4096
|
||||||
#define PagesPerGroup 128
|
#define PagesPerGroup 128
|
||||||
#define GroupCount 2
|
#define GroupCount 2
|
||||||
#define PageSize 256u
|
#define PageSize 256U
|
||||||
|
|
||||||
/* Flash storage */
|
/* Flash storage */
|
||||||
typedef struct FLASH_SECTOR {
|
typedef struct FLASH_SECTOR {
|
||||||
@ -199,10 +199,9 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
for (i = 0; i <PageSize >> 2; i++)
|
for (i = 0; i <PageSize >> 2; i++)
|
||||||
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
|
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM PageWrite ", page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM PageWrite ", page);
|
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
||||||
DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
|
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
||||||
DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0));
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Get the page relative to the start of the EFC controller, and the EFC controller to use
|
// Get the page relative to the start of the EFC controller, and the EFC controller to use
|
||||||
@ -245,8 +244,7 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Unlock failure for page ", page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ", page);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,8 +268,7 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Write failure for page ", page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Write failure for page ", page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -286,8 +283,7 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
if (memcmp(getFlashStorage(page),data,PageSize)) {
|
if (memcmp(getFlashStorage(page),data,PageSize)) {
|
||||||
|
|
||||||
#ifdef EE_EMU_DEBUG
|
#ifdef EE_EMU_DEBUG
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Verify Write failure for page ", page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Verify Write failure for page ", page);
|
|
||||||
|
|
||||||
ee_Dump( page, (uint32_t *)addrflash);
|
ee_Dump( page, (uint32_t *)addrflash);
|
||||||
ee_Dump(-page, data);
|
ee_Dump(-page, data);
|
||||||
@ -306,7 +302,7 @@ static bool ee_PageWrite(uint16_t page, const void* data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DEBUG_ECHOLNPAIR("--> Differing bits: ", count);
|
DEBUG_ECHOLNPGM("--> Differing bits: ", count);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -325,10 +321,9 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
uint16_t i;
|
uint16_t i;
|
||||||
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM PageErase ", page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM PageErase ", page);
|
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
||||||
DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash);
|
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
||||||
DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0));
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Get the page relative to the start of the EFC controller, and the EFC controller to use
|
// Get the page relative to the start of the EFC controller, and the EFC controller to use
|
||||||
@ -370,8 +365,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Unlock failure for page ",page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ",page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -394,8 +388,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Erase failure for page ",page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Erase failure for page ",page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -410,8 +403,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
uint32_t * aligned_src = (uint32_t *) addrflash;
|
uint32_t * aligned_src = (uint32_t *) addrflash;
|
||||||
for (i = 0; i < PageSize >> 2; i++) {
|
for (i = 0; i < PageSize >> 2; i++) {
|
||||||
if (*aligned_src++ != 0xFFFFFFFF) {
|
if (*aligned_src++ != 0xFFFFFFFF) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Verify Erase failure for page ",page);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page);
|
|
||||||
ee_Dump(page, (uint32_t *)addrflash);
|
ee_Dump(page, (uint32_t *)addrflash);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -921,8 +913,7 @@ static void ee_Init() {
|
|||||||
// If all groups seem to be used, default to first group
|
// If all groups seem to be used, default to first group
|
||||||
if (curGroup >= GroupCount) curGroup = 0;
|
if (curGroup >= GroupCount) curGroup = 0;
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Current Group: ",curGroup);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Current Group: ",curGroup);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Now, validate that all the other group pages are empty
|
// Now, validate that all the other group pages are empty
|
||||||
@ -931,8 +922,7 @@ static void ee_Init() {
|
|||||||
|
|
||||||
for (int page = 0; page < PagesPerGroup; page++) {
|
for (int page = 0; page < PagesPerGroup; page++) {
|
||||||
if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
|
if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on group ", grp);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
ee_PageErase(grp * PagesPerGroup + page);
|
ee_PageErase(grp * PagesPerGroup + page);
|
||||||
}
|
}
|
||||||
@ -948,15 +938,13 @@ static void ee_Init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Active page: ", curPage);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Active page: ", curPage);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Make sure the pages following the first clean one are also clean
|
// Make sure the pages following the first clean one are also clean
|
||||||
for (int page = curPage + 1; page < PagesPerGroup; page++) {
|
for (int page = curPage + 1; page < PagesPerGroup; page++) {
|
||||||
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
|
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on active group ", curGroup);
|
||||||
DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
|
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
|
||||||
ee_PageErase(curGroup * PagesPerGroup + page);
|
ee_PageErase(curGroup * PagesPerGroup + page);
|
||||||
@ -976,14 +964,13 @@ bool PersistentStore::access_start() { ee_Init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != ee_Read(uint32_t(p))) {
|
|
||||||
ee_Write(uint32_t(p), v);
|
ee_Write(uint32_t(p), v);
|
||||||
delay(2);
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (ee_Read(uint32_t(p)) != v) {
|
if (ee_Read(uint32_t(p)) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
|
@ -42,14 +42,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; }
|
|||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)pos;
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
// EEPROM has only ~100,000 write cycles,
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
// so only write bytes that have changed!
|
|
||||||
if (v != eeprom_read_byte(p)) {
|
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
delay(2);
|
if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
|
||||||
if (eeprom_read_byte(p) != v) {
|
if (eeprom_read_byte(p) != v) {
|
||||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||||
return true;
|
return true;
|
||||||
|
@ -64,4 +64,16 @@ void setup_endstop_interrupts() {
|
|||||||
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
|
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
|
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
|
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
|
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
|
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
|
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
|
TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
|
||||||
|
TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
|
||||||
|
TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
|
||||||
|
TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
|
||||||
|
TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
|
||||||
|
TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
* For ARDUINO_ARCH_SAM
|
* For ARDUINO_ARCH_SAM
|
||||||
* Note the code here was specifically crafted by disassembling what GCC produces
|
* Note the code here was specifically crafted by disassembling what GCC produces
|
||||||
* out of it, so GCC is able to optimize it out as much as possible to the least
|
* out of it, so GCC is able to optimize it out as much as possible to the least
|
||||||
* amount of instructions. Be very carefull if you modify them, as "clean code"
|
* amount of instructions. Be very careful if you modify them, as "clean code"
|
||||||
* leads to less efficient compiled code!!
|
* leads to less efficient compiled code!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -50,7 +50,7 @@
|
|||||||
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
#define PWM_PIN(P) WITHIN(P, 2, 13)
|
||||||
|
|
||||||
#ifndef MASK
|
#ifndef MASK
|
||||||
#define MASK(PIN) (1 << PIN)
|
#define MASK(PIN) _BV(PIN)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,6 +163,9 @@
|
|||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||||
// Set pin as input with pullup (wrapper)
|
// Set pin as input with pullup (wrapper)
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
// Set pin as input with pulldown (substitution)
|
||||||
|
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||||
|
|
||||||
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
// Set pin as output (wrapper) - reads the pin and sets the output to that value
|
||||||
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
|
||||||
// Set pin as PWM
|
// Set pin as PWM
|
||||||
@ -477,7 +480,7 @@
|
|||||||
#define DIO91_PIN 15
|
#define DIO91_PIN 15
|
||||||
#define DIO91_WPORT PIOB
|
#define DIO91_WPORT PIOB
|
||||||
|
|
||||||
#if ARDUINO_SAM_ARCHIM
|
#ifdef ARDUINO_SAM_ARCHIM
|
||||||
|
|
||||||
#define DIO92_PIN 11
|
#define DIO92_PIN 11
|
||||||
#define DIO92_WPORT PIOC
|
#define DIO92_WPORT PIOC
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
* is NOT used to directly toggle pins. The ISR writes to the pin assigned to
|
* is NOT used to directly toggle pins. The ISR writes to the pin assigned to
|
||||||
* that interrupt.
|
* that interrupt.
|
||||||
*
|
*
|
||||||
* All PWMs use the same repetition rate. The G2 needs about 10KHz min in order to
|
* All PWMs use the same repetition rate. The G2 needs about 10kHz min in order to
|
||||||
* not have obvious ripple on the Vref signals.
|
* not have obvious ripple on the Vref signals.
|
||||||
*
|
*
|
||||||
* The data structures are setup to minimize the computation done by the ISR which
|
* The data structures are setup to minimize the computation done by the ISR which
|
||||||
@ -154,7 +154,7 @@ void Stepper::digipot_init() {
|
|||||||
NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
|
NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stepper::digipot_current(const uint8_t driver, const int16_t current) {
|
void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) {
|
||||||
|
|
||||||
if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed
|
if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed
|
||||||
|
|
||||||
|
@ -25,6 +25,30 @@
|
|||||||
* Test Arduino Due specific configuration values for errors at compile-time.
|
* Test Arduino Due specific configuration values for errors at compile-time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for common serial pin conflicts
|
||||||
|
*/
|
||||||
|
#define CHECK_SERIAL_PIN(N) ( \
|
||||||
|
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|
||||||
|
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|
||||||
|
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|
||||||
|
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|
||||||
|
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|
||||||
|
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|
||||||
|
)
|
||||||
|
#if SERIAL_IN_USE(0) // D0-D1. No known conflicts.
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
|
||||||
|
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
|
||||||
|
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
|
||||||
|
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#undef CHECK_SERIAL_PIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HARDWARE VS. SOFTWARE SPI COMPATIBILITY
|
* HARDWARE VS. SOFTWARE SPI COMPATIBILITY
|
||||||
*
|
*
|
||||||
@ -40,7 +64,7 @@
|
|||||||
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
||||||
* as the TMC2130 soft SPI the most common setup.
|
* as the TMC2130 soft SPI the most common setup.
|
||||||
*/
|
*/
|
||||||
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN))
|
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
||||||
#if ENABLED(TMC_USE_SW_SPI)
|
#if ENABLED(TMC_USE_SW_SPI)
|
||||||
@ -57,5 +81,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
#error "TMC220x Software Serial is not supported on this platform."
|
#error "TMC220x Software Serial is not supported on the DUE platform."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USING_PULLDOWNS
|
||||||
|
#error "PULLDOWN pin mode is not available on DUE boards."
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
*
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@ -50,7 +53,7 @@
|
|||||||
* The net result is that both the g_pinStatus[pin] array and the PIO_OSR register
|
* The net result is that both the g_pinStatus[pin] array and the PIO_OSR register
|
||||||
* needs to be looked at when determining if a pin is an input or an output.
|
* needs to be looked at when determining if a pin is an input or an output.
|
||||||
*
|
*
|
||||||
* b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz
|
* b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1kHz
|
||||||
*
|
*
|
||||||
* c) NUM_DIGITAL_PINS does not include the analog pins
|
* c) NUM_DIGITAL_PINS does not include the analog pins
|
||||||
*
|
*
|
||||||
@ -64,9 +67,10 @@
|
|||||||
#define PRINT_PORT(p)
|
#define PRINT_PORT(p)
|
||||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
||||||
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
||||||
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
|
#define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
|
||||||
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
|
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
|
||||||
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||||
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
||||||
@ -82,11 +86,10 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|
|||||||
|| pwm_status(pin));
|
|| pwm_status(pin));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pwm_details(int32_t pin) {
|
void pwm_details(int32_t pin) {
|
||||||
if (pwm_status(pin)) {
|
if (pwm_status(pin)) {
|
||||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||||
SERIAL_ECHOPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,22 +43,22 @@
|
|||||||
#define SPI_PIN 87
|
#define SPI_PIN 87
|
||||||
#define SPI_CHAN 1
|
#define SPI_CHAN 1
|
||||||
#endif
|
#endif
|
||||||
#define SCK_PIN 76
|
#define SD_SCK_PIN 76
|
||||||
#define MISO_PIN 74
|
#define SD_MISO_PIN 74
|
||||||
#define MOSI_PIN 75
|
#define SD_MOSI_PIN 75
|
||||||
#else
|
#else
|
||||||
// defaults
|
// defaults
|
||||||
#define DUE_SOFTWARE_SPI
|
#define DUE_SOFTWARE_SPI
|
||||||
#ifndef SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
#ifndef MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define MISO_PIN 50
|
#define SD_MISO_PIN 50
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define MOSI_PIN 51
|
#define SD_MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* A.28, A.29, B.21, C.26, C.29 */
|
/* A.28, A.29, B.21, C.26, C.29 */
|
||||||
#define SS_PIN SDSS
|
#define SD_SS_PIN SDSS
|
||||||
|
@ -21,9 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL Timers for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
@ -44,7 +42,7 @@
|
|||||||
// Private Variables
|
// Private Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
|
const tTimerConfig timer_config[NUM_HARDWARE_TIMERS] = {
|
||||||
{ TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5]
|
{ TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5]
|
||||||
{ TC0, 1, TC1_IRQn, 0}, // 1
|
{ TC0, 1, TC1_IRQn, 0}, // 1
|
||||||
{ TC0, 2, TC2_IRQn, 2}, // 2 - stepper
|
{ TC0, 2, TC2_IRQn, 2}, // 2 - stepper
|
||||||
@ -68,9 +66,9 @@ const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||||
Tc *tc = TimerConfig[timer_num].pTimerRegs;
|
Tc *tc = timer_config[timer_num].pTimerRegs;
|
||||||
IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
|
IRQn_Type irq = timer_config[timer_num].IRQ_Id;
|
||||||
uint32_t channel = TimerConfig[timer_num].channel;
|
uint32_t channel = timer_config[timer_num].channel;
|
||||||
|
|
||||||
// Disable interrupt, just in case it was already enabled
|
// Disable interrupt, just in case it was already enabled
|
||||||
NVIC_DisableIRQ(irq);
|
NVIC_DisableIRQ(irq);
|
||||||
@ -88,13 +86,20 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
|||||||
|
|
||||||
pmc_set_writeprotect(false);
|
pmc_set_writeprotect(false);
|
||||||
pmc_enable_periph_clk((uint32_t)irq);
|
pmc_enable_periph_clk((uint32_t)irq);
|
||||||
NVIC_SetPriority(irq, TimerConfig [timer_num].priority);
|
NVIC_SetPriority(irq, timer_config[timer_num].priority);
|
||||||
|
|
||||||
// wave mode, reset counter on match with RC,
|
// wave mode, reset counter on match with RC,
|
||||||
TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1);
|
TC_Configure(tc, channel,
|
||||||
|
TC_CMR_WAVE
|
||||||
|
| TC_CMR_WAVSEL_UP_RC
|
||||||
|
| (HAL_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0)
|
||||||
|
);
|
||||||
|
|
||||||
// Set compare value
|
// Set compare value
|
||||||
TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency);
|
TC_SetRC(tc, channel, VARIANT_MCK / (HAL_TIMER_PRESCALER) / frequency);
|
||||||
|
|
||||||
// And start timer
|
// And start timer
|
||||||
TC_Start(tc, channel);
|
TC_Start(tc, channel);
|
||||||
@ -107,12 +112,12 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HAL_timer_enable_interrupt(const uint8_t timer_num) {
|
void HAL_timer_enable_interrupt(const uint8_t timer_num) {
|
||||||
IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
|
IRQn_Type irq = timer_config[timer_num].IRQ_Id;
|
||||||
NVIC_EnableIRQ(irq);
|
NVIC_EnableIRQ(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
||||||
IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
|
IRQn_Type irq = timer_config[timer_num].IRQ_Id;
|
||||||
NVIC_DisableIRQ(irq);
|
NVIC_DisableIRQ(irq);
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
@ -123,11 +128,11 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num) {
|
|||||||
|
|
||||||
// missing from CMSIS: Check if interrupt is enabled or not
|
// missing from CMSIS: Check if interrupt is enabled or not
|
||||||
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) {
|
||||||
return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0;
|
return TEST(NVIC->ISER[uint32_t(IRQn) >> 5], uint32_t(IRQn) & 0x1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num) {
|
||||||
IRQn_Type irq = TimerConfig[timer_num].IRQ_Id;
|
IRQn_Type irq = timer_config[timer_num].IRQ_Id;
|
||||||
return NVIC_GetEnabledIRQ(irq);
|
return NVIC_GetEnabledIRQ(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,9 +21,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL Timers for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -37,19 +35,20 @@
|
|||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
#define HAL_TIMER_PRESCALER 2
|
||||||
|
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
||||||
|
|
||||||
#ifndef STEP_TIMER_NUM
|
#ifndef MF_TIMER_STEP
|
||||||
#define STEP_TIMER_NUM 2 // Timer Index for Stepper
|
#define MF_TIMER_STEP 2 // Timer Index for Stepper
|
||||||
#endif
|
#endif
|
||||||
#ifndef PULSE_TIMER_NUM
|
#ifndef MF_TIMER_PULSE
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define MF_TIMER_PULSE MF_TIMER_STEP
|
||||||
#endif
|
#endif
|
||||||
#ifndef TEMP_TIMER_NUM
|
#ifndef MF_TIMER_TEMP
|
||||||
#define TEMP_TIMER_NUM 4 // Timer Index for Temperature
|
#define MF_TIMER_TEMP 4 // Timer Index for Temperature
|
||||||
#endif
|
#endif
|
||||||
#ifndef TONE_TIMER_NUM
|
#ifndef MF_TIMER_TONE
|
||||||
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
|
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
@ -62,12 +61,12 @@ typedef uint32_t hal_timer_t;
|
|||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM)
|
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||||
|
|
||||||
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM)
|
#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
|
||||||
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM)
|
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
|
||||||
|
|
||||||
#ifndef HAL_STEP_TIMER_ISR
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
#define HAL_STEP_TIMER_ISR() void TC2_Handler()
|
#define HAL_STEP_TIMER_ISR() void TC2_Handler()
|
||||||
@ -94,7 +93,7 @@ typedef struct {
|
|||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
extern const tTimerConfig TimerConfig[];
|
extern const tTimerConfig timer_config[];
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
@ -103,17 +102,17 @@ extern const tTimerConfig TimerConfig[];
|
|||||||
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
|
void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency);
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
|
FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) {
|
||||||
const tTimerConfig * const pConfig = &TimerConfig[timer_num];
|
const tTimerConfig * const pConfig = &timer_config[timer_num];
|
||||||
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare;
|
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
|
FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) {
|
||||||
const tTimerConfig * const pConfig = &TimerConfig[timer_num];
|
const tTimerConfig * const pConfig = &timer_config[timer_num];
|
||||||
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC;
|
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
|
FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) {
|
||||||
const tTimerConfig * const pConfig = &TimerConfig[timer_num];
|
const tTimerConfig * const pConfig = &timer_config[timer_num];
|
||||||
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV;
|
return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,9 +121,9 @@ void HAL_timer_disable_interrupt(const uint8_t timer_num);
|
|||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
||||||
|
|
||||||
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
||||||
const tTimerConfig * const pConfig = &TimerConfig[timer_num];
|
const tTimerConfig * const pConfig = &timer_config[timer_num];
|
||||||
// Reading the status register clears the interrupt flag
|
// Reading the status register clears the interrupt flag
|
||||||
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HAL_timer_isr_epilogue(TIMER_NUM)
|
#define HAL_timer_isr_epilogue(T) NOOP
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
# Windows: bossac.exe
|
# Windows: bossac.exe
|
||||||
# Other: leave unchanged
|
# Other: leave unchanged
|
||||||
#
|
#
|
||||||
|
import pioutil
|
||||||
|
if pioutil.is_pio_build():
|
||||||
import platform
|
import platform
|
||||||
current_OS = platform.system()
|
current_OS = platform.system()
|
||||||
|
|
||||||
@ -14,5 +15,5 @@ if current_OS == 'Windows':
|
|||||||
|
|
||||||
# Use bossac.exe on Windows
|
# Use bossac.exe on Windows
|
||||||
env.Replace(
|
env.Replace(
|
||||||
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot"
|
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
|
||||||
)
|
)
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \page arduino_due_x_board_info "Arduino Due/X - Board informations"
|
* \page arduino_due_x_board_info "Arduino Due/X - Board information"
|
||||||
* This page lists several definition related to the board description.
|
* This page lists several definition related to the board description.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -609,37 +609,37 @@ typedef struct
|
|||||||
# define clz(u) ((u) ? __CLZ(u) : 32)
|
# define clz(u) ((u) ? __CLZ(u) : 32)
|
||||||
#else
|
#else
|
||||||
# define clz(u) (((u) == 0) ? 32 : \
|
# define clz(u) (((u) == 0) ? 32 : \
|
||||||
((u) & (1ul << 31)) ? 0 : \
|
((u) & (1UL << 31)) ? 0 : \
|
||||||
((u) & (1ul << 30)) ? 1 : \
|
((u) & (1UL << 30)) ? 1 : \
|
||||||
((u) & (1ul << 29)) ? 2 : \
|
((u) & (1UL << 29)) ? 2 : \
|
||||||
((u) & (1ul << 28)) ? 3 : \
|
((u) & (1UL << 28)) ? 3 : \
|
||||||
((u) & (1ul << 27)) ? 4 : \
|
((u) & (1UL << 27)) ? 4 : \
|
||||||
((u) & (1ul << 26)) ? 5 : \
|
((u) & (1UL << 26)) ? 5 : \
|
||||||
((u) & (1ul << 25)) ? 6 : \
|
((u) & (1UL << 25)) ? 6 : \
|
||||||
((u) & (1ul << 24)) ? 7 : \
|
((u) & (1UL << 24)) ? 7 : \
|
||||||
((u) & (1ul << 23)) ? 8 : \
|
((u) & (1UL << 23)) ? 8 : \
|
||||||
((u) & (1ul << 22)) ? 9 : \
|
((u) & (1UL << 22)) ? 9 : \
|
||||||
((u) & (1ul << 21)) ? 10 : \
|
((u) & (1UL << 21)) ? 10 : \
|
||||||
((u) & (1ul << 20)) ? 11 : \
|
((u) & (1UL << 20)) ? 11 : \
|
||||||
((u) & (1ul << 19)) ? 12 : \
|
((u) & (1UL << 19)) ? 12 : \
|
||||||
((u) & (1ul << 18)) ? 13 : \
|
((u) & (1UL << 18)) ? 13 : \
|
||||||
((u) & (1ul << 17)) ? 14 : \
|
((u) & (1UL << 17)) ? 14 : \
|
||||||
((u) & (1ul << 16)) ? 15 : \
|
((u) & (1UL << 16)) ? 15 : \
|
||||||
((u) & (1ul << 15)) ? 16 : \
|
((u) & (1UL << 15)) ? 16 : \
|
||||||
((u) & (1ul << 14)) ? 17 : \
|
((u) & (1UL << 14)) ? 17 : \
|
||||||
((u) & (1ul << 13)) ? 18 : \
|
((u) & (1UL << 13)) ? 18 : \
|
||||||
((u) & (1ul << 12)) ? 19 : \
|
((u) & (1UL << 12)) ? 19 : \
|
||||||
((u) & (1ul << 11)) ? 20 : \
|
((u) & (1UL << 11)) ? 20 : \
|
||||||
((u) & (1ul << 10)) ? 21 : \
|
((u) & (1UL << 10)) ? 21 : \
|
||||||
((u) & (1ul << 9)) ? 22 : \
|
((u) & (1UL << 9)) ? 22 : \
|
||||||
((u) & (1ul << 8)) ? 23 : \
|
((u) & (1UL << 8)) ? 23 : \
|
||||||
((u) & (1ul << 7)) ? 24 : \
|
((u) & (1UL << 7)) ? 24 : \
|
||||||
((u) & (1ul << 6)) ? 25 : \
|
((u) & (1UL << 6)) ? 25 : \
|
||||||
((u) & (1ul << 5)) ? 26 : \
|
((u) & (1UL << 5)) ? 26 : \
|
||||||
((u) & (1ul << 4)) ? 27 : \
|
((u) & (1UL << 4)) ? 27 : \
|
||||||
((u) & (1ul << 3)) ? 28 : \
|
((u) & (1UL << 3)) ? 28 : \
|
||||||
((u) & (1ul << 2)) ? 29 : \
|
((u) & (1UL << 2)) ? 29 : \
|
||||||
((u) & (1ul << 1)) ? 30 : \
|
((u) & (1UL << 1)) ? 30 : \
|
||||||
31)
|
31)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -654,38 +654,38 @@ typedef struct
|
|||||||
#if (defined __GNUC__) || (defined __CC_ARM)
|
#if (defined __GNUC__) || (defined __CC_ARM)
|
||||||
# define ctz(u) ((u) ? __builtin_ctz(u) : 32)
|
# define ctz(u) ((u) ? __builtin_ctz(u) : 32)
|
||||||
#else
|
#else
|
||||||
# define ctz(u) ((u) & (1ul << 0) ? 0 : \
|
# define ctz(u) ((u) & (1UL << 0) ? 0 : \
|
||||||
(u) & (1ul << 1) ? 1 : \
|
(u) & (1UL << 1) ? 1 : \
|
||||||
(u) & (1ul << 2) ? 2 : \
|
(u) & (1UL << 2) ? 2 : \
|
||||||
(u) & (1ul << 3) ? 3 : \
|
(u) & (1UL << 3) ? 3 : \
|
||||||
(u) & (1ul << 4) ? 4 : \
|
(u) & (1UL << 4) ? 4 : \
|
||||||
(u) & (1ul << 5) ? 5 : \
|
(u) & (1UL << 5) ? 5 : \
|
||||||
(u) & (1ul << 6) ? 6 : \
|
(u) & (1UL << 6) ? 6 : \
|
||||||
(u) & (1ul << 7) ? 7 : \
|
(u) & (1UL << 7) ? 7 : \
|
||||||
(u) & (1ul << 8) ? 8 : \
|
(u) & (1UL << 8) ? 8 : \
|
||||||
(u) & (1ul << 9) ? 9 : \
|
(u) & (1UL << 9) ? 9 : \
|
||||||
(u) & (1ul << 10) ? 10 : \
|
(u) & (1UL << 10) ? 10 : \
|
||||||
(u) & (1ul << 11) ? 11 : \
|
(u) & (1UL << 11) ? 11 : \
|
||||||
(u) & (1ul << 12) ? 12 : \
|
(u) & (1UL << 12) ? 12 : \
|
||||||
(u) & (1ul << 13) ? 13 : \
|
(u) & (1UL << 13) ? 13 : \
|
||||||
(u) & (1ul << 14) ? 14 : \
|
(u) & (1UL << 14) ? 14 : \
|
||||||
(u) & (1ul << 15) ? 15 : \
|
(u) & (1UL << 15) ? 15 : \
|
||||||
(u) & (1ul << 16) ? 16 : \
|
(u) & (1UL << 16) ? 16 : \
|
||||||
(u) & (1ul << 17) ? 17 : \
|
(u) & (1UL << 17) ? 17 : \
|
||||||
(u) & (1ul << 18) ? 18 : \
|
(u) & (1UL << 18) ? 18 : \
|
||||||
(u) & (1ul << 19) ? 19 : \
|
(u) & (1UL << 19) ? 19 : \
|
||||||
(u) & (1ul << 20) ? 20 : \
|
(u) & (1UL << 20) ? 20 : \
|
||||||
(u) & (1ul << 21) ? 21 : \
|
(u) & (1UL << 21) ? 21 : \
|
||||||
(u) & (1ul << 22) ? 22 : \
|
(u) & (1UL << 22) ? 22 : \
|
||||||
(u) & (1ul << 23) ? 23 : \
|
(u) & (1UL << 23) ? 23 : \
|
||||||
(u) & (1ul << 24) ? 24 : \
|
(u) & (1UL << 24) ? 24 : \
|
||||||
(u) & (1ul << 25) ? 25 : \
|
(u) & (1UL << 25) ? 25 : \
|
||||||
(u) & (1ul << 26) ? 26 : \
|
(u) & (1UL << 26) ? 26 : \
|
||||||
(u) & (1ul << 27) ? 27 : \
|
(u) & (1UL << 27) ? 27 : \
|
||||||
(u) & (1ul << 28) ? 28 : \
|
(u) & (1UL << 28) ? 28 : \
|
||||||
(u) & (1ul << 29) ? 29 : \
|
(u) & (1UL << 29) ? 29 : \
|
||||||
(u) & (1ul << 30) ? 30 : \
|
(u) & (1UL << 30) ? 30 : \
|
||||||
(u) & (1ul << 31) ? 31 : \
|
(u) & (1UL << 31) ? 31 : \
|
||||||
32)
|
32)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -1059,7 +1059,7 @@ static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data)
|
|||||||
while (val_index < 8)
|
while (val_index < 8)
|
||||||
{
|
{
|
||||||
data[val_index++] = value & 0xFF;
|
data[val_index++] = value & 0xFF;
|
||||||
value = value >> 8;
|
value >>= 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ Ctrl_status sd_mmc_spi_test_unit_ready() {
|
|||||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||||
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted())
|
||||||
return CTRL_NO_PRESENT;
|
return CTRL_NO_PRESENT;
|
||||||
*nb_sector = card.getSd2Card().cardSize() - 1;
|
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,30 +68,30 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Start reading
|
// Start reading
|
||||||
if (!card.getSd2Card().readStart(addr))
|
if (!card.diskIODriver()->readStart(addr))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// Read a sector
|
// Read a sector
|
||||||
card.getSd2Card().readData(sector_buf);
|
card.diskIODriver()->readData(sector_buf);
|
||||||
|
|
||||||
// RAM -> USB
|
// RAM -> USB
|
||||||
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop reading
|
// Stop reading
|
||||||
card.getSd2Card().readStop();
|
card.diskIODriver()->readStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
@ -108,29 +108,29 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
{
|
{
|
||||||
char buffer[80];
|
char buffer[80];
|
||||||
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr);
|
||||||
PORT_REDIRECT(0);
|
PORT_REDIRECT(SERIAL_PORTMASK(0));
|
||||||
SERIAL_ECHO(buffer);
|
SERIAL_ECHO(buffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!card.getSd2Card().writeStart(addr, nb_sector))
|
if (!card.diskIODriver()->writeStart(addr, nb_sector))
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
|
|
||||||
// For each specified sector
|
// For each specified sector
|
||||||
while (nb_sector--) {
|
while (nb_sector--) {
|
||||||
|
|
||||||
// USB -> RAM
|
// USB -> RAM
|
||||||
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) {
|
if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, nullptr)) {
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
return CTRL_FAIL;
|
return CTRL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write a sector
|
// Write a sector
|
||||||
card.getSd2Card().writeData(sector_buf);
|
card.diskIODriver()->writeData(sector_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop writing
|
// Stop writing
|
||||||
card.getSd2Card().writeStop();
|
card.diskIODriver()->writeStop();
|
||||||
|
|
||||||
// Done
|
// Done
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
|
@ -74,7 +74,7 @@
|
|||||||
#define SD_MMC_REMOVING 2
|
#define SD_MMC_REMOVING 2
|
||||||
|
|
||||||
|
|
||||||
//---- CONTROL FONCTIONS ----
|
//---- CONTROL FUNCTIONS ----
|
||||||
//!
|
//!
|
||||||
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
||||||
//!/
|
//!/
|
||||||
@ -134,7 +134,7 @@ extern bool sd_mmc_spi_wr_protect(void);
|
|||||||
extern bool sd_mmc_spi_removal(void);
|
extern bool sd_mmc_spi_removal(void);
|
||||||
|
|
||||||
|
|
||||||
//---- ACCESS DATA FONCTIONS ----
|
//---- ACCESS DATA FUNCTIONS ----
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
// Standard functions for open in read/write mode the device
|
// Standard functions for open in read/write mode the device
|
||||||
|
@ -90,7 +90,7 @@ typedef struct {
|
|||||||
//! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer)
|
//! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer)
|
||||||
uint8_t *payload;
|
uint8_t *payload;
|
||||||
|
|
||||||
//! Size of buffer to send or fill, and content the number of byte transfered
|
//! Size of buffer to send or fill, and content the number of byte transferred
|
||||||
uint16_t payload_size;
|
uint16_t payload_size;
|
||||||
|
|
||||||
//! Callback called after reception of ZLP from setup request
|
//! Callback called after reception of ZLP from setup request
|
||||||
@ -132,10 +132,10 @@ typedef void (*udd_callback_halt_cleared_t)(void);
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer is complete
|
* \param status UDD_EP_TRANSFER_OK, if transfer is complete
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||||
* \param n number of data transfered
|
* \param n number of data transferred
|
||||||
*/
|
*/
|
||||||
typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
|
typedef void (*udd_callback_trans_t) (udd_ep_status_t status,
|
||||||
iram_size_t nb_transfered, udd_ep_id_t ep);
|
iram_size_t nb_transferred, udd_ep_id_t ep);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Authorizes the VBUS event
|
* \brief Authorizes the VBUS event
|
||||||
@ -303,7 +303,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
|
|||||||
* The driver uses a specific DMA USB to transfer data
|
* The driver uses a specific DMA USB to transfer data
|
||||||
* from internal RAM to endpoint, if this one is available.
|
* from internal RAM to endpoint, if this one is available.
|
||||||
* When the transfer is finished or aborted (stall, reset, ...), the \a callback is called.
|
* When the transfer is finished or aborted (stall, reset, ...), the \a callback is called.
|
||||||
* The \a callback returns the transfer status and eventually the number of byte transfered.
|
* The \a callback returns the transfer status and eventually the number of byte transferred.
|
||||||
* Note: The control endpoint is not authorized.
|
* Note: The control endpoint is not authorized.
|
||||||
*
|
*
|
||||||
* \param ep The ID of the endpoint to use
|
* \param ep The ID of the endpoint to use
|
||||||
|
@ -162,7 +162,7 @@ static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep);
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||||
* \param n number of data transfered
|
* \param n number of data transferred
|
||||||
*/
|
*/
|
||||||
static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
||||||
|
|
||||||
@ -200,7 +200,7 @@ static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
* \param status UDD_EP_TRANSFER_OK, if transfer finished
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||||
* \param n number of data transfered
|
* \param n number of data transferred
|
||||||
*/
|
*/
|
||||||
static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep);
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
//@{
|
//@{
|
||||||
# if UDI_CDC_PORT_NB > 2
|
# if UDI_CDC_PORT_NB > 2
|
||||||
# error USBB, UDP, UDPHS and UOTGHS interfaces have not enought endpoints.
|
# error USBB, UDP, UDPHS and UOTGHS interfaces have not enough endpoints.
|
||||||
# endif
|
# endif
|
||||||
#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX
|
#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX
|
||||||
#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX
|
#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX
|
||||||
|
@ -173,7 +173,7 @@ static void udi_msc_cbw_wait(void);
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||||
* \param nb_received number of data transfered
|
* \param nb_received number of data transferred
|
||||||
*/
|
*/
|
||||||
static void udi_msc_cbw_received(udd_ep_status_t status,
|
static void udi_msc_cbw_received(udd_ep_status_t status,
|
||||||
iram_size_t nb_received, udd_ep_id_t ep);
|
iram_size_t nb_received, udd_ep_id_t ep);
|
||||||
@ -211,7 +211,7 @@ static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size);
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer finish
|
* \param status UDD_EP_TRANSFER_OK, if transfer finish
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer aborted
|
||||||
* \param nb_sent number of data transfered
|
* \param nb_sent number of data transferred
|
||||||
*/
|
*/
|
||||||
static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
||||||
udd_ep_id_t ep);
|
udd_ep_id_t ep);
|
||||||
@ -244,7 +244,7 @@ void udi_msc_csw_send(void);
|
|||||||
*
|
*
|
||||||
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
* \param status UDD_EP_TRANSFER_OK, if transfer is finished
|
||||||
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
* \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted
|
||||||
* \param nb_sent number of data transfered
|
* \param nb_sent number of data transferred
|
||||||
*/
|
*/
|
||||||
static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent,
|
||||||
udd_ep_id_t ep);
|
udd_ep_id_t ep);
|
||||||
@ -463,7 +463,7 @@ uint8_t udi_msc_getsetting(void)
|
|||||||
static void udi_msc_cbw_invalid(void)
|
static void udi_msc_cbw_invalid(void)
|
||||||
{
|
{
|
||||||
if (!udi_msc_b_cbw_invalid)
|
if (!udi_msc_b_cbw_invalid)
|
||||||
return; // Don't re-stall endpoint if error reseted by setup
|
return; // Don't re-stall endpoint if error reset by setup
|
||||||
udd_ep_set_halt(UDI_MSC_EP_OUT);
|
udd_ep_set_halt(UDI_MSC_EP_OUT);
|
||||||
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
||||||
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
|
udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid);
|
||||||
@ -472,7 +472,7 @@ static void udi_msc_cbw_invalid(void)
|
|||||||
static void udi_msc_csw_invalid(void)
|
static void udi_msc_csw_invalid(void)
|
||||||
{
|
{
|
||||||
if (!udi_msc_b_cbw_invalid)
|
if (!udi_msc_b_cbw_invalid)
|
||||||
return; // Don't re-stall endpoint if error reseted by setup
|
return; // Don't re-stall endpoint if error reset by setup
|
||||||
udd_ep_set_halt(UDI_MSC_EP_IN);
|
udd_ep_set_halt(UDI_MSC_EP_IN);
|
||||||
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
// If stall cleared then re-stall it. Only Setup MSC Reset can clear it
|
||||||
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);
|
udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid);
|
||||||
|
@ -325,7 +325,7 @@ static void udd_sleep_mode(bool b_idle)
|
|||||||
/**
|
/**
|
||||||
* \name Control endpoint low level management routine.
|
* \name Control endpoint low level management routine.
|
||||||
*
|
*
|
||||||
* This function performs control endpoint mangement.
|
* This function performs control endpoint management.
|
||||||
* It handle the SETUP/DATA/HANDSHAKE phases of a control transaction.
|
* It handle the SETUP/DATA/HANDSHAKE phases of a control transaction.
|
||||||
*/
|
*/
|
||||||
//@{
|
//@{
|
||||||
@ -397,9 +397,9 @@ static void udd_ctrl_endofrequest(void);
|
|||||||
/**
|
/**
|
||||||
* \brief Main interrupt routine for control endpoint
|
* \brief Main interrupt routine for control endpoint
|
||||||
*
|
*
|
||||||
* This switchs control endpoint events to correct sub function.
|
* This switches control endpoint events to correct sub function.
|
||||||
*
|
*
|
||||||
* \return \c 1 if an event about control endpoint is occured, otherwise \c 0.
|
* \return \c 1 if an event about control endpoint is occurred, otherwise \c 0.
|
||||||
*/
|
*/
|
||||||
static bool udd_ctrl_interrupt(void);
|
static bool udd_ctrl_interrupt(void);
|
||||||
|
|
||||||
@ -410,7 +410,7 @@ static bool udd_ctrl_interrupt(void);
|
|||||||
* \name Management of bulk/interrupt/isochronous endpoints
|
* \name Management of bulk/interrupt/isochronous endpoints
|
||||||
*
|
*
|
||||||
* The UDD manages the data transfer on endpoints:
|
* The UDD manages the data transfer on endpoints:
|
||||||
* - Start data tranfer on endpoint with USB Device DMA
|
* - Start data transfer on endpoint with USB Device DMA
|
||||||
* - Send a ZLP packet if requested
|
* - Send a ZLP packet if requested
|
||||||
* - Call callback registered to signal end of transfer
|
* - Call callback registered to signal end of transfer
|
||||||
* The transfer abort and stall feature are supported.
|
* The transfer abort and stall feature are supported.
|
||||||
@ -431,7 +431,7 @@ typedef struct {
|
|||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
//! Size of buffer to send or fill
|
//! Size of buffer to send or fill
|
||||||
iram_size_t buf_size;
|
iram_size_t buf_size;
|
||||||
//!< Size of data transfered
|
//!< Size of data transferred
|
||||||
iram_size_t buf_cnt;
|
iram_size_t buf_cnt;
|
||||||
//!< Size of data loaded (or prepared for DMA) last time
|
//!< Size of data loaded (or prepared for DMA) last time
|
||||||
iram_size_t buf_load;
|
iram_size_t buf_load;
|
||||||
@ -486,7 +486,7 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
|
|||||||
|
|
||||||
#ifdef UDD_EP_DMA_SUPPORTED
|
#ifdef UDD_EP_DMA_SUPPORTED
|
||||||
/**
|
/**
|
||||||
* \brief Start the next transfer if necessary or complet the job associated.
|
* \brief Start the next transfer if necessary or complete the job associated.
|
||||||
*
|
*
|
||||||
* \param ep endpoint number without direction flag
|
* \param ep endpoint number without direction flag
|
||||||
*/
|
*/
|
||||||
@ -496,9 +496,9 @@ static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_n
|
|||||||
/**
|
/**
|
||||||
* \brief Main interrupt routine for bulk/interrupt/isochronous endpoints
|
* \brief Main interrupt routine for bulk/interrupt/isochronous endpoints
|
||||||
*
|
*
|
||||||
* This switchs endpoint events to correct sub function.
|
* This switches endpoint events to correct sub function.
|
||||||
*
|
*
|
||||||
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0.
|
* \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occurred, otherwise \c 0.
|
||||||
*/
|
*/
|
||||||
static bool udd_ep_interrupt(void);
|
static bool udd_ep_interrupt(void);
|
||||||
|
|
||||||
@ -520,7 +520,7 @@ static bool udd_ep_interrupt(void);
|
|||||||
*
|
*
|
||||||
* Note:
|
* Note:
|
||||||
* Here, the global interrupt mask is not clear when an USB interrupt is enabled
|
* Here, the global interrupt mask is not clear when an USB interrupt is enabled
|
||||||
* because this one can not be occured during the USB ISR (=during INTX is masked).
|
* because this one can not be occurred during the USB ISR (=during INTX is masked).
|
||||||
* See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
|
* See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
|
||||||
*/
|
*/
|
||||||
#ifdef UHD_ENABLE
|
#ifdef UHD_ENABLE
|
||||||
@ -787,7 +787,7 @@ void udd_attach(void)
|
|||||||
udd_sleep_mode(true);
|
udd_sleep_mode(true);
|
||||||
otg_unfreeze_clock();
|
otg_unfreeze_clock();
|
||||||
|
|
||||||
// This section of clock check can be improved with a chek of
|
// This section of clock check can be improved with a check of
|
||||||
// USB clock source via sysclk()
|
// USB clock source via sysclk()
|
||||||
// Check USB clock because the source can be a PLL
|
// Check USB clock because the source can be a PLL
|
||||||
while (!Is_otg_clock_usable());
|
while (!Is_otg_clock_usable());
|
||||||
@ -803,7 +803,7 @@ void udd_attach(void)
|
|||||||
#ifdef USB_DEVICE_HS_SUPPORT
|
#ifdef USB_DEVICE_HS_SUPPORT
|
||||||
udd_enable_msof_interrupt();
|
udd_enable_msof_interrupt();
|
||||||
#endif
|
#endif
|
||||||
// Reset following interupts flag
|
// Reset following interrupts flag
|
||||||
udd_ack_reset();
|
udd_ack_reset();
|
||||||
udd_ack_sof();
|
udd_ack_sof();
|
||||||
udd_ack_msof();
|
udd_ack_msof();
|
||||||
@ -902,7 +902,7 @@ bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes,
|
|||||||
}
|
}
|
||||||
dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize);
|
dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize);
|
||||||
|
|
||||||
// Bank choise
|
// Bank choice
|
||||||
switch (bmAttributes & USB_EP_TYPE_MASK) {
|
switch (bmAttributes & USB_EP_TYPE_MASK) {
|
||||||
case USB_EP_TYPE_ISOCHRONOUS:
|
case USB_EP_TYPE_ISOCHRONOUS:
|
||||||
nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep);
|
nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep);
|
||||||
@ -1228,7 +1228,7 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep,
|
|||||||
|
|
||||||
if (Is_udd_endpoint_stall_requested(ep)
|
if (Is_udd_endpoint_stall_requested(ep)
|
||||||
|| ptr_job->stall_requested) {
|
|| ptr_job->stall_requested) {
|
||||||
// Endpoint halted then registes the callback
|
// Endpoint halted then registers the callback
|
||||||
ptr_job->busy = true;
|
ptr_job->busy = true;
|
||||||
ptr_job->call_nohalt = callback;
|
ptr_job->call_nohalt = callback;
|
||||||
} else {
|
} else {
|
||||||
@ -1386,7 +1386,7 @@ static void udd_ctrl_setup_received(void)
|
|||||||
|
|
||||||
// Decode setup request
|
// Decode setup request
|
||||||
if (udc_process_setup() == false) {
|
if (udc_process_setup() == false) {
|
||||||
// Setup request unknow then stall it
|
// Setup request unknown then stall it
|
||||||
udd_ctrl_stall_data();
|
udd_ctrl_stall_data();
|
||||||
udd_ack_setup_received(0);
|
udd_ack_setup_received(0);
|
||||||
return;
|
return;
|
||||||
@ -1447,7 +1447,7 @@ static void udd_ctrl_in_sent(void)
|
|||||||
udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt;
|
udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt;
|
||||||
if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt)
|
if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt)
|
||||||
|| b_shortpacket) {
|
|| b_shortpacket) {
|
||||||
// All data requested are transfered or a short packet has been sent
|
// All data requested are transferred or a short packet has been sent
|
||||||
// then it is the end of data phase.
|
// then it is the end of data phase.
|
||||||
// Generate an OUT ZLP for handshake phase.
|
// Generate an OUT ZLP for handshake phase.
|
||||||
udd_ctrl_send_zlp_out();
|
udd_ctrl_send_zlp_out();
|
||||||
@ -1516,7 +1516,7 @@ static void udd_ctrl_out_received(void)
|
|||||||
// End of SETUP request:
|
// End of SETUP request:
|
||||||
// - Data IN Phase aborted,
|
// - Data IN Phase aborted,
|
||||||
// - or last Data IN Phase hidden by ZLP OUT sending quiclky,
|
// - or last Data IN Phase hidden by ZLP OUT sending quiclky,
|
||||||
// - or ZLP OUT received normaly.
|
// - or ZLP OUT received normally.
|
||||||
udd_ctrl_endofrequest();
|
udd_ctrl_endofrequest();
|
||||||
} else {
|
} else {
|
||||||
// Protocol error during SETUP request
|
// Protocol error during SETUP request
|
||||||
@ -1544,7 +1544,7 @@ static void udd_ctrl_out_received(void)
|
|||||||
(udd_ctrl_prev_payload_buf_cnt +
|
(udd_ctrl_prev_payload_buf_cnt +
|
||||||
udd_ctrl_payload_buf_cnt))) {
|
udd_ctrl_payload_buf_cnt))) {
|
||||||
// End of reception because it is a short packet
|
// End of reception because it is a short packet
|
||||||
// Before send ZLP, call intermediat calback
|
// Before send ZLP, call intermediate callback
|
||||||
// in case of data receiv generate a stall
|
// in case of data receiv generate a stall
|
||||||
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
||||||
if (NULL != udd_g_ctrlreq.over_under_run) {
|
if (NULL != udd_g_ctrlreq.over_under_run) {
|
||||||
@ -1565,7 +1565,7 @@ static void udd_ctrl_out_received(void)
|
|||||||
if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) {
|
if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) {
|
||||||
// Overrun then request a new payload buffer
|
// Overrun then request a new payload buffer
|
||||||
if (!udd_g_ctrlreq.over_under_run) {
|
if (!udd_g_ctrlreq.over_under_run) {
|
||||||
// No callback availabled to request a new payload buffer
|
// No callback available to request a new payload buffer
|
||||||
udd_ctrl_stall_data();
|
udd_ctrl_stall_data();
|
||||||
// Ack reception of OUT to replace NAK by a STALL
|
// Ack reception of OUT to replace NAK by a STALL
|
||||||
udd_ack_out_received(0);
|
udd_ack_out_received(0);
|
||||||
@ -1805,7 +1805,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
|||||||
// transfer size of UDD_ENDPOINT_MAX_TRANS Bytes
|
// transfer size of UDD_ENDPOINT_MAX_TRANS Bytes
|
||||||
next_trans = UDD_ENDPOINT_MAX_TRANS;
|
next_trans = UDD_ENDPOINT_MAX_TRANS;
|
||||||
|
|
||||||
// Set 0 to tranfer the maximum
|
// Set 0 to transfer the maximum
|
||||||
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0);
|
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0);
|
||||||
} else {
|
} else {
|
||||||
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans);
|
udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans);
|
||||||
@ -1850,7 +1850,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
|||||||
}
|
}
|
||||||
cpu_irq_restore(flags);
|
cpu_irq_restore(flags);
|
||||||
|
|
||||||
// Here a ZLP has been recieved
|
// Here a ZLP has been received
|
||||||
// and the DMA transfer must be not started.
|
// and the DMA transfer must be not started.
|
||||||
// It is the end of transfer
|
// It is the end of transfer
|
||||||
ptr_job->buf_size = ptr_job->buf_cnt;
|
ptr_job->buf_size = ptr_job->buf_cnt;
|
||||||
@ -1991,13 +1991,13 @@ static bool udd_ep_interrupt(void)
|
|||||||
}
|
}
|
||||||
dbg_print("dma%x: ", ep);
|
dbg_print("dma%x: ", ep);
|
||||||
udd_disable_endpoint_dma_interrupt(ep);
|
udd_disable_endpoint_dma_interrupt(ep);
|
||||||
// Save number of data no transfered
|
// Save number of data no transferred
|
||||||
nb_remaining = (udd_endpoint_dma_get_status(ep) &
|
nb_remaining = (udd_endpoint_dma_get_status(ep) &
|
||||||
UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk)
|
UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk)
|
||||||
>> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos;
|
>> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos;
|
||||||
if (nb_remaining) {
|
if (nb_remaining) {
|
||||||
// Transfer no complete (short packet or ZLP) then:
|
// Transfer no complete (short packet or ZLP) then:
|
||||||
// Update number of data transfered
|
// Update number of data transferred
|
||||||
ptr_job->buf_cnt -= nb_remaining;
|
ptr_job->buf_cnt -= nb_remaining;
|
||||||
// Set transfer complete to stop the transfer
|
// Set transfer complete to stop the transfer
|
||||||
ptr_job->buf_size = ptr_job->buf_cnt;
|
ptr_job->buf_size = ptr_job->buf_cnt;
|
||||||
@ -2056,7 +2056,7 @@ static bool udd_ep_interrupt(void)
|
|||||||
udd_disable_endpoint_interrupt(ep);
|
udd_disable_endpoint_interrupt(ep);
|
||||||
|
|
||||||
Assert(ptr_job->stall_requested);
|
Assert(ptr_job->stall_requested);
|
||||||
// A stall has been requested during backgound transfer
|
// A stall has been requested during background transfer
|
||||||
ptr_job->stall_requested = false;
|
ptr_job->stall_requested = false;
|
||||||
udd_disable_endpoint_bank_autoswitch(ep);
|
udd_disable_endpoint_bank_autoswitch(ep);
|
||||||
udd_enable_stall_handshake(ep);
|
udd_enable_stall_handshake(ep);
|
||||||
|
@ -130,7 +130,7 @@ struct usb_msc_cbw {
|
|||||||
struct usb_msc_csw {
|
struct usb_msc_csw {
|
||||||
le32_t dCSWSignature; //!< Must contain 'USBS'
|
le32_t dCSWSignature; //!< Must contain 'USBS'
|
||||||
le32_t dCSWTag; //!< Same as dCBWTag
|
le32_t dCSWTag; //!< Same as dCBWTag
|
||||||
le32_t dCSWDataResidue; //!< Number of bytes not transfered
|
le32_t dCSWDataResidue; //!< Number of bytes not transferred
|
||||||
uint8_t bCSWStatus; //!< Status code
|
uint8_t bCSWStatus; //!< Status code
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ void usb_task_idle(void) {
|
|||||||
// Attend SD card access from the USB MSD -- Prioritize access to improve speed
|
// Attend SD card access from the USB MSD -- Prioritize access to improve speed
|
||||||
int delay = 2;
|
int delay = 2;
|
||||||
while (main_b_msc_enable && --delay > 0) {
|
while (main_b_msc_enable && --delay > 0) {
|
||||||
if (udi_msc_process_trans()) delay = 10000;
|
if (udi_msc_process_trans()) delay = 20;
|
||||||
|
|
||||||
// Reset the watchdog, just to be sure
|
// Reset the watchdog, just to be sure
|
||||||
REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5);
|
REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5);
|
||||||
@ -322,7 +322,7 @@ void usb_task_init(void) {
|
|||||||
char *sptr;
|
char *sptr;
|
||||||
|
|
||||||
// Patch in the filament diameter
|
// Patch in the filament diameter
|
||||||
sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0));
|
itoa((int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000), diam, 10);
|
||||||
|
|
||||||
// And copy it to the proper place, expanding it to unicode
|
// And copy it to the proper place, expanding it to unicode
|
||||||
sptr = &diam[0];
|
sptr = &diam[0];
|
||||||
|
@ -1,114 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
// Override Arduino runtime to either config or disable the watchdog
|
|
||||||
//
|
|
||||||
// We need to configure the watchdog as soon as possible in the boot
|
|
||||||
// process, because watchdog initialization at hardware reset on SAM3X8E
|
|
||||||
// is unreliable, and there is risk of unintended resets if we delay
|
|
||||||
// that initialization to a later time.
|
|
||||||
void watchdogSetup() {
|
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
|
|
||||||
// 4 seconds timeout
|
|
||||||
uint32_t timeout = 4000;
|
|
||||||
|
|
||||||
// Calculate timeout value in WDT counter ticks: This assumes
|
|
||||||
// the slow clock is running at 32.768 kHz watchdog
|
|
||||||
// frequency is therefore 32768 / 128 = 256 Hz
|
|
||||||
timeout = (timeout << 8) / 1000;
|
|
||||||
if (timeout == 0)
|
|
||||||
timeout = 1;
|
|
||||||
else if (timeout > 0xFFF)
|
|
||||||
timeout = 0xFFF;
|
|
||||||
|
|
||||||
// We want to enable the watchdog with the specified timeout
|
|
||||||
uint32_t value =
|
|
||||||
WDT_MR_WDV(timeout) | // With the specified timeout
|
|
||||||
WDT_MR_WDD(timeout) | // and no invalid write window
|
|
||||||
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
|
|
||||||
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
|
|
||||||
// to keep PIO controller state
|
|
||||||
#endif
|
|
||||||
WDT_MR_WDDBGHLT | // WDT stops in debug state.
|
|
||||||
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
|
|
||||||
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
// We enable the watchdog timer, but only for the interrupt.
|
|
||||||
|
|
||||||
// Configure WDT to only trigger an interrupt
|
|
||||||
value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
|
|
||||||
|
|
||||||
// Disable WDT interrupt (just in case, to avoid triggering it!)
|
|
||||||
NVIC_DisableIRQ(WDT_IRQn);
|
|
||||||
|
|
||||||
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
|
||||||
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
|
|
||||||
// Initialize WDT with the given parameters
|
|
||||||
WDT_Enable(WDT, value);
|
|
||||||
|
|
||||||
// Configure and enable WDT interrupt.
|
|
||||||
NVIC_ClearPendingIRQ(WDT_IRQn);
|
|
||||||
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
|
|
||||||
NVIC_EnableIRQ(WDT_IRQn);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// a WDT fault triggers a reset
|
|
||||||
value |= WDT_MR_WDRSTEN;
|
|
||||||
|
|
||||||
// Initialize WDT with the given parameters
|
|
||||||
WDT_Enable(WDT, value);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Reset the watchdog
|
|
||||||
WDT_Restart(WDT);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Make sure to completely disable the Watchdog
|
|
||||||
WDT_Disable(WDT);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
// Initialize watchdog - On SAM3X, Watchdog was already configured
|
|
||||||
// and enabled or disabled at startup, so no need to reconfigure it
|
|
||||||
// here.
|
|
||||||
void watchdog_init() {
|
|
||||||
// Reset watchdog to start clean
|
|
||||||
WDT_Restart(WDT);
|
|
||||||
}
|
|
||||||
#endif // USE_WATCHDOG
|
|
||||||
|
|
||||||
#endif
|
|
@ -20,14 +20,10 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FlushableHardwareSerial.h"
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr)
|
#include "FlushableHardwareSerial.h"
|
||||||
: HardwareSerial(uart_nr)
|
|
||||||
{}
|
|
||||||
|
|
||||||
FlushableHardwareSerial flushableSerial(0);
|
Serial1Class<FlushableHardwareSerial> flushableSerial(false, 0);
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif
|
||||||
|
@ -21,17 +21,14 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
|
||||||
|
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
|
|
||||||
|
#include "../shared/Marduino.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
class FlushableHardwareSerial : public HardwareSerial {
|
class FlushableHardwareSerial : public HardwareSerial {
|
||||||
public:
|
public:
|
||||||
FlushableHardwareSerial(int uart_nr);
|
FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {}
|
||||||
|
|
||||||
inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern FlushableHardwareSerial flushableSerial;
|
extern Serial1Class<FlushableHardwareSerial> flushableSerial;
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
|
||||||
|
@ -28,6 +28,10 @@
|
|||||||
#include <esp_adc_cal.h>
|
#include <esp_adc_cal.h>
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
|
|
||||||
|
#if ENABLED(USE_ESP32_TASK_WDT)
|
||||||
|
#include <esp_task_wdt.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
@ -40,11 +44,15 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
|
DefaultSerial1 MSerial0(false, Serial2Socket);
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Externs
|
// Externs
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
|
portMUX_TYPE MarlinHAL::spinlock = portMUX_INITIALIZER_UNLOCKED;
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Local defines
|
// Local defines
|
||||||
@ -56,7 +64,8 @@ portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED;
|
|||||||
// Public Variables
|
// Public Variables
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
uint16_t HAL_adc_result;
|
uint16_t MarlinHAL::adc_result;
|
||||||
|
pwm_pin_t MarlinHAL::pwm_pin_data[MAX_EXPANDER_BITS];
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Private Variables
|
// Private Variables
|
||||||
@ -65,9 +74,16 @@ uint16_t HAL_adc_result;
|
|||||||
esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX];
|
esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX];
|
||||||
adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {};
|
adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {};
|
||||||
uint32_t thresholds[ADC_ATTEN_MAX];
|
uint32_t thresholds[ADC_ATTEN_MAX];
|
||||||
volatile int numPWMUsed = 0,
|
|
||||||
pwmPins[MAX_PWM_PINS],
|
volatile int numPWMUsed = 0;
|
||||||
pwmValues[MAX_PWM_PINS];
|
volatile struct { pin_t pin; int value; } pwmState[MAX_PWM_PINS];
|
||||||
|
|
||||||
|
pin_t chan_pin[CHANNEL_MAX_NUM + 1] = { 0 }; // PWM capable IOpins - not 0 or >33 on ESP32
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint32_t freq; // ledcReadFreq doesn't work if a duty hasn't been set yet!
|
||||||
|
uint16_t res;
|
||||||
|
} pwmInfo[(CHANNEL_MAX_NUM + 1) / 2];
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
@ -86,10 +102,26 @@ volatile int numPWMUsed = 0,
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void HAL_init() { i2s_init(); }
|
#if ENABLED(USE_ESP32_EXIO)
|
||||||
|
|
||||||
void HAL_init_board() {
|
HardwareSerial YSerial2(2);
|
||||||
|
|
||||||
|
void Write_EXIO(uint8_t IO, uint8_t v) {
|
||||||
|
if (hal.isr_state()) {
|
||||||
|
hal.isr_off();
|
||||||
|
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
|
||||||
|
hal.isr_on();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
YSerial2.write(0x80 | (((char)v) << 5) | (IO - 100));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void MarlinHAL::init_board() {
|
||||||
|
#if ENABLED(USE_ESP32_TASK_WDT)
|
||||||
|
esp_task_wdt_init(10, true);
|
||||||
|
#endif
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
esp3dlib.init();
|
esp3dlib.init();
|
||||||
#elif ENABLED(WIFISUPPORT)
|
#elif ENABLED(WIFISUPPORT)
|
||||||
@ -122,27 +154,61 @@ void HAL_init_board() {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Initialize the i2s peripheral only if the I2S stepper stream is enabled.
|
||||||
|
// The following initialization is performed after Serial1 and Serial2 are defined as
|
||||||
|
// their native pins might conflict with the i2s stream even when they are remapped.
|
||||||
|
#if ENABLED(USE_ESP32_EXIO)
|
||||||
|
YSerial2.begin(460800 * 3, SERIAL_8N1, 16, 17);
|
||||||
|
#elif ENABLED(I2S_STEPPER_STREAM)
|
||||||
|
i2s_init();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_idletask() {
|
void MarlinHAL::idletask() {
|
||||||
#if BOTH(WIFISUPPORT, OTASUPPORT)
|
#if BOTH(WIFISUPPORT, OTASUPPORT)
|
||||||
OTA_handle();
|
OTA_handle();
|
||||||
#endif
|
#endif
|
||||||
TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask());
|
TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask());
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_clear_reset_source() { }
|
uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
|
||||||
|
|
||||||
uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); }
|
void MarlinHAL::reboot() { ESP.restart(); }
|
||||||
|
|
||||||
void _delay_ms(int delay_ms) { delay(delay_ms); }
|
void _delay_ms(int delay_ms) { delay(delay_ms); }
|
||||||
|
|
||||||
// return free memory between end of heap (or end bss) and whatever is current
|
// return free memory between end of heap (or end bss) and whatever is current
|
||||||
int freeMemory() { return ESP.getFreeHeap(); }
|
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Watchdog Timer
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
esp_err_t esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void watchdogSetup() {
|
||||||
|
// do whatever. don't remove this function.
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinHAL::watchdog_init() {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset watchdog.
|
||||||
|
void MarlinHAL::watchdog_refresh() { esp_task_wdt_reset(); }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// ADC
|
// ADC
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
|
#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
|
||||||
|
|
||||||
adc1_channel_t get_channel(int pin) {
|
adc1_channel_t get_channel(int pin) {
|
||||||
@ -164,7 +230,7 @@ void adc1_set_attenuation(adc1_channel_t chan, adc_atten_t atten) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_adc_init() {
|
void MarlinHAL::adc_init() {
|
||||||
// Configure ADC
|
// Configure ADC
|
||||||
adc1_config_width(ADC_WIDTH_12Bit);
|
adc1_config_width(ADC_WIDTH_12Bit);
|
||||||
|
|
||||||
@ -179,6 +245,9 @@ void HAL_adc_init() {
|
|||||||
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||||
|
TERN_(HAS_TEMP_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
||||||
|
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
||||||
|
TERN_(HAS_TEMP_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
||||||
|
|
||||||
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
||||||
@ -193,11 +262,16 @@ void HAL_adc_init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_adc_start_conversion(const uint8_t adc_pin) {
|
#ifndef ADC_REFERENCE_VOLTAGE
|
||||||
const adc1_channel_t chan = get_channel(adc_pin);
|
#define ADC_REFERENCE_VOLTAGE 3.3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void MarlinHAL::adc_start(const pin_t pin) {
|
||||||
|
const adc1_channel_t chan = get_channel(pin);
|
||||||
uint32_t mv;
|
uint32_t mv;
|
||||||
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
|
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
|
||||||
HAL_adc_result = mv * 1023.0 / 3300.0;
|
|
||||||
|
adc_result = mv * isr_float_t(1023) / isr_float_t(ADC_REFERENCE_VOLTAGE) / isr_float_t(1000);
|
||||||
|
|
||||||
// Change the attenuation level based on the new reading
|
// Change the attenuation level based on the new reading
|
||||||
adc_atten_t atten;
|
adc_atten_t atten;
|
||||||
@ -214,25 +288,106 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) {
|
|||||||
adc1_set_attenuation(chan, atten);
|
adc1_set_attenuation(chan, atten);
|
||||||
}
|
}
|
||||||
|
|
||||||
void analogWrite(pin_t pin, int value) {
|
// ------------------------
|
||||||
// Use ledc hardware for internal pins
|
// PWM
|
||||||
if (pin < 34) {
|
// ------------------------
|
||||||
static int cnt_channel = 1, pin_to_channel[40] = { 0 };
|
|
||||||
if (pin_to_channel[pin] == 0) {
|
int8_t channel_for_pin(const uint8_t pin) {
|
||||||
ledcAttachPin(pin, cnt_channel);
|
for (int i = 0; i <= CHANNEL_MAX_NUM; i++)
|
||||||
ledcSetup(cnt_channel, 490, 8);
|
if (chan_pin[i] == pin) return i;
|
||||||
ledcWrite(cnt_channel, value);
|
return -1;
|
||||||
pin_to_channel[pin] = cnt_channel++;
|
|
||||||
}
|
}
|
||||||
ledcWrite(pin_to_channel[pin], value);
|
|
||||||
|
// get PWM channel for pin - if none then attach a new one
|
||||||
|
// return -1 if fail or invalid pin#, channel # (0-15) if success
|
||||||
|
int8_t get_pwm_channel(const pin_t pin, const uint32_t freq, const uint16_t res) {
|
||||||
|
if (!WITHIN(pin, 1, MAX_PWM_IOPIN)) return -1; // Not a hardware PWM pin!
|
||||||
|
int8_t cid = channel_for_pin(pin);
|
||||||
|
if (cid >= 0) return cid;
|
||||||
|
|
||||||
|
// Find an empty adjacent channel (same timer & freq/res)
|
||||||
|
for (int i = 0; i <= CHANNEL_MAX_NUM; i++) {
|
||||||
|
if (chan_pin[i] == 0) {
|
||||||
|
if (chan_pin[i ^ 0x1] != 0) {
|
||||||
|
if (pwmInfo[i / 2].freq == freq && pwmInfo[i / 2].res == res) {
|
||||||
|
chan_pin[i] = pin; // Allocate PWM to this channel
|
||||||
|
ledcAttachPin(pin, i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (cid == -1) // Pair of empty channels?
|
||||||
|
cid = i & 0xFE; // Save lower channel number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// not attached, is an empty timer slot avail?
|
||||||
|
if (cid >= 0) {
|
||||||
|
chan_pin[cid] = pin;
|
||||||
|
pwmInfo[cid / 2].freq = freq;
|
||||||
|
pwmInfo[cid / 2].res = res;
|
||||||
|
ledcSetup(cid, freq, res);
|
||||||
|
ledcAttachPin(pin, cid);
|
||||||
|
}
|
||||||
|
return cid; // -1 if no channel avail
|
||||||
|
}
|
||||||
|
|
||||||
|
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=_BV(PWM_RESOLUTION)-1*/, const bool invert/*=false*/) {
|
||||||
|
#if ENABLED(I2S_STEPPER_STREAM)
|
||||||
|
if (pin > 127) {
|
||||||
|
const uint8_t pinlo = pin & 0x7F;
|
||||||
|
pwm_pin_t &pindata = pwm_pin_data[pinlo];
|
||||||
|
const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, pindata.pwm_cycle_ticks);
|
||||||
|
if (duty == 0 || duty == pindata.pwm_cycle_ticks) { // max or min (i.e., on/off)
|
||||||
|
pindata.pwm_duty_ticks = 0; // turn off PWM for this pin
|
||||||
|
duty ? SBI32(i2s_port_data, pinlo) : CBI32(i2s_port_data, pinlo); // set pin level
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pindata.pwm_duty_ticks = duty; // PWM duty count = # of 4µs ticks per full PWM cycle
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
const int8_t cid = get_pwm_channel(pin, PWM_FREQUENCY, PWM_RESOLUTION);
|
||||||
|
if (cid >= 0) {
|
||||||
|
const uint32_t duty = map(invert ? v_size - v : v, 0, v_size, 0, _BV(PWM_RESOLUTION)-1);
|
||||||
|
ledcWrite(cid, duty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t MarlinHAL::set_pwm_frequency(const pin_t pin, const uint32_t f_desired) {
|
||||||
|
#if ENABLED(I2S_STEPPER_STREAM)
|
||||||
|
if (pin > 127) {
|
||||||
|
pwm_pin_data[pin & 0x7F].pwm_cycle_ticks = 1000000UL / f_desired / 4; // # of 4µs ticks per full PWM cycle
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
const int8_t cid = channel_for_pin(pin);
|
||||||
|
if (cid >= 0) {
|
||||||
|
if (f_desired == ledcReadFreq(cid)) return cid; // no freq change
|
||||||
|
ledcDetachPin(chan_pin[cid]);
|
||||||
|
chan_pin[cid] = 0; // remove old freq channel
|
||||||
|
}
|
||||||
|
return get_pwm_channel(pin, f_desired, PWM_RESOLUTION); // try for new one
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// use hardware PWM if avail, if not then ISR
|
||||||
|
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq/*=PWM_FREQUENCY*/, const uint16_t res/*=8*/) { // always 8 bit resolution!
|
||||||
|
// Use ledc hardware for internal pins
|
||||||
|
const int8_t cid = get_pwm_channel(pin, freq, res);
|
||||||
|
if (cid >= 0) {
|
||||||
|
ledcWrite(cid, value); // set duty value
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not a hardware PWM pin OR no PWM channels available
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
|
|
||||||
// Search Pin
|
// Search Pin
|
||||||
for (int i = 0; i < numPWMUsed; ++i)
|
for (int i = 0; i < numPWMUsed; ++i)
|
||||||
if (pwmPins[i] == pin) { idx = i; break; }
|
if (pwmState[i].pin == pin) { idx = i; break; }
|
||||||
|
|
||||||
// not found ?
|
// not found ?
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
@ -241,34 +396,34 @@ void analogWrite(pin_t pin, int value) {
|
|||||||
|
|
||||||
// Take new slot for pin
|
// Take new slot for pin
|
||||||
idx = numPWMUsed;
|
idx = numPWMUsed;
|
||||||
pwmPins[idx] = pin;
|
pwmState[idx].pin = pin;
|
||||||
// Start timer on first use
|
// Start timer on first use
|
||||||
if (idx == 0) HAL_timer_start(PWM_TIMER_NUM, PWM_TIMER_FREQUENCY);
|
if (idx == 0) HAL_timer_start(MF_TIMER_PWM, PWM_TIMER_FREQUENCY);
|
||||||
|
|
||||||
++numPWMUsed;
|
++numPWMUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use 7bit internal value - add 1 to have 100% high at 255
|
// Use 7bit internal value - add 1 to have 100% high at 255
|
||||||
pwmValues[idx] = (value + 1) / 2;
|
pwmState[idx].value = (value + 1) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle PWM timer interrupt
|
// Handle PWM timer interrupt
|
||||||
HAL_PWM_TIMER_ISR() {
|
HAL_PWM_TIMER_ISR() {
|
||||||
HAL_timer_isr_prologue(PWM_TIMER_NUM);
|
HAL_timer_isr_prologue(MF_TIMER_PWM);
|
||||||
|
|
||||||
static uint8_t count = 0;
|
static uint8_t count = 0;
|
||||||
|
|
||||||
for (int i = 0; i < numPWMUsed; ++i) {
|
for (int i = 0; i < numPWMUsed; ++i) {
|
||||||
if (count == 0) // Start of interval
|
if (count == 0) // Start of interval
|
||||||
WRITE(pwmPins[i], pwmValues[i] ? HIGH : LOW);
|
digitalWrite(pwmState[i].pin, pwmState[i].value ? HIGH : LOW);
|
||||||
else if (pwmValues[i] == count) // End of duration
|
else if (pwmState[i].value == count) // End of duration
|
||||||
WRITE(pwmPins[i], LOW);
|
digitalWrite(pwmState[i].pin, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 128 for 7 Bit resolution
|
// 128 for 7 Bit resolution
|
||||||
count = (count + 1) & 0x7F;
|
count = (count + 1) & 0x7F;
|
||||||
|
|
||||||
HAL_timer_isr_epilogue(PWM_TIMER_NUM);
|
HAL_timer_isr_epilogue(MF_TIMER_PWM);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: HAL for Espressif ESP32 WiFi
|
* HAL for Espressif ESP32 WiFi
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define CPU_32_BIT
|
#define CPU_32_BIT
|
||||||
@ -32,7 +32,6 @@
|
|||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
|
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
|
||||||
#include "i2s.h"
|
#include "i2s.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
@ -49,85 +48,68 @@
|
|||||||
// Defines
|
// Defines
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
extern portMUX_TYPE spinlock;
|
#define MYSERIAL1 flushableSerial
|
||||||
|
|
||||||
#define MYSERIAL0 flushableSerial
|
|
||||||
|
|
||||||
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT)
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#define MYSERIAL1 Serial2Socket
|
typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1;
|
||||||
|
extern DefaultSerial1 MSerial0;
|
||||||
|
#define MYSERIAL2 MSerial0
|
||||||
#else
|
#else
|
||||||
#define MYSERIAL1 webSocketSerial
|
#define MYSERIAL2 webSocketSerial
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock)
|
#define CRITICAL_SECTION_START() portENTER_CRITICAL(&hal.spinlock)
|
||||||
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&spinlock)
|
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
||||||
#define ISRS_ENABLED() (spinlock.owner == portMUX_FREE_VAL)
|
|
||||||
#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock)
|
|
||||||
#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock)
|
|
||||||
|
|
||||||
// Fix bug in pgm_read_ptr
|
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||||
#undef pgm_read_ptr
|
#define PWM_FREQUENCY 1000u // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
||||||
#define pgm_read_ptr(addr) (*(addr))
|
#define PWM_RESOLUTION 10u // Default PWM bit resolution
|
||||||
|
#define CHANNEL_MAX_NUM 15u // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
||||||
|
#define MAX_PWM_IOPIN 33u // hardware pwm pins < 34
|
||||||
|
#ifndef MAX_EXPANDER_BITS
|
||||||
|
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
||||||
|
#endif
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Types
|
// Types
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
|
typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs.
|
||||||
typedef int16_t pin_t;
|
typedef int16_t pin_t;
|
||||||
|
|
||||||
#define HAL_SERVO_LIB Servo
|
typedef struct pwm_pin {
|
||||||
|
uint32_t pwm_cycle_ticks = 1000000UL / (PWM_FREQUENCY) / 4; // # ticks per pwm cycle
|
||||||
|
uint32_t pwm_tick_count = 0; // current tick count
|
||||||
|
uint32_t pwm_duty_ticks = 0; // # of ticks for current duty cycle
|
||||||
|
} pwm_pin_t;
|
||||||
|
|
||||||
// ------------------------
|
class Servo;
|
||||||
// Public Variables
|
typedef Servo hal_servo_t;
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
/** result of last ADC conversion */
|
|
||||||
extern uint16_t HAL_adc_result;
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
// clear reset reason
|
//
|
||||||
void HAL_clear_reset_source();
|
// Tone
|
||||||
|
//
|
||||||
// reset reason
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0);
|
||||||
uint8_t HAL_get_reset_source();
|
void noTone(const pin_t _pin);
|
||||||
|
int8_t get_pwm_channel(const pin_t pin, const uint32_t freq, const uint16_t res);
|
||||||
void _delay_ms(int delay);
|
void analogWrite(const pin_t pin, const uint16_t value, const uint32_t freq=PWM_FREQUENCY, const uint16_t res=8);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
|
||||||
int freeMemory();
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
void analogWrite(pin_t pin, int value);
|
|
||||||
|
|
||||||
// ADC
|
|
||||||
#define HAL_ANALOG_SELECT(pin)
|
|
||||||
|
|
||||||
void HAL_adc_init();
|
|
||||||
|
|
||||||
#define HAL_ADC_VREF 3.3
|
|
||||||
#define HAL_ADC_RESOLUTION 10
|
|
||||||
#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin)
|
|
||||||
#define HAL_READ_ADC() HAL_adc_result
|
|
||||||
#define HAL_ADC_READY() true
|
|
||||||
|
|
||||||
void HAL_adc_start_conversion(const uint8_t adc_pin);
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Pin Mapping for M42, M43, M226
|
||||||
|
//
|
||||||
#define GET_PIN_MAP_PIN(index) index
|
#define GET_PIN_MAP_PIN(index) index
|
||||||
#define GET_PIN_MAP_INDEX(pin) pin
|
#define GET_PIN_MAP_INDEX(pin) pin
|
||||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||||
|
|
||||||
// Enable hooks into idle and setup for HAL
|
#if ENABLED(USE_ESP32_EXIO)
|
||||||
#define HAL_IDLETASK 1
|
void Write_EXIO(uint8_t IO, uint8_t v);
|
||||||
#define BOARD_INIT() HAL_init_board();
|
#endif
|
||||||
void HAL_idletask();
|
|
||||||
void HAL_init();
|
|
||||||
void HAL_init_board();
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Delay in cycles (used by DELAY_NS / DELAY_US)
|
// Delay in cycles (used by DELAY_NS / DELAY_US)
|
||||||
@ -155,17 +137,110 @@ FORCE_INLINE static void DELAY_CYCLES(uint32_t x) {
|
|||||||
|
|
||||||
if (stop >= start) {
|
if (stop >= start) {
|
||||||
// no overflow, so only loop while in between start and stop:
|
// no overflow, so only loop while in between start and stop:
|
||||||
// 0x00000000 -----------------start****stop-- 0xffffffff
|
// 0x00000000 -----------------start****stop-- 0xFFFFFFFF
|
||||||
while (ccount >= start && ccount < stop) {
|
while (ccount >= start && ccount < stop) {
|
||||||
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// stop did overflow, so only loop while outside of stop and start:
|
// stop did overflow, so only loop while outside of stop and start:
|
||||||
// 0x00000000 **stop-------------------start** 0xffffffff
|
// 0x00000000 **stop-------------------start** 0xFFFFFFFF
|
||||||
while (ccount >= start || ccount < stop) {
|
while (ccount >= start || ccount < stop) {
|
||||||
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
__asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Class Utilities
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#if GCC_VERSION <= 50000
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int freeMemory();
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
void _delay_ms(const int ms);
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// MarlinHAL Class
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#define HAL_ADC_VREF 3.3
|
||||||
|
#define HAL_ADC_RESOLUTION 10
|
||||||
|
|
||||||
|
class MarlinHAL {
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Earliest possible init, before setup()
|
||||||
|
MarlinHAL() {}
|
||||||
|
|
||||||
|
// Watchdog
|
||||||
|
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
|
||||||
|
static void init() {} // Called early in setup()
|
||||||
|
static void init_board(); // Called less early in setup()
|
||||||
|
static void reboot(); // Restart the firmware
|
||||||
|
|
||||||
|
// Interrupts
|
||||||
|
static portMUX_TYPE spinlock;
|
||||||
|
static bool isr_state() { return spinlock.owner == portMUX_FREE_VAL; }
|
||||||
|
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
||||||
|
static void isr_off() { portENTER_CRITICAL(&spinlock); }
|
||||||
|
|
||||||
|
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||||
|
|
||||||
|
// Tasks, called from idle()
|
||||||
|
static void idletask();
|
||||||
|
|
||||||
|
// Reset
|
||||||
|
static uint8_t get_reset_source();
|
||||||
|
static void clear_reset_source() {}
|
||||||
|
|
||||||
|
// Free SRAM
|
||||||
|
static int freeMemory();
|
||||||
|
|
||||||
|
static pwm_pin_t pwm_pin_data[MAX_EXPANDER_BITS];
|
||||||
|
|
||||||
|
//
|
||||||
|
// ADC Methods
|
||||||
|
//
|
||||||
|
|
||||||
|
static uint16_t adc_result;
|
||||||
|
|
||||||
|
// Called by Temperature::init once at startup
|
||||||
|
static void adc_init();
|
||||||
|
|
||||||
|
// Called by Temperature::init for each sensor at startup
|
||||||
|
static void adc_enable(const pin_t pin) {}
|
||||||
|
|
||||||
|
// Begin ADC sampling on the given pin. Called from Temperature::isr!
|
||||||
|
static void adc_start(const pin_t pin);
|
||||||
|
|
||||||
|
// Is the ADC ready for reading?
|
||||||
|
static bool adc_ready() { return true; }
|
||||||
|
|
||||||
|
// The current value of the ADC register
|
||||||
|
static uint16_t adc_value() { return adc_result; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If not already allocated, allocate a hardware PWM channel
|
||||||
|
* to the pin and set the duty cycle..
|
||||||
|
* Optionally invert the duty cycle [default = false]
|
||||||
|
* Optionally change the scale of the provided value to enable finer PWM duty control [default = 255]
|
||||||
|
*/
|
||||||
|
static void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate and set the frequency of a hardware PWM pin
|
||||||
|
* Returns -1 if no pin available.
|
||||||
|
*/
|
||||||
|
static int8_t set_pwm_frequency(const pin_t pin, const uint32_t f_desired);
|
||||||
|
|
||||||
|
};
|
||||||
|
@ -53,11 +53,9 @@ static SPISettings spiConfig;
|
|||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
void spiBegin() {
|
void spiBegin() {
|
||||||
#if !PIN_EXISTS(SS)
|
#if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_SS)
|
||||||
#error "SS_PIN not defined!"
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
OUT_WRITE(SS_PIN, HIGH);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void spiInit(uint8_t spiRate) {
|
void spiInit(uint8_t spiRate) {
|
||||||
|
26
Marlin/src/HAL/ESP32/MarlinSPI.h
Normal file
26
Marlin/src/HAL/ESP32/MarlinSPI.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SPI.h>
|
||||||
|
|
||||||
|
using MarlinSPI = SPIClass;
|
@ -31,20 +31,18 @@
|
|||||||
// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.)
|
// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.)
|
||||||
int Servo::channel_next_free = 12;
|
int Servo::channel_next_free = 12;
|
||||||
|
|
||||||
Servo::Servo() {
|
Servo::Servo() {}
|
||||||
channel = channel_next_free++;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t Servo::attach(const int inPin) {
|
int8_t Servo::attach(const int inPin) {
|
||||||
if (channel >= CHANNEL_MAX_NUM) return -1;
|
|
||||||
if (inPin > 0) pin = inPin;
|
if (inPin > 0) pin = inPin;
|
||||||
|
channel = get_pwm_channel(pin, 50u, 16u);
|
||||||
ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth
|
return channel; // -1 if no PWM avail.
|
||||||
ledcAttachPin(pin, channel);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Servo::detach() { ledcDetachPin(pin); }
|
// leave channel connected to servo - set duty to zero
|
||||||
|
void Servo::detach() {
|
||||||
|
if (channel >= 0) ledcWrite(channel, 0);
|
||||||
|
}
|
||||||
|
|
||||||
int Servo::read() { return degrees; }
|
int Servo::read() { return degrees; }
|
||||||
|
|
||||||
@ -52,7 +50,7 @@ void Servo::write(int inDegrees) {
|
|||||||
degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
|
degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE);
|
||||||
int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
|
int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
|
||||||
int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE);
|
int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE);
|
||||||
ledcWrite(channel, duty);
|
if (channel >= 0) ledcWrite(channel, duty); // don't save duty for servos!
|
||||||
}
|
}
|
||||||
|
|
||||||
void Servo::move(const int value) {
|
void Servo::move(const int value) {
|
||||||
|
@ -30,8 +30,7 @@ class Servo {
|
|||||||
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo
|
||||||
TAU_MSEC = 20,
|
TAU_MSEC = 20,
|
||||||
TAU_USEC = (TAU_MSEC * 1000),
|
TAU_USEC = (TAU_MSEC * 1000),
|
||||||
MAX_COMPARE = ((1 << 16) - 1), // 65535
|
MAX_COMPARE = _BV(16) - 1; // 65535
|
||||||
CHANNEL_MAX_NUM = 16;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Servo();
|
Servo();
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* Based on Sprinter and grbl.
|
* Based on Sprinter and grbl.
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
|
* Copypaste of SAMD51 HAL developed by Giuliano Zaro (AKA GMagician)
|
||||||
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
@ -21,39 +23,37 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HAL for stm32duino.com based on Libmaple and compatible (STM32F1)
|
* Description: Tone function for ESP32
|
||||||
|
* Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __STM32F1__
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "HAL.h"
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
static pin_t tone_pin;
|
||||||
|
volatile static int32_t toggles;
|
||||||
|
|
||||||
#include <libmaple/iwdg.h>
|
void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration/*=0*/) {
|
||||||
#include "watchdog.h"
|
tone_pin = _pin;
|
||||||
|
toggles = 2 * frequency * duration / 1000;
|
||||||
void HAL_watchdog_refresh() {
|
HAL_timer_start(MF_TIMER_TONE, 2 * frequency);
|
||||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
|
||||||
TOGGLE(LED_PIN); // heartbeat indicator
|
|
||||||
#endif
|
|
||||||
iwdg_feed();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void watchdogSetup() {
|
void noTone(const pin_t _pin) {
|
||||||
// do whatever. don't remove this function.
|
HAL_timer_disable_interrupt(MF_TIMER_TONE);
|
||||||
|
WRITE(_pin, LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
HAL_TONE_TIMER_ISR() {
|
||||||
* @brief Initialized the independent hardware watchdog.
|
HAL_timer_isr_prologue(MF_TIMER_TONE);
|
||||||
*
|
|
||||||
* @return No return
|
if (toggles) {
|
||||||
*
|
toggles--;
|
||||||
* @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0)
|
TOGGLE(tone_pin);
|
||||||
*/
|
}
|
||||||
void watchdog_init() {
|
else noTone(tone_pin); // turn off interrupt
|
||||||
//iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // USE_WATCHDOG
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
#endif // __STM32F1__
|
|
@ -29,7 +29,7 @@
|
|||||||
#include "wifi.h"
|
#include "wifi.h"
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
WebSocketSerial webSocketSerial;
|
MSerialWebSocketT webSocketSerial(false);
|
||||||
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
AsyncWebSocket ws("/ws"); // TODO Move inside the class.
|
||||||
|
|
||||||
// RingBuffer impl
|
// RingBuffer impl
|
||||||
@ -144,9 +144,5 @@ size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) {
|
|||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketSerial::flushTX() {
|
|
||||||
// No need to do anything as there's no benefit to sending partial lines over the websocket connection.
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // WIFISUPPORT
|
#endif // WIFISUPPORT
|
||||||
#endif // ARDUINO_ARCH_ESP32
|
#endif // ARDUINO_ARCH_ESP32
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
||||||
@ -68,12 +69,9 @@ public:
|
|||||||
int peek();
|
int peek();
|
||||||
int read();
|
int read();
|
||||||
void flush();
|
void flush();
|
||||||
void flushTX();
|
|
||||||
size_t write(const uint8_t c);
|
size_t write(const uint8_t c);
|
||||||
size_t write(const uint8_t *buffer, size_t size);
|
size_t write(const uint8_t *buffer, size_t size);
|
||||||
|
|
||||||
operator bool() { return true; }
|
|
||||||
|
|
||||||
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
#if ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||||
FORCE_INLINE uint32_t dropped() { return 0; }
|
FORCE_INLINE uint32_t dropped() { return 0; }
|
||||||
#endif
|
#endif
|
||||||
@ -83,4 +81,5 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WebSocketSerial webSocketSerial;
|
typedef Serial1Class<WebSocketSerial> MSerialWebSocketT;
|
||||||
|
extern MSerialWebSocketT webSocketSerial;
|
||||||
|
@ -59,4 +59,16 @@ void setup_endstop_interrupts() {
|
|||||||
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
|
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
|
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
|
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
|
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
|
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
|
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
|
TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
|
||||||
|
TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
|
||||||
|
TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
|
||||||
|
TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
|
||||||
|
TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
|
||||||
|
TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
|
||||||
}
|
}
|
||||||
|
6
Marlin/src/HAL/ESP32/esp32.csv
Normal file
6
Marlin/src/HAL/ESP32/esp32.csv
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x180000,
|
||||||
|
app1, app, ota_1, 0x190000, 0x180000,
|
||||||
|
spiffs, data, spiffs, 0x310000, 0xF0000,
|
|
@ -40,18 +40,27 @@
|
|||||||
// Set pin as input with pullup mode
|
// Set pin as input with pullup mode
|
||||||
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
||||||
|
|
||||||
|
#if ENABLED(USE_ESP32_EXIO)
|
||||||
|
// Read a pin wrapper
|
||||||
|
#define READ(IO) digitalRead(IO)
|
||||||
|
// Write to a pin wrapper
|
||||||
|
#define WRITE(IO, v) (IO >= 100 ? Write_EXIO(IO, v) : digitalWrite(IO, v))
|
||||||
|
#else
|
||||||
// Read a pin wrapper
|
// Read a pin wrapper
|
||||||
#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
|
#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO))
|
||||||
|
|
||||||
// Write to a pin wrapper
|
// Write to a pin wrapper
|
||||||
#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
|
#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v))
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set pin as input wrapper
|
// Set pin as input wrapper (0x80 | (v << 5) | (IO - 100))
|
||||||
#define SET_INPUT(IO) _SET_INPUT(IO)
|
#define SET_INPUT(IO) _SET_INPUT(IO)
|
||||||
|
|
||||||
// Set pin as input with pullup wrapper
|
// Set pin as input with pullup wrapper
|
||||||
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0)
|
||||||
|
|
||||||
|
// Set pin as input with pulldown (substitution)
|
||||||
|
#define SET_INPUT_PULLDOWN SET_INPUT
|
||||||
|
|
||||||
// Set pin as output wrapper
|
// Set pin as output wrapper
|
||||||
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0)
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user