mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-26 12:14:56 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1c2ffe1a0 | ||
|
|
9210a762de | ||
|
|
1620110f50 | ||
|
|
0d882f1b43 | ||
|
|
1bb85799ce | ||
|
|
12207edd55 | ||
|
|
bb37f72a63 | ||
|
|
b852e0f8c3 | ||
|
|
25dc078af7 | ||
|
|
06f525713f | ||
|
|
05ade0ba3c | ||
|
|
ec91eaf0f3 | ||
|
|
8392b9407a | ||
|
|
60fe567845 | ||
|
|
02e83c77a4 | ||
|
|
538a1a9bfa | ||
|
|
862fbd0abc | ||
|
|
2121be1abe | ||
|
|
0c794f19d2 | ||
|
|
44ef3b43d2 | ||
|
|
d27e7b3e7e | ||
|
|
f0d1800c6b | ||
|
|
81b61d335f | ||
|
|
70f14336f1 | ||
|
|
19ea5aba43 | ||
|
|
2a7fa4cb68 | ||
|
|
3d094ec921 | ||
|
|
abe19d2367 | ||
|
|
2b408e85e9 | ||
|
|
27897d5514 | ||
|
|
dfcfdfd0f7 | ||
|
|
ec032181c6 | ||
|
|
1cc6a48eea | ||
|
|
17b4054ea5 | ||
|
|
0ec11128f7 | ||
|
|
ed0423f79d | ||
|
|
ba69eb248c | ||
|
|
eefec28b50 | ||
|
|
564c352d0c | ||
|
|
d20eb8b280 | ||
|
|
cc617d537d | ||
|
|
205d4c6832 | ||
|
|
18cea946f1 | ||
|
|
0884338b2a | ||
|
|
ba768693ed | ||
|
|
3170261876 | ||
|
|
2d7e8aa712 | ||
|
|
c083f204fc | ||
|
|
e83e13d8c6 | ||
|
|
70d268d95f | ||
|
|
71f5556de7 | ||
|
|
8c64266f95 | ||
|
|
124b4e93c7 | ||
|
|
e01eeed303 | ||
|
|
4b3cfb4bc0 | ||
|
|
e5dfbec36d | ||
|
|
be1587a933 | ||
|
|
3e87f18a29 | ||
|
|
2214cf66a4 | ||
|
|
7b886ccbde | ||
|
|
b69b288d6c | ||
|
|
37fe251d31 | ||
|
|
5ec7ec141a | ||
|
|
e31079e107 | ||
|
|
1701fb0d03 | ||
|
|
f2ce01641e | ||
|
|
b5e4eef966 | ||
|
|
b93822fc50 | ||
|
|
715f98c546 | ||
|
|
b1878dc9d0 | ||
|
|
fe8cf7d9d6 | ||
|
|
5fa6b0a6ef | ||
|
|
d3ab638e5d | ||
|
|
44e773af54 | ||
|
|
ece3f43f34 | ||
|
|
edd1350864 | ||
|
|
8e0ef3ca5c | ||
|
|
b74913ded5 | ||
|
|
42abbb7e55 | ||
|
|
a4869febf6 | ||
|
|
b10355a536 | ||
|
|
e86d4da129 | ||
|
|
46ad050cea | ||
|
|
2a7cf8d5a7 | ||
|
|
07fd086230 | ||
|
|
f040d094ea | ||
|
|
f101d1422a | ||
|
|
6631c5db87 | ||
|
|
c429a0dc56 | ||
|
|
3f59974639 | ||
|
|
c10a88b64b | ||
|
|
d5e5b3397d | ||
|
|
ab83acf2d1 | ||
|
|
1db25117b0 | ||
|
|
bd1271dd41 | ||
|
|
5dddbb3fce | ||
|
|
a28decbef4 | ||
|
|
73d9c125c0 | ||
|
|
667abfb5e1 | ||
|
|
8c65c2f9af | ||
|
|
f36205e65f | ||
|
|
e2c0b2b477 | ||
|
|
29254ce84b | ||
|
|
1a0716ae4d | ||
|
|
e46ee68a95 | ||
|
|
db496fd7dd | ||
|
|
0a3e129527 | ||
|
|
12491777bb | ||
|
|
ad4b87e24a | ||
|
|
7ffc51d38e | ||
|
|
c9243c3f47 | ||
|
|
0d6c424e62 | ||
|
|
dc9395c904 | ||
|
|
2bb750070a | ||
|
|
17b0b65cab | ||
|
|
b5b63e731c | ||
|
|
7e376bb860 | ||
|
|
b313d697ff | ||
|
|
1cadd2b2aa | ||
|
|
f40b377fff | ||
|
|
43509c1781 | ||
|
|
209d1dd426 | ||
|
|
1f9e1a38b5 | ||
|
|
69936ac9f6 | ||
|
|
6de419d14c | ||
|
|
1200f50e2e | ||
|
|
73bec74380 | ||
|
|
f70647e28e | ||
|
|
effa61f9b2 | ||
|
|
b8bde63554 | ||
|
|
409d3d388a | ||
|
|
2c4bf4cea4 | ||
|
|
1b9c3a0fb0 | ||
|
|
71cc0cfd80 | ||
|
|
63da5aa403 | ||
|
|
cb13900c32 | ||
|
|
926a0e2cf2 | ||
|
|
2bfcfeb359 | ||
|
|
16d8e3b4f9 | ||
|
|
682fe2c9a0 | ||
|
|
bdd309b10b | ||
|
|
21fbf9cdc5 | ||
|
|
9ed98cecff | ||
|
|
ab4e229f57 | ||
|
|
7feab86700 | ||
|
|
6bc0af5dd0 | ||
|
|
6cb685b700 | ||
|
|
5c582c35d8 | ||
|
|
10ab9ae1ea | ||
|
|
756d127cab | ||
|
|
a49eb47a91 | ||
|
|
e15056a9e4 | ||
|
|
66d4069644 | ||
|
|
9aae863956 | ||
|
|
878ec8a86c | ||
|
|
8fccfca17b | ||
|
|
69925c774d | ||
|
|
c1298973e1 | ||
|
|
bedda34515 | ||
|
|
767b0ab90b | ||
|
|
b0109c3319 | ||
|
|
a42271a088 | ||
|
|
154e471256 | ||
|
|
bfc411acaf | ||
|
|
2acbb0ad62 | ||
|
|
60ce504489 | ||
|
|
22b8eda0df | ||
|
|
80ed81583e | ||
|
|
ce0c3a0fe7 | ||
|
|
492c6385da | ||
|
|
5b023cb85b | ||
|
|
4717a15c17 | ||
|
|
d6e7f8ee83 | ||
|
|
17ff656a7d | ||
|
|
4e8965cce5 | ||
|
|
b3d27a3c43 | ||
|
|
66dcca9392 | ||
|
|
0f1a3cf84b | ||
|
|
a4b7025396 | ||
|
|
9c148fd47e | ||
|
|
293d8c22e1 | ||
|
|
5f2ff680d5 | ||
|
|
8eaca9437e | ||
|
|
6e72bf4b5f | ||
|
|
710e7b2004 | ||
|
|
666a3b68e9 | ||
|
|
02e97adbef | ||
|
|
236724ea29 | ||
|
|
b503915ca5 | ||
|
|
156db0bc5e | ||
|
|
11b6bd7d9c | ||
|
|
7ca952faa6 | ||
|
|
4fc40f0ffb | ||
|
|
cac4b3e254 | ||
|
|
0d5cb5cbcc | ||
|
|
a35901121b | ||
|
|
e0740fc2ca | ||
|
|
7d22b5fe18 | ||
|
|
d2e66ac58d | ||
|
|
34cc8da87e | ||
|
|
1957ba8ffe | ||
|
|
72758812f5 | ||
|
|
ab5a0c43de | ||
|
|
c8291e4ae9 | ||
|
|
84e9ea76db | ||
|
|
b8994f8bc3 | ||
|
|
b53d8439e5 | ||
|
|
337e8abf2f | ||
|
|
f0bc1c031f | ||
|
|
19d2b93ec7 | ||
|
|
e0304f2b8f | ||
|
|
f7a86f8cf1 | ||
|
|
340f0dbf89 | ||
|
|
d90b62d911 | ||
|
|
d84aff6420 | ||
|
|
b3b73f4751 | ||
|
|
3c7b2dcd6d | ||
|
|
49470f9bd2 | ||
|
|
f7cf4f60ef | ||
|
|
7e0d06689e | ||
|
|
b843957bd2 | ||
|
|
1a0167eb6d | ||
|
|
6ea3b98941 | ||
|
|
4b0b93d4f3 | ||
|
|
64abf061bf | ||
|
|
05d5c68982 | ||
|
|
235dafe646 | ||
|
|
0cc40b0c70 | ||
|
|
07a0d1265b | ||
|
|
967d746574 | ||
|
|
bd12cb1b87 | ||
|
|
a21ca5d40b | ||
|
|
2d399107fb | ||
|
|
03bfa3806b | ||
|
|
6536ae9bcc | ||
|
|
e8fc817a0c | ||
|
|
e621ade392 | ||
|
|
3273c20ca9 | ||
|
|
a6b2124fd5 | ||
|
|
5a1ff125d7 | ||
|
|
ad58a48144 | ||
|
|
a205fd7877 | ||
|
|
776360ca93 | ||
|
|
af7602497d | ||
|
|
0f83c2a6e5 | ||
|
|
0d58748e63 | ||
|
|
01902bb8b9 | ||
|
|
e28e9aa1d7 | ||
|
|
587e79dc05 | ||
|
|
acd65f2340 | ||
|
|
d55fb80746 | ||
|
|
4536694f20 | ||
|
|
2c5a6d4df6 | ||
|
|
4c8e219643 | ||
|
|
daeca8128b | ||
|
|
fe6d357858 | ||
|
|
a99cc3dbaf | ||
|
|
3c4c04199a | ||
|
|
8ca692100f | ||
|
|
0b9f28b8e3 | ||
|
|
1dff394b63 | ||
|
|
f4c35d1036 | ||
|
|
81c166ad74 | ||
|
|
1f56776050 | ||
|
|
b3a0e7b884 | ||
|
|
8594507b5b | ||
|
|
fa811ce12b | ||
|
|
c1ef477ff3 | ||
|
|
4be3a96987 | ||
|
|
387f875aa1 | ||
|
|
cc069e7e5d | ||
|
|
df994df611 | ||
|
|
8f77fd3940 | ||
|
|
7530062e4b | ||
|
|
0e63510708 | ||
|
|
26260a1d88 | ||
|
|
9e82844f10 | ||
|
|
0568b5a75b | ||
|
|
3baabebb34 | ||
|
|
bf4dd15317 | ||
|
|
b0f2f9621a | ||
|
|
04d6d05e9e | ||
|
|
7339c7dfe7 | ||
|
|
c1152f5eeb | ||
|
|
024922d566 | ||
|
|
6f64c8c0de | ||
|
|
2a5ac3c2e5 | ||
|
|
7b0120f0c2 | ||
|
|
7ee1f14a6d | ||
|
|
3aaf7d0da7 | ||
|
|
434f3f8415 | ||
|
|
739d78a45a | ||
|
|
8a62633b2f | ||
|
|
aae1a687a9 | ||
|
|
61285ec418 | ||
|
|
a00b3f1c6c | ||
|
|
2c813f3e72 | ||
|
|
ea68d7a705 | ||
|
|
654f401038 | ||
|
|
ad89122a06 | ||
|
|
73ed158e76 | ||
|
|
548c3dc77f | ||
|
|
c1fa067a1f | ||
|
|
9fd87060f9 | ||
|
|
de0a3b035a | ||
|
|
9f76ea8030 | ||
|
|
76b7356873 | ||
|
|
c24d5aabd8 | ||
|
|
0df6645b90 | ||
|
|
b19cf8654f | ||
|
|
19933a4673 | ||
|
|
76963f7d01 | ||
|
|
e670ea3d61 | ||
|
|
fa33b57e4f | ||
|
|
77e369bc79 | ||
|
|
94ad9767d3 | ||
|
|
aa76f5673b | ||
|
|
81a699c801 | ||
|
|
bd15c456b2 | ||
|
|
10d9e1e9ae | ||
|
|
6a3813f633 | ||
|
|
51fe22a95f | ||
|
|
105762416f | ||
|
|
db7087f455 | ||
|
|
c5693503cb | ||
|
|
b74590a4a5 | ||
|
|
d5eeed48eb | ||
|
|
fc5c0d0964 | ||
|
|
aa2647c0bc | ||
|
|
cef0acdb40 | ||
|
|
2140656acc | ||
|
|
fd0c969f16 | ||
|
|
dfeb929e0e | ||
|
|
d3e67733a6 | ||
|
|
eff74fdc9d | ||
|
|
5e4c40ad09 | ||
|
|
087e6d3142 | ||
|
|
587b074822 | ||
|
|
6aa8c01ac7 | ||
|
|
3bbcd5df3e | ||
|
|
af512c57ef | ||
|
|
58297a7871 | ||
|
|
18a530048c | ||
|
|
f9ed75d6b3 | ||
|
|
3c1f41e575 | ||
|
|
c772936dd1 | ||
|
|
253696be45 | ||
|
|
79b7accc55 | ||
|
|
7a1e846c73 | ||
|
|
ce59ff89c3 | ||
|
|
d31d064d5e | ||
|
|
467fbf4bb4 | ||
|
|
6769223ce1 | ||
|
|
294e483885 | ||
|
|
43513e2d56 | ||
|
|
d1b7687e98 | ||
|
|
9ac09da1d2 | ||
|
|
24a330c750 | ||
|
|
13a9c773f2 | ||
|
|
3cd166d065 | ||
|
|
490066fd17 | ||
|
|
94fce72ade | ||
|
|
eacc64bdd1 | ||
|
|
7b037f4957 | ||
|
|
fa841916c1 | ||
|
|
75c11436ff | ||
|
|
e07a8283ec | ||
|
|
2a174b0d3b | ||
|
|
013993abae | ||
|
|
dccc153c68 | ||
|
|
db0867f435 | ||
|
|
7234121835 | ||
|
|
3aafc073d8 | ||
|
|
b527ed313c | ||
|
|
cd86559685 | ||
|
|
f67e843be6 | ||
|
|
4f9ebd8092 | ||
|
|
6c044d6aeb | ||
|
|
c6ee909aa4 | ||
|
|
393063428e | ||
|
|
1494f5e831 | ||
|
|
8bfd0c2ca3 | ||
|
|
e9de2f3eb1 | ||
|
|
8bf9d09d96 | ||
|
|
67255ce8f5 | ||
|
|
5db89aa264 | ||
|
|
8a9b1d9873 | ||
|
|
c08c1afb1e | ||
|
|
2c7f58aed2 | ||
|
|
b3ee71acbe | ||
|
|
52ab6bc499 | ||
|
|
bf059ad42f | ||
|
|
85df6a6131 | ||
|
|
d840b4a4ee | ||
|
|
a8c2ce544e | ||
|
|
b95022a3b3 | ||
|
|
8c45a9d2c9 | ||
|
|
0fe64fbff9 | ||
|
|
64e806628b | ||
|
|
ccd2b2699f | ||
|
|
0b5c0c9889 | ||
|
|
6293e7dbec | ||
|
|
87325ece82 | ||
|
|
6cbd9b3067 | ||
|
|
aa27fde9d0 | ||
|
|
e854585802 | ||
|
|
2c5aba24cc | ||
|
|
806ee0f2cb | ||
|
|
e72b95fb1c | ||
|
|
471e7ff61a | ||
|
|
3d2de154d1 | ||
|
|
fc551ec2e9 | ||
|
|
f5e2c68c8b | ||
|
|
074ef5197b | ||
|
|
5f1f4a0df8 | ||
|
|
86334e9040 | ||
|
|
f71cc3ebc3 | ||
|
|
00910462e7 | ||
|
|
2fc56dd1d0 | ||
|
|
a5ebe71394 | ||
|
|
0eb8bf6b51 | ||
|
|
3a0fe5288c | ||
|
|
bfca233160 | ||
|
|
acf217601b | ||
|
|
b0d0fbfd9f | ||
|
|
9411f1c7b6 | ||
|
|
d7d7ebf99a | ||
|
|
8072ae2057 | ||
|
|
e529e644ab | ||
|
|
d6fdfe5b1b | ||
|
|
50e15e574f | ||
|
|
58f1533779 | ||
|
|
f4a49829ea | ||
|
|
3efe6641eb | ||
|
|
0459d9e106 | ||
|
|
305d69ee36 | ||
|
|
98e744a9ad | ||
|
|
1d97f2e2b5 | ||
|
|
c92bc4b4ac | ||
|
|
6a3e1e41c4 | ||
|
|
650caface3 | ||
|
|
8b6e02e985 | ||
|
|
3ee6fe45f9 | ||
|
|
e811afd397 | ||
|
|
b197a674e1 | ||
|
|
08f6b99b13 | ||
|
|
b18d0301f3 | ||
|
|
5596621420 | ||
|
|
bd8a66eee7 | ||
|
|
b62ebb3c10 | ||
|
|
45d796fe5b | ||
|
|
d8a3b90cad | ||
|
|
5be9e55425 | ||
|
|
6b6acd3967 | ||
|
|
1b06403a19 | ||
|
|
b740c80855 | ||
|
|
29594283c1 | ||
|
|
51f54f9b7e | ||
|
|
1f48b1ca65 | ||
|
|
fd2d7cccf3 | ||
|
|
5726e680ec | ||
|
|
fadf28adb4 | ||
|
|
a321c2d096 | ||
|
|
bbb07bf6f7 | ||
|
|
a801160bc0 | ||
|
|
662cc27f4f | ||
|
|
ccfe7e0724 | ||
|
|
8061a41b38 | ||
|
|
d01aa01a51 | ||
|
|
39392b3690 | ||
|
|
54d4611eb6 | ||
|
|
34cdce750d | ||
|
|
f3fafb6759 | ||
|
|
0372c97ff5 | ||
|
|
b46136a0af | ||
|
|
ac3d41fb79 | ||
|
|
14be42c868 | ||
|
|
f0ec14543a | ||
|
|
f46c5b7214 | ||
|
|
ccd6bcd95f | ||
|
|
a3b63f3b0d | ||
|
|
f2905a5e10 | ||
|
|
1ef6c6aeb5 | ||
|
|
bd53529b45 | ||
|
|
cc8ecc5a42 | ||
|
|
5a816a1d41 | ||
|
|
9922286c67 | ||
|
|
cdc439bc38 | ||
|
|
ae8422e304 | ||
|
|
539d080346 | ||
|
|
041ec6e1f8 | ||
|
|
f618fe125c | ||
|
|
8ab514fabc | ||
|
|
08ad2c3145 | ||
|
|
c64fd404d4 | ||
|
|
143b0ac126 | ||
|
|
c2e2432010 | ||
|
|
1d2a768184 | ||
|
|
fb099641bc | ||
|
|
6da9afbf29 | ||
|
|
dceb4beb09 | ||
|
|
6f697db49d | ||
|
|
b44193780e | ||
|
|
8e0212c3db | ||
|
|
3861e2e1e7 | ||
|
|
21eefa4b55 | ||
|
|
fb6c6aafeb | ||
|
|
df07426e78 | ||
|
|
5cf1523a13 | ||
|
|
f2fe47e9f7 | ||
|
|
2557ab2e60 | ||
|
|
fbc1708000 | ||
|
|
0539cf1023 | ||
|
|
07b410447b | ||
|
|
fb69016196 | ||
|
|
169cbc044f | ||
|
|
08091d02e5 | ||
|
|
6f2dcf92a7 | ||
|
|
578e52618d | ||
|
|
ec0fe66a17 | ||
|
|
8fee24291a | ||
|
|
05bba2958d | ||
|
|
e656b1c792 | ||
|
|
e0ccbadd25 | ||
|
|
40a2a8822f | ||
|
|
e2ee356a87 | ||
|
|
189bef61d3 | ||
|
|
7d94f9f61b | ||
|
|
e37a0b9056 | ||
|
|
0b57b23951 | ||
|
|
c84826e84e | ||
|
|
064fc6ff7b | ||
|
|
042ea53478 | ||
|
|
900b0acf7a | ||
|
|
dc5f2e295a | ||
|
|
c1849c2b19 | ||
|
|
4eadf3699f | ||
|
|
b30cf6587c | ||
|
|
fbc231f33e | ||
|
|
bc8c839342 | ||
|
|
90a23fe230 | ||
|
|
065027843e | ||
|
|
8906b1ac0f | ||
|
|
05f9e61a41 | ||
|
|
782896b5d3 | ||
|
|
4258f62560 | ||
|
|
537ba64a54 | ||
|
|
25d20b7354 | ||
|
|
04d8362905 | ||
|
|
21266e9a45 | ||
|
|
7304e2171d | ||
|
|
61fc480850 | ||
|
|
562e82f5ac | ||
|
|
d7ff85bb48 | ||
|
|
55bc6105e1 | ||
|
|
306c0b6096 | ||
|
|
024078ae33 | ||
|
|
b5a9ba8390 | ||
|
|
93f36927ca | ||
|
|
1db90cafd1 | ||
|
|
bf23a0def7 | ||
|
|
ea1cbeea9d | ||
|
|
aeda7e5520 | ||
|
|
a7899af8b8 | ||
|
|
b0385f47af | ||
|
|
86c384657c | ||
|
|
6e569110d2 | ||
|
|
3b1024b13c | ||
|
|
b3f5d11275 | ||
|
|
1078ba0a92 | ||
|
|
005c8170d4 | ||
|
|
b8d1d7a10b | ||
|
|
76769fb4d5 | ||
|
|
6ff6f0a4c6 | ||
|
|
72a45d2f6a | ||
|
|
2fe7c8a410 | ||
|
|
5269eb9c39 | ||
|
|
0a86bc0af2 | ||
|
|
bc9f6ba0b0 | ||
|
|
9e16a0ae42 | ||
|
|
9ccbb49aef | ||
|
|
d59f84fbbc | ||
|
|
4bbb5008b1 | ||
|
|
49ce25511e | ||
|
|
985276665d | ||
|
|
91f553c45f | ||
|
|
38ede8ec58 | ||
|
|
997f6543ce | ||
|
|
b50081a83b | ||
|
|
34f512d244 | ||
|
|
eb5752f41b | ||
|
|
ef8e7419fa | ||
|
|
cfcdd15b89 | ||
|
|
b26debaebc | ||
|
|
6deb061b12 | ||
|
|
4c6745670c | ||
|
|
01c662b7de | ||
|
|
179fe652c2 | ||
|
|
394bc3260d | ||
|
|
ce1a70e2dc | ||
|
|
99022896f6 | ||
|
|
446b400667 | ||
|
|
a0d9b6a7e0 | ||
|
|
7d53c21efe | ||
|
|
b78efbac36 | ||
|
|
9be9dcec46 | ||
|
|
3766ab802b | ||
|
|
b9141925a3 | ||
|
|
ed79fe86aa | ||
|
|
2f0b0955a9 | ||
|
|
2f8e15a900 | ||
|
|
b8b3a5c305 | ||
|
|
e7ea421c54 | ||
|
|
8de9699390 | ||
|
|
bf592a22ae | ||
|
|
8d4a619a15 | ||
|
|
1a3588624d | ||
|
|
74b3fd2efc | ||
|
|
091356ed59 | ||
|
|
fc0e1ee311 | ||
|
|
8dbfcbff58 | ||
|
|
317591bc8a | ||
|
|
f71b3b91c0 | ||
|
|
9e255bcbce | ||
|
|
8af319b953 | ||
|
|
f90fd9cec4 | ||
|
|
d386b1c12d | ||
|
|
81551ec50d | ||
|
|
8fafcf6eaa | ||
|
|
f0df6c61c9 | ||
|
|
6cf36b5771 | ||
|
|
54799187e9 | ||
|
|
6d0320be06 | ||
|
|
317a1527ad | ||
|
|
490eb0f57f | ||
|
|
f95283e341 | ||
|
|
837da0e458 | ||
|
|
8ce82a100e | ||
|
|
9ece98c101 | ||
|
|
6a83147b33 | ||
|
|
90e4228e1d | ||
|
|
553aeeef77 | ||
|
|
6147e865f8 | ||
|
|
7b296fabb0 | ||
|
|
00c8f8acd0 | ||
|
|
1e1efa2c5e | ||
|
|
b0b0dd9f0b | ||
|
|
30bb1c52d0 | ||
|
|
7fc96a61ad | ||
|
|
4a164c39b4 | ||
|
|
b0e4069bb7 | ||
|
|
19cbb27b4c | ||
|
|
d44c864387 | ||
|
|
36e21e53e0 | ||
|
|
b7598cc354 | ||
|
|
0a4f322d49 | ||
|
|
bf013fcdae | ||
|
|
fd52fccc15 | ||
|
|
c493d3a4ce | ||
|
|
aeceb2b9e7 | ||
|
|
cb5f833dd2 | ||
|
|
0740ccd9f7 | ||
|
|
716c84c896 | ||
|
|
c5fda07d1e | ||
|
|
7fffe0abaa | ||
|
|
8a42325c23 | ||
|
|
78900304bf | ||
|
|
fb6dfbcd3c | ||
|
|
3dd4c7da2a | ||
|
|
03c955410c | ||
|
|
74f77c9ded | ||
|
|
3caca03e8a | ||
|
|
49469840ab | ||
|
|
85613ab02d | ||
|
|
6e4ce85c87 | ||
|
|
2a093dc183 | ||
|
|
01eeadbaf4 | ||
|
|
851b3a7cfb | ||
|
|
b6dc830bcb | ||
|
|
8ef02aae41 | ||
|
|
423dbd58a1 | ||
|
|
5582db615a | ||
|
|
1479ebfb5d | ||
|
|
4389ef1e77 | ||
|
|
5c305e7fa8 | ||
|
|
0427908eae | ||
|
|
2df53c3d27 | ||
|
|
53ec9adb1b | ||
|
|
8b95a22e75 | ||
|
|
665298a04b | ||
|
|
7e668df1fe | ||
|
|
85414cfec2 | ||
|
|
b973187960 | ||
|
|
991080e613 | ||
|
|
72bf199577 | ||
|
|
7bda43a6ec | ||
|
|
2b8b0ebe95 | ||
|
|
0aa61ce58f | ||
|
|
51a5dc78d7 | ||
|
|
232bd9a22b | ||
|
|
58327a1753 | ||
|
|
7844d84798 | ||
|
|
7a30a42797 | ||
|
|
094202ff16 | ||
|
|
9c4523f4fa | ||
|
|
69859c61e0 | ||
|
|
9878518e29 | ||
|
|
cde270728f | ||
|
|
5559d0fa68 | ||
|
|
8feff78526 | ||
|
|
226a3de55d | ||
|
|
67d0f5f4ae | ||
|
|
192f5e563c | ||
|
|
b6296e7a67 | ||
|
|
67e17d3bc3 | ||
|
|
64a6fef823 | ||
|
|
e0c64cc4ff | ||
|
|
3e55478b3b | ||
|
|
9aef821862 | ||
|
|
f394df840e | ||
|
|
7d33699173 | ||
|
|
d3ffe8c647 | ||
|
|
9b99f62311 | ||
|
|
3319ce78d3 | ||
|
|
8eabf43525 | ||
|
|
adb12bb7be | ||
|
|
3c10b36651 | ||
|
|
d37c300d87 | ||
|
|
9fc92e901e | ||
|
|
5b52529295 | ||
|
|
f77a7ad623 | ||
|
|
504ef9422e | ||
|
|
cbbcec0895 | ||
|
|
32d90c38db | ||
|
|
e1f7f3d7bb | ||
|
|
244536ea72 | ||
|
|
fa24a3e09e | ||
|
|
5ec26a5015 | ||
|
|
8a8ff2aef0 | ||
|
|
069254be6a | ||
|
|
f3cd74cb46 | ||
|
|
4be8aa0f91 | ||
|
|
93dd7a85f6 | ||
|
|
062596e3fb | ||
|
|
5af2de635e | ||
|
|
a16df91fbb | ||
|
|
44178b9103 | ||
|
|
b767f930ad | ||
|
|
ba61a6545a | ||
|
|
23ada5c7a5 | ||
|
|
97c37efffe | ||
|
|
5db95be4fc | ||
|
|
5897422c70 | ||
|
|
a7db0d3cc5 | ||
|
|
c49036a713 | ||
|
|
03246997fa | ||
|
|
f4eac6e4fc | ||
|
|
48f695f3e6 | ||
|
|
3525f044f5 | ||
|
|
b58f8b9d7c | ||
|
|
c00962e881 | ||
|
|
9bcf1d662b | ||
|
|
586e0721d8 | ||
|
|
882dd1f3a7 | ||
|
|
399291d783 | ||
|
|
46ac2e5252 | ||
|
|
a81818b2db | ||
|
|
9b0d112176 | ||
|
|
ac17df0c65 | ||
|
|
c4be4e7928 | ||
|
|
877cbbd11d | ||
|
|
b2bb03310e | ||
|
|
5c8885ee5f | ||
|
|
40ec6b263d | ||
|
|
3742da8770 | ||
|
|
19b06418c5 | ||
|
|
b7b8b9219d | ||
|
|
949966964f | ||
|
|
c0a0f9c1df | ||
|
|
7cff2fa8f1 | ||
|
|
c1b703a039 | ||
|
|
e0eff1d2bb | ||
|
|
037ef76ad8 | ||
|
|
ae8025cd5c | ||
|
|
1804cc3a09 | ||
|
|
2d8e6b45ec | ||
|
|
3fa52d0d7d | ||
|
|
6a7129d7af | ||
|
|
f0e113a532 | ||
|
|
8b3e415201 | ||
|
|
eb6a8afe8d | ||
|
|
a705a89e4a | ||
|
|
ea509c0a36 | ||
|
|
269600d875 | ||
|
|
95e3a8f3cc | ||
|
|
ffeff3ab69 | ||
|
|
bdc009eb65 | ||
|
|
683f65f8ac | ||
|
|
a737698372 | ||
|
|
eeecbbcff9 | ||
|
|
44b3d60692 | ||
|
|
641c7d1967 | ||
|
|
7923d1e930 | ||
|
|
42e072a868 |
No files matched your search
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: Issue template
|
||||||
|
about: Please fill this issue template for reporting Mongoose issues
|
||||||
|
#title:
|
||||||
|
#labels:
|
||||||
|
#assignees:
|
||||||
|
---
|
||||||
|
|
||||||
|
- My goal is: _describe_
|
||||||
|
- My actions were: _describe_
|
||||||
|
- My expectation was: _describe_
|
||||||
|
- The result I saw: _provide logs or description_
|
||||||
|
- My question is: _your question_
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
|
||||||
|
- mongoose version: _X.Y_
|
||||||
|
- Compiler/IDE and SDK: ZZZ version _X.Y_
|
||||||
|
- Target hardware/board: _?_
|
||||||
|
- Connectivity chip/module: _?_
|
||||||
|
- Target RTOS/OS (if applicable): _?_
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
- My goal is: _describe_
|
|
||||||
- My actions were: _describe_
|
|
||||||
- My expectation was: _describe_
|
|
||||||
- The result I saw: _provide logs or description_
|
|
||||||
- My question is: _your question_
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
|
|
||||||
- mongoose version: _X.Y_
|
|
||||||
- Compiler/IDE and SDK: ZZZ version _X.Y_
|
|
||||||
- Target hardware/board: _?_
|
|
||||||
- Connectivity chip/module: _?_
|
|
||||||
- Target RTOS/OS (if applicable): _?_
|
|
||||||
@@ -11,17 +11,14 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: if ./test/match_changed_files.sh '^src/' ; then echo GO=1 >> $GITHUB_ENV ; fi
|
|
||||||
- name: Build Fuzzers
|
- name: Build Fuzzers
|
||||||
id: build
|
id: build
|
||||||
if: ${{ env.GO == 1 }}
|
|
||||||
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
||||||
with:
|
with:
|
||||||
oss-fuzz-project-name: 'mongoose'
|
oss-fuzz-project-name: 'mongoose'
|
||||||
dry-run: false
|
dry-run: false
|
||||||
language: c++
|
language: c++
|
||||||
- name: Run Fuzzers
|
- name: Run Fuzzers
|
||||||
if: ${{ env.GO == 1 }}
|
|
||||||
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
|
||||||
with:
|
with:
|
||||||
oss-fuzz-project-name: 'mongoose'
|
oss-fuzz-project-name: 'mongoose'
|
||||||
@@ -29,8 +26,8 @@ jobs:
|
|||||||
dry-run: false
|
dry-run: false
|
||||||
language: c++
|
language: c++
|
||||||
- name: Upload Crash
|
- name: Upload Crash
|
||||||
uses: actions/upload-artifact@v1
|
uses: actions/upload-artifact@v4
|
||||||
if: env.GO == 1 && failure() && steps.build.outcome == 'success'
|
if: failure() && steps.build.outcome == 'success'
|
||||||
with:
|
with:
|
||||||
name: artifacts
|
name: artifacts
|
||||||
path: ./out/artifacts
|
path: ./out/artifacts
|
||||||
@@ -2,8 +2,8 @@ name: "CodeQL Scanning"
|
|||||||
# https://github.com/github/codeql-action
|
# https://github.com/github/codeql-action
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
#schedule:
|
||||||
- cron: '30 2 * * *' # run at 2:30 AM UTC
|
# - cron: '30 23 * * *' # run at 11:30 PM UTC
|
||||||
# Allow manual runs
|
# Allow manual runs
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
@@ -17,11 +17,11 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
security-events: write
|
security-events: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: cpp
|
languages: cpp
|
||||||
- run: |
|
- run: |
|
||||||
@@ -29,4 +29,4 @@ jobs:
|
|||||||
./test/setup_ga_network.sh && make -C test mip_test CC=gcc ASAN= ASAN_OPTIONS=
|
./test/setup_ga_network.sh && make -C test mip_test CC=gcc ASAN= ASAN_OPTIONS=
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
name: Fuzz
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 21 * * *' # run at 9 PM UTC
|
||||||
|
# Allow manual runs
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
jobs:
|
||||||
|
fuzz:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
target: [fuzz, fuzz_tls]
|
||||||
|
name: ${{ matrix.target }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- run: make -C test ${{ matrix.target }} ARGS="-max_total_time=14400"
|
||||||
|
|
||||||
|
# as we're not getting access to test units causing a problem, convert from the log:
|
||||||
|
# base64 -d > dataofdeath
|
||||||
|
# then paste the base64 data, enter, Ctrl-D; maybe check with hexdump -C dataofdeath
|
||||||
+184
-316
@@ -1,7 +1,7 @@
|
|||||||
name: Full build and test
|
name: Full build
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 1 * * *' # run at 1 AM UTC
|
- cron: '0 22 * * *' # run at 10 PM UTC
|
||||||
# Allow manual runs
|
# Allow manual runs
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
env:
|
env:
|
||||||
@@ -29,15 +29,28 @@ jobs:
|
|||||||
select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
|
select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0"
|
||||||
- ssl: WOLFSSL
|
- ssl: WOLFSSL
|
||||||
select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
|
select: "-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0"
|
||||||
|
include:
|
||||||
|
- ssl: BUILTIN
|
||||||
|
cc: gcc
|
||||||
|
target: test
|
||||||
|
select: "-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1 -DMG_ENABLE_CHACHA20=0"
|
||||||
name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
||||||
env:
|
env:
|
||||||
CC: ${{ matrix.cc }}
|
CC: ${{ matrix.cc }}
|
||||||
SSL: ${{ matrix.ssl }}
|
SSL: ${{ matrix.ssl }}
|
||||||
TFLAGS: ${{ matrix.select }}
|
TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && make -C test ${{ matrix.target }}
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
|
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/linux_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
|
||||||
mip:
|
mip:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -46,14 +59,40 @@ jobs:
|
|||||||
cc: [gcc, clang, g++, clang++]
|
cc: [gcc, clang, g++, clang++]
|
||||||
target: [mip_test, mip_tap_test]
|
target: [mip_test, mip_tap_test]
|
||||||
ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
|
ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
|
||||||
|
# #3226: built-in TCP is currently not working with WolfSSL (builds fine)
|
||||||
|
exclude:
|
||||||
|
- ssl: WOLFSSL
|
||||||
|
target: mip_tap_test
|
||||||
name: ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}
|
name: ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}
|
||||||
env:
|
env:
|
||||||
CC: ${{ matrix.cc }}
|
CC: ${{ matrix.cc }}
|
||||||
SSL: ${{ matrix.ssl }}
|
SSL: ${{ matrix.ssl }}
|
||||||
|
TFLAGS: -DMQTT_LOCALHOST -DNO_ABORT
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: if [ "${{ matrix.target }}" == "mip_tap_test" ]; then ./test/setup_ga_network.sh ; fi && sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && make -C test ${{ matrix.target }} IPV6=0
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
|
- run: if [ "${{ matrix.target }}" == "mip_tap_test" ]; then ./test/setup_ga_network.sh ; export IPV6=0; else export IPV6=1 ; fi && sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && make -C test ${{ matrix.target }} > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_$(date +"%Y%m%d").json"
|
||||||
|
|
||||||
|
mip89:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
max-parallel: 1 # no parallel runs, to minimize MQTT errors
|
||||||
|
matrix:
|
||||||
|
target: [mip_vc98]
|
||||||
|
name: mip89 ${{ matrix.target }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- run: make -C test ${{ matrix.target }} IPV6=1
|
||||||
s390:
|
s390:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -61,10 +100,12 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
ssl: ["", BUILTIN]
|
ssl: ["", BUILTIN]
|
||||||
name: S390 SSL=${{ matrix.ssl }}
|
name: S390 SSL=${{ matrix.ssl }}
|
||||||
|
env:
|
||||||
|
TFLAGS: -DMQTT_LOCALHOST
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390 SSL=${{ matrix.ssl }}
|
- run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390 SSL=${{ matrix.ssl }} MULTIREC=NO
|
||||||
armhf:
|
armhf:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -72,10 +113,12 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
ssl: ["", BUILTIN]
|
ssl: ["", BUILTIN]
|
||||||
name: ArmHF SSL=${{ matrix.ssl }}
|
name: ArmHF SSL=${{ matrix.ssl }}
|
||||||
|
env:
|
||||||
|
TFLAGS: -DMQTT_LOCALHOST
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf SSL=${{ matrix.ssl }}
|
- run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf SSL=${{ matrix.ssl }} MULTIREC=NO
|
||||||
unamalgamated-mg_prefix:
|
unamalgamated-mg_prefix:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -87,7 +130,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev
|
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev
|
||||||
- run: make -C test unamalgamated && make -C test mg_prefix
|
- run: make -C test unamalgamated SSL=${{ matrix.ssl }} && make -C test mg_prefix
|
||||||
valgrind:
|
valgrind:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -95,11 +138,13 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
|
ssl: ["", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]
|
||||||
name: Valgrind SSL=${{ matrix.ssl }}
|
name: Valgrind SSL=${{ matrix.ssl }}
|
||||||
|
env:
|
||||||
|
TFLAGS: -DMQTT_LOCALHOST
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev valgrind
|
- run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev valgrind
|
||||||
- run: make -C test valgrind SSL=${{ matrix.ssl }}
|
- run: ./test/setup_mqtt_server.sh && make -C test valgrind SSL=${{ matrix.ssl }}
|
||||||
macos:
|
macos:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -110,6 +155,8 @@ jobs:
|
|||||||
exclude:
|
exclude:
|
||||||
- ssl: MBEDTLS
|
- ssl: MBEDTLS
|
||||||
select: -DMG_ENABLE_POLL=0
|
select: -DMG_ENABLE_POLL=0
|
||||||
|
- ssl: MBEDTLS # see issue#2694
|
||||||
|
select: -DMG_ENABLE_POLL=1
|
||||||
- ssl: OPENSSL
|
- ssl: OPENSSL
|
||||||
select: -DMG_ENABLE_POLL=0
|
select: -DMG_ENABLE_POLL=0
|
||||||
- ssl: WOLFSSL
|
- ssl: WOLFSSL
|
||||||
@@ -117,13 +164,23 @@ jobs:
|
|||||||
name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
||||||
env:
|
env:
|
||||||
SSL: ${{ matrix.ssl }}
|
SSL: ${{ matrix.ssl }}
|
||||||
TFLAGS: ${{ matrix.select }} -DNO_SNTP_CHECK -Wno-sign-conversion # Workaround for MbedTLS 3.5.0
|
TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST ${{ matrix.env.tflags }} -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS
|
||||||
HOMEBREW_NO_AUTO_UPDATE: 1
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: brew install mbedtls wolfssl # jq openssl already pre-installed
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
- run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*)
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
|
- run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed
|
||||||
|
- run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &
|
||||||
|
- run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
|
||||||
|
|
||||||
windows:
|
windows:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -138,12 +195,21 @@ jobs:
|
|||||||
select: -DMG_ENABLE_POLL=1
|
select: -DMG_ENABLE_POLL=1
|
||||||
name: windows ${{ matrix.target }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
name: windows ${{ matrix.target }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
||||||
env:
|
env:
|
||||||
SSL: SSL=${{ matrix.ssl }}
|
SSL: ${{ matrix.ssl }}
|
||||||
TFLAGS: ${{ matrix.select }}
|
TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: make -C test ${{ matrix.target }}
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
|
- run: ./test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/windows_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
|
||||||
|
|
||||||
arm:
|
arm:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
@@ -165,109 +231,33 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- run: make -C test riscv SSL=${{ matrix.ssl }}
|
- run: make -C test riscv SSL=${{ matrix.ssl }}
|
||||||
|
|
||||||
examples:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: examples ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- run: sudo apt -y install libpcap-dev
|
|
||||||
- run: make -C test examples CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
- run: make -C test clean_examples
|
|
||||||
examples_win:
|
|
||||||
runs-on: windows-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: examples_win ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
# - uses: egor-tensin/setup-mingw@v2
|
|
||||||
# with:
|
|
||||||
# platform: x64
|
|
||||||
- name: test they build
|
|
||||||
run: make -C test examples_win CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
shell: cmd
|
|
||||||
- name: test they clean
|
|
||||||
run: make -C test clean_examples_win
|
|
||||||
shell: cmd
|
|
||||||
examples_mac:
|
|
||||||
runs-on: macos-latest
|
|
||||||
env: { HOMEBREW_NO_AUTO_UPDATE: 1 }
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: examples_mac ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- run: make -C test examples_mac CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
- run: make -C test clean_examples_mac
|
|
||||||
|
|
||||||
refprojs:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: reference-projects ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- run: make -C test refprojs CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
- run: make -C test clean_refprojs
|
|
||||||
refprojs_win:
|
|
||||||
runs-on: windows-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: reference-projects_win ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
# - uses: egor-tensin/setup-mingw@v2
|
|
||||||
# with:
|
|
||||||
# platform: x64
|
|
||||||
- name: test they build
|
|
||||||
run: make -C test refprojs_win CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
shell: cmd
|
|
||||||
- name: test they clean
|
|
||||||
run: make -C test clean_refprojs_win
|
|
||||||
shell: cmd
|
|
||||||
refprojs_mac:
|
|
||||||
runs-on: macos-latest
|
|
||||||
env: { HOMEBREW_NO_AUTO_UPDATE: 1 }
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
|
||||||
name: reference-projects_mac ${{ matrix.ssl }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- run: make -C test refprojs CFLAGS_EXTRA="${{ matrix.ssl }}"
|
|
||||||
- run: make -C test clean_refprojs
|
|
||||||
|
|
||||||
tutorials:
|
tutorials:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
|
||||||
name: tutorials ${{ matrix.ssl }}
|
name: tutorials ${{ matrix.ssl }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
- run: sudo apt -y install libpcap-dev
|
- run: sudo apt -y install libpcap-dev
|
||||||
- run: make -C test tutorials CFLAGS_EXTRA="${{ matrix.ssl }}"
|
- run: make -C test tutorials CFLAGS_EXTRA="${{ matrix.ssl }}" > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/tutorials_${{ matrix.ssl }}_$(date +"%Y%m%d").json"
|
||||||
- run: make -C test clean_tutorials
|
- run: make -C test clean_tutorials
|
||||||
|
|
||||||
tutorials_win:
|
tutorials_win:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
|
||||||
name: tutorials_win ${{ matrix.ssl }}
|
name: tutorials_win ${{ matrix.ssl }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -286,7 +276,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]
|
||||||
name: tutorials_mac ${{ matrix.ssl }}
|
name: tutorials_mac ${{ matrix.ssl }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -300,9 +290,68 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: echo # nothing specific to install or do
|
- run: echo # nothing specific to install or do
|
||||||
- run: make -C examples/arduino arduino-xiao
|
- run: make -C test/arduino
|
||||||
# - run: make -C examples/arduino arduino-nano
|
- run: make -C test/arduino cleanall
|
||||||
- run: make -C examples/arduino clean
|
|
||||||
|
|
||||||
|
# wizard_examples:
|
||||||
|
# runs-on: ubuntu-latest
|
||||||
|
# strategy:
|
||||||
|
# fail-fast: false
|
||||||
|
# matrix:
|
||||||
|
# example:
|
||||||
|
# - path: esp32/esp32-idf
|
||||||
|
# name: ${{ matrix.example.path }}
|
||||||
|
# env:
|
||||||
|
# GO: 0
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v4
|
||||||
|
# with: { fetch-depth: 2 }
|
||||||
|
# - run: echo # nothing specific to install or do
|
||||||
|
# fi
|
||||||
|
# - run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
|
wizard_examples_arm:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
example:
|
||||||
|
- path: infineon/xmc47_relax-make-baremetal-builtin
|
||||||
|
- path: infineon/xmc_plt2go_4400-make-baremetal-builtin
|
||||||
|
- path: infineon/xmc72_evk-make-baremetal-builtin
|
||||||
|
- path: nxp/frdm-mcxn947-make-baremetal-builtin
|
||||||
|
- path: nxp/frdm-mcxn947-make-freertos-builtin
|
||||||
|
- path: nxp/rt1020-evk-make-baremetal-builtin
|
||||||
|
- path: nxp/rt1060-evk-make-baremetal-builtin
|
||||||
|
- path: nxp/rt1170-evk-make-baremetal-builtin
|
||||||
|
- path: pico-sdk/pico-w-picosdk-baremetal-builtin
|
||||||
|
- path: pico-sdk/pico-2-w-picosdk-baremetal-builtin
|
||||||
|
- path: pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin
|
||||||
|
- path: pico-sdk/w5500-evb-pico2-picosdk-baremetal-builtin
|
||||||
|
- path: pico-sdk/w55rp20-evb-pico-picosdk-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-f429zi-make-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-f429zi-make-freertos-builtin
|
||||||
|
- path: stm32/nucleo-f746zg-make-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-f746zg-make-freertos-builtin
|
||||||
|
- path: stm32/nucleo-h563zi-make-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-h563zi-make-freertos-builtin
|
||||||
|
- path: stm32/nucleo-h723zg-make-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-h723zg-make-freertos-builtin
|
||||||
|
- path: stm32/nucleo-h743zi-make-baremetal-builtin
|
||||||
|
- path: stm32/nucleo-h743zi-make-freertos-builtin
|
||||||
|
- path: stm32/stm32h573i-dk-make-baremetal-builtin
|
||||||
|
- path: stm32/stm32h573i-dk-make-freertos-builtin
|
||||||
|
- path: ti/ek-tm4c1294xl-make-baremetal-builtin
|
||||||
|
- path: ti/ek-tm4c1294xl-make-freertos-builtin
|
||||||
|
name: ${{ matrix.example.path }}
|
||||||
|
env:
|
||||||
|
GO: 0
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
|
|
||||||
generic_examples:
|
generic_examples:
|
||||||
@@ -311,18 +360,17 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
example:
|
example:
|
||||||
- path: esp32/uart-bridge
|
- path: micropython/esp32
|
||||||
- path: esp32/micropython
|
- path: http/uart-bridge/esp32
|
||||||
- path: esp8266/http-client-server
|
- path: http/http-client/esp8266/http-client-server
|
||||||
name: ${{ matrix.example.path }}
|
name: ${{ matrix.example.path }}
|
||||||
env:
|
env:
|
||||||
GO: 0
|
GO: 0
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: if ./test/match_changed_files.sh '^src|^examples/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi
|
|
||||||
- run: echo # nothing specific to install or do
|
- run: echo # nothing specific to install or do
|
||||||
- run: make -C examples/${{ matrix.example.path }} build
|
- run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
generic_examples_arm:
|
generic_examples_arm:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -330,9 +378,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
example:
|
example:
|
||||||
- path: microchip/same54-xpro/mqtt-client
|
- path: mqtt/mqtt-client/microchip/same54-xpro
|
||||||
- path: infineon/infineon-xmc4700_4800-lwip-rtx-rtos
|
|
||||||
- path: nxp/nxp-mimxrt1020-azurertos
|
|
||||||
- path: nxp/nxp-frdmk66f-freertos
|
- path: nxp/nxp-frdmk66f-freertos
|
||||||
- path: nxp/nxp-lpcxpresso54s018m-freertos
|
- path: nxp/nxp-lpcxpresso54s018m-freertos
|
||||||
- path: nxp/nxp-mimxrt1020-freertos
|
- path: nxp/nxp-mimxrt1020-freertos
|
||||||
@@ -351,7 +397,7 @@ jobs:
|
|||||||
- path: nxp/nxp-lpcxpresso54628-lwip-freertos
|
- path: nxp/nxp-lpcxpresso54628-lwip-freertos
|
||||||
- path: nxp/nxp-twrk65f180m-lwip-freertos
|
- path: nxp/nxp-twrk65f180m-lwip-freertos
|
||||||
- path: nxp/nxp-twrkv58f220m-lwip-freertos
|
- path: nxp/nxp-twrkv58f220m-lwip-freertos
|
||||||
- path: rp2040/pico-rmii
|
- path: pico-sdk/pico-rmii
|
||||||
- path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis
|
- path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis
|
||||||
- path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis
|
- path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis
|
||||||
- path: stm32/nucleo-g031-make-baremetal-builtin
|
- path: stm32/nucleo-g031-make-baremetal-builtin
|
||||||
@@ -362,7 +408,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
- run: make -C examples/${{ matrix.example.path }} build
|
- run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
device_dashboard_examples:
|
device_dashboard_examples:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -370,13 +416,14 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
example:
|
example:
|
||||||
- path: esp32/device-dashboard
|
- path: esp32
|
||||||
name: ${{ matrix.example.path }}
|
name: ${{ matrix.example.path }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: echo # nothing specific to install or do
|
- run: echo # nothing specific to install or do
|
||||||
- run: make -C examples/${{ matrix.example.path }} build
|
- run: make -C tutorials/http/device-dashboard/${{ matrix.example.path }} build
|
||||||
|
|
||||||
|
|
||||||
device_dashboard_examples_arm:
|
device_dashboard_examples_arm:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -385,41 +432,22 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
ssl: ["", -DMG_TLS=MG_TLS_BUILTIN]
|
||||||
example:
|
example:
|
||||||
- path: infineon/infineon-xmc7200
|
- path: http/device-dashboard/microchip/same54-xpro
|
||||||
- path: microchip/same54-xpro/device-dashboard
|
|
||||||
- path: nxp/rt1020-evk-make-baremetal-builtin
|
|
||||||
- path: nxp/rt1020-evk-make-freertos-builtin
|
- path: nxp/rt1020-evk-make-freertos-builtin
|
||||||
- path: nxp/frdm-mcxn947-make-baremetal-builtin
|
|
||||||
- path: nxp/frdm-mcxn947-make-freertos-builtin
|
|
||||||
- path: nxp/rt1060-evk-make-baremetal-builtin
|
|
||||||
- path: nxp/rt1060-evk-make-freertos-builtin
|
- path: nxp/rt1060-evk-make-freertos-builtin
|
||||||
- path: nxp/rt1170-evk-make-baremetal-builtin
|
|
||||||
- path: nxp/rt1170-evk-make-freertos-builtin
|
- path: nxp/rt1170-evk-make-freertos-builtin
|
||||||
- path: renesas/ek-ra6m4-make-baremetal-builtin
|
- path: renesas/ek-ra6m4-make-baremetal-builtin
|
||||||
- path: rp2040/pico-rndis-dashboard
|
- path: pico-sdk/pico-rndis-dashboard
|
||||||
- path: rp2040/pico-w
|
- path: pico-sdk/pico-w-picosdk-freertos-lwip
|
||||||
- path: rp2040/pico-w5500
|
- path: pico-sdk/pico-2-w-picosdk-freertos-lwip
|
||||||
- path: stm32/nucleo-f429zi-make-baremetal-builtin
|
|
||||||
- path: stm32/nucleo-f429zi-make-freertos-builtin
|
|
||||||
- path: stm32/nucleo-f746zg-make-baremetal-builtin
|
|
||||||
- path: stm32/nucleo-f746zg-make-freertos-builtin
|
|
||||||
- path: stm32/nucleo-f746zg-make-freertos-tcp
|
- path: stm32/nucleo-f746zg-make-freertos-tcp
|
||||||
- path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver
|
- path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver
|
||||||
- path: stm32/nucleo-h563zi-make-baremetal-builtin
|
|
||||||
- path: stm32/nucleo-h563zi-make-freertos-builtin
|
|
||||||
- path: stm32/nucleo-h723zg-make-freertos-builtin
|
|
||||||
- path: stm32/nucleo-h743zi-make-baremetal-builtin
|
|
||||||
- path: stm32/nucleo-h743zi-make-freertos-builtin
|
|
||||||
- path: stm32/stm32h573i-dk-make-baremetal-builtin
|
|
||||||
- path: stm32/stm32h573i-dk-make-freertos-builtin
|
|
||||||
- path: ti/ek-tm4c1294xl-make-baremetal-builtin
|
|
||||||
- path: ti/ek-tm4c1294xl-make-freertos-builtin
|
|
||||||
name: ${{ matrix.example.path }} ${{ matrix.ssl }}
|
name: ${{ matrix.example.path }} ${{ matrix.ssl }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
- run: make -C examples/${{ matrix.example.path }} build CFLAGS_EXTRA="${{ matrix.ssl }}"
|
- run: make -C tutorials/${{ matrix.example.path }} build CFLAGS_EXTRA="${{ matrix.ssl }}"
|
||||||
|
|
||||||
# mqtt_dashboard_examples:
|
# mqtt_dashboard_examples:
|
||||||
# runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
@@ -433,7 +461,7 @@ jobs:
|
|||||||
# - uses: actions/checkout@v4
|
# - uses: actions/checkout@v4
|
||||||
# with: { fetch-depth: 2 }
|
# with: { fetch-depth: 2 }
|
||||||
# - run: echo # nothing specific to install or do
|
# - run: echo # nothing specific to install or do
|
||||||
# - run: make -C examples/${{ matrix.example.path }} build
|
# - run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
mqtt_dashboard_examples_arm:
|
mqtt_dashboard_examples_arm:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -441,13 +469,13 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
example:
|
example:
|
||||||
- path: rp2040/pico-rndis-device
|
- path: pico-sdk/pico-rndis-device
|
||||||
name: ${{ matrix.example.path }}
|
name: ${{ matrix.example.path }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
- run: make -C examples/${{ matrix.example.path }} build
|
- run: make -C tutorials/${{ matrix.example.path }} build
|
||||||
|
|
||||||
# dual_examples:
|
# dual_examples:
|
||||||
# runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
@@ -461,181 +489,21 @@ jobs:
|
|||||||
# - uses: actions/checkout@v4
|
# - uses: actions/checkout@v4
|
||||||
# with: { fetch-depth: 2 }
|
# with: { fetch-depth: 2 }
|
||||||
# - run: echo # nothing specific to install or do
|
# - run: echo # nothing specific to install or do
|
||||||
# - run: make -C examples/${{ matrix.example.path }} device_dashboard
|
# - run: make -C tutorials/${{ matrix.example.path }} device_dashboard
|
||||||
# - run: make -C examples/${{ matrix.example.path }} mqtt_dashboard
|
# - run: make -C tutorials/${{ matrix.example.path }} mqtt_dashboard
|
||||||
|
|
||||||
dual_examples_arm:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
example:
|
|
||||||
- path: stm32/nucleo-h723zg-make-baremetal-builtin
|
|
||||||
name: ${{ matrix.example.path }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/${{ matrix.example.path }} device_dashboard
|
|
||||||
- run: make -C examples/${{ matrix.example.path }} mqtt_dashboard
|
|
||||||
|
|
||||||
cube_examples:
|
cube_examples:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
with: { fetch-depth: 2 }
|
||||||
- run: echo # nothing specific to install or do
|
- run: sudo pip install yq
|
||||||
- run: cd test/cube && make
|
- run: cd test/cube && make
|
||||||
|
|
||||||
zephyr_examples:
|
# xpresso_examples:
|
||||||
runs-on: ubuntu-latest
|
# runs-on: ubuntu-latest
|
||||||
steps:
|
# steps:
|
||||||
- uses: actions/checkout@v4
|
# - uses: actions/checkout@v4
|
||||||
with: { fetch-depth: 2 }
|
# with: { fetch-depth: 2 }
|
||||||
- run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
# - run: sudo pip install yq
|
||||||
- run: make -C examples/zephyr init
|
# - run: cd test/xpresso && make
|
||||||
- name: minify manifest
|
|
||||||
uses: mikefarah/yq@master
|
|
||||||
with:
|
|
||||||
cmd: yq -i eval '(.manifest.defaults, .manifest.remotes, .manifest.projects[] | select(.name == "cmsis" or .name == "hal_stm32" or .name == "mbedtls" or .name == "mcuboot" or .name == "picolibc" | del(.null) ), .manifest.self) as $i ireduce({};setpath($i | path; $i)) | del(.manifest.projects.[].null) | del(..|select(length==0))' examples/zephyr/zephyrproject/zephyr/west.yml
|
|
||||||
- run: make -C examples/zephyr update
|
|
||||||
- run: make -C examples/zephyr/device-dashboard build
|
|
||||||
- run: make -C examples/zephyr/http-client build
|
|
||||||
- run: make -C examples/zephyr/http-server build
|
|
||||||
- run: make -C examples/zephyr/mqtt-aws-client build
|
|
||||||
- run: make -C examples/zephyr/websocket-server build
|
|
||||||
|
|
||||||
test_f7:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- name: Cube
|
|
||||||
run: echo # nothing specific to install or do
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
|
||||||
|
|
||||||
test_f4:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- name: Cube
|
|
||||||
run: echo # nothing specific to install or do
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
|
||||||
|
|
||||||
test_h743:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- name: Cube
|
|
||||||
run: echo # nothing specific to install or do
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
|
|
||||||
- run: make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
|
|
||||||
|
|
||||||
test_h723:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_h5:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_rt1020:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_rt1060:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_rt1170:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_ra6m4:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 3 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
# - run: make -C examples/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_tm4c:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_same54:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- name: baremetal
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/microchip/same54-xpro/device-dashboard test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
- run: make -C examples/microchip/same54-xpro/mqtt-client test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
test_pico_w5500:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 2 }
|
|
||||||
- name: SDK
|
|
||||||
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
|
||||||
- run: make -C examples/rp2040/pico-w5500 test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
|
||||||
|
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
name: Full test
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 23 * * *' # run at 11 PM UTC
|
||||||
|
# Allow manual runs
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
IPV6: 0
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
test_f7:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- name: Cube
|
||||||
|
run: sudo pip install yq
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
||||||
|
- run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5
|
||||||
|
|
||||||
|
test_f4:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- name: Cube
|
||||||
|
run: sudo pip install yq
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
||||||
|
- run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2
|
||||||
|
|
||||||
|
test_h743:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
# - name: Cube
|
||||||
|
# run: echo # nothing specific to install or do
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
|
||||||
|
# - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6
|
||||||
|
|
||||||
|
test_h723:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_h5:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_rt1020:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_rt1060:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_rt1170:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_ra6m4:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 3 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
# - run: make -C tutorials/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_tm4c:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_same54:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- name: baremetal
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/http/device-dashboard/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
- run: make -C tutorials/mqtt/mqtt-client/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
|
|
||||||
|
test_pico_w5500:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- name: SDK
|
||||||
|
run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi
|
||||||
|
- run: make -C tutorials/pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
name: On demand ad hoc test
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
env:
|
||||||
|
IPV6: 0
|
||||||
|
jobs:
|
||||||
|
macos:
|
||||||
|
runs-on: macos-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
ssl: [MBEDTLS, WOLFSSL]
|
||||||
|
select: [-DMG_ENABLE_POLL=1]
|
||||||
|
name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}
|
||||||
|
env:
|
||||||
|
SSL: ${{ matrix.ssl }}
|
||||||
|
TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- uses: webfactory/ssh-agent@v0.9.1
|
||||||
|
with:
|
||||||
|
ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}
|
||||||
|
- run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed
|
||||||
|
- run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &
|
||||||
|
- run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log
|
||||||
|
- if: success() || failure()
|
||||||
|
run: |
|
||||||
|
cat log
|
||||||
|
test/health.awk < log > json
|
||||||
|
scp -o "StrictHostKeyChecking=no" json "root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +"%Y%m%d").json"
|
||||||
+516
-551
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,27 @@
|
|||||||
|
name: Zephyr
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # run at 12 AM UTC
|
||||||
|
# Allow manual runs
|
||||||
|
workflow_dispatch:
|
||||||
|
jobs:
|
||||||
|
zephyr_examples:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
revno: ["--mr v3.7-branch", "--mr v4.2.0", "--mr v4.3.0"] # LTS, latest stable
|
||||||
|
name: Zephyr ${{ matrix.revno }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with: { fetch-depth: 2 }
|
||||||
|
- run: test/setup_ga_docker_filesystem.sh
|
||||||
|
- run: make -C tutorials/zephyr init REPO=zephyrprojectrtos/ci:v0.28.8 REVNO="${{ matrix.revno }}"
|
||||||
|
- run: make -C tutorials/zephyr minify REVNO="${{ matrix.revno }}"
|
||||||
|
- run: make -C tutorials/zephyr update
|
||||||
|
- run: make -C tutorials/zephyr/device-dashboard build REPO=zephyrprojectrtos/ci:v0.28.8
|
||||||
|
- run: make -C tutorials/zephyr/http-client build REPO=zephyrprojectrtos/ci:v0.28.8
|
||||||
|
- run: make -C tutorials/zephyr/http-server build REPO=zephyrprojectrtos/ci:v0.28.8
|
||||||
|
- run: make -C tutorials/zephyr/mqtt-aws-client build REPO=zephyrprojectrtos/ci:v0.28.8
|
||||||
|
- run: make -C tutorials/zephyr/websocket-server build REPO=zephyrprojectrtos/ci:v0.28.8
|
||||||
|
# Latest CI image does not work with pre 4.4, they changed some SDK paths
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
Copyright (c) 2004-2013 Sergey Lyubka
|
Copyright (c) 2004-2013 Sergey Lyubka
|
||||||
Copyright (c) 2013-2024 Cesanta Software Limited
|
Copyright (c) 2013-2026 Cesanta Software Limited
|
||||||
All rights reserved
|
All rights reserved
|
||||||
|
|
||||||
This software is dual-licensed: you can redistribute it and/or modify
|
This software is dual-licensed: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# Mongoose - Embedded Web Server / Embedded Network Library
|
# Mongoose - Embedded Web Server / Embedded Network Library
|
||||||
|
|
||||||
[](https://opensource.org/licenses/gpl-2.0.php)
|
[](https://opensource.org/licenses/gpl-2.0.php)
|
||||||
[](https://github.com/cesanta/mongoose/actions)
|
[](https://github.com/cesanta/mongoose/actions)
|
||||||
[](https://codecov.io/gh/cesanta/mongoose)
|
[](https://codecov.io/gh/cesanta/mongoose)
|
||||||
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:mongoose)
|
[](https://issues.oss-fuzz.com/issues?sort=-opened&can=1&q=proj:mongoose)
|
||||||
|
|
||||||
Mongoose is a network library for C/C++. It provides event-driven non-blocking
|
<img src="https://mongoose.ws/images/logo.svg" width="48" height="48" align="left" style="float:left;" /> Mongoose is a network library for C/C++. It provides event-driven non-blocking
|
||||||
APIs for TCP, UDP, HTTP, WebSocket, MQTT, and other protocols. It is designed
|
APIs for TCP, UDP, HTTP, WebSocket, MQTT, and other protocols. It is designed
|
||||||
for connecting devices and bringing them online. On the market since 2004, used
|
for connecting devices and bringing them online. On the market since 2004, used
|
||||||
by vast number of open source and commercial products - it even runs on the
|
by vast number of open source and commercial products - it even runs on the
|
||||||
@@ -14,7 +14,7 @@ robust, and easy. Features include:
|
|||||||
|
|
||||||
- Cross-platform:
|
- Cross-platform:
|
||||||
- works on Linux/UNIX, MacOS, Windows, Android
|
- works on Linux/UNIX, MacOS, Windows, Android
|
||||||
- works on STM32, NXP, ESP32, NRF52, TI, Microchip, and other
|
- works on ST, NXP, ESP32, Nordic, TI, Microchip, Infineon, Renesas and other chips
|
||||||
- write code once - and it'll work everywhere
|
- write code once - and it'll work everywhere
|
||||||
- ideal for the unification of the network infrastructure code across company
|
- ideal for the unification of the network infrastructure code across company
|
||||||
- Built-in protocols: plain TCP/UDP, SNTP, HTTP, MQTT, Websocket, and other
|
- Built-in protocols: plain TCP/UDP, SNTP, HTTP, MQTT, Websocket, and other
|
||||||
@@ -34,6 +34,35 @@ robust, and easy. Features include:
|
|||||||
|
|
||||||
See https://mongoose.ws/ for complete documentation, videos, case studies, etc.
|
See https://mongoose.ws/ for complete documentation, videos, case studies, etc.
|
||||||
|
|
||||||
|
## Supported platforms
|
||||||
|
|
||||||
|
Mongoose can work on top of any TCP/IP stack that supports BSD sockets API.
|
||||||
|
Platforms supported by the 3rd party TCP/IP stacks:
|
||||||
|
|
||||||
|
| TCP/IP stack | Notes |
|
||||||
|
| :-------------- | :------- |
|
||||||
|
| **lwIP** | All devices running lwIP, for example ESP32, ESP32S3, ESP32C3, ESP32C6, etc |
|
||||||
|
| **Zephyr** | All devices supported by Zephyr |
|
||||||
|
| **Other** | Any other TCP/IP stack that supports BSD socket API, for example Amazon FreeRTOS-TCP |
|
||||||
|
| **Linux, Mac, Windows** | Workstations, server, single board computers, embedded Linux devices running on MPUs or FPGAs |
|
||||||
|
|
||||||
|
Optionally, Mongoose provides its own built-in TCP/IP stack, eliminating the
|
||||||
|
need for additional software to implement networking functionality. The
|
||||||
|
built-in stack supports operation in both bare-metal and RTOS environments.
|
||||||
|
Platforms supported by the Mongoose built-in TCP/IP stack:
|
||||||
|
|
||||||
|
| Hardware | Notes |
|
||||||
|
| :------------- | :------- |
|
||||||
|
| **STM32** | All STM32 MCUs with built-in Ethernet: STM32Fxx, STM32H5xx, STM32H7xx |
|
||||||
|
| **NXP** | All NXP MCUs with built-in Ethernet: IMXRT102x, IMXRT104x, IMXRT105x, IMXRT106x, IMXRT117x, RW612, MCXN94x |
|
||||||
|
| **Microchip** | ATSAME54 MCUs with built-int Ethernet |
|
||||||
|
| **Renesas** | RA5M, RA6M, RA8M MCUs with built-in Ethernet |
|
||||||
|
| **Infineon** | XMC4, XMC7 MCUs with built-in Ethernet |
|
||||||
|
| **Texas Instruments** | TM4C, TMS570 MCUs with built-in Ethernet |
|
||||||
|
| **Cypress WiFi** | Any MCU with CY43xx WiFi chips, like RP2040 Pico-W, RP2350 Pico2-W, Arduino Portenta |
|
||||||
|
| **Wiznet Ethernet** | Any MCU that use Wiznet W5500 or Wiznet 5100 MAC+PHY chips |
|
||||||
|
| **Cellular** | NRF9160, SIM800 |
|
||||||
|
|
||||||
## Usage Examples
|
## Usage Examples
|
||||||
|
|
||||||
Below are quick snippets that should give an idea how simple the API is and
|
Below are quick snippets that should give an idea how simple the API is and
|
||||||
@@ -70,7 +99,7 @@ HTTP server implements a REST API that returns current time. JSON formatting:
|
|||||||
static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
static void ev_handler(struct mg_connection *c, int ev, void *ev_data) {
|
||||||
if (ev == MG_EV_HTTP_MSG) {
|
if (ev == MG_EV_HTTP_MSG) {
|
||||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||||
if (mg_http_match_uri(hm, "/api/time/get")) {
|
if (mg_match(hm->uri, mg_str("/api/time/get"), NULL)) {
|
||||||
mg_http_reply(c, 200, "", "{%m:%lu}\n", MG_ESC("time"), time(NULL));
|
mg_http_reply(c, 200, "", "{%m:%lu}\n", MG_ESC("time"), time(NULL));
|
||||||
} else {
|
} else {
|
||||||
mg_http_reply(c, 500, "", "{%m:%m}\n", MG_ESC("error"), MG_ESC("Unsupported URI"));
|
mg_http_reply(c, 500, "", "{%m:%m}\n", MG_ESC("error"), MG_ESC("Unsupported URI"));
|
||||||
@@ -169,6 +198,30 @@ We take security seriously:
|
|||||||
have specific security requirements and run independent security audits,
|
have specific security requirements and run independent security audits,
|
||||||
of which we get notified and in case of any issue, act similar to (3).
|
of which we get notified and in case of any issue, act similar to (3).
|
||||||
|
|
||||||
|
## How to report security vulnerabilities
|
||||||
|
|
||||||
|
Please send an email to support@cesanta.com, with the full information.
|
||||||
|
Do NOT create a github issue.
|
||||||
|
|
||||||
|
## Articles
|
||||||
|
|
||||||
|
Technical guides and deep dives into embedded web servers, WebUI integration and embedded networking technologies:
|
||||||
|
- [Embedded Web Server: A Comprehensive Guide for Modern Connected Devices](https://mongoose.ws/articles/embedded-web-server-a-comprehensive-guide-for-modern-connected-devices/)
|
||||||
|
- [Building Embedded Web Device Dashboards](https://mongoose.ws/articles/building-embedded-web-device-dashboard/)
|
||||||
|
- [ESP32 Device Dashboard: A Step-by-Step Guide for Developers](https://mongoose.ws/articles/esp32-device-dashboard/)
|
||||||
|
- [How to build an STM32 Web Dashboard](https://mongoose.ws/articles/stm32-device-dashboard/)
|
||||||
|
- [STM32 WebSocket Guide](https://mongoose.ws/articles/stm32-websocket-guide/)
|
||||||
|
- [Web File Manager on STM32, ESP32 and Embedded Linux](https://mongoose.ws/articles/building-a-web-file-manager-on-stm32-esp32-embedded-linux/)
|
||||||
|
- [Web dashboard on Zephyr RTOS](https://mongoose.ws/articles/web-dashboard-on-zephyr-rtos/)
|
||||||
|
- [Limiting TCP/IP RAM usage on STM32](https://mongoose.ws/articles/limiting-tcpip-ram-usage-on-stm32/)
|
||||||
|
- [STM32 Ethernet explained](https://mongoose.ws/articles/stm32-ethernet-explained/)
|
||||||
|
- [MQTT on a Microcontroller](https://mongoose.ws/articles/mqtt-on-a-microcontroller/)
|
||||||
|
- [STM32 OTA Firmware Update](https://mongoose.ws/articles/stm32-ota-firmware-update/)
|
||||||
|
- [RP2350 OTA Firmware Update](https://mongoose.ws/articles/rp2350-ota-firmware-update/)
|
||||||
|
- [STM32 Ethernet and caches](https://mongoose.ws/articles/stm32-ethernet-and-cache/)
|
||||||
|
- [NXP RW612 OTA Firmware Update](https://mongoose.ws/articles/rw612-ota-firmware-update/)
|
||||||
|
- [lwIP vs Mongoose - TCP/IP Stack Integration Benchmark](https://mongoose.ws/articles/lwip-vs-mongoose-tcpip-stack-integration/)
|
||||||
|
|
||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
# Mongoose Network Library Examples
|
|
||||||
|
|
||||||
In order to build and run any of the existing examples, please follow:
|
|
||||||
https://mongoose.ws/documentation/#how-to-build-and-run-examples
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Rules for creating a new example:
|
|
||||||
|
|
||||||
- Makefile golden reference for desktop/server example: [http-server](http-server)
|
|
||||||
- Makefile golden reference for the embedded example:
|
|
||||||
[stm32/nucleo-f746zg-baremetal](stm32/nucleo-f746zg-baremetal)
|
|
||||||
- An example must build on Windows, Mac and Ubuntu Linux systems
|
|
||||||
- Assume that user installed tools according to https://mongoose.ws/tutorials/tools/
|
|
||||||
- Makefile must not include any other make files
|
|
||||||
- Use `CFLAGS` for system-specific compilation options
|
|
||||||
- Use `CFLAGS_MONGOOSE` for mongoose-specific compilation options
|
|
||||||
- Use `$(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA)` to compile
|
|
||||||
- If external repository is required, download it on demand using git
|
|
||||||
shallow clone. See embedded example golden reference
|
|
||||||
- Keep Makefile as short as possible, but verbose to understand it easily
|
|
||||||
- Symlink files when required, like `mongoose.c`, `ca.pem`, etc. Make no copies
|
|
||||||
- Example's README.md should contain only the title and the link to mongoose.ws
|
|
||||||
tutorial page
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
all:
|
|
||||||
example:
|
|
||||||
true
|
|
||||||
|
|
||||||
arduino: ENV = -v $(CWD):/root
|
|
||||||
arduino:
|
|
||||||
curl -sL http://downloads.arduino.cc/arduino-1.8.19-linux64.tar.xz | unxz | tar -xf -
|
|
||||||
mv arduino-* $@
|
|
||||||
|
|
||||||
arduino-xiao-board:
|
|
||||||
./arduino/arduino --pref "boardsmanager.additional.urls=https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json" --save-prefs
|
|
||||||
./arduino/arduino --pref "compiler.warning_level=all" --save-prefs
|
|
||||||
./arduino/arduino --install-boards Seeeduino:samd
|
|
||||||
|
|
||||||
arduino-xiao: arduino arduino-xiao-board
|
|
||||||
cd w5500-http && ../arduino/arduino --verbose --verify --board Seeeduino:samd:seeed_XIAO_m0 w5500-http.ino
|
|
||||||
cd w5500-mqtt && ../arduino/arduino --verbose --verify --board Seeeduino:samd:seeed_XIAO_m0 w5500-mqtt.ino
|
|
||||||
|
|
||||||
arduino-nano: arduino
|
|
||||||
cd w5500-http && ../arduino/arduino --pref compiler.cpp.extra_flags=-DMG_ENABLE_LOG=0 --verbose --verify --board arduino:avr:nano w5500-http.ino
|
|
||||||
cd w5500-mqtt && ../arduino/arduino --pref compiler.cpp.extra_flags=-DMG_ENABLE_LOG=0 --verbose --verify --board arduino:avr:nano w5500-mqtt.ino
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf arduino
|
|
||||||
|
|
||||||
cleanall: clean #otherwise some parts of xiao-board installation will fail as already installed
|
|
||||||
rm -rf ~/.arduino15 ~/.oracle_jre_usage
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#define MG_ARCH MG_ARCH_NEWLIB // Use ARM toolchain
|
|
||||||
#define MG_ENABLE_TCPIP 1 // Enable built-in network stack
|
|
||||||
#define MG_ENABLE_DRIVER_IMXRT 1 // Enable RTxx driver
|
|
||||||
#define MG_ENABLE_CUSTOM_MILLIS 1 // Let user implement mg_millis()
|
|
||||||
#define MG_ENABLE_POSIX_FS 0 // Disable POSIX filesystem
|
|
||||||
#define MG_ENABLE_PACKED_FS 1 // Enable packed filesystem
|
|
||||||
|
|
||||||
#define HTTP_URL "http://0.0.0.0"
|
|
||||||
#define HTTPS_URL "https://0.0.0.0"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#define MG_ARCH MG_ARCH_CUSTOM
|
|
||||||
#define MG_ENABLE_SOCKET 0
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
|
||||||
#define MG_ENABLE_DRIVER_W5500 1
|
|
||||||
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
|
|
||||||
#define mkdir(a, b) (-1)
|
|
||||||
#define MG_IO_SIZE 128
|
|
||||||
//#define MG_ENABLE_LOG 0
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#include <SPI.h>
|
|
||||||
#include "mongoose.h"
|
|
||||||
|
|
||||||
#define SS_PIN 3 // Slave select pin
|
|
||||||
struct mg_mgr mgr; // Mongoose event manager
|
|
||||||
struct mg_tcpip_spi spi = {
|
|
||||||
NULL, // SPI data
|
|
||||||
[](void *) { digitalWrite(SS_PIN, LOW); }, // begin transation
|
|
||||||
[](void *) { digitalWrite(SS_PIN, HIGH); }, // end transaction
|
|
||||||
[](void *, uint8_t c) { return SPI.transfer(c); }, // execute transaction
|
|
||||||
};
|
|
||||||
struct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}}; // network interface
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(115200);
|
|
||||||
pinMode(SS_PIN, OUTPUT);
|
|
||||||
SPI.begin();
|
|
||||||
|
|
||||||
// Set logging function to a serial print
|
|
||||||
mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
|
|
||||||
delay(3000);
|
|
||||||
MG_INFO(("Starting TCP/IP stack..."));
|
|
||||||
|
|
||||||
mif.driver = &mg_tcpip_driver_w5500;
|
|
||||||
mif.driver_data = &spi;
|
|
||||||
mg_tcpip_init(&mgr, &mif);
|
|
||||||
|
|
||||||
// Start a 5 sec timer, print status message periodically
|
|
||||||
mg_timer_add(
|
|
||||||
&mgr, 5000, MG_TIMER_REPEAT,
|
|
||||||
[](void *) {
|
|
||||||
MG_INFO(("ethernet: %s", mg_tcpip_driver_w5500.up(&mif) ? "up" : "down"));
|
|
||||||
},
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
// Setup HTTP listener. Respond "ok" on any HTTP request
|
|
||||||
mg_http_listen(
|
|
||||||
&mgr, "http://0.0.0.0",
|
|
||||||
[](struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
if (ev == MG_EV_HTTP_MSG) mg_http_reply(c, 200, "", "ok\n");
|
|
||||||
},
|
|
||||||
&mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
mg_mgr_poll(&mgr, 1);
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Arduino.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#define MG_ARCH MG_ARCH_CUSTOM
|
|
||||||
#define MG_ENABLE_SOCKET 0
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
|
||||||
#define MG_ENABLE_DRIVER_W5500 1
|
|
||||||
#define MG_ENABLE_TCPIP_DRIVER_INIT 0
|
|
||||||
#define mkdir(a, b) (-1)
|
|
||||||
#define MG_IO_SIZE 512
|
|
||||||
//#define MG_ENABLE_LOG 0
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define MQTT_SERVER "mqtt://broker.hivemq.com:1883"
|
|
||||||
struct mg_connection *mqtt_connection;
|
|
||||||
const char *mqtt_subscribe_topic = "mg/rx";
|
|
||||||
const char *mqtt_publish_topic = "mg/tx";
|
|
||||||
|
|
||||||
struct mg_mgr mgr; // Mongoose event manager
|
|
||||||
struct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}}; // network interface
|
|
||||||
|
|
||||||
void mqtt_publish(const char *message) {
|
|
||||||
struct mg_mqtt_opts opts = {};
|
|
||||||
opts.topic = mg_str(mqtt_publish_topic);
|
|
||||||
opts.message = mg_str(message);
|
|
||||||
if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
if (ev == MG_EV_MQTT_OPEN) {
|
|
||||||
MG_INFO(("%lu CONNECTED to %s", c->id, MQTT_SERVER));
|
|
||||||
struct mg_mqtt_opts opts = {};
|
|
||||||
opts.topic = mg_str(mqtt_subscribe_topic);
|
|
||||||
mg_mqtt_sub(c, &opts);
|
|
||||||
MG_INFO(("%lu SUBSCRIBED to %s", c->id, mqtt_subscribe_topic));
|
|
||||||
} else if (ev == MG_EV_MQTT_MSG) {
|
|
||||||
// Received MQTT message
|
|
||||||
struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
|
|
||||||
MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
|
|
||||||
mm->data.buf, (int) mm->topic.len, mm->topic.buf));
|
|
||||||
exec_command(mm->data.buf, mm->data.len);
|
|
||||||
} else if (ev == MG_EV_CLOSE) {
|
|
||||||
MG_INFO(("%lu CLOSED", c->id));
|
|
||||||
mqtt_connection = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_fn(void *arg) {
|
|
||||||
struct mg_mgr *mgr = (struct mg_mgr *) arg;
|
|
||||||
struct mg_mqtt_opts opts;
|
|
||||||
memset(&opts, 0, sizeof(opts));
|
|
||||||
opts.clean = true;
|
|
||||||
if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) {
|
|
||||||
mqtt_connection = mg_mqtt_connect(mgr, MQTT_SERVER, &opts, fn, NULL);
|
|
||||||
}
|
|
||||||
// MG_INFO(("Eth: %d, MQTT: %p", mif.state, mqtt_connection));
|
|
||||||
}
|
|
||||||
|
|
||||||
void net_init(void) {
|
|
||||||
// Set Mongoose logging function to a serial print
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
|
|
||||||
mif.driver = &mg_tcpip_driver_w5500;
|
|
||||||
mif.driver_data = &spi;
|
|
||||||
mg_tcpip_init(&mgr, &mif);
|
|
||||||
|
|
||||||
// Start a timer that keeps MQTT connection alive
|
|
||||||
mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT, timer_fn, &mgr);
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "mongoose.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern struct mg_tcpip_spi spi;
|
|
||||||
extern struct mg_mgr mgr;
|
|
||||||
void mqtt_publish(const char *message);
|
|
||||||
void net_init(void);
|
|
||||||
void exec_command(const char *req, size_t req_len);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#include <SPI.h>
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define SS_PIN 17 // Slave select pin
|
|
||||||
struct mg_tcpip_spi spi = {
|
|
||||||
NULL, // SPI data
|
|
||||||
[](void *) { digitalWrite(SS_PIN, LOW); }, // Begin transaction
|
|
||||||
[](void *) { digitalWrite(SS_PIN, HIGH); }, // End transaction
|
|
||||||
[](void *, uint8_t c) { return SPI.transfer(c); }, // Execute transaction
|
|
||||||
};
|
|
||||||
|
|
||||||
void exec_command(const char *req, size_t req_len) {
|
|
||||||
char res[100];
|
|
||||||
if (req_len == 2 && strncmp(req, "on", req_len) == 0) {
|
|
||||||
digitalWrite(LED_BUILTIN, true);
|
|
||||||
snprintf(res, sizeof(res), "LED on");
|
|
||||||
} else if (req_len == 3 && strncmp(req, "off", req_len) == 0) {
|
|
||||||
digitalWrite(LED_BUILTIN, false);
|
|
||||||
snprintf(res, sizeof(res), "LED off");
|
|
||||||
} else {
|
|
||||||
snprintf(res, sizeof(res), "Unknown command: [%.*s]", (int) req_len, req);
|
|
||||||
}
|
|
||||||
Serial.println(res);
|
|
||||||
mqtt_publish(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void process_input(char c) {
|
|
||||||
static char buf[100];
|
|
||||||
static size_t len = 0;
|
|
||||||
char response[100];
|
|
||||||
if (c != '\n' && c != '\0') buf[len++] = c; // Append to the buffer
|
|
||||||
if (len >= sizeof(buf)) len = 0; // On overflow, reset
|
|
||||||
if (c == '\n' && len > 0) {
|
|
||||||
exec_command(buf, len);
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(115200);
|
|
||||||
SPI.begin();
|
|
||||||
pinMode(SS_PIN, OUTPUT);
|
|
||||||
pinMode(LED_BUILTIN, OUTPUT);
|
|
||||||
mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);
|
|
||||||
net_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
if (Serial.available()) process_input(Serial.read());
|
|
||||||
mg_mgr_poll(&mgr, 1);
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
PROG ?= ./example # Program we are building
|
|
||||||
PACK ?= ./pack # Packing executable
|
|
||||||
DELETE = rm -rf # Command to remove files
|
|
||||||
GZIP ?= gzip # For compressing files in web_root/
|
|
||||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
|
||||||
SOURCES = main.c mongoose.c net.c packed_fs.c # Source code files
|
|
||||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
|
||||||
NPX ?= npx
|
|
||||||
|
|
||||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
|
||||||
CFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT) # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe
|
|
||||||
PROG = example.exe # Use .exe suffix for the binary
|
|
||||||
PACK = pack.exe # Packing executable
|
|
||||||
CC = gcc # Use MinGW gcc compiler
|
|
||||||
CFLAGS += -lws2_32 # Link against Winsock library
|
|
||||||
DELETE = cmd /C del /Q /F /S # Command prompt command to delete files
|
|
||||||
GZIP = echo # No gzip on Windows
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Default target. Build and run program
|
|
||||||
all: $(PROG)
|
|
||||||
$(RUN) $(PROG) $(ARGS)
|
|
||||||
|
|
||||||
# Build program from sources
|
|
||||||
$(PROG): $(SOURCES)
|
|
||||||
$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)
|
|
||||||
|
|
||||||
# Bundle JS libraries (preact, preact-router, ...) into a single file
|
|
||||||
web_root/bundle.js:
|
|
||||||
curl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router -o $@
|
|
||||||
|
|
||||||
# Create optimised CSS. Prerequisite: npm -g i tailwindcss tailwindcss-font-inter
|
|
||||||
web_root/main.css: web_root/index.html $(wildcard web_root/*.js)
|
|
||||||
$(NPX) tailwindcss -o $@ --minify
|
|
||||||
|
|
||||||
# Generate packed filesystem for serving Web UI
|
|
||||||
packed_fs.c: $(wildcard web_root/*) $(wildcard certs/*) Makefile web_root/main.css web_root/bundle.js
|
|
||||||
$(GZIP) web_root/*
|
|
||||||
$(CC) ../../test/pack.c -o $(PACK)
|
|
||||||
$(PACK) web_root/* certs/* > $@
|
|
||||||
$(GZIP) -d web_root/*
|
|
||||||
|
|
||||||
mbedtls:
|
|
||||||
git clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@
|
|
||||||
|
|
||||||
ifeq ($(TLS), mbedtls)
|
|
||||||
CFLAGS += -DMG_TLS=MG_TLS_MBED -Wno-conversion -Imbedtls/include
|
|
||||||
CFLAGS += -DMBEDTLS_CONFIG_FILE=\"mbedtls_config.h\" mbedtls/library/*.c
|
|
||||||
$(PROG): mbedtls
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Cleanup. Delete built program and all build artifacts
|
|
||||||
clean:
|
|
||||||
$(DELETE) $(PROG) $(PACK) *.o *.obj *.exe *.dSYM mbedtls
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.c
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.h
|
|
||||||
@@ -1,306 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
// Authenticated user.
|
|
||||||
// A user can be authenticated by:
|
|
||||||
// - a name:pass pair, passed in a header Authorization: Basic .....
|
|
||||||
// - an access_token, passed in a header Cookie: access_token=....
|
|
||||||
// When a user is shown a login screen, she enters a user:pass. If successful,
|
|
||||||
// a server responds with a http-only access_token cookie set.
|
|
||||||
struct user {
|
|
||||||
const char *name, *pass, *access_token;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Settings
|
|
||||||
struct settings {
|
|
||||||
bool log_enabled;
|
|
||||||
int log_level;
|
|
||||||
long brightness;
|
|
||||||
char *device_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct settings s_settings = {true, 1, 57, NULL};
|
|
||||||
|
|
||||||
static const char *s_json_header =
|
|
||||||
"Content-Type: application/json\r\n"
|
|
||||||
"Cache-Control: no-cache\r\n";
|
|
||||||
|
|
||||||
int ui_event_next(int no, struct ui_event *e) {
|
|
||||||
if (no < 0 || no >= MAX_EVENTS_NO) return 0;
|
|
||||||
|
|
||||||
srand((unsigned) no);
|
|
||||||
e->type = (uint8_t) rand() % 4;
|
|
||||||
e->prio = (uint8_t) rand() % 3;
|
|
||||||
e->timestamp =
|
|
||||||
(unsigned long) ((int64_t) mg_now() - 86400 * 1000 /* one day back */ +
|
|
||||||
no * 300 * 1000 /* 5 mins between alerts */ +
|
|
||||||
1000 * (rand() % 300) /* randomize event time */) /
|
|
||||||
1000UL;
|
|
||||||
|
|
||||||
mg_snprintf(e->text, MAX_EVENT_TEXT_SIZE, "event#%d", no);
|
|
||||||
return no + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_sntp_fn(void *param) { // SNTP timer function. Sync up time
|
|
||||||
mg_sntp_connect(param, "udp://time.google.com:123", NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse HTTP requests, return authenticated user or NULL
|
|
||||||
static struct user *authenticate(struct mg_http_message *hm) {
|
|
||||||
// In production, make passwords strong and tokens randomly generated
|
|
||||||
// In this example, user list is kept in RAM. In production, it can
|
|
||||||
// be backed by file, database, or some other method.
|
|
||||||
static struct user users[] = {
|
|
||||||
{"admin", "admin", "admin_token"},
|
|
||||||
{"user1", "user1", "user1_token"},
|
|
||||||
{"user2", "user2", "user2_token"},
|
|
||||||
{NULL, NULL, NULL},
|
|
||||||
};
|
|
||||||
char user[64], pass[64];
|
|
||||||
struct user *u, *result = NULL;
|
|
||||||
mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass));
|
|
||||||
MG_VERBOSE(("user [%s] pass [%s]", user, pass));
|
|
||||||
|
|
||||||
if (user[0] != '\0' && pass[0] != '\0') {
|
|
||||||
// Both user and password is set, search by user/password
|
|
||||||
for (u = users; result == NULL && u->name != NULL; u++)
|
|
||||||
if (strcmp(user, u->name) == 0 && strcmp(pass, u->pass) == 0) result = u;
|
|
||||||
} else if (user[0] == '\0') {
|
|
||||||
// Only password is set, search by token
|
|
||||||
for (u = users; result == NULL && u->name != NULL; u++)
|
|
||||||
if (strcmp(pass, u->access_token) == 0) result = u;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_login(struct mg_connection *c, struct user *u) {
|
|
||||||
char cookie[256];
|
|
||||||
mg_snprintf(cookie, sizeof(cookie),
|
|
||||||
"Set-Cookie: access_token=%s; Path=/; "
|
|
||||||
"%sHttpOnly; SameSite=Lax; Max-Age=%d\r\n",
|
|
||||||
u->access_token, c->is_tls ? "Secure; " : "", 3600 * 24);
|
|
||||||
mg_http_reply(c, 200, cookie, "{%m:%m}", MG_ESC("user"), MG_ESC(u->name));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_logout(struct mg_connection *c) {
|
|
||||||
char cookie[256];
|
|
||||||
mg_snprintf(cookie, sizeof(cookie),
|
|
||||||
"Set-Cookie: access_token=; Path=/; "
|
|
||||||
"Expires=Thu, 01 Jan 1970 00:00:00 UTC; "
|
|
||||||
"%sHttpOnly; Max-Age=0; \r\n",
|
|
||||||
c->is_tls ? "Secure; " : "");
|
|
||||||
mg_http_reply(c, 200, cookie, "true\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_debug(struct mg_connection *c, struct mg_http_message *hm) {
|
|
||||||
int level = mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG);
|
|
||||||
mg_log_set(level);
|
|
||||||
mg_http_reply(c, 200, "", "Debug level set to %d\n", level);
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_int_arr(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
size_t i, len = 0, num = va_arg(*ap, size_t); // Number of items in the array
|
|
||||||
int *arr = va_arg(*ap, int *); // Array ptr
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
len += mg_xprintf(out, ptr, "%s%d", i == 0 ? "" : ",", arr[i]);
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_stats_get(struct mg_connection *c) {
|
|
||||||
int points[] = {21, 22, 22, 19, 18, 20, 23, 23, 22, 22, 22, 23, 22};
|
|
||||||
mg_http_reply(c, 200, s_json_header, "{%m:%d,%m:%d,%m:[%M]}\n",
|
|
||||||
MG_ESC("temperature"), 21, //
|
|
||||||
MG_ESC("humidity"), 67, //
|
|
||||||
MG_ESC("points"), print_int_arr,
|
|
||||||
sizeof(points) / sizeof(points[0]), points);
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_events(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
size_t len = 0;
|
|
||||||
struct ui_event ev;
|
|
||||||
int pageno = va_arg(*ap, int);
|
|
||||||
int no = (pageno - 1) * EVENTS_PER_PAGE;
|
|
||||||
int end = no + EVENTS_PER_PAGE;
|
|
||||||
|
|
||||||
while ((no = ui_event_next(no, &ev)) != 0 && no <= end) {
|
|
||||||
len += mg_xprintf(out, ptr, "%s{%m:%lu,%m:%d,%m:%d,%m:%m}\n", //
|
|
||||||
len == 0 ? "" : ",", //
|
|
||||||
MG_ESC("time"), ev.timestamp, //
|
|
||||||
MG_ESC("type"), ev.type, //
|
|
||||||
MG_ESC("prio"), ev.prio, //
|
|
||||||
MG_ESC("text"), MG_ESC(ev.text));
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_events_get(struct mg_connection *c,
|
|
||||||
struct mg_http_message *hm) {
|
|
||||||
int pageno = mg_json_get_long(hm->body, "$.page", 1);
|
|
||||||
mg_http_reply(c, 200, s_json_header, "{%m:[%M], %m:%d}\n", MG_ESC("arr"),
|
|
||||||
print_events, pageno, MG_ESC("totalCount"), MAX_EVENTS_NO);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_settings_set(struct mg_connection *c, struct mg_str body) {
|
|
||||||
struct settings settings;
|
|
||||||
char *s = mg_json_get_str(body, "$.device_name");
|
|
||||||
bool ok = true;
|
|
||||||
memset(&settings, 0, sizeof(settings));
|
|
||||||
mg_json_get_bool(body, "$.log_enabled", &settings.log_enabled);
|
|
||||||
settings.log_level = mg_json_get_long(body, "$.log_level", 0);
|
|
||||||
settings.brightness = mg_json_get_long(body, "$.brightness", 0);
|
|
||||||
if (s && strlen(s) < MAX_DEVICE_NAME) {
|
|
||||||
free(settings.device_name);
|
|
||||||
settings.device_name = s;
|
|
||||||
} else {
|
|
||||||
free(s);
|
|
||||||
}
|
|
||||||
s_settings = settings; // Save to the device flash
|
|
||||||
mg_http_reply(c, 200, s_json_header,
|
|
||||||
"{%m:%s,%m:%m}", //
|
|
||||||
MG_ESC("status"), ok ? "true" : "false", //
|
|
||||||
MG_ESC("message"), MG_ESC(ok ? "Success" : "Failed"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_settings_get(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "{%m:%s,%m:%hhu,%m:%hhu,%m:%m}\n", //
|
|
||||||
MG_ESC("log_enabled"),
|
|
||||||
s_settings.log_enabled ? "true" : "false", //
|
|
||||||
MG_ESC("log_level"), s_settings.log_level, //
|
|
||||||
MG_ESC("brightness"), s_settings.brightness, //
|
|
||||||
MG_ESC("device_name"), MG_ESC(s_settings.device_name));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_firmware_upload(struct mg_connection *c,
|
|
||||||
struct mg_http_message *hm) {
|
|
||||||
char name[64], offset[20], total[20];
|
|
||||||
struct mg_str data = hm->body;
|
|
||||||
long ofs = -1, tot = -1;
|
|
||||||
name[0] = offset[0] = '\0';
|
|
||||||
mg_http_get_var(&hm->query, "name", name, sizeof(name));
|
|
||||||
mg_http_get_var(&hm->query, "offset", offset, sizeof(offset));
|
|
||||||
mg_http_get_var(&hm->query, "total", total, sizeof(total));
|
|
||||||
MG_INFO(("File %s, offset %s, len %lu", name, offset, data.len));
|
|
||||||
if ((ofs = mg_json_get_long(mg_str(offset), "$", -1)) < 0 ||
|
|
||||||
(tot = mg_json_get_long(mg_str(total), "$", -1)) < 0) {
|
|
||||||
mg_http_reply(c, 500, "", "offset and total not set\n");
|
|
||||||
} else if (ofs == 0 && mg_ota_begin((size_t) tot) == false) {
|
|
||||||
mg_http_reply(c, 500, "", "mg_ota_begin(%ld) failed\n", tot);
|
|
||||||
} else if (data.len > 0 && mg_ota_write(data.buf, data.len) == false) {
|
|
||||||
mg_http_reply(c, 500, "", "mg_ota_write(%lu) @%ld failed\n", data.len, ofs);
|
|
||||||
mg_ota_end();
|
|
||||||
} else if (data.len == 0 && mg_ota_end() == false) {
|
|
||||||
mg_http_reply(c, 500, "", "mg_ota_end() failed\n", tot);
|
|
||||||
} else {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "true\n");
|
|
||||||
if (data.len == 0) {
|
|
||||||
// Successful mg_ota_end() called, schedule device reboot
|
|
||||||
mg_timer_add(c->mgr, 500, 0, (void (*)(void *)) mg_device_reset, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_firmware_commit(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "%s\n",
|
|
||||||
mg_ota_commit() ? "true" : "false");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_firmware_rollback(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "%s\n",
|
|
||||||
mg_ota_rollback() ? "true" : "false");
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_status(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
int fw = va_arg(*ap, int);
|
|
||||||
return mg_xprintf(out, ptr, "{%m:%d,%m:%c%lx%c,%m:%u,%m:%u}\n",
|
|
||||||
MG_ESC("status"), mg_ota_status(fw), MG_ESC("crc32"), '"',
|
|
||||||
mg_ota_crc32(fw), '"', MG_ESC("size"), mg_ota_size(fw),
|
|
||||||
MG_ESC("timestamp"), mg_ota_timestamp(fw));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_firmware_status(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "[%M,%M]\n", print_status,
|
|
||||||
MG_FIRMWARE_CURRENT, print_status, MG_FIRMWARE_PREVIOUS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_device_reset(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "true\n");
|
|
||||||
mg_timer_add(c->mgr, 500, 0, (void (*)(void *)) mg_device_reset, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_device_eraselast(struct mg_connection *c) {
|
|
||||||
size_t ss = mg_flash_sector_size(), size = mg_flash_size();
|
|
||||||
char *base = (char *) mg_flash_start(), *last = base + size - ss;
|
|
||||||
if (mg_flash_bank() == 2) last -= size / 2;
|
|
||||||
mg_flash_erase(last);
|
|
||||||
mg_http_reply(c, 200, s_json_header, "true\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTP request handler function
|
|
||||||
static void fn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
if (ev == MG_EV_ACCEPT) {
|
|
||||||
if (c->fn_data != NULL) { // TLS listener!
|
|
||||||
struct mg_tls_opts opts = {0};
|
|
||||||
opts.cert = mg_unpacked("/certs/server_cert.pem");
|
|
||||||
opts.key = mg_unpacked("/certs/server_key.pem");
|
|
||||||
mg_tls_init(c, &opts);
|
|
||||||
}
|
|
||||||
} else if (ev == MG_EV_HTTP_MSG) {
|
|
||||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
|
||||||
struct user *u = authenticate(hm);
|
|
||||||
|
|
||||||
if (mg_match(hm->uri, mg_str("/api/#"), NULL) && u == NULL) {
|
|
||||||
mg_http_reply(c, 403, "", "Not Authorised\n");
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/login"), NULL)) {
|
|
||||||
handle_login(c, u);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/logout"), NULL)) {
|
|
||||||
handle_logout(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/debug"), NULL)) {
|
|
||||||
handle_debug(c, hm);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/stats/get"), NULL)) {
|
|
||||||
handle_stats_get(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/events/get"), NULL)) {
|
|
||||||
handle_events_get(c, hm);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/settings/get"), NULL)) {
|
|
||||||
handle_settings_get(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/settings/set"), NULL)) {
|
|
||||||
handle_settings_set(c, hm->body);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/firmware/upload"), NULL)) {
|
|
||||||
handle_firmware_upload(c, hm);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/firmware/commit"), NULL)) {
|
|
||||||
handle_firmware_commit(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/firmware/rollback"), NULL)) {
|
|
||||||
handle_firmware_rollback(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/firmware/status"), NULL)) {
|
|
||||||
handle_firmware_status(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/device/reset"), NULL)) {
|
|
||||||
handle_device_reset(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/device/eraselast"), NULL)) {
|
|
||||||
handle_device_eraselast(c);
|
|
||||||
} else {
|
|
||||||
struct mg_http_serve_opts opts;
|
|
||||||
memset(&opts, 0, sizeof(opts));
|
|
||||||
#if MG_ARCH == MG_ARCH_UNIX || MG_ARCH == MG_ARCH_WIN32
|
|
||||||
opts.root_dir = "web_root"; // On workstations, use filesystem
|
|
||||||
#else
|
|
||||||
opts.root_dir = "/web_root"; // On embedded, use packed files
|
|
||||||
opts.fs = &mg_fs_packed;
|
|
||||||
#endif
|
|
||||||
mg_http_serve_dir(c, ev_data, &opts);
|
|
||||||
}
|
|
||||||
MG_DEBUG(("%lu %.*s %.*s -> %.*s", c->id, (int) hm->method.len,
|
|
||||||
hm->method.buf, (int) hm->uri.len, hm->uri.buf, (int) 3,
|
|
||||||
&c->send.buf[9]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void web_init(struct mg_mgr *mgr) {
|
|
||||||
s_settings.device_name = strdup("My Device");
|
|
||||||
mg_http_listen(mgr, HTTP_URL, fn, NULL);
|
|
||||||
mg_http_listen(mgr, HTTPS_URL, fn, (void *) 1);
|
|
||||||
mg_timer_add(mgr, 3600 * 1000, MG_TIMER_RUN_NOW | MG_TIMER_REPEAT,
|
|
||||||
timer_sntp_fn, mgr);
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" class="h-full bg-white">
|
|
||||||
<head>
|
|
||||||
<title></title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor'> <path stroke-linecap='round' stroke-linejoin='round' d='M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0' /> </svg>" />
|
|
||||||
<link href="main.css" rel="stylesheet" />
|
|
||||||
<link href="https://rsms.me/inter/inter.css" rel="stylesheet" />
|
|
||||||
</head>
|
|
||||||
<body class="h-full"></body>
|
|
||||||
<script src="history.min.js"></script>
|
|
||||||
<script type="module" src="main.js"></script>
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter var,Helvetica,sans-serif;font-feature-settings:"cv11","ss01";font-variation-settings:"opsz" 32}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-auto{right:auto}.top-0{top:0}.isolate{isolation:isolate}.z-10{z-index:10}.z-\[48\]{z-index:48}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2/span 2}.m-4{margin:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mb-1{margin-bottom:.25rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-7{margin-top:1.75rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-11{width:2.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-96{width:24rem}.w-full{width:100%}.min-w-full{min-width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-\[30px\]{flex-basis:30px}.border-separate{border-collapse:initial}.border-spacing-0Line truncated
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
THISDIR = $(realpath $(CURDIR))
|
|
||||||
ROOTDIR = $(realpath $(CURDIR)/../../..)
|
|
||||||
DOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) espressif/idf
|
|
||||||
CMD ?= idf.py build
|
|
||||||
PORT ?= /dev/ttyUSB0
|
|
||||||
|
|
||||||
all: example
|
|
||||||
|
|
||||||
example:
|
|
||||||
true
|
|
||||||
|
|
||||||
build: Makefile $(wildcard main/*)
|
|
||||||
$(DOCKER) $(CMD)
|
|
||||||
|
|
||||||
flash:
|
|
||||||
flash: CMD = idf.py flash
|
|
||||||
flash: DA = --device $(PORT)
|
|
||||||
flash: build
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
|
|
||||||
dashboard.hex: build
|
|
||||||
esputil mkhex \
|
|
||||||
0x8000 build/partition_table/partition-table.bin \
|
|
||||||
0x1000 build/bootloader/bootloader.bin \
|
|
||||||
0x100000 build/mongoose-esp32-example.bin > $@
|
|
||||||
|
|
||||||
flash2: dashboard.hex
|
|
||||||
esputil -p $(PORT) -b 921600 -fp 0x220 flash dashboard.hex
|
|
||||||
esputil -p $(PORT) monitor
|
|
||||||
|
|
||||||
ESPTOOL ?= esptool.py
|
|
||||||
|
|
||||||
flash3:
|
|
||||||
cd build && $(ESPTOOL) --chip esp32 -p $(PORT) -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x100000 mongoose-esp32-example.bin
|
|
||||||
|
|
||||||
clean:
|
|
||||||
test -d build && $(DOCKER) rm -rf build sdkconfig || true
|
|
||||||
@@ -1,265 +0,0 @@
|
|||||||
// Copyright (c) 2020 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define WIFI_SSID "YOUR_WIFI_NETWORK_NAME" // SET THIS!
|
|
||||||
#define WIFI_PASS "YOUR_WIFI_PASSWORD" // SET THIS!
|
|
||||||
|
|
||||||
void app_main(void) {
|
|
||||||
// Setup wifi. This function is implemented in wifi.c
|
|
||||||
// It blocks until connected to the configured WiFi network
|
|
||||||
void wifi_init(const char *ssid, const char *pass);
|
|
||||||
wifi_init(WIFI_SSID, WIFI_PASS);
|
|
||||||
|
|
||||||
// Connected to WiFi, now start HTTP server
|
|
||||||
struct mg_mgr mgr;
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
MG_INFO(("Mongoose version : v%s", MG_VERSION));
|
|
||||||
MG_INFO(("Listening on : %s", HTTP_URL));
|
|
||||||
#if MG_ENABLE_MBEDTLS
|
|
||||||
MG_INFO(("Listening on : %s", HTTPS_URL));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
web_init(&mgr);
|
|
||||||
for (;;) mg_mgr_poll(&mgr, 1000); // Infinite event loop
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MG_DEVICE == MG_DEVICE_CUSTOM
|
|
||||||
void *mg_flash_start(void) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
size_t mg_flash_size(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
size_t mg_flash_sector_size(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
size_t mg_flash_write_align(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int mg_flash_bank(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
bool mg_flash_erase(void *location) {
|
|
||||||
(void) location;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool mg_flash_swap_bank(void) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
bool mg_flash_write(void *addr, const void *buf, size_t len) {
|
|
||||||
(void) addr, (void) buf, (void) len;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void mg_device_reset(void) {
|
|
||||||
esp_restart();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MG_OTA == MG_OTA_CUSTOM
|
|
||||||
#include "esp_app_format.h"
|
|
||||||
#include "esp_ota_ops.h"
|
|
||||||
|
|
||||||
static size_t s_size = 0; // Firmware size to flash. In-progress indicator
|
|
||||||
static bool rx_checked = false; // Whether firmware being received has been checked as valid
|
|
||||||
const esp_partition_t * update_partition = NULL; // The partition the update is being applied to
|
|
||||||
esp_ota_handle_t update_handle = 0; // Handle of the current update process
|
|
||||||
|
|
||||||
const esp_partition_t * get_partition_from_fw(int fw) {
|
|
||||||
if (MG_FIRMWARE_CURRENT == fw) {
|
|
||||||
return esp_ota_get_running_partition();
|
|
||||||
}
|
|
||||||
const esp_partition_t * p = esp_ota_get_last_invalid_partition();
|
|
||||||
if (NULL == p) {
|
|
||||||
p = esp_ota_get_next_update_partition(NULL);
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if the data buffer contains the header of a valid firmware
|
|
||||||
const size_t fw_size_required = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t);
|
|
||||||
bool check_fw_header(const void* buf, size_t len) {
|
|
||||||
// Ensure we have received enough data to do the check
|
|
||||||
if (len < fw_size_required) {
|
|
||||||
MG_ERROR(("Insufficient data to check firmware header - %d bytes, require %d bytes", len, fw_size_required));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the magic word of the received firmare
|
|
||||||
esp_app_desc_t* rx_app_info = (esp_app_desc_t*)(((char*)buf) + sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t));
|
|
||||||
if (ESP_APP_DESC_MAGIC_WORD != rx_app_info->magic_word) {
|
|
||||||
MG_ERROR(("Invalid app - invalid magic word"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MG_INFO(("Received firmware: %s %s", rx_app_info->project_name, rx_app_info->version));
|
|
||||||
|
|
||||||
// Get the name/version of the running firmware
|
|
||||||
const esp_partition_t *current = esp_ota_get_running_partition();
|
|
||||||
esp_app_desc_t curr_app_info;
|
|
||||||
esp_err_t res = esp_ota_get_partition_description(current, &curr_app_info);
|
|
||||||
if (ESP_OK != res) {
|
|
||||||
MG_ERROR(("Unable to get name/version of running firmware"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MG_INFO(("Running firmware: %s %s", curr_app_info.project_name, curr_app_info.version));
|
|
||||||
|
|
||||||
// Check the name of the new firmware is the same as the old firmware
|
|
||||||
if (memcmp(curr_app_info.project_name, rx_app_info->project_name, sizeof(curr_app_info.project_name)) != 0) {
|
|
||||||
MG_ERROR(("Firmware name is different. Wrong firmware uploaded! Current %s Uploaded %s", curr_app_info.project_name, rx_app_info->project_name));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the version of the new firmware is different from the old firmware
|
|
||||||
if (memcmp(curr_app_info.version, rx_app_info->version, sizeof(curr_app_info.version)) == 0) {
|
|
||||||
MG_ERROR(("Firmware version is the same. Wrong firmware uploaded! Current %s, Uploaded %s", curr_app_info.version, rx_app_info->version));
|
|
||||||
//return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mg_ota_begin(size_t new_firmware_size) {
|
|
||||||
rx_checked = false;
|
|
||||||
if (s_size) {
|
|
||||||
MG_ERROR(("OTA already in progress. Call mg_ota_end()"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int partition_size = mg_ota_size(MG_FIRMWARE_PREVIOUS);
|
|
||||||
if (new_firmware_size > partition_size) {
|
|
||||||
MG_ERROR(("Firmware %lu bytes, max %lu", new_firmware_size, partition_size));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
update_partition = esp_ota_get_next_update_partition(NULL);
|
|
||||||
if (NULL == update_partition) {
|
|
||||||
MG_ERROR(("esp_ota_get_next_update_partition returned NULL"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
esp_err_t res = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);
|
|
||||||
if (res != ESP_OK) {
|
|
||||||
esp_ota_abort(update_handle);
|
|
||||||
MG_ERROR(("esp_ota_begin failed (%s)", esp_err_to_name(res)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s_size = new_firmware_size;
|
|
||||||
MG_INFO(("Starting OTA, firmware size %lu", s_size));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mg_ota_write(const void *buf, size_t len) {
|
|
||||||
if (s_size == 0) {
|
|
||||||
MG_ERROR(("OTA is not started, call mg_ota_begin()"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!rx_checked) {
|
|
||||||
if (!check_fw_header(buf, len)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
rx_checked = true;
|
|
||||||
}
|
|
||||||
esp_err_t res = esp_ota_write(update_handle, buf, len);
|
|
||||||
if (res != ESP_OK) {
|
|
||||||
esp_ota_abort(update_handle);
|
|
||||||
MG_ERROR(("esp_ota_write FAILED (%s)", esp_err_to_name(res)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mg_ota_end(void) {
|
|
||||||
if (0 == s_size) {
|
|
||||||
MG_INFO(("Finishing OTA: fail"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
s_size = 0;
|
|
||||||
esp_err_t err = esp_ota_end(update_handle);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
MG_ERROR(("esp_ota_end failed (%s)!", esp_err_to_name(err)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
err = esp_ota_set_boot_partition(update_partition);
|
|
||||||
if (err != ESP_OK) {
|
|
||||||
MG_ERROR(("esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mg_ota_commit(void) {
|
|
||||||
esp_ota_mark_app_valid_cancel_rollback();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mg_ota_rollback(void) {
|
|
||||||
if(esp_ota_check_rollback_is_possible()) {
|
|
||||||
esp_ota_mark_app_invalid_rollback_and_reboot();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
MG_ERROR(("Rollback NOT possible"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mg_ota_status(int fw) {
|
|
||||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
|
||||||
if (NULL == p) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int status = MG_OTA_UNAVAILABLE;
|
|
||||||
|
|
||||||
esp_ota_img_states_t img_state = ESP_OTA_IMG_UNDEFINED;
|
|
||||||
esp_err_t res = esp_ota_get_state_partition(p, &img_state);
|
|
||||||
if (ESP_OK == res) {
|
|
||||||
if (ESP_OTA_IMG_VALID == img_state) {
|
|
||||||
status = MG_OTA_COMMITTED;
|
|
||||||
} else if (ESP_OTA_IMG_UNDEFINED == img_state) {
|
|
||||||
status = MG_OTA_UNCOMMITTED;
|
|
||||||
} else if (ESP_OTA_IMG_INVALID == img_state) {
|
|
||||||
status = MG_OTA_UNAVAILABLE;
|
|
||||||
} else if (ESP_OTA_IMG_ABORTED == img_state) {
|
|
||||||
status = MG_OTA_UNAVAILABLE;
|
|
||||||
} else if (ESP_OTA_IMG_NEW == img_state) {
|
|
||||||
status = MG_OTA_FIRST_BOOT;
|
|
||||||
} else if (ESP_OTA_IMG_PENDING_VERIFY == img_state) {
|
|
||||||
status = MG_OTA_UNCOMMITTED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t mg_ota_crc32(int fw) {
|
|
||||||
(void) fw;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t mg_ota_timestamp(int fw) {
|
|
||||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
|
||||||
|
|
||||||
esp_app_desc_t app;
|
|
||||||
esp_err_t res = esp_ota_get_partition_description(p, &app);
|
|
||||||
if (ESP_OK != res)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct tm datetime = {};
|
|
||||||
if (NULL == strptime(app.date, "%b %d %Y", &datetime))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (NULL == strptime(app.time, "%H:%M:%S", &datetime))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return mktime(&datetime);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t mg_ota_size(int fw) {
|
|
||||||
const esp_partition_t *p = get_partition_from_fw(fw);
|
|
||||||
if (NULL == p) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return p->size;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#define MG_ARCH MG_ARCH_ESP32
|
|
||||||
|
|
||||||
#define MG_ENABLE_PACKED_FS 1
|
|
||||||
#define MG_TLS MG_TLS_NONE // change to 'MG_TLS_MBED' to enable TLS
|
|
||||||
#define MG_OTA MG_OTA_CUSTOM
|
|
||||||
#define MG_DEVICE MG_DEVICE_CUSTOM
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
// Code taken from the ESP32 IDF WiFi station Example
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "esp_event.h"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "esp_system.h"
|
|
||||||
#include "esp_wifi.h"
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/event_groups.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "nvs_flash.h"
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
|
|
||||||
static EventGroupHandle_t s_wifi_event_group;
|
|
||||||
|
|
||||||
/* The event group allows multiple bits for each event, but we only care about
|
|
||||||
* two events:
|
|
||||||
* - we are connected to the AP with an IP
|
|
||||||
* - we failed to connect after the maximum amount of retries */
|
|
||||||
#define WIFI_CONNECTED_BIT BIT0
|
|
||||||
#define WIFI_FAIL_BIT BIT1
|
|
||||||
|
|
||||||
static int s_retry_num = 0;
|
|
||||||
|
|
||||||
static void event_handler(void *arg, esp_event_base_t event_base,
|
|
||||||
int32_t event_id, void *event_data) {
|
|
||||||
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
|
||||||
esp_wifi_connect();
|
|
||||||
} else if (event_base == WIFI_EVENT &&
|
|
||||||
event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
|
||||||
if (s_retry_num < 10) {
|
|
||||||
esp_wifi_connect();
|
|
||||||
s_retry_num++;
|
|
||||||
MG_INFO(("retry to connect to the AP"));
|
|
||||||
} else {
|
|
||||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
|
||||||
}
|
|
||||||
MG_ERROR(("connect to the AP fail"));
|
|
||||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
|
||||||
ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
|
|
||||||
MG_INFO(("IP ADDRESS:" IPSTR, IP2STR(&event->ip_info.ip)));
|
|
||||||
s_retry_num = 0;
|
|
||||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wifi_init(const char *ssid, const char *pass) {
|
|
||||||
esp_err_t ret = nvs_flash_init();
|
|
||||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
|
|
||||||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
|
||||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
|
||||||
ret = nvs_flash_init();
|
|
||||||
}
|
|
||||||
ESP_ERROR_CHECK(ret);
|
|
||||||
|
|
||||||
s_wifi_event_group = xEventGroupCreate();
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_netif_init());
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
|
||||||
esp_netif_create_default_wifi_sta();
|
|
||||||
|
|
||||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
|
||||||
|
|
||||||
esp_event_handler_instance_t instance_any_id;
|
|
||||||
esp_event_handler_instance_t instance_got_ip;
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
|
||||||
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
|
||||||
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));
|
|
||||||
|
|
||||||
wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},
|
|
||||||
.pmf_cfg = {.capable = true, .required = false}}};
|
|
||||||
snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), "%s", ssid);
|
|
||||||
snprintf((char *) c.sta.password, sizeof(c.sta.password), "%s", pass);
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &c));
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_start());
|
|
||||||
MG_DEBUG(("wifi_init_sta finished."));
|
|
||||||
|
|
||||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
|
||||||
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
|
||||||
pdFALSE, pdFALSE, portMAX_DELAY);
|
|
||||||
|
|
||||||
if (bits & WIFI_CONNECTED_BIT) {
|
|
||||||
MG_INFO(("connected to ap SSID:%s password:%s", ssid, pass));
|
|
||||||
} else if (bits & WIFI_FAIL_BIT) {
|
|
||||||
MG_ERROR(("Failed to connect to SSID:%s, password:%s", ssid, pass));
|
|
||||||
} else {
|
|
||||||
MG_ERROR(("UNEXPECTED EVENT"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The event will not be processed after unregister */
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
|
||||||
IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
|
||||||
WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
|
|
||||||
vEventGroupDelete(s_wifi_event_group);
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Mongoose as a MicroPython user module on the ESP32
|
|
||||||
|
|
||||||
The most basic usage is:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import network
|
|
||||||
import mongoose
|
|
||||||
|
|
||||||
sta_if = network.WLAN(network.STA_IF)
|
|
||||||
sta_if.active(True)
|
|
||||||
sta_if.connect("<SSID>", "<PASSWORD>")
|
|
||||||
while not sta_if.isconnected():
|
|
||||||
pass
|
|
||||||
|
|
||||||
mongoose.init()
|
|
||||||
while True:
|
|
||||||
mongoose.poll(1000)
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Check [_thread](https://docs.micropython.org/en/latest/library/_thread.html) support for more advanced usage
|
|
||||||
|
|
||||||
https://docs.micropython.org/en/latest/develop/cmodules.html
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../micropython/mongoose/micropython.cmake
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../micropython/mongoose/micropython.mk
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../micropython/mongoose/module.c
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
CWD = $(realpath $(CURDIR))
|
|
||||||
MNT = $(realpath $(CURDIR)/../../..)
|
|
||||||
PORT ?= /dev/ttyUSB0
|
|
||||||
CMD ?= build
|
|
||||||
|
|
||||||
all: example
|
|
||||||
|
|
||||||
example:
|
|
||||||
true
|
|
||||||
|
|
||||||
build: Makefile $(wildcard main/*)
|
|
||||||
docker run --rm $(DA) -v $(MNT):$(MNT) -w $(CWD) espressif/idf idf.py $(CMD)
|
|
||||||
|
|
||||||
flash:
|
|
||||||
flash: CMD = flash
|
|
||||||
flash: DA = --device $(PORT)
|
|
||||||
flash: build
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
|
|
||||||
bridge.hex: build
|
|
||||||
esputil mkhex \
|
|
||||||
0x8000 build/partition_table/partition-table.bin \
|
|
||||||
0x1000 build/bootloader/bootloader.bin \
|
|
||||||
0x100000 build/mongoose-esp32-example.bin > $@
|
|
||||||
|
|
||||||
flash2: bridge.hex
|
|
||||||
esputil -p $(PORT) -b 921600 -fp 0x220 flash bridge.hex
|
|
||||||
esputil -p $(PORT) monitor
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf build
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
// Copyright (c) 2020 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
const char *s_listening_url = "http://0.0.0.0:80";
|
|
||||||
|
|
||||||
struct mg_str config_read(void) {
|
|
||||||
return mg_file_read(&mg_fs_posix, FS_ROOT "/config.json");
|
|
||||||
}
|
|
||||||
|
|
||||||
void config_write(struct mg_str config) {
|
|
||||||
mg_file_write(&mg_fs_posix, FS_ROOT "/config.json", config.buf, config.len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void app_main(void) {
|
|
||||||
// Mount filesystem
|
|
||||||
esp_vfs_spiffs_conf_t conf = {
|
|
||||||
.base_path = FS_ROOT, .max_files = 20, .format_if_mount_failed = true};
|
|
||||||
int res = esp_vfs_spiffs_register(&conf);
|
|
||||||
MG_INFO(("FS at %s initialised, status: %d", conf.base_path, res));
|
|
||||||
|
|
||||||
// Try to connect to wifi by using saved WiFi credentials
|
|
||||||
struct mg_str json = mg_file_read(&mg_fs_posix, WIFI_FILE);
|
|
||||||
if (json.buf != NULL) {
|
|
||||||
char *ssid = mg_json_get_str(json, "$.ssid");
|
|
||||||
char *pass = mg_json_get_str(json, "$.pass");
|
|
||||||
while (!wifi_init(ssid, pass)) (void) 0;
|
|
||||||
free(ssid);
|
|
||||||
free(pass);
|
|
||||||
free((void *) json.buf);
|
|
||||||
} else {
|
|
||||||
// If WiFi is not configured, run CLI until configured
|
|
||||||
MG_INFO(("WiFi is not configured, running CLI. Press enter"));
|
|
||||||
cli_init();
|
|
||||||
for (;;) {
|
|
||||||
uint8_t ch = getchar();
|
|
||||||
cli(ch);
|
|
||||||
usleep(10000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connected to WiFi, now start HTTP server
|
|
||||||
struct mg_mgr mgr;
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
||||||
MG_INFO(("Mongoose v%s on %s", MG_VERSION, s_listening_url));
|
|
||||||
mg_http_listen(&mgr, s_listening_url, uart_bridge_fn, NULL);
|
|
||||||
for (;;) mg_mgr_poll(&mgr, 10); // Infinite event loop
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../uart-bridge/net.c
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../uart-bridge/packed_fs.c
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
// Code taken from the ESP32 IDF WiFi station Example
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "esp_event.h"
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "esp_system.h"
|
|
||||||
#include "esp_wifi.h"
|
|
||||||
#include "freertos/FreeRTOS.h"
|
|
||||||
#include "freertos/event_groups.h"
|
|
||||||
#include "freertos/task.h"
|
|
||||||
#include "nvs_flash.h"
|
|
||||||
|
|
||||||
#include "lwip/err.h"
|
|
||||||
#include "lwip/sys.h"
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
|
|
||||||
static EventGroupHandle_t s_wifi_event_group;
|
|
||||||
|
|
||||||
/* The event group allows multiple bits for each event, but we only care about
|
|
||||||
* two events:
|
|
||||||
* - we are connected to the AP with an IP
|
|
||||||
* - we failed to connect after the maximum amount of retries */
|
|
||||||
#define WIFI_CONNECTED_BIT BIT0
|
|
||||||
#define WIFI_FAIL_BIT BIT1
|
|
||||||
|
|
||||||
static int s_retry_num = 0;
|
|
||||||
|
|
||||||
static void event_handler(void *arg, esp_event_base_t event_base,
|
|
||||||
int32_t event_id, void *event_data) {
|
|
||||||
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
|
|
||||||
esp_wifi_connect();
|
|
||||||
} else if (event_base == WIFI_EVENT &&
|
|
||||||
event_id == WIFI_EVENT_STA_DISCONNECTED) {
|
|
||||||
if (s_retry_num < 3) {
|
|
||||||
esp_wifi_connect();
|
|
||||||
s_retry_num++;
|
|
||||||
MG_INFO(("retry to connect to the AP"));
|
|
||||||
} else {
|
|
||||||
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
|
|
||||||
}
|
|
||||||
MG_ERROR(("connect to the AP fail"));
|
|
||||||
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
|
|
||||||
ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;
|
|
||||||
MG_INFO(("IP ADDRESS: " IPSTR ". Go to:", IP2STR(&event->ip_info.ip)));
|
|
||||||
MG_INFO(("http://" IPSTR, IP2STR(&event->ip_info.ip)));
|
|
||||||
s_retry_num = 0;
|
|
||||||
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wifi_init(const char *ssid, const char *pass) {
|
|
||||||
bool result = false;
|
|
||||||
esp_err_t ret = nvs_flash_init();
|
|
||||||
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
|
|
||||||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
|
||||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
|
||||||
ret = nvs_flash_init();
|
|
||||||
}
|
|
||||||
ESP_ERROR_CHECK(ret);
|
|
||||||
|
|
||||||
s_wifi_event_group = xEventGroupCreate();
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_netif_init());
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
|
||||||
esp_netif_create_default_wifi_sta();
|
|
||||||
|
|
||||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
|
||||||
|
|
||||||
esp_event_handler_instance_t instance_any_id;
|
|
||||||
esp_event_handler_instance_t instance_got_ip;
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
|
||||||
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
|
||||||
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));
|
|
||||||
|
|
||||||
wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},
|
|
||||||
.pmf_cfg = {.capable = true, .required = false}}};
|
|
||||||
snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), "%s", ssid);
|
|
||||||
snprintf((char *) c.sta.password, sizeof(c.sta.password), "%s", pass);
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &c));
|
|
||||||
ESP_ERROR_CHECK(esp_wifi_start());
|
|
||||||
MG_DEBUG(("wifi_init_sta finished."));
|
|
||||||
|
|
||||||
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
|
|
||||||
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
|
|
||||||
pdFALSE, pdFALSE, portMAX_DELAY);
|
|
||||||
|
|
||||||
if (bits & WIFI_CONNECTED_BIT) {
|
|
||||||
MG_INFO(("connected to ap SSID:%s", ssid));
|
|
||||||
result = true;
|
|
||||||
} else if (bits & WIFI_FAIL_BIT) {
|
|
||||||
MG_ERROR(("Failed to connect to SSID:%s, password:%s", ssid, pass));
|
|
||||||
} else {
|
|
||||||
MG_ERROR(("UNEXPECTED EVENT"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The event will not be processed after unregister */
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
|
||||||
IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
|
|
||||||
WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
|
|
||||||
vEventGroupDelete(s_wifi_event_group);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
THISDIR = $(realpath $(CURDIR))
|
|
||||||
ROOTDIR = $(realpath $(CURDIR)/../../..)
|
|
||||||
DOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) docker.io/mdashnet/8266
|
|
||||||
CMD ?= make -C src defconfig app
|
|
||||||
PORT ?= /dev/ttyUSB0
|
|
||||||
|
|
||||||
all: example
|
|
||||||
|
|
||||||
example:
|
|
||||||
true
|
|
||||||
|
|
||||||
build: Makefile $(wildcard src/main/*)
|
|
||||||
$(DOCKER) $(CMD)
|
|
||||||
|
|
||||||
flash:
|
|
||||||
flash: CMD = python /esp/components/esptool_py/esptool/esptool.py \
|
|
||||||
--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \
|
|
||||||
--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \
|
|
||||||
--flash_size 2MB 0x10000 $(THISDIR)/src/build/mongoose-example.bin
|
|
||||||
flash: DA = --device $(PORT)
|
|
||||||
flash: build
|
|
||||||
|
|
||||||
buildall:
|
|
||||||
buildall: CMD = make -C src all
|
|
||||||
buildall: build
|
|
||||||
|
|
||||||
flashall:
|
|
||||||
flashall: CMD = python /esp/components/esptool_py/esptool/esptool.py \
|
|
||||||
--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \
|
|
||||||
--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \
|
|
||||||
--flash_size 2MB 0x0 $(THISDIR)/src/build/bootloader/bootloader.bin \
|
|
||||||
0x10000 $(THISDIR)/src/build/mongoose-example.bin \
|
|
||||||
0x8000 $(THISDIR)/src/build/partitions_singleapp.bin
|
|
||||||
flashall: DA = --device $(PORT)
|
|
||||||
flashall: build
|
|
||||||
|
|
||||||
monitor:
|
|
||||||
monitor: CMD = /esp/tools/idf_monitor.py --port $(PORT) $(THISDIR)/src/build/mongoose-example.elf
|
|
||||||
monitor: build
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
|
|
||||||
clean:
|
|
||||||
test -d src/build && $(DOCKER) rm -rf src/build || true
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.c
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.h
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
NAME ?= $(notdir $(CURDIR))
|
|
||||||
|
|
||||||
build:
|
|
||||||
git clone --depth 1 https://github.com/mongoose-examples/$(NAME)
|
|
||||||
cp ./../../../mongoose.[ch] $(NAME)
|
|
||||||
make -C $(NAME) build
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(NAME)
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
CFLAGS = -W -Wall -Werror -Wextra -Wundef -Wshadow -Wdouble-promotion
|
|
||||||
CFLAGS += -Wformat-truncation -fno-common # -Wconversion is not SDK-friendly
|
|
||||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
|
||||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include -Icmsis_xmc7/devices/COMPONENT_CAT1C/include/
|
|
||||||
CFLAGS += -Icmsis_xmc7/devices/COMPONENT_CAT1C/include/ip/
|
|
||||||
CFLAGS += -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-d16 $(CFLAGS_EXTRA)
|
|
||||||
LDSCRIPT = link.ld
|
|
||||||
LDFLAGS ?= -T$(LDSCRIPT) -nostdlib -nostartfiles --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
|
||||||
|
|
||||||
SOURCES = main.c hal.c startup.c
|
|
||||||
CFLAGS += -D__ATOLLIC__ -D__STARTUP_CLEAR_BSS # Make startup code work as expected
|
|
||||||
|
|
||||||
# Mongoose options are defined in mongoose_custom.h
|
|
||||||
SOURCES += mongoose.c net.c packed_fs.c
|
|
||||||
|
|
||||||
# Example specific build options. See README.md
|
|
||||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\" -DHTTPS_URL=\"https://0.0.0.0/\"
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
RM = cmd /C del /Q /F /S
|
|
||||||
else
|
|
||||||
RM = rm -rf
|
|
||||||
endif
|
|
||||||
|
|
||||||
all build example: firmware.bin
|
|
||||||
|
|
||||||
firmware.bin: firmware.elf
|
|
||||||
arm-none-eabi-objcopy -O binary $< $@
|
|
||||||
|
|
||||||
firmware.elf: cmsis_core cmsis_xmc7 $(SOURCES) hal.h link.ld Makefile
|
|
||||||
arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@
|
|
||||||
arm-none-eabi-size $@
|
|
||||||
|
|
||||||
cmsis_core: # ARM CMSIS core headers
|
|
||||||
git clone -q --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
|
||||||
cmsis_xmc7:
|
|
||||||
git clone https://github.com/Infineon/mtb-pdl-cat1.git $@
|
|
||||||
echo "" > cmsis_xmc7/devices/COMPONENT_CAT1C/include/ip/system_cat1c.h
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) firmware.* *.su cmsis_core cmsis_xmc7 *.zip
|
|
||||||
@@ -1,146 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
|
||||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
|
||||||
s_ticks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mg_random(void *buf, size_t len) { // Use on-board RNG
|
|
||||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
|
||||||
uint32_t r = rng_read();
|
|
||||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
|
||||||
return s_ticks; // Return number of milliseconds since boot
|
|
||||||
}
|
|
||||||
|
|
||||||
void hal_init(void) {
|
|
||||||
clock_init(); // Set system clock to SYS_FREQUENCY
|
|
||||||
SystemCoreClock = SYS_FREQUENCY; // Update SystemCoreClock global var
|
|
||||||
SysTick_Config(SystemCoreClock / 1000); // Sys tick every 1ms
|
|
||||||
rng_init(); // Initialise random number generator
|
|
||||||
|
|
||||||
uart_init(UART_DEBUG, 115200); // Initialise UART
|
|
||||||
gpio_output(LED1); // Initialise LED1
|
|
||||||
gpio_output(LED2); // Initialise LED2
|
|
||||||
gpio_output(LED3); // Initialise LED3
|
|
||||||
ethernet_init(); // Initialise Ethernet pins
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__ARMCC_VERSION)
|
|
||||||
// Keil specific - implement IO printf redirection
|
|
||||||
int fputc(int c, FILE *stream) {
|
|
||||||
if (stream == stdout || stream == stderr) uart_write_byte(UART_DEBUG, c);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
// ARM GCC specific. ARM GCC is shipped with Newlib C library.
|
|
||||||
// Implement newlib syscalls:
|
|
||||||
// _sbrk() for malloc
|
|
||||||
// _write() for printf redirection
|
|
||||||
// the rest are just stubs
|
|
||||||
#include <sys/stat.h> // For _fstat()
|
|
||||||
|
|
||||||
uint32_t SystemCoreClock;
|
|
||||||
void SystemInit(void) { // Called automatically by startup code
|
|
||||||
}
|
|
||||||
|
|
||||||
int _fstat(int fd, struct stat *st) {
|
|
||||||
(void) fd, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern unsigned char _end[]; // End of data section, start of heap. See link.ld
|
|
||||||
static unsigned char *s_current_heap_end = _end;
|
|
||||||
|
|
||||||
size_t hal_ram_used(void) {
|
|
||||||
return (size_t) (s_current_heap_end - _end);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t hal_ram_free(void) {
|
|
||||||
unsigned char endofstack;
|
|
||||||
return (size_t) (&endofstack - s_current_heap_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *_sbrk(int incr) {
|
|
||||||
unsigned char *prev_heap;
|
|
||||||
unsigned char *heap_end = (unsigned char *) ((size_t) &heap_end - 256);
|
|
||||||
prev_heap = s_current_heap_end;
|
|
||||||
// Check how much space we got from the heap end to the stack end
|
|
||||||
if (s_current_heap_end + incr > heap_end) return (void *) -1;
|
|
||||||
s_current_heap_end += incr;
|
|
||||||
return prev_heap;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _open(const char *path) {
|
|
||||||
(void) path;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _close(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _isatty(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _lseek(int fd, int ptr, int dir) {
|
|
||||||
(void) fd, (void) ptr, (void) dir;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _exit(int status) {
|
|
||||||
(void) status;
|
|
||||||
for (;;) asm volatile("BKPT #0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void _kill(int pid, int sig) {
|
|
||||||
(void) pid, (void) sig;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _getpid(void) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _write(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _read(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _link(const char *a, const char *b) {
|
|
||||||
(void) a, (void) b;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _unlink(const char *a) {
|
|
||||||
(void) a;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _stat(const char *path, struct stat *st) {
|
|
||||||
(void) path, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mkdir(const char *path, mode_t mode) {
|
|
||||||
(void) path, (void) mode;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _init(void) {
|
|
||||||
}
|
|
||||||
#endif // __GNUC__
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LED1 PIN(16, 1)
|
|
||||||
#define LED2 PIN(16, 2)
|
|
||||||
#define LED3 PIN(16, 3)
|
|
||||||
|
|
||||||
#include "xmc7200d_e272k8384.h"
|
|
||||||
|
|
||||||
#define BIT(x) (1UL << (x))
|
|
||||||
#define CLRSET(reg, clear, set) ((reg) = ((reg) & ~(clear)) | (set))
|
|
||||||
#define PIN(bank, num) ((bank << 8) | (num))
|
|
||||||
#define PINNO(pin) (pin & 255)
|
|
||||||
#define PINBANK(pin) (pin >> 8)
|
|
||||||
|
|
||||||
void hal_init(void);
|
|
||||||
size_t hal_ram_free(void);
|
|
||||||
size_t hal_ram_used(void);
|
|
||||||
|
|
||||||
static inline void spin(volatile uint32_t count) {
|
|
||||||
while (count--) (void) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern uint32_t SystemCoreClock;
|
|
||||||
|
|
||||||
enum {PLL_FEEDBACK = 50, PLL_REF = 1, PLL_OUT = 4};
|
|
||||||
#define CLK_IMO 8000000UL
|
|
||||||
#define SYS_FREQUENCY ((CLK_IMO * PLL_FEEDBACK) / (PLL_REF * PLL_OUT))
|
|
||||||
|
|
||||||
#ifndef UART_DEBUG
|
|
||||||
#define UART_DEBUG SCB3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG };
|
|
||||||
enum { GPIO_HIGHZ = 0, GPIO_PULLUP = 2, GPIO_PULLDOWN = 3, GPIO_OPENDRAIN_LOW = 4,
|
|
||||||
GPIO_OPENDRAIN_HIGH = 5, GPIO_STRONG = 6, GPIO_PULLUP_DOWN = 7};
|
|
||||||
enum { GPIO_SPEED_LOW = 3, GPIO_SPEED_MEDIUM = 2, GPIO_SPEED_HIGH = 0};
|
|
||||||
#undef GPIO
|
|
||||||
#define GPIO_TypeDef GPIO_PRT_Type
|
|
||||||
#define GPIO(N) ((GPIO_TypeDef *) (GPIO_BASE + 0x80 * (N)))
|
|
||||||
|
|
||||||
static GPIO_TypeDef *gpio_bank(uint16_t pin) { return GPIO(PINBANK(pin)); }
|
|
||||||
|
|
||||||
static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,
|
|
||||||
uint8_t speed, uint8_t pull, uint8_t af) {
|
|
||||||
(void) pin, (void) mode, (void) type, (void) speed, (void) pull, (void) af;
|
|
||||||
GPIO_TypeDef *gpio = gpio_bank(pin);
|
|
||||||
uint8_t pinno = PINNO(pin);
|
|
||||||
uint32_t msk, pos;
|
|
||||||
|
|
||||||
// configure input / output direction
|
|
||||||
if (mode == GPIO_MODE_INPUT) {
|
|
||||||
gpio->CFG |= 1 << (4 * pinno + 3); // enable input buffer (IN_ENx)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (af || (mode == GPIO_MODE_AF && af)) {
|
|
||||||
// configure alternate function
|
|
||||||
HSIOM_PRT_Type* hsiom = ((HSIOM_PRT_Type*) HSIOM) + PINBANK(pin);
|
|
||||||
volatile uint32_t *port_sel = pinno < 4 ? &hsiom->PORT_SEL0 : &hsiom->PORT_SEL1;
|
|
||||||
pos = 8 * (pinno % 4), msk = 0x1f << pos;
|
|
||||||
*port_sel &= ~msk, *port_sel |= af << pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
// configure driver mode
|
|
||||||
msk = 7, pos = 4 * pinno;
|
|
||||||
CLRSET(gpio->CFG, msk << pos, type << pos);
|
|
||||||
|
|
||||||
// configure speed
|
|
||||||
msk = 3, pos = 2 * pinno + 16;
|
|
||||||
CLRSET(gpio->CFG_OUT, msk << pos, speed << pos);
|
|
||||||
|
|
||||||
if (mode == GPIO_MODE_OUTPUT /*&& af == 0*/) {
|
|
||||||
gpio->OUT_SET = (1 << pinno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_input(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_output(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_MEDIUM,
|
|
||||||
0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool gpio_read(uint16_t pin) {
|
|
||||||
GPIO_TypeDef *gpio = gpio_bank(pin);
|
|
||||||
uint8_t pinno = PINNO(pin);
|
|
||||||
if (gpio->CFG & (1 << (4 * pinno + 3))) {
|
|
||||||
// pin mode is input, reading from GPIO_PRT_IN
|
|
||||||
return gpio->IN & (1 << pinno);
|
|
||||||
} else {
|
|
||||||
// pin mode is output, reading from GPIO_PRT_OUT
|
|
||||||
return gpio->OUT & (1 << pinno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_write(uint16_t pin, bool value) {
|
|
||||||
GPIO_TypeDef *gpio = gpio_bank(pin);
|
|
||||||
uint8_t pinno = PINNO(pin);
|
|
||||||
if (value) {
|
|
||||||
gpio->OUT_SET = 1 << pinno;
|
|
||||||
} else {
|
|
||||||
gpio->OUT_CLR = 1 << pinno;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_toggle(uint16_t pin) {
|
|
||||||
gpio_write(pin, !gpio_read(pin));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uart_init(volatile CySCB_Type *uart, unsigned long baud) {
|
|
||||||
(void) uart, (void) baud;
|
|
||||||
uint16_t rx = 0, tx = 0;
|
|
||||||
if (uart == SCB3) {
|
|
||||||
rx = PIN(13, 0), tx = PIN(13, 1);
|
|
||||||
} else {
|
|
||||||
return; // unsupported uart
|
|
||||||
}
|
|
||||||
|
|
||||||
// set pins
|
|
||||||
gpio_init(rx, GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 17);
|
|
||||||
gpio_init(tx, GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 17);
|
|
||||||
|
|
||||||
// enable peripheral clock (18.6.2)
|
|
||||||
// compute divider first (we choose 24 bit divider 0)
|
|
||||||
unsigned long div = 0, frac = 0, ovs = 16;
|
|
||||||
div = SYS_FREQUENCY / (baud * ovs);
|
|
||||||
if (div == 0) div = 1;
|
|
||||||
frac = SYS_FREQUENCY % (baud * ovs);
|
|
||||||
frac = (frac * 100) / (baud * ovs);
|
|
||||||
PERI_PCLK->GR[1].DIV_CMD = (3 << PERI_PCLK_GR_DIV_CMD_TYPE_SEL_Pos) |
|
|
||||||
PERI_PCLK_GR_DIV_CMD_PA_DIV_SEL_Msk |
|
|
||||||
PERI_PCLK_GR_DIV_CMD_PA_TYPE_SEL_Msk;
|
|
||||||
PERI_PCLK->GR[1].DIV_CMD |= PERI_PCLK_GR_DIV_CMD_DISABLE_Msk; // disable divider
|
|
||||||
PERI_PCLK->GR[1].DIV_24_5_CTL[0] = (((uint8_t) (div - 1)) << PERI_PCLK_GR_DIV_24_5_CTL_INT24_DIV_Pos) |
|
|
||||||
(frac << PERI_PCLK_GR_DIV_24_5_CTL_FRAC5_DIV_Pos);
|
|
||||||
PERI_PCLK->GR[1].DIV_CMD = (3 << PERI_PCLK_GR_DIV_CMD_TYPE_SEL_Pos) |
|
|
||||||
PERI_PCLK_GR_DIV_CMD_PA_DIV_SEL_Msk |
|
|
||||||
PERI_PCLK_GR_DIV_CMD_PA_TYPE_SEL_Msk;;
|
|
||||||
PERI_PCLK->GR[1].DIV_CMD |= PERI_PCLK_GR_DIV_CMD_ENABLE_Msk; // enable divider
|
|
||||||
PERI_PCLK->GR[1].CLOCK_CTL[PCLK_SCB3_CLOCK & 0xff] = 3 << PERI_PCLK_GR_CLOCK_CTL_TYPE_SEL_Pos; // connect SCB3 to div_24_5_ctl[0]
|
|
||||||
|
|
||||||
// configure UART interface
|
|
||||||
uart->CTRL = ((ovs - 1) << SCB_CTRL_OVS_Pos) | (2 << SCB_CTRL_MODE_Pos);
|
|
||||||
uart->UART_CTRL = 0;
|
|
||||||
uart->UART_RX_CTRL = 1 << SCB_UART_RX_CTRL_STOP_BITS_Pos;
|
|
||||||
uart->RX_CTRL = 7 << SCB_RX_CTRL_DATA_WIDTH_Pos;
|
|
||||||
uart->UART_TX_CTRL = 1 << SCB_UART_TX_CTRL_STOP_BITS_Pos;
|
|
||||||
uart->TX_CTRL = 7 << SCB_TX_CTRL_DATA_WIDTH_Pos;
|
|
||||||
uart->TX_FIFO_CTRL = 1 << 16;
|
|
||||||
uart->TX_FIFO_CTRL = 0;
|
|
||||||
uart->CTRL |= 1 << SCB_CTRL_ENABLED_Pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uart_write_byte(volatile CySCB_Type *uart, uint8_t byte) {
|
|
||||||
(void) byte; (void) uart;
|
|
||||||
while((uart->INTR_TX & SCB_INTR_TX_EMPTY_Msk) == 0) spin(1);
|
|
||||||
uart->TX_FIFO_WR = byte;
|
|
||||||
uart->INTR_TX |= ~SCB_INTR_TX_EMPTY_Msk;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uart_write_buf(volatile CySCB_Type *uart, char *buf, size_t len) {
|
|
||||||
while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void rng_init(void) {
|
|
||||||
}
|
|
||||||
static inline uint32_t rng_read(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void ethernet_init(void) {
|
|
||||||
gpio_init(PIN(26, 0), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_REF_CLK
|
|
||||||
gpio_init(PIN(26, 1), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TX_CTL
|
|
||||||
gpio_init(PIN(26, 2), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TX_CLK
|
|
||||||
gpio_init(PIN(26, 3), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TXD_0
|
|
||||||
gpio_init(PIN(26, 4), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TXD_1
|
|
||||||
gpio_init(PIN(26, 5), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TXD_2
|
|
||||||
gpio_init(PIN(26, 6), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_HIGH, 0, 27); // ETH1_TXD_3
|
|
||||||
gpio_init(PIN(26, 7), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RXD_0
|
|
||||||
|
|
||||||
gpio_init(PIN(27, 0), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RXD_1
|
|
||||||
gpio_init(PIN(27, 1), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RXD_2
|
|
||||||
gpio_init(PIN(27, 2), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RXD_3
|
|
||||||
gpio_init(PIN(27, 3), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RX_CTL
|
|
||||||
gpio_init(PIN(27, 4), GPIO_MODE_INPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 27); // ETH1_RX_CLK
|
|
||||||
gpio_init(PIN(27, 5), GPIO_MODE_INPUT, GPIO_STRONG, GPIO_SPEED_LOW, 0, 27); // ETH1_MDIO
|
|
||||||
gpio_init(PIN(27, 6), GPIO_MODE_OUTPUT, GPIO_STRONG, GPIO_SPEED_LOW, 0, 27); // ETH1_MDC
|
|
||||||
//gpio_init(PIN(27, 7), GPIO_MODE_OUTPUT, GPIO_HIGHZ, GPIO_SPEED_HIGH, 0, 0); // ETH1_RST
|
|
||||||
|
|
||||||
CPUSS->CM7_0_SYSTEM_INT_CTL[eth_1_interrupt_eth_0_IRQn] = 0x80000003; // assign CPU interrupt #3
|
|
||||||
NVIC->ISER[0] = 1 << 3;
|
|
||||||
|
|
||||||
spin(10000000); // artificial delay to wait for PHY init
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void clock_init(void) {
|
|
||||||
SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); // Enable FPU
|
|
||||||
asm("DSB");
|
|
||||||
asm("ISB");
|
|
||||||
|
|
||||||
// configure PLL
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG, CLK_PLL400M_CONFIG_BYPASS_SEL_Msk, BIT(29)); // First bypass PLL
|
|
||||||
spin(10);
|
|
||||||
SRSS->CLK_PLL400M[0].CONFIG &= ~CLK_PLL400M_CONFIG_ENABLE_Msk; // disable the PLL itself
|
|
||||||
|
|
||||||
// IMO source generates a frequency of 8MHz. The final frequency will be
|
|
||||||
// calculated as (CLK_IMO * feedback) / (reference * output_div)
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG, CLK_PLL400M_CONFIG_FEEDBACK_DIV_Msk, PLL_FEEDBACK << CLK_PLL400M_CONFIG_FEEDBACK_DIV_Pos);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG, CLK_PLL400M_CONFIG_REFERENCE_DIV_Msk, PLL_REF << CLK_PLL400M_CONFIG_REFERENCE_DIV_Pos);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG, CLK_PLL400M_CONFIG_OUTPUT_DIV_Msk, PLL_OUT << CLK_PLL400M_CONFIG_OUTPUT_DIV_Pos);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG2, CLK_PLL400M_CONFIG2_FRAC_DIV_Msk, 0);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG2, CLK_PLL400M_CONFIG2_FRAC_DITHER_EN_Msk, 0);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG2, CLK_PLL400M_CONFIG2_FRAC_EN_Msk, 1 << CLK_PLL400M_CONFIG2_FRAC_EN_Pos);
|
|
||||||
CLRSET(SRSS->CLK_PLL400M[0].CONFIG, CLK_PLL400M_CONFIG_BYPASS_SEL_Msk, 0);
|
|
||||||
spin(10);
|
|
||||||
SRSS->CLK_PLL400M[0].CONFIG |= CLK_PLL400M_CONFIG_ENABLE_Msk; // enable the PLL
|
|
||||||
while (SRSS->CLK_PLL400M[0].CONFIG & 1) spin(1);
|
|
||||||
|
|
||||||
// configure PATH1 with source set to IMO
|
|
||||||
SRSS->CLK_PATH_SELECT[1] = 0;
|
|
||||||
|
|
||||||
// enable CLK_HFx
|
|
||||||
uint8_t clocks[] = {0, 1, 2, 3, 4, 5, 6};
|
|
||||||
for (size_t i = 0; i < sizeof(clocks) / sizeof(uint8_t); i++) {
|
|
||||||
CLRSET(SRSS->CLK_ROOT_SELECT[clocks[i]], SRSS_CLK_ROOT_SELECT_ROOT_MUX_Msk, 1); // choose PATH1
|
|
||||||
CLRSET(SRSS->CLK_ROOT_SELECT[clocks[i]], SRSS_CLK_ROOT_SELECT_DIRECT_MUX_Msk, 1 << SRSS_CLK_ROOT_SELECT_DIRECT_MUX_Pos);
|
|
||||||
if (clocks[i] != 0) // CLF_HF0 is already enabled
|
|
||||||
SRSS->CLK_ROOT_SELECT[clocks[i]] |= SRSS_CLK_ROOT_SELECT_ENABLE_Msk; // enable clock root
|
|
||||||
}
|
|
||||||
|
|
||||||
// set systick frequency
|
|
||||||
uint32_t tenms = SYS_FREQUENCY / 100 - 1; // number of cycles executed in 10ms
|
|
||||||
CPUSS->SYSTICK_CTL = tenms | (3 << CPUSS_SYSTICK_CTL_CLOCK_SOURCE_Pos); // select CLK_HF as source
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
OUTPUT_FORMAT("elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(Reset_Handler)
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash(RX) : ORIGIN = 0x10080000, LENGTH = 0x80000
|
|
||||||
sram(!RX) : ORIGIN = 0x28000800, LENGTH = 510K
|
|
||||||
}
|
|
||||||
|
|
||||||
_estack = ORIGIN(sram) + LENGTH(sram);
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.vectors : { . = ALIGN(4); KEEP(*(.vectors)); . = ALIGN(4); } > flash
|
|
||||||
.text : { *(.text*) } > flash
|
|
||||||
.rodata : { *(.rodata*) } > flash
|
|
||||||
|
|
||||||
.data : {
|
|
||||||
_sdata = .;
|
|
||||||
*(.first_data)
|
|
||||||
*(.data SORT(.data.*))
|
|
||||||
_edata = .;
|
|
||||||
} > sram AT > flash
|
|
||||||
_sidata = LOADADDR(.data);
|
|
||||||
|
|
||||||
.bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
_end = .;
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define BLINK_PERIOD_MS 1000
|
|
||||||
|
|
||||||
static void timer_fn(void *arg) {
|
|
||||||
gpio_toggle(LED1); // Blink LED
|
|
||||||
(void) arg; // Unused
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct mg_mgr mgr; // Mongoose event manager
|
|
||||||
|
|
||||||
hal_init(); // Cross-platform hardware init
|
|
||||||
|
|
||||||
mg_mgr_init(&mgr); // Initialise it
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level to debug
|
|
||||||
mg_timer_add(&mgr, BLINK_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mgr);
|
|
||||||
|
|
||||||
MG_INFO(("Initialising application..."));
|
|
||||||
web_init(&mgr);
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
// See https://mongoose.ws/documentation/#build-options
|
|
||||||
#define MG_ARCH MG_ARCH_NEWLIB
|
|
||||||
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
|
||||||
#define MG_ENABLE_DRIVER_XMC7 1
|
|
||||||
#define MG_IO_SIZE 256
|
|
||||||
#define MG_ENABLE_CUSTOM_MILLIS 1
|
|
||||||
#define MG_ENABLE_CUSTOM_RANDOM 1
|
|
||||||
#define MG_ENABLE_PACKED_FS 1
|
|
||||||
|
|
||||||
// For static IP configuration, define MG_TCPIP_{IP,MASK,GW}
|
|
||||||
// By default, those are set to zero, meaning that DHCP is used
|
|
||||||
//
|
|
||||||
// #define MG_TCPIP_IP MG_IPV4(192, 168, 1, 10)
|
|
||||||
// #define MG_TCPIP_GW MG_IPV4(192, 168, 1, 1)
|
|
||||||
// #define MG_TCPIP_MASK MG_IPV4(255, 255, 255, 0)
|
|
||||||
|
|
||||||
// Set custom MAC address. By default, it is randomly generated
|
|
||||||
// Using a build-time constant:
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) do { uint8_t buf_[6] = {2,3,4,5,6,7}; memmove(mac, buf_, sizeof(buf_)); } while (0)
|
|
||||||
//
|
|
||||||
// Using custom function:
|
|
||||||
// extern void my_function(unsigned char *mac);
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) my_function(mac)
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
#include "xmc7200d_e272k8384.h"
|
|
||||||
|
|
||||||
void Reset_Handler(void); // Defined below
|
|
||||||
void Dummy_Handler(void); // Defined below
|
|
||||||
void SysTick_Handler(void); // Defined in main.c
|
|
||||||
void SystemInit(void); // Defined in main.c, called by reset handler
|
|
||||||
void _estack(void); // Defined in link.ld
|
|
||||||
|
|
||||||
#define WEAK_ALIAS __attribute__((weak, alias("Default_Handler")))
|
|
||||||
|
|
||||||
WEAK_ALIAS void NMI_Handler(void);
|
|
||||||
WEAK_ALIAS void HardFault_Handler(void);
|
|
||||||
WEAK_ALIAS void SVCall_Handler(void);
|
|
||||||
WEAK_ALIAS void PendSV_Handler(void);
|
|
||||||
WEAK_ALIAS void SysTick_Handler(void);
|
|
||||||
|
|
||||||
WEAK_ALIAS void Default_Intr_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr0_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr1_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr2_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr4_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr5_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr6_Handler(void);
|
|
||||||
WEAK_ALIAS void CM0P_CpuIntr7_Handler(void);
|
|
||||||
WEAK_ALIAS void ETH_IRQHandler(void);
|
|
||||||
|
|
||||||
void CM0P_CpuIntr3_Handler(void) {
|
|
||||||
ETH_IRQHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
__attribute__((section(".vectors"))) void (*const tab[16 + 16])(void) = {
|
|
||||||
_estack,
|
|
||||||
Reset_Handler,
|
|
||||||
NMI_Handler,
|
|
||||||
HardFault_Handler,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
SVCall_Handler,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
PendSV_Handler,
|
|
||||||
SysTick_Handler,
|
|
||||||
CM0P_CpuIntr0_Handler,
|
|
||||||
CM0P_CpuIntr1_Handler,
|
|
||||||
CM0P_CpuIntr2_Handler,
|
|
||||||
CM0P_CpuIntr3_Handler,
|
|
||||||
CM0P_CpuIntr4_Handler,
|
|
||||||
CM0P_CpuIntr5_Handler,
|
|
||||||
CM0P_CpuIntr6_Handler,
|
|
||||||
CM0P_CpuIntr7_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler,
|
|
||||||
Default_Intr_Handler
|
|
||||||
};
|
|
||||||
|
|
||||||
__attribute__((naked, noreturn)) void Reset_Handler(void) {
|
|
||||||
// Clear BSS section, and copy data section from flash to RAM
|
|
||||||
extern long _sbss, _ebss, _sdata, _edata, _sidata;
|
|
||||||
for (long *src = &_sbss; src < &_ebss; src++) *src = 0;
|
|
||||||
for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++;
|
|
||||||
|
|
||||||
SCB->VTOR = (uint32_t) &tab;
|
|
||||||
SystemInit();
|
|
||||||
|
|
||||||
// Call main()
|
|
||||||
extern void main(void);
|
|
||||||
main();
|
|
||||||
for (;;) (void) 0; // Infinite loop
|
|
||||||
}
|
|
||||||
|
|
||||||
void Default_Handler(void) {
|
|
||||||
for (;;) (void) 0;
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
CFLAGS = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion
|
|
||||||
CFLAGS += -Wformat-truncation -fno-common -Wconversion
|
|
||||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
|
||||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include
|
|
||||||
CFLAGS += -D__SAME54P20A__ -Icmsis_sam/include
|
|
||||||
CFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp
|
|
||||||
LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
|
||||||
|
|
||||||
SOURCES = main.c syscalls.c startup.c
|
|
||||||
|
|
||||||
# Mongoose-specific source code files and build options. See https://mongoose.ws/documentation/#build-options
|
|
||||||
SOURCES += mongoose.c net.c packed_fs.c
|
|
||||||
CFLAGS += -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_NEWLIB -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_LINES=1
|
|
||||||
CFLAGS += -DMG_ENABLE_DRIVER_SAME54=1 -DMG_ENABLE_CUSTOM_RANDOM=1 -DMG_ENABLE_PACKED_FS=1 $(CFLAGS_EXTRA)
|
|
||||||
|
|
||||||
# Example specific build options. See README.md
|
|
||||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\"
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
RM = cmd /C del /Q /F
|
|
||||||
else
|
|
||||||
RM = rm -rf
|
|
||||||
endif
|
|
||||||
|
|
||||||
build: firmware.bin
|
|
||||||
|
|
||||||
firmware.bin: firmware.elf
|
|
||||||
arm-none-eabi-objcopy -O binary $< $@
|
|
||||||
|
|
||||||
firmware.elf: cmsis_core cmsis_sam hal.h link.ld Makefile $(SOURCES)
|
|
||||||
arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
flash: firmware.bin
|
|
||||||
bossac -p /dev/cu.usb* -w -v -b $<
|
|
||||||
|
|
||||||
cmsis_core:
|
|
||||||
git clone --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
|
||||||
cmsis_sam:
|
|
||||||
curl -sL https://packs.download.microchip.com/Microchip.SAME54_DFP.3.9.244.atpack -o $@.zip
|
|
||||||
mkdir $@ && cd $@ && unzip ../$@.zip
|
|
||||||
|
|
||||||
# Automated test via https://vcon.io/automated-firmware-tests/. Set VCON_API_KEY and update DEVICE_URL
|
|
||||||
DEVICE_URL ?= https://dash.vcon.io/api/v3/devices/9
|
|
||||||
update: firmware.bin
|
|
||||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<
|
|
||||||
|
|
||||||
test update: CFLAGS += -DUART_DEBUG=USART1
|
|
||||||
test: update
|
|
||||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt
|
|
||||||
grep 'READY, IP:' /tmp/output.txt # Check for network init
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) firmware.* cmsis_core cmsis_sam *.zip
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited
|
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define BLINK_PERIOD_MS 500 // LED blinking period in millis
|
|
||||||
#define LOG_PERIOD_MS 1000 // Info log period in millis
|
|
||||||
|
|
||||||
void SystemInit(void) { // Called automatically by startup code
|
|
||||||
clock_init();
|
|
||||||
rng_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
|
||||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
|
||||||
s_ticks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
|
||||||
return s_ticks; // Return number of milliseconds since boot
|
|
||||||
}
|
|
||||||
|
|
||||||
void mg_random(void *buf, size_t len) { // Use on-board RNG
|
|
||||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
|
||||||
uint32_t r = rng_read();
|
|
||||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_fn(void *arg) {
|
|
||||||
struct mg_tcpip_if *ifp = arg; // show network stats
|
|
||||||
const char *names[] = {"down", "up", "req", "ready"};
|
|
||||||
MG_INFO(("Ethernet: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u",
|
|
||||||
names[ifp->state], mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent,
|
|
||||||
ifp->ndrop, ifp->nerr));
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
gpio_input(BUTTON_PIN);
|
|
||||||
gpio_output(LED_PIN);
|
|
||||||
uart_init(UART_DEBUG, 115200);
|
|
||||||
ethernet_init();
|
|
||||||
|
|
||||||
MG_INFO(("Starting, CPU freq %g MHz", (double) clock_sys_freq() / 1000000));
|
|
||||||
|
|
||||||
struct mg_mgr mgr; // Initialise
|
|
||||||
mg_mgr_init(&mgr); // Mongoose event manager
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
||||||
|
|
||||||
// Initialise Mongoose network stack
|
|
||||||
struct mg_tcpip_driver_same54_data driver_data = {.mdc_cr = 5};
|
|
||||||
struct mg_tcpip_if mif = {.mac = GENERATE_LOCALLY_ADMINISTERED_MAC()/*{2, 3, 4, 5, 6, 7}*/,
|
|
||||||
// Uncomment below for static configuration:
|
|
||||||
// .ip = mg_htonl(MG_U32(192, 168, 0, 223)),
|
|
||||||
// .mask = mg_htonl(MG_U32(255, 255, 255, 0)),
|
|
||||||
// .gw = mg_htonl(MG_U32(192, 168, 0, 1)),
|
|
||||||
.driver = &mg_tcpip_driver_same54,
|
|
||||||
.driver_data = &driver_data};
|
|
||||||
mg_tcpip_init(&mgr, &mif);
|
|
||||||
mg_timer_add(&mgr, LOG_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mif);
|
|
||||||
|
|
||||||
MG_INFO(("MAC: %M. Waiting for IP...", mg_print_mac, mif.mac));
|
|
||||||
while (mif.state != MG_TCPIP_STATE_READY) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
MG_INFO(("Initialising application..."));
|
|
||||||
web_init(&mgr);
|
|
||||||
|
|
||||||
MG_INFO(("Starting event loop"));
|
|
||||||
for (;;) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
CFLAGS = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion
|
|
||||||
CFLAGS += -Wformat-truncation -fno-common -Wconversion
|
|
||||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
|
||||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include
|
|
||||||
CFLAGS += -D__SAME54P20A__ -Icmsis_sam/include
|
|
||||||
CFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp
|
|
||||||
LDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
|
||||||
|
|
||||||
SOURCES = main.c syscalls.c startup.c
|
|
||||||
|
|
||||||
# Mongoose-specific source code files and build options. See https://mongoose.ws/documentation/#build-options
|
|
||||||
SOURCES += mongoose.c
|
|
||||||
CFLAGS += -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_NEWLIB -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_LINES=1
|
|
||||||
CFLAGS += -DMG_ENABLE_DRIVER_SAME54=1 -DMG_ENABLE_CUSTOM_RANDOM=1 -DMG_ENABLE_PACKED_FS=1 $(CFLAGS_EXTRA)
|
|
||||||
|
|
||||||
# Example specific build options. See README.md
|
|
||||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\"
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
RM = cmd /C del /Q /F
|
|
||||||
else
|
|
||||||
RM = rm -rf
|
|
||||||
endif
|
|
||||||
|
|
||||||
build: firmware.bin
|
|
||||||
|
|
||||||
firmware.bin: firmware.elf
|
|
||||||
arm-none-eabi-objcopy -O binary $< $@
|
|
||||||
|
|
||||||
firmware.elf: cmsis_core cmsis_sam hal.h link.ld Makefile $(SOURCES)
|
|
||||||
arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
flash: firmware.bin
|
|
||||||
bossac -p /dev/cu.usb* -w -v -b $<
|
|
||||||
|
|
||||||
cmsis_core:
|
|
||||||
git clone --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
|
||||||
cmsis_sam:
|
|
||||||
curl -sL https://packs.download.microchip.com/Microchip.SAME54_DFP.3.9.244.atpack -o $@.zip
|
|
||||||
mkdir $@ && cd $@ && unzip ../$@.zip
|
|
||||||
|
|
||||||
# Automated test via https://vcon.io/automated-firmware-tests/. Set VCON_API_KEY and update DEVICE_URL
|
|
||||||
DEVICE_URL ?= https://dash.vcon.io/api/v3/devices/9
|
|
||||||
update: firmware.bin
|
|
||||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<
|
|
||||||
|
|
||||||
test update: CFLAGS += -DUART_DEBUG=USART1
|
|
||||||
test: update
|
|
||||||
curl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt
|
|
||||||
grep 'READY, IP:' /tmp/output.txt # Check for network init
|
|
||||||
grep 'RECEIVED hello' /tmp/output.txt # Check for MQTT success
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) firmware.* cmsis_core cmsis_sam *.zip
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
#include "mongoose.h"
|
|
||||||
|
|
||||||
static const char *s_url = "mqtt://broker.hivemq.com:1883";
|
|
||||||
static const char *s_sub_topic = "mg/+/test"; // Publish topic
|
|
||||||
static const char *s_pub_topic = "mg/clnt/test"; // Subscribe topic
|
|
||||||
static const uint8_t s_qos = 1; // MQTT QoS
|
|
||||||
static struct mg_connection *s_conn; // Client connection
|
|
||||||
|
|
||||||
void SystemInit(void) { // Called automatically by startup code
|
|
||||||
clock_init();
|
|
||||||
rng_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
|
||||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
|
||||||
s_ticks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
|
||||||
return s_ticks; // Return number of milliseconds since boot
|
|
||||||
}
|
|
||||||
|
|
||||||
void mg_random(void *buf, size_t len) { // Use on-board RNG
|
|
||||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
|
||||||
uint32_t r = rng_read();
|
|
||||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
if (ev == MG_EV_OPEN) {
|
|
||||||
MG_INFO(("%lu CREATED", c->id));
|
|
||||||
// c->is_hexdumping = 1;
|
|
||||||
} else if (ev == MG_EV_ERROR) {
|
|
||||||
// On error, log error message
|
|
||||||
MG_ERROR(("%lu ERROR %s", c->id, (char *) ev_data));
|
|
||||||
} else if (ev == MG_EV_MQTT_OPEN) {
|
|
||||||
// MQTT connect is successful
|
|
||||||
struct mg_str subt = mg_str(s_sub_topic);
|
|
||||||
struct mg_str pubt = mg_str(s_pub_topic), data = mg_str("hello");
|
|
||||||
MG_INFO(("%lu CONNECTED to %s", c->id, s_url));
|
|
||||||
struct mg_mqtt_opts sub_opts;
|
|
||||||
memset(&sub_opts, 0, sizeof(sub_opts));
|
|
||||||
sub_opts.topic = subt;
|
|
||||||
sub_opts.qos = s_qos;
|
|
||||||
mg_mqtt_sub(c, &sub_opts);
|
|
||||||
MG_INFO(("%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.buf));
|
|
||||||
struct mg_mqtt_opts pub_opts;
|
|
||||||
memset(&pub_opts, 0, sizeof(pub_opts));
|
|
||||||
pub_opts.topic = pubt;
|
|
||||||
pub_opts.message = data;
|
|
||||||
pub_opts.qos = s_qos, pub_opts.retain = false;
|
|
||||||
mg_mqtt_pub(c, &pub_opts);
|
|
||||||
MG_INFO(("%lu PUBLISHED %.*s -> %.*s", c->id, (int) data.len, data.buf,
|
|
||||||
(int) pubt.len, pubt.buf));
|
|
||||||
} else if (ev == MG_EV_MQTT_MSG) {
|
|
||||||
// When we get echo response, print it
|
|
||||||
struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
|
|
||||||
MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, (int) mm->data.len,
|
|
||||||
mm->data.buf, (int) mm->topic.len, mm->topic.buf));
|
|
||||||
} else if (ev == MG_EV_CLOSE) {
|
|
||||||
MG_INFO(("%lu CLOSED", c->id));
|
|
||||||
s_conn = NULL; // Mark that we're closed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timer function - recreate client connection if it is closed
|
|
||||||
static void timer_fn(void *arg) {
|
|
||||||
struct mg_mgr *mgr = (struct mg_mgr *) arg;
|
|
||||||
struct mg_mqtt_opts opts = {.clean = true,
|
|
||||||
.qos = s_qos,
|
|
||||||
.topic = mg_str(s_pub_topic),
|
|
||||||
.version = 4,
|
|
||||||
.message = mg_str("bye")};
|
|
||||||
if (s_conn == NULL) s_conn = mg_mqtt_connect(mgr, s_url, &opts, fn, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
gpio_input(BUTTON_PIN);
|
|
||||||
gpio_output(LED_PIN);
|
|
||||||
uart_init(UART_DEBUG, 115200);
|
|
||||||
ethernet_init();
|
|
||||||
MG_INFO(("Starting, CPU freq %g MHz", (double) clock_sys_freq() / 1000000));
|
|
||||||
|
|
||||||
struct mg_mgr mgr; // Initialise
|
|
||||||
mg_mgr_init(&mgr); // Mongoose event manager
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
||||||
|
|
||||||
// Initialise Mongoose network stack
|
|
||||||
struct mg_tcpip_driver_same54_data driver_data = {.mdc_cr = 5};
|
|
||||||
struct mg_tcpip_if mif = {
|
|
||||||
.mac = GENERATE_LOCALLY_ADMINISTERED_MAC() /*{2, 3, 4, 5, 6, 7}*/,
|
|
||||||
// Uncomment below for static configuration:
|
|
||||||
// .ip = mg_htonl(MG_U32(192, 168, 0, 223)),
|
|
||||||
// .mask = mg_htonl(MG_U32(255, 255, 255, 0)),
|
|
||||||
// .gw = mg_htonl(MG_U32(192, 168, 0, 1)),
|
|
||||||
.driver = &mg_tcpip_driver_same54,
|
|
||||||
.driver_data = &driver_data};
|
|
||||||
mg_tcpip_init(&mgr, &mif);
|
|
||||||
|
|
||||||
MG_INFO(("MAC: %M. Waiting for IP...", mg_print_mac, mif.mac));
|
|
||||||
while (mif.state != MG_TCPIP_STATE_READY) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
MG_INFO(("Initialising application..."));
|
|
||||||
mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);
|
|
||||||
|
|
||||||
MG_INFO(("Starting event loop"));
|
|
||||||
for (;;) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Mongoose as a MicroPython user module
|
|
||||||
|
|
||||||
The most basic usage is in `main.py`.
|
|
||||||
|
|
||||||
You'll have to configure Mongoose for your desired platform, this example runs on the `unix` port and Mongoose detects it as a known architecture and hence configures itself to use sockets and time base. For other platforms, you'll have to do your homework (there's plenty of Mongoose examples for several platforms); also check respective MicroPython build instructions.
|
|
||||||
|
|
||||||
Check [_thread](https://docs.micropython.org/en/latest/library/_thread.html) support for more advanced usage
|
|
||||||
|
|
||||||
https://docs.micropython.org/en/latest/develop/cmodules.html
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
PROG ?= ./example # Program we are building
|
|
||||||
PACK ?= ./pack # Packing executable
|
|
||||||
DELETE = rm -rf # Command to remove files
|
|
||||||
GZIP ?= gzip # For compressing files in web_root/
|
|
||||||
OUT ?= -o $(PROG) # Compiler argument for output file
|
|
||||||
SOURCES = main.c mongoose.c net.c packed_fs.c # Source code files
|
|
||||||
CFLAGS = -W -Wall -Wextra -g -I. # Build options
|
|
||||||
|
|
||||||
# Mongoose build options. See https://mongoose.ws/documentation/#build-options
|
|
||||||
CFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT) # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe
|
|
||||||
PROG = example.exe # Use .exe suffix for the binary
|
|
||||||
PACK = pack.exe # Packing executable
|
|
||||||
CC = gcc # Use MinGW gcc compiler
|
|
||||||
CFLAGS += -lws2_32 # Link against Winsock library
|
|
||||||
DELETE = cmd /C del /Q /F /S # Command prompt command to delete files
|
|
||||||
GZIP = echo # No gzip on Windows
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Default target. Build and run program
|
|
||||||
all: $(PROG)
|
|
||||||
$(RUN) $(PROG) $(ARGS)
|
|
||||||
|
|
||||||
# Build program from sources
|
|
||||||
$(PROG): $(SOURCES)
|
|
||||||
$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)
|
|
||||||
|
|
||||||
# Bundle JS libraries (preact, preact-router, ...) into a single file
|
|
||||||
web_root/bundle.js:
|
|
||||||
curl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router -o $@
|
|
||||||
|
|
||||||
# Create optimised CSS. Prerequisite: npm -g i tailwindcss tailwindcss-font-inter
|
|
||||||
web_root/main.css: web_root/index.html $(wildcard web_root/*.js)
|
|
||||||
npx tailwindcss -o $@ --minify
|
|
||||||
|
|
||||||
# Generate packed filesystem for serving Web UI
|
|
||||||
packed_fs.c: $(wildcard web_root/*) $(wildcard certs/*) Makefile web_root/main.css web_root/bundle.js
|
|
||||||
$(GZIP) web_root/*
|
|
||||||
$(CC) ../../test/pack.c -o $(PACK)
|
|
||||||
$(PACK) web_root/* certs/* > $@
|
|
||||||
$(GZIP) -d web_root/*
|
|
||||||
|
|
||||||
mbedtls:
|
|
||||||
git clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@
|
|
||||||
|
|
||||||
ifeq ($(TLS), mbedtls)
|
|
||||||
CFLAGS += -DMG_TLS=MG_TLS_MBED -Wno-conversion -Imbedtls/include
|
|
||||||
CFLAGS += -DMBEDTLS_CONFIG_FILE=\"mbedtls_config.h\" mbedtls/library/*.c
|
|
||||||
$(PROG): mbedtls
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Cleanup. Delete built program and all build artifacts
|
|
||||||
clean:
|
|
||||||
$(DELETE) $(PROG) $(PACK) *.o *.obj *.exe *.bin *.dSYM mbedtls
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../device-dashboard/certs
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
// Copyright (c) 2020-2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define CONFIG_FILE "settings.bin"
|
|
||||||
|
|
||||||
static int s_sig_num;
|
|
||||||
static void signal_handler(int sig_num) {
|
|
||||||
signal(sig_num, signal_handler);
|
|
||||||
s_sig_num = sig_num;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool web_load_settings(void *buf, size_t len) {
|
|
||||||
bool ok = false;
|
|
||||||
struct mg_str data = mg_file_read(&mg_fs_posix, CONFIG_FILE);
|
|
||||||
if (data.buf == NULL) {
|
|
||||||
MG_ERROR(("Error reading %s", CONFIG_FILE));
|
|
||||||
} else if (data.len != len) {
|
|
||||||
MG_ERROR(("%s size != %lu", CONFIG_FILE, len));
|
|
||||||
} else {
|
|
||||||
memcpy(buf, data.buf, len);
|
|
||||||
}
|
|
||||||
free((void *) data.buf);
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool web_save_settings(void *buf, size_t len) {
|
|
||||||
MG_INFO(("Saving to %s", CONFIG_FILE));
|
|
||||||
return mg_file_write(&mg_fs_posix, CONFIG_FILE, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct mg_mgr mgr;
|
|
||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
|
||||||
signal(SIGINT, signal_handler);
|
|
||||||
signal(SIGTERM, signal_handler);
|
|
||||||
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set debug log level
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
|
|
||||||
web_init(&mgr);
|
|
||||||
while (s_sig_num == 0) {
|
|
||||||
mg_mgr_poll(&mgr, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
mg_mgr_free(&mgr);
|
|
||||||
MG_INFO(("Exiting on signal %d", s_sig_num));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.c
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../mongoose.h
|
|
||||||
@@ -1,283 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
// Device settings
|
|
||||||
struct device_settings {
|
|
||||||
uint32_t magic;
|
|
||||||
int log_level;
|
|
||||||
bool mqtt_enabled;
|
|
||||||
char mqtt_server_url[64];
|
|
||||||
char mqtt_topic_tx[16];
|
|
||||||
char mqtt_topic_rx[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct conndata {
|
|
||||||
uint64_t expiration_time; // Modbus request timeout
|
|
||||||
unsigned long id; // Connection ID waiting for the Modbus response
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct device_settings s_settings;
|
|
||||||
static const char *s_json_header =
|
|
||||||
"Content-Type: application/json\r\n"
|
|
||||||
"Cache-Control: no-cache\r\n";
|
|
||||||
|
|
||||||
static void set_default_settings(struct device_settings *s) {
|
|
||||||
s->magic = SETTINGS_MAGIC;
|
|
||||||
s->log_level = MG_LL_DEBUG;
|
|
||||||
mg_snprintf(s->mqtt_server_url, sizeof(s->mqtt_server_url), "%s",
|
|
||||||
"mqtt://broker.hivemq.com:1883");
|
|
||||||
mg_snprintf(s->mqtt_topic_tx, sizeof(s->mqtt_topic_tx), "%s", "modbus1/tx");
|
|
||||||
mg_snprintf(s->mqtt_topic_rx, sizeof(s->mqtt_topic_rx), "%s", "modbus1/rx");
|
|
||||||
}
|
|
||||||
|
|
||||||
// SNTP timer function. Sync up time
|
|
||||||
static void timer_sntp_fn(void *param) {
|
|
||||||
mg_sntp_connect(param, "udp://time.google.com:123", NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setfromjson(struct mg_str json, const char *jsonpath, char *buf,
|
|
||||||
size_t len) {
|
|
||||||
char *val = mg_json_get_str(json, jsonpath);
|
|
||||||
if (val != NULL) mg_snprintf(buf, len, "%s", val);
|
|
||||||
free(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_settings_set(struct mg_connection *c, struct mg_str body) {
|
|
||||||
struct device_settings settings;
|
|
||||||
memset(&settings, 0, sizeof(settings));
|
|
||||||
set_default_settings(&settings);
|
|
||||||
mg_json_get_bool(body, "$.mqtt_enabled", &settings.mqtt_enabled);
|
|
||||||
settings.log_level = mg_json_get_long(body, "$.log_level", MG_LL_INFO);
|
|
||||||
setfromjson(body, "$.mqtt_server_url", settings.mqtt_server_url,
|
|
||||||
sizeof(settings.mqtt_server_url));
|
|
||||||
setfromjson(body, "$.mqtt_topic_rx", settings.mqtt_topic_rx,
|
|
||||||
sizeof(settings.mqtt_topic_rx));
|
|
||||||
setfromjson(body, "$.mqtt_topic_tx", settings.mqtt_topic_tx,
|
|
||||||
sizeof(settings.mqtt_topic_tx));
|
|
||||||
|
|
||||||
s_settings = settings;
|
|
||||||
bool ok = web_save_settings(&s_settings, sizeof(s_settings));
|
|
||||||
mg_http_reply(c, 200, s_json_header,
|
|
||||||
"{%m:%s,%m:%m}", //
|
|
||||||
MG_ESC("status"), ok ? "true" : "false", //
|
|
||||||
MG_ESC("message"), MG_ESC(ok ? "Success" : "Failed"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_settings_get(struct mg_connection *c) {
|
|
||||||
mg_http_reply(c, 200, s_json_header,
|
|
||||||
"{%m:%s,%m:%d,%m:%m,%m:%m,%m:%m}\n", //
|
|
||||||
MG_ESC("mqtt_enabled"),
|
|
||||||
s_settings.mqtt_enabled ? "true" : "false", //
|
|
||||||
MG_ESC("log_level"), s_settings.log_level, //
|
|
||||||
MG_ESC("mqtt_server_url"), MG_ESC(s_settings.mqtt_server_url),
|
|
||||||
MG_ESC("mqtt_topic_rx"), MG_ESC(s_settings.mqtt_topic_rx),
|
|
||||||
MG_ESC("mqtt_topic_tx"), MG_ESC(s_settings.mqtt_topic_tx));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Modbus handler function
|
|
||||||
static void mfn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
struct conndata *cd = (struct conndata *) c->data;
|
|
||||||
if (ev == MG_EV_READ) {
|
|
||||||
MG_INFO(("%lu RECEIVED %lu", c->id, c->recv.len));
|
|
||||||
if (c->recv.len < 8) return; // Less than minimum length, buffer more
|
|
||||||
uint16_t len = mg_ntohs(*(uint16_t *) &c->recv.buf[4]); // PDU length
|
|
||||||
if (c->recv.len < len + 4U) return; // Partial frame, buffer more
|
|
||||||
// Notify parent connection
|
|
||||||
for (struct mg_connection *t = c->mgr->conns; t != NULL; t = t->next) {
|
|
||||||
if (t->id == cd->id) mg_call(t, MG_EV_USER, &c->recv);
|
|
||||||
}
|
|
||||||
c->is_closing = 1;
|
|
||||||
} else if (MG_EV_POLL) {
|
|
||||||
// MG_INFO(("%lu closing tmout %llu", c->id, cd->expiration_time));
|
|
||||||
if (cd->expiration_time > 0 && cd->expiration_time < mg_millis()) {
|
|
||||||
c->is_closing = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(void) ev_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void send8(struct mg_connection *c, uint8_t val) {
|
|
||||||
mg_send(c, &val, sizeof(val));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void send16(struct mg_connection *c, uint16_t val) {
|
|
||||||
send8(c, (uint8_t) (val >> 8) & 255);
|
|
||||||
send8(c, (uint8_t) (val & 255));
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct mg_connection *start_modbus_request(struct mg_mgr *mgr,
|
|
||||||
struct mg_str json,
|
|
||||||
unsigned long cid) {
|
|
||||||
struct mg_connection *c = NULL;
|
|
||||||
char *url = mg_json_get_str(json, "$.url");
|
|
||||||
long timeout = mg_json_get_long(json, "$.timeout", 750);
|
|
||||||
uint8_t id = (uint8_t) mg_json_get_long(json, "$.id", 1);
|
|
||||||
uint16_t reg = (uint16_t) mg_json_get_long(json, "$.reg", 1);
|
|
||||||
uint8_t func = (uint8_t) mg_json_get_long(json, "$.func", 0);
|
|
||||||
uint16_t nregs = (uint16_t) mg_json_get_long(json, "$.nregs", 1);
|
|
||||||
MG_INFO(("%lu REQUEST: %.*s", cid, json.len, json.buf));
|
|
||||||
if (func == 0) {
|
|
||||||
MG_ERROR(("Set func to a valid modbus function code"));
|
|
||||||
} else if ((c = mg_connect(mgr, url, mfn, NULL)) == NULL) {
|
|
||||||
MG_ERROR(("Failed to start modbus connection at %M", MG_ESC(url)));
|
|
||||||
} else {
|
|
||||||
send16(c, 1); // TID. Use random?
|
|
||||||
send16(c, 0); // Protocol identifier: 0 (modbus)
|
|
||||||
uint16_t *lp = (uint16_t *) &c->send.buf[c->send.len];
|
|
||||||
send16(c, 0); // Length: to be set later
|
|
||||||
size_t len = c->send.len;
|
|
||||||
|
|
||||||
send8(c, id); // Client ID
|
|
||||||
send8(c, func); // Function
|
|
||||||
|
|
||||||
if (func == 3 || func == 4 || func == 6 || func == 16) {
|
|
||||||
send16(c, reg); // Start register
|
|
||||||
send16(c, nregs); // Number of registers
|
|
||||||
|
|
||||||
if (func == 16) { // Fill in register values to write
|
|
||||||
send8(c, (uint8_t) (nregs * 2)); // Send number of bytes
|
|
||||||
for (uint16_t i = 0; i < nregs; i++) {
|
|
||||||
char path[20];
|
|
||||||
mg_snprintf(path, sizeof(path), "$.values[%hu]", i);
|
|
||||||
uint16_t r = (uint16_t) mg_json_get_long(json, path, 0);
|
|
||||||
send16(c, r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (func == 43) {
|
|
||||||
send8(c, 14); // MEI
|
|
||||||
send8(c, 1); // Basic device ID: 1
|
|
||||||
send8(c, 0); // Object ID: 0 (vendor name)
|
|
||||||
}
|
|
||||||
|
|
||||||
*lp = mg_htons((uint16_t) (c->send.len - len)); // Set length field
|
|
||||||
mg_hexdump(c->send.buf, c->send.len);
|
|
||||||
MG_INFO(("%lu SENDING %lu", c->id, c->send.len));
|
|
||||||
|
|
||||||
struct conndata *cd = (struct conndata *) c->data;
|
|
||||||
cd->id = cid; // Store parent connection ID
|
|
||||||
cd->expiration_time = mg_millis() + timeout;
|
|
||||||
}
|
|
||||||
free(url);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void handle_modbus_exec(struct mg_connection *c, struct mg_str body) {
|
|
||||||
struct mg_connection *mc = start_modbus_request(c->mgr, body, c->id);
|
|
||||||
if (mc == NULL) {
|
|
||||||
mg_http_reply(c, 200, s_json_header, "false\n");
|
|
||||||
} else {
|
|
||||||
struct conndata *cd = (struct conndata *) c->data;
|
|
||||||
cd->expiration_time = mg_millis() + 1500;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print modbus response
|
|
||||||
static size_t print_mb_resp(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
int func = va_arg(*ap, int);
|
|
||||||
size_t len = va_arg(*ap, size_t);
|
|
||||||
uint8_t *buf = va_arg(*ap, uint8_t *);
|
|
||||||
size_t n = 0;
|
|
||||||
if (func == 3 || func == 4) {
|
|
||||||
// For "multiple" read responses, print registers
|
|
||||||
n += mg_xprintf(out, ptr, "[");
|
|
||||||
for (size_t ofs = 1; ofs < len; ofs += 2) {
|
|
||||||
uint16_t reg = mg_ntohs(*(uint8_t *) &buf[ofs]);
|
|
||||||
n += mg_xprintf(out, ptr, "%s%hu", ofs == 1 ? "" : ",", reg);
|
|
||||||
}
|
|
||||||
n += mg_xprintf(out, ptr, "]");
|
|
||||||
} else if (func == 43) {
|
|
||||||
n += mg_xprintf(out, ptr, "{");
|
|
||||||
if (len >= 6) {
|
|
||||||
n += mg_xprintf(out, ptr, "%m:%d", MG_ESC("mei"), buf[0]);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:%d", MG_ESC("devid"), buf[1]);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:%d", MG_ESC("conformity"), buf[2]);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:%d", MG_ESC("more"), buf[3]);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:%d", MG_ESC("next"), buf[4]);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:[", MG_ESC("objects"));
|
|
||||||
size_t ofs = 6;
|
|
||||||
while (ofs < len) {
|
|
||||||
if (ofs > 6) n += mg_xprintf(out, ptr, ",");
|
|
||||||
n += mg_xprintf(out, ptr, "{");
|
|
||||||
n += mg_xprintf(out, ptr, "%m:%d", MG_ESC("id"), buf[ofs++]);
|
|
||||||
if (ofs < len) {
|
|
||||||
uint8_t olen = buf[ofs++];
|
|
||||||
if (olen > (uint8_t) (len - ofs)) olen = (uint8_t) (len - ofs);
|
|
||||||
n += mg_xprintf(out, ptr, ",%m:%m", MG_ESC("value"), mg_print_esc,
|
|
||||||
olen, &buf[ofs]);
|
|
||||||
ofs += olen;
|
|
||||||
}
|
|
||||||
n += mg_xprintf(out, ptr, "}");
|
|
||||||
}
|
|
||||||
n += mg_xprintf(out, ptr, "]");
|
|
||||||
}
|
|
||||||
n += mg_xprintf(out, ptr, "}");
|
|
||||||
} else {
|
|
||||||
n += mg_xprintf(out, ptr, "null");
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTP request handler function
|
|
||||||
static void fn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
struct conndata *cd = (struct conndata *) c->data;
|
|
||||||
if (ev == MG_EV_ACCEPT) {
|
|
||||||
if (c->fn_data != NULL) { // TLS listener!
|
|
||||||
struct mg_tls_opts opts = {0};
|
|
||||||
opts.cert = mg_unpacked("/certs/server_cert.pem");
|
|
||||||
opts.key = mg_unpacked("/certs/server_key.pem");
|
|
||||||
mg_tls_init(c, &opts);
|
|
||||||
}
|
|
||||||
} else if (ev == MG_EV_HTTP_MSG) {
|
|
||||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
|
||||||
|
|
||||||
if (mg_match(hm->uri, mg_str("/api/settings/get"), NULL)) {
|
|
||||||
handle_settings_get(c);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/settings/set"), NULL)) {
|
|
||||||
handle_settings_set(c, hm->body);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/settings/set"), NULL)) {
|
|
||||||
handle_settings_set(c, hm->body);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/modbus/exec"), NULL)) {
|
|
||||||
handle_modbus_exec(c, hm->body);
|
|
||||||
} else if (mg_match(hm->uri, mg_str("/api/device/reset"), NULL)) {
|
|
||||||
mg_timer_add(c->mgr, 500, 0, (void (*)(void *)) mg_device_reset, NULL);
|
|
||||||
mg_http_reply(c, 200, s_json_header, "true\n");
|
|
||||||
} else {
|
|
||||||
struct mg_http_serve_opts opts;
|
|
||||||
memset(&opts, 0, sizeof(opts));
|
|
||||||
#if MG_ARCH == MG_ARCH_UNIX || MG_ARCH == MG_ARCH_WIN32
|
|
||||||
opts.root_dir = "web_root"; // On workstations, use filesystem
|
|
||||||
#else
|
|
||||||
opts.root_dir = "/web_root"; // On embedded, use packed files
|
|
||||||
opts.fs = &mg_fs_packed;
|
|
||||||
#endif
|
|
||||||
mg_http_serve_dir(c, ev_data, &opts);
|
|
||||||
}
|
|
||||||
MG_DEBUG(("%lu %.*s %.*s", c->id, (int) hm->method.len, hm->method.buf,
|
|
||||||
(int) hm->uri.len, hm->uri.buf));
|
|
||||||
} else if (ev == MG_EV_POLL) {
|
|
||||||
if (cd->expiration_time > 0 && cd->expiration_time < mg_millis()) {
|
|
||||||
cd->expiration_time = 0;
|
|
||||||
mg_http_reply(c, 200, s_json_header, "false\n");
|
|
||||||
}
|
|
||||||
} else if (ev == MG_EV_USER) {
|
|
||||||
cd->expiration_time = 0; // Cleanup timeout setting
|
|
||||||
struct mg_iobuf *io = ev_data;
|
|
||||||
uint8_t f = io->buf[7];
|
|
||||||
mg_http_reply(c, 200, s_json_header, "{%m:%s,%m:%m,%m:%M}\n", //
|
|
||||||
MG_ESC("success"), "true", //
|
|
||||||
MG_ESC("raw"), mg_print_hex, io->len - 7, io->buf + 7, //
|
|
||||||
MG_ESC("data"), print_mb_resp, f, io->len - 8, io->buf + 8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void web_init(struct mg_mgr *mgr) {
|
|
||||||
set_default_settings(&s_settings);
|
|
||||||
web_load_settings(&s_settings, sizeof(s_settings));
|
|
||||||
|
|
||||||
mg_http_listen(mgr, HTTP_URL, fn, NULL);
|
|
||||||
mg_http_listen(mgr, HTTPS_URL, fn, (void *) 1);
|
|
||||||
mg_timer_add(mgr, 10 * 60 * 1000, MG_TIMER_RUN_NOW | MG_TIMER_REPEAT,
|
|
||||||
timer_sntp_fn, mgr);
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" class="h-full bg-white">
|
|
||||||
<head>
|
|
||||||
<title></title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor'> <path stroke-linecap='round' stroke-linejoin='round' d='M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0' /> </svg>" />
|
|
||||||
<link href="main.css" rel="stylesheet" />
|
|
||||||
<link href="https://rsms.me/inter/inter.css" rel="stylesheet" />
|
|
||||||
</head>
|
|
||||||
<body class="h-full"></body>
|
|
||||||
<script src="history.min.js"></script>
|
|
||||||
<script type="module" src="main.js"></script>
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/*! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter var,Helvetica,sans-serif;font-feature-settings:"cv11","ss01";font-variation-settings:"opsz" 32}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-0{left:0}.right-auto{right:auto}.top-0{top:0}.z-10{z-index:10}.z-\[48\]{z-index:48}.z-\[60\]{z-index:60}.m-4{margin:1rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-12{height:3rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.max-h-64{max-height:16rem}.min-h-screen{min-height:100vh}.w-0{width:0}.w-11{width:2.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-full{width:100%}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow-0{flex-grow:0}.basis-\[30px\]{flex-basis:30px}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-5,.translate-y-0{transform:tranLine truncated
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
all:
|
|
||||||
make -C ../../../tutorials/http/http-server ARGS="-d $(CURDIR)"
|
|
||||||
|
|
||||||
# Bundle JS libraries (preact, preact-router, ...) into a single file
|
|
||||||
bundle.js:
|
|
||||||
curl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router -o $@
|
|
||||||
|
|
||||||
# Create optimised CSS. Prerequisite: npm -g i tailwindcss tailwindcss-font-inter
|
|
||||||
NPX ?= npx
|
|
||||||
main.css: index.html $(wildcard *.js)
|
|
||||||
$(NPX) tailwindcss -o $@ --minify
|
|
||||||
|
|
||||||
clean:
|
|
||||||
true
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en" class="h-full bg-white">
|
|
||||||
<head>
|
|
||||||
<title></title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor'> <path stroke-linecap='round' stroke-linejoin='round' d='M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0' /> </svg>" />
|
|
||||||
<link href="main.css" rel="stylesheet" />
|
|
||||||
<link href="https://rsms.me/inter/inter.css" rel="stylesheet" />
|
|
||||||
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="h-full"></body>
|
|
||||||
<script type="module" src="main.js"></script>
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/*! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter var,Helvetica,sans-serif;font-feature-settings:"cv11","ss01";font-variation-settings:"opsz" 32}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.right-4{right:1rem}.top-0{top:0}.top-4{top:1rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-auto{margin-top:auto;margin-bottom:auto}.mb-4{margin-bottom:1rem}.mt-3{margin-top:.75rem}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-11{width:2.75rem}.w-24{width:6rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-60{width:15rem}.w-64{width:16rem}.w-96{width:24rem}.w-full{width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-5{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x:1.25rem}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-widtLine truncated
|
|
||||||
@@ -1,618 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
import {h, html, render, useEffect, useRef, useState} from './bundle.js';
|
|
||||||
|
|
||||||
const Logo = props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.87 12.85"><defs><style>.ll-cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:0.5px;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="ll-cls-1" d="M12.62,1.82V8.91A1.58,1.58,0,0,1,11,10.48H4a1.44,1.44,0,0,1-1-.37A.69.69,0,0,1,2.84,10l-.1-.12a.81.81,0,0,1-.15-.48V5.57a.87.87,0,0,1,.86-.86H4.73V7.28a.86.86,0,0,0,.86.85H9.42a.85.85,0,0,0,.85-.85V3.45A.86.86,0,0,0,10.13,3,.76.76,0,0,0,10,2.84a.29.29,0,0,0-.12-.1,1.49,1.49,0,0,0-1-.37H2.39V1.82A1.57,1.57,0,0,1,4,.25H11A1.57,1.57,0,0,1,12.62,1.82Z"/><path class="ll-cls-1" d="M10.48,10.48V11A1.58,1.58,0,0,1,8.9,12.6H1.82A1.57,1.57,0,0,1,.25,11V3.94A1.57,1.57,0,0,1,1.82,2.37H8.9a1.49,1.49,0,0,1,1,.37l.12.1a.76.76,0,0,1,.11.14.86.86,0,0,1,.14.47V7.28a.85.85,0,0,1-.85.85H8.13V5.57a.86.86,0,0,0-.85-.86H3.45a.87.87,0,0,0-.86.86V9.4a.81.81,0,0,0,.15.48l.1.12a.69.69,0,0,0,.13.11,1.44,1.44,0,0,0,1,.37Z"/></g></g></svg>`;
|
|
||||||
const DefaultTopic = 'mg_mqtt_dashboard';
|
|
||||||
const DefaultUrl = location.protocol == 'https:'
|
|
||||||
? 'wss://broker.hivemq.com:8884/mqtt'
|
|
||||||
: 'ws://broker.hivemq.com:8000/mqtt';
|
|
||||||
const DefaultDeviceConfig = {pin_map: [], pin_state: [], log_level: 0, pin_count: 0};
|
|
||||||
const Delay = (ms, val) => new Promise(resolve => setTimeout(resolve, ms, val));
|
|
||||||
const handleFetchError = r => r.ok || alert(`Error: ${r.statusText}`);
|
|
||||||
const LabelClass = 'text-sm truncate text-gray-500 font-medium my-auto whitespace-nowrap';
|
|
||||||
const BadgeClass = 'flex-inline text-sm rounded-md rounded px-2 py-0.5 ring-1 ring-inset';
|
|
||||||
const InputClass = 'font-normal text-sm rounded w-full flex-1 py-0.5 px-2 text-gray-700 placeholder:text-gray-400 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-500 rounded border';
|
|
||||||
const TitleClass = 'font-semibold xuppercase xtext-gray-600';
|
|
||||||
const Colors = {
|
|
||||||
green: 'bg-green-100 text-green-900 ring-green-300',
|
|
||||||
yellow: 'bg-yellow-100 text-yellow-900 ring-yellow-300',
|
|
||||||
info: 'bg-zinc-100 text-zinc-900 ring-zinc-300',
|
|
||||||
red: 'bg-red-100 text-red-900 ring-red-300',
|
|
||||||
};
|
|
||||||
|
|
||||||
let MqttClient;
|
|
||||||
|
|
||||||
const Icons = {
|
|
||||||
logo: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="59.1" height="75.7" viewBox="0 0 1514 1182"> <path style="fill: #2f409a;" d="m52.8 572h345.1v346.5h-345.1zm-10.9-434.2c-12.6 6.4-32.2 20.9-35.5 37.9 0 0-6.1 35.9-6.1 36.8-2.1 13.1 10.5 10 15.8 6.7 53.9-31.8 113.9-60.7 168.7-77.5 258.2-78.2 585.9-80.2 643.1 88.8 40.3 117.1-123.6 214.8-216.1 258.4-35.7 16.8-47.6 32.8-50 49.8-2 15.3 3.2 37.8 23.8 68.3 129.7 194.8 515 474 893.1 571.7 15.7 4.2 23.5 2.8 29.9-1.1 3.5-2 7.9-4.8 1.1-8.2-251.1-132.2-490.9-353.9-610.9-525.1-27.4-39.5-34.5-65.9-32.7-87.2 1.7-18.4 18.7-34.5 54.8-51.4 134.1-62.3 270.9-157.1 230-314.9-59.5-226.9-700.5-260.1-1109-53z"/></svg>`,
|
|
||||||
activity: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline></svg>`,
|
|
||||||
refresh: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"></polyline><polyline points="1 20 1 14 7 14"></polyline><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"></path></svg>`,
|
|
||||||
info: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>`,
|
|
||||||
login: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"></path><polyline points="10 17 15 12 10 7"></polyline><line x1="15" y1="12" x2="3" y2="12"></line></svg>`,
|
|
||||||
logout: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><polyline points="16 17 21 12 16 7"></polyline><line x1="21" y1="12" x2="9" y2="12"></line></svg>`,
|
|
||||||
menu: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>`,
|
|
||||||
upload: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>`,
|
|
||||||
monitor: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect><line x1="8" y1="21" x2="16" y2="21"></line><line x1="12" y1="17" x2="12" y2="21"></line></svg>`,
|
|
||||||
settings: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>`,
|
|
||||||
download: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg>`,
|
|
||||||
file: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline></svg>`,
|
|
||||||
check: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>`,
|
|
||||||
rollback: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="11 17 6 12 11 7"></polyline><polyline points="18 17 13 12 18 7"></polyline></svg>`,
|
|
||||||
save: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path><polyline points="17 21 17 13 7 13 7 21"></polyline><polyline points="7 3 7 8 15 8"></polyline></svg>`,
|
|
||||||
bolt: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon></svg>`,
|
|
||||||
delete: props => html`<svg class=${props.class} xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>`,
|
|
||||||
};
|
|
||||||
|
|
||||||
export function Button({title, onclick, disabled, extraClass, icon, ref, colors, hovercolor, disabledcolor}) {
|
|
||||||
const [spin, setSpin] = useState(false);
|
|
||||||
const cb = function(ev) {
|
|
||||||
const res = onclick ? onclick() : null;
|
|
||||||
if (res && typeof (res.catch) === 'function') {
|
|
||||||
setSpin(true);
|
|
||||||
res.catch(() => false).then(() => setSpin(false));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (!colors) colors = 'bg-blue-600 hover:bg-blue-500 disabled:bg-blue-400';
|
|
||||||
return html`
|
|
||||||
<button type="button" class="inline-flex justify-center items-center gap-2 rounded px-2.5 py-0.5 text-sm font-semibold text-white shadow-sm ${colors} ${extraClass}"
|
|
||||||
ref=${ref} onclick=${cb} disabled=${disabled || spin} >
|
|
||||||
${title}
|
|
||||||
<${spin ? Icons.refresh : icon} class="w-4 ${spin ? 'animate-spin' : ''}" />
|
|
||||||
<//>`
|
|
||||||
};
|
|
||||||
|
|
||||||
function UploadFileButton({oncomplete, onprogress, onfileselect, url, title, colors, accept, extraClass}) {
|
|
||||||
const btn = useRef(null);
|
|
||||||
const input = useRef(null);
|
|
||||||
|
|
||||||
// Send a large file chunk by chunk
|
|
||||||
const sendFileData = function(url, fileName, fileData, chunkSize) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
const finish = ok => {
|
|
||||||
input.fn = null;
|
|
||||||
const res = oncomplete ? oncomplete(ok, fileName, fileData.length) : null;
|
|
||||||
if (res && typeof (res.catch) === 'function') {
|
|
||||||
res.catch(() => false).then(() => ok ? resolve() : reject());
|
|
||||||
} else {
|
|
||||||
ok ? resolve() : reject();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const sendChunk = function(offset) {
|
|
||||||
var chunk = fileData.subarray(offset, offset + chunkSize) || '';
|
|
||||||
var opts = {method: 'POST', body: chunk};
|
|
||||||
var fullUrl = url + '?offset=' + offset +
|
|
||||||
'&total=' + fileData.length +
|
|
||||||
'&file=' + encodeURIComponent(fileName);
|
|
||||||
onprogress && onprogress(offset, fileData.length, fileName);
|
|
||||||
fetch(fullUrl, opts)
|
|
||||||
.then(function(res) {
|
|
||||||
if (!res.ok) {
|
|
||||||
finish(false);
|
|
||||||
} else if (offset >= fileData.length) {
|
|
||||||
finish(true);
|
|
||||||
} else {
|
|
||||||
sendChunk(offset + chunk.length);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
sendChunk(0);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onchange = function(ev) {
|
|
||||||
if (!ev.target.files[0]) return;
|
|
||||||
let r = new FileReader(), f = ev.target.files[0];
|
|
||||||
if (onfileselect && !onfileselect(f.name)) {
|
|
||||||
ev.target.value = '';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
r.readAsArrayBuffer(f);
|
|
||||||
r.onload = function() {
|
|
||||||
input.fn = sendFileData(url, f.name, new Uint8Array(r.result), 2048);
|
|
||||||
ev.target.value = '';
|
|
||||||
ev.preventDefault();
|
|
||||||
btn.current && btn.current.base.click();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const onclick = function(ev) {
|
|
||||||
//if (!input.fn) input.current.click(); // No upload in progress, show file dialog
|
|
||||||
};
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="inline-flex flex-col ${extraClass}">
|
|
||||||
<input class="hidden" type="file" ref=${input} onchange=${onchange} accept=${accept} />
|
|
||||||
<${Button} title=${title} icon=${Icons.download} onclick=${onclick} ref=${btn} colors=${colors} />
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function Toggle({value, onclick, disabled}) {
|
|
||||||
const bg = !!value ? 'bg-blue-600' : 'bg-gray-200';
|
|
||||||
const tr = !!value ? 'translate-x-5' : 'translate-x-0';
|
|
||||||
return html`
|
|
||||||
<button type="button" onclick=${onclick} disabled=${disabled}
|
|
||||||
class="${bg} inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-0 ring-0"
|
|
||||||
role="switch" aria-checked=${!!value}>
|
|
||||||
<span aria-hidden="true" class="${tr} pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 focus:ring-0 transition duration-200 ease-in-out"></span>
|
|
||||||
</button>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function Header({topic, setTopic, url, setUrl, connected}) {
|
|
||||||
const forbiddenChars = ['$', '*', '+', '#', '/'];
|
|
||||||
const onClick = () => {
|
|
||||||
const isValidTopic = val => !forbiddenChars.some(char => val.includes(char));
|
|
||||||
if (isValidTopic(topic)) {
|
|
||||||
localStorage.setItem('topic', topic)
|
|
||||||
setTopic(topic);
|
|
||||||
window.location.reload();
|
|
||||||
} else {
|
|
||||||
setSaveResult('Error: The topic cannot contain these characters: ' + forbiddenChars);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="top-0 py-2 border-b-2 bg-stone-100">
|
|
||||||
<div class="flex px-4">
|
|
||||||
<div class="flex grow gap-4">
|
|
||||||
<h1 class="text-2xl font-semibold">IoT Fleet Management Dashboard</h1>
|
|
||||||
<//>
|
|
||||||
<div class="flex gap-2 items-center">
|
|
||||||
<div class="flex w-96 align-center justify-between gap-2">
|
|
||||||
<span class=${LabelClass}>MQTT Server<//>
|
|
||||||
<input disabled=${!connected} value=${url}
|
|
||||||
onchange=${ev => setUrl(ev.target.value)} class=${InputClass} />
|
|
||||||
<//>
|
|
||||||
<div class="flex w-64 align-center justify-between gap-2">
|
|
||||||
<span class=${LabelClass}>Root Topic<//>
|
|
||||||
<input disabled=${!connected} value=${topic}
|
|
||||||
onchange=${ev => setTopic(ev.target.value)} class=${InputClass} />
|
|
||||||
<//>
|
|
||||||
<${Button} icon=${Icons.bolt} onclick=${onClick} title=${connected ? 'Disconnect' : 'Connect'} />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function Sidebar({devices, onclick}) {
|
|
||||||
const Td = props => html`
|
|
||||||
<td class="whitespace-nowrap border-b border-slate-200 py-2 px-4 pr-3 text-sm text-slate-900">${
|
|
||||||
props.text}</td>`;
|
|
||||||
|
|
||||||
const Device = ({d}) => html`
|
|
||||||
<div class="hover:bg-stone-100 cursor-pointer flex gap-3 px-4 py-2 justify-between"
|
|
||||||
onclick=${ev => onclick(d.id)}>
|
|
||||||
<span>${d.id}</span>
|
|
||||||
<span class="${BadgeClass} ${d.online ? Colors.green : Colors.red}"> ${d.online ? 'online' : 'offline'} <//>
|
|
||||||
<//>`;
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="overflow-auto divide-y">
|
|
||||||
<div class="${TitleClass} flex items-center px-4 py-2 bg-stone-100">
|
|
||||||
Device List
|
|
||||||
<//>
|
|
||||||
${(devices ? devices : []).map(d => h(Device, {d}))}
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function FirmwareStatus({title, info, children}) {
|
|
||||||
const state =
|
|
||||||
['UNAVAILABLE', 'FIRST_BOOT', 'NOT_COMMITTED',
|
|
||||||
'COMMITTED'][(info.status || 0) % 4];
|
|
||||||
const valid = info.status > 0;
|
|
||||||
return html`
|
|
||||||
<div class="bg-white divide-y border rounded">
|
|
||||||
<div class="${TitleClass} bg-white flex items-center px-4 py-2">
|
|
||||||
${title}
|
|
||||||
<//>
|
|
||||||
<div class="px-4 py-2 relative">
|
|
||||||
<div class="my-1">Status: ${state}<//>
|
|
||||||
<div class="my-1">CRC32: ${valid ? info.crc32.toString(16) : 'n/a'}<//>
|
|
||||||
<div class="my-1">Size: ${valid ? info.size : 'n/a'}<//>
|
|
||||||
<div class="my-1">Flashed at: ${
|
|
||||||
valid ? new Date(info.timestamp * 1000).toLocaleString() : 'n/a'}<//>
|
|
||||||
${children}
|
|
||||||
<//>
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function FirmwareUpdatePanel({no, name, current, previous, updated_at, refresh}) {
|
|
||||||
const [color, setColor] = useState(Colors.green);
|
|
||||||
const [otaStatus, setOtaStatus] = useState('up-to-date');
|
|
||||||
const Descr = ({label, value}) => html`
|
|
||||||
<div class="flex items-center justify-between">
|
|
||||||
<span class=${LabelClass}>${label}<//>
|
|
||||||
<span class="text-sm">${value}<//>
|
|
||||||
<//>`;
|
|
||||||
const onprogress = (len, total) => {
|
|
||||||
setColor(Colors.info);
|
|
||||||
setOtaStatus(`uploading, ${parseInt(len * 100 /total)}% done...`);
|
|
||||||
}
|
|
||||||
const setparam = (key, val) => fetch('api/settings/set', {
|
|
||||||
method: 'POST',
|
|
||||||
body: JSON.stringify({key, val}),
|
|
||||||
}).then(handleFetchError);
|
|
||||||
const onupload = function(ok, fileName, fileLength) {
|
|
||||||
if (ok) {
|
|
||||||
return setparam(`ecu.${no}.new`, fileName).then(refresh);
|
|
||||||
} else {
|
|
||||||
setColor(Colors.red), setOtaStatus('upload failed');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const onfileselect = function(fileName, fileLength) {
|
|
||||||
const ok = fileName.startsWith(name);
|
|
||||||
if (!ok) alert(`Firmware file name must be ${name}.VERSION.BIN_OR_HEX`);
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
const update = rollback => new Promise(function(resolve, reject) {
|
|
||||||
const opts = {method: 'POST', body: JSON.stringify({no, rollback})};
|
|
||||||
const fail = () => (reject(), setOtaStatus('update error'), setColor(Colors.red));
|
|
||||||
const finish = () => fetch('api/ecu/update/end', opts)
|
|
||||||
.then(r => r.ok ? resolve() : reject())
|
|
||||||
.then(refresh);
|
|
||||||
const write = () => fetch('api/ecu/update/write', opts).then(r => {
|
|
||||||
if (!r.ok) fail();
|
|
||||||
//if (r.ok) r.json().then(r => console.log('Goo', r));
|
|
||||||
if (r.ok) r.json().then(r => r == 1 ? write() : finish());
|
|
||||||
});
|
|
||||||
fetch('api/ecu/update/begin', opts).then(r => r.ok ? write() : fail());
|
|
||||||
});
|
|
||||||
const onflash = ev => update(false);
|
|
||||||
const onrollback = ev => update(true);
|
|
||||||
|
|
||||||
useEffect(function() {
|
|
||||||
//setOtaStatus(anew ? 'update pending' : 'up-to-date');
|
|
||||||
//setColor(anew ? Colors.yellow : Colors.green);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="divide-y border rounded bg-white">
|
|
||||||
<div class="px-4 py-2 flex justify-between items-center rounded">
|
|
||||||
<span class="${TitleClass}">Firmware Update<//>
|
|
||||||
<div class="flex gap-2"><span class=${LabelClass}>Status:</span><span class="${BadgeClass} ${color}">${otaStatus}<//><//>
|
|
||||||
<//>
|
|
||||||
<div class="p-4 flex flex-col gap-1">
|
|
||||||
<${Descr} label="Current firmware:" value=${current || 'n/a'} />
|
|
||||||
<${Descr} label="Updated at:" value=${updated_at || 'n/a'} />
|
|
||||||
<div class="flex items-center justify-between whitespace-nowrap">
|
|
||||||
<span class=${LabelClass}>Previous firmware:<//>
|
|
||||||
<span class="flex gap-1 items-center">
|
|
||||||
<span class="text-sm">${previous}<//>
|
|
||||||
<${Button} title="rollback" icon=${Icons.bolt} onclick=${onrollback}
|
|
||||||
extraClass="w-24" disabled=${!previous} />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<div class="flex items-center justify-between">
|
|
||||||
<span class=${LabelClass}>New firmware:<//>
|
|
||||||
<span class="flex gap-1 align-center justify-between">
|
|
||||||
<${UploadFileButton} title="upload" url="api/fw/upload"
|
|
||||||
onfileselect=${onfileselect}
|
|
||||||
onprogress=${onprogress} oncomplete=${onupload} />
|
|
||||||
<${Button} title="flash" icon=${Icons.bolt} onclick=${onflash}
|
|
||||||
extraClass="w-24" disabled=${!previous} />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function DeviceSettingsPanel({device, publishFn, connected}) {
|
|
||||||
const [config, setConfig] = useState({});
|
|
||||||
const logOptions = [[0, 'Disable'], [1, 'Error'], [2, 'Info'], [3, 'Debug']];
|
|
||||||
|
|
||||||
const onSave = ev => publishFn('config.set', config).then(r => {
|
|
||||||
//setDeviceConfig(device.id, config);
|
|
||||||
}).catch(e => alert('Failure!'));
|
|
||||||
|
|
||||||
// To delete device, set an empty retained message
|
|
||||||
const onforget = function(ev) {
|
|
||||||
MqttClient.publish(device.topic, '', {retain: true});
|
|
||||||
location.reload();
|
|
||||||
};
|
|
||||||
const onloglevelchange = ev => setConfig(x => Object.assign({}, x, {log_level: parseInt(ev.target.value)}));
|
|
||||||
const onpinschange = ev => {
|
|
||||||
const pin_map = ev.target.value.split(/\s*,\s*/).map(x => parseInt(x));
|
|
||||||
setConfig(x => Object.assign({}, x, {
|
|
||||||
pin_map, // Send an updated pin map
|
|
||||||
pin_count: pin_map.length, // And pin count
|
|
||||||
pin_state:[] // Remove pin_state from the request, as pin_map change can invalidate it
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
//console.log('sp', device, config);
|
|
||||||
|
|
||||||
useEffect(() => setConfig(device.config) , [device]);
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="divide-y border rounded bg-white">
|
|
||||||
<div class="px-4 py-2 flex justify-between items-center rounded ${TitleClass}">
|
|
||||||
<div class="flex gap-2 items-center"> Settings <//>
|
|
||||||
<//>
|
|
||||||
<div class="p-4 gap-3">
|
|
||||||
<div class="flex justify-between my-1">
|
|
||||||
<span class=${LabelClass}>Status<//>
|
|
||||||
<span class="${BadgeClass} ${device.online ? Colors.green : Colors.red}"> ${connected ? 'online' : 'offline'} <//>
|
|
||||||
<//>
|
|
||||||
<div class="flex justify-between my-1">
|
|
||||||
<span class=${LabelClass}>Device ID<//>
|
|
||||||
<span class="${LabelClass}">${device.id}<//>
|
|
||||||
<//>
|
|
||||||
<div class="grid grid-cols-2 my-1">
|
|
||||||
<span class="${LabelClass}">Log Level<//>
|
|
||||||
<select onchange=${onloglevelchange} class="w-full rounded font-normal border py-0.5 px-1 text-gray-600 focus:outline-none text-sm disabled:cursor-not-allowed" disabled=${!connected}>
|
|
||||||
${logOptions.map(v => html`<option value=${v[0]} selected=${v[0] == config.log_level}>${v[1]}<//>`) }
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<div class="grid grid-cols-2 my-1">
|
|
||||||
<span class="${LabelClass}">Show Pins<//>
|
|
||||||
<div class="flex w-full items-center">
|
|
||||||
<input disabled=${!connected} value=${config.pin_map}
|
|
||||||
onchange=${onpinschange} class=${InputClass}
|
|
||||||
placeholder="comma-separated pin numbers" />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
|
|
||||||
<div class="mt-3 flex justify-between gap-2">
|
|
||||||
<${Button} title="Forget this device"
|
|
||||||
disabled=${device.online || !connected} icon=${Icons.delete}
|
|
||||||
onclick=${onforget}/>
|
|
||||||
<${Button} icon=${Icons.save} onclick=${onSave} title="Save Settings" disabled=${!device.online} />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<//> `;
|
|
||||||
};
|
|
||||||
|
|
||||||
function DeviceControlPanel({device, config, setConfig, publishFn, connected}) {
|
|
||||||
const onclick = function(i) { // Send request to toggle pin i
|
|
||||||
let configCopy = Object.assign({}, config);
|
|
||||||
configCopy.pin_state[i] = !!configCopy.pin_state[i] ? 0 : 1;
|
|
||||||
return publishFn('config.set', configCopy).catch(e => alert('Failure!'));
|
|
||||||
};
|
|
||||||
|
|
||||||
const Pin = i => html`
|
|
||||||
<div class="inline-block my-1 bg-gray-100 rounded px-1 py-1">
|
|
||||||
<div class="flex align-center justify-between">
|
|
||||||
<span class="${LabelClass}">Pin ${config.pin_map[i]}<//>
|
|
||||||
<${Toggle} onclick=${ev => onclick(i)}
|
|
||||||
disabled=${!device.online || !connected}
|
|
||||||
value=${config.pin_state[i]} />
|
|
||||||
<//>
|
|
||||||
<//>`;
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="divide-y border rounded bg-white xbg-slate-100 my-y">
|
|
||||||
<div class="px-4 py-2 flex justify-between items-center rounded ${TitleClass}">
|
|
||||||
<div class="flex gap-2 items-center">Pin Control Panel<//>
|
|
||||||
<//>
|
|
||||||
<div class="p-4 grid grid-cols-2 lg:grid-cols-3 gap-2">
|
|
||||||
${(config.pin_map || []).map((_, i) => Pin(i))}
|
|
||||||
<div><//>
|
|
||||||
<//>
|
|
||||||
<//> `;
|
|
||||||
};
|
|
||||||
|
|
||||||
function DeviceDashboard({device, setDeviceConfig, publishFn, connected}) {
|
|
||||||
const cfg = device && device.config ? device.config : DefaultDeviceConfig;
|
|
||||||
const [localConfig, setLocalConfig] = useState(cfg);
|
|
||||||
useEffect(() => setLocalConfig(cfg), [device]);
|
|
||||||
|
|
||||||
if (!device || !localConfig) {
|
|
||||||
return html`
|
|
||||||
<div class="flex grow text-gray-400 justify-center items-center text-xl">
|
|
||||||
No device selected. Click on a device on a sidebar
|
|
||||||
<//>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="p-3 grid grid-cols-3 gap-2">
|
|
||||||
<${DeviceSettingsPanel} device=${device} config=${localConfig} setConfig=${setLocalConfig} publishFn=${publishFn} connected=${connected} />
|
|
||||||
<${DeviceControlPanel} device=${device} config=${localConfig} setConfig=${setLocalConfig} publishFn=${publishFn} connected=${connected} />
|
|
||||||
<${FirmwareUpdatePanel} deviceID=${device.id} publishFn=${publishFn}
|
|
||||||
disabled=${!device.online}
|
|
||||||
info=${[localConfig.crnt_fw, localConfig.prev_fw]} />
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const App = function() {
|
|
||||||
const [devices, setDevices] = useState([]);
|
|
||||||
const [currentDevID, setCurrentDevID] = useState(localStorage.getItem('currentDevID') || '');
|
|
||||||
const [loading, setLoading] = useState(true);
|
|
||||||
const [url, setUrl] = useState(localStorage.getItem('url') || DefaultUrl);
|
|
||||||
const [topic, setTopic] = useState(localStorage.getItem('topic') || DefaultTopic);
|
|
||||||
const [error, setError] = useState(null);
|
|
||||||
const [connected, setConnected] = useState(false);
|
|
||||||
const responseHandlers = useRef({});
|
|
||||||
|
|
||||||
function addResponseHandler(correlationId, handler) {
|
|
||||||
responseHandlers[correlationId] = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeResponseHandler(correlationId) {
|
|
||||||
delete responseHandlers[correlationId];
|
|
||||||
}
|
|
||||||
|
|
||||||
const onRefresh = ev => window.location.reload();
|
|
||||||
|
|
||||||
const initConn = () => {
|
|
||||||
MqttClient = mqtt.connect(url, {connectTimeout: 5000, reconnectPeriod: 0});
|
|
||||||
|
|
||||||
MqttClient.on('connect', () => {
|
|
||||||
//console.log('Connected to the broker');
|
|
||||||
setLoading(false);
|
|
||||||
setError(null); // Reset error state upon successful connection
|
|
||||||
setConnected(true);
|
|
||||||
|
|
||||||
const statusTopic = topic + '/+/status'
|
|
||||||
const txTopic = topic + '/+/tx'
|
|
||||||
|
|
||||||
const subscribe = (topic) => {
|
|
||||||
MqttClient.subscribe(topic, (err) => {
|
|
||||||
if (err) {
|
|
||||||
console.error('Error subscribing to topic:', err);
|
|
||||||
setError('Error subscribing to topic');
|
|
||||||
} else {
|
|
||||||
//console.log('Successfully subscribed to ', topic);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
subscribe(statusTopic);
|
|
||||||
subscribe(txTopic);
|
|
||||||
});
|
|
||||||
|
|
||||||
MqttClient.on('message', (topic, message) => {
|
|
||||||
// console.log(`Received message from ${topic}: ${message.toString()}`);
|
|
||||||
if (message.length == 0) return;
|
|
||||||
let response;
|
|
||||||
try {
|
|
||||||
response = JSON.parse(message.toString());
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topic.endsWith('/status')) {
|
|
||||||
let device = {topic: topic, id: topic.split('/')[1], config: DefaultDeviceConfig};
|
|
||||||
const params = response.params;
|
|
||||||
if (!params) {
|
|
||||||
console.error('Invalid response');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
device.online = params.status === 'online';
|
|
||||||
//setConnected(device.online);
|
|
||||||
if (device.online) {
|
|
||||||
device.config = params;
|
|
||||||
if (!device.config.pins) device.config.pins = [];
|
|
||||||
}
|
|
||||||
setDevice(device)
|
|
||||||
} else if (topic.endsWith('/tx')) {
|
|
||||||
if (!response.id) {
|
|
||||||
console.error('Invalid response');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const handler = responseHandlers[response.id];
|
|
||||||
if (handler) {
|
|
||||||
handler(response);
|
|
||||||
removeResponseHandler(response.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
MqttClient.on('error', (err) => {
|
|
||||||
console.error('Connection error:', err);
|
|
||||||
setError('Connection cannot be established.');
|
|
||||||
});
|
|
||||||
|
|
||||||
MqttClient.on('close', () => {
|
|
||||||
if (!connected) {
|
|
||||||
console.error('Failed to connect to the broker.');
|
|
||||||
setError('Connection cannot be established.');
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => initConn(), []);
|
|
||||||
|
|
||||||
const handlePublish = (methodName, parameters, timeout = 5000) => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const randomIdGenerator = function(length) {
|
|
||||||
return Math.random().toString(36).substring(2, length + 2);
|
|
||||||
};
|
|
||||||
const randomID = randomIdGenerator(40);
|
|
||||||
const timeoutID = setTimeout(() => {
|
|
||||||
removeResponseHandler(randomID);
|
|
||||||
reject(new Error('Request timed out'));
|
|
||||||
}, timeout);
|
|
||||||
|
|
||||||
addResponseHandler(randomID, (messageData) => {
|
|
||||||
clearTimeout(timeoutID);
|
|
||||||
resolve(messageData);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (currentDevID) {
|
|
||||||
const rxTopic = topic + `/${currentDevID}/rx`;
|
|
||||||
const rpcPayload = {method: methodName, id: randomID};
|
|
||||||
if (parameters) {
|
|
||||||
rpcPayload.params = parameters;
|
|
||||||
}
|
|
||||||
MqttClient.publish(rxTopic, JSON.stringify(rpcPayload));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const getDeviceByID = (deviceID) => devices.find(d => d.id === deviceID);
|
|
||||||
|
|
||||||
const setDevice = (devData) => {
|
|
||||||
setDevices(prevDevices => {
|
|
||||||
const devIndex =
|
|
||||||
prevDevices.findIndex(device => device.id === devData.id);
|
|
||||||
if (devIndex !== -1) {
|
|
||||||
if (!devData.online && !devData.config) {
|
|
||||||
const updatedDevices = [...prevDevices];
|
|
||||||
updatedDevices[devIndex].online = false;
|
|
||||||
return updatedDevices;
|
|
||||||
} else {
|
|
||||||
return prevDevices.map(device => device.id === devData.id ? devData : device);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return [...prevDevices, devData];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const setDeviceConfig = (deviceID, config) => {
|
|
||||||
setDevices(prevDevices => {
|
|
||||||
return prevDevices.map(device => {
|
|
||||||
if (device.id === deviceID) {
|
|
||||||
return {...device, config: config};
|
|
||||||
}
|
|
||||||
return device;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const onDeviceClick = (deviceID) => {
|
|
||||||
const device = getDeviceByID(deviceID);
|
|
||||||
if (device) {
|
|
||||||
setCurrentDevID(device.id);
|
|
||||||
localStorage.setItem('currentDevID', device.id);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
return html`
|
|
||||||
<div class="min-h-screen bg-slate-100 flex flex-col">
|
|
||||||
<${Header}/>
|
|
||||||
<div class="flex-grow flex items-center justify-center">
|
|
||||||
<div class="bg-slate-300 p-8 rounded-lg shadow-md w-full max-w-md">
|
|
||||||
<h1 class="text-2xl font-bold text-gray-700 mb-4 text-center">Connection Error</h1>
|
|
||||||
<p class="text-gray-600 text-center mb-4">
|
|
||||||
Unable to connect to the MQTT broker.
|
|
||||||
</p>
|
|
||||||
<div class="text-center relative">
|
|
||||||
<${Button} title="Retry" onclick=${onRefresh}
|
|
||||||
icon=${Icons.refresh} class="absolute top-4 right-4" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return html`
|
|
||||||
<div class="h-full flex flex-col">
|
|
||||||
<${Header}
|
|
||||||
topic=${topic} setTopic=${setTopic} url=${url}
|
|
||||||
setUrl=${setUrl} connected=${connected}
|
|
||||||
/>
|
|
||||||
<div class="flex grow overflow-auto">
|
|
||||||
<div class="w-60 overflow-auto">
|
|
||||||
<${Sidebar} devices=${devices} onclick=${onDeviceClick} />
|
|
||||||
<//>
|
|
||||||
<div class="grow bg-gray-200">
|
|
||||||
<${DeviceDashboard}
|
|
||||||
device=${getDeviceByID(currentDevID)} connected=${connected}
|
|
||||||
setDeviceConfig=${setDeviceConfig} publishFn=${handlePublish} />
|
|
||||||
<//>
|
|
||||||
<//>
|
|
||||||
<//>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
window.onload = () => render(h(App), document.body);
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#include "hal.h"
|
|
||||||
|
|
||||||
#define MAX_PIN_NO 144
|
|
||||||
|
|
||||||
// Mocked device pins
|
|
||||||
static bool s_pins[MAX_PIN_NO];
|
|
||||||
|
|
||||||
bool gpio_write(uint16_t pin, bool status) {
|
|
||||||
bool ok = false;
|
|
||||||
if (pin >= 0 && pin < MAX_PIN_NO) {
|
|
||||||
s_pins[pin] = status;
|
|
||||||
ok = true;
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool gpio_read(uint16_t pin) {
|
|
||||||
return (pin >= 0 && pin < MAX_PIN_NO) ? s_pins[pin] : false;
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "net.h"
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
// Handle interrupts, like Ctrl-C
|
|
||||||
static int s_signo;
|
|
||||||
static void signal_handler(int signo) {
|
|
||||||
s_signo = signo;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
struct mg_mgr mgr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// Parse command-line flags
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
if (strcmp(argv[i], "-u") == 0 && argv[i + 1] != NULL) {
|
|
||||||
g_mqtt_server_url = argv[++i];
|
|
||||||
} else if (strcmp(argv[i], "-i") == 0 && argv[i + 1] != NULL) {
|
|
||||||
g_device_id = strdup(argv[++i]);
|
|
||||||
} else if (strcmp(argv[i], "-t") == 0 && argv[i + 1] != NULL) {
|
|
||||||
g_root_topic = argv[++i];
|
|
||||||
} else if (strcmp(argv[i], "-v") == 0 && argv[i + 1] != NULL) {
|
|
||||||
mg_log_set(atoi(argv[++i]));
|
|
||||||
} else {
|
|
||||||
MG_ERROR(("Unknown option: %s. Usage:", argv[i]));
|
|
||||||
MG_ERROR(
|
|
||||||
("%s [-u mqtt://SERVER:PORT] [-i DEVICE_ID] [-t TOPIC_NAME] [-v "
|
|
||||||
"DEBUG_LEVEL]",
|
|
||||||
argv[0], argv[i]));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signal(SIGINT, signal_handler); // Setup signal handlers - exist event
|
|
||||||
signal(SIGTERM, signal_handler); // manager loop on SIGINT and SIGTERM
|
|
||||||
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set debug log level
|
|
||||||
mg_mgr_init(&mgr);
|
|
||||||
|
|
||||||
web_init(&mgr);
|
|
||||||
while (s_signo == 0) {
|
|
||||||
mg_mgr_poll(&mgr, 50);
|
|
||||||
}
|
|
||||||
|
|
||||||
web_free();
|
|
||||||
mg_mgr_free(&mgr);
|
|
||||||
MG_INFO(("Exiting on signal %d", s_signo));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,314 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
char *g_mqtt_server_url = MQTT_SERVER_URL;
|
|
||||||
char *g_root_topic = MQTT_ROOT_TOPIC;
|
|
||||||
char *g_device_id;
|
|
||||||
|
|
||||||
static uint8_t s_qos = 1; // MQTT QoS
|
|
||||||
static struct mg_connection *s_conn; // MQTT Client connection
|
|
||||||
static struct mg_rpc *s_rpc = NULL; // List of registered RPC methods
|
|
||||||
|
|
||||||
#define MAX_PINS 20
|
|
||||||
struct device_config {
|
|
||||||
int log_level; // Device logging level, 0-4
|
|
||||||
int pin_count; // Number of pins to handle
|
|
||||||
uint16_t pin_map[MAX_PINS]; // Pins to handle
|
|
||||||
bool pin_state[MAX_PINS]; // State of the GPIO pins
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct device_config s_device_config;
|
|
||||||
|
|
||||||
// Device ID generation function. Create an ID that is unique
|
|
||||||
// for a given device, and does not change between device restarts.
|
|
||||||
static void set_device_id(void) {
|
|
||||||
char buf[15] = "";
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
unsigned long serial = 0;
|
|
||||||
if (GetVolumeInformationA("c:\\", NULL, 0, &serial, NULL, NULL, NULL, 0)) {
|
|
||||||
mg_snprintf(buf, sizeof(buf), "%lx", serial);
|
|
||||||
}
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
FILE *fp = popen(
|
|
||||||
"ioreg -l | grep IOPlatformSerialNumber | cut -d'\"' -f4 | tr -d $'\n'",
|
|
||||||
"r");
|
|
||||||
if (fp != NULL) {
|
|
||||||
fread(buf, 1, sizeof(buf), fp);
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
#elif defined(__linux__)
|
|
||||||
struct mg_str id = mg_file_read(&mg_fs_posix, "/etc/machine-id");
|
|
||||||
if (id.buf != NULL) {
|
|
||||||
mg_snprintf(buf, sizeof(buf), "%s", id.buf);
|
|
||||||
free((void *) id.buf);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (buf[0] == '\0') mg_snprintf(buf, sizeof(buf), "%s", "MyDeviceID");
|
|
||||||
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
g_device_id = strdup(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_fw_status(void (*out)(char, void *), void *ptr,
|
|
||||||
va_list *ap) {
|
|
||||||
int fw = va_arg(*ap, int);
|
|
||||||
return mg_xprintf(out, ptr, "{%m:%d,%m:%c%lx%c,%m:%u,%m:%u}",
|
|
||||||
MG_ESC("status"), mg_ota_status(fw), MG_ESC("crc32"), '"',
|
|
||||||
mg_ota_crc32(fw), '"', MG_ESC("size"), mg_ota_size(fw),
|
|
||||||
MG_ESC("timestamp"), mg_ota_timestamp(fw));
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_shorts(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
uint16_t *array = va_arg(*ap, uint16_t *);
|
|
||||||
int i, len = 0, num_elems = va_arg(*ap, int);
|
|
||||||
for (i = 0; i < num_elems; i++) {
|
|
||||||
len += mg_xprintf(out, ptr, "%s%hu", i ? "," : "", array[i]);
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static size_t print_bools(void (*out)(char, void *), void *ptr, va_list *ap) {
|
|
||||||
bool *array = va_arg(*ap, bool *);
|
|
||||||
int i, len = 0, num_elems = va_arg(*ap, int);
|
|
||||||
for (i = 0; i < num_elems; i++) {
|
|
||||||
len += mg_xprintf(out, ptr, "%s%d", i ? "," : "", array[i]);
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void publish_status(struct mg_connection *c) {
|
|
||||||
char topic[100];
|
|
||||||
struct mg_mqtt_opts pub_opts;
|
|
||||||
struct mg_iobuf io = {0, 0, 0, 512};
|
|
||||||
|
|
||||||
// Print JSON notification into the io buffer
|
|
||||||
mg_xprintf(mg_pfn_iobuf, &io,
|
|
||||||
"{%m:%m,%m:{%m:%m,%m:%d,%m:%d,%m:[%M],%m:[%M],%m:%M,%m:%M}}", //
|
|
||||||
MG_ESC("method"), MG_ESC("status.notify"), MG_ESC("params"), //
|
|
||||||
MG_ESC("status"), MG_ESC("online"), //
|
|
||||||
MG_ESC(("log_level")), s_device_config.log_level, //
|
|
||||||
MG_ESC(("pin_count")), s_device_config.pin_count, //
|
|
||||||
MG_ESC(("pin_map")), print_shorts, s_device_config.pin_map,
|
|
||||||
s_device_config.pin_count, //
|
|
||||||
MG_ESC(("pin_state")), print_bools, s_device_config.pin_state,
|
|
||||||
s_device_config.pin_count, //
|
|
||||||
MG_ESC(("crnt_fw")), print_fw_status, MG_FIRMWARE_CURRENT, //
|
|
||||||
MG_ESC(("prev_fw")), print_fw_status, MG_FIRMWARE_PREVIOUS);
|
|
||||||
|
|
||||||
memset(&pub_opts, 0, sizeof(pub_opts));
|
|
||||||
mg_snprintf(topic, sizeof(topic), "%s/%s/status", g_root_topic, g_device_id);
|
|
||||||
pub_opts.topic = mg_str(topic);
|
|
||||||
pub_opts.message = mg_str_n((char *) io.buf, io.len);
|
|
||||||
pub_opts.qos = s_qos;
|
|
||||||
pub_opts.retain = true;
|
|
||||||
mg_mqtt_pub(c, &pub_opts);
|
|
||||||
mg_iobuf_free(&io);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void publish_response(struct mg_connection *c, char *buf, size_t len) {
|
|
||||||
struct mg_mqtt_opts pub_opts;
|
|
||||||
char topic[100];
|
|
||||||
mg_snprintf(topic, sizeof(topic), "%s/%s/tx", g_root_topic, g_device_id);
|
|
||||||
memset(&pub_opts, 0, sizeof(pub_opts));
|
|
||||||
pub_opts.topic = mg_str(topic);
|
|
||||||
pub_opts.message = mg_str_n(buf, len);
|
|
||||||
pub_opts.qos = s_qos;
|
|
||||||
mg_mqtt_pub(c, &pub_opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void subscribe(struct mg_connection *c) {
|
|
||||||
char *rx_topic = mg_mprintf("%s/%s/rx", g_root_topic, g_device_id);
|
|
||||||
struct mg_str subt = mg_str(rx_topic);
|
|
||||||
struct mg_mqtt_opts sub_opts;
|
|
||||||
memset(&sub_opts, 0, sizeof(sub_opts));
|
|
||||||
sub_opts.topic = subt;
|
|
||||||
sub_opts.qos = s_qos;
|
|
||||||
mg_mqtt_sub(c, &sub_opts);
|
|
||||||
MG_INFO(("%lu SUBSCRIBED to %.*s", c->id, (int) subt.len, subt.buf));
|
|
||||||
free(rx_topic);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rpc_config_set(struct mg_rpc_req *r) {
|
|
||||||
struct device_config dc = s_device_config;
|
|
||||||
dc.pin_count = (int) mg_json_get_long(r->frame, "$.params.pin_count", -1);
|
|
||||||
dc.log_level = (int) mg_json_get_long(r->frame, "$.params.log_level", -1);
|
|
||||||
|
|
||||||
if (dc.log_level < 0 || dc.log_level > MG_LL_VERBOSE) {
|
|
||||||
mg_rpc_err(r, -32602, "Log level must be from 0 to 4");
|
|
||||||
} else if (dc.pin_count <= 0 || dc.pin_count > MAX_PINS) {
|
|
||||||
mg_rpc_err(r, -32602, "Pin count must be from 1 to %d", MAX_PINS);
|
|
||||||
} else {
|
|
||||||
int i, val;
|
|
||||||
for (i = 0; i < dc.pin_count; i++) {
|
|
||||||
char path[50];
|
|
||||||
mg_snprintf(path, sizeof(path), "$.params.pin_map[%d]", i);
|
|
||||||
dc.pin_map[i] = (uint16_t) mg_json_get_long(r->frame, path, 0);
|
|
||||||
mg_snprintf(path, sizeof(path), "$.params.pin_state[%d]", i);
|
|
||||||
if ((val = (int) mg_json_get_long(r->frame, path, -1)) >= 0) {
|
|
||||||
gpio_write(dc.pin_map[i], val);
|
|
||||||
}
|
|
||||||
dc.pin_state[i] = gpio_read(dc.pin_map[i]);
|
|
||||||
// MG_INFO(("%d %d %d", i, dc.pin_map[i], dc.pin_state[i]));
|
|
||||||
}
|
|
||||||
mg_log_set(dc.log_level);
|
|
||||||
s_device_config = dc;
|
|
||||||
mg_rpc_ok(r, "true");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rpc_ota_commit(struct mg_rpc_req *r) {
|
|
||||||
if (mg_ota_commit()) {
|
|
||||||
mg_rpc_ok(r, "%m", MG_ESC("ok"));
|
|
||||||
} else {
|
|
||||||
mg_rpc_err(r, 1, "Failed to commit the firmware");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rpc_device_reset(struct mg_rpc_req *r) {
|
|
||||||
mg_rpc_ok(r, "%m", MG_ESC("ok"));
|
|
||||||
mg_timer_add(s_conn->mgr, 500, 0, (void (*)(void *)) mg_device_reset, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rpc_ota_rollback(struct mg_rpc_req *r) {
|
|
||||||
if (mg_ota_rollback()) {
|
|
||||||
mg_rpc_ok(r, "%m", MG_ESC("ok"));
|
|
||||||
} else {
|
|
||||||
mg_rpc_err(r, 1, "Failed to rollback to the previous firmware");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rpc_ota_upload(struct mg_rpc_req *r) {
|
|
||||||
long ofs = mg_json_get_long(r->frame, "$.params.offset", -1);
|
|
||||||
long tot = mg_json_get_long(r->frame, "$.params.total", -1);
|
|
||||||
int len = 0;
|
|
||||||
char *buf = mg_json_get_b64(r->frame, "$.params.chunk", &len);
|
|
||||||
if (buf == NULL) {
|
|
||||||
mg_rpc_err(r, 1, "Error processing the binary chunk.");
|
|
||||||
} else {
|
|
||||||
if (ofs < 0 || tot < 0) {
|
|
||||||
mg_rpc_err(r, 1, "offset and total not set");
|
|
||||||
} else if (ofs == 0 && mg_ota_begin((size_t) tot) == false) {
|
|
||||||
mg_rpc_err(r, 1, "mg_ota_begin(%ld) failed\n", tot);
|
|
||||||
} else if (len > 0 && mg_ota_write(buf, len) == false) {
|
|
||||||
mg_rpc_err(r, 1, "mg_ota_write(%lu) @%ld failed\n", len, ofs);
|
|
||||||
mg_ota_end();
|
|
||||||
} else if (len == 0 && mg_ota_end() == false) {
|
|
||||||
mg_rpc_err(r, 1, "mg_ota_end() failed\n", tot);
|
|
||||||
} else {
|
|
||||||
mg_rpc_ok(r, "%m", MG_ESC("ok"));
|
|
||||||
if (len == 0) { // Successful mg_ota_end() called, schedule device reboot
|
|
||||||
mg_timer_add(s_conn->mgr, 500, 0, (void (*)(void *)) mg_device_reset,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fn(struct mg_connection *c, int ev, void *ev_data) {
|
|
||||||
if (ev == MG_EV_OPEN) {
|
|
||||||
MG_INFO(("%lu CREATED", c->id));
|
|
||||||
// c->is_hexdumping = 1;
|
|
||||||
} else if (ev == MG_EV_CONNECT) {
|
|
||||||
MG_INFO(("Device %s is connected", g_device_id));
|
|
||||||
} else if (ev == MG_EV_ERROR) {
|
|
||||||
// On error, log error message
|
|
||||||
MG_ERROR(("%lu ERROR %s", c->id, (char *) ev_data));
|
|
||||||
} else if (ev == MG_EV_MQTT_OPEN) {
|
|
||||||
// MQTT connect is successful
|
|
||||||
MG_INFO(("%lu CONNECTED to %s", c->id, g_mqtt_server_url));
|
|
||||||
subscribe(c);
|
|
||||||
publish_status(c);
|
|
||||||
} else if (ev == MG_EV_MQTT_MSG) {
|
|
||||||
// When we get echo response, print it
|
|
||||||
struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
|
|
||||||
struct mg_iobuf io = {0, 0, 0, 512};
|
|
||||||
struct mg_rpc_req r = {&s_rpc, NULL, mg_pfn_iobuf,
|
|
||||||
&io, NULL, {mm->data.buf, mm->data.len}};
|
|
||||||
size_t clipped_len = mm->data.len > 512 ? 512 : mm->data.len;
|
|
||||||
MG_INFO(("%lu RECEIVED %.*s <- %.*s", c->id, clipped_len, mm->data.buf,
|
|
||||||
mm->topic.len, mm->topic.buf));
|
|
||||||
mg_rpc_process(&r);
|
|
||||||
if (io.buf) {
|
|
||||||
publish_response(c, (char *) io.buf, io.len);
|
|
||||||
publish_status(c);
|
|
||||||
}
|
|
||||||
mg_iobuf_free(&io);
|
|
||||||
} else if (ev == MG_EV_CLOSE) {
|
|
||||||
MG_INFO(("%lu CLOSED", c->id));
|
|
||||||
s_conn = NULL; // Mark that we're closed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timer function - recreate client connection if it is closed
|
|
||||||
static void timer_reconnect(void *arg) {
|
|
||||||
struct mg_mgr *mgr = (struct mg_mgr *) arg;
|
|
||||||
if (s_conn == NULL) {
|
|
||||||
struct mg_mqtt_opts opts;
|
|
||||||
char topic[100], message[100];
|
|
||||||
mg_snprintf(topic, sizeof(topic), "%s/%s/status", g_root_topic,
|
|
||||||
g_device_id);
|
|
||||||
mg_snprintf(message, sizeof(message), "{%m:%m,%m:{%m:%m}}",
|
|
||||||
MG_ESC("method"), MG_ESC("status.notify"), MG_ESC("params"),
|
|
||||||
MG_ESC("status"), MG_ESC("offline"));
|
|
||||||
memset(&opts, 0, sizeof(opts));
|
|
||||||
opts.clean = true;
|
|
||||||
opts.qos = s_qos;
|
|
||||||
opts.topic = mg_str(topic);
|
|
||||||
opts.version = 4;
|
|
||||||
opts.keepalive = MQTT_KEEPALIVE_SEC;
|
|
||||||
opts.retain = true;
|
|
||||||
opts.message = mg_str(message);
|
|
||||||
s_conn = mg_mqtt_connect(mgr, g_mqtt_server_url, &opts, fn, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_ping(void *arg) {
|
|
||||||
mg_mqtt_send_header(s_conn, MQTT_CMD_PINGREQ, 0, 0);
|
|
||||||
(void) arg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void timer_sntp(void *param) { // SNTP timer function. Sync up time
|
|
||||||
static uint64_t hourly_timer = 0;
|
|
||||||
uint64_t t1 = mg_now(), t2 = mg_millis();
|
|
||||||
if (t1 < t2 + 3600 || mg_timer_expired(&hourly_timer, 3600000, t2)) {
|
|
||||||
mg_sntp_connect(param, "udp://time.google.com:123", NULL, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void web_init(struct mg_mgr *mgr) {
|
|
||||||
int i, ping_interval_ms = MQTT_KEEPALIVE_SEC * 1000 - 500;
|
|
||||||
set_device_id();
|
|
||||||
s_device_config.log_level = (int) mg_log_level;
|
|
||||||
s_device_config.pin_count = 5;
|
|
||||||
s_device_config.pin_map[0] = 10;
|
|
||||||
s_device_config.pin_map[1] = 11;
|
|
||||||
s_device_config.pin_map[2] = 12;
|
|
||||||
s_device_config.pin_map[3] = 13;
|
|
||||||
s_device_config.pin_map[4] = 25;
|
|
||||||
for (i = 0; i < s_device_config.pin_count; i++) {
|
|
||||||
s_device_config.pin_state[i] = gpio_read(s_device_config.pin_map[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure JSON-RPC functions we're going to handle
|
|
||||||
mg_rpc_add(&s_rpc, mg_str("config.set"), rpc_config_set, NULL);
|
|
||||||
mg_rpc_add(&s_rpc, mg_str("ota.commit"), rpc_ota_commit, NULL);
|
|
||||||
mg_rpc_add(&s_rpc, mg_str("ota.rollback"), rpc_ota_rollback, NULL);
|
|
||||||
mg_rpc_add(&s_rpc, mg_str("ota.upload"), rpc_ota_upload, NULL);
|
|
||||||
mg_rpc_add(&s_rpc, mg_str("device.reset"), rpc_device_reset, NULL);
|
|
||||||
|
|
||||||
mg_timer_add(mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_reconnect,
|
|
||||||
mgr);
|
|
||||||
mg_timer_add(mgr, ping_interval_ms, MG_TIMER_REPEAT, timer_ping, mgr);
|
|
||||||
mg_timer_add(mgr, 2000, MG_TIMER_REPEAT, timer_sntp, mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void web_free(void) {
|
|
||||||
mg_rpc_del(&s_rpc, NULL); // Deallocate RPC handlers
|
|
||||||
free(g_device_id);
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MQTT_DASHBOARD 1
|
|
||||||
#define MQTT_KEEPALIVE_SEC 60
|
|
||||||
#define MQTT_SERVER_URL "mqtt://broker.hivemq.com:1883"
|
|
||||||
#define MQTT_ROOT_TOPIC "mg_mqtt_dashboard"
|
|
||||||
|
|
||||||
extern char *g_mqtt_server_url;
|
|
||||||
extern char *g_device_id;
|
|
||||||
extern char *g_root_topic;
|
|
||||||
|
|
||||||
void web_init(struct mg_mgr *mgr);
|
|
||||||
void web_free(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
CFLAGS = -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion
|
|
||||||
CFLAGS += -Wformat-truncation -fno-common # -Wconversion is not SDK-friendly
|
|
||||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
|
||||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include -Icmsis_mcu/devices/MCXN947/
|
|
||||||
CFLAGS += -Icmsis_mcu/devices/MCXN947/drivers
|
|
||||||
CFLAGS += -DCPU_MCXN947VDF -DCPU_MCXN947VDF_cm33 -DCPU_MCXN947VDF_cm33_core0
|
|
||||||
CFLAGS += -mcpu=cortex-m33 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 $(CFLAGS_EXTRA)
|
|
||||||
CFLAGS += -Wno-old-style-declaration -Wno-unused-parameter # due to NXP FSL code
|
|
||||||
|
|
||||||
LDSCRIPT = link.ld
|
|
||||||
LDFLAGS ?= -T$(LDSCRIPT) -nostdlib -nostartfiles --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
|
||||||
|
|
||||||
SOURCES = main.c hal.c
|
|
||||||
SOURCES += startup.c
|
|
||||||
SOURCES += cmsis_mcu/devices/MCXN947/drivers/fsl_clock.c cmsis_mcu/devices/MCXN947/drivers/fsl_spc.c cmsis_mcu/devices/MCXN947/drivers/fsl_common_arm.c # NXP support files
|
|
||||||
|
|
||||||
# Mongoose options are defined in mongoose_config.h
|
|
||||||
SOURCES += mongoose.c net.c packed_fs.c
|
|
||||||
|
|
||||||
# Example specific build options. See README.md
|
|
||||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\" -DHTTPS_URL=\"https://0.0.0.0/\"
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
RM = cmd /C del /Q /F /S
|
|
||||||
else
|
|
||||||
RM = rm -rf
|
|
||||||
endif
|
|
||||||
|
|
||||||
all build example: firmware.bin
|
|
||||||
|
|
||||||
firmware.bin: firmware.elf
|
|
||||||
arm-none-eabi-objcopy -O binary $< $@
|
|
||||||
|
|
||||||
firmware.elf: cmsis_core cmsis_mcu $(SOURCES) hal.h link.ld Makefile
|
|
||||||
arm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(LDFLAGS) -o $@
|
|
||||||
arm-none-eabi-size $@
|
|
||||||
|
|
||||||
cmsis_core: # ARM CMSIS core headers
|
|
||||||
git clone -q --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
|
||||||
cmsis_mcu:
|
|
||||||
wget -O $@.zip https://mcuxpresso.nxp.com/cmsis_pack/repo/NXP.MCXN947_DFP.17.0.0.pack
|
|
||||||
mkdir $@ && cd $@ && unzip -q ../$@.zip
|
|
||||||
clean:
|
|
||||||
$(RM) firmware.* *.su cmsis_core cmsis_mcu *.zip
|
|
||||||
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
|
||||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
|
||||||
s_ticks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
void mg_random(void *buf, size_t len) { // Use on-board RNG
|
|
||||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
|
||||||
uint32_t r = rng_read();
|
|
||||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
|
||||||
return s_ticks; // Return number of milliseconds since boot
|
|
||||||
}
|
|
||||||
|
|
||||||
void hal_init(void) {
|
|
||||||
clock_init(); // Set system clock to SYS_FREQUENCY
|
|
||||||
SystemCoreClock = SYS_FREQUENCY; // Update SystemCoreClock global var
|
|
||||||
SysTick_Config(SystemCoreClock / 1000); // Sys tick every 1ms
|
|
||||||
// rng_init(); // TRNG is part of ELS and there is no info on that
|
|
||||||
|
|
||||||
uart_init(UART_DEBUG, 115200); // Initialise UART
|
|
||||||
gpio_output(LED1); // Initialise LED1
|
|
||||||
gpio_write(LED1, 1);
|
|
||||||
gpio_output(LED2); // Initialise LED2
|
|
||||||
gpio_write(LED2, 1);
|
|
||||||
gpio_output(LED3); // Initialise LED3
|
|
||||||
gpio_write(LED3, 1);
|
|
||||||
ethernet_init(); // Initialise Ethernet pins
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__ARMCC_VERSION)
|
|
||||||
// Keil specific - implement IO printf redirection
|
|
||||||
int fputc(int c, FILE *stream) {
|
|
||||||
if (stream == stdout || stream == stderr) uart_write_byte(UART_DEBUG, c);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
// ARM GCC specific. ARM GCC is shipped with Newlib C library.
|
|
||||||
// Implement newlib syscalls:
|
|
||||||
// _sbrk() for malloc
|
|
||||||
// _write() for printf redirection
|
|
||||||
// the rest are just stubs
|
|
||||||
#include <sys/stat.h> // For _fstat()
|
|
||||||
|
|
||||||
#if !defined(__MCUXPRESSO)
|
|
||||||
uint32_t SystemCoreClock;
|
|
||||||
// evaluate your use of Secure/non-Secure and modify accordingly
|
|
||||||
void SystemInit(void) { // Called automatically by startup code
|
|
||||||
SCB->CPACR |=
|
|
||||||
#if 0
|
|
||||||
(3UL << 0 * 2) | (3UL << 1 * 2) | // Enable PowerQuad (CPO/CP1)
|
|
||||||
#endif
|
|
||||||
(3UL << 10 * 2) | (3UL << 11 * 2); // Enable FPU
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
SYSCON->LPCAC_CTRL &= ~SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK; // enable LPCAC
|
|
||||||
// Read TRM 36.1 and decide whether you really want to enable aGDET and dGDET
|
|
||||||
#if 1
|
|
||||||
// Disable aGDET and dGDET
|
|
||||||
ITRC0->OUT_SEL[4][0] =
|
|
||||||
(ITRC0->OUT_SEL[4][0] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn(0x2));
|
|
||||||
ITRC0->OUT_SEL[4][1] =
|
|
||||||
(ITRC0->OUT_SEL[4][1] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn(0x2));
|
|
||||||
SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK;
|
|
||||||
SPC0->GLITCH_DETECT_SC &= ~SPC_GLITCH_DETECT_SC_LOCK_MASK;
|
|
||||||
SPC0->GLITCH_DETECT_SC = 0x3C;
|
|
||||||
SPC0->GLITCH_DETECT_SC |= SPC_GLITCH_DETECT_SC_LOCK_MASK;
|
|
||||||
ITRC0->OUT_SEL[4][0] =
|
|
||||||
(ITRC0->OUT_SEL[4][0] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn(0x2));
|
|
||||||
ITRC0->OUT_SEL[4][1] =
|
|
||||||
(ITRC0->OUT_SEL[4][1] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn(0x2));
|
|
||||||
GDET0->GDET_ENABLE1 = 0;
|
|
||||||
GDET1->GDET_ENABLE1 = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int _fstat(int fd, struct stat *st) {
|
|
||||||
(void) fd, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(__MCUXPRESSO)
|
|
||||||
extern unsigned char _end[]; // End of data section, start of heap. See link.ld
|
|
||||||
static unsigned char *s_current_heap_end = _end;
|
|
||||||
|
|
||||||
size_t hal_ram_used(void) {
|
|
||||||
return (size_t) (s_current_heap_end - _end);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t hal_ram_free(void) {
|
|
||||||
unsigned char endofstack;
|
|
||||||
return (size_t) (&endofstack - s_current_heap_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *_sbrk(int incr) {
|
|
||||||
unsigned char *prev_heap;
|
|
||||||
unsigned char *heap_end = (unsigned char *) ((size_t) &heap_end - 256);
|
|
||||||
prev_heap = s_current_heap_end;
|
|
||||||
// Check how much space we got from the heap end to the stack end
|
|
||||||
if (s_current_heap_end + incr > heap_end) return (void *) -1;
|
|
||||||
s_current_heap_end += incr;
|
|
||||||
return prev_heap;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int _open(const char *path) {
|
|
||||||
(void) path;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _close(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _isatty(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _lseek(int fd, int ptr, int dir) {
|
|
||||||
(void) fd, (void) ptr, (void) dir;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _exit(int status) {
|
|
||||||
(void) status;
|
|
||||||
for (;;) asm volatile("BKPT #0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void _kill(int pid, int sig) {
|
|
||||||
(void) pid, (void) sig;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _getpid(void) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _write(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _read(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _link(const char *a, const char *b) {
|
|
||||||
(void) a, (void) b;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _unlink(const char *a) {
|
|
||||||
(void) a;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _stat(const char *path, struct stat *st) {
|
|
||||||
(void) path, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mkdir(const char *path, mode_t mode) {
|
|
||||||
(void) path, (void) mode;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _init(void) {
|
|
||||||
}
|
|
||||||
#endif // __GNUC__
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LED1 PIN(0, 10)
|
|
||||||
#define LED2 PIN(0, 27)
|
|
||||||
#define LED3 PIN(1, 2)
|
|
||||||
|
|
||||||
#ifndef UART_DEBUG
|
|
||||||
#define UART_DEBUG LPUART4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "MCXN947_cm33_core0.h"
|
|
||||||
|
|
||||||
#define BIT(x) (1UL << (x))
|
|
||||||
#define CLRSET(reg, clear, set) ((reg) = ((reg) & ~(clear)) | (set))
|
|
||||||
#define PIN(bank, num) ((bank << 8) | (num))
|
|
||||||
#define PINNO(pin) (pin & 255)
|
|
||||||
#define PINBANK(pin) (pin >> 8)
|
|
||||||
|
|
||||||
void hal_init(void);
|
|
||||||
size_t hal_ram_free(void);
|
|
||||||
size_t hal_ram_used(void);
|
|
||||||
|
|
||||||
static inline void spin(volatile uint32_t count) {
|
|
||||||
while (count--) (void) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SYS_FREQUENCY 150000000UL
|
|
||||||
|
|
||||||
enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT };
|
|
||||||
enum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN };
|
|
||||||
enum { GPIO_SPEED_LOW, GPIO_SPEED_HIGH };
|
|
||||||
enum { GPIO_PULL_NONE, GPIO_PULL_DOWN, GPIO_PULL_UP };
|
|
||||||
static inline GPIO_Type *gpio_bank(uint16_t pin) {
|
|
||||||
static GPIO_Type *const g[] = GPIO_BASE_PTRS;
|
|
||||||
return g[PINBANK(pin)];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,
|
|
||||||
uint8_t speed, uint8_t pull, uint8_t af) {
|
|
||||||
static PORT_Type *const p[] = PORT_BASE_PTRS;
|
|
||||||
PORT_Type *port = p[PINBANK(pin)];
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
uint32_t mask = (uint32_t) BIT(PINNO(pin));
|
|
||||||
bool dopull = pull > 0;
|
|
||||||
if (dopull) --pull;
|
|
||||||
if (gpio != GPIO5) {
|
|
||||||
SYSCON->AHBCLKCTRL0 |=
|
|
||||||
(1 << (SYSCON_AHBCLKCTRL0_GPIO0_SHIFT + PINBANK(pin))) |
|
|
||||||
(1 << (SYSCON_AHBCLKCTRL0_PORT0_SHIFT + PINBANK(pin)));
|
|
||||||
};
|
|
||||||
port->PCR[PINNO(pin)] = PORT_PCR_IBE(1) | PORT_PCR_MUX(af) | PORT_PCR_DSE(1) |
|
|
||||||
PORT_PCR_ODE(type) |
|
|
||||||
PORT_PCR_SRE(speed != GPIO_SPEED_HIGH) |
|
|
||||||
PORT_PCR_PE(dopull) | PORT_PCR_PS(pull);
|
|
||||||
gpio->ICR[PINNO(pin)] = GPIO_ICR_ISF_MASK;
|
|
||||||
if (mode == GPIO_MODE_INPUT) {
|
|
||||||
gpio->PDDR &= ~mask;
|
|
||||||
} else {
|
|
||||||
gpio->PDDR |= mask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_input(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0);
|
|
||||||
}
|
|
||||||
static inline void gpio_output(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool gpio_read(uint16_t pin) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
return gpio->PDR[PINNO(pin)];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_write(uint16_t pin, bool value) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
if (value) {
|
|
||||||
gpio->PDR[PINNO(pin)] = 1;
|
|
||||||
} else {
|
|
||||||
gpio->PDR[PINNO(pin)] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_toggle(uint16_t pin) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
uint32_t mask = (uint32_t) BIT(PINNO(pin));
|
|
||||||
gpio->PTOR = mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
// MCU-Link UART (P1_9/8; FC4_P1/0)
|
|
||||||
// Arduino J1_2/4 UART (P4_3/2; FC2_P3/2)
|
|
||||||
// 33.3.23 LP_FLEXCOMM clocking
|
|
||||||
// 66.2.4 LP_FLEXCOMM init
|
|
||||||
// 66.5 LPUART
|
|
||||||
static inline void uart_init(LPUART_Type *uart, unsigned long baud) {
|
|
||||||
static LP_FLEXCOMM_Type *const f[] = LP_FLEXCOMM_BASE_PTRS;
|
|
||||||
uint8_t af = 2, fc = 0; // Alternate function, FlexComm instance
|
|
||||||
uint16_t pr = 0, pt = 0; // pins
|
|
||||||
uint32_t freq = 12000000; // fro_12_m
|
|
||||||
if (uart == LPUART2) fc = 2, pt = PIN(4, 3), pr = PIN(4, 2);
|
|
||||||
if (uart == LPUART4) fc = 4, pt = PIN(1, 9), pr = PIN(1, 8);
|
|
||||||
|
|
||||||
SYSCON->AHBCLKCTRL1 |= (1 << (SYSCON_AHBCLKCTRL1_FC0_SHIFT + fc));
|
|
||||||
SYSCON->PRESETCTRL1 |= (1 << (SYSCON_PRESETCTRL1_FC0_RST_SHIFT + fc));
|
|
||||||
SYSCON->PRESETCTRL1 &= ~(1 << (SYSCON_PRESETCTRL1_FC0_RST_SHIFT + fc));
|
|
||||||
SYSCON->FCCLKSEL[fc] = SYSCON_FCCLKSEL_SEL(2); // clock from FRO_12M / 1
|
|
||||||
SYSCON->FLEXCOMMCLKDIV[fc] = SYSCON_FLEXCOMMXCLKDIV_FLEXCOMMCLKDIV_DIV(0);
|
|
||||||
LP_FLEXCOMM_Type *flexcomm = f[fc];
|
|
||||||
flexcomm->PSELID = LP_FLEXCOMM_PSELID_PERSEL(1); // configure as UART
|
|
||||||
gpio_init(pt, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_UP, af);
|
|
||||||
gpio_init(pr, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_UP, af);
|
|
||||||
|
|
||||||
uart->GLOBAL |= LPUART_GLOBAL_RST_MASK; // reset, CTRL = 0, defaults
|
|
||||||
uart->GLOBAL &= ~LPUART_GLOBAL_RST_MASK;
|
|
||||||
// use a weird oversample ratio of 26x to fit specs, standard 16x won't do
|
|
||||||
CLRSET(uart->BAUD,
|
|
||||||
LPUART_BAUD_OSR_MASK | LPUART_BAUD_SBR_MASK | LPUART_BAUD_SBNS_MASK,
|
|
||||||
LPUART_BAUD_OSR(26 - 1) | LPUART_BAUD_SBR(freq / (26 * baud)));
|
|
||||||
CLRSET(uart->CTRL,
|
|
||||||
LPUART_CTRL_PE_MASK | LPUART_CTRL_M_MASK | LPUART_CTRL_ILT_MASK |
|
|
||||||
LPUART_CTRL_IDLECFG_MASK,
|
|
||||||
LPUART_CTRL_IDLECFG(1) | LPUART_CTRL_ILT(1) |
|
|
||||||
LPUART_BAUD_SBNS(0)); // no parity, idle 2 chars after 1 stop bit
|
|
||||||
uart->CTRL |= LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uart_write_byte(LPUART_Type *uart, uint8_t byte) {
|
|
||||||
uart->DATA = byte;
|
|
||||||
while ((uart->STAT & LPUART_STAT_TDRE_MASK) == 0) spin(1);
|
|
||||||
}
|
|
||||||
static inline void uart_write_buf(LPUART_Type *uart, char *buf, size_t len) {
|
|
||||||
while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void rng_init(void) {
|
|
||||||
}
|
|
||||||
static inline uint32_t rng_read(void) {
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - PHY and MAC clocked via a 50MHz oscillator, P1_4 (ENET0_TXCLK)
|
|
||||||
// - 33.3.30 ENET clocking
|
|
||||||
// - SMI clocked from AHB module clock (CSR)
|
|
||||||
// - PHY RST connected to P5_8
|
|
||||||
// - PHY RXD0,1,DV = 1 on RST enable autonegotiation, no hw pull-ups
|
|
||||||
static inline void ethernet_init(void) {
|
|
||||||
// '0' in clk_rmii, set for RMII mode
|
|
||||||
SYSCON->ENETRMIICLKSEL = SYSCON_ENETRMIICLKSEL_SEL(0);
|
|
||||||
SYSCON->ENETRMIICLKDIV = SYSCON_ENETRMIICLKDIV_DIV(0);
|
|
||||||
SYSCON->AHBCLKCTRL2 |= SYSCON_AHBCLKCTRL2_ENET_MASK; // enable bus clk
|
|
||||||
SYSCON0->PRESETCTRL2 = SYSCON_PRESETCTRL2_ENET_RST_MASK; // reset MAC
|
|
||||||
SYSCON0->PRESETCTRL2 &= ~SYSCON_PRESETCTRL2_ENET_RST_MASK; // then set RMII
|
|
||||||
SYSCON0->ENET_PHY_INTF_SEL |= SYSCON_ENET_PHY_INTF_SEL_PHY_SEL_MASK;
|
|
||||||
gpio_init(PIN(5, 8), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0); // set P5_8 as GPIO (PHY \RST)
|
|
||||||
gpio_write(PIN(5, 8), 0); // reset PHY
|
|
||||||
gpio_init(PIN(1, 4), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_4 as ENET0_TXCLK
|
|
||||||
gpio_init(PIN(1, 5), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_5 as ENET0_TXEN
|
|
||||||
gpio_init(PIN(1, 6), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_6 as ENET0_TXD0
|
|
||||||
gpio_init(PIN(1, 7), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_7 as ENET0_TXD1
|
|
||||||
gpio_init(PIN(1, 13), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_13 as ENET0_RXDV
|
|
||||||
gpio_init(PIN(1, 14), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_14 as ENET0_RXD0
|
|
||||||
gpio_init(PIN(1, 15), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_15 as ENET0_RXD1
|
|
||||||
gpio_init(PIN(1, 20), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_20 as ENET0_MDC
|
|
||||||
gpio_init(PIN(1, 21), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_21 as ENET0_MDIO
|
|
||||||
spin(10000); // keep PHY RST low for a while
|
|
||||||
gpio_write(PIN(5, 8), 1); // deassert RST
|
|
||||||
NVIC_EnableIRQ(ETHERNET_IRQn); // Setup Ethernet IRQ handler
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "fsl_clock.h"
|
|
||||||
#include "fsl_spc.h"
|
|
||||||
|
|
||||||
// 33.2 Figure 127 SCG main clock
|
|
||||||
static inline void clock_init(void) {
|
|
||||||
SYSCON->AHBCLKCTRL2 |= SYSCON_AHBCLKCTRL2_SCG_MASK; // enable SCG clk
|
|
||||||
CLRSET(SCG0->RCCR, SCG_CSR_SCS_MASK, SCG_CSR_SCS(2)); // clock main_clock
|
|
||||||
spc_active_mode_dcdc_option_t dcdc = {
|
|
||||||
.DCDCVoltage = kSPC_DCDC_OverdriveVoltage,
|
|
||||||
.DCDCDriveStrength = kSPC_DCDC_NormalDriveStrength};
|
|
||||||
SPC_SetActiveModeDCDCRegulatorConfig(SPC0, &dcdc); // Set DCDC to 1.2 V
|
|
||||||
spc_active_mode_core_ldo_option_t ldo = {
|
|
||||||
.CoreLDOVoltage = kSPC_CoreLDO_OverDriveVoltage,
|
|
||||||
.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength};
|
|
||||||
SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldo); // Set LDO_CORE to 1.2 V
|
|
||||||
CLRSET(FMU0->FCTRL, FMU_FCTRL_RWSC_MASK, FMU_FCTRL_RWSC(3)); // Set Flash WS
|
|
||||||
spc_sram_voltage_config_t sram = {.operateVoltage = kSPC_sramOperateAt1P2V,
|
|
||||||
.requestVoltageUpdate = true};
|
|
||||||
SPC_SetSRAMOperateVoltage(SPC0, &sram); // Set SRAM timing for 1.2V
|
|
||||||
CLOCK_SetupFROHFClocking(48000000U); // Enable FRO HF
|
|
||||||
const pll_setup_t pll0 = {.pllctrl = SCG_APLLCTRL_SOURCE(1U) |
|
|
||||||
SCG_APLLCTRL_SELI(27U) |
|
|
||||||
SCG_APLLCTRL_SELP(13U),
|
|
||||||
.pllndiv = SCG_APLLNDIV_NDIV(8U),
|
|
||||||
.pllpdiv = SCG_APLLPDIV_PDIV(1U),
|
|
||||||
.pllmdiv = SCG_APLLMDIV_MDIV(50U),
|
|
||||||
.pllRate = 150000000U};
|
|
||||||
CLOCK_SetPLL0Freq(&pll0); // Setup PLL0 (APLL),
|
|
||||||
CLOCK_SetPll0MonitorMode(0); // disable monitor mode
|
|
||||||
CLRSET(SCG0->RCCR, SCG_CSR_SCS_MASK, SCG_CSR_SCS(5)); // clock main_clock
|
|
||||||
SYSCON->AHBCLKDIV = SYSCON_AHBCLKDIV_DIV(0); // /1
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
OUTPUT_FORMAT("elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(Reset_Handler)
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash(RX) : ORIGIN = 0x0, LENGTH = 0x100000
|
|
||||||
flash2(RX) : ORIGIN = 0x100000, LENGTH = 0x100000
|
|
||||||
sram(!RX) : ORIGIN = 0x20000000, LENGTH = 0x60000
|
|
||||||
}
|
|
||||||
|
|
||||||
_estack = ORIGIN(sram) + LENGTH(sram);
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.vectors : { FILL(256) KEEP(*(.isr_vector)) } > flash
|
|
||||||
.text : { *(.text*) } > flash
|
|
||||||
.data : {
|
|
||||||
_sdata = .;
|
|
||||||
*(.first_data)
|
|
||||||
*(.data SORT(.data.*))
|
|
||||||
_edata = .;
|
|
||||||
} > sram AT > flash
|
|
||||||
_sidata = LOADADDR(.data);
|
|
||||||
|
|
||||||
.bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
_end = .;
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define BLINK_PERIOD_MS 1000
|
|
||||||
|
|
||||||
static void timer_fn(void *arg) {
|
|
||||||
gpio_toggle(LED1); // Blink LED
|
|
||||||
(void) arg; // Unused
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
struct mg_mgr mgr; // Mongoose event manager
|
|
||||||
|
|
||||||
hal_init(); // Cross-platform hardware init
|
|
||||||
|
|
||||||
mg_mgr_init(&mgr); // Initialise it
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level to debug
|
|
||||||
mg_timer_add(&mgr, BLINK_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mgr);
|
|
||||||
|
|
||||||
MG_INFO(("Initialising application..."));
|
|
||||||
web_init(&mgr);
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
mg_mgr_poll(&mgr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
// See https://mongoose.ws/documentation/#build-options
|
|
||||||
#define MG_ARCH MG_ARCH_NEWLIB
|
|
||||||
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
|
||||||
#define MG_ENABLE_DRIVER_MCXN 1
|
|
||||||
#define MG_ENABLE_CUSTOM_MILLIS 1
|
|
||||||
//#define MG_ENABLE_CUSTOM_RANDOM 1
|
|
||||||
#define MG_ENABLE_PACKED_FS 1
|
|
||||||
|
|
||||||
// For static IP configuration, define MG_TCPIP_{IP,MASK,GW}
|
|
||||||
// By default, those are set to zero, meaning that DHCP is used
|
|
||||||
//
|
|
||||||
// #define MG_TCPIP_IP MG_IPV4(192, 168, 1, 10)
|
|
||||||
// #define MG_TCPIP_GW MG_IPV4(192, 168, 1, 1)
|
|
||||||
// #define MG_TCPIP_MASK MG_IPV4(255, 255, 255, 0)
|
|
||||||
|
|
||||||
// Set custom MAC address. By default, it is randomly generated
|
|
||||||
// Using a build-time constant:
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) do { uint8_t buf_[6] = {2,3,4,5,6,7}; memmove(mac, buf_, sizeof(buf_)); } while (0)
|
|
||||||
//
|
|
||||||
// Using custom function:
|
|
||||||
// extern void my_function(unsigned char *mac);
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) my_function(mac)
|
|
||||||
@@ -1,411 +0,0 @@
|
|||||||
#include "MCXN947_cm33_core0.h"
|
|
||||||
|
|
||||||
void Reset_Handler(void); // Defined below
|
|
||||||
void Dummy_Handler(void); // Defined below
|
|
||||||
void SysTick_Handler(void); // Defined in main.c
|
|
||||||
void SystemInit(void); // Defined in main.c, called by reset handler
|
|
||||||
void _estack(void); // Defined in link.ld
|
|
||||||
|
|
||||||
#define WEAK_ALIAS __attribute__((weak, alias("Default_Handler")))
|
|
||||||
|
|
||||||
WEAK_ALIAS void NMI_Handler(void);
|
|
||||||
WEAK_ALIAS void HardFault_Handler(void);
|
|
||||||
WEAK_ALIAS void MemManage_Handler(void);
|
|
||||||
WEAK_ALIAS void BusFault_Handler(void);
|
|
||||||
WEAK_ALIAS void UsageFault_Handler(void);
|
|
||||||
WEAK_ALIAS void SecureFault_Handler(void);
|
|
||||||
WEAK_ALIAS void DebugMon_Handler(void);
|
|
||||||
WEAK_ALIAS void SVC_Handler(void);
|
|
||||||
WEAK_ALIAS void PendSV_Handler(void);
|
|
||||||
WEAK_ALIAS void SysTick_Handler(void);
|
|
||||||
|
|
||||||
WEAK_ALIAS void OR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH12_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH13_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH14_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH15_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO00_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO01_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO20_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO21_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO30_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO31_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO40_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO41_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO50_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO51_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void UTICK0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void MRT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SCT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ADC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ADC1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PINT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PDM_EVENT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved65_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB0_FS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB0_DCD_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void RTC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SMARTDMA_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void MAILBOX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void OS_EVENT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXSPI0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SAI0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SAI1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USDHC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CAN0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CAN1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved80_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved81_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB1_HS_PHY_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB1_HS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SEC_HYPERVISOR_CALL_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved85_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PLU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Freqme_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SEC_VIO_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ELS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PKC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PUF_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PQ_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH12_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH13_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH14_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH15_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CDOG0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CDOG1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void I3C0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void I3C1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void NPU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GDET_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void VBAT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EWM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TSI_END_OF_SCAN_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TSI_OUT_OF_SCAN_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EMVSIM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EMVSIM1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXIO_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_RELOAD_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_FAULT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_RELOAD_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_FAULT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_COMPARE_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_HOME_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_WDG_SAB_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_IDX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_COMPARE_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_HOME_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_WDG_SAB_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_IDX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ITRC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void BSP32_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ELS_ERR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PKC_ERR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ERM_SINGLE_BIT_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ERM_MULTI_BIT_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FMU0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_PMT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_MACLP_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SINC_FILTER_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LPTMR0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LPTMR1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SCG_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SPC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WUU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PORT_EFT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETB0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SM3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TRNG0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WWDT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WWDT1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CMC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTI0_IRQHandler(void);
|
|
||||||
|
|
||||||
__attribute__((section(".vectors"))) void (*const tab[16 + 156])(void) = {
|
|
||||||
_estack, Reset_Handler,
|
|
||||||
NMI_Handler, // NMI Handler
|
|
||||||
HardFault_Handler, // Hard Fault Handler
|
|
||||||
MemManage_Handler, // MPU Fault Handler
|
|
||||||
BusFault_Handler, // Bus Fault Handler
|
|
||||||
UsageFault_Handler, // Usage Fault Handler
|
|
||||||
SecureFault_Handler, // Secure Fault Handler
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
SVC_Handler, // SVCall Handler
|
|
||||||
DebugMon_Handler, // Debug Monitor Handler
|
|
||||||
0, // Reserved
|
|
||||||
PendSV_Handler, // PendSV Handler
|
|
||||||
SysTick_Handler, // SysTick Handler
|
|
||||||
// Chip Level - MCXN947_cm33_core0
|
|
||||||
OR_IRQHandler, // 16 : OR IRQ
|
|
||||||
EDMA_0_CH0_IRQHandler, // 17 : eDMA_0_CH0 error or transfer complete
|
|
||||||
EDMA_0_CH1_IRQHandler, // 18 : eDMA_0_CH1 error or transfer complete
|
|
||||||
EDMA_0_CH2_IRQHandler, // 19 : eDMA_0_CH2 error or transfer complete
|
|
||||||
EDMA_0_CH3_IRQHandler, // 20 : eDMA_0_CH3 error or transfer complete
|
|
||||||
EDMA_0_CH4_IRQHandler, // 21 : eDMA_0_CH4 error or transfer complete
|
|
||||||
EDMA_0_CH5_IRQHandler, // 22 : eDMA_0_CH5 error or transfer complete
|
|
||||||
EDMA_0_CH6_IRQHandler, // 23 : eDMA_0_CH6 error or transfer complete
|
|
||||||
EDMA_0_CH7_IRQHandler, // 24 : eDMA_0_CH7 error or transfer complete
|
|
||||||
EDMA_0_CH8_IRQHandler, // 25 : eDMA_0_CH8 error or transfer complete
|
|
||||||
EDMA_0_CH9_IRQHandler, // 26 : eDMA_0_CH9 error or transfer complete
|
|
||||||
EDMA_0_CH10_IRQHandler, // 27 : eDMA_0_CH10 error or transfer complete
|
|
||||||
EDMA_0_CH11_IRQHandler, // 28 : eDMA_0_CH11 error or transfer complete
|
|
||||||
EDMA_0_CH12_IRQHandler, // 29 : eDMA_0_CH12 error or transfer complete
|
|
||||||
EDMA_0_CH13_IRQHandler, // 30 : eDMA_0_CH13 error or transfer complete
|
|
||||||
EDMA_0_CH14_IRQHandler, // 31 : eDMA_0_CH14 error or transfer complete
|
|
||||||
EDMA_0_CH15_IRQHandler, // 32 : eDMA_0_CH15 error or transfer complete
|
|
||||||
GPIO00_IRQHandler, // 33 : GPIO0 interrupt 0
|
|
||||||
GPIO01_IRQHandler, // 34 : GPIO0 interrupt 1
|
|
||||||
GPIO10_IRQHandler, // 35 : GPIO1 interrupt 0
|
|
||||||
GPIO11_IRQHandler, // 36 : GPIO1 interrupt 1
|
|
||||||
GPIO20_IRQHandler, // 37 : GPIO2 interrupt 0
|
|
||||||
GPIO21_IRQHandler, // 38 : GPIO2 interrupt 1
|
|
||||||
GPIO30_IRQHandler, // 39 : GPIO3 interrupt 0
|
|
||||||
GPIO31_IRQHandler, // 40 : GPIO3 interrupt 1
|
|
||||||
GPIO40_IRQHandler, // 41 : GPIO4 interrupt 0
|
|
||||||
GPIO41_IRQHandler, // 42 : GPIO4 interrupt 1
|
|
||||||
GPIO50_IRQHandler, // 43 : GPIO5 interrupt 0
|
|
||||||
GPIO51_IRQHandler, // 44 : GPIO5 interrupt 1
|
|
||||||
UTICK0_IRQHandler, // 45 : Micro-Tick Timer interrupt
|
|
||||||
MRT0_IRQHandler, // 46 : Multi-Rate Timer interrupt
|
|
||||||
CTIMER0_IRQHandler, // 47 : Standard counter/timer 0 interrupt
|
|
||||||
CTIMER1_IRQHandler, // 48 : Standard counter/timer 1 interrupt
|
|
||||||
SCT0_IRQHandler, // 49 : SCTimer/PWM interrupt
|
|
||||||
CTIMER2_IRQHandler, // 50 : Standard counter/timer 2 interrupt
|
|
||||||
LP_FLEXCOMM0_IRQHandler, // 51 : LP_FLEXCOMM0 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM1_IRQHandler, // 52 : LP_FLEXCOMM1 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM2_IRQHandler, // 53 : LP_FLEXCOMM2 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM3_IRQHandler, // 54 : LP_FLEXCOMM3 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM4_IRQHandler, // 55 : LP_FLEXCOMM4 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM5_IRQHandler, // 56 : LP_FLEXCOMM5 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM6_IRQHandler, // 57 : LP_FLEXCOMM6 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM7_IRQHandler, // 58 : LP_FLEXCOMM7 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM8_IRQHandler, // 59 : LP_FLEXCOMM8 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM9_IRQHandler, // 60 : LP_FLEXCOMM9 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
ADC0_IRQHandler, // 61 : Analog-to-Digital Converter 0 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
ADC1_IRQHandler, // 62 : Analog-to-Digital Converter 1 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
PINT0_IRQHandler, // 63 : Pin Interrupt Pattern Match Interrupt
|
|
||||||
PDM_EVENT_IRQHandler, // 64 : Microphone Interface interrupt
|
|
||||||
Reserved65_IRQHandler, // 65 : Reserved interrupt
|
|
||||||
USB0_FS_IRQHandler, // 66 : Universal Serial Bus - Full Speed interrupt
|
|
||||||
USB0_DCD_IRQHandler, // 67 : Universal Serial Bus - Device Charge Detect
|
|
||||||
// interrupt
|
|
||||||
RTC_IRQHandler, // 68 : RTC Subsystem interrupt (RTC interrupt or Wake
|
|
||||||
// timer interrupt)
|
|
||||||
SMARTDMA_IRQHandler, // 69 : SmartDMA_IRQ
|
|
||||||
MAILBOX_IRQHandler, // 70 : Inter-CPU Mailbox interrupt0 for CPU0 Inter-CPU
|
|
||||||
// Mailbox interrupt1 for CPU1
|
|
||||||
CTIMER3_IRQHandler, // 71 : Standard counter/timer 3 interrupt
|
|
||||||
CTIMER4_IRQHandler, // 72 : Standard counter/timer 4 interrupt
|
|
||||||
OS_EVENT_IRQHandler, // 73 : OS event timer interrupt
|
|
||||||
FLEXSPI0_IRQHandler, // 74 : Flexible Serial Peripheral Interface interrupt
|
|
||||||
SAI0_IRQHandler, // 75 : Serial Audio Interface 0 interrupt
|
|
||||||
SAI1_IRQHandler, // 76 : Serial Audio Interface 1 interrupt
|
|
||||||
USDHC0_IRQHandler, // 77 : Ultra Secured Digital Host Controller interrupt
|
|
||||||
CAN0_IRQHandler, // 78 : Controller Area Network 0 interrupt
|
|
||||||
CAN1_IRQHandler, // 79 : Controller Area Network 1 interrupt
|
|
||||||
Reserved80_IRQHandler, // 80 : Reserved interrupt
|
|
||||||
Reserved81_IRQHandler, // 81 : Reserved interrupt
|
|
||||||
USB1_HS_PHY_IRQHandler, // 82 : USBHS DCD or USBHS Phy interrupt
|
|
||||||
USB1_HS_IRQHandler, // 83 : USB High Speed OTG Controller interrupt
|
|
||||||
SEC_HYPERVISOR_CALL_IRQHandler, // 84 : AHB Secure Controller hypervisor
|
|
||||||
// call interrupt
|
|
||||||
Reserved85_IRQHandler, // 85 : Reserved interrupt
|
|
||||||
PLU_IRQHandler, // 86 : Programmable Logic Unit interrupt
|
|
||||||
Freqme_IRQHandler, // 87 : Frequency Measurement interrupt
|
|
||||||
SEC_VIO_IRQHandler, // 88 : Secure violation interrupt (Memory Block
|
|
||||||
// Checker interrupt or secure AHB matrix violation
|
|
||||||
// interrupt)
|
|
||||||
ELS_IRQHandler, // 89 : ELS interrupt
|
|
||||||
PKC_IRQHandler, // 90 : PKC interrupt
|
|
||||||
PUF_IRQHandler, // 91 : Physical Unclonable Function interrupt
|
|
||||||
PQ_IRQHandler, // 92 : Power Quad interrupt
|
|
||||||
EDMA_1_CH0_IRQHandler, // 93 : eDMA_1_CH0 error or transfer complete
|
|
||||||
EDMA_1_CH1_IRQHandler, // 94 : eDMA_1_CH1 error or transfer complete
|
|
||||||
EDMA_1_CH2_IRQHandler, // 95 : eDMA_1_CH2 error or transfer complete
|
|
||||||
EDMA_1_CH3_IRQHandler, // 96 : eDMA_1_CH3 error or transfer complete
|
|
||||||
EDMA_1_CH4_IRQHandler, // 97 : eDMA_1_CH4 error or transfer complete
|
|
||||||
EDMA_1_CH5_IRQHandler, // 98 : eDMA_1_CH5 error or transfer complete
|
|
||||||
EDMA_1_CH6_IRQHandler, // 99 : eDMA_1_CH6 error or transfer complete
|
|
||||||
EDMA_1_CH7_IRQHandler, // 100: eDMA_1_CH7 error or transfer complete
|
|
||||||
EDMA_1_CH8_IRQHandler, // 101: eDMA_1_CH8 error or transfer complete
|
|
||||||
EDMA_1_CH9_IRQHandler, // 102: eDMA_1_CH9 error or transfer complete
|
|
||||||
EDMA_1_CH10_IRQHandler, // 103: eDMA_1_CH10 error or transfer complete
|
|
||||||
EDMA_1_CH11_IRQHandler, // 104: eDMA_1_CH11 error or transfer complete
|
|
||||||
EDMA_1_CH12_IRQHandler, // 105: eDMA_1_CH12 error or transfer complete
|
|
||||||
EDMA_1_CH13_IRQHandler, // 106: eDMA_1_CH13 error or transfer complete
|
|
||||||
EDMA_1_CH14_IRQHandler, // 107: eDMA_1_CH14 error or transfer complete
|
|
||||||
EDMA_1_CH15_IRQHandler, // 108: eDMA_1_CH15 error or transfer complete
|
|
||||||
CDOG0_IRQHandler, // 109: Code Watchdog Timer 0 interrupt
|
|
||||||
CDOG1_IRQHandler, // 110: Code Watchdog Timer 1 interrupt
|
|
||||||
I3C0_IRQHandler, // 111: Improved Inter Integrated Circuit interrupt 0
|
|
||||||
I3C1_IRQHandler, // 112: Improved Inter Integrated Circuit interrupt 1
|
|
||||||
NPU_IRQHandler, // 113: NPU interrupt
|
|
||||||
GDET_IRQHandler, // 114: Digital Glitch Detect 0 interrupt or Digital
|
|
||||||
// Glitch Detect 1 interrupt
|
|
||||||
VBAT0_IRQHandler, // 115: VBAT interrupt( VBAT interrupt or digital tamper
|
|
||||||
// interrupt)
|
|
||||||
EWM0_IRQHandler, // 116: External Watchdog Monitor interrupt
|
|
||||||
TSI_END_OF_SCAN_IRQHandler, // 117: TSI End of Scan interrupt
|
|
||||||
TSI_OUT_OF_SCAN_IRQHandler, // 118: TSI Out of Scan interrupt
|
|
||||||
EMVSIM0_IRQHandler, // 119: EMVSIM0 interrupt
|
|
||||||
EMVSIM1_IRQHandler, // 120: EMVSIM1 interrupt
|
|
||||||
FLEXIO_IRQHandler, // 121: Flexible Input/Output interrupt
|
|
||||||
DAC0_IRQHandler, // 122: Digital-to-Analog Converter 0 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
DAC1_IRQHandler, // 123: Digital-to-Analog Converter 1 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
DAC2_IRQHandler, // 124: 14-bit Digital-to-Analog Converter interrupt
|
|
||||||
HSCMP0_IRQHandler, // 125: High-Speed comparator0 interrupt
|
|
||||||
HSCMP1_IRQHandler, // 126: High-Speed comparator1 interrupt
|
|
||||||
HSCMP2_IRQHandler, // 127: High-Speed comparator2 interrupt
|
|
||||||
FLEXPWM0_RELOAD_ERROR_IRQHandler, // 128: FlexPWM0_reload_error interrupt
|
|
||||||
FLEXPWM0_FAULT_IRQHandler, // 129: FlexPWM0_fault interrupt
|
|
||||||
FLEXPWM0_SUBMODULE0_IRQHandler, // 130: FlexPWM0 Submodule 0
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE1_IRQHandler, // 131: FlexPWM0 Submodule 1
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE2_IRQHandler, // 132: FlexPWM0 Submodule 2
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE3_IRQHandler, // 133: FlexPWM0 Submodule 3
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_RELOAD_ERROR_IRQHandler, // 134: FlexPWM1_reload_error interrupt
|
|
||||||
FLEXPWM1_FAULT_IRQHandler, // 135: FlexPWM1_fault interrupt
|
|
||||||
FLEXPWM1_SUBMODULE0_IRQHandler, // 136: FlexPWM1 Submodule 0
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE1_IRQHandler, // 137: FlexPWM1 Submodule 1
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE2_IRQHandler, // 138: FlexPWM1 Submodule 2
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE3_IRQHandler, // 139: FlexPWM1 Submodule 3
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
ENC0_COMPARE_IRQHandler, // 140: ENC0_Compare interrupt
|
|
||||||
ENC0_HOME_IRQHandler, // 141: ENC0_Home interrupt
|
|
||||||
ENC0_WDG_SAB_IRQHandler, // 142: ENC0_WDG_IRQ/SAB interrupt
|
|
||||||
ENC0_IDX_IRQHandler, // 143: ENC0_IDX interrupt
|
|
||||||
ENC1_COMPARE_IRQHandler, // 144: ENC1_Compare interrupt
|
|
||||||
ENC1_HOME_IRQHandler, // 145: ENC1_Home interrupt
|
|
||||||
ENC1_WDG_SAB_IRQHandler, // 146: ENC1_WDG_IRQ/SAB interrupt
|
|
||||||
ENC1_IDX_IRQHandler, // 147: ENC1_IDX interrupt
|
|
||||||
ITRC0_IRQHandler, // 148: Intrusion and Tamper Response Controller
|
|
||||||
// interrupt
|
|
||||||
BSP32_IRQHandler, // 149: CoolFlux BSP32 interrupt
|
|
||||||
ELS_ERR_IRQHandler, // 150: ELS error interrupt
|
|
||||||
PKC_ERR_IRQHandler, // 151: PKC error interrupt
|
|
||||||
ERM_SINGLE_BIT_ERROR_IRQHandler, // 152: ERM Single Bit error interrupt
|
|
||||||
ERM_MULTI_BIT_ERROR_IRQHandler, // 153: ERM Multi Bit error interrupt
|
|
||||||
FMU0_IRQHandler, // 154: Flash Management Unit interrupt
|
|
||||||
ETHERNET_IRQHandler, // 155: Ethernet QoS interrupt
|
|
||||||
ETHERNET_PMT_IRQHandler, // 156: Ethernet QoS power management interrupt
|
|
||||||
ETHERNET_MACLP_IRQHandler, // 157: Ethernet QoS MAC interrupt
|
|
||||||
SINC_FILTER_IRQHandler, // 158: SINC Filter interrupt
|
|
||||||
LPTMR0_IRQHandler, // 159: Low Power Timer 0 interrupt
|
|
||||||
LPTMR1_IRQHandler, // 160: Low Power Timer 1 interrupt
|
|
||||||
SCG_IRQHandler, // 161: System Clock Generator interrupt
|
|
||||||
SPC_IRQHandler, // 162: System Power Controller interrupt
|
|
||||||
WUU_IRQHandler, // 163: Wake Up Unit interrupt
|
|
||||||
PORT_EFT_IRQHandler, // 164: PORT0~5 EFT interrupt
|
|
||||||
ETB0_IRQHandler, // 165: ETB counter expires interrupt
|
|
||||||
SM3_IRQHandler, // 166: Secure Generic Interface (SGI) SAFO interrupt
|
|
||||||
TRNG0_IRQHandler, // 167: True Random Number Generator interrupt
|
|
||||||
WWDT0_IRQHandler, // 168: Windowed Watchdog Timer 0 interrupt
|
|
||||||
WWDT1_IRQHandler, // 169: Windowed Watchdog Timer 1 interrupt
|
|
||||||
CMC0_IRQHandler, // 170: Core Mode Controller interrupt
|
|
||||||
CTI0_IRQHandler, // 171: Cross Trigger Interface interrupt
|
|
||||||
};
|
|
||||||
|
|
||||||
extern unsigned char _end[]; // End of data section, start of heap. See link.ld
|
|
||||||
__attribute__((naked, noreturn)) void Reset_Handler(void) {
|
|
||||||
__asm("cpsid i"); // Disable interrupts
|
|
||||||
// set SPLIM to somewhere, trick the linker
|
|
||||||
__asm volatile("MSR MSPLIM, %1 \n"
|
|
||||||
:
|
|
||||||
: "r"(tab), "r"(_end)
|
|
||||||
: "r0", "r1");
|
|
||||||
SYSCON->ECC_ENABLE_CTRL = 0; // disable RAM ECC, must do for this link.ld
|
|
||||||
// Clear BSS section, and copy data section from flash to RAM
|
|
||||||
extern long _sbss, _ebss, _sdata, _edata, _sidata;
|
|
||||||
for (long *dst = &_sbss; dst < &_ebss; dst++) *dst = 0;
|
|
||||||
for (long *dst = &_sdata, *src = &_sidata; dst < &_edata;) *dst++ = *src++;
|
|
||||||
|
|
||||||
SystemInit();
|
|
||||||
|
|
||||||
__asm("cpsie i"); // Reenable interrupts
|
|
||||||
|
|
||||||
// Call main()
|
|
||||||
extern void main(void);
|
|
||||||
main();
|
|
||||||
for (;;) (void) 0; // Infinite loop
|
|
||||||
}
|
|
||||||
|
|
||||||
void Default_Handler(void) {
|
|
||||||
for (;;) (void) 0;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configCPU_CLOCK_HZ SYS_FREQUENCY
|
|
||||||
#define configTICK_RATE_HZ 1000
|
|
||||||
#define configMAX_PRIORITIES 5
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TIMERS 0
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configUSE_MALLOC_FAILED_HOOK 0
|
|
||||||
#define configMINIMAL_STACK_SIZE 128
|
|
||||||
#define configTOTAL_HEAP_SIZE (1024 * 128)
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_xTaskGetSchedulerState 1 // trying
|
|
||||||
|
|
||||||
#ifdef __NVIC_PRIO_BITS
|
|
||||||
#define configPRIO_BITS __NVIC_PRIO_BITS
|
|
||||||
#else
|
|
||||||
#define configPRIO_BITS 3
|
|
||||||
#endif
|
|
||||||
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1U << (configPRIO_BITS)) - 1)
|
|
||||||
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 3
|
|
||||||
#define configKERNEL_INTERRUPT_PRIORITY \
|
|
||||||
(configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
|
|
||||||
|
|
||||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY \
|
|
||||||
(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))
|
|
||||||
|
|
||||||
#define configASSERT(expr) \
|
|
||||||
if (!(expr)) printf("FAILURE %s:%d: %s\n", __FILE__, __LINE__, #expr)
|
|
||||||
|
|
||||||
// https://www.freertos.org/2020/04/using-freertos-on-armv8-m-microcontrollers.html
|
|
||||||
#define configENABLE_FPU 1
|
|
||||||
#define configENABLE_MPU 0
|
|
||||||
#define configENABLE_TRUSTZONE 0
|
|
||||||
#define configRUN_FREERTOS_SECURE_ONLY 1
|
|
||||||
|
|
||||||
//#define vPortSVCHandler SVC_Handler
|
|
||||||
//#define xPortPendSVHandler PendSV_Handler
|
|
||||||
//#define xPortSysTickHandler SysTick_Handler
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
CFLAGS = -W -Wall -Wextra -Werror -Wundef -Wshadow -Wdouble-promotion
|
|
||||||
CFLAGS += -Wformat-truncation -fno-common # -Wconversion is not SDK-friendly
|
|
||||||
CFLAGS += -g3 -Os -ffunction-sections -fdata-sections
|
|
||||||
CFLAGS += -I. -Icmsis_core/CMSIS/Core/Include -Icmsis_mcu/devices/MCXN947/
|
|
||||||
CFLAGS += -Icmsis_mcu/devices/MCXN947/drivers
|
|
||||||
CFLAGS += -DCPU_MCXN947VDF -DCPU_MCXN947VDF_cm33 -DCPU_MCXN947VDF_cm33_core0
|
|
||||||
CFLAGS += -mcpu=cortex-m33 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 $(CFLAGS_EXTRA)
|
|
||||||
CFLAGS += -Wno-old-style-declaration -Wno-unused-parameter # due to NXP FSL code
|
|
||||||
|
|
||||||
LDSCRIPT = link.ld
|
|
||||||
LDFLAGS ?= -T$(LDSCRIPT) -nostdlib -nostartfiles --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map
|
|
||||||
|
|
||||||
SOURCES = main.c hal.c
|
|
||||||
SOURCES += startup.c
|
|
||||||
SOURCES += cmsis_mcu/devices/MCXN947/drivers/fsl_clock.c cmsis_mcu/devices/MCXN947/drivers/fsl_spc.c cmsis_mcu/devices/MCXN947/drivers/fsl_common_arm.c # NXP support files
|
|
||||||
|
|
||||||
# FreeRTOS. MCXN947 has a Cortex-M33 (ARMv8) core, the CM4F port can be used if TrustZone and the MPU are not to be used
|
|
||||||
SOURCES += FreeRTOS-Kernel/portable/MemMang/heap_4.c
|
|
||||||
SOURCES += FreeRTOS-Kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
|
|
||||||
SOURCES += FreeRTOS-Kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
|
|
||||||
CFLAGS += -IFreeRTOS-Kernel/include
|
|
||||||
CFLAGS += -IFreeRTOS-Kernel/portable/GCC/ARM_CM33_NTZ/non_secure -Wno-conversion -Wno-unused-parameter
|
|
||||||
|
|
||||||
# Mongoose options are defined in mongoose_config.h
|
|
||||||
SOURCES += mongoose.c net.c packed_fs.c
|
|
||||||
|
|
||||||
# Example specific build options. See README.md
|
|
||||||
CFLAGS += -DHTTP_URL=\"http://0.0.0.0/\" -DHTTPS_URL=\"https://0.0.0.0/\"
|
|
||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
|
||||||
RM = cmd /C del /Q /F /S
|
|
||||||
else
|
|
||||||
RM = rm -rf
|
|
||||||
endif
|
|
||||||
|
|
||||||
all build example: firmware.bin
|
|
||||||
|
|
||||||
firmware.bin: firmware.elf
|
|
||||||
arm-none-eabi-objcopy -O binary $< $@
|
|
||||||
|
|
||||||
firmware.elf: FreeRTOS-Kernel cmsis_core cmsis_mcu $(SOURCES) hal.h link.ld mongoose_config.h FreeRTOSConfig.h Makefile
|
|
||||||
arm-none-eabi-gcc $(SOURCES) $(wildcard FreeRTOS-Kernel/*.c) $(CFLAGS) $(LDFLAGS) -o $@
|
|
||||||
arm-none-eabi-size $@
|
|
||||||
|
|
||||||
cmsis_core: # ARM CMSIS core headers
|
|
||||||
git clone -q --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@
|
|
||||||
cmsis_mcu:
|
|
||||||
wget -O $@.zip https://mcuxpresso.nxp.com/cmsis_pack/repo/NXP.MCXN947_DFP.17.0.0.pack
|
|
||||||
mkdir $@ && cd $@ && unzip -q ../$@.zip
|
|
||||||
FreeRTOS-Kernel: # FreeRTOS sources
|
|
||||||
git clone --depth 1 -b V10.5.0 https://github.com/FreeRTOS/FreeRTOS-Kernel $@
|
|
||||||
clean:
|
|
||||||
$(RM) firmware.* *.su cmsis_core cmsis_mcu *.zip FreeRTOS-Kernel
|
|
||||||
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static volatile uint64_t s_ticks; // Milliseconds since boot
|
|
||||||
void SysTick_Handler(void) { // SyStick IRQ handler, triggered every 1ms
|
|
||||||
s_ticks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mg_random(void *buf, size_t len) { // Use on-board RNG
|
|
||||||
for (size_t n = 0; n < len; n += sizeof(uint32_t)) {
|
|
||||||
uint32_t r = rng_read();
|
|
||||||
memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t mg_millis(void) { // Let Mongoose use our uptime function
|
|
||||||
return s_ticks; // Return number of milliseconds since boot
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void hal_init(void) {
|
|
||||||
clock_init(); // Set system clock to SYS_FREQUENCY
|
|
||||||
SystemCoreClock = SYS_FREQUENCY; // Update SystemCoreClock global var
|
|
||||||
// SysTick_Config(SystemCoreClock / 1000); // Sys tick every 1ms
|
|
||||||
// rng_init(); // TRNG is part of ELS and there is no info on that
|
|
||||||
|
|
||||||
uart_init(UART_DEBUG, 115200); // Initialise UART
|
|
||||||
gpio_output(LED1); // Initialise LED1
|
|
||||||
gpio_write(LED1, 1);
|
|
||||||
gpio_output(LED2); // Initialise LED2
|
|
||||||
gpio_write(LED2, 1);
|
|
||||||
gpio_output(LED3); // Initialise LED3
|
|
||||||
gpio_write(LED3, 1);
|
|
||||||
ethernet_init(); // Initialise Ethernet pins
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__ARMCC_VERSION)
|
|
||||||
// Keil specific - implement IO printf redirection
|
|
||||||
int fputc(int c, FILE *stream) {
|
|
||||||
if (stream == stdout || stream == stderr) uart_write_byte(UART_DEBUG, c);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
// ARM GCC specific. ARM GCC is shipped with Newlib C library.
|
|
||||||
// Implement newlib syscalls:
|
|
||||||
// _sbrk() for malloc
|
|
||||||
// _write() for printf redirection
|
|
||||||
// the rest are just stubs
|
|
||||||
#include <sys/stat.h> // For _fstat()
|
|
||||||
|
|
||||||
#if !defined(__MCUXPRESSO)
|
|
||||||
uint32_t SystemCoreClock;
|
|
||||||
// evaluate your use of Secure/non-Secure and modify accordingly
|
|
||||||
void SystemInit(void) { // Called automatically by startup code
|
|
||||||
SCB->CPACR |=
|
|
||||||
#if 0
|
|
||||||
(3UL << 0 * 2) | (3UL << 1 * 2) | // Enable PowerQuad (CPO/CP1)
|
|
||||||
#endif
|
|
||||||
(3UL << 10 * 2) | (3UL << 11 * 2); // Enable FPU
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
SYSCON->LPCAC_CTRL &= ~SYSCON_LPCAC_CTRL_DIS_LPCAC_MASK; // enable LPCAC
|
|
||||||
// Read TRM 36.1 and decide whether you really want to enable aGDET and dGDET
|
|
||||||
#if 1
|
|
||||||
// Disable aGDET and dGDET
|
|
||||||
ITRC0->OUT_SEL[4][0] =
|
|
||||||
(ITRC0->OUT_SEL[4][0] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn(0x2));
|
|
||||||
ITRC0->OUT_SEL[4][1] =
|
|
||||||
(ITRC0->OUT_SEL[4][1] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN9_SELn(0x2));
|
|
||||||
SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK;
|
|
||||||
SPC0->GLITCH_DETECT_SC &= ~SPC_GLITCH_DETECT_SC_LOCK_MASK;
|
|
||||||
SPC0->GLITCH_DETECT_SC = 0x3C;
|
|
||||||
SPC0->GLITCH_DETECT_SC |= SPC_GLITCH_DETECT_SC_LOCK_MASK;
|
|
||||||
ITRC0->OUT_SEL[4][0] =
|
|
||||||
(ITRC0->OUT_SEL[4][0] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn(0x2));
|
|
||||||
ITRC0->OUT_SEL[4][1] =
|
|
||||||
(ITRC0->OUT_SEL[4][1] & ~ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn_MASK) |
|
|
||||||
(ITRC_OUTX_SEL_OUTX_SELY_OUT_SEL_IN0_SELn(0x2));
|
|
||||||
GDET0->GDET_ENABLE1 = 0;
|
|
||||||
GDET1->GDET_ENABLE1 = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int _fstat(int fd, struct stat *st) {
|
|
||||||
(void) fd, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(__MCUXPRESSO)
|
|
||||||
extern unsigned char _end[]; // End of data section, start of heap. See link.ld
|
|
||||||
static unsigned char *s_current_heap_end = _end;
|
|
||||||
|
|
||||||
size_t hal_ram_used(void) {
|
|
||||||
return (size_t) (s_current_heap_end - _end);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t hal_ram_free(void) {
|
|
||||||
unsigned char endofstack;
|
|
||||||
return (size_t) (&endofstack - s_current_heap_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *_sbrk(int incr) {
|
|
||||||
unsigned char *prev_heap;
|
|
||||||
prev_heap = s_current_heap_end;
|
|
||||||
s_current_heap_end += incr;
|
|
||||||
return prev_heap;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int _open(const char *path) {
|
|
||||||
(void) path;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _close(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _isatty(int fd) {
|
|
||||||
(void) fd;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _lseek(int fd, int ptr, int dir) {
|
|
||||||
(void) fd, (void) ptr, (void) dir;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _exit(int status) {
|
|
||||||
(void) status;
|
|
||||||
for (;;) asm volatile("BKPT #0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void _kill(int pid, int sig) {
|
|
||||||
(void) pid, (void) sig;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _getpid(void) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _write(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _read(int fd, char *ptr, int len) {
|
|
||||||
(void) fd, (void) ptr, (void) len;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _link(const char *a, const char *b) {
|
|
||||||
(void) a, (void) b;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _unlink(const char *a) {
|
|
||||||
(void) a;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int _stat(const char *path, struct stat *st) {
|
|
||||||
(void) path, (void) st;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mkdir(const char *path, mode_t mode) {
|
|
||||||
(void) path, (void) mode;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _init(void) {
|
|
||||||
}
|
|
||||||
#endif // __GNUC__
|
|
||||||
@@ -1,223 +0,0 @@
|
|||||||
// Copyright (c) 2023 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define LED1 PIN(0, 10)
|
|
||||||
#define LED2 PIN(0, 27)
|
|
||||||
#define LED3 PIN(1, 2)
|
|
||||||
|
|
||||||
#ifndef UART_DEBUG
|
|
||||||
#define UART_DEBUG LPUART4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "MCXN947_cm33_core0.h"
|
|
||||||
|
|
||||||
#define BIT(x) (1UL << (x))
|
|
||||||
#define CLRSET(reg, clear, set) ((reg) = ((reg) & ~(clear)) | (set))
|
|
||||||
#define PIN(bank, num) ((bank << 8) | (num))
|
|
||||||
#define PINNO(pin) (pin & 255)
|
|
||||||
#define PINBANK(pin) (pin >> 8)
|
|
||||||
|
|
||||||
void hal_init(void);
|
|
||||||
size_t hal_ram_free(void);
|
|
||||||
size_t hal_ram_used(void);
|
|
||||||
|
|
||||||
static inline void spin(volatile uint32_t count) {
|
|
||||||
while (count--) (void) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SYS_FREQUENCY 150000000UL
|
|
||||||
|
|
||||||
enum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT };
|
|
||||||
enum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN };
|
|
||||||
enum { GPIO_SPEED_LOW, GPIO_SPEED_HIGH };
|
|
||||||
enum { GPIO_PULL_NONE, GPIO_PULL_DOWN, GPIO_PULL_UP };
|
|
||||||
static inline GPIO_Type *gpio_bank(uint16_t pin) {
|
|
||||||
static GPIO_Type *const g[] = GPIO_BASE_PTRS;
|
|
||||||
return g[PINBANK(pin)];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,
|
|
||||||
uint8_t speed, uint8_t pull, uint8_t af) {
|
|
||||||
static PORT_Type *const p[] = PORT_BASE_PTRS;
|
|
||||||
PORT_Type *port = p[PINBANK(pin)];
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
uint32_t mask = (uint32_t) BIT(PINNO(pin));
|
|
||||||
bool dopull = pull > 0;
|
|
||||||
if (dopull) --pull;
|
|
||||||
if (gpio != GPIO5) {
|
|
||||||
SYSCON->AHBCLKCTRL0 |=
|
|
||||||
(1 << (SYSCON_AHBCLKCTRL0_GPIO0_SHIFT + PINBANK(pin))) |
|
|
||||||
(1 << (SYSCON_AHBCLKCTRL0_PORT0_SHIFT + PINBANK(pin)));
|
|
||||||
};
|
|
||||||
port->PCR[PINNO(pin)] = PORT_PCR_IBE(1) | PORT_PCR_MUX(af) | PORT_PCR_DSE(1) |
|
|
||||||
PORT_PCR_ODE(type) |
|
|
||||||
PORT_PCR_SRE(speed != GPIO_SPEED_HIGH) |
|
|
||||||
PORT_PCR_PE(dopull) | PORT_PCR_PS(pull);
|
|
||||||
gpio->ICR[PINNO(pin)] = GPIO_ICR_ISF_MASK;
|
|
||||||
if (mode == GPIO_MODE_INPUT) {
|
|
||||||
gpio->PDDR &= ~mask;
|
|
||||||
} else {
|
|
||||||
gpio->PDDR |= mask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_input(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0);
|
|
||||||
}
|
|
||||||
static inline void gpio_output(uint16_t pin) {
|
|
||||||
gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool gpio_read(uint16_t pin) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
return gpio->PDR[PINNO(pin)];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_write(uint16_t pin, bool value) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
if (value) {
|
|
||||||
gpio->PDR[PINNO(pin)] = 1;
|
|
||||||
} else {
|
|
||||||
gpio->PDR[PINNO(pin)] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void gpio_toggle(uint16_t pin) {
|
|
||||||
GPIO_Type *gpio = gpio_bank(pin);
|
|
||||||
uint32_t mask = (uint32_t) BIT(PINNO(pin));
|
|
||||||
gpio->PTOR = mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
// MCU-Link UART (P1_9/8; FC4_P1/0)
|
|
||||||
// Arduino J1_2/4 UART (P4_3/2; FC2_P3/2)
|
|
||||||
// 33.3.23 LP_FLEXCOMM clocking
|
|
||||||
// 66.2.4 LP_FLEXCOMM init
|
|
||||||
// 66.5 LPUART
|
|
||||||
static inline void uart_init(LPUART_Type *uart, unsigned long baud) {
|
|
||||||
static LP_FLEXCOMM_Type *const f[] = LP_FLEXCOMM_BASE_PTRS;
|
|
||||||
uint8_t af = 2, fc = 0; // Alternate function, FlexComm instance
|
|
||||||
uint16_t pr = 0, pt = 0; // pins
|
|
||||||
uint32_t freq = 12000000; // fro_12_m
|
|
||||||
if (uart == LPUART2) fc = 2, pt = PIN(4, 3), pr = PIN(4, 2);
|
|
||||||
if (uart == LPUART4) fc = 4, pt = PIN(1, 9), pr = PIN(1, 8);
|
|
||||||
|
|
||||||
SYSCON->AHBCLKCTRL1 |= (1 << (SYSCON_AHBCLKCTRL1_FC0_SHIFT + fc));
|
|
||||||
SYSCON->PRESETCTRL1 |= (1 << (SYSCON_PRESETCTRL1_FC0_RST_SHIFT + fc));
|
|
||||||
SYSCON->PRESETCTRL1 &= ~(1 << (SYSCON_PRESETCTRL1_FC0_RST_SHIFT + fc));
|
|
||||||
SYSCON->FCCLKSEL[fc] = SYSCON_FCCLKSEL_SEL(2); // clock from FRO_12M / 1
|
|
||||||
SYSCON->FLEXCOMMCLKDIV[fc] = SYSCON_FLEXCOMMXCLKDIV_FLEXCOMMCLKDIV_DIV(0);
|
|
||||||
LP_FLEXCOMM_Type *flexcomm = f[fc];
|
|
||||||
flexcomm->PSELID = LP_FLEXCOMM_PSELID_PERSEL(1); // configure as UART
|
|
||||||
gpio_init(pt, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_UP, af);
|
|
||||||
gpio_init(pr, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_UP, af);
|
|
||||||
|
|
||||||
uart->GLOBAL |= LPUART_GLOBAL_RST_MASK; // reset, CTRL = 0, defaults
|
|
||||||
uart->GLOBAL &= ~LPUART_GLOBAL_RST_MASK;
|
|
||||||
// use a weird oversample ratio of 26x to fit specs, standard 16x won't do
|
|
||||||
CLRSET(uart->BAUD,
|
|
||||||
LPUART_BAUD_OSR_MASK | LPUART_BAUD_SBR_MASK | LPUART_BAUD_SBNS_MASK,
|
|
||||||
LPUART_BAUD_OSR(26 - 1) | LPUART_BAUD_SBR(freq / (26 * baud)));
|
|
||||||
CLRSET(uart->CTRL,
|
|
||||||
LPUART_CTRL_PE_MASK | LPUART_CTRL_M_MASK | LPUART_CTRL_ILT_MASK |
|
|
||||||
LPUART_CTRL_IDLECFG_MASK,
|
|
||||||
LPUART_CTRL_IDLECFG(1) | LPUART_CTRL_ILT(1) |
|
|
||||||
LPUART_BAUD_SBNS(0)); // no parity, idle 2 chars after 1 stop bit
|
|
||||||
uart->CTRL |= LPUART_CTRL_TE_MASK | LPUART_CTRL_RE_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void uart_write_byte(LPUART_Type *uart, uint8_t byte) {
|
|
||||||
uart->DATA = byte;
|
|
||||||
while ((uart->STAT & LPUART_STAT_TDRE_MASK) == 0) spin(1);
|
|
||||||
}
|
|
||||||
static inline void uart_write_buf(LPUART_Type *uart, char *buf, size_t len) {
|
|
||||||
while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void rng_init(void) {
|
|
||||||
}
|
|
||||||
static inline uint32_t rng_read(void) {
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - PHY and MAC clocked via a 50MHz oscillator, P1_4 (ENET0_TXCLK)
|
|
||||||
// - 33.3.30 ENET clocking
|
|
||||||
// - SMI clocked from AHB module clock (CSR)
|
|
||||||
// - PHY RST connected to P5_8
|
|
||||||
// - PHY RXD0,1,DV = 1 on RST enable autonegotiation, no hw pull-ups
|
|
||||||
static inline void ethernet_init(void) {
|
|
||||||
// '0' in clk_rmii, set for RMII mode
|
|
||||||
SYSCON->ENETRMIICLKSEL = SYSCON_ENETRMIICLKSEL_SEL(0);
|
|
||||||
SYSCON->ENETRMIICLKDIV = SYSCON_ENETRMIICLKDIV_DIV(0);
|
|
||||||
SYSCON->AHBCLKCTRL2 |= SYSCON_AHBCLKCTRL2_ENET_MASK; // enable bus clk
|
|
||||||
SYSCON0->PRESETCTRL2 = SYSCON_PRESETCTRL2_ENET_RST_MASK; // reset MAC
|
|
||||||
SYSCON0->PRESETCTRL2 &= ~SYSCON_PRESETCTRL2_ENET_RST_MASK; // then set RMII
|
|
||||||
SYSCON0->ENET_PHY_INTF_SEL |= SYSCON_ENET_PHY_INTF_SEL_PHY_SEL_MASK;
|
|
||||||
gpio_init(PIN(5, 8), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_LOW,
|
|
||||||
GPIO_PULL_NONE, 0); // set P5_8 as GPIO (PHY \RST)
|
|
||||||
gpio_write(PIN(5, 8), 0); // reset PHY
|
|
||||||
gpio_init(PIN(1, 4), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_4 as ENET0_TXCLK
|
|
||||||
gpio_init(PIN(1, 5), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_5 as ENET0_TXEN
|
|
||||||
gpio_init(PIN(1, 6), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_6 as ENET0_TXD0
|
|
||||||
gpio_init(PIN(1, 7), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_7 as ENET0_TXD1
|
|
||||||
gpio_init(PIN(1, 13), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_13 as ENET0_RXDV
|
|
||||||
gpio_init(PIN(1, 14), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_14 as ENET0_RXD0
|
|
||||||
gpio_init(PIN(1, 15), GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_UP, 9); // set P1_15 as ENET0_RXD1
|
|
||||||
gpio_init(PIN(1, 20), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_20 as ENET0_MDC
|
|
||||||
gpio_init(PIN(1, 21), GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,
|
|
||||||
GPIO_PULL_NONE, 9); // set P1_21 as ENET0_MDIO
|
|
||||||
spin(10000); // keep PHY RST low for a while
|
|
||||||
gpio_write(PIN(5, 8), 1); // deassert RST
|
|
||||||
NVIC_EnableIRQ(ETHERNET_IRQn); // Setup Ethernet IRQ handler
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "fsl_clock.h"
|
|
||||||
#include "fsl_spc.h"
|
|
||||||
|
|
||||||
// 33.2 Figure 127 SCG main clock
|
|
||||||
static inline void clock_init(void) {
|
|
||||||
SYSCON->AHBCLKCTRL2 |= SYSCON_AHBCLKCTRL2_SCG_MASK; // enable SCG clk
|
|
||||||
CLRSET(SCG0->RCCR, SCG_CSR_SCS_MASK, SCG_CSR_SCS(2)); // clock main_clock
|
|
||||||
spc_active_mode_dcdc_option_t dcdc = {
|
|
||||||
.DCDCVoltage = kSPC_DCDC_OverdriveVoltage,
|
|
||||||
.DCDCDriveStrength = kSPC_DCDC_NormalDriveStrength};
|
|
||||||
SPC_SetActiveModeDCDCRegulatorConfig(SPC0, &dcdc); // Set DCDC to 1.2 V
|
|
||||||
spc_active_mode_core_ldo_option_t ldo = {
|
|
||||||
.CoreLDOVoltage = kSPC_CoreLDO_OverDriveVoltage,
|
|
||||||
.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength};
|
|
||||||
SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldo); // Set LDO_CORE to 1.2 V
|
|
||||||
CLRSET(FMU0->FCTRL, FMU_FCTRL_RWSC_MASK, FMU_FCTRL_RWSC(3)); // Set Flash WS
|
|
||||||
spc_sram_voltage_config_t sram = {.operateVoltage = kSPC_sramOperateAt1P2V,
|
|
||||||
.requestVoltageUpdate = true};
|
|
||||||
SPC_SetSRAMOperateVoltage(SPC0, &sram); // Set SRAM timing for 1.2V
|
|
||||||
CLOCK_SetupFROHFClocking(48000000U); // Enable FRO HF
|
|
||||||
const pll_setup_t pll0 = {.pllctrl = SCG_APLLCTRL_SOURCE(1U) |
|
|
||||||
SCG_APLLCTRL_SELI(27U) |
|
|
||||||
SCG_APLLCTRL_SELP(13U),
|
|
||||||
.pllndiv = SCG_APLLNDIV_NDIV(8U),
|
|
||||||
.pllpdiv = SCG_APLLPDIV_PDIV(1U),
|
|
||||||
.pllmdiv = SCG_APLLMDIV_MDIV(50U),
|
|
||||||
.pllRate = 150000000U};
|
|
||||||
CLOCK_SetPLL0Freq(&pll0); // Setup PLL0 (APLL),
|
|
||||||
CLOCK_SetPll0MonitorMode(0); // disable monitor mode
|
|
||||||
CLRSET(SCG0->RCCR, SCG_CSR_SCS_MASK, SCG_CSR_SCS(5)); // clock main_clock
|
|
||||||
SYSCON->AHBCLKDIV = SYSCON_AHBCLKDIV_DIV(0); // /1
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
OUTPUT_FORMAT("elf32-littlearm")
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(Reset_Handler)
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash(RX) : ORIGIN = 0x0, LENGTH = 0x100000
|
|
||||||
flash2(RX) : ORIGIN = 0x100000, LENGTH = 0x100000
|
|
||||||
sram(!RX) : ORIGIN = 0x20000000, LENGTH = 0x60000
|
|
||||||
}
|
|
||||||
|
|
||||||
_estack = ORIGIN(sram) + LENGTH(sram);
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
.vectors : { FILL(256) KEEP(*(.isr_vector)) } > flash
|
|
||||||
.text : { *(.text*) } > flash
|
|
||||||
.data : {
|
|
||||||
_sdata = .;
|
|
||||||
*(.first_data)
|
|
||||||
*(.data SORT(.data.*))
|
|
||||||
_edata = .;
|
|
||||||
} > sram AT > flash
|
|
||||||
_sidata = LOADADDR(.data);
|
|
||||||
|
|
||||||
.bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
_end = .;
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
// Copyright (c) 2024 Cesanta Software Limited
|
|
||||||
// All rights reserved
|
|
||||||
|
|
||||||
#include "hal.h"
|
|
||||||
#include "mongoose.h"
|
|
||||||
#include "net.h"
|
|
||||||
|
|
||||||
#define BLINK_PERIOD_MS 1000 // LED blinking period in millis
|
|
||||||
|
|
||||||
static void server(void *args) {
|
|
||||||
struct mg_mgr mgr; // Initialise Mongoose event manager
|
|
||||||
mg_mgr_init(&mgr); // and attach it to the interface
|
|
||||||
mg_log_set(MG_LL_DEBUG); // Set log level
|
|
||||||
|
|
||||||
MG_INFO(("Initialising application..."));
|
|
||||||
web_init(&mgr);
|
|
||||||
|
|
||||||
MG_INFO(("Starting event loop"));
|
|
||||||
for (;;) mg_mgr_poll(&mgr, 1); // Infinite event loop
|
|
||||||
(void) args;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void blinker(void *args) {
|
|
||||||
gpio_output(LED1);
|
|
||||||
for (;;) {
|
|
||||||
gpio_toggle(LED1);
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(BLINK_PERIOD_MS));
|
|
||||||
}
|
|
||||||
(void) args;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
|
|
||||||
hal_init(); // Cross-platform hardware init
|
|
||||||
|
|
||||||
// Start tasks. NOTE: stack sizes are in 32-bit words
|
|
||||||
xTaskCreate(blinker, "blinker", 128, ":)", configMAX_PRIORITIES - 1, NULL);
|
|
||||||
xTaskCreate(server, "server", 2048, 0, configMAX_PRIORITIES - 1, NULL);
|
|
||||||
|
|
||||||
vTaskStartScheduler(); // This blocks
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <errno.h> // we are not using lwIP
|
|
||||||
|
|
||||||
// See https://mongoose.ws/documentation/#build-options
|
|
||||||
#define MG_ARCH MG_ARCH_FREERTOS
|
|
||||||
|
|
||||||
#define MG_ENABLE_TCPIP 1
|
|
||||||
#define MG_ENABLE_DRIVER_MCXN 1
|
|
||||||
//#define MG_ENABLE_CUSTOM_RANDOM 1
|
|
||||||
#define MG_ENABLE_PACKED_FS 1
|
|
||||||
|
|
||||||
// For static IP configuration, define MG_TCPIP_{IP,MASK,GW}
|
|
||||||
// By default, those are set to zero, meaning that DHCP is used
|
|
||||||
//
|
|
||||||
// #define MG_TCPIP_IP MG_IPV4(192, 168, 1, 10)
|
|
||||||
// #define MG_TCPIP_GW MG_IPV4(192, 168, 1, 1)
|
|
||||||
// #define MG_TCPIP_MASK MG_IPV4(255, 255, 255, 0)
|
|
||||||
|
|
||||||
// Set custom MAC address. By default, it is randomly generated
|
|
||||||
// Using a build-time constant:
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) do { uint8_t buf_[6] = {2,3,4,5,6,7}; memmove(mac, buf_, sizeof(buf_)); } while (0)
|
|
||||||
//
|
|
||||||
// Using custom function:
|
|
||||||
// extern void my_function(unsigned char *mac);
|
|
||||||
// #define MG_SET_MAC_ADDRESS(mac) my_function(mac)
|
|
||||||
@@ -1,411 +0,0 @@
|
|||||||
#include "MCXN947_cm33_core0.h"
|
|
||||||
|
|
||||||
void Reset_Handler(void); // Defined below
|
|
||||||
void Dummy_Handler(void); // Defined below
|
|
||||||
void SysTick_Handler(void); // Defined in main.c
|
|
||||||
void SystemInit(void); // Defined in main.c, called by reset handler
|
|
||||||
void _estack(void); // Defined in link.ld
|
|
||||||
|
|
||||||
#define WEAK_ALIAS __attribute__((weak, alias("Default_Handler")))
|
|
||||||
|
|
||||||
WEAK_ALIAS void NMI_Handler(void);
|
|
||||||
WEAK_ALIAS void HardFault_Handler(void);
|
|
||||||
WEAK_ALIAS void MemManage_Handler(void);
|
|
||||||
WEAK_ALIAS void BusFault_Handler(void);
|
|
||||||
WEAK_ALIAS void UsageFault_Handler(void);
|
|
||||||
WEAK_ALIAS void SecureFault_Handler(void);
|
|
||||||
WEAK_ALIAS void DebugMon_Handler(void);
|
|
||||||
WEAK_ALIAS void SVC_Handler(void);
|
|
||||||
WEAK_ALIAS void PendSV_Handler(void);
|
|
||||||
WEAK_ALIAS void SysTick_Handler(void);
|
|
||||||
|
|
||||||
WEAK_ALIAS void OR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH12_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH13_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH14_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_0_CH15_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO00_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO01_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO20_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO21_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO30_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO31_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO40_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO41_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO50_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GPIO51_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void UTICK0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void MRT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SCT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LP_FLEXCOMM9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ADC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ADC1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PINT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PDM_EVENT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved65_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB0_FS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB0_DCD_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void RTC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SMARTDMA_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void MAILBOX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTIMER4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void OS_EVENT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXSPI0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SAI0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SAI1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USDHC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CAN0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CAN1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved80_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved81_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB1_HS_PHY_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void USB1_HS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SEC_HYPERVISOR_CALL_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Reserved85_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PLU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void Freqme_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SEC_VIO_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ELS_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PKC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PUF_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PQ_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH4_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH5_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH6_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH7_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH8_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH9_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH10_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH11_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH12_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH13_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH14_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EDMA_1_CH15_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CDOG0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CDOG1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void I3C0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void I3C1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void NPU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void GDET_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void VBAT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EWM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TSI_END_OF_SCAN_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TSI_OUT_OF_SCAN_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EMVSIM0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void EMVSIM1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXIO_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void DAC2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void HSCMP2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_RELOAD_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_FAULT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM0_SUBMODULE3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_RELOAD_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_FAULT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE2_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FLEXPWM1_SUBMODULE3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_COMPARE_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_HOME_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_WDG_SAB_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC0_IDX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_COMPARE_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_HOME_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_WDG_SAB_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ENC1_IDX_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ITRC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void BSP32_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ELS_ERR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PKC_ERR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ERM_SINGLE_BIT_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ERM_MULTI_BIT_ERROR_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void FMU0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_PMT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETHERNET_MACLP_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SINC_FILTER_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LPTMR0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void LPTMR1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SCG_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SPC_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WUU_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void PORT_EFT_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void ETB0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void SM3_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void TRNG0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WWDT0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void WWDT1_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CMC0_IRQHandler(void);
|
|
||||||
WEAK_ALIAS void CTI0_IRQHandler(void);
|
|
||||||
|
|
||||||
__attribute__((section(".vectors"))) void (*const tab[16 + 156])(void) = {
|
|
||||||
_estack, Reset_Handler,
|
|
||||||
NMI_Handler, // NMI Handler
|
|
||||||
HardFault_Handler, // Hard Fault Handler
|
|
||||||
MemManage_Handler, // MPU Fault Handler
|
|
||||||
BusFault_Handler, // Bus Fault Handler
|
|
||||||
UsageFault_Handler, // Usage Fault Handler
|
|
||||||
SecureFault_Handler, // Secure Fault Handler
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
0, // Reserved
|
|
||||||
SVC_Handler, // SVCall Handler
|
|
||||||
DebugMon_Handler, // Debug Monitor Handler
|
|
||||||
0, // Reserved
|
|
||||||
PendSV_Handler, // PendSV Handler
|
|
||||||
SysTick_Handler, // SysTick Handler
|
|
||||||
// Chip Level - MCXN947_cm33_core0
|
|
||||||
OR_IRQHandler, // 16 : OR IRQ
|
|
||||||
EDMA_0_CH0_IRQHandler, // 17 : eDMA_0_CH0 error or transfer complete
|
|
||||||
EDMA_0_CH1_IRQHandler, // 18 : eDMA_0_CH1 error or transfer complete
|
|
||||||
EDMA_0_CH2_IRQHandler, // 19 : eDMA_0_CH2 error or transfer complete
|
|
||||||
EDMA_0_CH3_IRQHandler, // 20 : eDMA_0_CH3 error or transfer complete
|
|
||||||
EDMA_0_CH4_IRQHandler, // 21 : eDMA_0_CH4 error or transfer complete
|
|
||||||
EDMA_0_CH5_IRQHandler, // 22 : eDMA_0_CH5 error or transfer complete
|
|
||||||
EDMA_0_CH6_IRQHandler, // 23 : eDMA_0_CH6 error or transfer complete
|
|
||||||
EDMA_0_CH7_IRQHandler, // 24 : eDMA_0_CH7 error or transfer complete
|
|
||||||
EDMA_0_CH8_IRQHandler, // 25 : eDMA_0_CH8 error or transfer complete
|
|
||||||
EDMA_0_CH9_IRQHandler, // 26 : eDMA_0_CH9 error or transfer complete
|
|
||||||
EDMA_0_CH10_IRQHandler, // 27 : eDMA_0_CH10 error or transfer complete
|
|
||||||
EDMA_0_CH11_IRQHandler, // 28 : eDMA_0_CH11 error or transfer complete
|
|
||||||
EDMA_0_CH12_IRQHandler, // 29 : eDMA_0_CH12 error or transfer complete
|
|
||||||
EDMA_0_CH13_IRQHandler, // 30 : eDMA_0_CH13 error or transfer complete
|
|
||||||
EDMA_0_CH14_IRQHandler, // 31 : eDMA_0_CH14 error or transfer complete
|
|
||||||
EDMA_0_CH15_IRQHandler, // 32 : eDMA_0_CH15 error or transfer complete
|
|
||||||
GPIO00_IRQHandler, // 33 : GPIO0 interrupt 0
|
|
||||||
GPIO01_IRQHandler, // 34 : GPIO0 interrupt 1
|
|
||||||
GPIO10_IRQHandler, // 35 : GPIO1 interrupt 0
|
|
||||||
GPIO11_IRQHandler, // 36 : GPIO1 interrupt 1
|
|
||||||
GPIO20_IRQHandler, // 37 : GPIO2 interrupt 0
|
|
||||||
GPIO21_IRQHandler, // 38 : GPIO2 interrupt 1
|
|
||||||
GPIO30_IRQHandler, // 39 : GPIO3 interrupt 0
|
|
||||||
GPIO31_IRQHandler, // 40 : GPIO3 interrupt 1
|
|
||||||
GPIO40_IRQHandler, // 41 : GPIO4 interrupt 0
|
|
||||||
GPIO41_IRQHandler, // 42 : GPIO4 interrupt 1
|
|
||||||
GPIO50_IRQHandler, // 43 : GPIO5 interrupt 0
|
|
||||||
GPIO51_IRQHandler, // 44 : GPIO5 interrupt 1
|
|
||||||
UTICK0_IRQHandler, // 45 : Micro-Tick Timer interrupt
|
|
||||||
MRT0_IRQHandler, // 46 : Multi-Rate Timer interrupt
|
|
||||||
CTIMER0_IRQHandler, // 47 : Standard counter/timer 0 interrupt
|
|
||||||
CTIMER1_IRQHandler, // 48 : Standard counter/timer 1 interrupt
|
|
||||||
SCT0_IRQHandler, // 49 : SCTimer/PWM interrupt
|
|
||||||
CTIMER2_IRQHandler, // 50 : Standard counter/timer 2 interrupt
|
|
||||||
LP_FLEXCOMM0_IRQHandler, // 51 : LP_FLEXCOMM0 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM1_IRQHandler, // 52 : LP_FLEXCOMM1 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM2_IRQHandler, // 53 : LP_FLEXCOMM2 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM3_IRQHandler, // 54 : LP_FLEXCOMM3 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM4_IRQHandler, // 55 : LP_FLEXCOMM4 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM5_IRQHandler, // 56 : LP_FLEXCOMM5 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM6_IRQHandler, // 57 : LP_FLEXCOMM6 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM7_IRQHandler, // 58 : LP_FLEXCOMM7 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM8_IRQHandler, // 59 : LP_FLEXCOMM8 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
LP_FLEXCOMM9_IRQHandler, // 60 : LP_FLEXCOMM9 (LPSPI interrupt or LPI2C
|
|
||||||
// interrupt or LPUART Receive/Transmit interrupt)
|
|
||||||
ADC0_IRQHandler, // 61 : Analog-to-Digital Converter 0 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
ADC1_IRQHandler, // 62 : Analog-to-Digital Converter 1 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
PINT0_IRQHandler, // 63 : Pin Interrupt Pattern Match Interrupt
|
|
||||||
PDM_EVENT_IRQHandler, // 64 : Microphone Interface interrupt
|
|
||||||
Reserved65_IRQHandler, // 65 : Reserved interrupt
|
|
||||||
USB0_FS_IRQHandler, // 66 : Universal Serial Bus - Full Speed interrupt
|
|
||||||
USB0_DCD_IRQHandler, // 67 : Universal Serial Bus - Device Charge Detect
|
|
||||||
// interrupt
|
|
||||||
RTC_IRQHandler, // 68 : RTC Subsystem interrupt (RTC interrupt or Wake
|
|
||||||
// timer interrupt)
|
|
||||||
SMARTDMA_IRQHandler, // 69 : SmartDMA_IRQ
|
|
||||||
MAILBOX_IRQHandler, // 70 : Inter-CPU Mailbox interrupt0 for CPU0 Inter-CPU
|
|
||||||
// Mailbox interrupt1 for CPU1
|
|
||||||
CTIMER3_IRQHandler, // 71 : Standard counter/timer 3 interrupt
|
|
||||||
CTIMER4_IRQHandler, // 72 : Standard counter/timer 4 interrupt
|
|
||||||
OS_EVENT_IRQHandler, // 73 : OS event timer interrupt
|
|
||||||
FLEXSPI0_IRQHandler, // 74 : Flexible Serial Peripheral Interface interrupt
|
|
||||||
SAI0_IRQHandler, // 75 : Serial Audio Interface 0 interrupt
|
|
||||||
SAI1_IRQHandler, // 76 : Serial Audio Interface 1 interrupt
|
|
||||||
USDHC0_IRQHandler, // 77 : Ultra Secured Digital Host Controller interrupt
|
|
||||||
CAN0_IRQHandler, // 78 : Controller Area Network 0 interrupt
|
|
||||||
CAN1_IRQHandler, // 79 : Controller Area Network 1 interrupt
|
|
||||||
Reserved80_IRQHandler, // 80 : Reserved interrupt
|
|
||||||
Reserved81_IRQHandler, // 81 : Reserved interrupt
|
|
||||||
USB1_HS_PHY_IRQHandler, // 82 : USBHS DCD or USBHS Phy interrupt
|
|
||||||
USB1_HS_IRQHandler, // 83 : USB High Speed OTG Controller interrupt
|
|
||||||
SEC_HYPERVISOR_CALL_IRQHandler, // 84 : AHB Secure Controller hypervisor
|
|
||||||
// call interrupt
|
|
||||||
Reserved85_IRQHandler, // 85 : Reserved interrupt
|
|
||||||
PLU_IRQHandler, // 86 : Programmable Logic Unit interrupt
|
|
||||||
Freqme_IRQHandler, // 87 : Frequency Measurement interrupt
|
|
||||||
SEC_VIO_IRQHandler, // 88 : Secure violation interrupt (Memory Block
|
|
||||||
// Checker interrupt or secure AHB matrix violation
|
|
||||||
// interrupt)
|
|
||||||
ELS_IRQHandler, // 89 : ELS interrupt
|
|
||||||
PKC_IRQHandler, // 90 : PKC interrupt
|
|
||||||
PUF_IRQHandler, // 91 : Physical Unclonable Function interrupt
|
|
||||||
PQ_IRQHandler, // 92 : Power Quad interrupt
|
|
||||||
EDMA_1_CH0_IRQHandler, // 93 : eDMA_1_CH0 error or transfer complete
|
|
||||||
EDMA_1_CH1_IRQHandler, // 94 : eDMA_1_CH1 error or transfer complete
|
|
||||||
EDMA_1_CH2_IRQHandler, // 95 : eDMA_1_CH2 error or transfer complete
|
|
||||||
EDMA_1_CH3_IRQHandler, // 96 : eDMA_1_CH3 error or transfer complete
|
|
||||||
EDMA_1_CH4_IRQHandler, // 97 : eDMA_1_CH4 error or transfer complete
|
|
||||||
EDMA_1_CH5_IRQHandler, // 98 : eDMA_1_CH5 error or transfer complete
|
|
||||||
EDMA_1_CH6_IRQHandler, // 99 : eDMA_1_CH6 error or transfer complete
|
|
||||||
EDMA_1_CH7_IRQHandler, // 100: eDMA_1_CH7 error or transfer complete
|
|
||||||
EDMA_1_CH8_IRQHandler, // 101: eDMA_1_CH8 error or transfer complete
|
|
||||||
EDMA_1_CH9_IRQHandler, // 102: eDMA_1_CH9 error or transfer complete
|
|
||||||
EDMA_1_CH10_IRQHandler, // 103: eDMA_1_CH10 error or transfer complete
|
|
||||||
EDMA_1_CH11_IRQHandler, // 104: eDMA_1_CH11 error or transfer complete
|
|
||||||
EDMA_1_CH12_IRQHandler, // 105: eDMA_1_CH12 error or transfer complete
|
|
||||||
EDMA_1_CH13_IRQHandler, // 106: eDMA_1_CH13 error or transfer complete
|
|
||||||
EDMA_1_CH14_IRQHandler, // 107: eDMA_1_CH14 error or transfer complete
|
|
||||||
EDMA_1_CH15_IRQHandler, // 108: eDMA_1_CH15 error or transfer complete
|
|
||||||
CDOG0_IRQHandler, // 109: Code Watchdog Timer 0 interrupt
|
|
||||||
CDOG1_IRQHandler, // 110: Code Watchdog Timer 1 interrupt
|
|
||||||
I3C0_IRQHandler, // 111: Improved Inter Integrated Circuit interrupt 0
|
|
||||||
I3C1_IRQHandler, // 112: Improved Inter Integrated Circuit interrupt 1
|
|
||||||
NPU_IRQHandler, // 113: NPU interrupt
|
|
||||||
GDET_IRQHandler, // 114: Digital Glitch Detect 0 interrupt or Digital
|
|
||||||
// Glitch Detect 1 interrupt
|
|
||||||
VBAT0_IRQHandler, // 115: VBAT interrupt( VBAT interrupt or digital tamper
|
|
||||||
// interrupt)
|
|
||||||
EWM0_IRQHandler, // 116: External Watchdog Monitor interrupt
|
|
||||||
TSI_END_OF_SCAN_IRQHandler, // 117: TSI End of Scan interrupt
|
|
||||||
TSI_OUT_OF_SCAN_IRQHandler, // 118: TSI Out of Scan interrupt
|
|
||||||
EMVSIM0_IRQHandler, // 119: EMVSIM0 interrupt
|
|
||||||
EMVSIM1_IRQHandler, // 120: EMVSIM1 interrupt
|
|
||||||
FLEXIO_IRQHandler, // 121: Flexible Input/Output interrupt
|
|
||||||
DAC0_IRQHandler, // 122: Digital-to-Analog Converter 0 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
DAC1_IRQHandler, // 123: Digital-to-Analog Converter 1 - General Purpose
|
|
||||||
// interrupt
|
|
||||||
DAC2_IRQHandler, // 124: 14-bit Digital-to-Analog Converter interrupt
|
|
||||||
HSCMP0_IRQHandler, // 125: High-Speed comparator0 interrupt
|
|
||||||
HSCMP1_IRQHandler, // 126: High-Speed comparator1 interrupt
|
|
||||||
HSCMP2_IRQHandler, // 127: High-Speed comparator2 interrupt
|
|
||||||
FLEXPWM0_RELOAD_ERROR_IRQHandler, // 128: FlexPWM0_reload_error interrupt
|
|
||||||
FLEXPWM0_FAULT_IRQHandler, // 129: FlexPWM0_fault interrupt
|
|
||||||
FLEXPWM0_SUBMODULE0_IRQHandler, // 130: FlexPWM0 Submodule 0
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE1_IRQHandler, // 131: FlexPWM0 Submodule 1
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE2_IRQHandler, // 132: FlexPWM0 Submodule 2
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM0_SUBMODULE3_IRQHandler, // 133: FlexPWM0 Submodule 3
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_RELOAD_ERROR_IRQHandler, // 134: FlexPWM1_reload_error interrupt
|
|
||||||
FLEXPWM1_FAULT_IRQHandler, // 135: FlexPWM1_fault interrupt
|
|
||||||
FLEXPWM1_SUBMODULE0_IRQHandler, // 136: FlexPWM1 Submodule 0
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE1_IRQHandler, // 137: FlexPWM1 Submodule 1
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE2_IRQHandler, // 138: FlexPWM1 Submodule 2
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
FLEXPWM1_SUBMODULE3_IRQHandler, // 139: FlexPWM1 Submodule 3
|
|
||||||
// capture/compare/reload interrupt
|
|
||||||
ENC0_COMPARE_IRQHandler, // 140: ENC0_Compare interrupt
|
|
||||||
ENC0_HOME_IRQHandler, // 141: ENC0_Home interrupt
|
|
||||||
ENC0_WDG_SAB_IRQHandler, // 142: ENC0_WDG_IRQ/SAB interrupt
|
|
||||||
ENC0_IDX_IRQHandler, // 143: ENC0_IDX interrupt
|
|
||||||
ENC1_COMPARE_IRQHandler, // 144: ENC1_Compare interrupt
|
|
||||||
ENC1_HOME_IRQHandler, // 145: ENC1_Home interrupt
|
|
||||||
ENC1_WDG_SAB_IRQHandler, // 146: ENC1_WDG_IRQ/SAB interrupt
|
|
||||||
ENC1_IDX_IRQHandler, // 147: ENC1_IDX interrupt
|
|
||||||
ITRC0_IRQHandler, // 148: Intrusion and Tamper Response Controller
|
|
||||||
// interrupt
|
|
||||||
BSP32_IRQHandler, // 149: CoolFlux BSP32 interrupt
|
|
||||||
ELS_ERR_IRQHandler, // 150: ELS error interrupt
|
|
||||||
PKC_ERR_IRQHandler, // 151: PKC error interrupt
|
|
||||||
ERM_SINGLE_BIT_ERROR_IRQHandler, // 152: ERM Single Bit error interrupt
|
|
||||||
ERM_MULTI_BIT_ERROR_IRQHandler, // 153: ERM Multi Bit error interrupt
|
|
||||||
FMU0_IRQHandler, // 154: Flash Management Unit interrupt
|
|
||||||
ETHERNET_IRQHandler, // 155: Ethernet QoS interrupt
|
|
||||||
ETHERNET_PMT_IRQHandler, // 156: Ethernet QoS power management interrupt
|
|
||||||
ETHERNET_MACLP_IRQHandler, // 157: Ethernet QoS MAC interrupt
|
|
||||||
SINC_FILTER_IRQHandler, // 158: SINC Filter interrupt
|
|
||||||
LPTMR0_IRQHandler, // 159: Low Power Timer 0 interrupt
|
|
||||||
LPTMR1_IRQHandler, // 160: Low Power Timer 1 interrupt
|
|
||||||
SCG_IRQHandler, // 161: System Clock Generator interrupt
|
|
||||||
SPC_IRQHandler, // 162: System Power Controller interrupt
|
|
||||||
WUU_IRQHandler, // 163: Wake Up Unit interrupt
|
|
||||||
PORT_EFT_IRQHandler, // 164: PORT0~5 EFT interrupt
|
|
||||||
ETB0_IRQHandler, // 165: ETB counter expires interrupt
|
|
||||||
SM3_IRQHandler, // 166: Secure Generic Interface (SGI) SAFO interrupt
|
|
||||||
TRNG0_IRQHandler, // 167: True Random Number Generator interrupt
|
|
||||||
WWDT0_IRQHandler, // 168: Windowed Watchdog Timer 0 interrupt
|
|
||||||
WWDT1_IRQHandler, // 169: Windowed Watchdog Timer 1 interrupt
|
|
||||||
CMC0_IRQHandler, // 170: Core Mode Controller interrupt
|
|
||||||
CTI0_IRQHandler, // 171: Cross Trigger Interface interrupt
|
|
||||||
};
|
|
||||||
|
|
||||||
extern unsigned char _end[]; // End of data section, start of heap. See link.ld
|
|
||||||
__attribute__((naked, noreturn)) void Reset_Handler(void) {
|
|
||||||
__asm("cpsid i"); // Disable interrupts
|
|
||||||
// set SPLIM to somewhere, trick the linker
|
|
||||||
__asm volatile("MSR MSPLIM, %1 \n"
|
|
||||||
:
|
|
||||||
: "r"(tab), "r"(_end)
|
|
||||||
: "r0", "r1");
|
|
||||||
SYSCON->ECC_ENABLE_CTRL = 0; // disable RAM ECC, must do for this link.ld
|
|
||||||
// Clear BSS section, and copy data section from flash to RAM
|
|
||||||
extern long _sbss, _ebss, _sdata, _edata, _sidata;
|
|
||||||
for (long *dst = &_sbss; dst < &_ebss; dst++) *dst = 0;
|
|
||||||
for (long *dst = &_sdata, *src = &_sidata; dst < &_edata;) *dst++ = *src++;
|
|
||||||
|
|
||||||
SystemInit();
|
|
||||||
|
|
||||||
__asm("cpsie i"); // Reenable interrupts
|
|
||||||
|
|
||||||
// Call main()
|
|
||||||
extern void main(void);
|
|
||||||
main();
|
|
||||||
for (;;) (void) 0; // Infinite loop
|
|
||||||
}
|
|
||||||
|
|
||||||
void Default_Handler(void) {
|
|
||||||
for (;;) (void) 0;
|
|
||||||
}
|
|
||||||
@@ -1,727 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
|
||||||
<cconfiguration id="com.crt.advproject.config.exe.debug.1734776104">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.debug.1734776104" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
|
||||||
<externalSettings/>
|
|
||||||
<extensions>
|
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
</extensions>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Debug build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.debug.1734776104" name="Debug" parent="com.crt.advproject.config.exe.debug" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -v -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; # checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; ">
|
|
||||||
<folderInfo id="com.crt.advproject.config.exe.debug.1734776104." name="/" resourcePath="">
|
|
||||||
<toolChain id="com.crt.advproject.toolchain.exe.debug.1314174334" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.exe.debug">
|
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.debug.833805405" name="ARM-based MCU (Debug)" superClass="com.crt.advproject.platform.exe.debug"/>
|
|
||||||
<builder buildPath="${workspace_loc:/MCXN947_Project}/Debug" id="com.crt.advproject.builder.exe.debug.276764187" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.debug"/>
|
|
||||||
<tool id="com.crt.advproject.cpp.exe.debug.1305759396" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.debug">
|
|
||||||
<option id="com.crt.advproject.cpp.hdrlib.1849161310" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.fpu.392311174" name="Floating point" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true" value="com.crt.advproject.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.arch.1690431398" name="Architecture" superClass="com.crt.advproject.cpp.arch" useByScannerDiscovery="true" value="com.crt.advproject.cpp.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.misc.dialect.1625413737" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.dialect.flags.580703688" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.nostdinc.1937814840" name="Do not search system directories (-nostdinc)" superClass="gnu.cpp.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.preprocess.570713650" name="Preprocess only (-E)" superClass="gnu.cpp.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.1681834950" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="__NEWLIB__"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.undef.2031316672" name="Undefined symbols (-U)" superClass="gnu.cpp.compiler.option.preprocessor.undef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.include.paths.1774658328" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.include.files.1753953938" name="Include files (-include)" superClass="gnu.cpp.compiler.option.include.files" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.exe.debug.option.optimization.level.372189480" name="Optimization Level" superClass="com.crt.advproject.cpp.exe.debug.option.optimization.level" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.optimization.flags.23413718" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.cpp.exe.debug.option.debugging.level.1680781268" name="Debug Level" superClass="com.crt.advproject.cpp.exe.debug.option.debugging.level" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.other.829696261" name="Other debugging flags" superClass="gnu.cpp.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.prof.1308179691" name="Generate prof information (-p)" superClass="gnu.cpp.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.gprof.1176767867" name="Generate gprof information (-pg)" superClass="gnu.cpp.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.codecov.1027083399" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitaddress.2014548566" name="Sanitize address (-fsanitize=address)" superClass="gnu.cpp.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitpointers.1671841835" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.cpp.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitthread.1436884051" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.cpp.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitleak.710535969" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.cpp.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitundef.780190870" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.cpp.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.syntax.71095197" name="Check syntax only (-fsyntax-only)" superClass="gnu.cpp.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.pedantic.66715147" name="Pedantic (-pedantic)" superClass="gnu.cpp.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.pedantic.error.164938825" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.cpp.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.nowarn.732593092" name="Inhibit all warnings (-w)" superClass="gnu.cpp.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.allwarn.1561571993" name="All warnings (-Wall)" superClass="gnu.cpp.compiler.option.warnings.allwarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.extrawarn.1435384065" name="Extra warnings (-Wextra)" superClass="gnu.cpp.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.toerrors.768085191" name="Warnings as errors (-Werror)" superClass="gnu.cpp.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wconversion.1233583698" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.cpp.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wcastalign.1970016843" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.cpp.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wcastqual.1918212130" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.cpp.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wctordtorprivacy.574424256" name="All ctor and dtor private (-Wctor-dtor-privacy)" superClass="gnu.cpp.compiler.option.warnings.wctordtorprivacy" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wdisabledopt.991536755" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.cpp.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wlogicalop.862041504" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.cpp.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wmissingdecl.1042076868" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.cpp.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wmissingincdir.2002444322" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.cpp.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wnoexccept.895776976" name="Noexcept false but never throw exception (-Wnoexcept)" superClass="gnu.cpp.compiler.option.warnings.wnoexccept" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.woldstylecast.287976532" name="C-style cast used (-Wold-style-cast)" superClass="gnu.cpp.compiler.option.warnings.woldstylecast" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.woverloadedvirtual.1289977855" name="Function hides virtual functions from base class (-Woverloaded-virtual)" superClass="gnu.cpp.compiler.option.warnings.woverloadedvirtual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wredundantdecl.1191292369" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.cpp.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wshadow.1252393837" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.cpp.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wsignconv.384242958" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.cpp.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wsignpromo.480518182" name="Overload resolution promotes unsigned to signed type (-Wsign-promo)" superClass="gnu.cpp.compiler.option.warnings.wsignpromo" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wstrictnullsent.941287091" name="Use of an uncasted NULL as sentinel (-Wstrict-null-sentinel)" superClass="gnu.cpp.compiler.option.warnings.wstrictnullsent" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wswitchdef.867324586" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.cpp.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wundef.1684856874" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.cpp.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.weffcpp.541778319" name="Effective C++ guidelines (-Weffc++)" superClass="gnu.cpp.compiler.option.warnings.weffcpp" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wfloatequal.267849153" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.cpp.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.other.1942382222" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery.490486461" name="Other flags (excluded from discovery)" superClass="gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.verbose.389891325" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.pic.281536353" name="Position Independent Code (-fPIC)" superClass="gnu.cpp.compiler.option.other.pic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.misc.hardening.992373421" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.cpp.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.misc.randomization.754289834" name="Address randomization (-fPIE)" superClass="gnu.cpp.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.lto.1332618827" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.cpp.lto" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.lto.fat.501659004" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.cpp.lto.fat" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.merge.constants.1563474167" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.cpp.merge.constants" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.prefixmap.646393036" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.cpp.prefixmap" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.thumb.1489217425" name="Thumb mode" superClass="com.crt.advproject.cpp.thumb" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.thumbinterwork.884971649" name="Enable Thumb interworking" superClass="com.crt.advproject.cpp.thumbinterwork" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.securestate.1179190245" name="TrustZone Project Type" superClass="com.crt.advproject.cpp.securestate" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.specs.985790426" name="Specs" superClass="com.crt.advproject.cpp.specs" useByScannerDiscovery="false" value="com.crt.advproject.cpp.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.stackusage.1035908621" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.cpp.stackusage" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.config.1373315242" name="Obsolete (Config)" superClass="com.crt.advproject.cpp.config" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.store.451326302" name="Obsolete (Store)" superClass="com.crt.advproject.cpp.store" useByScannerDiscovery="false"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gcc.exe.debug.198183371" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.debug">
|
|
||||||
<option id="com.crt.advproject.gcc.hdrlib.2078374609" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="com.crt.advproject.gcc.hdrlib.newlibnano" valueType="enumerated"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.145449675" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF"/>
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF_cm33"/>
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF_cm33_core0"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_OS_BAREMETAL"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_DEBUGCONSOLE=1"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_DEBUGCONSOLE_UART"/>
|
|
||||||
<listOptionValue builtIn="false" value="SERIAL_PORT_TYPE_UART=1"/>
|
|
||||||
<listOptionValue builtIn="false" value="__MCUXPRESSO"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_CMSIS"/>
|
|
||||||
<listOptionValue builtIn="false" value="DEBUG"/>
|
|
||||||
<listOptionValue builtIn="false" value="__NEWLIB__"/>
|
|
||||||
</option>
|
|
||||||
<option id="com.crt.advproject.gcc.fpu.1185460528" name="Floating point" superClass="com.crt.advproject.gcc.fpu" useByScannerDiscovery="true" value="com.crt.advproject.gcc.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.thumb.759524900" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gcc.arch.1988242379" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.c.misc.dialect.191578321" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.c.compiler.option.dialect.flags.1057566534" name="Other dialect flags" superClass="gnu.c.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.nostdinc.976244909" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.preprocess.2096103770" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.undef.symbol.1910038313" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" useByScannerDiscovery="false"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.1645189855" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/board}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/source}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/drivers}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/device}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/utilities}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/uart}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/serial_manager}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/lists}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/startup}""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.include.files.298771460" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.exe.debug.option.optimization.level.1849251071" name="Optimization Level" superClass="com.crt.advproject.gcc.exe.debug.option.optimization.level" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.c.compiler.option.optimization.flags.296547266" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.gcc.exe.debug.option.debugging.level.846258019" name="Debug Level" superClass="com.crt.advproject.gcc.exe.debug.option.debugging.level" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.other.916133230" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.prof.2105458492" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.gprof.1039285490" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.codecov.830260885" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitaddress.997967682" name="Sanitize address (-fsanitize=address)" superClass="gnu.c.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitpointers.805487054" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.c.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitthread.662357324" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.c.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitleak.1655900173" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.c.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitundef.144568637" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.c.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.syntax.31405354" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.pedantic.1184403379" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.pedantic.error.20805198" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.nowarn.1343387242" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.allwarn.66715479" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.extrawarn.1960527046" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.toerrors.478512435" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wconversion.1022661808" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.c.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wcastalign.1298313582" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.c.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wcastqual.252265083" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.c.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wdisabledopt.256650675" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.c.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wlogicalop.343224882" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.c.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wmissingdecl.903315023" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.c.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wmissingincdir.1017004897" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.c.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wredundantdecl.1685672199" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.c.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wshadow.802562476" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.c.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wsignconv.154456067" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.c.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wswitchdef.1355585050" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.c.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wundef.1456712821" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.c.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wwritestrings.188455221" name="Treat strings always as const (-Wwrite-strings)" superClass="gnu.c.compiler.option.warnings.wwritestrings" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wfloatequal.2036023011" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.c.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.other.1781458874" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -ffunction-sections -fdata-sections -ffreestanding -fno-builtin" valueType="string"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery.877818740" name="Other flags (excluded from discovery)" superClass="gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.verbose.1696247891" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.ansi.745074989" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.pic.1515422121" name="Position Independent Code (-fPIC)" superClass="gnu.c.compiler.option.misc.pic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.hardening.566205681" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.c.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.randomization.1343997444" name="Address randomization (-fPIE)" superClass="gnu.c.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.lto.1581827135" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.gcc.lto" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.lto.fat.1433079890" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.gcc.lto.fat" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.merge.constants.1674808540" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.gcc.merge.constants" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.prefixmap.410803067" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.gcc.prefixmap" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.thumbinterwork.542077737" name="Enable Thumb interworking" superClass="com.crt.advproject.gcc.thumbinterwork" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.securestate.1160559512" name="TrustZone Project Type" superClass="com.crt.advproject.gcc.securestate" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.specs.1776585030" name="Specs" superClass="com.crt.advproject.gcc.specs" useByScannerDiscovery="false" value="com.crt.advproject.gcc.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.stackusage.333923840" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.gcc.stackusage" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.config.1906178058" name="Obsolete (Config)" superClass="com.crt.advproject.gcc.config" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.store.1569610120" name="Obsolete (Store)" superClass="com.crt.advproject.gcc.store" useByScannerDiscovery="false"/>
|
|
||||||
<inputType id="com.crt.advproject.compiler.input.322056344" superClass="com.crt.advproject.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gas.exe.debug.1614523105" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.debug">
|
|
||||||
<option id="com.crt.advproject.gas.hdrlib.1704944949" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.fpu.2119459677" name="Floating point" superClass="com.crt.advproject.gas.fpu" value="com.crt.advproject.gas.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.thumb.778083109" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gas.arch.391252507" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="gnu.both.asm.option.flags.crt.1419613771" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__NEWLIB__" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.518077251" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/board}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/source}""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.both.asm.option.warnings.nowarn.533634321" name="Suppress warnings (-W)" superClass="gnu.both.asm.option.warnings.nowarn"/>
|
|
||||||
<option id="gnu.both.asm.option.version.1733943380" name="Announce version (-v)" superClass="gnu.both.asm.option.version"/>
|
|
||||||
<option id="com.crt.advproject.gas.exe.debug.option.debugging.level.902331615" name="Debug level" superClass="com.crt.advproject.gas.exe.debug.option.debugging.level"/>
|
|
||||||
<option id="com.crt.advproject.gas.thumbinterwork.26018330" name="Enable Thumb interworking" superClass="com.crt.advproject.gas.thumbinterwork"/>
|
|
||||||
<option id="com.crt.advproject.gas.specs.1928637379" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.config.2029519146" name="Obsolete (Config)" superClass="com.crt.advproject.gas.config"/>
|
|
||||||
<option id="com.crt.advproject.gas.store.1351943787" name="Obsolete (Store)" superClass="com.crt.advproject.gas.store"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1311814670" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
|
||||||
<inputType id="com.crt.advproject.assembler.input.2024140897" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.cpp.exe.debug.454603828" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.debug">
|
|
||||||
<option id="com.crt.advproject.link.cpp.hdrlib.298728296" name="Library" superClass="com.crt.advproject.link.cpp.hdrlib" value="com.crt.advproject.cpp.link.hdrlib.newlibnano.nohost" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.fpu.1194939026" name="Floating point" superClass="com.crt.advproject.link.cpp.fpu" value="com.crt.advproject.link.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.arch.115644151" name="Architecture" superClass="com.crt.advproject.link.cpp.arch" value="com.crt.advproject.link.cpp.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.slave.771420638" name="Multicore configuration" superClass="com.crt.advproject.link.cpp.multicore.slave"/>
|
|
||||||
<option id="gnu.cpp.link.option.nostart.1496931508" name="Do not use standard start files (-nostartfiles)" superClass="gnu.cpp.link.option.nostart"/>
|
|
||||||
<option id="gnu.cpp.link.option.nodeflibs.1067455186" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.cpp.link.option.nodeflibs"/>
|
|
||||||
<option id="gnu.cpp.link.option.nostdlibs.11597554" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.cpp.link.option.strip.732919706" name="Omit all symbol information (-s)" superClass="gnu.cpp.link.option.strip"/>
|
|
||||||
<option id="gnu.cpp.link.option.libs.1106457976" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
|
|
||||||
<option id="gnu.cpp.link.option.paths.1138263506" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
|
|
||||||
<option id="gnu.cpp.link.option.flags.1469267541" name="Linker flags" superClass="gnu.cpp.link.option.flags"/>
|
|
||||||
<option id="gnu.cpp.link.option.other.1281524726" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other"/>
|
|
||||||
<option id="gnu.cpp.link.option.userobjs.1565787445" name="Other objects" superClass="gnu.cpp.link.option.userobjs"/>
|
|
||||||
<option id="gnu.cpp.link.option.shared.2049181537" name="Shared (-shared)" superClass="gnu.cpp.link.option.shared"/>
|
|
||||||
<option id="gnu.cpp.link.option.soname.1282558646" name="Shared object name (-Wl,-soname=)" superClass="gnu.cpp.link.option.soname"/>
|
|
||||||
<option id="gnu.cpp.link.option.implname.1135139666" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.cpp.link.option.implname"/>
|
|
||||||
<option id="gnu.cpp.link.option.defname.1525671878" name="DEF file name (-Wl,--output-def=)" superClass="gnu.cpp.link.option.defname"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.prof.1247030762" name="Generate prof information (-p)" superClass="gnu.cpp.link.option.debugging.prof"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.gprof.1553082384" name="Generate gprof information (-pg)" superClass="gnu.cpp.link.option.debugging.gprof"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.codecov.655223052" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.link.option.debugging.codecov"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.lto.566449389" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.cpp.lto"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.lto.optmization.level.1689723422" name="Link-time optimization level" superClass="com.crt.advproject.link.cpp.lto.optmization.level"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.thumb.897212292" name="Thumb mode" superClass="com.crt.advproject.link.cpp.thumb"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.manage.1927598467" name="Manage linker script" superClass="com.crt.advproject.link.cpp.manage"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.script.1207750242" name="Linker script" superClass="com.crt.advproject.link.cpp.script"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.scriptdir.1240635982" name="Script path" superClass="com.crt.advproject.link.cpp.scriptdir"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.crpenable.1862021983" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.cpp.crpenable"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.flashconfigenable.1562705648" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.cpp.flashconfigenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.ecrp.1356433668" name="Enhanced CRP" superClass="com.crt.advproject.link.cpp.ecrp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nanofloat.971814722" name="Enable printf float " superClass="com.crt.advproject.link.cpp.nanofloat"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nanofloat.scanf.49480754" name="Enable scanf float " superClass="com.crt.advproject.link.cpp.nanofloat.scanf"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.toram.1099710159" name="Link application to RAM" superClass="com.crt.advproject.link.cpp.toram"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.cpp.1390305206" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.style.cpp.2029474863" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.stackOffset.1138055458" name="Stack offset" superClass="com.crt.advproject.link.cpp.stackOffset"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.cpp.536265544" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.cpp.760188517" name="Global data placement" superClass="com.crt.advproject.link.memory.data.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.sections.cpp.445871615" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.master.1990386332" name="Multicore master" superClass="com.crt.advproject.link.cpp.multicore.master"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.empty.1702832955" name="No Multicore options for this project" superClass="com.crt.advproject.link.cpp.multicore.empty"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.master.userobjs.1697250728" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.cpp.multicore.master.userobjs"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.config.216100798" name="Obsolete (Config)" superClass="com.crt.advproject.link.cpp.config"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.store.1272232312" name="Obsolete (Store)" superClass="com.crt.advproject.link.cpp.store"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.securestate.638158039" name="TrustZone Project Type" superClass="com.crt.advproject.link.cpp.securestate"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.sgstubs.placement.510833008" name="Secure Gateway Placement" superClass="com.crt.advproject.link.cpp.sgstubs.placement"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.sgstubenable.1244812795" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.sgstubenable"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nonsecureobject.891091931" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.nonsecureobject"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.inimplib.717086047" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.inimplib"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.exe.debug.2135162436" name="MCU Linker" superClass="com.crt.advproject.link.exe.debug">
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.slave.641381131" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.master.958810676" name="Multicore master" superClass="com.crt.advproject.link.gcc.multicore.master"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.hdrlib.1781714337" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.newlibnano.nohost" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.fpu.82789730" name="Floating point" superClass="com.crt.advproject.link.fpu" value="com.crt.advproject.link.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.thumb.1197811979" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.158778872" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image" value="false;" valueType="string"/>
|
|
||||||
<option defaultValue="com.crt.advproject.heapAndStack.mcuXpressoStyle" id="com.crt.advproject.link.memory.heapAndStack.style.555458879" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.778404024" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;0x10000&Stack:Default;End;0x2000" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.298934302" name="Global data placement" superClass="com.crt.advproject.link.memory.data" value="Default" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.2049640709" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.2030715425" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/>
|
|
||||||
<option id="com.crt.advproject.link.arch.1517885759" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="gnu.c.link.option.nostart.2073752874" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/>
|
|
||||||
<option id="gnu.c.link.option.nodeflibs.1590937400" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/>
|
|
||||||
<option id="gnu.c.link.option.nostdlibs.1741514825" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.c.link.option.strip.912204747" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/>
|
|
||||||
<option id="gnu.c.link.option.noshared.1105178071" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/>
|
|
||||||
<option id="gnu.c.link.option.libs.67480580" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
|
|
||||||
<option id="gnu.c.link.option.paths.1194986158" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
|
|
||||||
<option id="gnu.c.link.option.ldflags.295197849" name="Linker flags" superClass="gnu.c.link.option.ldflags"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.1912414639" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
|
|
||||||
<listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/>
|
|
||||||
<listOptionValue builtIn="false" value="--gc-sections"/>
|
|
||||||
<listOptionValue builtIn="false" value="-print-memory-usage"/>
|
|
||||||
<listOptionValue builtIn="false" value="--sort-section=alignment"/>
|
|
||||||
<listOptionValue builtIn="false" value="--cref"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.link.option.userobjs.1431870600" name="Other objects" superClass="gnu.c.link.option.userobjs"/>
|
|
||||||
<option id="gnu.c.link.option.shared.1999199795" name="Shared (-shared)" superClass="gnu.c.link.option.shared"/>
|
|
||||||
<option id="gnu.c.link.option.soname.111809596" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname"/>
|
|
||||||
<option id="gnu.c.link.option.implname.879538770" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname"/>
|
|
||||||
<option id="gnu.c.link.option.defname.721632875" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.prof.910291618" name="Generate prof information (-p)" superClass="gnu.c.link.option.debugging.prof"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.gprof.486657868" name="Generate gprof information (-pg)" superClass="gnu.c.link.option.debugging.gprof"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.codecov.1568595911" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.link.option.debugging.codecov"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.lto.827266808" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.gcc.lto"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.lto.optmization.level.873727005" name="Link-time optimization level" superClass="com.crt.advproject.link.gcc.lto.optmization.level"/>
|
|
||||||
<option id="com.crt.advproject.link.manage.304299536" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.script.653492798" name="Linker script" superClass="com.crt.advproject.link.script" value="frdm-mcxn947-xpresso-baremetal-builtin_Debug.ld" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.scriptdir.1647234673" name="Script path" superClass="com.crt.advproject.link.scriptdir" value="" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.crpenable.1288132211" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.crpenable"/>
|
|
||||||
<option id="com.crt.advproject.link.flashconfigenable.895661604" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.flashconfigenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.ecrp.327312537" name="Enhanced CRP" superClass="com.crt.advproject.link.ecrp"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.nanofloat.1456134155" name="Enable printf float " superClass="com.crt.advproject.link.gcc.nanofloat"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.nanofloat.scanf.43770553" name="Enable scanf float " superClass="com.crt.advproject.link.gcc.nanofloat.scanf"/>
|
|
||||||
<option id="com.crt.advproject.link.toram.1810283352" name="Link application to RAM" superClass="com.crt.advproject.link.toram"/>
|
|
||||||
<option id="com.crt.advproject.link.stackOffset.1583191807" name="Stack offset" superClass="com.crt.advproject.link.stackOffset"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.empty.1268390922" name="No Multicore options for this project" superClass="com.crt.advproject.link.gcc.multicore.empty"/>
|
|
||||||
<option id="com.crt.advproject.link.config.1808466177" name="Obsolete (Config)" superClass="com.crt.advproject.link.config"/>
|
|
||||||
<option id="com.crt.advproject.link.store.1490177080" name="Obsolete (Store)" superClass="com.crt.advproject.link.store"/>
|
|
||||||
<option id="com.crt.advproject.link.securestate.1792969904" name="TrustZone Project Type" superClass="com.crt.advproject.link.securestate"/>
|
|
||||||
<option id="com.crt.advproject.link.sgstubs.placement.1354280695" name="Secure Gateway Placement" superClass="com.crt.advproject.link.sgstubs.placement"/>
|
|
||||||
<option id="com.crt.advproject.link.sgstubenable.1079130944" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.sgstubenable"/>
|
|
||||||
<option id="com.crt.advproject.link.nonsecureobject.832382055" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.nonsecureobject"/>
|
|
||||||
<option id="com.crt.advproject.link.inimplib.145400557" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.inimplib"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.943648489" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.tool.debug.debug.823545356" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.debug">
|
|
||||||
<option id="com.crt.advproject.linkserver.debug.prevent.debug.793538475" name="Prevent Debugging" superClass="com.crt.advproject.linkserver.debug.prevent.debug"/>
|
|
||||||
<option id="com.crt.advproject.miscellaneous.end_of_heap.1596705564" name="Last used address of the heap" superClass="com.crt.advproject.miscellaneous.end_of_heap"/>
|
|
||||||
<option id="com.crt.advproject.miscellaneous.pvHeapStart.138945976" name="First address of the heap" superClass="com.crt.advproject.miscellaneous.pvHeapStart"/>
|
|
||||||
<option id="com.crt.advproject.miscellaneous.pvHeapLimit.1074023403" name="Maximum extent of heap" superClass="com.crt.advproject.miscellaneous.pvHeapLimit"/>
|
|
||||||
<option id="com.crt.advproject.debugger.security.nonsecureimageenable.1277832889" name="Enable pre-programming of Non-Secure Image" superClass="com.crt.advproject.debugger.security.nonsecureimageenable"/>
|
|
||||||
<option id="com.crt.advproject.debugger.security.nonsecureimage.855522977" name="Non-Secure Project" superClass="com.crt.advproject.debugger.security.nonsecureimage"/>
|
|
||||||
</tool>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
<sourceEntries>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="component"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="startup"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="CMSIS"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="source"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="utilities"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="drivers"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="device"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="board"/>
|
|
||||||
</sourceEntries>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
</cconfiguration>
|
|
||||||
<cconfiguration id="com.crt.advproject.config.exe.release.35465113">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="com.crt.advproject.config.exe.release.35465113" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
|
||||||
<externalSettings/>
|
|
||||||
<extensions>
|
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
</extensions>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<configuration artifactExtension="axf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="Release build" errorParsers="org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="com.crt.advproject.config.exe.release.35465113" name="Release" parent="com.crt.advproject.config.exe.release" postannouncebuildStep="Performing post-build steps" postbuildStep="arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -v -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; # checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"; ">
|
|
||||||
<folderInfo id="com.crt.advproject.config.exe.release.35465113." name="/" resourcePath="">
|
|
||||||
<toolChain id="com.crt.advproject.toolchain.exe.release.1688284117" name="NXP MCU Tools" superClass="com.crt.advproject.toolchain.exe.release">
|
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="com.crt.advproject.platform.exe.release.1945425860" name="ARM-based MCU (Release)" superClass="com.crt.advproject.platform.exe.release"/>
|
|
||||||
<builder buildPath="${workspace_loc:/MCXN947_Project}/Release" id="com.crt.advproject.builder.exe.release.609548967" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="com.crt.advproject.builder.exe.release"/>
|
|
||||||
<tool id="com.crt.advproject.cpp.exe.release.284617129" name="MCU C++ Compiler" superClass="com.crt.advproject.cpp.exe.release">
|
|
||||||
<option id="com.crt.advproject.cpp.arch.951192179" name="Architecture" superClass="com.crt.advproject.cpp.arch" useByScannerDiscovery="true" value="com.crt.advproject.cpp.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.misc.dialect.1636774269" name="Language standard" superClass="com.crt.advproject.cpp.misc.dialect" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.dialect.flags.713446857" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.nostdinc.692816826" name="Do not search system directories (-nostdinc)" superClass="gnu.cpp.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.preprocess.1312564180" name="Preprocess only (-E)" superClass="gnu.cpp.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.preprocessor.def.2050158369" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="__NEWLIB__"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.undef.970515087" name="Undefined symbols (-U)" superClass="gnu.cpp.compiler.option.preprocessor.undef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.include.paths.1766394443" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.include.files.354268097" name="Include files (-include)" superClass="gnu.cpp.compiler.option.include.files" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.optimization.flags.472398477" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.other.1081105839" name="Other debugging flags" superClass="gnu.cpp.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.prof.186640100" name="Generate prof information (-p)" superClass="gnu.cpp.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.gprof.635105237" name="Generate gprof information (-pg)" superClass="gnu.cpp.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.codecov.23976024" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitaddress.1272212869" name="Sanitize address (-fsanitize=address)" superClass="gnu.cpp.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitpointers.1804161112" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.cpp.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitthread.670978308" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.cpp.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitleak.1038659433" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.cpp.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.debugging.sanitundef.1425171503" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.cpp.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.syntax.2085421736" name="Check syntax only (-fsyntax-only)" superClass="gnu.cpp.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.pedantic.1074932528" name="Pedantic (-pedantic)" superClass="gnu.cpp.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.pedantic.error.88745760" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.cpp.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.nowarn.1374656455" name="Inhibit all warnings (-w)" superClass="gnu.cpp.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.allwarn.1703986351" name="All warnings (-Wall)" superClass="gnu.cpp.compiler.option.warnings.allwarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.extrawarn.612079287" name="Extra warnings (-Wextra)" superClass="gnu.cpp.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.toerrors.270615483" name="Warnings as errors (-Werror)" superClass="gnu.cpp.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wconversion.355415862" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.cpp.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wcastalign.1586924810" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.cpp.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wcastqual.598509896" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.cpp.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wctordtorprivacy.2112259916" name="All ctor and dtor private (-Wctor-dtor-privacy)" superClass="gnu.cpp.compiler.option.warnings.wctordtorprivacy" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wdisabledopt.574112124" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.cpp.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wlogicalop.195484955" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.cpp.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wmissingdecl.1814196191" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.cpp.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wmissingincdir.1942993350" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.cpp.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wnoexccept.885256068" name="Noexcept false but never throw exception (-Wnoexcept)" superClass="gnu.cpp.compiler.option.warnings.wnoexccept" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.woldstylecast.2080447585" name="C-style cast used (-Wold-style-cast)" superClass="gnu.cpp.compiler.option.warnings.woldstylecast" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.woverloadedvirtual.1789366747" name="Function hides virtual functions from base class (-Woverloaded-virtual)" superClass="gnu.cpp.compiler.option.warnings.woverloadedvirtual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wredundantdecl.396136065" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.cpp.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wshadow.1779845353" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.cpp.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wsignconv.1081979688" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.cpp.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wsignpromo.182616712" name="Overload resolution promotes unsigned to signed type (-Wsign-promo)" superClass="gnu.cpp.compiler.option.warnings.wsignpromo" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wstrictnullsent.2136002169" name="Use of an uncasted NULL as sentinel (-Wstrict-null-sentinel)" superClass="gnu.cpp.compiler.option.warnings.wstrictnullsent" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wswitchdef.1718725948" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.cpp.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wundef.358195443" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.cpp.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.weffcpp.1655494046" name="Effective C++ guidelines (-Weffc++)" superClass="gnu.cpp.compiler.option.warnings.weffcpp" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.warnings.wfloatequal.1888029037" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.cpp.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.other.1629050402" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery.427883612" name="Other flags (excluded from discovery)" superClass="gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.verbose.1453211949" name="Verbose (-v)" superClass="gnu.cpp.compiler.option.other.verbose" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.other.pic.499269720" name="Position Independent Code (-fPIC)" superClass="gnu.cpp.compiler.option.other.pic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.misc.hardening.1489453006" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.cpp.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.cpp.compiler.option.misc.randomization.1544178067" name="Address randomization (-fPIE)" superClass="gnu.cpp.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.lto.912053293" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.cpp.lto" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.lto.fat.2086213425" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.cpp.lto.fat" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.merge.constants.1781689218" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.cpp.merge.constants" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.prefixmap.1499526032" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.cpp.prefixmap" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.fpu.83880187" name="Floating point" superClass="com.crt.advproject.cpp.fpu" useByScannerDiscovery="true" value="com.crt.advproject.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.thumb.819164747" name="Thumb mode" superClass="com.crt.advproject.cpp.thumb" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.thumbinterwork.1032253839" name="Enable Thumb interworking" superClass="com.crt.advproject.cpp.thumbinterwork" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.securestate.1530308932" name="TrustZone Project Type" superClass="com.crt.advproject.cpp.securestate" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.hdrlib.448563055" name="Library headers" superClass="com.crt.advproject.cpp.hdrlib" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.specs.1458067898" name="Specs" superClass="com.crt.advproject.cpp.specs" useByScannerDiscovery="false" value="com.crt.advproject.cpp.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.cpp.stackusage.676899047" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.cpp.stackusage" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.config.1710171632" name="Obsolete (Config)" superClass="com.crt.advproject.cpp.config" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.cpp.store.555509183" name="Obsolete (Store)" superClass="com.crt.advproject.cpp.store" useByScannerDiscovery="false"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gcc.exe.release.1904868820" name="MCU C Compiler" superClass="com.crt.advproject.gcc.exe.release">
|
|
||||||
<option id="com.crt.advproject.gcc.thumb.1694852300" name="Thumb mode" superClass="com.crt.advproject.gcc.thumb" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gcc.arch.1242191454" name="Architecture" superClass="com.crt.advproject.gcc.arch" useByScannerDiscovery="true" value="com.crt.advproject.gcc.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.c.misc.dialect.560550700" name="Language standard" superClass="com.crt.advproject.c.misc.dialect" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.c.compiler.option.dialect.flags.1221395834" name="Other dialect flags" superClass="gnu.c.compiler.option.dialect.flags" useByScannerDiscovery="true"/>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.nostdinc.549689000" name="Do not search system directories (-nostdinc)" superClass="gnu.c.compiler.option.preprocessor.nostdinc" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.preprocess.860193770" name="Preprocess only (-E)" superClass="gnu.c.compiler.option.preprocessor.preprocess" useByScannerDiscovery="false"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.preprocessor.def.symbols.970064" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF"/>
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF_cm33"/>
|
|
||||||
<listOptionValue builtIn="false" value="CPU_MCXN947VDF_cm33_core0"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_OS_BAREMETAL"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_DEBUGCONSOLE=1"/>
|
|
||||||
<listOptionValue builtIn="false" value="SDK_DEBUGCONSOLE_UART"/>
|
|
||||||
<listOptionValue builtIn="false" value="SERIAL_PORT_TYPE_UART=1"/>
|
|
||||||
<listOptionValue builtIn="false" value="__MCUXPRESSO"/>
|
|
||||||
<listOptionValue builtIn="false" value="__USE_CMSIS"/>
|
|
||||||
<listOptionValue builtIn="false" value="NDEBUG"/>
|
|
||||||
<listOptionValue builtIn="false" value="__NEWLIB__"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.undef.symbol.789720546" name="Undefined symbols (-U)" superClass="gnu.c.compiler.option.preprocessor.undef.symbol" useByScannerDiscovery="false"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.938837437" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/board}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/source}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/drivers}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/device}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/utilities}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/uart}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/serial_manager}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/component/lists}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/startup}""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.include.files.501434269" name="Include files (-include)" superClass="gnu.c.compiler.option.include.files" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.optimization.flags.1715306346" name="Other optimization flags" superClass="gnu.c.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-fno-common" valueType="string"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.other.852615198" name="Other debugging flags" superClass="gnu.c.compiler.option.debugging.other" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.prof.2018557124" name="Generate prof information (-p)" superClass="gnu.c.compiler.option.debugging.prof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.gprof.1423534367" name="Generate gprof information (-pg)" superClass="gnu.c.compiler.option.debugging.gprof" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.codecov.1199716537" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.compiler.option.debugging.codecov" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitaddress.1913222803" name="Sanitize address (-fsanitize=address)" superClass="gnu.c.compiler.option.debugging.sanitaddress" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitpointers.986167638" name="Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)" superClass="gnu.c.compiler.option.debugging.sanitpointers" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitthread.1109525223" name="Sanitize data race in multi-thread (-fsanitize=thread)" superClass="gnu.c.compiler.option.debugging.sanitthread" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitleak.448917987" name="Sanitize memory leak (-fsanitize=leak)" superClass="gnu.c.compiler.option.debugging.sanitleak" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.debugging.sanitundef.1406859048" name="Sanitize undefined behavior (-fsanitize=undefined)" superClass="gnu.c.compiler.option.debugging.sanitundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.syntax.1671825719" name="Check syntax only (-fsyntax-only)" superClass="gnu.c.compiler.option.warnings.syntax" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.pedantic.668038684" name="Pedantic (-pedantic)" superClass="gnu.c.compiler.option.warnings.pedantic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.pedantic.error.1742834278" name="Pedantic warnings as errors (-pedantic-errors)" superClass="gnu.c.compiler.option.warnings.pedantic.error" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.nowarn.648170586" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.allwarn.610238974" name="All warnings (-Wall)" superClass="gnu.c.compiler.option.warnings.allwarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.extrawarn.618293996" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.toerrors.997980211" name="Warnings as errors (-Werror)" superClass="gnu.c.compiler.option.warnings.toerrors" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wconversion.1695990257" name="Implicit conversion warnings (-Wconversion)" superClass="gnu.c.compiler.option.warnings.wconversion" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wcastalign.1811861446" name="Pointer cast with different alignment (-Wcast-align)" superClass="gnu.c.compiler.option.warnings.wcastalign" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wcastqual.951270857" name="Removing type qualifier from cast target type (-Wcast-qual)" superClass="gnu.c.compiler.option.warnings.wcastqual" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wdisabledopt.978143784" name="Requested optimization pass is disabled (-Wdisabled-optimization)" superClass="gnu.c.compiler.option.warnings.wdisabledopt" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wlogicalop.234793754" name="Suspicious uses of logical operators (-Wlogical-op)" superClass="gnu.c.compiler.option.warnings.wlogicalop" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wmissingdecl.77600827" name="Global function without previous declaration (-Wmissing-declarations)" superClass="gnu.c.compiler.option.warnings.wmissingdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wmissingincdir.931581911" name="User-supplied include directory does not exist (-Wmissing-include-dirs)" superClass="gnu.c.compiler.option.warnings.wmissingincdir" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wredundantdecl.1348850960" name="More than one declaration in the same scope (-Wredundant-decls)" superClass="gnu.c.compiler.option.warnings.wredundantdecl" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wshadow.1804841075" name="Local symbol shadows upper scope symbol (-Wshadow)" superClass="gnu.c.compiler.option.warnings.wshadow" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wsignconv.1275963836" name="Implicit conversions that may change the sign (-Wsign-conversion)" superClass="gnu.c.compiler.option.warnings.wsignconv" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wswitchdef.596758790" name="A switch statement does not have a default case (-Wswitch-default)" superClass="gnu.c.compiler.option.warnings.wswitchdef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wundef.762656523" name="An undefined identifier is evaluated in an #if directive (-Wundef)" superClass="gnu.c.compiler.option.warnings.wundef" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wwritestrings.915463230" name="Treat strings always as const (-Wwrite-strings)" superClass="gnu.c.compiler.option.warnings.wwritestrings" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.warnings.wfloatequal.482725673" name="Direct float equal check (-Wfloat-equal)" superClass="gnu.c.compiler.option.warnings.wfloatequal" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.other.51748883" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -ffunction-sections -fdata-sections -ffreestanding -fno-builtin" valueType="string"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery.1639982355" name="Other flags (excluded from discovery)" superClass="gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.verbose.726343720" name="Verbose (-v)" superClass="gnu.c.compiler.option.misc.verbose" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.ansi.1952963058" name="Support ANSI programs (-ansi)" superClass="gnu.c.compiler.option.misc.ansi" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.pic.1057045723" name="Position Independent Code (-fPIC)" superClass="gnu.c.compiler.option.misc.pic" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.hardening.1315811790" name="Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)" superClass="gnu.c.compiler.option.misc.hardening" useByScannerDiscovery="false"/>
|
|
||||||
<option id="gnu.c.compiler.option.misc.randomization.845942322" name="Address randomization (-fPIE)" superClass="gnu.c.compiler.option.misc.randomization" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.lto.747964668" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.gcc.lto" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.lto.fat.1328931796" name="Fat lto objects (-ffat-lto-objects)" superClass="com.crt.advproject.gcc.lto.fat" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.merge.constants.579589547" name="Merge Identical Constants (-fmerge-constants)" superClass="com.crt.advproject.gcc.merge.constants" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.prefixmap.1192291249" name="Remove path from __FILE__ (-fmacro-prefix-map)" superClass="com.crt.advproject.gcc.prefixmap" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.fpu.430755753" name="Floating point" superClass="com.crt.advproject.gcc.fpu" useByScannerDiscovery="true" value="com.crt.advproject.gcc.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.thumbinterwork.42229127" name="Enable Thumb interworking" superClass="com.crt.advproject.gcc.thumbinterwork" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.securestate.415146694" name="TrustZone Project Type" superClass="com.crt.advproject.gcc.securestate" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.hdrlib.512016187" name="Library headers" superClass="com.crt.advproject.gcc.hdrlib" useByScannerDiscovery="false" value="com.crt.advproject.gcc.hdrlib.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.specs.1180624617" name="Specs" superClass="com.crt.advproject.gcc.specs" useByScannerDiscovery="false" value="com.crt.advproject.gcc.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gcc.stackusage.2040674117" name="Generate Stack Usage Info (-fstack-usage)" superClass="com.crt.advproject.gcc.stackusage" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.config.1580754670" name="Obsolete (Config)" superClass="com.crt.advproject.gcc.config" useByScannerDiscovery="false"/>
|
|
||||||
<option id="com.crt.advproject.gcc.store.356887867" name="Obsolete (Store)" superClass="com.crt.advproject.gcc.store" useByScannerDiscovery="false"/>
|
|
||||||
<inputType id="com.crt.advproject.compiler.input.940240308" superClass="com.crt.advproject.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.gas.exe.release.276067731" name="MCU Assembler" superClass="com.crt.advproject.gas.exe.release">
|
|
||||||
<option id="com.crt.advproject.gas.thumb.2081817644" name="Thumb mode" superClass="com.crt.advproject.gas.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.gas.arch.1274248875" name="Architecture" superClass="com.crt.advproject.gas.arch" value="com.crt.advproject.gas.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="gnu.both.asm.option.flags.crt.306538016" name="Assembler flags" superClass="gnu.both.asm.option.flags.crt" value="-c -x assembler-with-cpp -D__NEWLIB__" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1700685825" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/board}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/source}""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.both.asm.option.warnings.nowarn.634216005" name="Suppress warnings (-W)" superClass="gnu.both.asm.option.warnings.nowarn"/>
|
|
||||||
<option id="gnu.both.asm.option.version.593949014" name="Announce version (-v)" superClass="gnu.both.asm.option.version"/>
|
|
||||||
<option id="com.crt.advproject.gas.fpu.1959782514" name="Floating point" superClass="com.crt.advproject.gas.fpu" value="com.crt.advproject.gas.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.thumbinterwork.497482990" name="Enable Thumb interworking" superClass="com.crt.advproject.gas.thumbinterwork"/>
|
|
||||||
<option id="com.crt.advproject.gas.hdrlib.1442359374" name="Library headers" superClass="com.crt.advproject.gas.hdrlib" value="com.crt.advproject.gas.hdrlib.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.specs.715022486" name="Specs" superClass="com.crt.advproject.gas.specs" value="com.crt.advproject.gas.specs.newlibnano" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.gas.config.1185241271" name="Obsolete (Config)" superClass="com.crt.advproject.gas.config"/>
|
|
||||||
<option id="com.crt.advproject.gas.store.1117360481" name="Obsolete (Store)" superClass="com.crt.advproject.gas.store"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1002399706" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
|
||||||
<inputType id="com.crt.advproject.assembler.input.1156309321" name="Additional Assembly Source Files" superClass="com.crt.advproject.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.cpp.exe.release.353324983" name="MCU C++ Linker" superClass="com.crt.advproject.link.cpp.exe.release">
|
|
||||||
<option id="com.crt.advproject.link.cpp.arch.1677610801" name="Architecture" superClass="com.crt.advproject.link.cpp.arch" value="com.crt.advproject.link.cpp.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.slave.543888206" name="Multicore configuration" superClass="com.crt.advproject.link.cpp.multicore.slave"/>
|
|
||||||
<option id="gnu.cpp.link.option.nostart.2065908240" name="Do not use standard start files (-nostartfiles)" superClass="gnu.cpp.link.option.nostart"/>
|
|
||||||
<option id="gnu.cpp.link.option.nodeflibs.417782162" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.cpp.link.option.nodeflibs"/>
|
|
||||||
<option id="gnu.cpp.link.option.nostdlibs.813601023" name="No startup or default libs (-nostdlib)" superClass="gnu.cpp.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.cpp.link.option.strip.1931898652" name="Omit all symbol information (-s)" superClass="gnu.cpp.link.option.strip"/>
|
|
||||||
<option id="gnu.cpp.link.option.libs.1781721063" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs"/>
|
|
||||||
<option id="gnu.cpp.link.option.paths.1223551189" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths"/>
|
|
||||||
<option id="gnu.cpp.link.option.flags.457435820" name="Linker flags" superClass="gnu.cpp.link.option.flags"/>
|
|
||||||
<option id="gnu.cpp.link.option.other.759804989" name="Other options (-Xlinker [option])" superClass="gnu.cpp.link.option.other"/>
|
|
||||||
<option id="gnu.cpp.link.option.userobjs.1028842176" name="Other objects" superClass="gnu.cpp.link.option.userobjs"/>
|
|
||||||
<option id="gnu.cpp.link.option.shared.1590891602" name="Shared (-shared)" superClass="gnu.cpp.link.option.shared"/>
|
|
||||||
<option id="gnu.cpp.link.option.soname.1145043232" name="Shared object name (-Wl,-soname=)" superClass="gnu.cpp.link.option.soname"/>
|
|
||||||
<option id="gnu.cpp.link.option.implname.1059236971" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.cpp.link.option.implname"/>
|
|
||||||
<option id="gnu.cpp.link.option.defname.23799519" name="DEF file name (-Wl,--output-def=)" superClass="gnu.cpp.link.option.defname"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.prof.915518746" name="Generate prof information (-p)" superClass="gnu.cpp.link.option.debugging.prof"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.gprof.530035210" name="Generate gprof information (-pg)" superClass="gnu.cpp.link.option.debugging.gprof"/>
|
|
||||||
<option id="gnu.cpp.link.option.debugging.codecov.883046859" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.cpp.link.option.debugging.codecov"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.lto.844541270" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.cpp.lto"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.lto.optmization.level.1272036359" name="Link-time optimization level" superClass="com.crt.advproject.link.cpp.lto.optmization.level"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.fpu.2013235896" name="Floating point" superClass="com.crt.advproject.link.cpp.fpu" value="com.crt.advproject.link.cpp.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.thumb.589111517" name="Thumb mode" superClass="com.crt.advproject.link.cpp.thumb"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.manage.1550657640" name="Manage linker script" superClass="com.crt.advproject.link.cpp.manage"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.script.1462320092" name="Linker script" superClass="com.crt.advproject.link.cpp.script"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.scriptdir.321354453" name="Script path" superClass="com.crt.advproject.link.cpp.scriptdir"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.crpenable.28733158" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.cpp.crpenable"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.flashconfigenable.191702633" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.cpp.flashconfigenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.ecrp.746927503" name="Enhanced CRP" superClass="com.crt.advproject.link.cpp.ecrp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.hdrlib.518184354" name="Library" superClass="com.crt.advproject.link.cpp.hdrlib" value="com.crt.advproject.cpp.link.hdrlib.newlibnano.nohost" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nanofloat.617671751" name="Enable printf float " superClass="com.crt.advproject.link.cpp.nanofloat"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nanofloat.scanf.956936851" name="Enable scanf float " superClass="com.crt.advproject.link.cpp.nanofloat.scanf"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.toram.979053468" name="Link application to RAM" superClass="com.crt.advproject.link.cpp.toram"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.cpp.1374002335" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.style.cpp.170403685" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.stackOffset.164787023" name="Stack offset" superClass="com.crt.advproject.link.cpp.stackOffset"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.cpp.1453885365" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.cpp.541005693" name="Global data placement" superClass="com.crt.advproject.link.memory.data.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.sections.cpp.30290797" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections.cpp"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.master.656931790" name="Multicore master" superClass="com.crt.advproject.link.cpp.multicore.master"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.empty.9694598" name="No Multicore options for this project" superClass="com.crt.advproject.link.cpp.multicore.empty"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.multicore.master.userobjs.1885576571" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.cpp.multicore.master.userobjs"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.config.654156398" name="Obsolete (Config)" superClass="com.crt.advproject.link.cpp.config"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.store.2137783494" name="Obsolete (Store)" superClass="com.crt.advproject.link.cpp.store"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.securestate.1551915680" name="TrustZone Project Type" superClass="com.crt.advproject.link.cpp.securestate"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.sgstubs.placement.281344114" name="Secure Gateway Placement" superClass="com.crt.advproject.link.cpp.sgstubs.placement"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.sgstubenable.1081286904" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.sgstubenable"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.nonsecureobject.117750247" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.nonsecureobject"/>
|
|
||||||
<option id="com.crt.advproject.link.cpp.inimplib.673041394" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.cpp.inimplib"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.link.exe.release.1651995267" name="MCU Linker" superClass="com.crt.advproject.link.exe.release">
|
|
||||||
<option id="com.crt.advproject.link.thumb.592626821" name="Thumb mode" superClass="com.crt.advproject.link.thumb" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.load.image.828390471" name="Plain load image" superClass="com.crt.advproject.link.memory.load.image" value="" valueType="string"/>
|
|
||||||
<option defaultValue="com.crt.advproject.heapAndStack.mcuXpressoStyle" id="com.crt.advproject.link.memory.heapAndStack.style.1799344324" name="Heap and Stack placement" superClass="com.crt.advproject.link.memory.heapAndStack.style" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.heapAndStack.241099515" name="Heap and Stack options" superClass="com.crt.advproject.link.memory.heapAndStack" value="&Heap:Default;Post Data;Default&Stack:Default;End;Default" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.memory.data.244364706" name="Global data placement" superClass="com.crt.advproject.link.memory.data" value="" valueType="string"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.memory.sections.1684386719" name="Extra linker script input sections" superClass="com.crt.advproject.link.memory.sections" valueType="stringList"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="com.crt.advproject.link.gcc.multicore.master.userobjs.924294577" name="Slave Objects (not visible)" superClass="com.crt.advproject.link.gcc.multicore.master.userobjs" valueType="userObjs"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.slave.1521860990" name="Multicore configuration" superClass="com.crt.advproject.link.gcc.multicore.slave"/>
|
|
||||||
<option id="com.crt.advproject.link.arch.580356993" name="Architecture" superClass="com.crt.advproject.link.arch" value="com.crt.advproject.link.target.cm33" valueType="enumerated"/>
|
|
||||||
<option id="gnu.c.link.option.nostart.2125177457" name="Do not use standard start files (-nostartfiles)" superClass="gnu.c.link.option.nostart"/>
|
|
||||||
<option id="gnu.c.link.option.nodeflibs.1386400510" name="Do not use default libraries (-nodefaultlibs)" superClass="gnu.c.link.option.nodeflibs"/>
|
|
||||||
<option id="gnu.c.link.option.nostdlibs.1596395914" name="No startup or default libs (-nostdlib)" superClass="gnu.c.link.option.nostdlibs" value="true" valueType="boolean"/>
|
|
||||||
<option id="gnu.c.link.option.strip.1277405119" name="Omit all symbol information (-s)" superClass="gnu.c.link.option.strip"/>
|
|
||||||
<option id="gnu.c.link.option.noshared.154841031" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared"/>
|
|
||||||
<option id="gnu.c.link.option.libs.345049144" name="Libraries (-l)" superClass="gnu.c.link.option.libs"/>
|
|
||||||
<option id="gnu.c.link.option.paths.733922225" name="Library search path (-L)" superClass="gnu.c.link.option.paths"/>
|
|
||||||
<option id="gnu.c.link.option.ldflags.1024875715" name="Linker flags" superClass="gnu.c.link.option.ldflags"/>
|
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.other.442353422" name="Other options (-Xlinker [option])" superClass="gnu.c.link.option.other" valueType="stringList">
|
|
||||||
<listOptionValue builtIn="false" value="-Map="${BuildArtifactFileBaseName}.map""/>
|
|
||||||
<listOptionValue builtIn="false" value="--gc-sections"/>
|
|
||||||
<listOptionValue builtIn="false" value="-print-memory-usage"/>
|
|
||||||
<listOptionValue builtIn="false" value="--sort-section=alignment"/>
|
|
||||||
<listOptionValue builtIn="false" value="--cref"/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.link.option.userobjs.1012631891" name="Other objects" superClass="gnu.c.link.option.userobjs"/>
|
|
||||||
<option id="gnu.c.link.option.shared.1611525564" name="Shared (-shared)" superClass="gnu.c.link.option.shared"/>
|
|
||||||
<option id="gnu.c.link.option.soname.1601498017" name="Shared object name (-Wl,-soname=)" superClass="gnu.c.link.option.soname"/>
|
|
||||||
<option id="gnu.c.link.option.implname.793527986" name="Import Library name (-Wl,--out-implib=)" superClass="gnu.c.link.option.implname"/>
|
|
||||||
<option id="gnu.c.link.option.defname.941665791" name="DEF file name (-Wl,--output-def=)" superClass="gnu.c.link.option.defname"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.prof.656054531" name="Generate prof information (-p)" superClass="gnu.c.link.option.debugging.prof"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.gprof.837277136" name="Generate gprof information (-pg)" superClass="gnu.c.link.option.debugging.gprof"/>
|
|
||||||
<option id="gnu.c.link.option.debugging.codecov.958613558" name="Generate gcov information (-ftest-coverage -fprofile-arcs)" superClass="gnu.c.link.option.debugging.codecov"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.lto.1172603322" name="Enable Link-time optimization (-flto)" superClass="com.crt.advproject.link.gcc.lto"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.lto.optmization.level.654522082" name="Link-time optimization level" superClass="com.crt.advproject.link.gcc.lto.optmization.level"/>
|
|
||||||
<option id="com.crt.advproject.link.fpu.1804104837" name="Floating point" superClass="com.crt.advproject.link.fpu" value="com.crt.advproject.link.fpu.fpv5sp.hard" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.manage.1894077431" name="Manage linker script" superClass="com.crt.advproject.link.manage" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.script.691898559" name="Linker script" superClass="com.crt.advproject.link.script" value="frdm-mcxn947-xpresso-baremetal-builtin_Release.ld" valueType="string"/>
|
|
||||||
<option id="com.crt.advproject.link.scriptdir.436931480" name="Script path" superClass="com.crt.advproject.link.scriptdir"/>
|
|
||||||
<option id="com.crt.advproject.link.crpenable.1959532879" name="Enable automatic placement of Code Read Protection field in image" superClass="com.crt.advproject.link.crpenable"/>
|
|
||||||
<option id="com.crt.advproject.link.flashconfigenable.804668275" name="Enable automatic placement of Flash Configuration field in image" superClass="com.crt.advproject.link.flashconfigenable" value="true" valueType="boolean"/>
|
|
||||||
<option id="com.crt.advproject.link.ecrp.1254373171" name="Enhanced CRP" superClass="com.crt.advproject.link.ecrp"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.hdrlib.259676509" name="Library" superClass="com.crt.advproject.link.gcc.hdrlib" value="com.crt.advproject.gcc.link.hdrlib.newlibnano.nohost" valueType="enumerated"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.nanofloat.1561655442" name="Enable printf float " superClass="com.crt.advproject.link.gcc.nanofloat"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.nanofloat.scanf.1553656456" name="Enable scanf float " superClass="com.crt.advproject.link.gcc.nanofloat.scanf"/>
|
|
||||||
<option id="com.crt.advproject.link.toram.1828994601" name="Link application to RAM" superClass="com.crt.advproject.link.toram"/>
|
|
||||||
<option id="com.crt.advproject.link.stackOffset.1818645382" name="Stack offset" superClass="com.crt.advproject.link.stackOffset"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.master.634873982" name="Multicore master" superClass="com.crt.advproject.link.gcc.multicore.master"/>
|
|
||||||
<option id="com.crt.advproject.link.gcc.multicore.empty.2047141411" name="No Multicore options for this project" superClass="com.crt.advproject.link.gcc.multicore.empty"/>
|
|
||||||
<option id="com.crt.advproject.link.config.2064476725" name="Obsolete (Config)" superClass="com.crt.advproject.link.config"/>
|
|
||||||
<option id="com.crt.advproject.link.store.508441126" name="Obsolete (Store)" superClass="com.crt.advproject.link.store"/>
|
|
||||||
<option id="com.crt.advproject.link.securestate.1645164466" name="TrustZone Project Type" superClass="com.crt.advproject.link.securestate"/>
|
|
||||||
<option id="com.crt.advproject.link.sgstubs.placement.706699166" name="Secure Gateway Placement" superClass="com.crt.advproject.link.sgstubs.placement"/>
|
|
||||||
<option id="com.crt.advproject.link.sgstubenable.1965856152" name="Enable generation of Secure Gateway Import Library" superClass="com.crt.advproject.link.sgstubenable"/>
|
|
||||||
<option id="com.crt.advproject.link.nonsecureobject.1839814088" name="Secure Gateway Import Library" superClass="com.crt.advproject.link.nonsecureobject"/>
|
|
||||||
<option id="com.crt.advproject.link.inimplib.1977566246" name="Input Secure Gateway Import Library" superClass="com.crt.advproject.link.inimplib"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.512781588" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
<tool id="com.crt.advproject.tool.debug.release.972200988" name="MCU Debugger" superClass="com.crt.advproject.tool.debug.release">
|
|
||||||
<option id="com.crt.advproject.miscellaneous.end_of_heap.1396717893" name="Last used address of the heap" superClass="com.crt.advproject.miscellaneous.end_of_heap"/>
|
|
||||||
<option id="com.crt.advproject.miscellaneous.pvHeapStart.2102828751" name="First address of the heap" superClass="com.crt.advproject.miscellaneous.pvHeapStart"/>
|
|
||||||
<option id="com.crt.advproject.miscellaneous.pvHeapLimit.1915381700" name="Maximum extent of heap" superClass="com.crt.advproject.miscellaneous.pvHeapLimit"/>
|
|
||||||
<option id="com.crt.advproject.debugger.security.nonsecureimageenable.1262271839" name="Enable pre-programming of Non-Secure Image" superClass="com.crt.advproject.debugger.security.nonsecureimageenable"/>
|
|
||||||
<option id="com.crt.advproject.debugger.security.nonsecureimage.484959140" name="Non-Secure Project" superClass="com.crt.advproject.debugger.security.nonsecureimage"/>
|
|
||||||
</tool>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
<sourceEntries>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="component"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="startup"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="CMSIS"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="source"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="utilities"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="drivers"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="device"/>
|
|
||||||
<entry flags="LOCAL|VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="board"/>
|
|
||||||
</sourceEntries>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
</cconfiguration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<project id="MCXN947_Project.null.989825020" name="MCXN947_Project" projectType="com.crt.advproject.projecttype.exe"/>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="scannerConfiguration">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.release.35465113;com.crt.advproject.config.exe.release.35465113.;com.crt.advproject.gcc.exe.release.1904868820;com.crt.advproject.compiler.input.940240308">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1734776104;com.crt.advproject.config.exe.debug.1734776104.;com.crt.advproject.gas.exe.debug.1614523105;com.crt.advproject.assembler.input.2024140897">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.release.35465113;com.crt.advproject.config.exe.release.35465113.;com.crt.advproject.gas.exe.release.276067731;com.crt.advproject.assembler.input.1156309321">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="com.crt.advproject.config.exe.debug.1734776104;com.crt.advproject.config.exe.debug.1734776104.;com.crt.advproject.gcc.exe.debug.198183371;com.crt.advproject.compiler.input.322056344">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
|
||||||
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
|
|
||||||
<sdkName>SDK_2.x_FRDM-MCXN947</sdkName>
|
|
||||||
<sdkVersion>2.14.0</sdkVersion>
|
|
||||||
<sdkComponents>middleware.baremetal.MCXN947;platform.drivers.reset.MCXN947;platform.drivers.clock.MCXN947;platform.drivers.lpflexcomm_lpuart.MCXN947;platform.drivers.port.MCXN947;platform.drivers.gpio.MCXN947;platform.drivers.mcx_spc.MCXN947;platform.drivers.lpflexcomm.MCXN947;platform.drivers.common.MCXN947;platform.devices.MCXN947_system.MCXN947;CMSIS_Include_core_cm.MCXN947;platform.devices.MCXN947_CMSIS.MCXN947;utility.debug_console.MCXN947;component.lpuart_adapter.MCXN947;component.serial_manager_uart.MCXN947;component.serial_manager.MCXN947;platform.utilities.assert.MCXN947;component.lists.MCXN947;project_template.frdmmcxn947.MCXN947;platform.devices.MCXN947_startup.MCXN947;</sdkComponents>
|
|
||||||
<boardId>frdmmcxn947</boardId>
|
|
||||||
<package>MCXN947VDF</package>
|
|
||||||
<core>cm33</core>
|
|
||||||
<coreId>cm33_core0_MCXN947</coreId>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="com.crt.config">
|
|
||||||
<projectStorage><?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<TargetConfig>
|
|
||||||
<Properties property_3="NXP" property_4="MCXN947" property_count="5" version="100300"/>
|
|
||||||
<infoList vendor="NXP">
|
|
||||||
<info chip="MCXN947" name="MCXN947">
|
|
||||||
<chip>
|
|
||||||
<name>MCXN947</name>
|
|
||||||
<family>MCXN9XX</family>
|
|
||||||
<vendor>NXP</vendor>
|
|
||||||
<memory can_program="true" id="Flash" is_ro="true" size="2048" type="Flash"/>
|
|
||||||
<memory id="RAM" size="512" type="RAM"/>
|
|
||||||
<memoryInstance derived_from="Flash" driver="MCXNxxx.cfx" edited="true" id="PROGRAM_FLASH0" location="0x0" size="0x100000"/>
|
|
||||||
<memoryInstance derived_from="Flash" driver="MCXNxxx.cfx" edited="true" id="PROGRAM_FLASH1" location="0x100000" size="0x100000"/>
|
|
||||||
<memoryInstance derived_from="RAM" edited="true" id="SRAM" location="0x20000000" size="0x60000"/>
|
|
||||||
<memoryInstance derived_from="RAM" edited="true" id="SRAMX" location="0x4000000" size="0x18000"/>
|
|
||||||
<memoryInstance derived_from="RAM" edited="true" id="SRAMH" location="0x20060000" size="0x8000"/>
|
|
||||||
<memoryInstance derived_from="RAM" edited="true" id="USB_RAM" location="0x400ba000" size="0x1000"/>
|
|
||||||
</chip>
|
|
||||||
<processor>
|
|
||||||
<name gcc_name="cortex-m33">Cortex-M33</name>
|
|
||||||
<family>Cortex-M</family>
|
|
||||||
</processor>
|
|
||||||
<processor>
|
|
||||||
<name gcc_name="cortex-m33-nodsp">Cortex-M33 (No DSP)</name>
|
|
||||||
<family>Cortex-M</family>
|
|
||||||
</processor>
|
|
||||||
</info>
|
|
||||||
</infoList>
|
|
||||||
</TargetConfig></projectStorage>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="refreshScope"/>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
|
||||||
<storageModule moduleId="openCmsis"/>
|
|
||||||
</cproject>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<projectDescription>
|
|
||||||
<name>frdm-mcxn947-xpresso-baremetal-builtin</name>
|
|
||||||
<comment></comment>
|
|
||||||
<projects>
|
|
||||||
</projects>
|
|
||||||
<buildSpec>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
|
||||||
<triggers>clean,full,incremental,</triggers>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
<buildCommand>
|
|
||||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
|
||||||
<triggers>full,incremental,</triggers>
|
|
||||||
<arguments>
|
|
||||||
</arguments>
|
|
||||||
</buildCommand>
|
|
||||||
</buildSpec>
|
|
||||||
<natures>
|
|
||||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
|
||||||
<nature>com.nxp.mcuxpresso.core.datamodels.sdkNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
|
||||||
</natures>
|
|
||||||
</projectDescription>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<project>
|
|
||||||
<configuration id="com.crt.advproject.config.exe.debug.1734776104" name="Debug">
|
|
||||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="com.crt.advproject.GCCBuildCommandParser" keep-relative-paths="false" name="MCU GCC Build Output Parser" parameter="(arm-none-eabi-gcc)|(arm-none-eabi-[gc]\+\+)|(gcc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
|
||||||
<provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="883575258906360803" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
|
||||||
</provider>
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
</extension>
|
|
||||||
</configuration>
|
|
||||||
<configuration id="com.crt.advproject.config.exe.release.35465113" name="Release">
|
|
||||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
|
||||||
<provider copy-of="extension" id="com.crt.advproject.GCCBuildCommandParser"/>
|
|
||||||
<provider class="com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector" console="false" env-hash="889295433132188739" id="com.crt.advproject.GCCBuildSpecCompilerParser" keep-relative-paths="false" name="MCU GCC Built-in Compiler Parser" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
|
||||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
|
||||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
|
||||||
</provider>
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
</extension>
|
|
||||||
</configuration>
|
|
||||||
</project>
|
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -1,245 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "fsl_common.h"
|
|
||||||
#include "fsl_debug_console.h"
|
|
||||||
#include "board.h"
|
|
||||||
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
|
||||||
#include "fsl_lpi2c.h"
|
|
||||||
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
|
||||||
#if defined(LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER) && LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER
|
|
||||||
#include "fsl_lpflexcomm.h"
|
|
||||||
#endif /* LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER */
|
|
||||||
#include "fsl_spc.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code
|
|
||||||
******************************************************************************/
|
|
||||||
/* Initialize debug console. */
|
|
||||||
void BOARD_InitDebugConsole(void)
|
|
||||||
{
|
|
||||||
/* attach 12 MHz clock to FLEXCOMM0 (debug console) */
|
|
||||||
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
|
|
||||||
|
|
||||||
RESET_ClearPeripheralReset(BOARD_DEBUG_UART_RST);
|
|
||||||
|
|
||||||
uint32_t uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;
|
|
||||||
|
|
||||||
#if defined(LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER) && LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER
|
|
||||||
LP_FLEXCOMM_Init(BOARD_DEBUG_UART_INSTANCE, LP_FLEXCOMM_PERIPH_LPUART);
|
|
||||||
#endif /* LPFLEXCOMM_INIT_NOT_USED_IN_DRIVER */
|
|
||||||
|
|
||||||
DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BOARD_InitDebugConsole_Core1(void)
|
|
||||||
{
|
|
||||||
/* attach 12 MHz clock to FLEXCOMM1 (debug console) */
|
|
||||||
// CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH_CORE1);
|
|
||||||
|
|
||||||
RESET_ClearPeripheralReset(BOARD_DEBUG_UART_RST_CORE1);
|
|
||||||
|
|
||||||
uint32_t uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ_CORE1;
|
|
||||||
|
|
||||||
DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE_CORE1, BOARD_DEBUG_UART_BAUDRATE_CORE1, BOARD_DEBUG_UART_TYPE_CORE1,
|
|
||||||
uartClkSrcFreq);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
|
||||||
void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz)
|
|
||||||
{
|
|
||||||
lpi2c_master_config_t lpi2cConfig = {0};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* lpi2cConfig.debugEnable = false;
|
|
||||||
* lpi2cConfig.ignoreAck = false;
|
|
||||||
* lpi2cConfig.pinConfig = kLPI2C_2PinOpenDrain;
|
|
||||||
* lpi2cConfig.baudRate_Hz = 100000U;
|
|
||||||
* lpi2cConfig.busIdleTimeout_ns = 0;
|
|
||||||
* lpi2cConfig.pinLowTimeout_ns = 0;
|
|
||||||
* lpi2cConfig.sdaGlitchFilterWidth_ns = 0;
|
|
||||||
* lpi2cConfig.sclGlitchFilterWidth_ns = 0;
|
|
||||||
*/
|
|
||||||
LPI2C_MasterGetDefaultConfig(&lpi2cConfig);
|
|
||||||
LPI2C_MasterInit(base, &lpi2cConfig, clkSrc_Hz);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_LPI2C_Send(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subAddressSize,
|
|
||||||
uint8_t *txBuff,
|
|
||||||
uint8_t txBuffSize)
|
|
||||||
{
|
|
||||||
lpi2c_master_transfer_t xfer;
|
|
||||||
|
|
||||||
xfer.flags = kLPI2C_TransferDefaultFlag;
|
|
||||||
xfer.slaveAddress = deviceAddress;
|
|
||||||
xfer.direction = kLPI2C_Write;
|
|
||||||
xfer.subaddress = subAddress;
|
|
||||||
xfer.subaddressSize = subAddressSize;
|
|
||||||
xfer.data = txBuff;
|
|
||||||
xfer.dataSize = txBuffSize;
|
|
||||||
|
|
||||||
return LPI2C_MasterTransferBlocking(base, &xfer);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subAddressSize,
|
|
||||||
uint8_t *rxBuff,
|
|
||||||
uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
lpi2c_master_transfer_t xfer;
|
|
||||||
|
|
||||||
xfer.flags = kLPI2C_TransferDefaultFlag;
|
|
||||||
xfer.slaveAddress = deviceAddress;
|
|
||||||
xfer.direction = kLPI2C_Read;
|
|
||||||
xfer.subaddress = subAddress;
|
|
||||||
xfer.subaddressSize = subAddressSize;
|
|
||||||
xfer.data = rxBuff;
|
|
||||||
xfer.dataSize = rxBuffSize;
|
|
||||||
|
|
||||||
return LPI2C_MasterTransferBlocking(base, &xfer);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_LPI2C_SendSCCB(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subAddressSize,
|
|
||||||
uint8_t *txBuff,
|
|
||||||
uint8_t txBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Send(base, deviceAddress, subAddress, subAddressSize, txBuff, txBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_LPI2C_ReceiveSCCB(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subAddressSize,
|
|
||||||
uint8_t *rxBuff,
|
|
||||||
uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
status_t status;
|
|
||||||
lpi2c_master_transfer_t xfer;
|
|
||||||
|
|
||||||
xfer.flags = kLPI2C_TransferDefaultFlag;
|
|
||||||
xfer.slaveAddress = deviceAddress;
|
|
||||||
xfer.direction = kLPI2C_Write;
|
|
||||||
xfer.subaddress = subAddress;
|
|
||||||
xfer.subaddressSize = subAddressSize;
|
|
||||||
xfer.data = NULL;
|
|
||||||
xfer.dataSize = 0;
|
|
||||||
|
|
||||||
status = LPI2C_MasterTransferBlocking(base, &xfer);
|
|
||||||
|
|
||||||
if (kStatus_Success == status)
|
|
||||||
{
|
|
||||||
xfer.subaddressSize = 0;
|
|
||||||
xfer.direction = kLPI2C_Read;
|
|
||||||
xfer.data = rxBuff;
|
|
||||||
xfer.dataSize = rxBuffSize;
|
|
||||||
|
|
||||||
status = LPI2C_MasterTransferBlocking(base, &xfer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BOARD_Accel_I2C_Init(void)
|
|
||||||
{
|
|
||||||
BOARD_LPI2C_Init(BOARD_ACCEL_I2C_BASEADDR, BOARD_ACCEL_I2C_CLOCK_FREQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff)
|
|
||||||
{
|
|
||||||
uint8_t data = (uint8_t)txBuff;
|
|
||||||
|
|
||||||
return BOARD_LPI2C_Send(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, &data, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Accel_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Receive(BOARD_ACCEL_I2C_BASEADDR, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BOARD_Codec_I2C_Init(void)
|
|
||||||
{
|
|
||||||
BOARD_LPI2C_Init(BOARD_CODEC_I2C_BASEADDR, BOARD_CODEC_I2C_CLOCK_FREQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Codec_I2C_Send(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Send(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
|
|
||||||
txBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Codec_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Receive(BOARD_CODEC_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff, rxBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
void BOARD_Camera_I2C_Init(void)
|
|
||||||
{
|
|
||||||
LP_FLEXCOMM_Init(BOARD_CAMERA_I2C_INSTANCE, LP_FLEXCOMM_PERIPH_LPI2C);
|
|
||||||
BOARD_LPI2C_Init(BOARD_CAMERA_I2C_BASEADDR, BOARD_CAMERA_I2C_CLOCK_FREQ);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Camera_I2C_Send(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Send(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
|
|
||||||
txBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Camera_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_Receive(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
|
|
||||||
rxBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Camera_I2C_SendSCCB(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_SendSCCB(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, (uint8_t *)txBuff,
|
|
||||||
txBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t BOARD_Camera_I2C_ReceiveSCCB(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize)
|
|
||||||
{
|
|
||||||
return BOARD_LPI2C_ReceiveSCCB(BOARD_CAMERA_I2C_BASEADDR, deviceAddress, subAddress, subAddressSize, rxBuff,
|
|
||||||
rxBuffSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
|
||||||
|
|
||||||
/* Update Active mode voltage for OverDrive mode. */
|
|
||||||
void BOARD_PowerMode_OD(void)
|
|
||||||
{
|
|
||||||
spc_active_mode_dcdc_option_t opt = {
|
|
||||||
.DCDCVoltage = kSPC_DCDC_OverdriveVoltage,
|
|
||||||
.DCDCDriveStrength = kSPC_DCDC_NormalDriveStrength,
|
|
||||||
};
|
|
||||||
SPC_SetActiveModeDCDCRegulatorConfig(SPC0, &opt);
|
|
||||||
|
|
||||||
spc_sram_voltage_config_t cfg = {
|
|
||||||
.operateVoltage = kSPC_sramOperateAt1P2V,
|
|
||||||
.requestVoltageUpdate = true,
|
|
||||||
};
|
|
||||||
SPC_SetSRAMOperateVoltage(SPC0, &cfg);
|
|
||||||
}
|
|
||||||
@@ -1,261 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022-2023 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _BOARD_H_
|
|
||||||
#define _BOARD_H_
|
|
||||||
|
|
||||||
#include "clock_config.h"
|
|
||||||
#include "fsl_gpio.h"
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions
|
|
||||||
******************************************************************************/
|
|
||||||
/*! @brief The board name */
|
|
||||||
#define BOARD_NAME "FRDM-MCXN947"
|
|
||||||
|
|
||||||
/*! @brief The UART to use for debug messages. */
|
|
||||||
#define BOARD_DEBUG_UART_TYPE kSerialPort_Uart
|
|
||||||
#define BOARD_DEBUG_UART_BASEADDR (uint32_t) LPUART4
|
|
||||||
#define BOARD_DEBUG_UART_INSTANCE 4U
|
|
||||||
#define BOARD_DEBUG_UART_CLK_FREQ 12000000U
|
|
||||||
#define BOARD_DEBUG_UART_CLK_ATTACH kFRO12M_to_FLEXCOMM4
|
|
||||||
#define BOARD_DEBUG_UART_RST kFC4_RST_SHIFT_RSTn
|
|
||||||
#define BOARD_DEBUG_UART_CLKSRC kCLOCK_FlexComm4
|
|
||||||
#define BOARD_UART_IRQ_HANDLER LP_FLEXCOMM4_IRQHandler
|
|
||||||
#define BOARD_UART_IRQ LP_FLEXCOMM4_IRQn
|
|
||||||
|
|
||||||
#define BOARD_DEBUG_UART_TYPE_CORE1 kSerialPort_Uart
|
|
||||||
#define BOARD_DEBUG_UART_BASEADDR_CORE1 (uint32_t) USART1
|
|
||||||
#define BOARD_DEBUG_UART_INSTANCE_CORE1 1U
|
|
||||||
#define BOARD_DEBUG_UART_CLK_FREQ_CORE1 12000000U
|
|
||||||
#define BOARD_DEBUG_UART_CLK_ATTACH_CORE1 kFRO12M_to_FLEXCOMM1
|
|
||||||
#define BOARD_DEBUG_UART_RST_CORE1 kFC1_RST_SHIFT_RSTn
|
|
||||||
#define BOARD_DEBUG_UART_CLKSRC_CORE1 kCLOCK_Flexcomm1
|
|
||||||
#define BOARD_UART_IRQ_HANDLER_CORE1 FLEXCOMM1_IRQHandler
|
|
||||||
#define BOARD_UART_IRQ_CORE1 FLEXCOMM1_IRQn
|
|
||||||
|
|
||||||
#ifndef BOARD_DEBUG_UART_BAUDRATE
|
|
||||||
#define BOARD_DEBUG_UART_BAUDRATE 115200U
|
|
||||||
#endif /* BOARD_DEBUG_UART_BAUDRATE */
|
|
||||||
|
|
||||||
#ifndef BOARD_DEBUG_UART_BAUDRATE_CORE1
|
|
||||||
#define BOARD_DEBUG_UART_BAUDRATE_CORE1 115200U
|
|
||||||
#endif /* BOARD_DEBUG_UART_BAUDRATE_CORE1 */
|
|
||||||
|
|
||||||
/*! @brief The UART to use for Bluetooth M.2 interface. */
|
|
||||||
#define BOARD_BT_UART_INSTANCE 2
|
|
||||||
#define BOARD_BT_UART_BAUDRATE 3000000
|
|
||||||
#define BOARD_BT_UART_CLK_FREQ 12000000U
|
|
||||||
#define BOARD_BT_UART_CLK_ATTACH kFRO12M_to_FLEXCOMM2
|
|
||||||
|
|
||||||
/*! @brief The ENET PHY address. */
|
|
||||||
#define BOARD_ENET0_PHY_ADDRESS (0x00U) /* Phy address of enet port 0. */
|
|
||||||
|
|
||||||
/*! @brief Memory ranges not usable by the ENET DMA. */
|
|
||||||
#ifndef BOARD_ENET_NON_DMA_MEMORY_ARRAY
|
|
||||||
#define BOARD_ENET_NON_DMA_MEMORY_ARRAY \
|
|
||||||
{ \
|
|
||||||
{0x00000000U, 0x0007FFFFU}, {0x10000000U, 0x17FFFFFFU}, {0x80000000U, 0xDFFFFFFFU}, \
|
|
||||||
{0x00000000U, 0x00000000U}, \
|
|
||||||
}
|
|
||||||
#endif /* BOARD_ENET_NON_DMA_MEMORY_ARRAY */
|
|
||||||
|
|
||||||
#define BOARD_ACCEL_I2C_BASEADDR LPI2C2
|
|
||||||
#define BOARD_ACCEL_I2C_CLOCK_FREQ 12000000
|
|
||||||
|
|
||||||
#define BOARD_CODEC_I2C_BASEADDR LPI2C2
|
|
||||||
#define BOARD_CODEC_I2C_CLOCK_FREQ 12000000
|
|
||||||
#define BOARD_CODEC_I2C_INSTANCE 2
|
|
||||||
|
|
||||||
/*! @brief Indexes of the TSI channels for on-board electrodes */
|
|
||||||
#ifndef BOARD_TSI_ELECTRODE_1
|
|
||||||
#define BOARD_TSI_ELECTRODE_1 3U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*! @brief Indexes of the TSI mutual channels for FRDM-TOUCH board */
|
|
||||||
#define BOARD_TSI_MUTUAL_TX_ELECTRODE_1 0U
|
|
||||||
#define BOARD_TSI_MUTUAL_RX_ELECTRODE_1 14U
|
|
||||||
|
|
||||||
#ifndef BOARD_LED_RED_GPIO
|
|
||||||
#define BOARD_LED_RED_GPIO GPIO0
|
|
||||||
#endif
|
|
||||||
#ifndef BOARD_LED_RED_GPIO_PIN
|
|
||||||
#define BOARD_LED_RED_GPIO_PIN 10U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BOARD_LED_BLUE_GPIO
|
|
||||||
#define BOARD_LED_BLUE_GPIO GPIO1
|
|
||||||
#endif
|
|
||||||
#ifndef BOARD_LED_BLUE_GPIO_PIN
|
|
||||||
#define BOARD_LED_BLUE_GPIO_PIN 2U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BOARD_LED_GREEN_GPIO
|
|
||||||
#define BOARD_LED_GREEN_GPIO GPIO0
|
|
||||||
#endif
|
|
||||||
#ifndef BOARD_LED_GREEN_GPIO_PIN
|
|
||||||
#define BOARD_LED_GREEN_GPIO_PIN 27U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BOARD_SW2_GPIO
|
|
||||||
#define BOARD_SW2_GPIO GPIO0
|
|
||||||
#endif
|
|
||||||
#ifndef BOARD_SW2_GPIO_PIN
|
|
||||||
#define BOARD_SW2_GPIO_PIN 23U
|
|
||||||
#endif
|
|
||||||
#define BOARD_SW2_NAME "SW2"
|
|
||||||
#define BOARD_SW2_IRQ GPIO00_IRQn
|
|
||||||
#define BOARD_SW2_IRQ_HANDLER GPIO00_IRQHandler
|
|
||||||
|
|
||||||
#ifndef BOARD_SW3_GPIO
|
|
||||||
#define BOARD_SW3_GPIO GPIO0
|
|
||||||
#endif
|
|
||||||
#ifndef BOARD_SW3_GPIO_PIN
|
|
||||||
#define BOARD_SW3_GPIO_PIN 6U
|
|
||||||
#endif
|
|
||||||
#define BOARD_SW3_NAME "SW3"
|
|
||||||
#define BOARD_SW3_IRQ GPIO00_IRQn
|
|
||||||
#define BOARD_SW3_IRQ_HANDLER GPIO00_IRQHandler
|
|
||||||
|
|
||||||
/* USB PHY condfiguration */
|
|
||||||
#define BOARD_USB_PHY_D_CAL (0x04U)
|
|
||||||
#define BOARD_USB_PHY_TXCAL45DP (0x07U)
|
|
||||||
#define BOARD_USB_PHY_TXCAL45DM (0x07U)
|
|
||||||
|
|
||||||
#define BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED (1)
|
|
||||||
|
|
||||||
/* Board led color mapping */
|
|
||||||
#define LOGIC_LED_ON 0U
|
|
||||||
#define LOGIC_LED_OFF 1U
|
|
||||||
|
|
||||||
#define LED_RED_INIT(output) \
|
|
||||||
GPIO_PinWrite(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PIN, output); \
|
|
||||||
BOARD_LED_RED_GPIO->PDDR |= (1U << BOARD_LED_RED_GPIO_PIN) /*!< Enable target LED_RED */
|
|
||||||
#define LED_RED_ON() GPIO_PortClear(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn on target LED_RED */
|
|
||||||
#define LED_RED_OFF() GPIO_PortSet(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN) /*!< Turn off target LED_RED */
|
|
||||||
#define LED_RED_TOGGLE() GPIO_PortToggle(BOARD_LED_RED_GPIO, 1U << BOARD_LED_RED_GPIO_PIN) /*!< Toggle on target LED_RED */
|
|
||||||
|
|
||||||
#define LED_BLUE_INIT(output) \
|
|
||||||
GPIO_PinWrite(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, output); \
|
|
||||||
BOARD_LED_BLUE_GPIO->PDDR |= (1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Enable target LED_BLUE */
|
|
||||||
#define LED_BLUE_ON() GPIO_PortClear(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */
|
|
||||||
#define LED_BLUE_OFF() GPIO_PortSet(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */
|
|
||||||
#define LED_BLUE_TOGGLE() GPIO_PortToggle(BOARD_LED_BLUE_GPIO, 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */
|
|
||||||
|
|
||||||
#define LED_GREEN_INIT(output) \
|
|
||||||
GPIO_PinWrite(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_GPIO_PIN, output); \
|
|
||||||
BOARD_LED_GREEN_GPIO->PDDR |= (1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Enable target LED_GREEN */
|
|
||||||
#define LED_GREEN_ON() GPIO_PortClear(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn on target LED_GREEN */
|
|
||||||
#define LED_GREEN_OFF() GPIO_PortSet(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Turn off target LED_GREEN */
|
|
||||||
#define LED_GREEN_TOGGLE() GPIO_PortToggle(BOARD_LED_GREEN_GPIO, 1U << BOARD_LED_GREEN_GPIO_PIN) /*!< Toggle on target LED_GREEN */
|
|
||||||
|
|
||||||
/* Display. */
|
|
||||||
#define BOARD_LCD_DC_GPIO GPIO0
|
|
||||||
#define BOARD_LCD_DC_GPIO_PORT 0U
|
|
||||||
#define BOARD_LCD_DC_GPIO_PIN 10U
|
|
||||||
|
|
||||||
/* Camera */
|
|
||||||
#define BOARD_CAMERA_I2C_BASEADDR LPI2C7
|
|
||||||
#define BOARD_CAMERA_I2C_INSTANCE 7
|
|
||||||
#define BOARD_CAMERA_I2C_CLOCK_FREQ CLOCK_GetLPFlexCommClkFreq(BOARD_CAMERA_I2C_INSTANCE)
|
|
||||||
|
|
||||||
/* Serial MWM WIFI */
|
|
||||||
#define BOARD_SERIAL_MWM_PORT_CLK_FREQ CLOCK_GetFlexCommClkFreq(2)
|
|
||||||
#define BOARD_SERIAL_MWM_PORT USART2
|
|
||||||
#define BOARD_SERIAL_MWM_PORT_IRQn FLEXCOMM2_IRQn
|
|
||||||
#define BOARD_SERIAL_MWM_RST_WRITE(output)
|
|
||||||
|
|
||||||
/*! @brief The EMVSIM SMARTCARD PHY configuration. */
|
|
||||||
#define BOARD_SMARTCARD_MODULE (EMVSIM0) /*!< SMARTCARD communicational module instance */
|
|
||||||
#define BOARD_SMARTCARD_MODULE_IRQ (EMVSIM0_IRQn) /*!< SMARTCARD communicational module IRQ handler */
|
|
||||||
#define BOARD_SMARTCARD_CLOCK_MODULE_CLK_FREQ (CLOCK_GetEmvsimClkFreq(0U))
|
|
||||||
#define BOARD_SMARTCARD_CLOCK_VALUE (4000000U) /*!< SMARTCARD clock frequency */
|
|
||||||
|
|
||||||
/* ERPC LPSPI configuration */
|
|
||||||
#define ERPC_BOARD_LPSPI_SLAVE_READY_USE_GPIO (1)
|
|
||||||
#define ERPC_BOARD_LPSPI_BASEADDR LPSPI3
|
|
||||||
#define ERPC_BOARD_LPSPI_BAUDRATE 500000U
|
|
||||||
#define ERPC_BOARD_LPSPI_CLKSRC kCLOCK_Flexcomm3
|
|
||||||
#define ERPC_BOARD_LPSPI_CLK_FREQ 12000000 // CLOCK_GetFlexCommClkFreq(1)
|
|
||||||
#define ERPC_BOARD_LPSPI_INT_GPIO GPIO0
|
|
||||||
#define ERPC_BOARD_LPSPI_INT_PIN 16U
|
|
||||||
#define ERPC_BOARD_LPSPI_INT_PIN_IRQ PIN_INT0_IRQn
|
|
||||||
#define ERPC_BOARD_LPSPI_INT_PIN_IRQ_HANDLER PIN_INT0_IRQHandler
|
|
||||||
|
|
||||||
/* ERPC LPI2C configuration */
|
|
||||||
#define ERPC_BOARD_LPI2C_BASEADDR LPI2C0_BASE
|
|
||||||
#define ERPC_BOARD_LPI2C_BAUDRATE 100000U
|
|
||||||
#define ERPC_BOARD_LPI2C_CLKSRC kCLOCK_Flexcomm0
|
|
||||||
#define ERPC_BOARD_LPI2C_CLK_FREQ 12000000 // CLOCK_GetFlexCommClkFreq(2)
|
|
||||||
#define ERPC_BOARD_LPI2C_INT_GPIO GPIO1
|
|
||||||
#define ERPC_BOARD_LPI2C_INT_PIN 0U
|
|
||||||
#define ERPC_BOARD_LPI2C_INT_PIN_IRQ PIN_INT1_IRQn
|
|
||||||
#define ERPC_BOARD_LPI2C_INT_PIN_IRQ_HANDLER PIN_INT1_IRQHandler
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
void BOARD_InitDebugConsole(void);
|
|
||||||
void BOARD_InitDebugConsole_Core1(void);
|
|
||||||
#if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED
|
|
||||||
void BOARD_LPI2C_Init(LPI2C_Type *base, uint32_t clkSrc_Hz);
|
|
||||||
status_t BOARD_LPI2C_Send(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subaddressSize,
|
|
||||||
uint8_t *txBuff,
|
|
||||||
uint8_t txBuffSize);
|
|
||||||
status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subaddressSize,
|
|
||||||
uint8_t *rxBuff,
|
|
||||||
uint8_t rxBuffSize);
|
|
||||||
status_t BOARD_LPI2C_SendSCCB(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subaddressSize,
|
|
||||||
uint8_t *txBuff,
|
|
||||||
uint8_t txBuffSize);
|
|
||||||
status_t BOARD_LPI2C_ReceiveSCCB(LPI2C_Type *base,
|
|
||||||
uint8_t deviceAddress,
|
|
||||||
uint32_t subAddress,
|
|
||||||
uint8_t subaddressSize,
|
|
||||||
uint8_t *rxBuff,
|
|
||||||
uint8_t rxBuffSize);
|
|
||||||
void BOARD_Accel_I2C_Init(void);
|
|
||||||
status_t BOARD_Accel_I2C_Send(uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint32_t txBuff);
|
|
||||||
status_t BOARD_Accel_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
|
||||||
void BOARD_Codec_I2C_Init(void);
|
|
||||||
status_t BOARD_Codec_I2C_Send(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
|
|
||||||
status_t BOARD_Codec_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
|
||||||
void BOARD_Camera_I2C_Init(void);
|
|
||||||
status_t BOARD_Camera_I2C_Send(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
|
|
||||||
status_t BOARD_Camera_I2C_Receive(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
|
||||||
|
|
||||||
status_t BOARD_Camera_I2C_SendSCCB(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, const uint8_t *txBuff, uint8_t txBuffSize);
|
|
||||||
status_t BOARD_Camera_I2C_ReceiveSCCB(
|
|
||||||
uint8_t deviceAddress, uint32_t subAddress, uint8_t subAddressSize, uint8_t *rxBuff, uint8_t rxBuffSize);
|
|
||||||
#endif /* SDK_I2C_BASED_COMPONENT_USED */
|
|
||||||
|
|
||||||
void BOARD_PowerMode_OD(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus */
|
|
||||||
|
|
||||||
#endif /* _BOARD_H_ */
|
|
||||||
@@ -1,354 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022-2023 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/***********************************************************************************************************************
|
|
||||||
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
|
||||||
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
|
||||||
**********************************************************************************************************************/
|
|
||||||
/*
|
|
||||||
* How to setup clock using clock driver functions:
|
|
||||||
*
|
|
||||||
* 1. Setup clock sources.
|
|
||||||
*
|
|
||||||
* 2. Set up wait states of the flash.
|
|
||||||
*
|
|
||||||
* 3. Set up all dividers.
|
|
||||||
*
|
|
||||||
* 4. Set up all selectors to provide selected clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!GlobalInfo
|
|
||||||
product: Clocks v11.0
|
|
||||||
processor: MCXN947
|
|
||||||
package_id: MCXN947VDF
|
|
||||||
mcu_data: ksdk2_0
|
|
||||||
processor_version: 0.13.10
|
|
||||||
board: FRDM-MCXN947
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
#include "fsl_clock.h"
|
|
||||||
#include "clock_config.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables
|
|
||||||
******************************************************************************/
|
|
||||||
/* System clock frequency. */
|
|
||||||
extern uint32_t SystemCoreClock;
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
************************ BOARD_InitBootClocks function ************************
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_InitBootClocks(void)
|
|
||||||
{
|
|
||||||
BOARD_BootClockPLL150M();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockFRO12M **********************
|
|
||||||
******************************************************************************/
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!Configuration
|
|
||||||
name: BOARD_BootClockFRO12M
|
|
||||||
outputs:
|
|
||||||
- {id: CLK_144M_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: CLK_48M_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: FRO_12M_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: MAIN_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: Slow_clock.outFreq, value: 3 MHz}
|
|
||||||
- {id: System_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: gdet_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: trng_clock.outFreq, value: 48 MHz}
|
|
||||||
settings:
|
|
||||||
- {id: RunPowerMode, value: OD}
|
|
||||||
- {id: SCGMode, value: SIRC}
|
|
||||||
- {id: SCG.SCSSEL.sel, value: SCG.SIRC}
|
|
||||||
- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}
|
|
||||||
- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables for BOARD_BootClockFRO12M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code for BOARD_BootClockFRO12M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_BootClockFRO12M(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(kCLOCK_Scg); /*!< Enable SCG clock */
|
|
||||||
|
|
||||||
CLOCK_SetFLASHAccessCyclesForFreq(12000000U, kOD_Mode); /*!< Set the additional number of flash wait-states */
|
|
||||||
|
|
||||||
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
|
||||||
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO12M */
|
|
||||||
|
|
||||||
/*!< Set up dividers */
|
|
||||||
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U); /*!< Set AHBCLKDIV divider to value 1 */
|
|
||||||
|
|
||||||
/* Set SystemCoreClock variable */
|
|
||||||
SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************* Configuration BOARD_BootClockFROHF48M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!Configuration
|
|
||||||
name: BOARD_BootClockFROHF48M
|
|
||||||
outputs:
|
|
||||||
- {id: CLK_144M_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: CLK_48M_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: FRO_12M_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: FRO_HF_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: MAIN_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: Slow_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: System_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: gdet_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: trng_clock.outFreq, value: 48 MHz}
|
|
||||||
settings:
|
|
||||||
- {id: RunPowerMode, value: OD}
|
|
||||||
- {id: SYSCON.FLEXSPICLKSEL.sel, value: NO_CLOCK}
|
|
||||||
- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables for BOARD_BootClockFROHF48M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code for BOARD_BootClockFROHF48M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_BootClockFROHF48M(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(kCLOCK_Scg); /*!< Enable SCG clock */
|
|
||||||
|
|
||||||
/* FRO OSC setup - begin, enable the FRO for safety switching */
|
|
||||||
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12M first to ensure we can change the clock setting */
|
|
||||||
|
|
||||||
CLOCK_SetFLASHAccessCyclesForFreq(48000000U, kOD_Mode); /*!< Set the additional number of flash wait-states */
|
|
||||||
|
|
||||||
CLOCK_SetupFROHFClocking(48000000U); /*!< Enable FRO HF(48MHz) output */
|
|
||||||
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
|
||||||
CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */
|
|
||||||
|
|
||||||
/*!< Set up dividers */
|
|
||||||
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U); /*!< Set AHBCLKDIV divider to value 1 */
|
|
||||||
|
|
||||||
/* Set SystemCoreClock variable */
|
|
||||||
SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************* Configuration BOARD_BootClockFROHF144M ********************
|
|
||||||
******************************************************************************/
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!Configuration
|
|
||||||
name: BOARD_BootClockFROHF144M
|
|
||||||
outputs:
|
|
||||||
- {id: CLK_144M_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: CLK_48M_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: FRO_12M_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: FRO_HF_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: MAIN_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: Slow_clock.outFreq, value: 36 MHz}
|
|
||||||
- {id: System_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: gdet_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: trng_clock.outFreq, value: 48 MHz}
|
|
||||||
settings:
|
|
||||||
- {id: RunPowerMode, value: OD}
|
|
||||||
- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true}
|
|
||||||
- {id: SYSCON.FLEXSPICLKSEL.sel, value: NO_CLOCK}
|
|
||||||
- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
sources:
|
|
||||||
- {id: SCG.FIRC.outFreq, value: 144 MHz}
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables for BOARD_BootClockFROHF144M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code for BOARD_BootClockFROHF144M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_BootClockFROHF144M(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(kCLOCK_Scg); /*!< Enable SCG clock */
|
|
||||||
|
|
||||||
/* FRO OSC setup - begin, enable the FRO for safety switching */
|
|
||||||
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12M first to ensure we can change the clock setting */
|
|
||||||
|
|
||||||
CLOCK_SetFLASHAccessCyclesForFreq(144000000U, kOD_Mode); /*!< Set the additional number of flash wait-states */
|
|
||||||
|
|
||||||
CLOCK_SetupFROHFClocking(144000000U); /*!< Enable FRO HF(144MHz) output */
|
|
||||||
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
|
||||||
CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */
|
|
||||||
|
|
||||||
/*!< Set up dividers */
|
|
||||||
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U); /*!< Set AHBCLKDIV divider to value 1 */
|
|
||||||
|
|
||||||
/* Set SystemCoreClock variable */
|
|
||||||
SystemCoreClock = BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockPLL150M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!Configuration
|
|
||||||
name: BOARD_BootClockPLL150M
|
|
||||||
called_from_default_init: true
|
|
||||||
outputs:
|
|
||||||
- {id: CLK_144M_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: CLK_48M_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: FRO_12M_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: FRO_HF_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: MAIN_clock.outFreq, value: 150 MHz}
|
|
||||||
- {id: PLL0_CLK_clock.outFreq, value: 150 MHz}
|
|
||||||
- {id: Slow_clock.outFreq, value: 37.5 MHz}
|
|
||||||
- {id: System_clock.outFreq, value: 150 MHz}
|
|
||||||
- {id: gdet_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: trng_clock.outFreq, value: 48 MHz}
|
|
||||||
settings:
|
|
||||||
- {id: PLL0_Mode, value: Normal}
|
|
||||||
- {id: RunPowerMode, value: OD}
|
|
||||||
- {id: SCGMode, value: PLL0}
|
|
||||||
- {id: SCG.PLL0M_MULT.scale, value: '50', locked: true}
|
|
||||||
- {id: SCG.PLL0SRCSEL.sel, value: SCG.FIRC_48M}
|
|
||||||
- {id: SCG.PLL0_NDIV.scale, value: '8', locked: true}
|
|
||||||
- {id: SCG.SCSSEL.sel, value: SCG.PLL0_CLK}
|
|
||||||
- {id: SYSCON.FLEXSPICLKSEL.sel, value: NO_CLOCK}
|
|
||||||
- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables for BOARD_BootClockPLL150M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code for BOARD_BootClockPLL150M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_BootClockPLL150M(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(kCLOCK_Scg); /*!< Enable SCG clock */
|
|
||||||
|
|
||||||
/* FRO OSC setup - begin, enable the FRO for safety switching */
|
|
||||||
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12M first to ensure we can change the clock setting */
|
|
||||||
|
|
||||||
CLOCK_SetFLASHAccessCyclesForFreq(150000000U, kOD_Mode); /*!< Set the additional number of flash wait-states */
|
|
||||||
|
|
||||||
CLOCK_SetupFROHFClocking(48000000U); /*!< Enable FRO HF(48MHz) output */
|
|
||||||
/*!< Set up PLL0 */
|
|
||||||
const pll_setup_t pll0Setup = {
|
|
||||||
.pllctrl = SCG_APLLCTRL_SOURCE(1U) | SCG_APLLCTRL_SELI(27U) | SCG_APLLCTRL_SELP(13U),
|
|
||||||
.pllndiv = SCG_APLLNDIV_NDIV(8U),
|
|
||||||
.pllpdiv = SCG_APLLPDIV_PDIV(1U),
|
|
||||||
.pllmdiv = SCG_APLLMDIV_MDIV(50U),
|
|
||||||
.pllRate = 150000000U
|
|
||||||
};
|
|
||||||
CLOCK_SetPLL0Freq(&pll0Setup); /*!< Configure PLL0 to the desired values */
|
|
||||||
CLOCK_SetPll0MonitorMode(kSCG_Pll0MonitorDisable); /* Pll0 Monitor is disabled */
|
|
||||||
|
|
||||||
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
|
||||||
CLOCK_AttachClk(kPLL0_to_MAIN_CLK); /*!< Switch MAIN_CLK to PLL0 */
|
|
||||||
|
|
||||||
/*!< Set up dividers */
|
|
||||||
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U); /*!< Set AHBCLKDIV divider to value 1 */
|
|
||||||
|
|
||||||
/* Set SystemCoreClock variable */
|
|
||||||
SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockPLL100M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/* clang-format off */
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!Configuration
|
|
||||||
name: BOARD_BootClockPLL100M
|
|
||||||
outputs:
|
|
||||||
- {id: CLK_144M_clock.outFreq, value: 144 MHz}
|
|
||||||
- {id: CLK_48M_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: CLK_IN_clock.outFreq, value: 24 MHz}
|
|
||||||
- {id: FRO_12M_clock.outFreq, value: 12 MHz}
|
|
||||||
- {id: MAIN_clock.outFreq, value: 100 MHz}
|
|
||||||
- {id: PLL1_CLK_clock.outFreq, value: 100 MHz}
|
|
||||||
- {id: Slow_clock.outFreq, value: 25 MHz}
|
|
||||||
- {id: System_clock.outFreq, value: 100 MHz}
|
|
||||||
- {id: gdet_clock.outFreq, value: 48 MHz}
|
|
||||||
- {id: trng_clock.outFreq, value: 48 MHz}
|
|
||||||
settings:
|
|
||||||
- {id: PLL1_Mode, value: Normal}
|
|
||||||
- {id: RunPowerMode, value: OD}
|
|
||||||
- {id: SCGMode, value: PLL1}
|
|
||||||
- {id: SCG.PLL1M_MULT.scale, value: '100', locked: true}
|
|
||||||
- {id: SCG.PLL1_NDIV.scale, value: '6', locked: true}
|
|
||||||
- {id: SCG.PLL1_PDIV.scale, value: '4', locked: true}
|
|
||||||
- {id: SCG.SCSSEL.sel, value: SCG.PLL1_CLK}
|
|
||||||
- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}
|
|
||||||
- {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}
|
|
||||||
- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}
|
|
||||||
sources:
|
|
||||||
- {id: SCG.SOSC.outFreq, value: 24 MHz, enabled: true}
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Variables for BOARD_BootClockPLL100M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Code for BOARD_BootClockPLL100M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_BootClockPLL100M(void)
|
|
||||||
{
|
|
||||||
CLOCK_EnableClock(kCLOCK_Scg); /*!< Enable SCG clock */
|
|
||||||
|
|
||||||
/* FRO OSC setup - begin, enable the FRO for safety switching */
|
|
||||||
CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12M first to ensure we can change the clock setting */
|
|
||||||
|
|
||||||
CLOCK_SetFLASHAccessCyclesForFreq(100000000U, kOD_Mode); /*!< Set the additional number of flash wait-states */
|
|
||||||
|
|
||||||
CLOCK_SetupExtClocking(24000000U);
|
|
||||||
CLOCK_SetSysOscMonitorMode(kSCG_SysOscMonitorDisable); /* System OSC Clock Monitor is disabled */
|
|
||||||
|
|
||||||
/*!< Set up PLL1 */
|
|
||||||
const pll_setup_t pll1Setup = {
|
|
||||||
.pllctrl = SCG_SPLLCTRL_SOURCE(0U) | SCG_SPLLCTRL_SELI(53U) | SCG_SPLLCTRL_SELP(26U),
|
|
||||||
.pllndiv = SCG_SPLLNDIV_NDIV(6U),
|
|
||||||
.pllpdiv = SCG_SPLLPDIV_PDIV(2U),
|
|
||||||
.pllmdiv = SCG_SPLLMDIV_MDIV(100U),
|
|
||||||
.pllRate = 100000000U
|
|
||||||
};
|
|
||||||
CLOCK_SetPLL1Freq(&pll1Setup); /*!< Configure PLL1 to the desired values */
|
|
||||||
CLOCK_SetPll1MonitorMode(kSCG_Pll1MonitorDisable); /* Pll1 Monitor is disabled */
|
|
||||||
|
|
||||||
/*!< Set up clock selectors - Attach clocks to the peripheries */
|
|
||||||
CLOCK_AttachClk(kPLL1_to_MAIN_CLK); /*!< Switch MAIN_CLK to PLL1 */
|
|
||||||
|
|
||||||
/*!< Set up dividers */
|
|
||||||
CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U); /*!< Set AHBCLKDIV divider to value 1 */
|
|
||||||
|
|
||||||
/* Set SystemCoreClock variable */
|
|
||||||
SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022-2023 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/***********************************************************************************************************************
|
|
||||||
* This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
|
|
||||||
* will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
|
|
||||||
**********************************************************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _CLOCK_CONFIG_H_
|
|
||||||
#define _CLOCK_CONFIG_H_
|
|
||||||
|
|
||||||
#include "fsl_common.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
************************ BOARD_InitBootClocks function ************************
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes default configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_InitBootClocks(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockFRO12M **********************
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions for BOARD_BootClockFRO12M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK 12000000U /*!< Core clock frequency: 12000000Hz */
|
|
||||||
#define BOARD_BOOTCLOCKFRO12M_ROSC_CLOCK 0U /*!< ROSC clock frequency: 0Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API for BOARD_BootClockFRO12M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_BootClockFRO12M(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************* Configuration BOARD_BootClockFROHF48M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions for BOARD_BootClockFROHF48M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK 48000000U /*!< Core clock frequency: 48000000Hz */
|
|
||||||
#define BOARD_BOOTCLOCKFROHF48M_ROSC_CLOCK 0U /*!< ROSC clock frequency: 0Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API for BOARD_BootClockFROHF48M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_BootClockFROHF48M(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************* Configuration BOARD_BootClockFROHF144M ********************
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions for BOARD_BootClockFROHF144M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK 144000000U /*!< Core clock frequency: 144000000Hz */
|
|
||||||
#define BOARD_BOOTCLOCKFROHF144M_ROSC_CLOCK 0U /*!< ROSC clock frequency: 0Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API for BOARD_BootClockFROHF144M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_BootClockFROHF144M(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockPLL150M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions for BOARD_BootClockPLL150M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK 150000000U /*!< Core clock frequency: 150000000Hz */
|
|
||||||
#define BOARD_BOOTCLOCKPLL150M_ROSC_CLOCK 0U /*!< ROSC clock frequency: 0Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API for BOARD_BootClockPLL150M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_BootClockPLL150M(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
******************** Configuration BOARD_BootClockPLL100M *********************
|
|
||||||
******************************************************************************/
|
|
||||||
/*******************************************************************************
|
|
||||||
* Definitions for BOARD_BootClockPLL100M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK 100000000U /*!< Core clock frequency: 100000000Hz */
|
|
||||||
#define BOARD_BOOTCLOCKPLL100M_ROSC_CLOCK 0U /*!< ROSC clock frequency: 0Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* API for BOARD_BootClockPLL100M configuration
|
|
||||||
******************************************************************************/
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* @brief This function executes configuration of clocks.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void BOARD_BootClockPLL100M(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /* __cplusplus*/
|
|
||||||
|
|
||||||
#endif /* _CLOCK_CONFIG_H_ */
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
|
|
||||||
!!GlobalInfo
|
|
||||||
product: Peripherals v1.0
|
|
||||||
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Included files
|
|
||||||
******************************************************************************/
|
|
||||||
#include "peripherals.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* BOARD_InitBootPeripherals function
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_InitBootPeripherals(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2022 NXP
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _PERIPHERALS_H_
|
|
||||||
#define _PERIPHERALS_H_
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif /*_cplusplus. */
|
|
||||||
/*******************************************************************************
|
|
||||||
* BOARD_InitBootPeripherals function
|
|
||||||
******************************************************************************/
|
|
||||||
void BOARD_InitBootPeripherals(void);
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif /*_cplusplus. */
|
|
||||||
|
|
||||||
#endif /* _PERIPHERALS_H_ */
|
|
||||||
Loaded 100 of 5364 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user