mirror of
https://github.com/apache/nuttx-apps.git
synced 2026-08-02 04:39:01 +00:00
Compare commits
3335 commits
nuttx-10.3
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37a1f0e068 | ||
|
|
20dc5e5167 | ||
|
|
859c014d4d | ||
|
|
5f286fc924 | ||
|
|
2631d3e59a | ||
|
|
be43888aa5 | ||
|
|
fc14d02ae0 | ||
|
|
917e2e860b | ||
|
|
484474bbbe | ||
|
|
92c3b6446d | ||
|
|
07c1234372 | ||
|
|
6870186707 | ||
|
|
2492317f15 | ||
|
|
3a03552c6a | ||
|
|
b695ec057f | ||
|
|
ce49ac9053 | ||
|
|
ae601e2892 | ||
|
|
636047a4e0 | ||
|
|
61161866f0 | ||
|
|
b42589e8e7 | ||
|
|
a5c0e9c188 | ||
|
|
57e761f724 | ||
|
|
fabafbc361 | ||
|
|
8d5e9f3754 | ||
|
|
f2ceac78db | ||
|
|
3ecd036f8f | ||
|
|
355d090d83 | ||
|
|
101b713be6 | ||
|
|
6ca1272b99 | ||
|
|
690ec808e5 | ||
|
|
ae237624ee | ||
|
|
48eb95998b | ||
|
|
893f0c31ee | ||
|
|
51bfd48e78 | ||
|
|
0304721c85 | ||
|
|
094b988be3 | ||
|
|
86afa6d182 | ||
|
|
d273af4834 | ||
|
|
e751331ecb | ||
|
|
c02683e282 | ||
|
|
608f13fd4b | ||
|
|
01c6a60581 | ||
|
|
067b0ccf28 | ||
|
|
593bfca047 | ||
|
|
c814059f6c | ||
|
|
4d3bb6e7c9 | ||
|
|
1e490d3fbe | ||
|
|
865393d419 | ||
|
|
98f683dea8 | ||
|
|
7469e88bfa | ||
|
|
5114ddd6c0 | ||
|
|
09682dad05 | ||
|
|
62d04ed484 | ||
|
|
eceb30e59c | ||
|
|
f5b2c354ca | ||
|
|
850f481344 | ||
|
|
b39228cd41 | ||
|
|
3762a64bc6 | ||
|
|
9b540556a1 | ||
|
|
62b7e95530 | ||
|
|
1d5f816874 | ||
|
|
2bcc6b96ea | ||
|
|
1d15c81f69 | ||
|
|
27c466a429 | ||
|
|
d071a0b585 | ||
|
|
33b528a0de | ||
|
|
707b24e5cb | ||
|
|
0566af556a | ||
|
|
17b028e592 | ||
|
|
7fa0767e30 | ||
|
|
fd525988f8 | ||
|
|
13f04f65b1 | ||
|
|
5226be524c | ||
|
|
54905cd0ff | ||
|
|
662133eeca | ||
|
|
50ffee7a85 | ||
|
|
3dc9bd4598 | ||
|
|
81accb0832 | ||
|
|
cb7097a4e7 | ||
|
|
dd109a88de | ||
|
|
26c5dd8305 | ||
|
|
3f04a28cbd | ||
|
|
dd24407c71 | ||
|
|
5971d9c19f | ||
|
|
64f9e8a4b7 | ||
|
|
c785d40af7 | ||
|
|
962d90bb6e | ||
|
|
caa7d7faa5 | ||
|
|
c706dd87a7 | ||
|
|
e94e89113a | ||
|
|
f1d53c875d | ||
|
|
c0228d7b57 | ||
|
|
6eead56aa9 | ||
|
|
da3234f936 | ||
|
|
afe2a0eafc | ||
|
|
4d5f60005c | ||
|
|
ec134a99a8 | ||
|
|
8e00b4d672 | ||
|
|
59d3a0d0ae | ||
|
|
c91abf2c8d | ||
|
|
e61f46536e | ||
|
|
e3f7126a8f | ||
|
|
53bc21feb8 | ||
|
|
073188b50d | ||
|
|
53ca441b32 | ||
|
|
5ead824fff | ||
|
|
fc25af7cd7 | ||
|
|
9b51035300 | ||
|
|
f57aa7b4cf | ||
|
|
c503843e38 | ||
|
|
535ecd8640 | ||
|
|
d172f81ecc | ||
|
|
4c560ef0a2 | ||
|
|
a2b1cc16da | ||
|
|
253f1d40c3 | ||
|
|
d29ae9bda6 | ||
|
|
ae718ba47f | ||
|
|
fee2ddbf54 | ||
|
|
e44c4f370f | ||
|
|
cea2f89f74 | ||
|
|
085ca0606e | ||
|
|
da143595e1 | ||
|
|
d9874394dd | ||
|
|
326b68aa36 | ||
|
|
75ee4d9090 | ||
|
|
65854ea805 | ||
|
|
477d04b975 | ||
|
|
1a6d06c3be | ||
|
|
8d6c495365 | ||
|
|
d1202bd501 | ||
|
|
ee4727fdba | ||
|
|
1e19ceb347 | ||
|
|
b523f0e513 | ||
|
|
ec764fbbab | ||
|
|
d6cf3015d8 | ||
|
|
4263e27d92 | ||
|
|
d106011a7f | ||
|
|
c51180d780 | ||
|
|
4740945157 | ||
|
|
afc652243e | ||
|
|
c00dc40525 | ||
|
|
e18a206082 | ||
|
|
397047fa37 | ||
|
|
499352fb0c | ||
|
|
fa2dd70386 | ||
|
|
03171162f1 | ||
|
|
8b43c71595 | ||
|
|
33d96e92e5 | ||
|
|
8b4d20e411 | ||
|
|
80907e514c | ||
|
|
0758631811 | ||
|
|
1d7d4fe67e | ||
|
|
d79d8107b3 | ||
|
|
b73a5acf92 | ||
|
|
63c691eae2 | ||
|
|
84d6b1276f | ||
|
|
78bf19c83c | ||
|
|
b0fdffb7f6 | ||
|
|
62b74502fe | ||
|
|
3d26835e0c | ||
|
|
df01c3cbfc | ||
|
|
e86c0b997d | ||
|
|
840c2f30db | ||
|
|
c106a02b58 | ||
|
|
97802bd9e0 | ||
|
|
740fda9630 | ||
|
|
0d35e2e0bb | ||
|
|
3a255d5463 | ||
|
|
9796690b7b | ||
|
|
1081225509 | ||
|
|
5e91459b1a | ||
|
|
0a0118b93c | ||
|
|
3d6ea0ccec | ||
|
|
fa46bdf9e8 | ||
|
|
07647d3fd4 | ||
|
|
c0fc208202 | ||
|
|
a74b2fc61b | ||
|
|
b5b54e7663 | ||
|
|
418cf21224 | ||
|
|
2b5899c7d4 | ||
|
|
6d8708184e | ||
|
|
241096a87b | ||
|
|
c28e61fd39 | ||
|
|
5341a2fc92 | ||
|
|
d8ead1a0f3 | ||
|
|
820eb64f1a | ||
|
|
cdb89a54f6 | ||
|
|
7af8ed81fd | ||
|
|
610de9816d | ||
|
|
84e87a5158 | ||
|
|
84f798d434 | ||
|
|
8049d91a95 | ||
|
|
4281a1096f | ||
|
|
7c02e7f555 | ||
|
|
8594627d8a | ||
|
|
492a86691d | ||
|
|
ed063a0981 | ||
|
|
72bedd5c5d | ||
|
|
d0fa5af39b | ||
|
|
84022eaa81 | ||
|
|
939ed0ca2a | ||
|
|
55a7d4d2df | ||
|
|
9a0c249c79 | ||
|
|
7dbebe1673 | ||
|
|
cb316ec165 | ||
|
|
b1a4d3fcd5 | ||
|
|
e764594d26 | ||
|
|
98d3a0bcb0 | ||
|
|
0f8f9125f0 | ||
|
|
0dd221cc76 | ||
|
|
2d949fa7c5 | ||
|
|
f8a48fa5f3 | ||
|
|
2d6cd74215 | ||
|
|
8568013436 | ||
|
|
c44f9a0556 | ||
|
|
58b780c280 | ||
|
|
965cddfa36 | ||
|
|
c9c5c75d08 | ||
|
|
5cce60aa9a | ||
|
|
2ad3e4e17b | ||
|
|
5355adb9cf | ||
|
|
fcd10aa725 | ||
|
|
b4f1e29494 | ||
|
|
5c703f5603 | ||
|
|
f9f59bd0f8 | ||
|
|
e9d1141f7c | ||
|
|
faf07ed3b0 | ||
|
|
0be4928893 | ||
|
|
2a3a41d53a | ||
|
|
bda3448106 | ||
|
|
43bc7e99d6 | ||
|
|
173e19cde1 | ||
|
|
02153debae | ||
|
|
e536adaabc | ||
|
|
ecfc1b5b61 | ||
|
|
f0f7c5ada9 | ||
|
|
8ba84edb0a | ||
|
|
2fce07fe1c | ||
|
|
8bd6615034 | ||
|
|
86fb38fbe4 | ||
|
|
bb7c83b01c | ||
|
|
c10ce6aa4f | ||
|
|
21b28a4126 | ||
|
|
5d15d97418 | ||
|
|
97485342aa | ||
|
|
275a083464 | ||
|
|
a6477ec8dc | ||
|
|
72837c8d26 | ||
|
|
ed746548ca | ||
|
|
3adb14f12d | ||
|
|
783957da07 | ||
|
|
b3cf222836 | ||
|
|
dca76ccb78 | ||
|
|
5b0cae9ab0 | ||
|
|
a9881037ea | ||
|
|
ded0a17514 | ||
|
|
0105a9b238 | ||
|
|
c82957109f | ||
|
|
4b705721ca | ||
|
|
62f3d37041 | ||
|
|
6379e531de | ||
|
|
9b6b7607f2 | ||
|
|
6cb1a04fe7 | ||
|
|
901278a4ba | ||
|
|
eccfba4776 | ||
|
|
180607372a | ||
|
|
773f69d5d9 | ||
|
|
2016c0b6ae | ||
|
|
2ee08209a0 | ||
|
|
8e9f5a8d3a | ||
|
|
722f3193ce | ||
|
|
f22a8d0d4f | ||
|
|
a6c11a1db7 | ||
|
|
7dc8cec1ac | ||
|
|
96a003072d | ||
|
|
9d849adfab | ||
|
|
3591378113 | ||
|
|
bfbeafabbf | ||
|
|
f95b53d15b | ||
|
|
21dd3082c1 | ||
|
|
52b36deb13 | ||
|
|
a6286ee0ea | ||
|
|
9db3e26c85 | ||
|
|
231ac397a7 | ||
|
|
5c867b21e6 | ||
|
|
b8718d8c52 | ||
|
|
073df9d1de | ||
|
|
dc4ecc973e | ||
|
|
cd2b0c0e87 | ||
|
|
e564816e1d | ||
|
|
f3a7282230 | ||
|
|
6a1b2c6903 | ||
|
|
509b807462 | ||
|
|
460281a90f | ||
|
|
b986eef7a7 | ||
|
|
5fe0877989 | ||
|
|
7884410be2 | ||
|
|
193fadfaa8 | ||
|
|
cb880b7257 | ||
|
|
83af0a011e | ||
|
|
4decc1699a | ||
|
|
8cd9e9acc2 | ||
|
|
10056077f4 | ||
|
|
3a156581ca | ||
|
|
ea22a66dcf | ||
|
|
f90e1e184f | ||
|
|
68f9e5424b | ||
|
|
b5d151f73f | ||
|
|
8579459bb0 | ||
|
|
2964c8cc3d | ||
|
|
45d4c7098b | ||
|
|
af7222ec9f | ||
|
|
7d13ee204b | ||
|
|
c46ed184ed | ||
|
|
e4b84b29d4 | ||
|
|
256d6685d5 | ||
|
|
d33830e83f | ||
|
|
0bbf5dc092 | ||
|
|
1c0281be15 | ||
|
|
e69f9e902b | ||
|
|
9b84a0ab02 | ||
|
|
05e8b0ae60 | ||
|
|
da105afee2 | ||
|
|
e0d118e349 | ||
|
|
0b084ded88 | ||
|
|
fe546acfc7 | ||
|
|
448b0bd0a6 | ||
|
|
3ce356378d | ||
|
|
a604c46b00 | ||
|
|
468ded86bb | ||
|
|
be2cdfa597 | ||
|
|
76e02c0dd6 | ||
|
|
1ab486d1d0 | ||
|
|
7289c27a85 | ||
|
|
d48b45000d | ||
|
|
bb9229de06 | ||
|
|
f9dc9bc21e | ||
|
|
eb9b9a2d60 | ||
|
|
b2d4ad67b1 | ||
|
|
eda1309745 | ||
|
|
d9d434d97e | ||
|
|
102c078834 | ||
|
|
2908f10154 | ||
|
|
8804f086b3 | ||
|
|
367e9dca01 | ||
|
|
b80d67c628 | ||
|
|
42e3566147 | ||
|
|
f2ba4883fa | ||
|
|
050fb406c2 | ||
|
|
4ac3732734 | ||
|
|
ebe2dd57dd | ||
|
|
71561d2979 | ||
|
|
06d07b1522 | ||
|
|
5eef7f324f | ||
|
|
52c2a8909b | ||
|
|
f86246f7c6 | ||
|
|
36e701448c | ||
|
|
7fb71aa57a | ||
|
|
1b8c90c12d | ||
|
|
35cf746025 | ||
|
|
b9bf7f5c4f | ||
|
|
62fe1a3ac5 | ||
|
|
69bfda8736 | ||
|
|
ce3e35233c | ||
|
|
429a65901f | ||
|
|
f687088453 | ||
|
|
e0e9f3d7e5 | ||
|
|
a16c545134 | ||
|
|
ae7a0d81e9 | ||
|
|
01e5e50619 | ||
|
|
a4b43521f4 | ||
|
|
0faaed99a5 | ||
|
|
8aa48c4fb6 | ||
|
|
35f3690a4c | ||
|
|
80c2b43197 | ||
|
|
9c022949e4 | ||
|
|
2d2394201c | ||
|
|
71593dffad | ||
|
|
c69df55cd0 | ||
|
|
34e4d7eacd | ||
|
|
d0e949cb24 | ||
|
|
b56c785640 | ||
|
|
9a3778cb91 | ||
|
|
854d00e49e | ||
|
|
1f990388ec | ||
|
|
d1de009bc2 | ||
|
|
c883c3f6dd | ||
|
|
5c822ea4d3 | ||
|
|
0e1ccbe35d | ||
|
|
72f57fc34e | ||
|
|
197401975a | ||
|
|
a454cf4d94 | ||
|
|
ada12ce175 | ||
|
|
183deb66e9 | ||
|
|
f09d0b2e09 | ||
|
|
715da6bde6 | ||
|
|
19dcc896d7 | ||
|
|
b72f7997a3 | ||
|
|
f16a45a854 | ||
|
|
5c6d646d76 | ||
|
|
094b0f235a | ||
|
|
122a4a6f4e | ||
|
|
3c99bad310 | ||
|
|
b6203955f9 | ||
|
|
338301de76 | ||
|
|
be26d79633 | ||
|
|
b86457dfcb | ||
|
|
8afe3c0645 | ||
|
|
4df2ce98aa | ||
|
|
df48348fca | ||
|
|
6249f22f97 | ||
|
|
5216065fb8 | ||
|
|
8146403512 | ||
|
|
10873c6b59 | ||
|
|
40a890626d | ||
|
|
72fe4e21e1 | ||
|
|
85b1a1c8c1 | ||
|
|
57ced95c07 | ||
|
|
690d8bddce | ||
|
|
825007aafb | ||
|
|
22f85e8b61 | ||
|
|
9148fb9718 | ||
|
|
37403210f9 | ||
|
|
5456849446 | ||
|
|
840c4fceef | ||
|
|
19dd2531fb | ||
|
|
755fae7ac1 | ||
|
|
ddc699a4f3 | ||
|
|
d9afe2db8c | ||
|
|
9c85568c4f | ||
|
|
d2902008fe | ||
|
|
bafe30898a | ||
|
|
49e2592e34 | ||
|
|
94ffd5e9f0 | ||
|
|
33d5062ba6 | ||
|
|
782de2748f | ||
|
|
a75fa37090 | ||
|
|
df30f84f33 | ||
|
|
5595a01fcd | ||
|
|
45a6b0365c | ||
|
|
056ba984e8 | ||
|
|
ed7bb51b14 | ||
|
|
7ba3638507 | ||
|
|
3d97bf02e4 | ||
|
|
11c8220fd5 | ||
|
|
faefee4897 | ||
|
|
54bef649ea | ||
|
|
e804886c68 | ||
|
|
0a90fe5167 | ||
|
|
c62d0d0875 | ||
|
|
63e2650487 | ||
|
|
6630c08783 | ||
|
|
27e0811312 | ||
|
|
91f55245eb | ||
|
|
2b0a4a20f5 | ||
|
|
859fc54c96 | ||
|
|
5f634815cb | ||
|
|
3e3b8c6936 | ||
|
|
60d814efa2 | ||
|
|
26fcdbd9ad | ||
|
|
32facd5b3a | ||
|
|
58c2473b38 | ||
|
|
af8ff17f95 | ||
|
|
680dca1121 | ||
|
|
429f24afbd | ||
|
|
b7b2ba37a1 | ||
|
|
97545f6ff9 | ||
|
|
58326d39dc | ||
|
|
b0b90ac728 | ||
|
|
a22bf844cd | ||
|
|
8d4e872402 | ||
|
|
7daac30cb4 | ||
|
|
d594c953a1 | ||
|
|
21f4156048 | ||
|
|
4e8a0ae4c4 | ||
|
|
63f61d080a | ||
|
|
13a019450a | ||
|
|
c61fb846d7 | ||
|
|
10eae1dc6b | ||
|
|
ae7c168bf6 | ||
|
|
9c4103d496 | ||
|
|
1512f9c6e5 | ||
|
|
416c315f92 | ||
|
|
73bc5cbcc6 | ||
|
|
ca11a7e093 | ||
|
|
4f93ec0a43 | ||
|
|
157ecb091d | ||
|
|
188838469c | ||
|
|
3467f9b82d | ||
|
|
150c5756a0 | ||
|
|
6830e297cf | ||
|
|
9ad4c3c395 | ||
|
|
85539a1223 | ||
|
|
c90b64ed8b | ||
|
|
710aef6bd0 | ||
|
|
e5c85d1ca2 | ||
|
|
03ca9ba500 | ||
|
|
54cbc2ee0d | ||
|
|
65d29de0f7 | ||
|
|
54d55fe5f4 | ||
|
|
d3504bf9b3 | ||
|
|
4426ce733a | ||
|
|
5d34a0906a | ||
|
|
832e61c1c4 | ||
|
|
e718fdd2c6 | ||
|
|
4411a41bc2 | ||
|
|
ac881e5108 | ||
|
|
28302ae7d7 | ||
|
|
d1f59bef8e | ||
|
|
e4ddfdeed1 | ||
|
|
3ddda82313 | ||
|
|
40c7982816 | ||
|
|
b2f7ead2dd | ||
|
|
1ca7838482 | ||
|
|
39310946ec | ||
|
|
9da2bc0696 | ||
|
|
fb4f80665d | ||
|
|
09ddb06c9d | ||
|
|
9f035ea0be | ||
|
|
9dc6781bf9 | ||
|
|
de6aac8afb | ||
|
|
74c71145da | ||
|
|
b56795e1e2 | ||
|
|
f89773cbc8 | ||
|
|
5d3b2d07d6 | ||
|
|
532a055abb | ||
|
|
de87836c7a | ||
|
|
4b3070c081 | ||
|
|
837c27d6e3 | ||
|
|
4d98ecccaf | ||
|
|
b78ab0c6e8 | ||
|
|
8856a587a6 | ||
|
|
951740627b | ||
|
|
008433dcfe | ||
|
|
0045d8b546 | ||
|
|
26a969ac71 | ||
|
|
c4da1b5b9f | ||
|
|
8cb7dd0694 | ||
|
|
a5e455cc1c | ||
|
|
c487d669cf | ||
|
|
8e7ec46cce | ||
|
|
60f5a68c96 | ||
|
|
953fa21fef | ||
|
|
a59436985c | ||
|
|
aa3320fab4 | ||
|
|
cfff7f5a22 | ||
|
|
dbc99dbf35 | ||
|
|
74293114aa | ||
|
|
00154fd818 | ||
|
|
f82e6c2229 | ||
|
|
2bc4bdadee | ||
|
|
c3b5c6cedf | ||
|
|
24e1c4df6f | ||
|
|
e19d99022a | ||
|
|
9633580d2c | ||
|
|
63c1767d33 | ||
|
|
5eae4c8f15 | ||
|
|
641f7ced84 | ||
|
|
5549f66dc1 | ||
|
|
39cb6fefda | ||
|
|
8c5c506e40 | ||
|
|
a78a3a461b | ||
|
|
f000ed733f | ||
|
|
0f8bca6d8f | ||
|
|
df9fe43cc9 | ||
|
|
4ac0b10318 | ||
|
|
3bd8506ae8 | ||
|
|
b95c9980b5 | ||
|
|
d23eb01490 | ||
|
|
8126aaf803 | ||
|
|
6bd593459c | ||
|
|
c3247ecc6c | ||
|
|
3f6fc4b4f7 | ||
|
|
6028b42d0f | ||
|
|
9cf9b862c1 | ||
|
|
1c769d1410 | ||
|
|
188d533dd2 | ||
|
|
c7ac717167 | ||
|
|
31d567e880 | ||
|
|
9bbc2fe1e4 | ||
|
|
ba8823534c | ||
|
|
92269be92a | ||
|
|
bd10572851 | ||
|
|
761f25c857 | ||
|
|
91a7580303 | ||
|
|
4f5fe44af1 | ||
|
|
0a906edd81 | ||
|
|
1f1240a0f4 | ||
|
|
f3dc21755f | ||
|
|
099c8ff58e | ||
|
|
d1c1ce09df | ||
|
|
452ae235c6 | ||
|
|
4ffed5d6dc | ||
|
|
4f5d25e1eb | ||
|
|
847f862fd4 | ||
|
|
9e83bc2270 | ||
|
|
7f90139918 | ||
|
|
27579eb531 | ||
|
|
a44d65c939 | ||
|
|
ddf1dcc3ff | ||
|
|
3684699190 | ||
|
|
cf41b01135 | ||
|
|
bc73779144 | ||
|
|
00911d417d | ||
|
|
a85121b168 | ||
|
|
479d206dff | ||
|
|
10cab6bf6d | ||
|
|
09f0f89e3a | ||
|
|
9968fa064b | ||
|
|
df711238fe | ||
|
|
db36c8c617 | ||
|
|
93060aa59d | ||
|
|
1b9d420e79 | ||
|
|
5a337e188e | ||
|
|
a7276c2c3e | ||
|
|
7c5800924a | ||
|
|
6bcb347982 | ||
|
|
ac08faa2b8 | ||
|
|
18823c8b32 | ||
|
|
61e82925dc | ||
|
|
7ac03cfcef | ||
|
|
0e65af606f | ||
|
|
71ce94a13e | ||
|
|
93ced081dc | ||
|
|
78bae4f14f | ||
|
|
dfd1eb0672 | ||
|
|
14a39ee7ce | ||
|
|
d8dcc9926e | ||
|
|
b0726955a0 | ||
|
|
056f04d170 | ||
|
|
fdf6f57d6c | ||
|
|
6f93e401aa | ||
|
|
36b117c00a | ||
|
|
7bfd5e5790 | ||
|
|
7a2d5bbc64 | ||
|
|
1820d7d2c7 | ||
|
|
cd1c835a35 | ||
|
|
9cb9cea4b2 | ||
|
|
d334c5eb67 | ||
|
|
8f3c3c57f9 | ||
|
|
8d2a7e32a5 | ||
|
|
7cc7cb8ffa | ||
|
|
c19c2a71f3 | ||
|
|
caefd0de9f | ||
|
|
3ee6fdaf99 | ||
|
|
7506c026fa | ||
|
|
08fdbb03bb | ||
|
|
4ecdb92e61 | ||
|
|
8fbba09895 | ||
|
|
beacf792fa | ||
|
|
2de49b8b22 | ||
|
|
72668d7234 | ||
|
|
5e704891d9 | ||
|
|
549836600c | ||
|
|
e61ee7981d | ||
|
|
5429191ab0 | ||
|
|
8b4a015f07 | ||
|
|
c83e17c083 | ||
|
|
3f823f9f25 | ||
|
|
f34ae4587a | ||
|
|
6bca3c2ca2 | ||
|
|
f3e1985b1e | ||
|
|
9ea3fc6995 | ||
|
|
d27d6e635f | ||
|
|
a7e4a2a30e | ||
|
|
dfeeef41ed | ||
|
|
227d3ec35b | ||
|
|
29c88356e9 | ||
|
|
8b121eb138 | ||
|
|
0c680bcb8e | ||
|
|
0037868ff0 | ||
|
|
e6a335ded0 | ||
|
|
8c9e126f91 | ||
|
|
c3e628c45a | ||
|
|
ecd7b84871 | ||
|
|
971a7374d6 | ||
|
|
63c86438fb | ||
|
|
c7b395e7da | ||
|
|
4be82876e4 | ||
|
|
92c490579d | ||
|
|
dfbaedd5c2 | ||
|
|
25d43c65db | ||
|
|
bb508520f1 | ||
|
|
c4ff19a7e4 | ||
|
|
9df322d938 | ||
|
|
4b5af957ac | ||
|
|
ee33688aca | ||
|
|
f97274611f | ||
|
|
f1b78948db | ||
|
|
b6f554c3e2 | ||
|
|
433765bbc8 | ||
|
|
23d5abeb76 | ||
|
|
559dcf5a90 | ||
|
|
0ff820e614 | ||
|
|
b1fcf50410 | ||
|
|
6bc5e71a13 | ||
|
|
2dcad906bc | ||
|
|
fa0e073baf | ||
|
|
1e053ee936 | ||
|
|
6afed10118 | ||
|
|
11cf4211ab | ||
|
|
abf9fbee30 | ||
|
|
e23ba4891d | ||
|
|
7790894bb6 | ||
|
|
75033b7d26 | ||
|
|
88fea63ff4 | ||
|
|
faea03f1fd | ||
|
|
7b42dfc53e | ||
|
|
38bd6accea | ||
|
|
5e50e2c1f9 | ||
|
|
7375f6574e | ||
|
|
4c605ac43f | ||
|
|
7ca3656c3e | ||
|
|
9a73fb7f4b | ||
|
|
4f5c283438 | ||
|
|
bcd1b46946 | ||
|
|
4b8b96f060 | ||
|
|
a03ed46947 | ||
|
|
f0eb00ffd9 | ||
|
|
30b1c024a1 | ||
|
|
8ff533beb3 | ||
|
|
44eeb1c7c8 | ||
|
|
32bcd87d8f | ||
|
|
1d3abc2651 | ||
|
|
d62db5eb38 | ||
|
|
94d02aaaf2 | ||
|
|
291373732f | ||
|
|
18b72e89a4 | ||
|
|
a570953257 | ||
|
|
afade4f5c9 | ||
|
|
49f6a219f9 | ||
|
|
a8740c2602 | ||
|
|
877e4919cb | ||
|
|
71df58e937 | ||
|
|
fb6b3ddfd9 | ||
|
|
7b383d0562 | ||
|
|
67db0af4eb | ||
|
|
677089b912 | ||
|
|
0fbeae7f0d | ||
|
|
d63bb6d81d | ||
|
|
376cc5a731 | ||
|
|
77b2e8dfee | ||
|
|
30ef8ff845 | ||
|
|
a011cad584 | ||
|
|
f14249d1d3 | ||
|
|
3b0181dbd0 | ||
|
|
d670805758 | ||
|
|
84d4fe0bfd | ||
|
|
f94bccf119 | ||
|
|
4fb47a6a6d | ||
|
|
5585c9d347 | ||
|
|
6db2c14faa | ||
|
|
be6a45cb14 | ||
|
|
721d79fb73 | ||
|
|
b608dd0e3f | ||
|
|
2a52c4c7f5 | ||
|
|
61194fe6c0 | ||
|
|
8d89d73bb8 | ||
|
|
ecbd1e964a | ||
|
|
57365ac05d | ||
|
|
1094573025 | ||
|
|
27846ffec7 | ||
|
|
69cb2e89e9 | ||
|
|
ac12971ac9 | ||
|
|
70f28553c6 | ||
|
|
21a6a13698 | ||
|
|
61551aa849 | ||
|
|
5d4b720596 | ||
|
|
cf1d5bb08b | ||
|
|
b80e444aea | ||
|
|
19352ab3c0 | ||
|
|
fa8daf4071 | ||
|
|
a4af41f893 | ||
|
|
3764ab041a | ||
|
|
4bca48431a | ||
|
|
1193a82fca | ||
|
|
369729eea4 | ||
|
|
0640d3f550 | ||
|
|
940ee9385c | ||
|
|
7b65b2bb41 | ||
|
|
83eba58232 | ||
|
|
6d0a039cc9 | ||
|
|
e280e9bdb4 | ||
|
|
494554618e | ||
|
|
cdc5968c67 | ||
|
|
fc142045a4 | ||
|
|
16a16a9543 | ||
|
|
a8c62307ec | ||
|
|
99d2de6540 | ||
|
|
cc3392452a | ||
|
|
e336ebad5e | ||
|
|
9e2775de98 | ||
|
|
bbcba55bbc | ||
|
|
1e4a952eea | ||
|
|
95c99d933a | ||
|
|
3e37dd2517 | ||
|
|
60e4052f81 | ||
|
|
0639a2ad7b | ||
|
|
3b03636e95 | ||
|
|
9c829f6650 | ||
|
|
a7020e45cc | ||
|
|
a0f05d0c62 | ||
|
|
2e61c6bff8 | ||
|
|
91aa0b8ae8 | ||
|
|
844b9c657d | ||
|
|
036fe7668d | ||
|
|
322c81bd8a | ||
|
|
31daca45ba | ||
|
|
8fcff3e88c | ||
|
|
9c7e298097 | ||
|
|
0da270d9d6 | ||
|
|
b84f93c4df | ||
|
|
a0dfd187d8 | ||
|
|
536e2ccac6 | ||
|
|
89c784188e | ||
|
|
2eb18712d3 | ||
|
|
d05ecafc4b | ||
|
|
a8b8a7320c | ||
|
|
4315a1c8cc | ||
|
|
71ff60753c | ||
|
|
751c4efe7f | ||
|
|
da9dade71f | ||
|
|
0fb063f329 | ||
|
|
ece14800e1 | ||
|
|
5de75adfb4 | ||
|
|
62894b9baf | ||
|
|
db8542d2b1 | ||
|
|
7f424c3e8d | ||
|
|
fb0c1e10de | ||
|
|
f139e56cd6 | ||
|
|
5d7ff307c2 | ||
|
|
43439a6b16 | ||
|
|
87f4eb8021 | ||
|
|
4c6a6c7b16 | ||
|
|
5a7661a928 | ||
|
|
e1e28eb88a | ||
|
|
b43fd50ff0 | ||
|
|
18838d23bf | ||
|
|
285607608e | ||
|
|
cf46792554 | ||
|
|
85a6aaa322 | ||
|
|
4e9d907677 | ||
|
|
d7be1bd672 | ||
|
|
b7f05e89ba | ||
|
|
0406e6734a | ||
|
|
d3a1f80308 | ||
|
|
1d1a8ba92e | ||
|
|
048b3e6f7b | ||
|
|
077c3461db | ||
|
|
acc2b390c3 | ||
|
|
add50b3bd5 | ||
|
|
0b0a220c52 | ||
|
|
aa7c63bfe1 | ||
|
|
fb367c9792 | ||
|
|
2ad162d27d | ||
|
|
dfb3fc9acf | ||
|
|
57c8a62e1e | ||
|
|
8141e35f99 | ||
|
|
6bc2b3c933 | ||
|
|
dca032ab18 | ||
|
|
5330966762 | ||
|
|
131d50ae9d | ||
|
|
903fbe41e9 | ||
|
|
e59ab2b3af | ||
|
|
efcfd87b44 | ||
|
|
bdb0fcd71b | ||
|
|
9b6de015bc | ||
|
|
6669372415 | ||
|
|
f6462111b7 | ||
|
|
339eeaa087 | ||
|
|
4685ca557b | ||
|
|
3108c27877 | ||
|
|
f8e4afbad3 | ||
|
|
b4def306fa | ||
|
|
4432d84dd3 | ||
|
|
410ca7d88e | ||
|
|
14fa7d2726 | ||
|
|
a3049aae56 | ||
|
|
26173597a9 | ||
|
|
66231194be | ||
|
|
2df2534898 | ||
|
|
a6b9e71846 | ||
|
|
46f77a632d | ||
|
|
f7e7453807 | ||
|
|
ffd256d32b | ||
|
|
a5a93c0a17 | ||
|
|
4e854cfe03 | ||
|
|
f2b0437688 | ||
|
|
121205fd13 | ||
|
|
6c7bc3c788 | ||
|
|
da615bf5a6 | ||
|
|
b73adbe56b | ||
|
|
edf44c881b | ||
|
|
a61fd58f8e | ||
|
|
c29a75bbfb | ||
|
|
2cfbdbb401 | ||
|
|
d404b846f9 | ||
|
|
366865723b | ||
|
|
047f881673 | ||
|
|
94b9c0b120 | ||
|
|
d921170a02 | ||
|
|
068220d3a7 | ||
|
|
d2ff6c8f28 | ||
|
|
5369d238a8 | ||
|
|
66e8296230 | ||
|
|
11cd9beb9b | ||
|
|
45c13e594a | ||
|
|
209ff8e402 | ||
|
|
4a28a0b693 | ||
|
|
27d8ae36ba | ||
|
|
c341185423 | ||
|
|
a91768e715 | ||
|
|
d581ccc7e2 | ||
|
|
7a36a70e06 | ||
|
|
9b6bb67f9e | ||
|
|
c2b6c75cdc | ||
|
|
c7a694ecc8 | ||
|
|
54d73e4666 | ||
|
|
ee3400e78a | ||
|
|
42d6ae6d07 | ||
|
|
876130b8e7 | ||
|
|
196be15587 | ||
|
|
83ea91531f | ||
|
|
ac8002d7d3 | ||
|
|
a53ac351f6 | ||
|
|
7220a3bf48 | ||
|
|
efefa6d87d | ||
|
|
2a89ee6cb7 | ||
|
|
905e79a69d | ||
|
|
d3102f0dce | ||
|
|
be38e77de3 | ||
|
|
82ee1ffbd6 | ||
|
|
a0479c86fb | ||
|
|
d02b05328a | ||
|
|
ba0a8fbcb2 | ||
|
|
9500938d44 | ||
|
|
cc345c785d | ||
|
|
064c6e16f7 | ||
|
|
c8ec20fe4d | ||
|
|
96d3cb60e5 | ||
|
|
f59c5da915 | ||
|
|
cdb6d76f0a | ||
|
|
5b68158154 | ||
|
|
440d69a310 | ||
|
|
e41ef49995 | ||
|
|
087cac4471 | ||
|
|
7fe01f1c52 | ||
|
|
dc4bf4a5fb | ||
|
|
69b6c936d1 | ||
|
|
41e51e68a2 | ||
|
|
7e9cf0237d | ||
|
|
39bd365787 | ||
|
|
f1212a6065 | ||
|
|
adb4c3b555 | ||
|
|
cebd77c614 | ||
|
|
d6f6f5ce11 | ||
|
|
231827e84e | ||
|
|
c4fa568457 | ||
|
|
3efbed1f27 | ||
|
|
d8faa9b18e | ||
|
|
1e199e4d4f | ||
|
|
53db7817d9 | ||
|
|
9c8a96aa51 | ||
|
|
7e77ab29e5 | ||
|
|
2e0b577680 | ||
|
|
32ee7611bb | ||
|
|
9c5568c2af | ||
|
|
fa22f80ee3 | ||
|
|
e861ea8b53 | ||
|
|
d7ed69200f | ||
|
|
1f8b9aa74c | ||
|
|
b232fa42cf | ||
|
|
9c5a2ad062 | ||
|
|
37acd5e671 | ||
|
|
9411e898e6 | ||
|
|
95a8c43b73 | ||
|
|
f2e5d5c13f | ||
|
|
f1ae5f32f5 | ||
|
|
efc1bf710c | ||
|
|
9d7714f843 | ||
|
|
b08c29617b | ||
|
|
6600a5fd08 | ||
|
|
818a3e6b63 | ||
|
|
ce217b8744 | ||
|
|
296d5d15af | ||
|
|
0b3428942f | ||
|
|
8b253d699c | ||
|
|
3fd04e86e8 | ||
|
|
5cb1cc7ac7 | ||
|
|
581b4cb673 | ||
|
|
8bc824a5e7 | ||
|
|
bd94b6da1a | ||
|
|
22d5d1d9d8 | ||
|
|
b75e404ec1 | ||
|
|
04f49f179b | ||
|
|
52bfcb3ab9 | ||
|
|
6560618600 | ||
|
|
9039b9cb18 | ||
|
|
f6f223e674 | ||
|
|
1fed08e870 | ||
|
|
1caf06bd77 | ||
|
|
9c7a65e1e7 | ||
|
|
0327abb483 | ||
|
|
3f418f482e | ||
|
|
38b54f6fc5 | ||
|
|
365869b0a2 | ||
|
|
54a571fc92 | ||
|
|
3cbcbb6521 | ||
|
|
7fb7e21bf2 | ||
|
|
70e7ad85ed | ||
|
|
1b91e3c4a6 | ||
|
|
fee82bd3d3 | ||
|
|
4d301988a9 | ||
|
|
d9d851813e | ||
|
|
c7530f5e45 | ||
|
|
f67097662f | ||
|
|
687c1cacd9 | ||
|
|
9f859e914d | ||
|
|
3c4ddd2802 | ||
|
|
3a6ecb82b5 | ||
|
|
1c7a7f7529 | ||
|
|
378afdebd5 | ||
|
|
59855a1a67 | ||
|
|
37bab55843 | ||
|
|
2a76d17e10 | ||
|
|
bb03ef0ce3 | ||
|
|
dfbf408567 | ||
|
|
0c467dc02d | ||
|
|
1f5ec0bfe7 | ||
|
|
de8080dbff | ||
|
|
4a1c40aa96 | ||
|
|
1adfefd88d | ||
|
|
b3e1077f87 | ||
|
|
c052bd8377 | ||
|
|
3da204c23e | ||
|
|
27b5021e0d | ||
|
|
ebc19a60ff | ||
|
|
e2a21337ac | ||
|
|
eec957a514 | ||
|
|
39908cc40c | ||
|
|
87ce33b1d8 | ||
|
|
febd738ce5 | ||
|
|
40a5e47d5c | ||
|
|
748a4d6b8f | ||
|
|
a320e6dda5 | ||
|
|
5048d6b472 | ||
|
|
2d5afd0625 | ||
|
|
f97304fa3f | ||
|
|
400a8e3264 | ||
|
|
594558eddf | ||
|
|
80bbc01790 | ||
|
|
0212e57f44 | ||
|
|
3799e0922d | ||
|
|
7bab630e72 | ||
|
|
90f2a33b69 | ||
|
|
c403d6c362 | ||
|
|
76c016b557 | ||
|
|
d6edbd0cec | ||
|
|
6c3ca23dbf | ||
|
|
61fec07c62 | ||
|
|
242b947342 | ||
|
|
34ca696b86 | ||
|
|
4ba65ccde9 | ||
|
|
0edb210561 | ||
|
|
ddabb6e0ef | ||
|
|
d9e178aad0 | ||
|
|
95368deae2 | ||
|
|
7dd4b28950 | ||
|
|
d2205f8759 | ||
|
|
85094f3eae | ||
|
|
b42bbcb5d3 | ||
|
|
4cec3dad0d | ||
|
|
48db89158a | ||
|
|
36be4a08ed | ||
|
|
a526a4a173 | ||
|
|
e260522fa3 | ||
|
|
93a431d19b | ||
|
|
7acf0ff314 | ||
|
|
9353bcefa2 | ||
|
|
0b03ca1538 | ||
|
|
c7a905ec0c | ||
|
|
c0e04b0251 | ||
|
|
41bc4f7873 | ||
|
|
df559f1712 | ||
|
|
5b2397b595 | ||
|
|
84292d5013 | ||
|
|
597c701518 | ||
|
|
fbcc320321 | ||
|
|
42e0e4c6b2 | ||
|
|
6721ae3555 | ||
|
|
f7582e34e5 | ||
|
|
f1ace3774f | ||
|
|
da83750cd3 | ||
|
|
f8341ab94d | ||
|
|
e8497e5355 | ||
|
|
f9c6e18693 | ||
|
|
713cd4d971 | ||
|
|
1ddeaa1468 | ||
|
|
71d26a5dd1 | ||
|
|
8b15b267a3 | ||
|
|
f1501c56d3 | ||
|
|
b694cbb848 | ||
|
|
2074d04f62 | ||
|
|
f7ff338a7b | ||
|
|
429befe1ed | ||
|
|
28c3c05c28 | ||
|
|
c4b6fd77be | ||
|
|
b4c2e6bf46 | ||
|
|
55a955234a | ||
|
|
469cc11406 | ||
|
|
7f7bbe236d | ||
|
|
3e54ea0aae | ||
|
|
0109ab39ec | ||
|
|
1506c6f54d | ||
|
|
2ff75e32e9 | ||
|
|
b6fb787669 | ||
|
|
f517b66d60 | ||
|
|
a7a03a9e5a | ||
|
|
abcfd74c19 | ||
|
|
1cb45b0d1c | ||
|
|
790be6d639 | ||
|
|
ec458f0ec7 | ||
|
|
52a50ea72a | ||
|
|
729cc337a1 | ||
|
|
e5a1bb1796 | ||
|
|
a799c3e805 | ||
|
|
06181f0b00 | ||
|
|
8b17cfedf2 | ||
|
|
8d82bd7b76 | ||
|
|
a7024aea89 | ||
|
|
b85a5ed306 | ||
|
|
1aacc99491 | ||
|
|
103bf83608 | ||
|
|
beeec27afd | ||
|
|
5c166edf63 | ||
|
|
fc863b6cd0 | ||
|
|
25937282ed | ||
|
|
7d87768f78 | ||
|
|
b91adbb9f2 | ||
|
|
f2eb5cd3c4 | ||
|
|
b15e71cd22 | ||
|
|
c585aa147a | ||
|
|
958d8e03eb | ||
|
|
eb56c62dc9 | ||
|
|
8dfd998db1 | ||
|
|
dda8cab335 | ||
|
|
068b2b16bb | ||
|
|
570102c501 | ||
|
|
14a591fab2 | ||
|
|
67f495e360 | ||
|
|
11519fe1ca | ||
|
|
fb17e33894 | ||
|
|
a37ca36a8a | ||
|
|
754d9e39a8 | ||
|
|
71cbcb2618 | ||
|
|
bdfce937e9 | ||
|
|
6b6e0783cf | ||
|
|
06189b556c | ||
|
|
0a4170daf7 | ||
|
|
f426265ab2 | ||
|
|
4b8375ea95 | ||
|
|
697e3bed0a | ||
|
|
59c21c7aee | ||
|
|
e558c8e028 | ||
|
|
c5c18a2997 | ||
|
|
cb24b748a5 | ||
|
|
6588ce4840 | ||
|
|
0b727d290b | ||
|
|
15b081f02d | ||
|
|
b022a71480 | ||
|
|
4eba6101b4 | ||
|
|
4285c4df73 | ||
|
|
6979fca4dc | ||
|
|
6951b64038 | ||
|
|
b90899b1d5 | ||
|
|
a655e067ef | ||
|
|
c98439f9a1 | ||
|
|
47c8d3734a | ||
|
|
8eb791763c | ||
|
|
880e2661dc | ||
|
|
43d634ce00 | ||
|
|
63f43e70a9 | ||
|
|
c693b3064e | ||
|
|
9752b57714 | ||
|
|
b99f92bac5 | ||
|
|
03f3ce7fd4 | ||
|
|
e96f1ca83a | ||
|
|
49941f1d57 | ||
|
|
8130d7e211 | ||
|
|
3514c6c704 | ||
|
|
4af9653b1e | ||
|
|
bb492e789d | ||
|
|
bebb7e9a46 | ||
|
|
293c05b5e6 | ||
|
|
5debbb8d46 | ||
|
|
eca0928319 | ||
|
|
a486129907 | ||
|
|
0e519328c8 | ||
|
|
2d248c1eaa | ||
|
|
bfde92a3fd | ||
|
|
2de1fdcebd | ||
|
|
44d2250b6e | ||
|
|
30215c260b | ||
|
|
3f08d4f11c | ||
|
|
345e303133 | ||
|
|
8e7d6cadf4 | ||
|
|
2ea062642f | ||
|
|
bcbd092d3e | ||
|
|
9c51919a1a | ||
|
|
be85fab47c | ||
|
|
ed91a3c03c | ||
|
|
4e386a955e | ||
|
|
5891f7037b | ||
|
|
8b6e63c22d | ||
|
|
8ed046e2d6 | ||
|
|
bb957498cc | ||
|
|
0e8a6ee2d2 | ||
|
|
2eeb750055 | ||
|
|
d9cc2c29f2 | ||
|
|
f7f4f77e2e | ||
|
|
2bfe2c2ed0 | ||
|
|
0f5a786347 | ||
|
|
2429b2ef6a | ||
|
|
63542f83c2 | ||
|
|
e9b457fca1 | ||
|
|
524eb0880f | ||
|
|
dbef7b5f85 | ||
|
|
427b107dac | ||
|
|
5f3e3fe655 | ||
|
|
bc19db2c78 | ||
|
|
131ff36842 | ||
|
|
d874dc21d1 | ||
|
|
6116558842 | ||
|
|
7ab6704920 | ||
|
|
af214c507a | ||
|
|
67fa0e89ff | ||
|
|
3927b33237 | ||
|
|
b7261a0270 | ||
|
|
c4f3f05bfa | ||
|
|
d0a6dd40c4 | ||
|
|
6ea8f70ca8 | ||
|
|
f15ed311c0 | ||
|
|
6f85062019 | ||
|
|
048f9d7720 | ||
|
|
3fef38c96d | ||
|
|
e50627ecd6 | ||
|
|
d91e3db9fd | ||
|
|
13ce4707ff | ||
|
|
648e25bac1 | ||
|
|
0b8a52379c | ||
|
|
568310858b | ||
|
|
eedd71f508 | ||
|
|
9003110d7f | ||
|
|
de8fae7119 | ||
|
|
8f50bf3867 | ||
|
|
6bebd1bea1 | ||
|
|
7cabf00380 | ||
|
|
1b27b73a99 | ||
|
|
f1fc3616d0 | ||
|
|
a2964c744d | ||
|
|
aa9d69e224 | ||
|
|
0f74de57cf | ||
|
|
faea166566 | ||
|
|
190926b467 | ||
|
|
cc200c301c | ||
|
|
1b48055286 | ||
|
|
98427f67f1 | ||
|
|
30df081276 | ||
|
|
d35dd65727 | ||
|
|
a14429296e | ||
|
|
cc1c4a3722 | ||
|
|
0918826561 | ||
|
|
c2597504e0 | ||
|
|
c30583dda4 | ||
|
|
9b8a02749f | ||
|
|
58e5bc7e74 | ||
|
|
266049bd11 | ||
|
|
d407670115 | ||
|
|
32e8b8e8ae | ||
|
|
d5d8e9eacb | ||
|
|
86f367132a | ||
|
|
66b79a7c89 | ||
|
|
76d419ca45 | ||
|
|
c916f163f2 | ||
|
|
8d1966e9fc | ||
|
|
94a6f1837a | ||
|
|
1fb3687eaa | ||
|
|
8fc7004f5b | ||
|
|
4f09da79cf | ||
|
|
1dabdfa0ba | ||
|
|
161c996079 | ||
|
|
6c88a1ad76 | ||
|
|
15c90ac17e | ||
|
|
fdc35d0bad | ||
|
|
a5516121e2 | ||
|
|
b0b4ac0f39 | ||
|
|
6c237cfbc0 | ||
|
|
925efc2314 | ||
|
|
aa5a38399a | ||
|
|
686bab3160 | ||
|
|
5732c76f39 | ||
|
|
5b729162ad | ||
|
|
44239f11ff | ||
|
|
302c1f9dca | ||
|
|
19a63bdc19 | ||
|
|
6358b481fb | ||
|
|
5d9d27d505 | ||
|
|
d02596835f | ||
|
|
3eb2124ca9 | ||
|
|
8e6b13489f | ||
|
|
9cc9a830eb | ||
|
|
34e70e7f0c | ||
|
|
3d6785bcaf | ||
|
|
b01765c57d | ||
|
|
54a8915f29 | ||
|
|
e13d37f4d0 | ||
|
|
cc13d4b742 | ||
|
|
8c22bb267b | ||
|
|
23bf7fb449 | ||
|
|
b20f023ab7 | ||
|
|
23dd23373d | ||
|
|
b295d5de91 | ||
|
|
46768fc85d | ||
|
|
cd9d8bbfa9 | ||
|
|
cb812cb2da | ||
|
|
e42de5d36d | ||
|
|
194269dbb8 | ||
|
|
83d3256f91 | ||
|
|
4fc6e7ca0c | ||
|
|
b05c967ae6 | ||
|
|
fff767e2ef | ||
|
|
4a2809ffc0 | ||
|
|
97a33e7491 | ||
|
|
28aa8a99d0 | ||
|
|
b9764fd479 | ||
|
|
4cc575ebc5 | ||
|
|
ddf9a7a2de | ||
|
|
c9223afe7e | ||
|
|
c6f00c09c9 | ||
|
|
54d388bb64 | ||
|
|
2ecaf0ec48 | ||
|
|
9320597c00 | ||
|
|
df4cdbaae9 | ||
|
|
fb37ef3671 | ||
|
|
5dcfe93a95 | ||
|
|
55df3019f9 | ||
|
|
85ae6f0dfd | ||
|
|
e4e46c3f53 | ||
|
|
909e479d7f | ||
|
|
8545512dd7 | ||
|
|
06d54466fd | ||
|
|
dca6c0cd91 | ||
|
|
d2214c28c5 | ||
|
|
b28a4b4ab7 | ||
|
|
bccb6c6b45 | ||
|
|
c03e3d0b9e | ||
|
|
9656e44c9e | ||
|
|
eab2cba4a1 | ||
|
|
3f0c9306d3 | ||
|
|
778ae8495b | ||
|
|
4253d031f0 | ||
|
|
97221aa433 | ||
|
|
27c1720687 | ||
|
|
ac11e3cba9 | ||
|
|
b4d794cbd5 | ||
|
|
f81a094283 | ||
|
|
767c8ea6ce | ||
|
|
bae15dfd58 | ||
|
|
f27e755ad7 | ||
|
|
864371cc10 | ||
|
|
3144c14947 | ||
|
|
b428af2cad | ||
|
|
296a6b3cac | ||
|
|
21f5bc9b70 | ||
|
|
b1c4e39205 | ||
|
|
abdcb33f14 | ||
|
|
9a1a8d3ca3 | ||
|
|
96b220659d | ||
|
|
d3942fa1b0 | ||
|
|
d1fc46d978 | ||
|
|
7f7ff8c7d4 | ||
|
|
da83fa8ab2 | ||
|
|
ddaec5f188 | ||
|
|
c0d8a07042 | ||
|
|
eee2a2ef6b | ||
|
|
aaf4e9d480 | ||
|
|
d94aa77e19 | ||
|
|
ad2514fc6f | ||
|
|
8764f502d5 | ||
|
|
2f280f4dc8 | ||
|
|
027ded4d4e | ||
|
|
d0e15a7450 | ||
|
|
dae4d7572f | ||
|
|
758ed55722 | ||
|
|
74b05468d6 | ||
|
|
140647cf8c | ||
|
|
b5f8520d36 | ||
|
|
ef95bd8d29 | ||
|
|
0c734ca62b | ||
|
|
800b93de9f | ||
|
|
f96461c385 | ||
|
|
683f25af15 | ||
|
|
cfe229c67f | ||
|
|
d4becc8e46 | ||
|
|
0fdab21fd9 | ||
|
|
9b8d8d0c4f | ||
|
|
3a2b74d701 | ||
|
|
3fe177825a | ||
|
|
7c94d13be4 | ||
|
|
f2c21b11d8 | ||
|
|
277c968b6a | ||
|
|
797fd04796 | ||
|
|
85ad50c39e | ||
|
|
7cd9919a46 | ||
|
|
b1f2e63a6b | ||
|
|
ce58e85aa6 | ||
|
|
b53ee36d47 | ||
|
|
6db82199a6 | ||
|
|
524caec5a0 | ||
|
|
dad9b5afa3 | ||
|
|
ed5ca1c512 | ||
|
|
3d8dc5dce5 | ||
|
|
1f51bfe64d | ||
|
|
e25f89d2d6 | ||
|
|
7bf20f1a89 | ||
|
|
cf7491a1fe | ||
|
|
c5541bfb56 | ||
|
|
002e31c56d | ||
|
|
6b1062a64e | ||
|
|
caa47f282e | ||
|
|
a413f6bcac | ||
|
|
e6cedb8da7 | ||
|
|
78c11c31e8 | ||
|
|
c3488c5b47 | ||
|
|
22f055472c | ||
|
|
e55666f90e | ||
|
|
f1ce26162b | ||
|
|
53563b67e7 | ||
|
|
95abb3628c | ||
|
|
e3400b2555 | ||
|
|
6ac7cbf4d2 | ||
|
|
6b53e1fae9 | ||
|
|
4d0b9d61de | ||
|
|
1752726479 | ||
|
|
25ba30986f | ||
|
|
0b3e5f2339 | ||
|
|
2e01a7c7af | ||
|
|
dfa3ce5f5d | ||
|
|
0a4c97ac09 | ||
|
|
0fc0cb2888 | ||
|
|
f4d21b0360 | ||
|
|
433ca0ff89 | ||
|
|
2f5dc9c24d | ||
|
|
c7c76534af | ||
|
|
142df1a001 | ||
|
|
982636ac4a | ||
|
|
396290962f | ||
|
|
8ad39537dd | ||
|
|
0b26b04081 | ||
|
|
4ebd68f7d8 | ||
|
|
d71046c139 | ||
|
|
246d1d0225 | ||
|
|
cc17167c7a | ||
|
|
75d5f63f14 | ||
|
|
93348ca1ca | ||
|
|
fd40e25e67 | ||
|
|
cf4847c4fe | ||
|
|
01964c6460 | ||
|
|
73f26ca084 | ||
|
|
2305255373 | ||
|
|
009fc1a28a | ||
|
|
72e186f64a | ||
|
|
481d4b6e23 | ||
|
|
89dd0c29e2 | ||
|
|
c91a1817aa | ||
|
|
05def1befc | ||
|
|
39d053ef74 | ||
|
|
4e3f77d884 | ||
|
|
f638a21f89 | ||
|
|
c2d478a93a | ||
|
|
09b114e884 | ||
|
|
fdfb2b2804 | ||
|
|
92b916ab47 | ||
|
|
60aea922a5 | ||
|
|
6d52a0fbc1 | ||
|
|
054edfc653 | ||
|
|
7c4590b818 | ||
|
|
d37b326cb1 | ||
|
|
5e5f518822 | ||
|
|
309f42ea21 | ||
|
|
ab67cb1911 | ||
|
|
5a04b9a7c9 | ||
|
|
b883eb5929 | ||
|
|
a1dbc8f37d | ||
|
|
909ab76eae | ||
|
|
c4d97cd8f8 | ||
|
|
4940303bd8 | ||
|
|
62e2011e48 | ||
|
|
c326677f7a | ||
|
|
f4141998dd | ||
|
|
7ff3bc4674 | ||
|
|
dcf1a05956 | ||
|
|
fb17471673 | ||
|
|
66f6e5f048 | ||
|
|
913792c7be | ||
|
|
c054dfef76 | ||
|
|
b79727c985 | ||
|
|
9bffd840b9 | ||
|
|
5165ad8422 | ||
|
|
bdc0c006bd | ||
|
|
a9ff36b2a4 | ||
|
|
68577f76f0 | ||
|
|
35a26eafea | ||
|
|
8fa5fd8adc | ||
|
|
cfa6c5deb8 | ||
|
|
6770bcc61d | ||
|
|
ad95f7306f | ||
|
|
3291c43db3 | ||
|
|
23278f4558 | ||
|
|
7efa80aa51 | ||
|
|
0d9b8a8fbf | ||
|
|
6ec9d880c4 | ||
|
|
573008244c | ||
|
|
fa22160cb0 | ||
|
|
7b5e54cd7b | ||
|
|
7abd0a7303 | ||
|
|
acf9e3679e | ||
|
|
2e929bdf15 | ||
|
|
972594604c | ||
|
|
8ebab7657f | ||
|
|
9bfe138087 | ||
|
|
a6094d81bb | ||
|
|
8cb59a75ea | ||
|
|
4e9ae2d45a | ||
|
|
12012f2276 | ||
|
|
57cb20b63a | ||
|
|
204326c236 | ||
|
|
f841ca16eb | ||
|
|
7df20ea1bb | ||
|
|
7503f7bf33 | ||
|
|
ff85c8c0d9 | ||
|
|
fe51fed1e6 | ||
|
|
bcf655e196 | ||
|
|
1fdf13478f | ||
|
|
0797ee2312 | ||
|
|
e46347ec1b | ||
|
|
8fba726a7d | ||
|
|
4104019e1c | ||
|
|
96100b30f2 | ||
|
|
875f2fcc1e | ||
|
|
e04782816f | ||
|
|
3b6f6ab4e6 | ||
|
|
c87c7c24a8 | ||
|
|
09fda56f19 | ||
|
|
ffcee721ce | ||
|
|
8c0100b193 | ||
|
|
09ec04760f | ||
|
|
1d9f045068 | ||
|
|
74a8d98a32 | ||
|
|
15ef9781c5 | ||
|
|
f126adb5fc | ||
|
|
2413a2a4c8 | ||
|
|
437c903c47 | ||
|
|
b4999fa916 | ||
|
|
ab2e45a86c | ||
|
|
38ae8e7827 | ||
|
|
a15403958d | ||
|
|
3d8536f380 | ||
|
|
1a7da54a9b | ||
|
|
366d8db436 | ||
|
|
9a375abc08 | ||
|
|
7570eae2ce | ||
|
|
8a82400929 | ||
|
|
00e77de94f | ||
|
|
2fce155def | ||
|
|
2ef3eb25c0 | ||
|
|
c9ce47b33d | ||
|
|
836aecb10d | ||
|
|
7704254f68 | ||
|
|
697aa8f43e | ||
|
|
639da1a1d6 | ||
|
|
def2002dc0 | ||
|
|
0ff647af4d | ||
|
|
1840668e29 | ||
|
|
b0cfc93ba7 | ||
|
|
4aea0dff38 | ||
|
|
437cf845fa | ||
|
|
a0d98f1951 | ||
|
|
9715b813d3 | ||
|
|
a9e7b84c81 | ||
|
|
1852731df8 | ||
|
|
ea64cefa33 | ||
|
|
ae9f4e2231 | ||
|
|
69a56e7260 | ||
|
|
b3a424613b | ||
|
|
9312a74004 | ||
|
|
6b9d51793f | ||
|
|
0989d820ed | ||
|
|
5330306aca | ||
|
|
5d779386c8 | ||
|
|
e9f60d85b9 | ||
|
|
cbcf9ec168 | ||
|
|
8e15514955 | ||
|
|
2e133feb09 | ||
|
|
c7072b45bb | ||
|
|
20c0a7243c | ||
|
|
097ed5c27d | ||
|
|
42b16e3004 | ||
|
|
4957c2be8d | ||
|
|
97d399dcb8 | ||
|
|
8cd8866d87 | ||
|
|
2e5a269e7f | ||
|
|
832cd28e52 | ||
|
|
2a2c5a420e | ||
|
|
cda5140c4d | ||
|
|
f620353507 | ||
|
|
3022f836dc | ||
|
|
8ae06462eb | ||
|
|
4283e57013 | ||
|
|
9fcde632a7 | ||
|
|
bc68d954ad | ||
|
|
72150f5035 | ||
|
|
1b48e80955 | ||
|
|
00f9894778 | ||
|
|
364f8cd411 | ||
|
|
9ce5ebb611 | ||
|
|
6db9d5e582 | ||
|
|
b32cf5f0b7 | ||
|
|
c644ef477b | ||
|
|
920bd8fed8 | ||
|
|
e9991bc8ec | ||
|
|
3086dcbcf0 | ||
|
|
72eaed8fdd | ||
|
|
2d4233c825 | ||
|
|
90a745b520 | ||
|
|
edb8138e04 | ||
|
|
dd03701494 | ||
|
|
ee76427938 | ||
|
|
f228ee1e4f | ||
|
|
72635a88ca | ||
|
|
e3110d3ea7 | ||
|
|
a09521ed55 | ||
|
|
a9bd4dbe01 | ||
|
|
8b8094ea35 | ||
|
|
ca310eb295 | ||
|
|
a9ab5ec8a6 | ||
|
|
b9a7353a43 | ||
|
|
cb7dd37f78 | ||
|
|
13cc85c055 | ||
|
|
2ce6be617b | ||
|
|
af1071ba5f | ||
|
|
b00041a9b0 | ||
|
|
bc68ce993b | ||
|
|
d0e030ff00 | ||
|
|
385e2f0904 | ||
|
|
f50fbe78aa | ||
|
|
aaa835340a | ||
|
|
8d1bb4cfe8 | ||
|
|
02f88fbcaa | ||
|
|
41f891f9ba | ||
|
|
649a863d4d | ||
|
|
c9b62db723 | ||
|
|
a59797bbdd | ||
|
|
d372099242 | ||
|
|
94ccbf0577 | ||
|
|
3ff320756a | ||
|
|
2bff210cdf | ||
|
|
5a0be0fe8c | ||
|
|
673dcb8df8 | ||
|
|
5f166c09be | ||
|
|
cc8c3357f1 | ||
|
|
c6051e4c41 | ||
|
|
943aa68069 | ||
|
|
ac93ce58ed | ||
|
|
dadbea7e3b | ||
|
|
4b35eec39a | ||
|
|
9088634e96 | ||
|
|
8c7323cc8b | ||
|
|
c53abc5fdb | ||
|
|
29028d480b | ||
|
|
f6f996d1f3 | ||
|
|
f243dfda79 | ||
|
|
a9fdc0baea | ||
|
|
255df7c01f | ||
|
|
a7cffe03b5 | ||
|
|
c0c9a6007c | ||
|
|
ad7f69d25e | ||
|
|
cecc2e762b | ||
|
|
fe12ad9444 | ||
|
|
3dc64d9a26 | ||
|
|
43a8e862e0 | ||
|
|
7e7b108ef9 | ||
|
|
000a8bcdf1 | ||
|
|
7159f09375 | ||
|
|
3cbda8a24c | ||
|
|
b4ec000dec | ||
|
|
9d67f38062 | ||
|
|
f633d11b63 | ||
|
|
7e30c0e4c9 | ||
|
|
78a8dd27c9 | ||
|
|
92d922a108 | ||
|
|
da0c870b94 | ||
|
|
e9172a3195 | ||
|
|
b1e8fc784f | ||
|
|
270fa07cbd | ||
|
|
e6c3930b2d | ||
|
|
4d6f4d00b0 | ||
|
|
8d14f4eaac | ||
|
|
77a1599e44 | ||
|
|
322ce121a2 | ||
|
|
96baf98862 | ||
|
|
20c90d5b43 | ||
|
|
84e186c9d1 | ||
|
|
e2805fc9c4 | ||
|
|
12f91b7cee | ||
|
|
74cf82f995 | ||
|
|
f4092962df | ||
|
|
c15a6970c9 | ||
|
|
b311c46778 | ||
|
|
8cb0bf3eab | ||
|
|
c138651300 | ||
|
|
ec4d7a19f7 | ||
|
|
5519de826f | ||
|
|
38d30f9984 | ||
|
|
69e497f681 | ||
|
|
a00ba19eb4 | ||
|
|
767642b4ea | ||
|
|
fec49af501 | ||
|
|
663b54e833 | ||
|
|
c8e0d7a02c | ||
|
|
110fa8264d | ||
|
|
30b3744b4e | ||
|
|
d17f554355 | ||
|
|
e6047b296e | ||
|
|
169beaeef7 | ||
|
|
8669861312 | ||
|
|
7ad4a3dcb7 | ||
|
|
17539f1340 | ||
|
|
2b4a25c8d5 | ||
|
|
2d6f5f230e | ||
|
|
ea29af94c7 | ||
|
|
9776786e0c | ||
|
|
bac8aab243 | ||
|
|
e8470f7d0e | ||
|
|
9e71031a09 | ||
|
|
0cc42d6e45 | ||
|
|
bd1cc85ad4 | ||
|
|
31908b3128 | ||
|
|
f1137b3b55 | ||
|
|
02d212e829 | ||
|
|
c1dfeae0b3 | ||
|
|
9236d9a2f4 | ||
|
|
be74e34ede | ||
|
|
60cd8ff592 | ||
|
|
e3205459af | ||
|
|
b32abfab39 | ||
|
|
3dd35cb549 | ||
|
|
1e9daf0200 | ||
|
|
90ea9821df | ||
|
|
faa8f6666f | ||
|
|
25e8c1c9c4 | ||
|
|
05ffbabca7 | ||
|
|
1cb991cce7 | ||
|
|
49204e1389 | ||
|
|
f9f63dc8e1 | ||
|
|
da9903fe57 | ||
|
|
90c9364b3b | ||
|
|
9fd1251dcb | ||
|
|
3650251c5e | ||
|
|
2ac0adf37d | ||
|
|
4c3dcb2044 | ||
|
|
89cf6b4ce6 | ||
|
|
9921571674 | ||
|
|
364ca42837 | ||
|
|
46888aa8e4 | ||
|
|
aba3e27c6c | ||
|
|
0f31a8d98e | ||
|
|
0968264ac0 | ||
|
|
32f269a079 | ||
|
|
b43340b0aa | ||
|
|
df573bb024 | ||
|
|
d381699ac1 | ||
|
|
09122debe9 | ||
|
|
61d1f37f5f | ||
|
|
c699b05f74 | ||
|
|
596328ccca | ||
|
|
ca5293629f | ||
|
|
a16fb23dd7 | ||
|
|
c82aa9f683 | ||
|
|
dabdad732e | ||
|
|
14d4059159 | ||
|
|
dbcbec363d | ||
|
|
70108ae59e | ||
|
|
9c48a8d4fc | ||
|
|
e4e43a1ca0 | ||
|
|
db0e0b9bfe | ||
|
|
8930743831 | ||
|
|
7047fa5bde | ||
|
|
5f1de35936 | ||
|
|
385f707382 | ||
|
|
c4e78cd10a | ||
|
|
2a08d17ed6 | ||
|
|
3d4442207d | ||
|
|
51762a8958 | ||
|
|
d9f467dd8e | ||
|
|
ce735f4136 | ||
|
|
cf27f085f5 | ||
|
|
41a4963515 | ||
|
|
e55c0d9aa5 | ||
|
|
9489659890 | ||
|
|
16bca8b568 | ||
|
|
4c0bd143eb | ||
|
|
d9b8a0ee62 | ||
|
|
4d9f2e3692 | ||
|
|
ba075747be | ||
|
|
f12586c51e | ||
|
|
730370e565 | ||
|
|
afa282ca4f | ||
|
|
11f2d5e5e4 | ||
|
|
dcfb4d0662 | ||
|
|
b7c5bdbdc9 | ||
|
|
7768e72d94 | ||
|
|
ffbf920623 | ||
|
|
d6a5307270 | ||
|
|
f28797cddf | ||
|
|
1334306585 | ||
|
|
fcd0729e21 | ||
|
|
9abc82c792 | ||
|
|
fb72849089 | ||
|
|
91a697a3f4 | ||
|
|
f57cd2cf0c | ||
|
|
3c624d38cd | ||
|
|
bd159e103c | ||
|
|
f55b8face6 | ||
|
|
3129b7a465 | ||
|
|
733b6de818 | ||
|
|
282f9a744c | ||
|
|
454426547c | ||
|
|
6dd9adbb5b | ||
|
|
083eb5e993 | ||
|
|
6a8344bf37 | ||
|
|
e7bb97cb5f | ||
|
|
5cfcd769bf | ||
|
|
aa49523bb3 | ||
|
|
f289cdb2ec | ||
|
|
af6e4d2cb9 | ||
|
|
0adce22400 | ||
|
|
efc6cfddb4 | ||
|
|
e2168abe9a | ||
|
|
8dbf26016a | ||
|
|
ae59177279 | ||
|
|
72e67e9d6d | ||
|
|
891c5e0cc8 | ||
|
|
097411de49 | ||
|
|
ba43911a77 | ||
|
|
27588be53e | ||
|
|
d589443980 | ||
|
|
1cf9640bb6 | ||
|
|
cdbd14eb5f | ||
|
|
6a35182033 | ||
|
|
79c7962af6 | ||
|
|
144bf0bd1f | ||
|
|
6754d42715 | ||
|
|
fa19b71ba4 | ||
|
|
9eb5bd4091 | ||
|
|
ce53f0fc4c | ||
|
|
dc4330476d | ||
|
|
32a8c29753 | ||
|
|
eeacbdde3a | ||
|
|
c5314b54a4 | ||
|
|
cb36d9c8b2 | ||
|
|
b52f7dae0c | ||
|
|
1095aec162 | ||
|
|
f9a4ace59a | ||
|
|
87dcf877e7 | ||
|
|
8a04e2b282 | ||
|
|
3c541c496b | ||
|
|
ac64c7d144 | ||
|
|
f32b4c7f9c | ||
|
|
07bbbd541c | ||
|
|
6798294129 | ||
|
|
efdbaaefdd | ||
|
|
56ef320d6f | ||
|
|
2f9d98cab2 | ||
|
|
8cc06ac5cf | ||
|
|
0c572e1675 | ||
|
|
9ba7092000 | ||
|
|
73ab7dedd4 | ||
|
|
388256b7d7 | ||
|
|
57f98ee20e | ||
|
|
d6522be9b5 | ||
|
|
647db6393d | ||
|
|
b8c35f667e | ||
|
|
8f56bc1de2 | ||
|
|
532bcc5061 | ||
|
|
a0b34e89d2 | ||
|
|
a6d30540fb | ||
|
|
2fac780f37 | ||
|
|
397da8f752 | ||
|
|
26f1b07955 | ||
|
|
4dfd474ae9 | ||
|
|
24338bb477 | ||
|
|
008aba12d4 | ||
|
|
d313bbad9c | ||
|
|
7e918964e4 | ||
|
|
14f19f0e7d | ||
|
|
0f57c32561 | ||
|
|
4acad717fe | ||
|
|
292b0cbc28 | ||
|
|
8568439b80 | ||
|
|
518b1aea61 | ||
|
|
4439b242d8 | ||
|
|
efa1f51915 | ||
|
|
09bb3b5853 | ||
|
|
3ff49e86f5 | ||
|
|
c0da2b2a0e | ||
|
|
e61ff51e67 | ||
|
|
cc66e34fbf | ||
|
|
57011d2313 | ||
|
|
5ae44f9bc4 | ||
|
|
4576b3923c | ||
|
|
877509762c | ||
|
|
a21476beab | ||
|
|
d3508b6acd | ||
|
|
dfea0aad48 | ||
|
|
e55f28594c | ||
|
|
7605197f9d | ||
|
|
15ad46fff9 | ||
|
|
2d7bfa2390 | ||
|
|
daae92ea92 | ||
|
|
f2fcbe7ccf | ||
|
|
e65a4500e8 | ||
|
|
6a3a180e1e | ||
|
|
fdabc7eccc | ||
|
|
2ac77e3e98 | ||
|
|
67c58a3263 | ||
|
|
11907f7056 | ||
|
|
dbdd59e52f | ||
|
|
3d80541769 | ||
|
|
aad2bcb621 | ||
|
|
36a9ccc3a8 | ||
|
|
ce2ee9bb3f | ||
|
|
1c922f2d2d | ||
|
|
a4ceb82d67 | ||
|
|
cd1d855a71 | ||
|
|
8398297518 | ||
|
|
ef86a99093 | ||
|
|
8c95ab94d3 | ||
|
|
9fa9c5b0a2 | ||
|
|
f117860a16 | ||
|
|
4652c5516d | ||
|
|
de6a384668 | ||
|
|
9dde6983e6 | ||
|
|
c8a4abfcb2 | ||
|
|
fd0da7d4df | ||
|
|
8e0819df04 | ||
|
|
9bcca69967 | ||
|
|
9ee4daea43 | ||
|
|
6cf6a73fc0 | ||
|
|
e8ff9ad005 | ||
|
|
969607ac44 | ||
|
|
4c4976a4e9 | ||
|
|
5dd4813b34 | ||
|
|
53b7486528 | ||
|
|
5a65f3d48f | ||
|
|
8ee684e586 | ||
|
|
768d5b29f1 | ||
|
|
fe7f217497 | ||
|
|
baa23afbd3 | ||
|
|
a36318c536 | ||
|
|
929f1009c7 | ||
|
|
6a814dd41f | ||
|
|
7de8d0603f | ||
|
|
79e8722743 | ||
|
|
91a682f11b | ||
|
|
529c0f1fc9 | ||
|
|
a3bbea86ff | ||
|
|
77a5666cb7 | ||
|
|
1e5e755ba2 | ||
|
|
3177a9be84 | ||
|
|
5a992d4e18 | ||
|
|
c340d735ec | ||
|
|
06b4911db4 | ||
|
|
b88057fffd | ||
|
|
a56f0922c5 | ||
|
|
97e2be0033 | ||
|
|
719d03a8c1 | ||
|
|
5cbd9b2b7b | ||
|
|
f505b6cb08 | ||
|
|
85eb37c62b | ||
|
|
ddaa1411a3 | ||
|
|
2d6d199c49 | ||
|
|
02db9c7612 | ||
|
|
a48810f4a5 | ||
|
|
9e31a26edc | ||
|
|
610ba20527 | ||
|
|
e9f4e87786 | ||
|
|
851a4aa904 | ||
|
|
483e6bae27 | ||
|
|
99a8c5937c | ||
|
|
3e870833ab | ||
|
|
9d8a364e16 | ||
|
|
009c9ad13f | ||
|
|
5c5c6653fd | ||
|
|
1050d3028b | ||
|
|
d6ed8880d8 | ||
|
|
049aaa4c96 | ||
|
|
dd9290b6bd | ||
|
|
e62e1e91fe | ||
|
|
60778f6f8c | ||
|
|
a46a661b34 | ||
|
|
2459476b65 | ||
|
|
a4ab405faa | ||
|
|
6a69f0e96f | ||
|
|
dbdba4c254 | ||
|
|
17692ffc5f | ||
|
|
68b3030f23 | ||
|
|
bf44d4b1bb | ||
|
|
a22aeb00ed | ||
|
|
ab7fd12e1d | ||
|
|
08a4b76a2f | ||
|
|
801046cd78 | ||
|
|
b37e84b05f | ||
|
|
a9a8fbbc4a | ||
|
|
9f2f86441d | ||
|
|
2e5139eba4 | ||
|
|
8f58d34e06 | ||
|
|
1f96e32fcd | ||
|
|
facc9ddc63 | ||
|
|
52353a7eb2 | ||
|
|
bf4d873985 | ||
|
|
2bfb9760ad | ||
|
|
d2fd626780 | ||
|
|
791d1fc08d | ||
|
|
71276b6181 | ||
|
|
0ddcedcf6e | ||
|
|
258d637df3 | ||
|
|
fc5351b4b9 | ||
|
|
c230321cae | ||
|
|
55647b8458 | ||
|
|
7dda7f1dee | ||
|
|
28d4c58448 | ||
|
|
5e59b0b384 | ||
|
|
b7e08d4fba | ||
|
|
a9f0fc55d1 | ||
|
|
723b91851f | ||
|
|
0f9605e143 | ||
|
|
9a11ede5ff | ||
|
|
a8598aa8d2 | ||
|
|
2639f044cc | ||
|
|
16a1655bba | ||
|
|
ee0bc579c1 | ||
|
|
a5ef6d57c1 | ||
|
|
5f9d9bb1c2 | ||
|
|
b60cdf4927 | ||
|
|
3ff51d108b | ||
|
|
5cced37a1b | ||
|
|
de82824fbf | ||
|
|
14d06ea011 | ||
|
|
ecded726ce | ||
|
|
21e7a9dc9e | ||
|
|
2432a62ab6 | ||
|
|
c57794fe1f | ||
|
|
6aa05b5855 | ||
|
|
956b935511 | ||
|
|
9a68248f29 | ||
|
|
17a497492a | ||
|
|
a2e6e6c243 | ||
|
|
201a57440c | ||
|
|
fece67ee4b | ||
|
|
53878a53db | ||
|
|
4981dbe32b | ||
|
|
8d7497f7fb | ||
|
|
9f7784ea4d | ||
|
|
518e455dce | ||
|
|
844a31b24c | ||
|
|
56045e8e3d | ||
|
|
de3746e2ba | ||
|
|
6923c9cf57 | ||
|
|
afcc8d8f62 | ||
|
|
78a6d07a90 | ||
|
|
7981278021 | ||
|
|
658b847384 | ||
|
|
75c8580238 | ||
|
|
5a0bc863dd | ||
|
|
11de514217 | ||
|
|
26e2736863 | ||
|
|
1243c0ba4d | ||
|
|
a3dfef117b | ||
|
|
512af7fbd7 | ||
|
|
5058a0dba7 | ||
|
|
0cd1901da9 | ||
|
|
94d477b3df | ||
|
|
1668c3e97d | ||
|
|
1274aa5c8a | ||
|
|
a4f0349813 | ||
|
|
a091b91d83 | ||
|
|
4765cc3411 | ||
|
|
8aa3c1e4b9 | ||
|
|
77e6c39cbd | ||
|
|
73f27b7cae | ||
|
|
816b499ef8 | ||
|
|
b65b577ad3 | ||
|
|
d73e6412b7 | ||
|
|
87838bb62c | ||
|
|
8757c6934c | ||
|
|
189d0c803f | ||
|
|
2b58cc6578 | ||
|
|
6716f15d7b | ||
|
|
18280fdc25 | ||
|
|
31421db6fa | ||
|
|
4739b18cb1 | ||
|
|
00a093e108 | ||
|
|
15edd28a69 | ||
|
|
7251645685 | ||
|
|
856416540c | ||
|
|
054cf3b1cb | ||
|
|
8e8d58a915 | ||
|
|
c25f5e1955 | ||
|
|
024a7eeec3 | ||
|
|
323c16a5fb | ||
|
|
32b417a8f7 | ||
|
|
9cf473c88c | ||
|
|
37ac7f923a | ||
|
|
4b521051d3 | ||
|
|
f0f94a1235 | ||
|
|
817ea66e9f | ||
|
|
3f556c8df4 | ||
|
|
c6ee7baca7 | ||
|
|
e5bf64d792 | ||
|
|
eb815c48d7 | ||
|
|
b0933fe431 | ||
|
|
75f04dd775 | ||
|
|
2db68e26c4 | ||
|
|
b586ab839d | ||
|
|
dbfe1a33f1 | ||
|
|
28a5ecfed1 | ||
|
|
6e8d83e783 | ||
|
|
5a4e9e4389 | ||
|
|
e501f784c3 | ||
|
|
910409b4fb | ||
|
|
30e56fd6a0 | ||
|
|
34f71ec25b | ||
|
|
6196e03337 | ||
|
|
ba19e5b92b | ||
|
|
af3ea2af03 | ||
|
|
558450f0ab | ||
|
|
4e016e2260 | ||
|
|
fcbf7cc1aa | ||
|
|
f1154b5be2 | ||
|
|
d3d704fddb | ||
|
|
12a2e14a83 | ||
|
|
bdc522bad7 | ||
|
|
95b0515c30 | ||
|
|
c7955e5faf | ||
|
|
d420036cbc | ||
|
|
fad26cb3ae | ||
|
|
78792120cd | ||
|
|
3c674fb4d8 | ||
|
|
d090da6b91 | ||
|
|
6534f3d87c | ||
|
|
5c6ffe1a4d | ||
|
|
1dc7845c06 | ||
|
|
ffebcfbb9f | ||
|
|
126faafb6e | ||
|
|
9abb0a2592 | ||
|
|
6d11e1e7e2 | ||
|
|
694fbd2f77 | ||
|
|
49f81d387a | ||
|
|
b2d3fb726d | ||
|
|
7c18361faf | ||
|
|
3717ce2094 | ||
|
|
16872c582c | ||
|
|
d4b202ec7e | ||
|
|
76dff2b924 | ||
|
|
79e481d093 | ||
|
|
712d008f66 | ||
|
|
8e71885ee5 | ||
|
|
6bea926ef2 | ||
|
|
aa38c44b3b | ||
|
|
bdedf648c5 | ||
|
|
6b5038ef7a | ||
|
|
4f7abe0231 | ||
|
|
7dcb0c79c3 | ||
|
|
2e98005608 | ||
|
|
41388daf74 | ||
|
|
768ce91296 | ||
|
|
0c8579151f | ||
|
|
cd802f6a8f | ||
|
|
89ad9c6527 | ||
|
|
24319beed3 | ||
|
|
6cd890e843 | ||
|
|
0c6016475b | ||
|
|
b63c56cefa | ||
|
|
4d2fb8a6cf | ||
|
|
105fd2aac5 | ||
|
|
902a1d7ece | ||
|
|
667d03f184 | ||
|
|
ed87aa242d | ||
|
|
2782ed0721 | ||
|
|
4d6527ec8c | ||
|
|
6c3e2f0aa0 | ||
|
|
cd7869001f | ||
|
|
6bfdddca39 | ||
|
|
b2d5d3f51c | ||
|
|
79a111fc1a | ||
|
|
2234c3a2e6 | ||
|
|
3b2b73de88 | ||
|
|
d0f790e166 | ||
|
|
5449126959 | ||
|
|
2909e8d7a0 | ||
|
|
6fecb56aee | ||
|
|
53cb2a947d | ||
|
|
04e86fc2d5 | ||
|
|
24caccbd02 | ||
|
|
6b98aec34a | ||
|
|
5aaf4136bf | ||
|
|
987cb1ebd9 | ||
|
|
3648c0cc5c | ||
|
|
6acf345296 | ||
|
|
e30a0602a0 | ||
|
|
ee71af840f | ||
|
|
6fb38bc246 | ||
|
|
646a30fe7c | ||
|
|
ff6df40e3c | ||
|
|
89a1255dc2 | ||
|
|
5645b82b74 | ||
|
|
4a78dedbae | ||
|
|
1309990d6c | ||
|
|
e109319a2e | ||
|
|
bc3fada2ce | ||
|
|
bc8d77fdbd | ||
|
|
fd261d839d | ||
|
|
383ca3bcf9 | ||
|
|
53620b91c8 | ||
|
|
768993fb15 | ||
|
|
216df60208 | ||
|
|
c93c0da4b0 | ||
|
|
95fcece2a5 | ||
|
|
ccd6aec427 | ||
|
|
d0ad047f81 | ||
|
|
85988dc77f | ||
|
|
4b0a3d92ff | ||
|
|
396ab2e931 | ||
|
|
f50d2cdbe3 | ||
|
|
4a4c550ced | ||
|
|
5365fc9ffd | ||
|
|
23691fd422 | ||
|
|
cb684097b8 | ||
|
|
74db485277 | ||
|
|
32aefa44c5 | ||
|
|
f585d74b8c | ||
|
|
9621aca73c | ||
|
|
100db2a678 | ||
|
|
f890a0b1cb | ||
|
|
c9f13d698c | ||
|
|
52ec336c55 | ||
|
|
c08feedcfd | ||
|
|
55b0d4a110 | ||
|
|
8fd4b4d45b | ||
|
|
fb7dafc7e0 | ||
|
|
e86f6c12a5 | ||
|
|
c10e78869b | ||
|
|
fc8c425cc0 | ||
|
|
c34bbb9935 | ||
|
|
718fcfac1e | ||
|
|
963d0680bd | ||
|
|
7277a48482 | ||
|
|
78590a55ea | ||
|
|
7b066ed0d8 | ||
|
|
81f9fb5e08 | ||
|
|
7f3246cfdf | ||
|
|
13d3b3d26c | ||
|
|
7daeca62b0 | ||
|
|
7afa9b51ea | ||
|
|
c0707b5fc3 | ||
|
|
8083b094c3 | ||
|
|
d46dce5819 | ||
|
|
33987a76a9 | ||
|
|
f41873223c | ||
|
|
7cacd569e5 | ||
|
|
56a20a202d | ||
|
|
dda21ad57e | ||
|
|
b129ddd6e0 | ||
|
|
10baddee07 | ||
|
|
d0349a3bd4 | ||
|
|
f3b1ac089b | ||
|
|
6f56e69a14 | ||
|
|
4bc06d9a4b | ||
|
|
9768cfab79 | ||
|
|
3cb5d475ae | ||
|
|
5d37383457 | ||
|
|
3d5183f404 | ||
|
|
ff276e422f | ||
|
|
1bc2e93124 | ||
|
|
046fe00b96 | ||
|
|
415168dde6 | ||
|
|
ed370ec674 | ||
|
|
5dba460f5f | ||
|
|
4ac830ef1e | ||
|
|
0c7788cf26 | ||
|
|
355153cff5 | ||
|
|
4df395bfc4 | ||
|
|
b4ec3d7d4a | ||
|
|
b18cf9aab3 | ||
|
|
0a7c308f1b | ||
|
|
7cfcb49213 | ||
|
|
73b888869b | ||
|
|
bbb2b289cf | ||
|
|
a7c6b20e89 | ||
|
|
391b643855 | ||
|
|
dab972b907 | ||
|
|
4d79a5cbaf | ||
|
|
c078b2ee7a | ||
|
|
41868f5061 | ||
|
|
be0e677699 | ||
|
|
9de5a2550e | ||
|
|
85fe229de0 | ||
|
|
7faebbd425 | ||
|
|
e94e1e59f3 | ||
|
|
3e8f7e33fc | ||
|
|
44ae5cc14a | ||
|
|
cb9cba8d3f | ||
|
|
6d9259f334 | ||
|
|
7bfd623616 | ||
|
|
f7072ceea8 | ||
|
|
d8ea8e3d1f | ||
|
|
93c8cb29ea | ||
|
|
86efbcbee7 | ||
|
|
fd38b95467 | ||
|
|
53e837e357 | ||
|
|
a549668439 | ||
|
|
40886698fb | ||
|
|
c9c4cc13e6 | ||
|
|
a2f01f5e64 | ||
|
|
7986f66006 | ||
|
|
3bd106081f | ||
|
|
5c9e8d6352 | ||
|
|
caed582ea9 | ||
|
|
83bddd86c5 | ||
|
|
e89409cfe6 | ||
|
|
3d598fce6c | ||
|
|
fcda92ebc7 | ||
|
|
b8856479ef | ||
|
|
3e68694bdf | ||
|
|
400951b7de | ||
|
|
cb179e4ed2 | ||
|
|
ec63217b48 | ||
|
|
900b32c908 | ||
|
|
2c9939920b | ||
|
|
aed0e2873e | ||
|
|
f4d3e549b6 | ||
|
|
65ee6bea44 | ||
|
|
e4cf94b509 | ||
|
|
4a9b3a5881 | ||
|
|
ea0501387f | ||
|
|
890524c86f | ||
|
|
e1fdbd7936 | ||
|
|
c45a7c8ccd | ||
|
|
a06e53b1f9 | ||
|
|
9cc710e954 | ||
|
|
df418bea81 | ||
|
|
eb36c15171 | ||
|
|
6f4546f597 | ||
|
|
97a38b2b1f | ||
|
|
ca4ff01cf9 | ||
|
|
f671c004df | ||
|
|
e81227f99d | ||
|
|
7032c72f2f | ||
|
|
e68d5ffb98 | ||
|
|
db767b6f45 | ||
|
|
23948824b2 | ||
|
|
7e5a436ff9 | ||
|
|
55b296a5c6 | ||
|
|
54bcf3afdd | ||
|
|
e15db0c21b | ||
|
|
d0cb5afc2f | ||
|
|
487d541f36 | ||
|
|
baf5509b59 | ||
|
|
c356fe92bc | ||
|
|
a60a5567f4 | ||
|
|
6655c99341 | ||
|
|
111e02dbdb | ||
|
|
28973a37b3 | ||
|
|
aea9b50dc8 | ||
|
|
70a4010635 | ||
|
|
6b01cce1aa | ||
|
|
6b720033cc | ||
|
|
04243050f7 | ||
|
|
caba5a0a6f | ||
|
|
f358bdfcb3 | ||
|
|
beb5369a0d | ||
|
|
cc189ef170 | ||
|
|
5eebfbb441 | ||
|
|
8726e530d5 | ||
|
|
a906a76734 | ||
|
|
ceba53402e | ||
|
|
0acd68b391 | ||
|
|
dec2cd9635 | ||
|
|
f99209215d | ||
|
|
e287e4bb9e | ||
|
|
d521d2ea57 | ||
|
|
dd20ae28cb | ||
|
|
44e5a5ecd7 | ||
|
|
b810ac0b7e | ||
|
|
cb292d0608 | ||
|
|
f270ef644e | ||
|
|
f95d60366a | ||
|
|
575582ca85 | ||
|
|
73701cd7cd | ||
|
|
7c37421266 | ||
|
|
134b8b538f | ||
|
|
f60d23fdb9 | ||
|
|
02efb15b57 | ||
|
|
be55ea7869 | ||
|
|
6a5912c76c | ||
|
|
bebae28bdd | ||
|
|
1707be3977 | ||
|
|
b5fb80c0cd | ||
|
|
a6c41fbaeb | ||
|
|
b00f612470 | ||
|
|
a38acd685f | ||
|
|
0786563bba | ||
|
|
fd42d811c2 | ||
|
|
32e597a136 | ||
|
|
3516a5d2ee | ||
|
|
fe8232fba0 | ||
|
|
f1557dafd3 | ||
|
|
bfd4cbc743 | ||
|
|
679dbdac0a | ||
|
|
98dde40a88 | ||
|
|
c2f75330f7 | ||
|
|
08bfc4e9c7 | ||
|
|
fa26bab6b2 | ||
|
|
e935f153bc | ||
|
|
15df04083e | ||
|
|
b7ac752cca | ||
|
|
3877c31b2f | ||
|
|
5b2a89e174 | ||
|
|
f0f98c3d73 | ||
|
|
fe1d701b71 | ||
|
|
c50ff7ff61 | ||
|
|
cf54069487 | ||
|
|
3a28933ca8 | ||
|
|
5abae22fd4 | ||
|
|
0a9b983e90 | ||
|
|
f2819b71e5 | ||
|
|
213219f30a | ||
|
|
411c98acec | ||
|
|
e3e3cc28a6 | ||
|
|
4ce809e7d4 | ||
|
|
700b0ed235 | ||
|
|
a926c8bf12 | ||
|
|
f7448f848b | ||
|
|
f15605da2f | ||
|
|
69d5f960fc | ||
|
|
4159fa197b | ||
|
|
2655f80dd7 | ||
|
|
6b35ff323a | ||
|
|
0914c20c0d | ||
|
|
90c963677c | ||
|
|
9201c3e8e1 | ||
|
|
a7889e122c | ||
|
|
c99a1fd2a5 | ||
|
|
1fb35350b9 | ||
|
|
c647fc63de | ||
|
|
d4ac7cc816 | ||
|
|
9f3f6a4b3b | ||
|
|
1d3e6510e6 | ||
|
|
aa99d267b7 | ||
|
|
417b87a0a0 | ||
|
|
3ac86cc6f1 | ||
|
|
b93aa0cb8d | ||
|
|
f58c87e7ed | ||
|
|
49418d6de5 | ||
|
|
4f7dd7be7c | ||
|
|
c694d8d90f | ||
|
|
93105568c0 | ||
|
|
75ddde9c56 | ||
|
|
125cf7abe2 | ||
|
|
fd9c92e2e9 | ||
|
|
d650d3276f | ||
|
|
ce68d7a738 | ||
|
|
efb4e0bc91 | ||
|
|
a1bca5070c | ||
|
|
75b4720a6e | ||
|
|
35edbf02f5 | ||
|
|
6833a8c0cc | ||
|
|
07d229f514 | ||
|
|
386e077525 | ||
|
|
1adc70fe43 | ||
|
|
e533df52cc | ||
|
|
ef7e2a8636 | ||
|
|
6766327cde | ||
|
|
0ed95bbe97 | ||
|
|
95acf6c904 | ||
|
|
e20d2688ab | ||
|
|
ad18a50282 | ||
|
|
f9dfb51001 | ||
|
|
bf40833d2e | ||
|
|
800f1f4bae | ||
|
|
ad8478045e | ||
|
|
d80b08d07e | ||
|
|
c86b154677 | ||
|
|
4079f6d613 | ||
|
|
b3cfcee47d | ||
|
|
412505d286 | ||
|
|
8ae5a1b148 | ||
|
|
86d084fe21 | ||
|
|
f32aa2df59 | ||
|
|
48928e1c68 | ||
|
|
0e04cd75f8 | ||
|
|
d65c51b0c6 | ||
|
|
04c31b820c | ||
|
|
ab675c5b7d | ||
|
|
3a1893ba7e | ||
|
|
d3c3a6ebe0 | ||
|
|
7560a5e80d | ||
|
|
79b72c0302 | ||
|
|
b2f1ab31c7 | ||
|
|
b2d24f7688 | ||
|
|
98a1618202 | ||
|
|
4b401d95b1 | ||
|
|
17103a6b3d | ||
|
|
27a17df69d | ||
|
|
19d6f40767 | ||
|
|
af4e177722 | ||
|
|
257719d65a | ||
|
|
804762c72d | ||
|
|
e1357fa6c9 | ||
|
|
6529e74326 | ||
|
|
2c2577fc75 | ||
|
|
8bc93e07ce | ||
|
|
a75dd4be40 | ||
|
|
cf0ee4354c | ||
|
|
585d0e083b | ||
|
|
5137e6f3db | ||
|
|
5736d2adfd | ||
|
|
6978a65293 | ||
|
|
f3c104b99a | ||
|
|
86080a110e | ||
|
|
369c354dc7 | ||
|
|
fb0ab1b4c6 | ||
|
|
0af64dc045 | ||
|
|
04a156e0d0 | ||
|
|
b962c02c05 | ||
|
|
4b1d59d40d | ||
|
|
503b4ccf82 | ||
|
|
5d9811a03d | ||
|
|
7ab1f2a957 | ||
|
|
4454c8d02f | ||
|
|
0d34e55d9e | ||
|
|
d8dd8ff61e | ||
|
|
da6998434b | ||
|
|
a37267e644 | ||
|
|
3a912b8778 | ||
|
|
5578539c88 | ||
|
|
826b95a377 | ||
|
|
1a0cd7211a | ||
|
|
311e1edbdb | ||
|
|
478ad2c782 | ||
|
|
e4f0a55673 | ||
|
|
63a80df4e2 | ||
|
|
de4c99f870 | ||
|
|
0a187004c1 | ||
|
|
2235f33033 | ||
|
|
4713edf5a8 | ||
|
|
bfdb76c609 | ||
|
|
ea4437fc76 | ||
|
|
fc1045271a | ||
|
|
e599bbcd24 | ||
|
|
922f9932a6 | ||
|
|
b67b56111a | ||
|
|
699b7c6a22 | ||
|
|
e8dcb60d71 | ||
|
|
75b2519827 | ||
|
|
5cee3eebd9 | ||
|
|
77cc8c96b1 | ||
|
|
e8bf439105 | ||
|
|
6d7ed39a0d | ||
|
|
005a4c60c9 | ||
|
|
dbf7d34a2a | ||
|
|
dd2c3b3f6a | ||
|
|
ad9a44d606 | ||
|
|
d33c9d3669 | ||
|
|
73301dd16d | ||
|
|
2a255db413 | ||
|
|
c1d859c249 | ||
|
|
098f5836f9 | ||
|
|
7ad9525c35 | ||
|
|
b13f70ca59 | ||
|
|
d325cf048a | ||
|
|
a62f09136e | ||
|
|
7b8cc4e74b | ||
|
|
ef908dd83b | ||
|
|
dd607dbd11 | ||
|
|
ab26b11bbc | ||
|
|
96cd66cf51 | ||
|
|
4a9752ed3d | ||
|
|
5854208e55 | ||
|
|
943fda1aa8 | ||
|
|
9fc5fea946 | ||
|
|
2bfa344cc0 | ||
|
|
853e574800 | ||
|
|
15b24123f5 | ||
|
|
b85bd22fe1 | ||
|
|
82c78c6734 | ||
|
|
b6cd7679e4 | ||
|
|
71bbfbea43 | ||
|
|
24667d219e | ||
|
|
7c803d28e6 | ||
|
|
2792127849 | ||
|
|
13315255e5 | ||
|
|
f500c64962 | ||
|
|
da7d9e3737 | ||
|
|
b61686b866 | ||
|
|
02d293d4b7 | ||
|
|
baf15a1a89 | ||
|
|
4f11f38c38 | ||
|
|
12d31075eb | ||
|
|
509e90aadc | ||
|
|
b370f77851 | ||
|
|
d4e85ce384 | ||
|
|
13d2cc1d88 | ||
|
|
e7a86f38d3 | ||
|
|
fd8ce46060 | ||
|
|
fe7b57aa11 | ||
|
|
9bb730fb6b | ||
|
|
2e49d78400 | ||
|
|
68fee5effb | ||
|
|
4e4ccd6c73 | ||
|
|
88b01447b5 | ||
|
|
006e33c646 | ||
|
|
2254074f82 | ||
|
|
f1ba1a40ed | ||
|
|
e957e1633c | ||
|
|
21bc466a2b | ||
|
|
cf9dd1c653 | ||
|
|
832b160cb1 | ||
|
|
ca403ffaf7 | ||
|
|
8160dd0d56 | ||
|
|
4f04151f17 | ||
|
|
b58ecee1c9 | ||
|
|
fa589ae622 | ||
|
|
5e4c4d7393 | ||
|
|
99b99c8c5e | ||
|
|
c785e32183 | ||
|
|
a594bbda7c | ||
|
|
a4f7129984 | ||
|
|
359f66ad37 | ||
|
|
80feb2432d | ||
|
|
9246502aca | ||
|
|
df2db2e410 | ||
|
|
c94b091bd3 | ||
|
|
ba030e5843 | ||
|
|
19ba886ec2 | ||
|
|
7cc325ae83 | ||
|
|
7f67ee8c88 | ||
|
|
db22e07d07 | ||
|
|
69cad3c287 | ||
|
|
41f60bd669 | ||
|
|
e86745b9a2 | ||
|
|
6b44c59bee | ||
|
|
6f192bd1e0 | ||
|
|
b8533e0f70 | ||
|
|
fd0ac1b8fb | ||
|
|
95f32fd018 | ||
|
|
6a686ba93d | ||
|
|
5a8e089c66 | ||
|
|
8ac809e680 | ||
|
|
f0ddb92be0 | ||
|
|
cf4db3f62d | ||
|
|
4e6041a46c | ||
|
|
f63a3cac0e | ||
|
|
8bee2e2fe0 | ||
|
|
78b7318a04 | ||
|
|
49f88d50b2 | ||
|
|
f3d06972dc | ||
|
|
38eec3f0f0 | ||
|
|
ce84d5d7cd | ||
|
|
1207977447 | ||
|
|
a38c23f557 | ||
|
|
1789e685a2 | ||
|
|
df55bf5cea | ||
|
|
96956ba83c | ||
|
|
1927f8060c | ||
|
|
8e77b79f78 | ||
|
|
9ee3640b62 | ||
|
|
42d34fcef3 | ||
|
|
9db9ef37b4 | ||
|
|
7394b4584d | ||
|
|
220a5a2ce6 | ||
|
|
ee1e84a261 | ||
|
|
1dd7d3dec3 | ||
|
|
8ad4ae5508 | ||
|
|
f102f6f405 | ||
|
|
ecadbbb43c | ||
|
|
bcd721b627 | ||
|
|
3fd4ea8587 | ||
|
|
c57e7a7b81 | ||
|
|
705b87e7a2 | ||
|
|
0f9642d403 | ||
|
|
8a131cb7e7 | ||
|
|
efa6e60b45 | ||
|
|
d9eedb052e | ||
|
|
a29d9ea9da | ||
|
|
28d71b79a2 | ||
|
|
fea1b197d4 | ||
|
|
bf140bcaae | ||
|
|
57af6174f0 | ||
|
|
c375f3e6fc | ||
|
|
0a9b58ff88 | ||
|
|
9ccff7b349 | ||
|
|
61c4050d31 | ||
|
|
8cfcd274b2 | ||
|
|
3648ddce0f | ||
|
|
b0da60e498 | ||
|
|
e949e207e0 | ||
|
|
93b4dc2692 | ||
|
|
a275567ad0 | ||
|
|
f4e29f376d | ||
|
|
20fb7e1898 | ||
|
|
bb8b5493e0 | ||
|
|
0e823eadca | ||
|
|
464607dc90 | ||
|
|
0eb778d849 | ||
|
|
fc7a957554 | ||
|
|
5a9529185f | ||
|
|
b94c26fefc | ||
|
|
1f4292c250 | ||
|
|
248a9f772b | ||
|
|
e9c6fa0497 | ||
|
|
53491d4f0c | ||
|
|
928fb2be6d | ||
|
|
1bd7554f5c | ||
|
|
8994bab34c | ||
|
|
cfed5f08fd | ||
|
|
4ed5bec472 | ||
|
|
e769d53471 | ||
|
|
4563668e5b | ||
|
|
0bf87e7893 | ||
|
|
0e06cfeaec | ||
|
|
44d0642334 | ||
|
|
360f7b748a | ||
|
|
731e7470b2 | ||
|
|
b366a31644 | ||
|
|
757fc307c3 | ||
|
|
b1e6583246 | ||
|
|
6aef7fc0a3 | ||
|
|
fb638a13cc | ||
|
|
8b368b7680 | ||
|
|
2b2c4805a4 | ||
|
|
efdc1ebf3f | ||
|
|
6e6df7dca8 | ||
|
|
a610b633d2 | ||
|
|
542558f2c1 | ||
|
|
9d1a70af86 | ||
|
|
2ad05e3062 | ||
|
|
8f10dde6ad | ||
|
|
19958f0428 | ||
|
|
64f9dc100c | ||
|
|
2e0c1c1ddb | ||
|
|
30efeb7424 | ||
|
|
eb8ad7af2f | ||
|
|
cd499f9d37 | ||
|
|
ea7241a1a6 | ||
|
|
77ac0e4838 | ||
|
|
6e67d8ab78 | ||
|
|
185ebab90f | ||
|
|
3fbb452b4a | ||
|
|
6725d481b2 | ||
|
|
167672c783 | ||
|
|
311b4210b7 | ||
|
|
6d7761f274 | ||
|
|
7a2774b75a | ||
|
|
7f11c91054 | ||
|
|
d1e46c2d3e | ||
|
|
19553cb395 | ||
|
|
78020aec0d | ||
|
|
9f3e2cd234 | ||
|
|
9fcb58fb8a | ||
|
|
867897ad53 | ||
|
|
7d6e12917f | ||
|
|
cfc005a460 | ||
|
|
9884159346 | ||
|
|
595adbcca6 | ||
|
|
c7e8ade590 | ||
|
|
df3121213e | ||
|
|
11f0c2af43 | ||
|
|
5592e38253 | ||
|
|
636a155a21 | ||
|
|
e07d8f546a | ||
|
|
80ed2b96d3 | ||
|
|
8175d89cd3 | ||
|
|
38a190156a | ||
|
|
091ff57126 | ||
|
|
3e2c8fdb41 | ||
|
|
519c4ccb1b | ||
|
|
02f608b64d | ||
|
|
ca855f3f23 | ||
|
|
776136a113 | ||
|
|
a8e6a07b0a | ||
|
|
00dd4affea | ||
|
|
2c56945fee | ||
|
|
6aef469c19 | ||
|
|
88fff23d34 | ||
|
|
5a623cc9e3 | ||
|
|
05eadd1bd6 | ||
|
|
5ae46ab6a7 | ||
|
|
bd20d45612 | ||
|
|
8ec53eeb52 | ||
|
|
8fff07b435 | ||
|
|
e4376a0e60 | ||
|
|
e517dfd672 | ||
|
|
fd22b63722 | ||
|
|
92d38a3bb1 | ||
|
|
393df6762e | ||
|
|
60dc920701 | ||
|
|
8edfe88187 | ||
|
|
37c0cdd1a6 | ||
|
|
63e3c6c521 | ||
|
|
a3390417f7 | ||
|
|
c81da4c185 | ||
|
|
bce24201c7 | ||
|
|
d706510064 | ||
|
|
bb24794fcb | ||
|
|
dc90c52413 | ||
|
|
0c200b8966 | ||
|
|
81de5d4c59 | ||
|
|
3a6775c8ac | ||
|
|
ed5cadb7cb | ||
|
|
c86509be4c | ||
|
|
0357cb99b2 | ||
|
|
31e7c5ec60 | ||
|
|
7b22525f0b | ||
|
|
3dabc24635 | ||
|
|
4c5406e225 | ||
|
|
a799738184 | ||
|
|
606ebe99d9 | ||
|
|
14465b85c4 | ||
|
|
c2f07a4d5a | ||
|
|
da30a87b81 | ||
|
|
25f200e9b0 | ||
|
|
bf03439d1b | ||
|
|
dd5dbde620 | ||
|
|
8094ced139 | ||
|
|
46fac8c851 | ||
|
|
902ae591b1 | ||
|
|
d03b87b1bc | ||
|
|
89ec8cbf96 | ||
|
|
03909627b9 | ||
|
|
82ee0d1e24 | ||
|
|
76e6a03d71 | ||
|
|
5f4525bf0c | ||
|
|
b16eaf9d8e | ||
|
|
bd2efd9f51 | ||
|
|
7903911000 | ||
|
|
f1e8e933c5 | ||
|
|
ee4d8b738f | ||
|
|
dbc757d79d | ||
|
|
7bc1c17ecd | ||
|
|
56da7efc57 | ||
|
|
a95d34c346 | ||
|
|
e1cc1199bb | ||
|
|
1f78f8a9c6 | ||
|
|
8554db0b5e | ||
|
|
f85a6b6fb9 | ||
|
|
36a0c924f7 | ||
|
|
12863fbd52 | ||
|
|
58c3dbac95 | ||
|
|
d6070cdfc8 | ||
|
|
fc12542fd4 | ||
|
|
1d9e1deb77 | ||
|
|
8609c92081 | ||
|
|
4beb637925 | ||
|
|
9517b46958 | ||
|
|
13bfad1053 | ||
|
|
682cac07d9 | ||
|
|
2bbfb1b396 | ||
|
|
2c5dc1e4a2 | ||
|
|
b1f91528ec | ||
|
|
c2efa80969 | ||
|
|
6e3c4aab7d | ||
|
|
fe28ed0520 | ||
|
|
678415c6fa | ||
|
|
192f87b3ea | ||
|
|
165f30d3ac | ||
|
|
76fece26a2 | ||
|
|
757552e759 | ||
|
|
1c23a095ea | ||
|
|
d52a8298ce | ||
|
|
390f1e2c60 | ||
|
|
9f8f70e32a | ||
|
|
c3f91b3a0a | ||
|
|
2c3c2edcb7 | ||
|
|
ffab06c6c5 | ||
|
|
2717ba4f88 | ||
|
|
d251d12f6f | ||
|
|
8d61a10a74 | ||
|
|
5862b9d15c | ||
|
|
0fe45a4c73 | ||
|
|
9368b659a7 | ||
|
|
ec1c5f9273 | ||
|
|
7bf9025f28 | ||
|
|
513662732d | ||
|
|
7c8f0e41fc | ||
|
|
9ba5c86bcd | ||
|
|
2962af6fe6 | ||
|
|
e12d48f0d2 | ||
|
|
1a18703a42 | ||
|
|
539b7363d0 | ||
|
|
fe4b44e3ff | ||
|
|
a7567ce7b6 | ||
|
|
f613d05496 | ||
|
|
8e1ee24f9e | ||
|
|
ad48457183 | ||
|
|
041cec1af8 | ||
|
|
bc84e5eb3c | ||
|
|
d7ce4226ef | ||
|
|
ef952aac96 | ||
|
|
f6a86a578d | ||
|
|
e431abe2ed | ||
|
|
eca51e267f | ||
|
|
c52f40770e | ||
|
|
003dbe1837 | ||
|
|
0a6539bfc5 | ||
|
|
65668b33d9 | ||
|
|
f6ab04addb | ||
|
|
cfb64cffb1 | ||
|
|
6fb173e3d5 | ||
|
|
4eda9bda8f | ||
|
|
6f01a3b3d4 | ||
|
|
31ad585611 | ||
|
|
ee7b47ba4e | ||
|
|
e69a032f20 | ||
|
|
fa6aeb3e12 | ||
|
|
263f4ab8b9 | ||
|
|
195ffe71e4 | ||
|
|
0b55209aff | ||
|
|
00bd5a2edf | ||
|
|
0d2ef47192 | ||
|
|
b659f0fbdf | ||
|
|
d6f787afca | ||
|
|
f844db5194 | ||
|
|
bca94fce5a | ||
|
|
c908661414 | ||
|
|
6944c5a0a1 | ||
|
|
75455d3788 | ||
|
|
8e460e7e19 | ||
|
|
0d210c3227 | ||
|
|
964747dd36 | ||
|
|
cf70d8f95b | ||
|
|
893387b2c5 | ||
|
|
4941182cc6 | ||
|
|
97440889ac | ||
|
|
2ad6dc37d8 | ||
|
|
78541e9876 | ||
|
|
6e8ea78d70 | ||
|
|
8a2f29c9b5 | ||
|
|
bcbf3ae89d | ||
|
|
6e3b402cf4 | ||
|
|
7fcba8a119 | ||
|
|
abbe022894 | ||
|
|
ab7cb90f88 | ||
|
|
9291d07a87 | ||
|
|
a86790c367 | ||
|
|
8c1c0efabc | ||
|
|
ed78d25934 | ||
|
|
98a9d2c749 | ||
|
|
744ecf2b01 | ||
|
|
0e0ac0656b | ||
|
|
8e8d461590 | ||
|
|
1975f7c485 | ||
|
|
2c0c02fe78 | ||
|
|
66f957792f | ||
|
|
1b99543e8d | ||
|
|
d9ec9ca868 | ||
|
|
162dc0996c | ||
|
|
09dfbdf4c7 | ||
|
|
a1ea7f9df7 | ||
|
|
cbcfe6be28 | ||
|
|
0dc5e9f469 | ||
|
|
79e770b0c6 | ||
|
|
45ef7f948f | ||
|
|
06f39d10f1 | ||
|
|
ac4b42fee7 | ||
|
|
ccd7d12bcb | ||
|
|
799fe4e684 | ||
|
|
732450d42a | ||
|
|
3d53b7e0e0 | ||
|
|
5d972ba6d5 | ||
|
|
0d5804c527 | ||
|
|
75673fed70 | ||
|
|
c2fdd8e99d | ||
|
|
21e1ef11da | ||
|
|
3837091582 | ||
|
|
048b79955e | ||
|
|
e6e4661131 | ||
|
|
37b77a78fa | ||
|
|
e031a82882 | ||
|
|
387eba2efd | ||
|
|
e3a9be0d05 | ||
|
|
3d0a49f33e | ||
|
|
6bc5196ff0 | ||
|
|
45a21aea8e | ||
|
|
046e83bec9 | ||
|
|
5b47bc24ae | ||
|
|
a8d2924c55 | ||
|
|
c427f408cb | ||
|
|
1c7839c28c | ||
|
|
daf9e80936 | ||
|
|
0d85084741 | ||
|
|
1e4165220e | ||
|
|
65b58724ca | ||
|
|
2e2630e838 | ||
|
|
35c31e35c1 | ||
|
|
7dbd02947e | ||
|
|
f987c6c02e | ||
|
|
429f5a166f | ||
|
|
420da4589e | ||
|
|
7035546422 | ||
|
|
1bf462e1c1 | ||
|
|
4d86c69a22 | ||
|
|
80eb94da8a | ||
|
|
40c506f3a0 | ||
|
|
995aef9d99 | ||
|
|
0cdb2cfa48 | ||
|
|
d1cbbcdb41 | ||
|
|
bd82e8d39f | ||
|
|
511d9d59de | ||
|
|
c4972d4721 | ||
|
|
8fe295de32 | ||
|
|
9dd3055014 | ||
|
|
a9f6d66888 | ||
|
|
d3232585b0 | ||
|
|
2af0fb3815 | ||
|
|
2ed3a91426 | ||
|
|
e1a382d62a | ||
|
|
0d3a2bbae8 | ||
|
|
e1ed558543 | ||
|
|
14030f6ba4 | ||
|
|
1e66c39066 | ||
|
|
6afc226350 | ||
|
|
de26582775 | ||
|
|
8e9462985a | ||
|
|
a25f640e54 | ||
|
|
a755cb72da | ||
|
|
8c8ebf4503 | ||
|
|
13a0d539fe | ||
|
|
1f4f338772 | ||
|
|
26892be894 | ||
|
|
451243accb | ||
|
|
707b7be4da | ||
|
|
a3ccf59204 | ||
|
|
6895da98e3 | ||
|
|
451f528bbb | ||
|
|
ec4f97623a | ||
|
|
79e4c66764 | ||
|
|
3021b8d11e | ||
|
|
491f549d1c | ||
|
|
06754940c5 | ||
|
|
dbb19c9e5a | ||
|
|
b515a00fea | ||
|
|
29a49f366e | ||
|
|
41fe4f177a | ||
|
|
a86315050d | ||
|
|
3f70a78dd3 | ||
|
|
000d1455b4 | ||
|
|
167c551e82 | ||
|
|
e04333c986 | ||
|
|
8b43f9f9ca | ||
|
|
c0cafab1a7 | ||
|
|
672b5ffbc1 | ||
|
|
6d730e3c25 | ||
|
|
9179783906 | ||
|
|
30805a7001 | ||
|
|
dcd60a2abe | ||
|
|
c5102fe504 | ||
|
|
a0d0f5eb25 | ||
|
|
c026bd824a | ||
|
|
819c34e975 | ||
|
|
cfa5af51cd | ||
|
|
8a177cd797 | ||
|
|
75155532b6 | ||
|
|
a109a6e58b | ||
|
|
79a137495a | ||
|
|
8081711e22 | ||
|
|
eef03ad0a1 | ||
|
|
147a796a7a | ||
|
|
1345fa13b1 | ||
|
|
ab43c625d1 | ||
|
|
6b635d575a | ||
|
|
45f2c2a26d | ||
|
|
a06fa5ac27 | ||
|
|
a549ea3888 | ||
|
|
45615a8d9d | ||
|
|
74af9a8065 | ||
|
|
131e4dc69d | ||
|
|
3f865c4f9e | ||
|
|
2b8bfc5be7 | ||
|
|
874ed7654d | ||
|
|
f02c5a5d7e | ||
|
|
37f1e453b1 | ||
|
|
8558e63772 | ||
|
|
3a8f4b53fc | ||
|
|
384c05beb2 | ||
|
|
e97b1a79d6 | ||
|
|
5bb4e14aad | ||
|
|
53ee04ba3c | ||
|
|
d44dd1c426 | ||
|
|
6fceb913a2 | ||
|
|
9f6d322186 | ||
|
|
4ec3f70f1d | ||
|
|
46c98420b7 | ||
|
|
d8d1e1e761 | ||
|
|
3528b5515f | ||
|
|
beb9188cee | ||
|
|
2d2e36c5e9 | ||
|
|
d7ec4e51b5 | ||
|
|
dbfe5fb573 | ||
|
|
29be9e3d1b | ||
|
|
af2741317a | ||
|
|
5ae2e1034b | ||
|
|
c4c3ffff90 | ||
|
|
c252ec1481 | ||
|
|
5c84c47cad | ||
|
|
71ea8b052d | ||
|
|
83505e217b | ||
|
|
ca4ef69661 | ||
|
|
943df4cb60 | ||
|
|
e7961a696e | ||
|
|
db9ea40798 | ||
|
|
99d905369e | ||
|
|
61250d5516 | ||
|
|
23f35ea1b3 | ||
|
|
85962aab14 | ||
|
|
452d5352d5 | ||
|
|
a4c96f5dbc | ||
|
|
2f173e9f48 | ||
|
|
83ea328ef5 | ||
|
|
72cb2c237b | ||
|
|
72ead93dee | ||
|
|
5787c26159 | ||
|
|
fe109998c9 | ||
|
|
d435858c53 | ||
|
|
fca5b186b1 | ||
|
|
5cfc5cd4f2 | ||
|
|
2be66e83a4 | ||
|
|
92c001bbc0 | ||
|
|
eece4a5ca0 | ||
|
|
be516e4c5e | ||
|
|
7ce7eff9a9 | ||
|
|
159ca00752 | ||
|
|
068905d07b | ||
|
|
ce7c9ae65b | ||
|
|
835f43524b | ||
|
|
1f0ba0db6e | ||
|
|
550cb3a1ea | ||
|
|
f55523038d | ||
|
|
a12707177b | ||
|
|
610b04fa97 | ||
|
|
065a130bc8 | ||
|
|
0c4c811434 | ||
|
|
f7b3eb5b44 | ||
|
|
a7de8dffe7 | ||
|
|
a5506b379c | ||
|
|
dd7e98129a | ||
|
|
f5c094aef1 | ||
|
|
99629e9b5f | ||
|
|
5e3a3dae10 | ||
|
|
a563014646 | ||
|
|
a696c8945e | ||
|
|
3f4e723ff7 | ||
|
|
dbee240869 | ||
|
|
c116f8b673 | ||
|
|
a95dd30f0e | ||
|
|
8d1484b562 | ||
|
|
e5c07b9a62 | ||
|
|
a46b144ab1 | ||
|
|
30dbdf71ff | ||
|
|
5ae5ab7f44 | ||
|
|
b065d72194 | ||
|
|
8fd4b6105b | ||
|
|
e08fdca129 | ||
|
|
26367a66db | ||
|
|
871c59dc31 | ||
|
|
ba08c77000 | ||
|
|
f7b0ad4b74 | ||
|
|
4798f01449 | ||
|
|
41aee40a2c | ||
|
|
4f4f4da526 | ||
|
|
562db060b7 | ||
|
|
90e164b708 | ||
|
|
1d216fde99 | ||
|
|
dcd481360f | ||
|
|
23584669c5 | ||
|
|
3821121a2e | ||
|
|
137b924b93 | ||
|
|
02da51ddf5 | ||
|
|
24c16780e2 | ||
|
|
59fc69c453 | ||
|
|
4b383b397d | ||
|
|
dc9103a72d | ||
|
|
b7f57a1952 | ||
|
|
8e6081abe0 | ||
|
|
adf7ceedf4 | ||
|
|
6a25898568 | ||
|
|
5ee2e6348f | ||
|
|
725fe76b91 | ||
|
|
089c05cbd8 | ||
|
|
8ce86fe572 | ||
|
|
5040719911 | ||
|
|
1444e0dc76 | ||
|
|
1f093da6a4 | ||
|
|
b3a5b56ff3 | ||
|
|
234e297cd9 | ||
|
|
467de8ca83 | ||
|
|
385603666b | ||
|
|
0e9946956a | ||
|
|
e2f0ae3816 | ||
|
|
a5a4c561fb | ||
|
|
426cc840d8 | ||
|
|
7eda43768a | ||
|
|
473611d51d | ||
|
|
1acca2946e | ||
|
|
d60fb1168d | ||
|
|
73887c15e0 | ||
|
|
fa5fb8fc4b | ||
|
|
d5560b97ad | ||
|
|
8c09bddeb8 | ||
|
|
1d1b25724e | ||
|
|
0baea75f5c | ||
|
|
f3330cbca4 | ||
|
|
f0f08b5ee9 | ||
|
|
b99070589a | ||
|
|
54ce2e0ab9 | ||
|
|
7c46bbc34d | ||
|
|
e07ac9bc96 | ||
|
|
26e4e29c95 | ||
|
|
84e0e50995 | ||
|
|
0957a740cb | ||
|
|
9f79bf183a | ||
|
|
768a21b587 | ||
|
|
c7413ee859 | ||
|
|
e4dcdcd158 | ||
|
|
3760ab5fc8 | ||
|
|
b80ef1df87 | ||
|
|
ab5e7496d5 | ||
|
|
460f631fa3 | ||
|
|
7663f993f7 | ||
|
|
b8b9d45706 | ||
|
|
d17c9509f6 | ||
|
|
cc7653b8c7 | ||
|
|
a6c986d516 | ||
|
|
3a42d849f5 | ||
|
|
c7fcffd09a | ||
|
|
f2e7faa478 | ||
|
|
c8bc287a29 | ||
|
|
2f74de6f02 | ||
|
|
8c1a4994cc | ||
|
|
25d7dfe990 | ||
|
|
2f2e4680d0 | ||
|
|
63f28099e3 | ||
|
|
5b0b44f24e | ||
|
|
fe5b68142e | ||
|
|
f9a24e3c0a | ||
|
|
cc5f73019e | ||
|
|
0c7adf4567 | ||
|
|
319203d5d8 | ||
|
|
aaa950faee | ||
|
|
124c1328a6 | ||
|
|
f4a41c6ed4 | ||
|
|
023971d46c | ||
|
|
2fd38eb57b | ||
|
|
7612d2aea8 | ||
|
|
90484a33e9 | ||
|
|
0dc716d426 | ||
|
|
16c1fec99d | ||
|
|
c7b7162d5f | ||
|
|
214dbe51b4 | ||
|
|
470174260c | ||
|
|
f5d2c64556 | ||
|
|
622784be89 | ||
|
|
e0e5652de4 | ||
|
|
d5aae96523 | ||
|
|
c57677c3ce | ||
|
|
de61706552 | ||
|
|
cbc9163266 | ||
|
|
442d52e878 | ||
|
|
68fa377c5e | ||
|
|
9730eaad9e | ||
|
|
963c1f31db | ||
|
|
19acc783c4 | ||
|
|
427798f7ee | ||
|
|
d6a187efed | ||
|
|
ec15dc0344 | ||
|
|
cd1bc19bf9 | ||
|
|
e0da9d1409 | ||
|
|
c29deef4e5 | ||
|
|
41dd5f15bd | ||
|
|
c1dfaf42ff | ||
|
|
e3df21cd4c | ||
|
|
d868387148 | ||
|
|
2831af6395 | ||
|
|
96efff32fe | ||
|
|
f8811eab38 | ||
|
|
5fab48a2fe | ||
|
|
494b47c692 | ||
|
|
dede3698ae | ||
|
|
732df52aef | ||
|
|
cfadf7b9dc | ||
|
|
4043522daf | ||
|
|
d364d7a810 | ||
|
|
2fc7c67031 | ||
|
|
c88dd4bbaf | ||
|
|
f1a74533f2 | ||
|
|
87df63d367 | ||
|
|
282e44e3e0 | ||
|
|
f85388578c | ||
|
|
afefa1c308 | ||
|
|
36cb168077 | ||
|
|
29cc338dac | ||
|
|
2d8798d260 | ||
|
|
c69ec94d13 | ||
|
|
2796187bdf | ||
|
|
566be8c7b1 | ||
|
|
b207387d48 | ||
|
|
7d10751037 | ||
|
|
eabba4ca20 | ||
|
|
cdb04f6172 | ||
|
|
2dde296d4f | ||
|
|
e0e41c5d7f | ||
|
|
5e22b6f564 | ||
|
|
f1d5d6e671 | ||
|
|
6c2a487f85 |
5414 changed files with 483685 additions and 42296 deletions
28
.asf.yaml
28
.asf.yaml
|
|
@ -1,10 +1,9 @@
|
|||
# Reference: https://github.com/apache/infrastructure-asfyaml.
|
||||
github:
|
||||
description: "Apache NuttX Apps is a collection of tools, shells, network utilities, libraries, interpreters and can be used with the NuttX RTOS"
|
||||
homepage: https://nuttx.apache.org/
|
||||
features:
|
||||
# Enable issues management
|
||||
issues: true
|
||||
# Enable project for project management boards
|
||||
projects: true
|
||||
labels:
|
||||
- nuttx
|
||||
|
|
@ -14,9 +13,22 @@ github:
|
|||
- mcu
|
||||
- microcontroller
|
||||
enabled_merge_buttons:
|
||||
# disable squash button:
|
||||
squash: false
|
||||
# disable merge button:
|
||||
merge: false
|
||||
# enable rebase button:
|
||||
rebase: true
|
||||
squash: false
|
||||
merge: false
|
||||
rebase: true
|
||||
protected_branches:
|
||||
master:
|
||||
required_status_checks:
|
||||
strict: false
|
||||
# Contexts cause hanging CI etc disable for now.
|
||||
# contexts:
|
||||
# - Check
|
||||
# - Lint
|
||||
# - Build
|
||||
required_pull_request_reviews:
|
||||
dismiss_stale_reviews: true
|
||||
require_last_push_approval: true
|
||||
required_approving_review_count: 2
|
||||
required_linear_history: true
|
||||
required_signatures: false
|
||||
required_conversation_resolution: true
|
||||
|
|
|
|||
16
.codespell-ignore-lines
Normal file
16
.codespell-ignore-lines
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
mynewt-nimble/nimble/host/services/ans/src/ble_svc_ans.c
|
||||
mynewt-nimble/nimble/host/services/ans/include
|
||||
#include "services/ans/ble_svc_ans.h"
|
||||
#include "crypto/controlse/ccertificate.hxx"
|
||||
* notifications for the ANS Unread Alert Status characteristic
|
||||
object = new Controlse::CCertificate(
|
||||
Controlse::CCertificate cert(se, settings->key_id);
|
||||
auto certificate = Controlse::CCertificate(
|
||||
* |---------- [-rw-r--r-- 15] afile.txt
|
||||
g_afile.name = "afile.txt";
|
||||
"*.deh", "*.hhe", "*.seh", NULL);
|
||||
MUSIC("introa"), MUSIC("runnin"), MUSIC("stalks"), MUSIC("countd"),
|
||||
MUSIC("betwee"), MUSIC("doom"), MUSIC("the_da"), MUSIC("shawn"),
|
||||
MUSIC("messag"), MUSIC("count2"), MUSIC("ddtbl3"), MUSIC("ampie"),
|
||||
MUSIC("tense"), MUSIC("shawn3"), MUSIC("openin"), MUSIC("evil"),
|
||||
/* ANS service */
|
||||
16
.codespellrc
Normal file
16
.codespellrc
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[codespell]
|
||||
|
||||
# Add complete lines to be ignored to this file.
|
||||
# Example for ignoring all current occurrences of (verifiably correct) word usage:
|
||||
# grep -hirw "emac" | sort | uniq >>.codespell-ignore-lines
|
||||
exclude-file = .codespell-ignore-lines
|
||||
|
||||
# Ignore complete files (e.g. legal text or other immutable material).
|
||||
skip =
|
||||
LICENSE,
|
||||
examples/webpanel/content/www/xterm.min.js,
|
||||
**/games/NXDoom/src/doom/d_englsh.h,
|
||||
**/games/NXDoom/src/doom/d_french.h
|
||||
|
||||
# Ignore words list (FTP protocol commands and technical terms)
|
||||
ignore-words-list = ALLO, ARCHTYPE, parm, shiftIn
|
||||
166
.github/ISSUE_TEMPLATE/001_bug_report.yml
vendored
Normal file
166
.github/ISSUE_TEMPLATE/001_bug_report.yml
vendored
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
name: Bug report
|
||||
description: Report a bug to improve NuttX stability
|
||||
title: "[BUG] <title>"
|
||||
labels: [👀 needs triage, "Type: Bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Hello NuttX Community member! Please keep things tidy by putting your post in the proper place:
|
||||
|
||||
Reporting a bug: use this form.
|
||||
Asking a question or getting help: use the [General Help](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=Community%3A+Question&projects=&template=003_help.yml&title=%5BHELP%5D+%3Ctitle%3E) form or [Mailing list](https://nuttx.apache.org/community/).
|
||||
Requesting a new feature: use the [Feature request](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=Type%3A+Enhancement&projects=&template=002_feature_request.yml&title=%5BFEATURE%5D+%3Ctitle%3E) form.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Description / Steps to reproduce the issue"
|
||||
description: "A clear and concise description of what the bug is, and why you consider it to be a bug, and steps for how to reproduce it"
|
||||
placeholder: |
|
||||
A description with steps to reproduce the issue.
|
||||
May include logs, images, or videos.
|
||||
1. Step 1
|
||||
2. Step 2
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Environment
|
||||
Please specify your environment.
|
||||
|
||||
- type: dropdown
|
||||
id: os
|
||||
attributes:
|
||||
label: On which OS does this issue occur?
|
||||
multiple: true
|
||||
options:
|
||||
- "[OS: BSD]"
|
||||
- "[OS: Linux]"
|
||||
- "[OS: Mac]"
|
||||
- "[OS: Windows]"
|
||||
- "[OS: Other]"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: os_version
|
||||
attributes:
|
||||
label: What is the version of your OS?
|
||||
description: Please fill out the distro or OS version from the previous dropdown
|
||||
placeholder: "MacOS 14, Ubuntu 23.10, Windows 10/MSYS_NT-10.0-19045, ecc"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: NuttX Version
|
||||
placeholder: "e.g., master, 12.5.1, ecc"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: architecture
|
||||
attributes:
|
||||
label: Issue Architecture
|
||||
description: What architecture(s) are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- "[Arch: all]"
|
||||
- "[Arch: arm]"
|
||||
- "[Arch: arm64]"
|
||||
- "[Arch: avr]"
|
||||
- "[Arch: ceva]"
|
||||
- "[Arch: hc]"
|
||||
- "[Arch: mips]"
|
||||
- "[Arch: misoc]"
|
||||
- "[Arch: openrisc]"
|
||||
- "[Arch: renesas]"
|
||||
- "[Arch: risc-v]"
|
||||
- "[Arch: simulator]"
|
||||
- "[Arch: sparc]"
|
||||
- "[Arch: tricore]"
|
||||
- "[Arch: x86]"
|
||||
- "[Arch: x86_64]"
|
||||
- "[Arch: xtensa]"
|
||||
- "[Arch: z16]"
|
||||
- "[Arch: z80]"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: area
|
||||
attributes:
|
||||
label: Issue Area
|
||||
description: What area(s) are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- "[Area: Audio]"
|
||||
- "[Area: Benchmarks]"
|
||||
- "[Area: Boot]"
|
||||
- "[Area: CAN]"
|
||||
- "[Area: Binfmt]"
|
||||
- "[Area: Crypto]"
|
||||
- "[Area: Database]"
|
||||
- "[Area: Examples]"
|
||||
- "[Area: File System]"
|
||||
- "[Area: Games]"
|
||||
- "[Area: Graphics]"
|
||||
- "[Area: Industry]"
|
||||
- "[Area: Inertial]"
|
||||
- "[Area: Interpreters]"
|
||||
- "[Area: Logging]"
|
||||
- "[Area: LTE]"
|
||||
- "[Area: Math]"
|
||||
- "[Area: Mlearing]"
|
||||
- "[Area: Modbus]"
|
||||
- "[Area: Networking]"
|
||||
- "[Area: NSH]"
|
||||
- "[Area: SDR]"
|
||||
- "[Area: System]"
|
||||
- "[Area: Testing]"
|
||||
- "[Area: Video]"
|
||||
- "[Area: Wireless]"
|
||||
- "[Area: Build System]"
|
||||
- "[Area: Tools]"
|
||||
- "[Area: Other]"
|
||||
- "[Area: Posix]"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Host information"
|
||||
description: "What is the output of `make host_info` command while your buggy configuration selected and if possible device connected to your system?"
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Before You Submit
|
||||
|
||||
Please verify that you've followed these steps:
|
||||
- Confirm the problem is reproducible on [**master**](https://github.com/apache/nuttx-apps) or [**latest stable**](https://nuttx.apache.org/download) release.
|
||||
- Run `make distclean` when encountering build issues.
|
||||
- Search [existing issues](https://github.com/apache/nuttx-apps/issues) (including [closed](https://github.com/apache/nuttx-apps/issues?q=is%3Aissue+is%3Aclosed))
|
||||
- Read the [FAQ](https://nuttx.apache.org/docs/latest/faq/index.html).
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: "Verification"
|
||||
options:
|
||||
- label: "I have verified before submitting the report."
|
||||
required: true
|
||||
62
.github/ISSUE_TEMPLATE/002_feature_request.yml
vendored
Normal file
62
.github/ISSUE_TEMPLATE/002_feature_request.yml
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
name: Feature request
|
||||
description: Request an enhancement for NuttX
|
||||
title: "[FEATURE] <title>"
|
||||
labels: ["Type: Enhancement"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Hello NuttX Community member! Please keep things tidy by putting your post in the proper place:
|
||||
|
||||
Requesting a new feature: use this form.
|
||||
Asking a question or getting help: use the [General Help](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=Community%3A+Question&projects=&template=003_help.yml&title=%5BHELP%5D+%3Ctitle%3E) form or [Mailing list](https://nuttx.apache.org/community/).
|
||||
Reporting a bug: use the [Bug report](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=%F0%9F%91%80+needs+triage%2CType%3A+Bug&projects=&template=001_bug_report.yml&title=%5BBUG%5D+%3Ctitle%3E) form.
|
||||
|
||||
- type: textarea
|
||||
id: question-description
|
||||
attributes:
|
||||
label: Is your feature request related to a problem? Please describe.
|
||||
description: Please provide a clear and concise description of what the problem is. Add relevant issue link.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: Describe the solution you'd like
|
||||
description: Please provide a clear and concise description of what you want to happen.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Describe alternatives you've considered
|
||||
description: Please provide a clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Before You Submit
|
||||
|
||||
Please verify that you've followed these steps:
|
||||
- Search [existing feature requests](https://github.com/apache/nuttx-apps/issues) (including [closed](https://github.com/apache/nuttx-apps/issues?q=is%3Aissue+is%3Aclosed))
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: "Verification"
|
||||
options:
|
||||
- label: "I have verified before submitting the report."
|
||||
required: true
|
||||
54
.github/ISSUE_TEMPLATE/003_help.yml
vendored
Normal file
54
.github/ISSUE_TEMPLATE/003_help.yml
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
name: General Help
|
||||
description: Get general support regarding NuttX
|
||||
title: "[HELP] <title>"
|
||||
labels: ["Community: Question"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Hello NuttX Community member! Please keep things tidy by putting your post in the proper place:
|
||||
|
||||
Asking a question or getting help: use this form or [Mailing list](https://nuttx.apache.org/community/).
|
||||
Reporting a bug: use the [Bug report](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=%F0%9F%91%80+needs+triage%2CType%3A+Bug&projects=&template=001_bug_report.yml&title=%5BBUG%5D+%3Ctitle%3E) form.
|
||||
Requesting a new feature: use the [Feature request](https://github.com/apache/nuttx-apps/issues/new?assignees=&labels=Type%3A+Enhancement&projects=&template=002_feature_request.yml&title=%5BFEATURE%5D+%3Ctitle%3E) form
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Whether you're a beginner or an experienced developer, NuttX Help is here to assist you with all your NuttX questions and concerns.
|
||||
|
||||
- type: textarea
|
||||
id: question-description
|
||||
attributes:
|
||||
label: Description
|
||||
description: Explain the background or context of your question. This helps others understand your problem or inquiry better.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### Before You Submit
|
||||
|
||||
Please verify that you've followed these steps:
|
||||
- I have searched [NuttX Documentation](https://nuttx.apache.org/docs/latest/) and didn't find an answer to my question.
|
||||
- Search [existing issues](https://github.com/apache/nuttx-apps/issues) (including [closed](https://github.com/apache/nuttx-apps/issues?q=is%3Aissue+is%3Aclosed))
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: "Verification"
|
||||
options:
|
||||
- label: "I have verified before submitting the report."
|
||||
required: true
|
||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
blank_issues_enabled: false
|
||||
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -1,6 +1,21 @@
|
|||
*Note: Please adhere to [Contributing Guidelines](https://github.com/apache/nuttx/blob/master/CONTRIBUTING.md).*
|
||||
|
||||
## Summary
|
||||
|
||||
*Update this section with information on why change is necessary,
|
||||
what it exactly does and how, if new feature shows up, provide
|
||||
references (dependencies, similar problems and solutions), etc.*
|
||||
|
||||
## Impact
|
||||
|
||||
*Update this section, where applicable, on how change affects users,
|
||||
build process, hardware, documentation, security, compatibility, etc.*
|
||||
|
||||
## Testing
|
||||
|
||||
*Update this section with details on how did you verify the change,
|
||||
what Host was used for build (OS, CPU, compiler, ..), what Target was
|
||||
used for verification (arch, board:config, ..), etc. Providing build
|
||||
and runtime logs from before and after change is highly appreciated.*
|
||||
|
||||
|
||||
|
|
|
|||
21
.github/SECURITY.md
vendored
Normal file
21
.github/SECURITY.md
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 11.0.x | :heavy_check_mark: |
|
||||
| 10.3.x | :heavy_check_mark: |
|
||||
| 10.2.x | :heavy_check_mark: |
|
||||
| 10.1.x | :heavy_check_mark: |
|
||||
| 10.0.x | :heavy_check_mark: |
|
||||
| 9.1.x | :heavy_check_mark: |
|
||||
| < 9.1 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you think you have found a possible vulnerability please reach out to the _private_ project mailing list
|
||||
private@nuttx.apache.org or the Apache Security list security@apache.org.
|
||||
|
||||
Please **DO NOT** create a GitHub issue or email the project dev list as they are public.
|
||||
This project follows the Apache Vulnerability Handling Policy documented [here](https://www.apache.org/security/committers.html#vulnerability-handling).
|
||||
6
.github/dependabot.yml
vendored
Normal file
6
.github/dependabot.yml
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
171
.github/labeler.yml
vendored
Normal file
171
.github/labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Note: NuttX PR Labeler only supports a subset of the
|
||||
# `actions/labeler` syntax: `changed-files` and
|
||||
# `any-glob-to-any-file`. See .github/workflows/labeler.yml
|
||||
|
||||
# add arch labels
|
||||
|
||||
"Area: Audio":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'audioutils/**'
|
||||
- any-glob-to-any-file: 'include/audioutils/**'
|
||||
|
||||
"Area: Benchmarks":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'benchmarks/**'
|
||||
- any-glob-to-any-file: 'include/benchmarks/**'
|
||||
|
||||
"Area: Boot":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'boot/**'
|
||||
- any-glob-to-any-file: 'include/boot/**'
|
||||
|
||||
"Area: CAN":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'canutils/**'
|
||||
- any-glob-to-any-file: 'include/canutils/**'
|
||||
|
||||
"Area: Binfmt":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'builtin/**'
|
||||
- any-glob-to-any-file: 'include/builtin/**'
|
||||
|
||||
"Area: Crypto":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'crypto/**'
|
||||
- any-glob-to-any-file: 'include/crypto/**'
|
||||
|
||||
"Area: Database":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'database/**'
|
||||
- any-glob-to-any-file: 'include/database/**'
|
||||
|
||||
"Area: Examples":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'examples/**'
|
||||
|
||||
"Area: File System":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'fsutils/**'
|
||||
- any-glob-to-any-file: 'include/fsutils/**'
|
||||
|
||||
"Area: Games":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'games/**'
|
||||
- any-glob-to-any-file: 'include/games/**'
|
||||
|
||||
"Area: Graphics":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'graphics/**'
|
||||
- any-glob-to-any-file: 'include/graphics/**'
|
||||
|
||||
"Area: Industry":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'industry/**'
|
||||
- any-glob-to-any-file: 'include/industry/**'
|
||||
|
||||
"Area: Inertial":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'inertial/**'
|
||||
- any-glob-to-any-file: 'include/inertial/**'
|
||||
|
||||
"Area: Interpreters":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'interpreters/**'
|
||||
- any-glob-to-any-file: 'include/interpreters/**'
|
||||
|
||||
"Area: Logging":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'logging/**'
|
||||
- any-glob-to-any-file: 'include/logging/**'
|
||||
|
||||
"Area: LTE":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'lte/**'
|
||||
- any-glob-to-any-file: 'include/lte/**'
|
||||
|
||||
"Area: Math":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'math/**'
|
||||
- any-glob-to-any-file: 'include/math/**'
|
||||
|
||||
"Area: Mlearning":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'mlearning/**'
|
||||
- any-glob-to-any-file: 'include/mlearning/**'
|
||||
|
||||
"Area: Modbus":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'modbus/**'
|
||||
- any-glob-to-any-file: 'include/modbus/**'
|
||||
|
||||
"Area: Networking":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'netutils/**'
|
||||
- any-glob-to-any-file: 'include/netuitls/**'
|
||||
|
||||
"Area: NSH":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'nshlib/**'
|
||||
- any-glob-to-any-file: 'include/nshlib/**'
|
||||
|
||||
"Area: SDR":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'sdr/**'
|
||||
- any-glob-to-any-file: 'include/sdr/**'
|
||||
|
||||
"Area: System":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'system/**'
|
||||
- any-glob-to-any-file: 'include/system/**'
|
||||
|
||||
"Area: Testing":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'testing/**'
|
||||
- any-glob-to-any-file: 'include/testing/**'
|
||||
|
||||
"Area: Video":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'videotuils/**'
|
||||
- any-glob-to-any-file: 'include/videotuils/**'
|
||||
|
||||
"Area: Wireless":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'wireless/**'
|
||||
- any-glob-to-any-file: 'include/wireless/**'
|
||||
|
||||
"Area: Build system":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'Makefile'
|
||||
- any-glob-to-any-file: 'Make.defs'
|
||||
- any-glob-to-any-file: '*.mk'
|
||||
- any-glob-to-any-file: 'CMakeLists.txt'
|
||||
- any-glob-to-any-file: 'cmake/**'
|
||||
- any-glob-to-any-file: 'import/**'
|
||||
- any-glob-to-any-file: 'staging/**'
|
||||
|
||||
"Area: Tools":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'tools/**'
|
||||
|
||||
"Area: CI":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: '.github/**'
|
||||
10
.github/linters/setup.cfg
vendored
Normal file
10
.github/linters/setup.cfg
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[flake8]
|
||||
ignore = W503,W605,E203,E704
|
||||
max-complexity = 27
|
||||
max-line-length = 125
|
||||
multi_line_output=3
|
||||
show-source = True
|
||||
statistics = True
|
||||
|
||||
[isort]
|
||||
profile = black
|
||||
260
.github/workflows/arch.yml
vendored
Normal file
260
.github/workflows/arch.yml
vendored
Normal file
|
|
@ -0,0 +1,260 @@
|
|||
# Identify the Arch for the PR and select the applicable builds
|
||||
name: Arch
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
os:
|
||||
description: "Operating System hosting the build: Linux, macOS or msys2"
|
||||
required: true
|
||||
type: string
|
||||
boards:
|
||||
description: "List of All Builds: [arm-01, risc-v-01, xtensa-01, ...]"
|
||||
required: true
|
||||
type: string
|
||||
outputs:
|
||||
skip_all_builds:
|
||||
description: "Set to 1 if all builds should be skipped"
|
||||
value: ${{ jobs.Select-Builds.outputs.skip_all_builds }}
|
||||
selected_builds:
|
||||
description: "Selected Builds for the PR: [arm-01, risc-v-01, xtensa-01, ...]"
|
||||
value: ${{ jobs.Select-Builds.outputs.selected_builds }}
|
||||
|
||||
jobs:
|
||||
Select-Builds:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
skip_all_builds: ${{ steps.select-builds.outputs.skip_all_builds }}
|
||||
selected_builds: ${{ steps.select-builds.outputs.selected_builds }}
|
||||
|
||||
steps:
|
||||
|
||||
# Get the Arch for the PR: arm, arm64, risc-v, xtensa, ...
|
||||
- name: Get arch
|
||||
id: get-arch
|
||||
run: |
|
||||
|
||||
# If PR is Not Created or Modified: Build all targets
|
||||
pr=${{github.event.pull_request.number}}
|
||||
if [[ "$pr" == "" ]]; then
|
||||
echo "Not a Created or Modified PR, will build all targets"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Ignore the Label "Area: Documentation", because it won't affect the Build Targets
|
||||
query='.labels | map(select(.name != "Area: Documentation")) | '
|
||||
select_name='.[].name'
|
||||
select_length='length'
|
||||
|
||||
# Get the Labels for the PR: "Arch: risc-v \n Board: risc-v \n Size: XS"
|
||||
# If GitHub CLI Fails: Build all targets
|
||||
labels=$(gh pr view $pr --repo $GITHUB_REPOSITORY --json labels --jq "$query$select_name" || echo "")
|
||||
numlabels=$(gh pr view $pr --repo $GITHUB_REPOSITORY --json labels --jq "$query$select_length" || echo "")
|
||||
echo "labels=$labels"
|
||||
echo "numlabels=$numlabels" | tee -a $GITHUB_OUTPUT
|
||||
|
||||
# Identify the Size, Arch and Board Labels
|
||||
if [[ "$labels" == *"Size: "* ]]; then
|
||||
echo 'labels_contain_size=1' | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
if [[ "$labels" == *"Arch: "* ]]; then
|
||||
echo 'labels_contain_arch=1' | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
if [[ "$labels" == *"Board: "* ]]; then
|
||||
echo 'labels_contain_board=1' | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
# Get the Arch Label
|
||||
if [[ "$labels" == *"Arch: arm64"* ]]; then
|
||||
echo 'arch_contains_arm64=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: arm"* ]]; then
|
||||
echo 'arch_contains_arm=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: risc-v"* ]]; then
|
||||
echo 'arch_contains_riscv=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: simulator"* ]]; then
|
||||
echo 'arch_contains_sim=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: x86_64"* ]]; then
|
||||
echo 'arch_contains_x86_64=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: x86"* ]]; then
|
||||
echo 'arch_contains_x86=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Arch: xtensa"* ]]; then
|
||||
echo 'arch_contains_xtensa=1' | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
# Get the Board Label
|
||||
if [[ "$labels" == *"Board: arm64"* ]]; then
|
||||
echo 'board_contains_arm64=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: arm"* ]]; then
|
||||
echo 'board_contains_arm=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: risc-v"* ]]; then
|
||||
echo 'board_contains_riscv=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: simulator"* ]]; then
|
||||
echo 'board_contains_sim=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: x86_64"* ]]; then
|
||||
echo 'board_contains_x86_64=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: x86"* ]]; then
|
||||
echo 'board_contains_x86=1' | tee -a $GITHUB_OUTPUT
|
||||
elif [[ "$labels" == *"Board: xtensa"* ]]; then
|
||||
echo 'board_contains_xtensa=1' | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Select the Builds for the PR: arm-01, risc-v-01, xtensa-01, ...
|
||||
- name: Select builds
|
||||
id: select-builds
|
||||
run: |
|
||||
|
||||
# Skip all macOS Builds
|
||||
if [[ "${{ inputs.os }}" == "macOS" ]]; then
|
||||
echo "Skipping all macOS Builds"
|
||||
echo "skip_all_builds=1" | tee -a $GITHUB_OUTPUT
|
||||
exit
|
||||
fi
|
||||
|
||||
# Fetch the outputs from the previous step
|
||||
numlabels=${{ steps.get-arch.outputs.numlabels }}
|
||||
labels_contain_size=${{ steps.get-arch.outputs.labels_contain_size }}
|
||||
labels_contain_arch=${{ steps.get-arch.outputs.labels_contain_arch }}
|
||||
labels_contain_board=${{ steps.get-arch.outputs.labels_contain_board }}
|
||||
arch_contains_arm=${{ steps.get-arch.outputs.arch_contains_arm }}
|
||||
arch_contains_arm64=${{ steps.get-arch.outputs.arch_contains_arm64 }}
|
||||
arch_contains_riscv=${{ steps.get-arch.outputs.arch_contains_riscv }}
|
||||
arch_contains_sim=${{ steps.get-arch.outputs.arch_contains_sim }}
|
||||
arch_contains_x86=${{ steps.get-arch.outputs.arch_contains_x86 }}
|
||||
arch_contains_x86_64=${{ steps.get-arch.outputs.arch_contains_x86_64 }}
|
||||
arch_contains_xtensa=${{ steps.get-arch.outputs.arch_contains_xtensa }}
|
||||
board_contains_arm=${{ steps.get-arch.outputs.board_contains_arm }}
|
||||
board_contains_arm64=${{ steps.get-arch.outputs.board_contains_arm64 }}
|
||||
board_contains_riscv=${{ steps.get-arch.outputs.board_contains_riscv }}
|
||||
board_contains_sim=${{ steps.get-arch.outputs.board_contains_sim }}
|
||||
board_contains_x86=${{ steps.get-arch.outputs.board_contains_x86 }}
|
||||
board_contains_x86_64=${{ steps.get-arch.outputs.board_contains_x86_64 }}
|
||||
board_contains_xtensa=${{ steps.get-arch.outputs.board_contains_xtensa }}
|
||||
|
||||
# inputs.boards is a JSON Array: ["arm-01", "risc-v-01", "xtensa-01", ...]
|
||||
# We compact and remove the newlines
|
||||
boards=$( echo '${{ inputs.boards }}' | jq --compact-output ".")
|
||||
numboards=$( echo "$boards" | jq "length" )
|
||||
|
||||
# We consider only Simple PRs with:
|
||||
# Arch + Size Labels Only
|
||||
# Board + Size Labels Only
|
||||
# Arch + Board + Size Labels Only
|
||||
if [[ "$labels_contain_size" != "1" ]]; then
|
||||
echo "Size Label Missing, will build all targets"
|
||||
quit=1
|
||||
elif [[ "$numlabels" == "2" && "$labels_contain_arch" == "1" ]]; then
|
||||
echo "Arch + Size Labels Only"
|
||||
elif [[ "$numlabels" == "2" && "$labels_contain_board" == "1" ]]; then
|
||||
echo "Board + Size Labels Only"
|
||||
elif [[ "$numlabels" == "3" && "$labels_contain_arch" == "1" && "$labels_contain_board" == "1" ]]; then
|
||||
# Arch and Board must be the same
|
||||
if [[
|
||||
"$arch_contains_arm" != "$board_contains_arm" ||
|
||||
"$arch_contains_arm64" != "$board_contains_arm64" ||
|
||||
"$arch_contains_riscv" != "$board_contains_riscv" ||
|
||||
"$arch_contains_sim" != "$board_contains_sim" ||
|
||||
"$arch_contains_x86" != "$board_contains_x86" ||
|
||||
"$arch_contains_x86_64" != "$board_contains_x86_64" ||
|
||||
"$arch_contains_xtensa" != "$board_contains_xtensa"
|
||||
]]; then
|
||||
echo "Arch and Board are not the same, will build all targets"
|
||||
quit=1
|
||||
else
|
||||
echo "Arch + Board + Size Labels Only"
|
||||
fi
|
||||
else
|
||||
echo "Not a Simple PR, will build all targets"
|
||||
quit=1
|
||||
fi
|
||||
|
||||
# If Not a Simple PR: Build all targets
|
||||
if [[ "$quit" == "1" ]]; then
|
||||
# If PR was Created or Modified: Include all boards
|
||||
pr=${{github.event.pull_request.number}}
|
||||
if [[ "$pr" != "" ]]; then
|
||||
echo "Include all boards"
|
||||
boards=$(
|
||||
echo '${{ inputs.boards }}' |
|
||||
jq --compact-output \
|
||||
'.'
|
||||
)
|
||||
fi
|
||||
echo "selected_builds=$boards" | tee -a $GITHUB_OUTPUT
|
||||
exit
|
||||
fi
|
||||
|
||||
# For every board
|
||||
for (( i=0; i<numboards; i++ ))
|
||||
do
|
||||
# Fetch the board
|
||||
board=$( echo "$boards" | jq ".[$i]" )
|
||||
skip_build=0
|
||||
|
||||
# For "Arch / Board: arm": Build arm-01, arm-02, ...
|
||||
if [[ "$arch_contains_arm" == "1" || "$board_contains_arm" == "1" ]]; then
|
||||
if [[ "$board" != *"arm-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: arm64": Build arm64-01
|
||||
elif [[ "$arch_contains_arm64" == "1" || "$board_contains_arm64" == "1" ]]; then
|
||||
if [[ "$board" != *"arm64-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: risc-v": Build risc-v-01, risc-v-02, ...
|
||||
elif [[ "$arch_contains_riscv" == "1" || "$board_contains_riscv" == "1" ]]; then
|
||||
if [[ "$board" != *"risc-v-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: simulator": Build sim-01, sim-02
|
||||
elif [[ "$arch_contains_sim" == "1" || "$board_contains_sim" == "1" ]]; then
|
||||
if [[ "$board" != *"sim-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: x86": Build other
|
||||
elif [[ "$arch_contains_x86" == "1" || "$board_contains_x86" == "1" ]]; then
|
||||
if [[ "$board" != *"other"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: x86_64": Build x86_64-01
|
||||
elif [[ "$arch_contains_x86_64" == "1" || "$board_contains_x86_64" == "1" ]]; then
|
||||
if [[ "$board" != *"x86_64-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For "Arch / Board: xtensa": Build xtensa-01, xtensa-02, xtensa-03
|
||||
elif [[ "$arch_contains_xtensa" == "1" || "$board_contains_xtensa" == "1" ]]; then
|
||||
if [[ "$board" != *"xtensa-"* ]]; then
|
||||
skip_build=1
|
||||
fi
|
||||
|
||||
# For Other Arch: Allow the build
|
||||
else
|
||||
echo Build by default: $board
|
||||
fi
|
||||
|
||||
# Add the board to the selected builds
|
||||
if [[ "$skip_build" == "0" ]]; then
|
||||
echo Add $board to selected_builds
|
||||
if [[ "$selected_builds" == "" ]]; then
|
||||
selected_builds=$board
|
||||
else
|
||||
selected_builds=$selected_builds,$board
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
# Return the selected builds as JSON Array
|
||||
# If Selected Builds is empty: Skip all builds
|
||||
echo "selected_builds=[$selected_builds]" | tee -a $GITHUB_OUTPUT
|
||||
if [[ "$selected_builds" == "" ]]; then
|
||||
echo "skip_all_builds=1" | tee -a $GITHUB_OUTPUT
|
||||
fi
|
||||
367
.github/workflows/build.yml
vendored
367
.github/workflows/build.yml
vendored
|
|
@ -16,15 +16,19 @@ on:
|
|||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- 'releases/*'
|
||||
tags:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: build-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
|
||||
# Fetch the source from nuttx and nuttx-apps repos
|
||||
Fetch-Source:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
|
@ -59,13 +63,13 @@ jobs:
|
|||
# Determine the repo and leave that unset to use the normal checkout behavior
|
||||
# of using the merge commit instead of HEAD
|
||||
case $GITHUB_REPOSITORY in
|
||||
"apache/incubator-nuttx")
|
||||
"apache/nuttx")
|
||||
# OS
|
||||
echo "Triggered by change in OS"
|
||||
APPS_REF=$REF_NAME
|
||||
;;
|
||||
|
||||
"apache/incubator-nuttx-apps" )
|
||||
"apache/nuttx-apps" )
|
||||
# APPS
|
||||
OS_REF=$REF_NAME
|
||||
echo "Triggered by change in APPS"
|
||||
|
|
@ -77,13 +81,13 @@ jobs:
|
|||
esac
|
||||
fi
|
||||
|
||||
echo ::set-output name=os_ref::$OS_REF
|
||||
echo ::set-output name=apps_ref::$APPS_REF
|
||||
echo "os_ref=$OS_REF" >> $GITHUB_OUTPUT
|
||||
echo "apps_ref=$APPS_REF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Checkout nuttx repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: apache/incubator-nuttx
|
||||
repository: apache/nuttx
|
||||
ref: ${{ steps.gittargets.outputs.os_ref }}
|
||||
path: sources/nuttx
|
||||
fetch-depth: 1
|
||||
|
|
@ -91,105 +95,390 @@ jobs:
|
|||
run: git -C sources/nuttx fetch --tags
|
||||
|
||||
- name: Checkout apps repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: apache/incubator-nuttx-apps
|
||||
repository: apache/nuttx-apps
|
||||
ref: ${{ steps.gittargets.outputs.apps_ref }}
|
||||
path: sources/apps
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Tar sources
|
||||
run: tar zcf sources.tar.gz sources
|
||||
|
||||
- name: Archive Source Bundle
|
||||
uses: actions/upload-artifact@v1
|
||||
uses: actions/upload-artifact@v7.0.1
|
||||
with:
|
||||
name: source-bundle
|
||||
path: sources.tar.gz
|
||||
|
||||
Linux:
|
||||
# Select the Linux Builds based on PR Arch Label
|
||||
Linux-Arch:
|
||||
uses: apache/nuttx-apps/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: Linux
|
||||
boards: |
|
||||
[
|
||||
"arm-01", "risc-v-01", "sim-01", "xtensa-01", "arm64-01", "x86_64-01", "other",
|
||||
"arm-02", "risc-v-02", "sim-02", "xtensa-02",
|
||||
"arm-03", "risc-v-03", "sim-03", "xtensa-03",
|
||||
"arm-04", "risc-v-04",
|
||||
"arm-05", "risc-v-05",
|
||||
"arm-06", "risc-v-06",
|
||||
"arm-07", "arm-08", "arm-09", "arm-10", "arm-11", "arm-12", "arm-13", "arm-14"
|
||||
]
|
||||
|
||||
# Run the selected Linux Builds
|
||||
Linux:
|
||||
needs: Linux-Arch
|
||||
if: ${{ needs.Linux-Arch.outputs.skip_all_builds != '1' }}
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
# Documented sim/login CI test credential (not a production secret).
|
||||
# Used when CONFIG_BOARD_ETC_ROMFS_PASSWD_ENABLE=y and defconfig omits
|
||||
# the password. See nuttx tools/update_romfs_password.sh.
|
||||
NUTTX_ROMFS_PASSWD_PASSWORD: NuttXSimLogin1!
|
||||
|
||||
strategy:
|
||||
max-parallel: 12
|
||||
matrix:
|
||||
boards: [arm-01, arm-02, arm-03, arm-04, arm-05, arm-06, arm-07, arm-08, arm-09, arm-10, arm-11, arm-12, arm-13, other, risc-v, sim-01, sim-02, xtensa]
|
||||
boards: ${{ fromJSON(needs.Linux-Arch.outputs.selected_builds) }}
|
||||
|
||||
steps:
|
||||
|
||||
- name: Show Disk Space
|
||||
run: df -h
|
||||
|
||||
- name: Free Disk Space (Ubuntu)
|
||||
run: |
|
||||
sudo rm -rf /usr/local/lib/android
|
||||
|
||||
- name: After CLEAN-UP Disk Space
|
||||
run: df -h
|
||||
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v1
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
run: tar zxf sources.tar.gz
|
||||
|
||||
- name: Docker Login
|
||||
uses: azure/docker-login@v1
|
||||
uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1
|
||||
with:
|
||||
login-server: ghcr.io
|
||||
username: ${GITHUB_ACTOR}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Docker Pull
|
||||
run: docker pull ghcr.io/apache/incubator-nuttx/apache-nuttx-ci-linux
|
||||
run: docker pull ghcr.io/apache/nuttx/apache-nuttx-ci-linux
|
||||
|
||||
- name: Export NuttX Repo SHA
|
||||
run: echo "nuttx_sha=`git -C sources/nuttx rev-parse HEAD`" >> $GITHUB_ENV
|
||||
|
||||
- name: Run builds
|
||||
uses: ./sources/nuttx/.github/actions/ci-container
|
||||
env:
|
||||
BLOBDIR: /tools/blobs
|
||||
NUTTX_ROMFS_PASSWD_PASSWORD: NuttXSimLogin1!
|
||||
with:
|
||||
run: |
|
||||
export NUTTX_ROMFS_PASSWD_PASSWORD=NuttXSimLogin1!
|
||||
export ARTIFACTDIR=`pwd`/buildartifacts
|
||||
|
||||
for i in 1 2 3; do
|
||||
python -m pip install \
|
||||
--default-timeout=100 \
|
||||
--retries 10 \
|
||||
ntfc==0.0.1 && break
|
||||
echo "Retry $i failed..."
|
||||
sleep 5
|
||||
done
|
||||
|
||||
mkdir /github/workspace/nuttx-ntfc
|
||||
mkdir /github/workspace/nuttx-ntfc/external
|
||||
cd /github/workspace/nuttx-ntfc
|
||||
# get NTFC test cases
|
||||
cd external
|
||||
for i in 1 2 3 4 5; do
|
||||
git clone -b release-0.0.1 https://github.com/apache/nuttx-ntfc-testing && break
|
||||
if [ "$i" -eq 5 ]; then
|
||||
echo "Failed to clone nuttx-ntfc-testing after $i attempts"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
delay=$((i * 10))
|
||||
echo "Clone attempt $i failed; retrying in ${delay}s..."
|
||||
rm -rf nuttx-ntfc-testing
|
||||
sleep "$delay"
|
||||
done
|
||||
mv nuttx-ntfc-testing nuttx-testing
|
||||
export NTFCDIR=/github/workspace/nuttx-ntfc
|
||||
|
||||
echo "::add-matcher::sources/nuttx/.github/gcc.json"
|
||||
git config --global --add safe.directory /github/workspace/sources/nuttx
|
||||
git config --global --add safe.directory /github/workspace/sources/apps
|
||||
cd /github/workspace/sources/nuttx/tools/ci
|
||||
if [ "X${{matrix.boards}}" = "Xcodechecker" ]; then
|
||||
./cibuild.sh -c -A -N -R --codechecker testlist/${{matrix.boards}}.dat
|
||||
else
|
||||
( sleep 7200 ; echo Killing pytest after timeout... ; pkill -f pytest )&
|
||||
./cibuild.sh -c -A -N -R -S testlist/${{matrix.boards}}.dat
|
||||
fi
|
||||
|
||||
- name: Post-build Disk Space
|
||||
if: always()
|
||||
run: df -h
|
||||
|
||||
- uses: actions/upload-artifact@v7.0.1
|
||||
if: ${{ always() }}
|
||||
with:
|
||||
name: linux-${{matrix.boards}}-builds
|
||||
path: buildartifacts/
|
||||
continue-on-error: true
|
||||
|
||||
# Test the out-of-tree build
|
||||
OOT-Build:
|
||||
needs: Linux
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_BUILDKIT: 1
|
||||
steps:
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
run: tar zxf sources.tar.gz
|
||||
|
||||
- name: Docker Login
|
||||
uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Export NuttX Repo SHA
|
||||
run: echo "nuttx_sha=`git -C sources/nuttx rev-parse HEAD`" >> $GITHUB_ENV
|
||||
|
||||
- name: Run Out-of-Tree Build Test
|
||||
uses: ./sources/nuttx/.github/actions/ci-container
|
||||
env:
|
||||
BLOBDIR: /tools/blobs
|
||||
with:
|
||||
run: |
|
||||
echo "::add-matcher::sources/nuttx/.github/gcc.json"
|
||||
export CCACHE_DIR=`pwd`/ccache
|
||||
mkdir $CCACHE_DIR
|
||||
export ARTIFACTDIR=`pwd`/buildartifacts
|
||||
cd sources/nuttx/tools/ci
|
||||
./cibuild.sh -A -c testlist/${{matrix.boards}}.dat
|
||||
ccache -s
|
||||
- uses: actions/upload-artifact@v2
|
||||
git config --global --add safe.directory /github/workspace/sources/nuttx
|
||||
git config --global --add safe.directory /github/workspace/sources/apps
|
||||
cd sources/nuttx
|
||||
./tools/ci/cibuild-oot.sh
|
||||
|
||||
- uses: actions/upload-artifact@v7.0.1
|
||||
if: ${{ always() }}
|
||||
with:
|
||||
name: linux-builds
|
||||
path: buildartifacts/
|
||||
name: oot-build-artifacts
|
||||
path: sources/apps/testing/cxx-oot-build
|
||||
continue-on-error: true
|
||||
|
||||
macOS:
|
||||
runs-on: macos-10.15
|
||||
# Select the macOS Builds based on PR Arch Label
|
||||
macOS-Arch:
|
||||
uses: apache/nuttx-apps/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: macOS
|
||||
boards: |
|
||||
["macos", "sim-01", "sim-02", "sim-03"]
|
||||
|
||||
# Run the selected macOS Builds
|
||||
macOS:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: macos-15-intel
|
||||
needs: macOS-Arch
|
||||
if: ${{ needs.macOS-Arch.outputs.skip_all_builds != '1' }}
|
||||
env:
|
||||
NUTTX_ROMFS_PASSWD_PASSWORD: NuttXSimLogin1!
|
||||
strategy:
|
||||
max-parallel: 2
|
||||
matrix:
|
||||
boards: [macos, sim-01, sim-02]
|
||||
boards: ${{ fromJSON(needs.macOS-Arch.outputs.selected_builds) }}
|
||||
steps:
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v1
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
run: tar zxf sources.tar.gz
|
||||
|
||||
- name: Restore Tools Cache
|
||||
id: cache-tools
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v6
|
||||
env:
|
||||
cache-name: ${{ runner.os }}-cache-tools
|
||||
with:
|
||||
path: prebuilt
|
||||
key: ${{ runner.os }}-tools-${{ hashFiles('./sources/nuttx/tools/ci/cibuild.sh') }}
|
||||
path: ./sources/tools
|
||||
key: ${{ runner.os }}-tools-${{ hashFiles('./sources/nuttx/tools/ci/platforms/darwin.sh') }}
|
||||
|
||||
- name: Export NuttX Repo SHA
|
||||
run: echo "nuttx_sha=`git -C sources/nuttx rev-parse HEAD`" >> $GITHUB_ENV
|
||||
|
||||
# Released version of Cython has issues with Python 11. Set runner to use Python 3.10
|
||||
# https://github.com/cython/cython/issues/4500
|
||||
- uses: actions/setup-python@v7
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Run Builds
|
||||
run: |
|
||||
echo "::add-matcher::sources/nuttx/.github/gcc.json"
|
||||
export CCACHE_DIR=`pwd`/ccache
|
||||
mkdir $CCACHE_DIR
|
||||
export NUTTX_ROMFS_PASSWD_PASSWORD=NuttXSimLogin1!
|
||||
export ARTIFACTDIR=`pwd`/buildartifacts
|
||||
cd sources/nuttx/tools/ci
|
||||
./cibuild.sh -i -A -c testlist/${{matrix.boards}}.dat
|
||||
ccache -s
|
||||
- uses: actions/upload-artifact@v2
|
||||
./cibuild.sh -i -c -A -R testlist/${{matrix.boards}}.dat
|
||||
|
||||
- uses: actions/upload-artifact@v7.0.1
|
||||
with:
|
||||
name: macos-builds
|
||||
name: macos-${{matrix.boards}}-builds
|
||||
path: buildartifacts/
|
||||
continue-on-error: true
|
||||
|
||||
# Select the msys2 Builds based on PR Arch Label
|
||||
msys2-Arch:
|
||||
uses: apache/nuttx-apps/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: msys2
|
||||
boards: |
|
||||
["msys2"]
|
||||
|
||||
# Run the selected msys2 Builds
|
||||
msys2:
|
||||
needs: msys2-Arch
|
||||
if: ${{ needs.msys2-Arch.outputs.skip_all_builds != '1' }}
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
max-parallel: 1
|
||||
matrix:
|
||||
boards: ${{ fromJSON(needs.msys2-Arch.outputs.selected_builds) }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
- uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: MSYS
|
||||
update: false
|
||||
cache: false
|
||||
install: >-
|
||||
base-devel
|
||||
gcc
|
||||
gperf
|
||||
automake
|
||||
autoconf
|
||||
git
|
||||
python3
|
||||
ncurses-devel
|
||||
unzip
|
||||
zip
|
||||
tio
|
||||
zlib-devel
|
||||
cmake
|
||||
ninja
|
||||
python-pip
|
||||
vim
|
||||
genromfs
|
||||
|
||||
- name: pip3 install
|
||||
run: |
|
||||
python3 -m venv --system-site-packages /usr/local
|
||||
pip3 install --root-user-action=ignore --no-cache-dir pyelftools cxxfilt kconfiglib
|
||||
|
||||
- run: git config --global core.autocrlf false
|
||||
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
run: tar zxf sources.tar.gz
|
||||
|
||||
- name: Export NuttX Repo SHA
|
||||
run: echo "nuttx_sha=`git -C sources/nuttx rev-parse HEAD`" >> $GITHUB_ENV
|
||||
|
||||
- name: Run Builds
|
||||
run: |
|
||||
echo "::add-matcher::sources/nuttx/.github/gcc.json"
|
||||
export ARTIFACTDIR=`pwd`/buildartifacts
|
||||
git config --global --add safe.directory /github/workspace/sources/nuttx
|
||||
git config --global --add safe.directory /github/workspace/sources/apps
|
||||
cd sources/nuttx/tools/ci
|
||||
./cibuild.sh -g -i -A -C -N -R testlist/${{matrix.boards}}.dat
|
||||
|
||||
- uses: actions/upload-artifact@v7.0.1
|
||||
with:
|
||||
name: msys2-${{matrix.boards}}-builds
|
||||
path: buildartifacts/
|
||||
continue-on-error: true
|
||||
|
||||
# Select the msvc Builds based on PR Arch Label
|
||||
msvc-Arch:
|
||||
uses: apache/nuttx-apps/.github/workflows/arch.yml@master
|
||||
needs: Fetch-Source
|
||||
with:
|
||||
os: msvc
|
||||
boards: |
|
||||
["msvc_placeholder_with_sim_keyword"]
|
||||
|
||||
# Build with MSVC in Windows native
|
||||
msvc:
|
||||
needs: msvc-Arch
|
||||
if: ${{ needs.msvc-Arch.outputs.skip_all_builds != '1' }}
|
||||
runs-on: windows-2022
|
||||
steps:
|
||||
- uses: actions/checkout@v7
|
||||
# Set up Python environment and install kconfiglib
|
||||
- name: Set up Python and install kconfiglib
|
||||
uses: actions/setup-python@v7
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Install kconfiglib
|
||||
run: |
|
||||
pip install kconfiglib
|
||||
|
||||
- run: git config --global core.autocrlf false
|
||||
|
||||
- name: Download Source Artifact
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: source-bundle
|
||||
path: .
|
||||
|
||||
- name: Extract sources
|
||||
run: |
|
||||
7z x sources.tar.gz -y
|
||||
7z x sources.tar -y -snld
|
||||
|
||||
- name: Run Builds
|
||||
run: |
|
||||
"ARTIFACTDIR=${{github.workspace}}\sources\buildartifacts" >> $env:GITHUB_ENV
|
||||
git config --global --add safe.directory ${{github.workspace}}\sources\nuttx
|
||||
git config --global --add safe.directory ${{github.workspace}}\sources\apps
|
||||
cd sources\nuttx\tools\ci
|
||||
.\cibuild.ps1 -n -i -A -C -N testlist\windows.dat
|
||||
|
||||
- uses: actions/upload-artifact@v7.0.1
|
||||
with:
|
||||
name: msvc-builds
|
||||
path: ./sources/buildartifacts/
|
||||
continue-on-error: true
|
||||
|
|
|
|||
20
.github/workflows/check.yml
vendored
20
.github/workflows/check.yml
vendored
|
|
@ -19,30 +19,36 @@ concurrency:
|
|||
group: check-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout nuttx repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: apache/incubator-nuttx
|
||||
repository: apache/nuttx
|
||||
path: nuttx
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout apps repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
repository: apache/incubator-nuttx-apps
|
||||
repository: apache/nuttx-apps
|
||||
path: apps
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check Pull Request
|
||||
run: |
|
||||
echo "::add-matcher::nuttx/.github/nxstyle.json"
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
pip install codespell cmake-format black isort flake8 cvt2utf
|
||||
cd apps
|
||||
commits="${{ github.event.pull_request.base.sha }}..HEAD"
|
||||
git log --oneline $commits
|
||||
echo "../nuttx/tools/checkpatch.sh -g $commits"
|
||||
../nuttx/tools/checkpatch.sh -g $commits
|
||||
echo "../nuttx/tools/checkpatch.sh -c -u -m -g $commits"
|
||||
../nuttx/tools/checkpatch.sh -c -u -m -g $commits
|
||||
|
|
|
|||
53
.github/workflows/issue_labeler.yml
vendored
Normal file
53
.github/workflows/issue_labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
name: Issue Labeler
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Add labels issues automatically based on their body.
|
||||
uses: actions/github-script@v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const body = context.payload.issue.body;
|
||||
const bodySplit = body.split(/\[|\]/).map(e => e.toLowerCase());
|
||||
const oskeywords = ['os: other', 'os: bsd', 'os: linux', 'os: mac', 'os: windows'];
|
||||
const archkeywords1 = ['arch: all', 'arch: arm', 'arch: arm64', 'arch: avr', 'arch: ceva'];
|
||||
const archkeywords2 = ['arch: hc', 'arch: mips', 'arch: misoc', 'arch: openrisc', 'arch:renesas'];
|
||||
const archkeywords3 = ['arch: risc-v', 'arch: simulator', 'arch: sparc', 'arch: tricore'];
|
||||
const archkeywords4 = ['arch: x86', 'arch: x86_64', 'arch: xtensa', 'arch: z16', 'arch: z80', 'arch:renesas'];
|
||||
const areakeywords1 = ['area: applications', 'area: api', 'area: board support', 'area: build system'];
|
||||
const areakeywords2 = ['area: configuring', 'area: debugging', 'area: drivers', 'area: file system', 'area: installing', 'area: kconfig'];
|
||||
const areakeywords3 = ['area: kernel', 'area: memory management', 'area: native port', 'area: networking'];
|
||||
const areakeywords4 = ['area: os components', 'area: posix', 'area: sensors', 'area: specific peripheral'];
|
||||
var keywordsfound = new Set();
|
||||
for (const keyword of keywords) {
|
||||
if (bodySplit.includes(keyword)) {
|
||||
keywordsfound.add(keyword)
|
||||
}
|
||||
}
|
||||
if (keywordsfound.size !== 0) {
|
||||
github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels: Array.from(keywordsfound)
|
||||
})
|
||||
}
|
||||
150
.github/workflows/labeler.yml
vendored
Normal file
150
.github/workflows/labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# This workflow will fetch the updated PR filenames, compute the Size Label
|
||||
# and Arch Labels, then save the PR Labels into a PR Artifact. The
|
||||
# PR Labels will be written to the PR inside the "workflow_run" trigger
|
||||
# (pr_labeler.yml), because this "pull_request" trigger has read-only
|
||||
# permission. Don't use "pull_request_target", it's unsafe.
|
||||
# See https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=321719166#GitHubActionsSecurity-Buildstriggeredwithpull_request_target
|
||||
name: "Pull Request Labeler"
|
||||
on:
|
||||
- pull_request
|
||||
|
||||
jobs:
|
||||
labeler:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
issues: read
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Checkout one file from our trusted source: .github/labeler.yml
|
||||
# Never checkout and execute any untrusted code from the PR.
|
||||
- name: Checkout labeler config
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
repository: apache/nuttx-apps
|
||||
ref: master
|
||||
path: labeler
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
sparse-checkout: .github/labeler.yml
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
# Fetch the updated PR filenames. Compute the Size Label and Arch Labels.
|
||||
- name: Compute PR labels
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
const pull_number = context.issue.number;
|
||||
|
||||
// Fetch the array of updated PR filenames:
|
||||
// { status: 'added', filename: 'arch/arm/test.txt', additions: 3, deletions: 0, changes: 3 }
|
||||
// { status: 'removed', filename: 'Documentation/legacy_README.md', additions: 0, deletions: 2531, changes: 2531 }
|
||||
// { status: 'modified', filename: 'Documentation/security.rst', additions: 1, deletions: 0, changes: 1 }
|
||||
const listFilesOptions = github.rest.pulls.listFiles
|
||||
.endpoint.merge({ owner, repo, pull_number });
|
||||
const listFilesResponse = await github.paginate(listFilesOptions);
|
||||
|
||||
// Sum up the number of lines changed
|
||||
const sizeFiles = listFilesResponse
|
||||
.filter(f => (f.status != 'removed')); // Ignore deleted files
|
||||
var linesChanged = 0;
|
||||
for (const file of sizeFiles) {
|
||||
linesChanged += file.changes;
|
||||
}
|
||||
console.log({ linesChanged });
|
||||
|
||||
// Compute the Size Label
|
||||
const sizeLabel =
|
||||
(linesChanged <= 10) ? 'Size: XS'
|
||||
: (linesChanged <= 100) ? 'Size: S'
|
||||
: (linesChanged <= 500) ? 'Size: M'
|
||||
: (linesChanged <= 1000) ? 'Size: L'
|
||||
: 'Size: XL';
|
||||
var prLabels = [ sizeLabel ];
|
||||
|
||||
// Parse the Arch Label Patterns in .github/labeler.yml. Condense into:
|
||||
// "Arch: arm":
|
||||
// - any-glob-to-any-file: 'arch/arm/**'
|
||||
// - any-glob-to-any-file: ...
|
||||
const fs = require('fs');
|
||||
const config = fs.readFileSync('labeler/.github/labeler.yml', 'utf8')
|
||||
.split('\n') // Split by newline
|
||||
.map(s => s.trim()) // Remove leading and trailing spaces
|
||||
.filter(s => (s != '')) // Remove empty lines
|
||||
.filter(s => !s.startsWith('#')) // Remove comments
|
||||
.filter(s => !s.startsWith('- changed-files:')); // Remove "changed-files"
|
||||
|
||||
// Convert the Arch Label Patterns from config to archLabels.
|
||||
// archLabels will contain the mappings for Arch Label and Filename Pattern:
|
||||
// { label: "Arch: arm", pattern: "arch/arm/.*" },
|
||||
// { label: "Arch: arm64", pattern: "arch/arm64/.*" }, ...
|
||||
var archLabels = [];
|
||||
var label = "";
|
||||
for (const c of config) {
|
||||
// Get the Arch Label
|
||||
if (c.startsWith('"')) { // "Arch: arm":
|
||||
label = c.split('"')[1]; // Arch: arm
|
||||
|
||||
} else if (c.startsWith('- any-glob-to-any-file:')) { // - any-glob-to-any-file: 'arch/arm/**'
|
||||
// Convert the Glob Pattern to Regex Pattern
|
||||
const pattern = c.split("'")[1] // arch/arm/**
|
||||
.split('.').join('\\.') // . becomes \.
|
||||
.split('*').join('[^/]*') // * becomes [^/]*
|
||||
.split('[^/]*[^/]*').join('.*'); // ** becomes .*
|
||||
archLabels.push({
|
||||
label, // Arch: arm
|
||||
pattern: '^' + pattern + '$' // Match the Line Start and Line End
|
||||
});
|
||||
|
||||
} else {
|
||||
// We don't support all rules of `actions/labeler`
|
||||
throw new Error('.github/labeler.yml should contain only changed-files and any-glob-to-any-file, not: ' + c);
|
||||
}
|
||||
}
|
||||
|
||||
// Search the filenames for matching Arch Labels
|
||||
for (const archLabel of archLabels) {
|
||||
if (prLabels.includes(archLabel.label)) {
|
||||
break;
|
||||
}
|
||||
for (const file of listFilesResponse) {
|
||||
const re = new RegExp(archLabel.pattern);
|
||||
const match = re.test(file.filename);
|
||||
if (match && !prLabels.includes(archLabel.label)) {
|
||||
prLabels.push(archLabel.label);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log({ prLabels });
|
||||
|
||||
// Save the PR Number and PR Labels into a PR Artifact
|
||||
// e.g. 'Size: XS\nArch: avr\n'
|
||||
const dir = 'pr';
|
||||
fs.mkdirSync(dir);
|
||||
fs.writeFileSync(dir + '/pr-id.txt', pull_number + '\n');
|
||||
fs.writeFileSync(dir + '/pr-labels.txt', prLabels.join('\n') + '\n');
|
||||
|
||||
# Upload the PR Artifact as pr.zip
|
||||
- name: Upload PR artifact
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: pr
|
||||
path: pr/
|
||||
29
.github/workflows/lint.yml
vendored
29
.github/workflows/lint.yml
vendored
|
|
@ -1,4 +1,4 @@
|
|||
name: ❄️ Lint
|
||||
name: Lint
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
|
|
@ -6,14 +6,29 @@ concurrency:
|
|||
group: lint-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
yamllint:
|
||||
name: 🍺 YAML
|
||||
lint:
|
||||
permissions:
|
||||
contents: read # for actions/checkout to fetch code
|
||||
statuses: write # for github/super-linter to mark status of each linter run
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: 🧹 YAML Lint
|
||||
uses: github/super-linter@v4
|
||||
- uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- run: mkdir super-linter.report
|
||||
- name: Lint
|
||||
uses: github/super-linter@v7
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
VALIDATE_ALL_CODEBASE: false
|
||||
VALIDATE_PYTHON_BLACK: true
|
||||
VALIDATE_PYTHON_FLAKE8: true
|
||||
PYTHON_FLAKE8_CONFIG_FILE: setup.cfg
|
||||
VALIDATE_PYTHON_ISORT: true
|
||||
PYTHON_ISORT_CONFIG_FILE: setup.cfg
|
||||
VALIDATE_YAML: true
|
||||
FILTER_REGEX_INCLUDE: .*\.github/.*
|
||||
|
|
|
|||
90
.github/workflows/pr_labeler.yml
vendored
Normal file
90
.github/workflows/pr_labeler.yml
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# This workflow will fetch the PR Labels from the PR Artifact, and write
|
||||
# the PR Labels into the PR. The workflow is called after the
|
||||
# "pull_request" trigger (labeler.yml). This "workflow_run" trigger uses a
|
||||
# GitHub Token with Write Permission, so we must never run any untrusted
|
||||
# code from the PR, and we must always extract and use the PR Artifact
|
||||
# safely. See https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=321719166#GitHubActionsSecurity-Buildstriggeredwithworkflow_run
|
||||
name: "Set Pull Request Labels"
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Pull Request Labeler"]
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
pr_labeler:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
issues: write
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
github.event.workflow_run.event == 'pull_request' &&
|
||||
github.event.workflow_run.conclusion == 'success'
|
||||
steps:
|
||||
# Download the PR Artifact, containing PR Number and PR Labels
|
||||
- name: Download PR artifact
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: ${{ github.event.workflow_run.id }},
|
||||
});
|
||||
const matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "pr"
|
||||
})[0];
|
||||
const download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
const fs = require('fs');
|
||||
fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data));
|
||||
|
||||
# Unzip the PR Artifact
|
||||
- name: Unzip PR artifact
|
||||
run: unzip pr.zip
|
||||
|
||||
# Write the PR Labels into the PR
|
||||
- name: Write PR labels
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const owner = context.repo.owner;
|
||||
const repo = context.repo.repo;
|
||||
const fs = require('fs');
|
||||
|
||||
// Read the PR Number and PR Labels from the PR Artifact
|
||||
// e.g. 'Size: XS\nArch: avr\n'
|
||||
const issue_number = Number(fs.readFileSync('pr-id.txt'));
|
||||
const labels = fs.readFileSync('pr-labels.txt', 'utf8')
|
||||
.split('\n') // Split by newline
|
||||
.filter(s => (s != '')); // Remove empty lines
|
||||
console.log({ issue_number, labels });
|
||||
|
||||
// Write the PR Labels into the PR
|
||||
// e.g. [ 'Size: XS', 'Arch: avr' ]
|
||||
await github.rest.issues.setLabels({
|
||||
owner,
|
||||
repo,
|
||||
issue_number,
|
||||
labels
|
||||
});
|
||||
23
.gitignore
vendored
23
.gitignore
vendored
|
|
@ -1,30 +1,51 @@
|
|||
*.a
|
||||
*.dbo
|
||||
*.dba
|
||||
*.adb
|
||||
*.asm
|
||||
*.d
|
||||
*.dSYM
|
||||
*.exe
|
||||
*.gcno
|
||||
*.gcda
|
||||
*.hobj
|
||||
*.i
|
||||
*.inf
|
||||
*.lib
|
||||
*.lst
|
||||
*.o
|
||||
*.wo
|
||||
*.obj
|
||||
*.rel
|
||||
*.src
|
||||
*.swp
|
||||
*.sym
|
||||
*.su
|
||||
*.map
|
||||
*~
|
||||
.built
|
||||
.context
|
||||
.depend
|
||||
.kconfig
|
||||
*.lock
|
||||
/bin
|
||||
/bin_debug
|
||||
/boot_romfsimg.h
|
||||
/external
|
||||
/Kconfig
|
||||
/romfs.img
|
||||
/staging
|
||||
/symtab_apps.c
|
||||
/wasm
|
||||
cscope.out
|
||||
Make.dep
|
||||
.context
|
||||
# nuttx/$(TOPDIR)/Makefile.[unix|win]::$(DIRLINKS_EXTERNAL_DIRS)
|
||||
.dirlinks
|
||||
.vscode
|
||||
.DS_Store
|
||||
build
|
||||
.ccls-cache
|
||||
compile_commands.json
|
||||
.aider*
|
||||
.clang-format
|
||||
.cache
|
||||
|
|
|
|||
382
Application.mk
382
Application.mk
|
|
@ -1,6 +1,8 @@
|
|||
############################################################################
|
||||
# apps/Application.mk
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
|
|
@ -23,12 +25,18 @@
|
|||
# has the value "m"
|
||||
|
||||
ifneq ($(MAINSRC),)
|
||||
ifeq ($(MODULE),m)
|
||||
BUILD_MODULE = y
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BUILD_KERNEL),y)
|
||||
ifeq ($(DYNLIB),y)
|
||||
BUILD_MODULE = y
|
||||
MODAELFFLAGS = $(CMODULELFFLAGS)
|
||||
MODCFLAGS = $(CMODULEFLAGS)
|
||||
MODCXXFLAGS = $(CXXMODULEFLAGS)
|
||||
MODLDFLAGS = $(LDMODULEFLAGS)
|
||||
else ifneq ($(or $(filter y,$(CONFIG_BUILD_KERNEL)), $(filter m,$(MODULE))),)
|
||||
BUILD_MODULE = y
|
||||
MODAELFFLAGS = $(AELFFLAGS)
|
||||
MODCFLAGS = $(CELFFLAGS)
|
||||
MODCXXFLAGS = $(CXXELFFLAGS)
|
||||
MODLDFLAGS = $(LDELFFLAGS)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
@ -37,16 +45,18 @@ endif
|
|||
# we need to fix up the path so the DELIM will match the actual delimiter.
|
||||
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
CWD = $(strip ${shell echo %CD% | cut -d: -f2})
|
||||
CWD = $(strip ${shell echo %CD% | cut -d: -f2})
|
||||
else
|
||||
CWD = $(CURDIR)
|
||||
CWD = $(CURDIR)
|
||||
endif
|
||||
|
||||
# Add the static application library to the linked libraries. Don't do this
|
||||
# with CONFIG_BUILD_KERNEL as there is no static app library
|
||||
ifneq ($(CONFIG_BUILD_KERNEL),y)
|
||||
LDLIBS += $(call CONVERT_PATH,$(BIN))
|
||||
endif
|
||||
SUFFIX ?= $(subst $(DELIM),.,$(CWD))
|
||||
|
||||
PROGNAME := $(subst ",,$(PROGNAME))
|
||||
|
||||
# Add the static application library to the linked libraries.
|
||||
|
||||
LDLIBS += $(call CONVERT_PATH,$(BIN))
|
||||
|
||||
# When building a module, link with the compiler runtime.
|
||||
# This should be linked after libapps. Consider that mbedtls in libapps
|
||||
|
|
@ -55,39 +65,125 @@ ifeq ($(BUILD_MODULE),y)
|
|||
# Revisit: This only works for gcc and clang.
|
||||
# Do other compilers have similar?
|
||||
COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
|
||||
ifneq ($(COMPILER_RT_LIB),)
|
||||
LDLIBS += $(COMPILER_RT_LIB)
|
||||
ifeq ($(wildcard $(COMPILER_RT_LIB)),)
|
||||
# if "--print-libgcc-file-name" unable to find the correct libgcc PATH
|
||||
# then go ahead and try "--print-file-name"
|
||||
COMPILER_RT_LIB := $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name $(notdir $(COMPILER_RT_LIB))))
|
||||
endif
|
||||
LDLIBS += $(COMPILER_RT_LIB)
|
||||
endif
|
||||
|
||||
SUFFIX = $(subst $(DELIM),.,$(CWD))
|
||||
PROGNAME := $(shell echo $(PROGNAME))
|
||||
# Apps compilation can achieve out-of-tree intermediate products
|
||||
# by specifying "PREFIX" to a directory in its own Makefile.
|
||||
# Default value is NULL,
|
||||
# Make sure the out-of-tree directory exists and ends with $(DELIM) when setting it.
|
||||
|
||||
PREFIX ?=
|
||||
|
||||
# Object files
|
||||
|
||||
RASRCS = $(filter %.s,$(ASRCS))
|
||||
CASRCS = $(filter %.S,$(ASRCS))
|
||||
|
||||
RAOBJS = $(RASRCS:=$(SUFFIX)$(OBJEXT))
|
||||
CAOBJS = $(CASRCS:=$(SUFFIX)$(OBJEXT))
|
||||
COBJS = $(CSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
CXXOBJS = $(CXXSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
RUSTOBJS = $(RUSTSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
RAOBJS = $(RASRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
CAOBJS = $(CASRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
COBJS = $(CSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
CXXOBJS = $(CXXSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
RUSTOBJS = $(RUSTSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
ZIGOBJS = $(ZIGSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
DOBJS = $(DSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
SWIFTOBJS = $(SWIFTSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
|
||||
MAINCXXSRCS = $(filter %$(CXXEXT),$(MAINSRC))
|
||||
MAINCSRCS = $(filter %.c,$(MAINSRC))
|
||||
MAINRUSTSRCS = $(filter %$(RUSTEXT),$(MAINSRC))
|
||||
MAINCXXOBJ = $(MAINCXXSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
MAINCOBJ = $(MAINCSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
MAINRUSTOBJ = $(MAINRUSTSRCS:=$(SUFFIX)$(OBJEXT))
|
||||
MAINZIGSRCS = $(filter %$(ZIGEXT),$(MAINSRC))
|
||||
MAINDSRCS = $(filter %$(DEXT),$(MAINSRC))
|
||||
MAINSWIFTSRCS = $(filter %$(SWIFTEXT),$(MAINSRC))
|
||||
MAINCXXOBJ = $(MAINCXXSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
MAINCOBJ = $(MAINCSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
MAINRUSTOBJ = $(MAINRUSTSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
MAINZIGOBJ = $(MAINZIGSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
MAINDOBJ = $(MAINDSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
MAINSWIFTOBJ = $(MAINSWIFTSRCS:%=$(PREFIX)%$(SUFFIX)$(OBJEXT))
|
||||
|
||||
SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) $(MAINSRC)
|
||||
OBJS = $(RAOBJS) $(CAOBJS) $(COBJS) $(CXXOBJS) $(RUSTOBJS)
|
||||
OBJS = $(RAOBJS) $(CAOBJS) $(COBJS) $(CXXOBJS) $(RUSTOBJS) $(ZIGOBJS) $(DOBJS) $(SWIFTOBJS) $(EXTOBJS)
|
||||
|
||||
ifneq ($(BUILD_MODULE),y)
|
||||
OBJS += $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ)
|
||||
OBJS += $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) $(MAINZIGOBJ) $(MAINDOBJ) $(MAINSWIFTOBJ)
|
||||
endif
|
||||
|
||||
ifneq ($(strip $(PROGNAME)),)
|
||||
PROGOBJ := $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) $(MAINZIGOBJ) $(MAINDOBJ) $(MAINSWIFTOBJ)
|
||||
PROGLIST := $(addprefix $(BINDIR)$(DELIM),$(PROGNAME))
|
||||
REGLIST := $(addprefix $(BUILTIN_REGISTRY)$(DELIM),$(addsuffix .bdat,$(PROGNAME)))
|
||||
|
||||
NLIST := $(shell seq 1 $(words $(PROGNAME)))
|
||||
$(foreach i, $(NLIST), \
|
||||
$(eval PROGNAME_$(word $i,$(PROGOBJ)) := $(word $i,$(PROGNAME))) \
|
||||
$(eval PROGSYM_$(word $i,$(PROGOBJ)) := $(subst -,_,$(word $i,$(PROGNAME)))) \
|
||||
$(eval PROGOBJ_$(word $i,$(PROGLIST)) := $(word $i,$(PROGOBJ))) \
|
||||
$(eval PRIORITY_$(word $i,$(REGLIST)) := \
|
||||
$(if $(word $i,$(PRIORITY)),$(word $i,$(PRIORITY)),$(lastword $(PRIORITY)))) \
|
||||
$(eval STACKSIZE_$(word $i,$(REGLIST)) := \
|
||||
$(if $(word $i,$(STACKSIZE)),$(word $i,$(STACKSIZE)),$(lastword $(STACKSIZE)))) \
|
||||
$(eval UID_$(word $i,$(REGLIST)) := \
|
||||
$(if $(word $i,$(UID)),$(word $i,$(UID)),$(lastword $(UID)))) \
|
||||
$(eval GID_$(word $i,$(REGLIST)) := \
|
||||
$(if $(word $i,$(GID)),$(word $i,$(GID)),$(lastword $(GID)))) \
|
||||
$(eval MODE_$(word $i,$(REGLIST)) := \
|
||||
$(if $(word $i,$(MODE)),$(word $i,$(MODE)),$(lastword $(MODE)))) \
|
||||
$(eval STACKSIZE_$(word $i,$(PROGLIST)) := $(STACKSIZE_$(word $i,$(REGLIST)))) \
|
||||
$(eval PRIORITY_$(word $i,$(PROGLIST)) := $(PRIORITY_$(word $i,$(REGLIST)))) \
|
||||
$(eval UID_$(word $i,$(PROGLIST)) := $(UID_$(word $i,$(REGLIST)))) \
|
||||
$(eval GID_$(word $i,$(PROGLIST)) := $(GID_$(word $i,$(REGLIST)))) \
|
||||
$(eval MODE_$(word $i,$(PROGLIST)) := $(MODE_$(word $i,$(REGLIST)))) \
|
||||
)
|
||||
|
||||
# Emit the application's configured attributes as absolute ELF symbols
|
||||
# (nx_stacksize, nx_priority, and nx_uid/nx_gid/nx_mode under
|
||||
# CONFIG_SCHED_USER_IDENTITY) so the binary loader can recover them.
|
||||
# Per-target so each PROGLIST entry picks up its own STACKSIZE_/PRIORITY_.
|
||||
|
||||
$(PROGLIST): MODLDFLAGS += \
|
||||
$(if $(STACKSIZE_$@),--defsym nx_stacksize=$(STACKSIZE_$@)) \
|
||||
$(if $(filter-out SCHED_PRIORITY_DEFAULT,$(PRIORITY_$@)),--defsym nx_priority=$(PRIORITY_$@))
|
||||
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
|
||||
$(PROGLIST): MODLDFLAGS += \
|
||||
$(if $(UID_$@),--defsym nx_uid=$(UID_$@)) \
|
||||
$(if $(GID_$@),--defsym nx_gid=$(GID_$@)) \
|
||||
$(if $(MODE_$@),--defsym nx_mode=$(MODE_$@))
|
||||
endif
|
||||
|
||||
# Keep the attribute symbols through --strip-unneeded so the binary loader
|
||||
# can still read them from the stripped runtime image in bin/.
|
||||
$(PROGLIST): NX_KEEP = $(if $(STACKSIZE_$@),-K nx_stacksize) $(if $(filter-out SCHED_PRIORITY_DEFAULT,$(PRIORITY_$@)),-K nx_priority) $(if $(UID_$@),-K nx_uid) $(if $(GID_$@),-K nx_gid) $(if $(MODE_$@),-K nx_mode)
|
||||
endif
|
||||
|
||||
# Condition flags
|
||||
|
||||
DO_REGISTRATION ?= y
|
||||
|
||||
ifeq ($(PROGNAME),)
|
||||
DO_REGISTRATION = n
|
||||
endif
|
||||
|
||||
ifeq ($(WASM_BUILD),y)
|
||||
DO_REGISTRATION = n
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_MODULE),y)
|
||||
DO_REGISTRATION = n
|
||||
endif
|
||||
|
||||
# Compile flags, notice the default flags only suitable for flat build
|
||||
|
||||
ZIGELFFLAGS ?= $(ZIGFLAGS)
|
||||
RUSTELFFLAGS ?= $(RUSTFLAGS)
|
||||
DELFFLAGS ?= $(DFLAGS)
|
||||
SWIFTELFFLAGS ?= $(SWIFTFLAGS)
|
||||
|
||||
DEPPATH += --dep-path .
|
||||
DEPPATH += --obj-path .
|
||||
|
||||
|
|
@ -95,141 +191,239 @@ VPATH += :.
|
|||
|
||||
# Targets follow
|
||||
|
||||
all:: $(OBJS)
|
||||
all:: $(PREFIX).built
|
||||
@:
|
||||
.PHONY: clean depend distclean
|
||||
.PRECIOUS: $(BIN)
|
||||
|
||||
define ELFASSEMBLE
|
||||
@echo "AS: $1"
|
||||
$(Q) $(CC) -c $(AELFFLAGS) $($(strip $1)_AELFFLAGS) $1 -o $2
|
||||
$(ECHO_BEGIN)"AS: $1 "
|
||||
$(Q) $(MODULECC) -c $(MODAELFFLAGS) $($(strip $1)_AELFFLAGS) $1 -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFCOMPILE
|
||||
@echo "CC: $1"
|
||||
$(Q) $(CC) -c $(CELFFLAGS) $($(strip $1)_CELFFLAGS) $1 -o $2
|
||||
$(ECHO_BEGIN)"CC: $1 "
|
||||
$(Q) $(MODULECC) -c $(MODCFLAGS) $($(strip $1)_CELFFLAGS) $1 -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFCOMPILEXX
|
||||
@echo "CXX: $1"
|
||||
$(Q) $(CXX) -c $(CXXELFFLAGS) $($(strip $1)_CXXELFFLAGS) $1 -o $2
|
||||
$(ECHO_BEGIN)"CXX: $1 "
|
||||
$(Q) $(CXX) -c $(MODCXXFLAGS) $($(strip $1)_CXXELFFLAGS) $1 -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFCOMPILERUST
|
||||
@echo "RUSTC: $1"
|
||||
$(ECHO_BEGIN)"RUSTC: $1 "
|
||||
$(Q) $(RUSTC) --emit obj $(RUSTELFFLAGS) $($(strip $1)_RUSTELFFLAGS) $1 -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
# Remove target suffix here since zig compiler add .o automatically
|
||||
define ELFCOMPILEZIG
|
||||
$(ECHO_BEGIN)"ZIG: $1 "
|
||||
$(Q) $(ZIG) build-obj $(ZIGELFFLAGS) $($(strip $1)_ZIGELFFLAGS) --name $(basename $2) $1
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFCOMPILED
|
||||
$(ECHO_BEGIN)"DC: $1 "
|
||||
$(Q) $(DC) -c $(DELFFLAGS) $($(strip $1)_DELFFLAGS) $1 -of $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFCOMPILESWIFT
|
||||
$(ECHO_BEGIN)"SWIFTC: $1 "
|
||||
$(Q) $(SWIFTC) -c $(SWIFTELFFLAGS) $($(strip $1)_SWIFTELFFLAGS) $1 -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
define ELFLD
|
||||
@echo "LD: $2"
|
||||
$(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) $(ARCHCRT0OBJ) $1 $(LDLIBS) -o $2
|
||||
$(ECHO_BEGIN)"LD: $2 "
|
||||
$(Q) $(MODULELD) $(MODLDFLAGS) $(LDMAP) $(LDLIBPATH) $(ARCHCRT0OBJ) $1 $(LDSTARTGROUP) $(LDLIBS) $(LDENDGROUP) -o $2
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
$(RAOBJS): %.s$(SUFFIX)$(OBJEXT): %.s
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(AELFFLAGS)), \
|
||||
# rename "main()" in $1 to "xxx_main()" and save to $2
|
||||
define RENAMEMAIN
|
||||
$(ECHO_BEGIN)"Rename main() in $1 and save to $2"
|
||||
$(Q) ${shell cat $1 | sed -e "s/fn[ ]\+main/fn $(addsuffix _main,$(PROGSYM_$@))/" > $2}
|
||||
$(ECHO_END)
|
||||
endef
|
||||
|
||||
$(RAOBJS): $(PREFIX)%.s$(SUFFIX)$(OBJEXT): %.s
|
||||
$(if $(and $(CONFIG_MODULES),$(MODAELFFLAGS)), \
|
||||
$(call ELFASSEMBLE, $<, $@), $(call ASSEMBLE, $<, $@))
|
||||
|
||||
$(CAOBJS): %.S$(SUFFIX)$(OBJEXT): %.S
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(AELFFLAGS)), \
|
||||
$(CAOBJS): $(PREFIX)%.S$(SUFFIX)$(OBJEXT): %.S
|
||||
$(if $(and $(CONFIG_MODULES),$(MODAELFFLAGS)), \
|
||||
$(call ELFASSEMBLE, $<, $@), $(call ASSEMBLE, $<, $@))
|
||||
|
||||
$(COBJS): %.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \
|
||||
$(COBJS): $(PREFIX)%.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCFLAGS)), \
|
||||
$(call ELFCOMPILE, $<, $@), $(call COMPILE, $<, $@))
|
||||
|
||||
$(CXXOBJS): %$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CXXELFFLAGS)), \
|
||||
$(CXXOBJS): $(PREFIX)%$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCXXFLAGS)), \
|
||||
$(call ELFCOMPILEXX, $<, $@), $(call COMPILEXX, $<, $@))
|
||||
|
||||
$(RUSTOBJS): %$(RUSTEXT)$(SUFFIX)$(OBJEXT): %$(RUSTEXT)
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \
|
||||
$(RUSTOBJS): $(PREFIX)%$(RUSTEXT)$(SUFFIX)$(OBJEXT): %$(RUSTEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILERUST, $<, $@), $(call COMPILERUST, $<, $@))
|
||||
|
||||
archive:
|
||||
$(call ARCHIVE_ADD, $(call CONVERT_PATH,$(BIN)), $(OBJS))
|
||||
$(ZIGOBJS): $(PREFIX)%$(ZIGEXT)$(SUFFIX)$(OBJEXT): %$(ZIGEXT)
|
||||
$(if $(and $(CONFIG_MODULES), $(CELFFLAGS)), \
|
||||
$(call ELFCOMPILEZIG, $<, $@), $(call COMPILEZIG, $<, $@))
|
||||
|
||||
$(DOBJS): $(PREFIX)%$(DEXT)$(SUFFIX)$(OBJEXT): %$(DEXT)
|
||||
$(if $(and $(CONFIG_MODULES), $(CELFFLAGS)), \
|
||||
$(call ELFCOMPILED, $<, $@), $(call COMPILED, $<, $@))
|
||||
|
||||
$(SWIFTOBJS): $(PREFIX)%$(SWIFTEXT)$(SUFFIX)$(OBJEXT): %$(SWIFTEXT)
|
||||
$(if $(and $(CONFIG_MODULES), $(CELFFLAGS)), \
|
||||
$(call ELFCOMPILESWIFT, $<, $@), $(call COMPILESWIFT, $<, $@))
|
||||
|
||||
AROBJS :=
|
||||
ifneq ($(OBJS),)
|
||||
SORTOBJS := $(sort $(OBJS))
|
||||
$(eval $(call SPLITVARIABLE,OBJS_SPILT,$(SORTOBJS),100))
|
||||
$(foreach BATCH, $(OBJS_SPILT_TOTAL), \
|
||||
$(foreach obj, $(OBJS_SPILT_$(BATCH)), \
|
||||
$(eval substitute := $(patsubst %$(OBJEXT),%_$(BATCH)$(OBJEXT),$(obj))) \
|
||||
$(eval AROBJS += $(substitute)) \
|
||||
$(eval $(call AROBJSRULES, $(substitute),$(obj))) \
|
||||
) \
|
||||
)
|
||||
endif
|
||||
|
||||
$(PREFIX).built: $(AROBJS)
|
||||
$(call SPLITVARIABLE,ALL_OBJS,$(AROBJS),100)
|
||||
$(foreach BATCH, $(ALL_OBJS_TOTAL), \
|
||||
$(if $(strip $(ALL_OBJS_$(BATCH))), \
|
||||
$(shell $(call ARLOCK, $(call CONVERT_PATH,$(BIN)), $(ALL_OBJS_$(BATCH)))) \
|
||||
) \
|
||||
)
|
||||
$(Q) touch $@
|
||||
|
||||
ifeq ($(BUILD_MODULE),y)
|
||||
|
||||
$(MAINCXXOBJ): %$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CXXELFFLAGS)), \
|
||||
$(MAINCXXOBJ): $(PREFIX)%$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCXXFLAGS)), \
|
||||
$(call ELFCOMPILEXX, $<, $@), $(call COMPILEXX, $<, $@))
|
||||
|
||||
$(MAINCOBJ): %.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \
|
||||
$(MAINCOBJ): $(PREFIX)%.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCFLAGS)), \
|
||||
$(call ELFCOMPILE, $<, $@), $(call COMPILE, $<, $@))
|
||||
|
||||
PROGLIST := $(wordlist 1,$(words $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ)),$(PROGNAME))
|
||||
PROGLIST := $(addprefix $(BINDIR)$(DELIM),$(PROGLIST))
|
||||
PROGOBJ := $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ)
|
||||
$(MAINZIGOBJ): $(PREFIX)%$(ZIGEXT)$(SUFFIX)$(OBJEXT): %$(ZIGEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILEZIG, $<, $@), $(call COMPILEZIG, $<, $@))
|
||||
|
||||
$(PROGLIST): $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ)
|
||||
$(MAINDOBJ): $(PREFIX)%$(DEXT)$(SUFFIX)$(OBJEXT): %$(DEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILED, $<, $@), $(call COMPILED, $<, $@))
|
||||
|
||||
$(MAINSWIFTOBJ): $(PREFIX)%$(SWIFTEXT)$(SUFFIX)$(OBJEXT): %$(SWIFTEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILESWIFT, $<, $@), $(call COMPILESWIFT, $<, $@))
|
||||
|
||||
$(PROGLIST): $(MAINCOBJ) $(MAINCXXOBJ) $(MAINRUSTOBJ) $(MAINZIGOBJ) $(MAINDOBJ) $(MAINSWIFTOBJ)
|
||||
$(Q) mkdir -p $(BINDIR)
|
||||
$(call ELFLD,$(firstword $(PROGOBJ)),$(call CONVERT_PATH,$(firstword $(PROGLIST))))
|
||||
$(Q) chmod +x $(firstword $(PROGLIST))
|
||||
ifneq ($(CONFIG_DEBUG_SYMBOLS),y)
|
||||
$(Q) $(STRIP) $(firstword $(PROGLIST))
|
||||
$(call ELFLD, $(PROGOBJ_$@), $(call CONVERT_PATH,$@))
|
||||
$(Q) chmod +x $@
|
||||
ifneq ($(CONFIG_DEBUG_SYMBOLS),)
|
||||
$(Q) mkdir -p $(BINDIR_DEBUG)
|
||||
$(Q) cp $@ $(BINDIR_DEBUG)
|
||||
$(Q) $(MODULESTRIP) $(NX_KEEP) $@
|
||||
endif
|
||||
$(eval PROGLIST=$(filter-out $(firstword $(PROGLIST)),$(PROGLIST)))
|
||||
$(eval PROGOBJ=$(filter-out $(firstword $(PROGOBJ)),$(PROGOBJ)))
|
||||
|
||||
install:: $(PROGLIST)
|
||||
@:
|
||||
|
||||
else
|
||||
|
||||
MAINNAME := $(addsuffix _main,$(PROGNAME))
|
||||
|
||||
$(MAINCXXOBJ): %$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(eval $<_CXXFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(firstword $(MAINNAME))})
|
||||
$(eval $<_CXXELFFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(firstword $(MAINNAME))})
|
||||
$(eval MAINNAME=$(filter-out $(firstword $(MAINNAME)),$(MAINNAME)))
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CXXELFFLAGS)), \
|
||||
$(MAINCXXOBJ): $(PREFIX)%$(CXXEXT)$(SUFFIX)$(OBJEXT): %$(CXXEXT)
|
||||
$(eval $<_CXXFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGSYM_$@))})
|
||||
$(eval $<_CXXELFFLAGS += ${shell $(DEFINE) "$(CXX)" main=$(addsuffix _main,$(PROGSYM_$@))})
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCXXFLAGS)), \
|
||||
$(call ELFCOMPILEXX, $<, $@), $(call COMPILEXX, $<, $@))
|
||||
|
||||
$(MAINCOBJ): %.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(eval $<_CFLAGS += ${shell $(DEFINE) "$(CC)" main=$(firstword $(MAINNAME))})
|
||||
$(eval $<_CELFFLAGS += ${shell $(DEFINE) "$(CC)" main=$(firstword $(MAINNAME))})
|
||||
$(eval MAINNAME=$(filter-out $(firstword $(MAINNAME)),$(MAINNAME)))
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \
|
||||
$(MAINCOBJ): $(PREFIX)%.c$(SUFFIX)$(OBJEXT): %.c
|
||||
$(eval $<_CFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGSYM_$@)))
|
||||
$(eval $<_CELFFLAGS += ${DEFINE_PREFIX}main=$(addsuffix _main,$(PROGSYM_$@)))
|
||||
$(if $(and $(CONFIG_MODULES),$(MODCFLAGS)), \
|
||||
$(call ELFCOMPILE, $<, $@), $(call COMPILE, $<, $@))
|
||||
|
||||
$(MAINRUSTOBJ): %$(RUSTEXT)$(SUFFIX)$(OBJEXT): %$(RUSTEXT)
|
||||
$(if $(and $(CONFIG_BUILD_LOADABLE),$(CELFFLAGS)), \
|
||||
$(MAINRUSTOBJ): $(PREFIX)%$(RUSTEXT)$(SUFFIX)$(OBJEXT): %$(RUSTEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILERUST, $<, $@), $(call COMPILERUST, $<, $@))
|
||||
|
||||
$(MAINZIGOBJ): $(PREFIX)%$(ZIGEXT)$(SUFFIX)$(OBJEXT): %$(ZIGEXT)
|
||||
$(Q) $(call RENAMEMAIN, $<, $(basename $<)_tmp.zig)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILEZIG, $(basename $<)_tmp.zig, $@), $(call COMPILEZIG, $(basename $<)_tmp.zig, $@))
|
||||
$(Q) rm -f $(basename $<)_tmp.zig
|
||||
|
||||
$(MAINDOBJ): $(PREFIX)%$(DEXT)$(SUFFIX)$(OBJEXT): %$(DEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILED, $<, $@), $(call COMPILED, $<, $@))
|
||||
|
||||
$(MAINSWIFTOBJ): $(PREFIX)%$(SWIFTEXT)$(SUFFIX)$(OBJEXT): %$(SWIFTEXT)
|
||||
$(if $(and $(CONFIG_MODULES),$(CELFFLAGS)), \
|
||||
$(call ELFCOMPILESWIFT, $<, $@), $(call COMPILESWIFT, $<, $@))
|
||||
|
||||
install::
|
||||
@:
|
||||
|
||||
endif # BUILD_MODULE
|
||||
|
||||
postinstall::
|
||||
@:
|
||||
|
||||
context::
|
||||
|
||||
ifneq ($(PROGNAME),)
|
||||
|
||||
REGLIST := $(addprefix $(BUILTIN_REGISTRY)$(DELIM),$(addsuffix .bdat,$(PROGNAME)))
|
||||
APPLIST := $(PROGNAME)
|
||||
ifeq ($(DO_REGISTRATION),y)
|
||||
|
||||
$(REGLIST): $(DEPCONFIG) Makefile
|
||||
$(call REGISTER,$(firstword $(APPLIST)),$(firstword $(PRIORITY)),$(firstword $(STACKSIZE)),$(if $(BUILD_MODULE),,$(firstword $(APPLIST))_main))
|
||||
$(eval APPLIST=$(filter-out $(firstword $(APPLIST)),$(APPLIST)))
|
||||
$(if $(filter-out $(firstword $(PRIORITY)),$(PRIORITY)),$(eval PRIORITY=$(filter-out $(firstword $(PRIORITY)),$(PRIORITY))))
|
||||
$(if $(filter-out $(firstword $(STACKSIZE)),$(STACKSIZE)),$(eval STACKSIZE=$(filter-out $(firstword $(STACKSIZE)),$(STACKSIZE))))
|
||||
|
||||
register:: $(REGLIST)
|
||||
$(eval PROGNAME_$@ := $(basename $(notdir $@)))
|
||||
$(eval PROGSYM_$@ := $(subst -,_,$(PROGNAME_$@)))
|
||||
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
|
||||
$(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGSYM_$@)_main),$(UID_$@),$(GID_$@),$(MODE_$@))
|
||||
else
|
||||
register::
|
||||
$(call REGISTER,$(PROGNAME_$@),$(PRIORITY_$@),$(STACKSIZE_$@),$(if $(BUILD_MODULE),,$(PROGSYM_$@)_main))
|
||||
endif
|
||||
|
||||
.depend: Makefile $(wildcard $(foreach SRC, $(SRCS), $(addsuffix /$(SRC), $(subst :, ,$(VPATH))))) $(DEPCONFIG)
|
||||
$(Q) $(MKDEP) $(DEPPATH) --obj-suffix .c$(SUFFIX)$(OBJEXT) "$(CC)" -- $(CFLAGS) -- $(filter %.c,$^) >Make.dep
|
||||
$(Q) $(MKDEP) $(DEPPATH) --obj-suffix .S$(SUFFIX)$(OBJEXT) "$(CC)" -- $(CFLAGS) -- $(filter %.S,$^) >>Make.dep
|
||||
$(Q) $(MKDEP) $(DEPPATH) --obj-suffix $(CXXEXT)$(SUFFIX)$(OBJEXT) "$(CXX)" -- $(CXXFLAGS) -- $(filter %$(CXXEXT),$^) >>Make.dep
|
||||
register:: $(REGLIST)
|
||||
@:
|
||||
else
|
||||
register::
|
||||
@:
|
||||
endif
|
||||
|
||||
$(PREFIX).depend: Makefile $(wildcard $(foreach SRC, $(SRCS), $(addsuffix /$(SRC), $(subst :, ,$(VPATH))))) $(DEPCONFIG)
|
||||
$(shell echo "# Gen Make.dep automatically" >$(PREFIX)Make.dep)
|
||||
$(call SPLITVARIABLE,ALL_DEP_OBJS,$^,100)
|
||||
$(foreach BATCH, $(ALL_DEP_OBJS_TOTAL), \
|
||||
$(shell $(MKDEP) $(DEPPATH) --obj-suffix .c$(SUFFIX)$(OBJEXT) "$(CC)" -- $(CFLAGS) -- $(filter %.c,$(ALL_DEP_OBJS_$(BATCH))) >>$(PREFIX)Make.dep) \
|
||||
$(shell $(MKDEP) $(DEPPATH) --obj-suffix .S$(SUFFIX)$(OBJEXT) "$(CC)" -- $(CFLAGS) -- $(filter %.S,$(ALL_DEP_OBJS_$(BATCH))) >>$(PREFIX)Make.dep) \
|
||||
$(shell $(MKDEP) $(DEPPATH) --obj-suffix $(CXXEXT)$(SUFFIX)$(OBJEXT) "$(CXX)" -- $(CXXFLAGS) -- $(filter %$(CXXEXT),$(ALL_DEP_OBJS_$(BATCH))) >>$(PREFIX)Make.dep) \
|
||||
)
|
||||
$(Q) touch $@
|
||||
|
||||
depend:: .depend
|
||||
depend:: $(PREFIX).depend
|
||||
@:
|
||||
|
||||
clean::
|
||||
$(call DELFILE, .built)
|
||||
$(call CLEANAROBJS)
|
||||
$(call CLEAN)
|
||||
|
||||
distclean:: clean
|
||||
$(call DELFILE, .kconfig)
|
||||
$(call DELFILE, Make.dep)
|
||||
$(call DELFILE, .depend)
|
||||
|
||||
-include Make.dep
|
||||
-include $(PREFIX)Make.dep
|
||||
|
||||
# Include Wasm specific definitions
|
||||
include $(APPDIR)/tools/Wasm.mk
|
||||
|
|
|
|||
83
CMakeLists.txt
Normal file
83
CMakeLists.txt
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
# ##############################################################################
|
||||
# apps/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
# ~~~
|
||||
# Important note:
|
||||
# This CMakeLists.txt is not meant as a top-level CMakeLists.txt. Instead,
|
||||
# CMake must be run using the top-level CMakeLists.txt from the nuttx
|
||||
# repository and point to this directory via NUTTX_APPS_DIR. For example:
|
||||
# cmake -S <nuttx-dir> -B <build-dir> [...] -DNUTTX_APPS_DIR=<apps-dir>
|
||||
# ~~~
|
||||
|
||||
if(CONFIG_APPS_DIR)
|
||||
# add apps cmake modules
|
||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
|
||||
include(nuttx_add_luamod)
|
||||
include(nuttx_add_wamrmod)
|
||||
include(nuttx_add_rust)
|
||||
include(nuttx_wasm_interface)
|
||||
nuttx_add_library(apps)
|
||||
if(NOT EXISTS {NUTTX_APPS_BINDIR}/dummy.c)
|
||||
file(TOUCH ${NUTTX_APPS_BINDIR}/dummy.c)
|
||||
endif()
|
||||
target_sources(apps PRIVATE ${NUTTX_APPS_BINDIR}/dummy.c)
|
||||
endif()
|
||||
|
||||
file(MAKE_DIRECTORY ${NUTTX_APPS_BINDIR}/include)
|
||||
include_directories(include)
|
||||
include_directories(${NUTTX_APPS_BINDIR}/include)
|
||||
|
||||
add_subdirectory(audioutils)
|
||||
add_subdirectory(benchmarks)
|
||||
add_subdirectory(boot)
|
||||
add_subdirectory(canutils)
|
||||
add_subdirectory(crypto)
|
||||
add_subdirectory(fsutils)
|
||||
add_subdirectory(games)
|
||||
add_subdirectory(graphics)
|
||||
add_subdirectory(industry)
|
||||
add_subdirectory(inertial)
|
||||
add_subdirectory(interpreters)
|
||||
add_subdirectory(logging)
|
||||
add_subdirectory(lte)
|
||||
add_subdirectory(math)
|
||||
add_subdirectory(mlearning)
|
||||
add_subdirectory(netutils)
|
||||
add_subdirectory(nshlib)
|
||||
add_subdirectory(platform)
|
||||
add_subdirectory(sdr)
|
||||
add_subdirectory(system)
|
||||
add_subdirectory(tee)
|
||||
add_subdirectory(testing)
|
||||
add_subdirectory(videoutils)
|
||||
add_subdirectory(wireless)
|
||||
|
||||
# add examples and external at the end to allow library dependencies
|
||||
add_subdirectory(examples)
|
||||
if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/external)
|
||||
add_subdirectory(external)
|
||||
endif()
|
||||
|
||||
add_subdirectory(tools) # after traversing all subdirectories
|
||||
add_subdirectory(builtin) # must be last
|
||||
|
||||
nuttx_generate_kconfig()
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
Apache NuttX is an effort undergoing incubation at The Apache Software Foundation (ASF),
|
||||
sponsored by the Apache Incubator. Incubation is required of all newly accepted projects
|
||||
until a further review indicates that the infrastructure, communications, and decision
|
||||
making process have stabilized in a manner consistent with other successful ASF projects.
|
||||
While incubation status is not necessarily a reflection of the completeness or stability
|
||||
of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
|
||||
|
||||
Some of the incubating project's releases may not be fully compliant with ASF policy. For
|
||||
example, releases may have incomplete or un-reviewed licensing conditions. What follows is
|
||||
a list of known issues the project is currently aware of (note that this list, by definition,
|
||||
is likely to be incomplete):
|
||||
|
||||
* Releases may have incomplete licensing conditions.
|
||||
* Some ASF files still have BSD headers. Most of the top contributors have signed an ICLA and
|
||||
we are working on updating the headers and getting approvals from other copyright holders.
|
||||
|
||||
If you are planning to incorporate this work into your product/project, please be aware that
|
||||
you will need to conduct a thorough licensing review to determine the overall implications of
|
||||
including this work. For the current status of this project through the Apache Incubator
|
||||
visit: https://incubator.apache.org/projects/nuttx.html
|
||||
20
Directory.mk
20
Directory.mk
|
|
@ -1,6 +1,8 @@
|
|||
############################################################################
|
||||
# apps/Directory.mk
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
|
|
@ -22,11 +24,16 @@ include $(APPDIR)/Make.defs
|
|||
|
||||
# Sub-directories that have been built or configured.
|
||||
|
||||
SUBDIRS := $(dir $(wildcard *$(DELIM)Makefile))
|
||||
CONFIGSUBDIRS := $(filter-out $(dir $(wildcard *$(DELIM)Kconfig)),$(SUBDIRS))
|
||||
CLEANSUBDIRS += $(dir $(wildcard *$(DELIM).depend))
|
||||
CLEANSUBDIRS += $(dir $(wildcard *$(DELIM).kconfig))
|
||||
SUBDIRS := $(dir $(wildcard */Makefile))
|
||||
CONFIGSUBDIRS := $(filter-out $(dir $(wildcard */Kconfig)),$(SUBDIRS))
|
||||
CLEANSUBDIRS := $(dir $(wildcard *$(DELIM).built))
|
||||
CLEANSUBDIRS += $(dir $(wildcard */.depend))
|
||||
CLEANSUBDIRS += $(dir $(wildcard */.kconfig))
|
||||
CLEANSUBDIRS := $(sort $(CLEANSUBDIRS))
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
CONFIGSUBDIRS := $(subst /,\,$(CONFIGSUBDIRS))
|
||||
CLEANSUBDIRS := $(subst /,\,$(CLEANSUBDIRS))
|
||||
endif
|
||||
|
||||
all: nothing
|
||||
|
||||
|
|
@ -43,15 +50,16 @@ install:
|
|||
preconfig: $(foreach SDIR, $(CONFIGSUBDIRS), $(SDIR)_preconfig)
|
||||
ifneq ($(MENUDESC),)
|
||||
$(Q) $(MKKCONFIG) -m $(MENUDESC)
|
||||
$(Q) touch .kconfig
|
||||
endif
|
||||
$(Q) touch .kconfig
|
||||
|
||||
clean: $(foreach SDIR, $(CLEANSUBDIRS), $(SDIR)_clean)
|
||||
@:
|
||||
|
||||
distclean: $(foreach SDIR, $(CLEANSUBDIRS), $(SDIR)_distclean)
|
||||
ifneq ($(MENUDESC),)
|
||||
$(call DELFILE, Kconfig)
|
||||
$(call DELFILE, .kconfig)
|
||||
endif
|
||||
$(call DELFILE, .kconfig)
|
||||
|
||||
-include Make.dep
|
||||
|
|
|
|||
135
Make.defs
135
Make.defs
|
|
@ -1,6 +1,8 @@
|
|||
############################################################################
|
||||
# apps/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
|
|
@ -19,17 +21,7 @@
|
|||
############################################################################
|
||||
|
||||
TOPDIR ?= $(APPDIR)/import
|
||||
include $(TOPDIR)/Make.defs
|
||||
|
||||
# The GNU make CURDIR will always be a POSIX-like path with forward slashes
|
||||
# as path segment separators. This is fine for the above inclusions but
|
||||
# will cause problems later for the native build. If we know that this is
|
||||
# a native build, then we need to fix up the APPDIR path for subsequent
|
||||
# use
|
||||
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
APPDIR := ${shell echo %CD%}
|
||||
endif
|
||||
-include $(TOPDIR)/Make.defs
|
||||
|
||||
# Application Directories
|
||||
|
||||
|
|
@ -37,11 +29,16 @@ endif
|
|||
# CLEANDIRS is the list of all top-level directories containing Makefiles.
|
||||
# It is used only for cleaning.
|
||||
|
||||
BUILDIRS := $(dir $(wildcard $(APPDIR)$(DELIM)*$(DELIM)Make.defs))
|
||||
BUILDIRS := $(filter-out $(APPDIR)$(DELIM)import$(DELIM),$(BUILDIRS))
|
||||
CONFIGDIRS := $(filter-out $(APPDIR)$(DELIM)builtin$(DELIM),$(BUILDIRS))
|
||||
CONFIGDIRS := $(filter-out $(dir $(wildcard $(APPDIR)$(DELIM)*$(DELIM)Kconfig)),$(CONFIGDIRS))
|
||||
CLEANDIRS := $(dir $(wildcard $(APPDIR)$(DELIM)*$(DELIM)Makefile))
|
||||
BUILDIRS := $(dir $(wildcard $(APPDIR)/*/Make.defs))
|
||||
BUILDIRS := $(filter-out $(APPDIR)/import/,$(BUILDIRS))
|
||||
CONFIGDIRS := $(filter-out $(APPDIR)/builtin/,$(BUILDIRS))
|
||||
CONFIGDIRS := $(filter-out $(dir $(wildcard $(APPDIR)/*/Kconfig)),$(CONFIGDIRS))
|
||||
CLEANDIRS := $(dir $(wildcard $(APPDIR)/*/Makefile))
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
BUILDIRS := $(subst /,\,$(BUILDIRS))
|
||||
CONFIGDIRS := $(subst /,\,$(CONFIGDIRS))
|
||||
CLEANDIRS := $(subst /,\,$(CLEANDIRS))
|
||||
endif
|
||||
|
||||
# CONFIGURED_APPS is the application directories that should be built in
|
||||
# the current configuration.
|
||||
|
|
@ -49,7 +46,7 @@ CLEANDIRS := $(dir $(wildcard $(APPDIR)$(DELIM)*$(DELIM)Makefile))
|
|||
CONFIGURED_APPS :=
|
||||
|
||||
define Add_Application
|
||||
include $(1)Make.defs
|
||||
include $(1)Make.defs
|
||||
endef
|
||||
|
||||
$(foreach BDIR, $(BUILDIRS), $(eval $(call Add_Application,$(BDIR))))
|
||||
|
|
@ -58,6 +55,9 @@ $(foreach BDIR, $(BUILDIRS), $(eval $(call Add_Application,$(BDIR))))
|
|||
|
||||
CXXEXT ?= .cxx
|
||||
RUSTEXT ?= .rs
|
||||
ZIGEXT ?= .zig
|
||||
DEXT ?= .d
|
||||
SWIFTEXT ?= .swift
|
||||
|
||||
# Library path
|
||||
|
||||
|
|
@ -66,10 +66,12 @@ LIBPATH ?= $(TOPDIR)$(DELIM)staging
|
|||
# The install path
|
||||
|
||||
BINDIR ?= $(APPDIR)$(DELIM)bin
|
||||
BINDIR_DEBUG ?= $(APPDIR)$(DELIM)bin_debug
|
||||
|
||||
# The final build target
|
||||
|
||||
BIN ?= $(APPDIR)$(DELIM)libapps$(LIBEXT)
|
||||
BIN ?= $(APPDIR)$(DELIM)libapps$(LIBEXT)
|
||||
WBIN ?= $(APPDIR)$(DELIM)wasm$(DELIM)libwasm$(LIBEXT)
|
||||
|
||||
# Tools
|
||||
|
||||
|
|
@ -81,21 +83,108 @@ endif
|
|||
|
||||
# Builtin Registration
|
||||
|
||||
BUILTIN_REGISTRY = $(APPDIR)$(DELIM)builtin$(DELIM)registry
|
||||
DEPCONFIG = $(TOPDIR)$(DELIM).config
|
||||
BUILTIN_REGISTRY ?= $(APPDIR)$(DELIM)builtin$(DELIM)registry
|
||||
DEPCONFIG ?= $(TOPDIR)$(DELIM).config
|
||||
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
|
||||
define REGISTER
|
||||
$(Q) echo Register: $1
|
||||
$(Q) echo { \"$1\", $2, $3, $4 }, > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
|
||||
$(Q) echo { "$(subst ",,$(1))", $2, $3, $(patsubst ,0,$(subst ",,$(4))), $(patsubst ,0,$(5)), $(patsubst ,0,$(6)), $(patsubst ,0555,$(7))}, > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
|
||||
$(Q) echo int $(subst ",,$(4))(int argc, char *argv[]); > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"
|
||||
|
||||
$(Q) touch $(BUILTIN_REGISTRY)$(DELIM).updated"
|
||||
endef
|
||||
else
|
||||
define REGISTER
|
||||
$(Q) echo Register: $1
|
||||
$(Q) echo { "$(subst ",,$(1))", $2, $3, $(subst ",,$(4)) }, > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
|
||||
$(Q) echo int $(subst ",,$(4))(int argc, char *argv[]); > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"
|
||||
|
||||
$(Q) touch $(BUILTIN_REGISTRY)$(DELIM).updated"
|
||||
endef
|
||||
endif
|
||||
else
|
||||
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
|
||||
define REGISTER
|
||||
$(Q) echo "{ \"$1\", $2, $3, $(patsubst ,0,$(4)), $(patsubst ,0,$(5)), $(patsubst ,0,$(6)), $(patsubst ,0555,$(7)) }," > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
|
||||
$(Q) if [ ! -z $4 ]; then \
|
||||
echo "int $4(int argc, char *argv[]);" > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"; \
|
||||
fi;
|
||||
$(Q) touch "$(BUILTIN_REGISTRY)$(DELIM).updated"
|
||||
endef
|
||||
else
|
||||
define REGISTER
|
||||
$(Q) echo "Register: $1"
|
||||
$(Q) echo "{ \"$1\", $2, $3, $4 }," > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
|
||||
$(Q) if [ ! -z $4 ]; then \
|
||||
echo "int $4(int argc, char *argv[]);" > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"; \
|
||||
fi;
|
||||
$(Q) touch "$(BUILTIN_REGISTRY)$(DELIM).updated"
|
||||
endef
|
||||
endif
|
||||
endif
|
||||
|
||||
# Standard include path
|
||||
|
||||
CFLAGS += ${shell $(INCDIR) "$(CC)" "$(APPDIR)$(DELIM)include"}
|
||||
CXXFLAGS += ${shell $(INCDIR) "$(CC)" "$(APPDIR)$(DELIM)include"}
|
||||
CFLAGS += ${INCDIR_PREFIX}"$(APPDIR)$(DELIM)include"
|
||||
CXXFLAGS += ${INCDIR_PREFIX}"$(APPDIR)$(DELIM)include"
|
||||
|
||||
NUTTXLIB ?= $(call CONVERT_PATH,$(TOPDIR)$(DELIM)staging)
|
||||
|
||||
# SPLITVARIABLE - Split long variables into specified batches
|
||||
# Usage: $(call SPLITVARIABLE, variable-def, variable-ref, batch-size)
|
||||
#
|
||||
# Example: VAR:= a b c x y z foo bar
|
||||
# $(call SPLITVARIABLE, VAR, $(VAR), 3)
|
||||
# $(foreach, num, $(VAR_TOTAL), $(shell echo $(VAR_$(num))))
|
||||
# Return new variable definition:
|
||||
# $(variable-def)_TOTAL : total split sequence , start with 1.
|
||||
# $(variable-def)_$(num) : newly defined variable , ended with batch num.
|
||||
# In the case above:
|
||||
# $(VAR_TOTAL) = 1 2 3
|
||||
# $(VAR_1) = a b c
|
||||
# $(VAR_2) = x y z
|
||||
# $(VAR_3) = foo bar
|
||||
|
||||
define SPLITVARIABLE
|
||||
$(eval SPLITVARIABLE_PREFIX = $(1))
|
||||
$(eval BATCH_SIZE = $(3))
|
||||
$(eval TOTAL_BATCH = $(shell expr $(words $(2)) / $(BATCH_SIZE) + 1))
|
||||
$(eval $(SPLITVARIABLE_PREFIX)_TOTAL = $(shell seq 1 $(TOTAL_BATCH)))
|
||||
$(foreach idx, $($(SPLITVARIABLE_PREFIX)_TOTAL), \
|
||||
$(eval FROMINDEX=$(shell expr 1 + $(idx) \* $(BATCH_SIZE) - $(BATCH_SIZE))) \
|
||||
$(eval $(SPLITVARIABLE_PREFIX)_$(idx)=$(wordlist $(FROMINDEX), $(shell expr $(FROMINDEX) + $(BATCH_SIZE) - 1), $(2))) \
|
||||
)
|
||||
endef
|
||||
|
||||
define ARLOCK
|
||||
flock $1.lock $(call ARCHIVE, $1, $(2))
|
||||
endef
|
||||
|
||||
# dynamic AR target
|
||||
|
||||
define AROBJSRULES
|
||||
$(1) : $(2)
|
||||
@ cp $(2) $(1)
|
||||
endef
|
||||
|
||||
# CLEANAROBJS - del AR target files exclusively
|
||||
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
define CLEANAROBJS
|
||||
$(call DELFILE,$(subst /,\,$(AROBJS)))
|
||||
$(call DELFILE,$(subst /,\,$(OBJS)))
|
||||
$(eval OBJS :=)
|
||||
endef
|
||||
else
|
||||
define CLEANAROBJS
|
||||
$(call SPLITVARIABLE,CLEAN_AROBJS,${AROBJS},100)
|
||||
$(foreach BATCH, $(CLEAN_AROBJS_TOTAL), \
|
||||
$(shell rm -rf $(CLEAN_AROBJS_$(BATCH))))
|
||||
$(call SPLITVARIABLE,CLEAN_OBJS,${OBJS},100)
|
||||
$(foreach BATCH, $(CLEAN_OBJS_TOTAL), \
|
||||
$(shell rm -rf $(CLEAN_OBJS_$(BATCH))))
|
||||
$(eval OBJS :=)
|
||||
endef
|
||||
endif
|
||||
|
|
|
|||
107
Makefile
107
Makefile
|
|
@ -1,6 +1,8 @@
|
|||
############################################################################
|
||||
# apps/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
|
|
@ -20,8 +22,20 @@
|
|||
|
||||
export APPDIR = $(CURDIR)
|
||||
include $(APPDIR)/Make.defs
|
||||
include $(APPDIR)/tools/Wasm.mk
|
||||
|
||||
# The GNU make CURDIR will always be a POSIX-like path with forward slashes
|
||||
# as path segment separators. This is fine for the above inclusions but
|
||||
# will cause problems later for the native build. If we know that this is
|
||||
# a native build, then we need to fix up the APPDIR path for subsequent
|
||||
# use
|
||||
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
export APPDIR = $(subst /,\,$(CURDIR))
|
||||
endif
|
||||
|
||||
# Symbol table for loadable apps.
|
||||
# SYMTABEXT: Extra arguments for mksymtab.sh
|
||||
|
||||
SYMTABSRC = symtab_apps.c
|
||||
SYMTABOBJ = $(SYMTABSRC:.c=$(OBJEXT))
|
||||
|
|
@ -31,16 +45,15 @@ SYMTABOBJ = $(SYMTABSRC:.c=$(OBJEXT))
|
|||
# We first remove libapps.a before letting the other rules add objects to it
|
||||
# so that we ensure libapps.a does not contain objects from prior build
|
||||
|
||||
all:
|
||||
$(RM) $(BIN)
|
||||
$(MAKE) $(BIN)
|
||||
all: $(BIN)
|
||||
|
||||
.PHONY: import install dirlinks export .depdirs preconfig depend clean distclean
|
||||
.PHONY: context clean_context context_all register register_all
|
||||
.PHONY: context postinstall clean_context context_all postinstall_all register register_all
|
||||
.PRECIOUS: $(BIN)
|
||||
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),all)))
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),install)))
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),postinstall)))
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),context)))
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),register)))
|
||||
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),depend)))
|
||||
|
|
@ -55,6 +68,25 @@ $(INCDIR): $(TOPDIR)/tools/incdir.c
|
|||
|
||||
IMPORT_TOOLS = $(MKDEP) $(INCDIR)
|
||||
|
||||
ifeq ($(CONFIG_TOOLS_WASM_BUILD),y)
|
||||
|
||||
configure_wasm:
|
||||
$(Q) cmake -B$(APPDIR)$(DELIM)tools$(DELIM)Wasm$(DELIM)build \
|
||||
$(APPDIR)$(DELIM)tools$(DELIM)Wasm \
|
||||
-DAPPDIR=$(APPDIR) -DTOPDIR=$(TOPDIR) \
|
||||
-DWASI_SDK_PATH=$(WASI_SDK_PATH) \
|
||||
-DKCONFIG_FILE_PATH=$(TOPDIR)$(DELIM).config
|
||||
|
||||
context_wasm: configure_wasm
|
||||
$(Q) cmake --build $(APPDIR)$(DELIM)tools$(DELIM)Wasm$(DELIM)build
|
||||
|
||||
else
|
||||
|
||||
context_wasm:
|
||||
|
||||
endif
|
||||
|
||||
|
||||
# In the KERNEL build, we must build and install all of the modules. No
|
||||
# symbol table is needed
|
||||
|
||||
|
|
@ -62,12 +94,12 @@ ifeq ($(CONFIG_BUILD_KERNEL),y)
|
|||
|
||||
install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
|
||||
|
||||
.import: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
||||
$(Q) for app in ${CONFIGURED_APPS}; do \
|
||||
$(MAKE) -C "$${app}" archive ; \
|
||||
done
|
||||
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
||||
|
||||
.import: $(BIN)
|
||||
$(Q) install libapps.a $(APPDIR)$(DELIM)import$(DELIM)libs
|
||||
$(Q) $(MAKE) install
|
||||
$(Q) $(MAKE) postinstall
|
||||
|
||||
import: $(IMPORT_TOOLS)
|
||||
$(Q) $(MAKE) context TOPDIR="$(APPDIR)$(DELIM)import"
|
||||
|
|
@ -80,32 +112,37 @@ else
|
|||
# In FLAT and protected modes, the modules have already been created. A
|
||||
# symbol table is required.
|
||||
|
||||
ifeq ($(CONFIG_BUILD_LOADABLE),)
|
||||
|
||||
ifeq ($(CONFIG_MODULES),)
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
||||
$(Q) for app in ${CONFIGURED_APPS}; do \
|
||||
$(MAKE) -C "$${app}" archive ; \
|
||||
done
|
||||
else
|
||||
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
||||
$(call LINK_WASM)
|
||||
endif
|
||||
|
||||
else
|
||||
|
||||
$(SYMTABSRC): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
||||
$(Q) for app in ${CONFIGURED_APPS}; do \
|
||||
$(MAKE) -C "$${app}" archive ; \
|
||||
done
|
||||
$(Q) $(MAKE) install
|
||||
$(Q) $(APPDIR)$(DELIM)tools$(DELIM)mksymtab.sh $(BINDIR) >$@.tmp
|
||||
$(Q) $(APPDIR)$(DELIM)tools$(DELIM)mksymtab.sh $(BINDIR) $(SYMTABEXT) >$@.tmp
|
||||
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
|
||||
|
||||
ifneq ($(CONFIG_ARM_TOOLCHAIN_GHS),y)
|
||||
$(SYMTABOBJ): %$(OBJEXT): %.c
|
||||
$(call COMPILE, -fno-lto $<, $@)
|
||||
$(call COMPILE, $<, $@, -fno-lto -fno-builtin)
|
||||
else
|
||||
$(SYMTABOBJ): %$(OBJEXT): %.c
|
||||
$(call COMPILE, $<, $@, -Onolink)
|
||||
endif
|
||||
|
||||
$(BIN): $(SYMTABOBJ)
|
||||
$(call ARCHIVE_ADD, $(call CONVERT_PATH,$(BIN)), $^)
|
||||
$(call ARLOCK, $(call CONVERT_PATH,$(BIN)), $^)
|
||||
$(call LINK_WASM)
|
||||
|
||||
endif # !CONFIG_BUILD_LOADABLE
|
||||
endif # !CONFIG_MODULES
|
||||
|
||||
install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
|
||||
$(Q) $(MAKE) postinstall_all
|
||||
|
||||
# Link nuttx
|
||||
|
||||
|
|
@ -141,10 +178,15 @@ dirlinks:
|
|||
|
||||
context_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_context)
|
||||
register_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_register)
|
||||
postinstall_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_postinstall)
|
||||
|
||||
context:
|
||||
staging:
|
||||
$(Q) mkdir -p $@
|
||||
|
||||
context: | staging
|
||||
$(Q) $(MAKE) context_all
|
||||
$(Q) $(MAKE) register_all
|
||||
$(Q) $(MAKE) context_wasm
|
||||
|
||||
Kconfig:
|
||||
$(foreach SDIR, $(CONFIGDIRS), $(call MAKE_template,$(SDIR),preconfig))
|
||||
|
|
@ -158,7 +200,9 @@ ifneq ($(EXPORTDIR),)
|
|||
ifneq ($(CONFIG_BUILD_KERNEL),y)
|
||||
ifneq ($(BUILTIN_REGISTRY),)
|
||||
for f in "${BUILTIN_REGISTRY}"$(DELIM)*.bdat "${BUILTIN_REGISTRY}"$(DELIM)*.pdat ; do \
|
||||
[ -f "$${f}" ] && cp -f "$${f}" "${EXPORTDIR}"$(DELIM)registry ; \
|
||||
if [ -f "$${f}" ]; then \
|
||||
cp -f "$${f}" "${EXPORTDIR}"$(DELIM)registry ; \
|
||||
fi \
|
||||
done
|
||||
endif
|
||||
endif
|
||||
|
|
@ -181,27 +225,18 @@ clean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_clean)
|
|||
$(call DELFILE, $(BIN))
|
||||
$(call DELFILE, Kconfig)
|
||||
$(call DELDIR, $(BINDIR))
|
||||
$(call DELDIR, $(BINDIR_DEBUG))
|
||||
$(call CLEAN)
|
||||
|
||||
distclean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_distclean)
|
||||
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
||||
$(Q) ( if exist external ( \
|
||||
echo ********************************************************" \
|
||||
echo * The external directory/link must be removed manually *" \
|
||||
echo ********************************************************" \
|
||||
)
|
||||
else
|
||||
$(Q) ( if [ -e external ]; then \
|
||||
echo "********************************************************"; \
|
||||
echo "* The external directory/link must be removed manually *"; \
|
||||
echo "********************************************************"; \
|
||||
fi; \
|
||||
)
|
||||
endif
|
||||
$(call DELFILE, *.lock)
|
||||
$(call DELFILE, .depend)
|
||||
$(call DELFILE, $(SYMTABSRC))
|
||||
$(call DELFILE, $(SYMTABOBJ))
|
||||
$(call DELFILE, $(BIN))
|
||||
$(call DELFILE, Kconfig)
|
||||
$(call DELDIR, $(BINDIR))
|
||||
$(call DELDIR, staging)
|
||||
$(call DELDIR, wasm)
|
||||
$(call DELDIR, $(APPDIR)$(DELIM)tools$(DELIM)Wasm$(DELIM)build)
|
||||
$(call CLEAN)
|
||||
|
|
|
|||
13
README.md
13
README.md
|
|
@ -34,7 +34,7 @@ NuttX directory. Like:
|
|||
|
||||
If all of the above conditions are TRUE, then NuttX will be able to find the
|
||||
application directory. If your application directory has a different name or is
|
||||
location at a different position, then you will have to inform the NuttX build
|
||||
located at a different position, then you will have to inform the NuttX build
|
||||
system of that location. There are several ways to do that:
|
||||
|
||||
1) You can define `CONFIG_APPS_DIR` to be the full path to your application
|
||||
|
|
@ -140,7 +140,7 @@ project. One must:
|
|||
main()
|
||||
```
|
||||
|
||||
4. Set the requirements in the file: `Makefile`, specially the lines:
|
||||
4. Set the requirements in the file: `Makefile`, specifically the lines:
|
||||
|
||||
```makefile
|
||||
PROGNAME = progname
|
||||
|
|
@ -181,10 +181,8 @@ A: Here are three:
|
|||
You can copy any pieces that you like from the old apps/directory to your
|
||||
custom apps directory as necessary.
|
||||
|
||||
This is documented in `NuttX/boards/README.txt` and
|
||||
`nuttx/Documentation/NuttXPortingGuide.html` (Online at
|
||||
https://bitbucket.org/nuttx/nuttx/src/master/Documentation/NuttXPortingGuide.html#apndxconfigs
|
||||
under _Build options_). And in the `apps/README.txt` file.
|
||||
This is documented in `NuttX/boards/README.txt` and `NuttX Porting Guide`
|
||||
online at <https://cwiki.apache.org/confluence/display/NUTTX/Porting+Guide>.
|
||||
|
||||
3) If you like the random collection of stuff in the `apps/` directory but
|
||||
just want to expand the existing components with your own, external
|
||||
|
|
@ -256,4 +254,5 @@ Technology Software Unrestricted (TSU) exception (see the BIS Export Administrat
|
|||
Regulations, Section 740.13) for both object code and source code.
|
||||
|
||||
The following provides more details on the included cryptographic software:
|
||||
https://tls.mbed.org/supported-ssl-ciphersuites.
|
||||
https://tls.mbed.org/supported-ssl-ciphersuites.
|
||||
https://github.com/intel/tinycrypt
|
||||
|
|
|
|||
0
gpsutils/.gitignore → audioutils/.gitignore
vendored
0
gpsutils/.gitignore → audioutils/.gitignore
vendored
25
audioutils/CMakeLists.txt
Normal file
25
audioutils/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
nuttx_add_subdirectory()
|
||||
|
||||
nuttx_generate_kconfig(MENUDESC "Audio Utility libraries")
|
||||
23
audioutils/Make.defs
Normal file
23
audioutils/Make.defs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
############################################################################
|
||||
# apps/audioutils/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(wildcard $(APPDIR)/audioutils/*/Make.defs)
|
||||
25
audioutils/Makefile
Normal file
25
audioutils/Makefile
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
MENUDESC = "Audio Utility libraries"
|
||||
|
||||
include $(APPDIR)/Directory.mk
|
||||
25
audioutils/fmsynth/CMakeLists.txt
Normal file
25
audioutils/fmsynth/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/fmsynth/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_AUDIOUTILS_FMSYNTH_LIB)
|
||||
target_sources(apps PRIVATE fmsynth.c fmsynth_eg.c fmsynth_op.c)
|
||||
endif()
|
||||
10
audioutils/fmsynth/Kconfig
Normal file
10
audioutils/fmsynth/Kconfig
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config AUDIOUTILS_FMSYNTH_LIB
|
||||
bool "FM Synthesizer Library"
|
||||
default n
|
||||
---help---
|
||||
Enable support for the FM Synthesizer library.
|
||||
25
audioutils/fmsynth/Make.defs
Normal file
25
audioutils/fmsynth/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/fmsynth/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_FMSYNTH_LIB),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/fmsynth
|
||||
endif
|
||||
27
audioutils/fmsynth/Makefile
Normal file
27
audioutils/fmsynth/Makefile
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
############################################################################
|
||||
# apps/audioutils/fmsynth/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
CSRCS = fmsynth.c fmsynth_eg.c fmsynth_op.c
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
270
audioutils/fmsynth/fmsynth.c
Normal file
270
audioutils/fmsynth/fmsynth.c
Normal file
|
|
@ -0,0 +1,270 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/fmsynth.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <audioutils/fmsynth.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define WRAP_ROUND_TIME_SEC (10)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static int max_phase_time;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: fetch_feedback
|
||||
****************************************************************************/
|
||||
|
||||
static void fetch_feedback(FAR fmsynth_op_t *ops)
|
||||
{
|
||||
while (ops != NULL)
|
||||
{
|
||||
fmsynthop_update_feedback(ops);
|
||||
ops = ops->parallelop;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: update_phase
|
||||
****************************************************************************/
|
||||
|
||||
static void update_phase(FAR fmsynth_sound_t *snd)
|
||||
{
|
||||
snd->phase_time++;
|
||||
if (snd->phase_time >= max_phase_time)
|
||||
{
|
||||
snd->phase_time = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: sound_modulate
|
||||
****************************************************************************/
|
||||
|
||||
static int sound_modulate(FAR fmsynth_sound_t *snd)
|
||||
{
|
||||
int out = 0;
|
||||
FAR fmsynth_op_t *op;
|
||||
|
||||
if (snd->operators == NULL)
|
||||
{
|
||||
return out;
|
||||
}
|
||||
|
||||
fetch_feedback(snd->operators);
|
||||
|
||||
for (op = snd->operators; op != NULL; op = op->parallelop)
|
||||
{
|
||||
out += fmsynthop_operate(op, snd->phase_time);
|
||||
}
|
||||
|
||||
update_phase(snd);
|
||||
|
||||
return out * snd->volume / FMSYNTH_MAX_VOLUME;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynth_initialize
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynth_initialize(int fs)
|
||||
{
|
||||
max_phase_time = fs * WRAP_ROUND_TIME_SEC;
|
||||
return fmsynthop_set_samplerate(fs);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: create_fmsynthsnd
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_sound_t *create_fmsynthsnd(FAR fmsynth_sound_t *snd)
|
||||
{
|
||||
if (snd)
|
||||
{
|
||||
snd->own_allocate = 0;
|
||||
snd->phase_time = 0;
|
||||
snd->volume = FMSYNTH_MAX_VOLUME;
|
||||
snd->operators = NULL;
|
||||
snd->next_sound = NULL;
|
||||
}
|
||||
|
||||
return snd;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_create
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_sound_t *fmsynthsnd_create(void)
|
||||
{
|
||||
FAR fmsynth_sound_t *ret;
|
||||
ret = (FAR fmsynth_sound_t *)malloc(sizeof(fmsynth_sound_t));
|
||||
|
||||
if (ret)
|
||||
{
|
||||
create_fmsynthsnd(ret);
|
||||
ret->own_allocate = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_delete
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthsnd_delete(FAR fmsynth_sound_t *snd)
|
||||
{
|
||||
if (snd != NULL && snd->own_allocate == 1)
|
||||
{
|
||||
free(snd);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_set_operator
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthsnd_set_operator(FAR fmsynth_sound_t *snd, FAR fmsynth_op_t *op)
|
||||
{
|
||||
snd->operators = op;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_set_soundfreq
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthsnd_set_soundfreq(FAR fmsynth_sound_t *snd, float freq)
|
||||
{
|
||||
FAR fmsynth_op_t *op;
|
||||
|
||||
for (op = snd->operators; op != NULL; op = op->parallelop)
|
||||
{
|
||||
fmsynthop_set_soundfreq(op, freq);
|
||||
fmsynthop_start(op);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_stop
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthsnd_stop(FAR fmsynth_sound_t *snd)
|
||||
{
|
||||
FAR fmsynth_op_t *op;
|
||||
|
||||
for (op = snd->operators; op != NULL; op = op->parallelop)
|
||||
{
|
||||
fmsynthop_stop(op);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_set_volume
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthsnd_set_volume(FAR fmsynth_sound_t *snd, float vol)
|
||||
{
|
||||
snd->volume = vol * FMSYNTH_MAX_VOLUME;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthsnd_add_subsound
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthsnd_add_subsound(FAR fmsynth_sound_t *top,
|
||||
FAR fmsynth_sound_t *sub)
|
||||
{
|
||||
FAR fmsynth_sound_t *s = top;
|
||||
|
||||
if (!top || !sub)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
for (s = top; s->next_sound; s = s->next_sound);
|
||||
|
||||
s->next_sound = sub;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynth_rendering
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynth_rendering(FAR fmsynth_sound_t *snd,
|
||||
FAR int16_t *sample, int sample_num, int chnum,
|
||||
fmsynth_tickcb_t cb, unsigned long cbarg)
|
||||
{
|
||||
int i;
|
||||
int ch;
|
||||
int out;
|
||||
FAR fmsynth_sound_t *itr;
|
||||
|
||||
for (i = 0; i < sample_num; i += chnum)
|
||||
{
|
||||
out = 0;
|
||||
for (itr = snd; itr != NULL; itr = itr->next_sound)
|
||||
{
|
||||
out = out + sound_modulate(itr);
|
||||
}
|
||||
|
||||
for (ch = 0; ch < chnum; ch++)
|
||||
{
|
||||
*sample++ = (int16_t)out;
|
||||
}
|
||||
|
||||
if (cb != NULL)
|
||||
{
|
||||
cb(cbarg);
|
||||
}
|
||||
}
|
||||
|
||||
if (i > sample_num)
|
||||
{
|
||||
i -= chnum;
|
||||
}
|
||||
|
||||
/* Return total bytes stored in the buffer */
|
||||
|
||||
return i * sizeof(int16_t);
|
||||
}
|
||||
209
audioutils/fmsynth/fmsynth_eg.c
Normal file
209
audioutils/fmsynth/fmsynth_eg.c
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/fmsynth_eg.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <audioutils/fmsynth_eg.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define CONVERT_INITVAL(lv) (int)((lv) * FMSYNTH_MAX_EGLEVEL)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: set_egparams
|
||||
****************************************************************************/
|
||||
|
||||
static int set_egparams(int fs,
|
||||
FAR fmsynth_egparam_t *param,
|
||||
FAR struct fmsynth_eglevel_s *target_level,
|
||||
FAR struct fmsynth_eglevel_s *last_level)
|
||||
{
|
||||
param->initval = CONVERT_INITVAL(last_level->level);
|
||||
param->period = fs * target_level->period_ms / 1000;
|
||||
param->diff2next = CONVERT_INITVAL(target_level->level)
|
||||
- CONVERT_INITVAL(last_level->level);
|
||||
|
||||
if (param->initval < -FMSYNTH_MAX_EGLEVEL ||
|
||||
param->initval > FMSYNTH_MAX_EGLEVEL || param->period < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: create_fmsyntheg
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_eg_t *create_fmsyntheg(FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (eg)
|
||||
{
|
||||
eg->state = EGSTATE_RELEASED;
|
||||
eg->state_counter = 0;
|
||||
for (i = 0; i < EGSTATE_MAX; i++)
|
||||
{
|
||||
eg->state_params[i].initval = 0;
|
||||
eg->state_params[i].period = 0;
|
||||
}
|
||||
|
||||
eg->state_params[EGSTATE_RELEASED].initval = FMSYNTH_MAX_EGLEVEL;
|
||||
}
|
||||
|
||||
return eg;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_create
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_eg_t *fmsyntheg_create(void)
|
||||
{
|
||||
FAR fmsynth_eg_t *ret = (FAR fmsynth_eg_t *)malloc(sizeof(fmsynth_eg_t));
|
||||
|
||||
return create_fmsyntheg(ret);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_delete
|
||||
****************************************************************************/
|
||||
|
||||
void fmsyntheg_delete(FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
if (eg != NULL)
|
||||
{
|
||||
free(eg);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_set_param
|
||||
****************************************************************************/
|
||||
|
||||
int fmsyntheg_set_param(FAR fmsynth_eg_t *eg,
|
||||
int fs, FAR fmsynth_eglevels_t *levels)
|
||||
{
|
||||
int errcnt = 0;
|
||||
|
||||
if (fs <= 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
errcnt += set_egparams(fs, &eg->state_params[EGSTATE_ATTACK],
|
||||
&levels->attack, &levels->release);
|
||||
|
||||
errcnt += set_egparams(fs, &eg->state_params[EGSTATE_DECAYBREAK],
|
||||
&levels->decaybrk, &levels->attack);
|
||||
|
||||
errcnt += set_egparams(fs, &eg->state_params[EGSTATE_DECAY],
|
||||
&levels->decay, &levels->decaybrk);
|
||||
|
||||
errcnt += set_egparams(fs, &eg->state_params[EGSTATE_SUSTAIN],
|
||||
&levels->sustain, &levels->decay);
|
||||
|
||||
errcnt += set_egparams(fs, &eg->state_params[EGSTATE_RELEASE],
|
||||
&levels->release, &levels->sustain);
|
||||
|
||||
eg->state_params[EGSTATE_RELEASED].initval =
|
||||
CONVERT_INITVAL(levels->release.level);
|
||||
|
||||
return errcnt ? ERROR : OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_start
|
||||
****************************************************************************/
|
||||
|
||||
void fmsyntheg_start(FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
eg->state = EGSTATE_ATTACK;
|
||||
eg->state_counter = 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_stop
|
||||
****************************************************************************/
|
||||
|
||||
void fmsyntheg_stop(FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
eg->state = EGSTATE_RELEASED;
|
||||
eg->state_counter = 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsyntheg_operate
|
||||
****************************************************************************/
|
||||
|
||||
int fmsyntheg_operate(FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
int val;
|
||||
FAR fmsynth_egparam_t *param = &eg->state_params[eg->state];
|
||||
|
||||
val = param->initval;
|
||||
|
||||
if (eg->state != EGSTATE_RELEASED)
|
||||
{
|
||||
if (eg->state_counter >= eg->state_params[eg->state].period)
|
||||
{
|
||||
/* Reset the counter */
|
||||
|
||||
eg->state_counter = 0;
|
||||
|
||||
/* Search next available state */
|
||||
|
||||
do
|
||||
{
|
||||
eg->state++;
|
||||
}
|
||||
while (eg->state < EGSTATE_RELEASED
|
||||
&& eg->state_params[eg->state].period == 0);
|
||||
|
||||
val = eg->state_params[eg->state].initval;
|
||||
}
|
||||
else
|
||||
{
|
||||
val = val + param->diff2next * eg->state_counter / param->period;
|
||||
eg->state_counter++;
|
||||
}
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
548
audioutils/fmsynth/fmsynth_op.c
Normal file
548
audioutils/fmsynth/fmsynth_op.c
Normal file
|
|
@ -0,0 +1,548 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/fmsynth_op.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <audioutils/fmsynth_op.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define PHASE_ADJUST(th) \
|
||||
(((th) < 0 ? (FMSYNTH_PI) - (th) : (th)) % (FMSYNTH_PI * 2))
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const short s_sintbl[] =
|
||||
{
|
||||
0xff37, /* Extra data for linear completion */
|
||||
|
||||
/* Actual sin table of half PI [256] */
|
||||
|
||||
0x0000, 0x00c9, 0x0192, 0x025b,
|
||||
0x0324, 0x03ed, 0x04b6, 0x057e,
|
||||
0x0647, 0x0710, 0x07d9, 0x08a1,
|
||||
0x096a, 0x0a32, 0x0afb, 0x0bc3,
|
||||
0x0c8b, 0x0d53, 0x0e1b, 0x0ee3,
|
||||
0x0fab, 0x1072, 0x1139, 0x1200,
|
||||
0x12c7, 0x138e, 0x1455, 0x151b,
|
||||
0x15e1, 0x16a7, 0x176d, 0x1833,
|
||||
0x18f8, 0x19bd, 0x1a82, 0x1b46,
|
||||
0x1c0b, 0x1ccf, 0x1d93, 0x1e56,
|
||||
0x1f19, 0x1fdc, 0x209f, 0x2161,
|
||||
0x2223, 0x22e4, 0x23a6, 0x2467,
|
||||
0x2527, 0x25e7, 0x26a7, 0x2767,
|
||||
0x2826, 0x28e5, 0x29a3, 0x2a61,
|
||||
0x2b1e, 0x2bdb, 0x2c98, 0x2d54,
|
||||
0x2e10, 0x2ecc, 0x2f86, 0x3041,
|
||||
0x30fb, 0x31b4, 0x326d, 0x3326,
|
||||
0x33de, 0x3496, 0x354d, 0x3603,
|
||||
0x36b9, 0x376f, 0x3824, 0x38d8,
|
||||
0x398c, 0x3a3f, 0x3af2, 0x3ba4,
|
||||
0x3c56, 0x3d07, 0x3db7, 0x3e67,
|
||||
0x3f16, 0x3fc5, 0x4073, 0x4120,
|
||||
0x41cd, 0x4279, 0x4325, 0x43d0,
|
||||
0x447a, 0x4523, 0x45cc, 0x4674,
|
||||
0x471c, 0x47c3, 0x4869, 0x490e,
|
||||
0x49b3, 0x4a57, 0x4afa, 0x4b9d,
|
||||
0x4c3f, 0x4ce0, 0x4d80, 0x4e20,
|
||||
0x4ebf, 0x4f5d, 0x4ffa, 0x5097,
|
||||
0x5133, 0x51ce, 0x5268, 0x5301,
|
||||
0x539a, 0x5432, 0x54c9, 0x555f,
|
||||
0x55f4, 0x5689, 0x571d, 0x57b0,
|
||||
0x5842, 0x58d3, 0x5963, 0x59f3,
|
||||
0x5a81, 0x5b0f, 0x5b9c, 0x5c28,
|
||||
0x5cb3, 0x5d3d, 0x5dc6, 0x5e4f,
|
||||
0x5ed6, 0x5f5d, 0x5fe2, 0x6067,
|
||||
0x60eb, 0x616e, 0x61f0, 0x6271,
|
||||
0x62f1, 0x6370, 0x63ee, 0x646b,
|
||||
0x64e7, 0x6562, 0x65dd, 0x6656,
|
||||
0x66ce, 0x6745, 0x67bc, 0x6831,
|
||||
0x68a5, 0x6919, 0x698b, 0x69fc,
|
||||
0x6a6c, 0x6adb, 0x6b4a, 0x6bb7,
|
||||
0x6c23, 0x6c8e, 0x6cf8, 0x6d61,
|
||||
0x6dc9, 0x6e30, 0x6e95, 0x6efa,
|
||||
0x6f5e, 0x6fc0, 0x7022, 0x7082,
|
||||
0x70e1, 0x7140, 0x719d, 0x71f9,
|
||||
0x7254, 0x72ae, 0x7306, 0x735e,
|
||||
0x73b5, 0x740a, 0x745e, 0x74b1,
|
||||
0x7503, 0x7554, 0x75a4, 0x75f3,
|
||||
0x7640, 0x768d, 0x76d8, 0x7722,
|
||||
0x776b, 0x77b3, 0x77f9, 0x783f,
|
||||
0x7883, 0x78c6, 0x7908, 0x7949,
|
||||
0x7989, 0x79c7, 0x7a04, 0x7a41,
|
||||
0x7a7c, 0x7ab5, 0x7aee, 0x7b25,
|
||||
0x7b5c, 0x7b91, 0x7bc4, 0x7bf7,
|
||||
0x7c29, 0x7c59, 0x7c88, 0x7cb6,
|
||||
0x7ce2, 0x7d0e, 0x7d38, 0x7d61,
|
||||
0x7d89, 0x7db0, 0x7dd5, 0x7df9,
|
||||
0x7e1c, 0x7e3e, 0x7e5e, 0x7e7e,
|
||||
0x7e9c, 0x7eb9, 0x7ed4, 0x7eef,
|
||||
0x7f08, 0x7f20, 0x7f37, 0x7f4c,
|
||||
0x7f61, 0x7f74, 0x7f86, 0x7f96,
|
||||
0x7fa6, 0x7fb4, 0x7fc1, 0x7fcd,
|
||||
0x7fd7, 0x7fe0, 0x7fe8, 0x7fef,
|
||||
0x7ff5, 0x7ff9, 0x7ffc, 0x7ffe,
|
||||
|
||||
0x7fff, /* Extra data for linear completion */
|
||||
};
|
||||
|
||||
static int local_fs;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: pseudo_sin256
|
||||
****************************************************************************/
|
||||
|
||||
static int pseudo_sin256(int theta)
|
||||
{
|
||||
int short_sin;
|
||||
int rest;
|
||||
int phase;
|
||||
int tblidx;
|
||||
|
||||
theta = PHASE_ADJUST(theta);
|
||||
|
||||
rest = theta & 0x7f;
|
||||
phase = theta / (FMSYNTH_PI / 2);
|
||||
tblidx = (theta % (FMSYNTH_PI / 2)) >> 7;
|
||||
|
||||
if (phase & 0x01)
|
||||
{
|
||||
tblidx = 257 - tblidx;
|
||||
short_sin = s_sintbl[tblidx];
|
||||
short_sin = short_sin
|
||||
+ (((s_sintbl[tblidx - 1] - short_sin) * rest) >> 7);
|
||||
}
|
||||
else
|
||||
{
|
||||
short_sin = s_sintbl[tblidx + 1];
|
||||
short_sin = short_sin
|
||||
+ (((s_sintbl[tblidx + 2] - short_sin) * rest) >> 7);
|
||||
}
|
||||
|
||||
return phase & 0x02 ? -short_sin : short_sin;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: triangle_wave
|
||||
****************************************************************************/
|
||||
|
||||
static int triangle_wave(int theta)
|
||||
{
|
||||
int ret = 0;
|
||||
int phase;
|
||||
int offset;
|
||||
int slope;
|
||||
|
||||
theta = PHASE_ADJUST(theta);
|
||||
phase = theta / (FMSYNTH_PI / 2);
|
||||
offset = theta % (FMSYNTH_PI / 2);
|
||||
|
||||
switch (phase)
|
||||
{
|
||||
case 0:
|
||||
ret = 0;
|
||||
slope = SHRT_MAX;
|
||||
break;
|
||||
case 1:
|
||||
ret = SHRT_MAX;
|
||||
slope = -SHRT_MAX;
|
||||
break;
|
||||
case 2:
|
||||
ret = 0;
|
||||
slope = -SHRT_MAX;
|
||||
break;
|
||||
case 3:
|
||||
ret = -SHRT_MAX;
|
||||
slope = SHRT_MAX;
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
slope = SHRT_MAX;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret + ((slope * offset) >> 15);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: sawtooth_wave
|
||||
****************************************************************************/
|
||||
|
||||
static int sawtooth_wave(int theta)
|
||||
{
|
||||
theta = PHASE_ADJUST(theta);
|
||||
return (theta >> 1) - SHRT_MAX;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: square_wave
|
||||
****************************************************************************/
|
||||
|
||||
static int square_wave(int theta)
|
||||
{
|
||||
theta = PHASE_ADJUST(theta);
|
||||
return theta < FMSYNTH_PI ? SHRT_MAX : -SHRT_MAX;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: update_parameters
|
||||
****************************************************************************/
|
||||
|
||||
static void update_parameters(FAR fmsynth_op_t *op)
|
||||
{
|
||||
if (local_fs != 0)
|
||||
{
|
||||
op->delta_phase = 2 * FMSYNTH_PI * op->sound_freq * op->freq_rate
|
||||
/ (float)local_fs;
|
||||
}
|
||||
else
|
||||
{
|
||||
op->delta_phase = 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_set_samplerate
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_set_samplerate(int fs)
|
||||
{
|
||||
if (fs < 0)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
local_fs = fs;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: create_fmsynthop
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_op_t *create_fmsynthop(FAR fmsynth_op_t *op,
|
||||
FAR fmsynth_eg_t *eg)
|
||||
{
|
||||
if (op)
|
||||
{
|
||||
op->eg = eg;
|
||||
|
||||
op->own_allocate = 0;
|
||||
op->wavegen = NULL;
|
||||
op->cascadeop = NULL;
|
||||
op->parallelop = NULL;
|
||||
op->feedback_ref = NULL;
|
||||
op->feedback_val = 0;
|
||||
op->feedbackrate = 0;
|
||||
op->last_sigval = 0;
|
||||
op->freq_rate = 1.f;
|
||||
op->sound_freq = 0.f;
|
||||
op->delta_phase = 0.f;
|
||||
op->current_phase = 0.f;
|
||||
}
|
||||
|
||||
return op;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_create
|
||||
****************************************************************************/
|
||||
|
||||
FAR fmsynth_op_t *fmsynthop_create(void)
|
||||
{
|
||||
FAR fmsynth_op_t *ret;
|
||||
|
||||
ret = (FAR fmsynth_op_t *)malloc(sizeof(fmsynth_op_t));
|
||||
|
||||
if (ret)
|
||||
{
|
||||
ret->eg = fmsyntheg_create();
|
||||
if (!ret->eg)
|
||||
{
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
create_fmsynthop(ret, ret->eg);
|
||||
ret->own_allocate = 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_delete
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthop_delete(FAR fmsynth_op_t *op)
|
||||
{
|
||||
if (op != NULL && op->own_allocate == 1)
|
||||
{
|
||||
if (op->eg)
|
||||
{
|
||||
fmsyntheg_delete(op->eg);
|
||||
}
|
||||
|
||||
free(op);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_select_opfunc
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_select_opfunc(FAR fmsynth_op_t *op, int type)
|
||||
{
|
||||
int ret = ERROR;
|
||||
|
||||
if (op != NULL)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case FMSYNTH_OPFUNC_SIN:
|
||||
op->wavegen = pseudo_sin256;
|
||||
ret = OK;
|
||||
break;
|
||||
|
||||
case FMSYNTH_OPFUNC_TRIANGLE:
|
||||
op->wavegen = triangle_wave;
|
||||
ret = OK;
|
||||
break;
|
||||
|
||||
case FMSYNTH_OPFUNC_SAWTOOTH:
|
||||
op->wavegen = sawtooth_wave;
|
||||
ret = OK;
|
||||
break;
|
||||
|
||||
case FMSYNTH_OPFUNC_SQUARE:
|
||||
op->wavegen = square_wave;
|
||||
ret = OK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_set_envelope
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_set_envelope(FAR fmsynth_op_t *op,
|
||||
FAR fmsynth_eglevels_t *levels)
|
||||
{
|
||||
if (local_fs >= 0 && op && levels)
|
||||
{
|
||||
return fmsyntheg_set_param(op->eg, local_fs, levels);
|
||||
}
|
||||
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_cascade_subop
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_cascade_subop(FAR fmsynth_op_t *op,
|
||||
FAR fmsynth_op_t *subop)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
if (!op || !subop)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
for (tmp = op; tmp->cascadeop; tmp = tmp->cascadeop);
|
||||
|
||||
tmp->cascadeop = subop;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_parallel_subop
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_parallel_subop(FAR fmsynth_op_t *op,
|
||||
FAR fmsynth_op_t *subop)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
if (!op || !subop)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
for (tmp = op; tmp->parallelop; tmp = tmp->parallelop);
|
||||
|
||||
tmp->parallelop = subop;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_bind_feedback
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_bind_feedback(FAR fmsynth_op_t *op,
|
||||
FAR fmsynth_op_t *subop, float ratio)
|
||||
{
|
||||
if (!op || !subop)
|
||||
{
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
op->feedbackrate = (int)((float)FMSYNTH_MAX_EGLEVEL * ratio);
|
||||
op->feedback_ref = &subop->last_sigval;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_update_feedback
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_update_feedback(FAR fmsynth_op_t *op)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
for (tmp = op->cascadeop; tmp != NULL; tmp = tmp->parallelop)
|
||||
{
|
||||
fmsynthop_update_feedback(tmp);
|
||||
}
|
||||
|
||||
if (op->feedback_ref)
|
||||
{
|
||||
op->feedback_val = *op->feedback_ref * op->feedbackrate
|
||||
/ FMSYNTH_MAX_EGLEVEL;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_set_soundfreq
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthop_set_soundfreq(FAR fmsynth_op_t *op, float freq)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
op->sound_freq = freq;
|
||||
update_parameters(op);
|
||||
|
||||
for (tmp = op->cascadeop; tmp != NULL; tmp = tmp->parallelop)
|
||||
{
|
||||
fmsynthop_set_soundfreq(tmp, freq);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_set_soundfreqrate
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthop_set_soundfreqrate(FAR fmsynth_op_t *op, float rate)
|
||||
{
|
||||
op->freq_rate = rate;
|
||||
update_parameters(op);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_start
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthop_start(FAR fmsynth_op_t *op)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
fmsyntheg_start(op->eg);
|
||||
|
||||
for (tmp = op->cascadeop; tmp; tmp = tmp->parallelop)
|
||||
{
|
||||
fmsynthop_start(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_stop
|
||||
****************************************************************************/
|
||||
|
||||
void fmsynthop_stop(FAR fmsynth_op_t *op)
|
||||
{
|
||||
FAR fmsynth_op_t *tmp;
|
||||
|
||||
fmsyntheg_stop(op->eg);
|
||||
|
||||
for (tmp = op->cascadeop; tmp; tmp = tmp->parallelop)
|
||||
{
|
||||
fmsynthop_stop(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: fmsynthop_operate
|
||||
****************************************************************************/
|
||||
|
||||
int fmsynthop_operate(FAR fmsynth_op_t *op, int phase_time)
|
||||
{
|
||||
int val;
|
||||
int val2;
|
||||
int phase;
|
||||
FAR fmsynth_op_t *subop;
|
||||
|
||||
op->current_phase = phase_time ? op->current_phase + op->delta_phase : 0.f;
|
||||
|
||||
val = (int)op->current_phase;
|
||||
val2 = (val / (2 * FMSYNTH_PI));
|
||||
|
||||
phase = (int)val + op->feedback_val;
|
||||
op->current_phase = op->current_phase - (float)(val2 * (2 * FMSYNTH_PI));
|
||||
|
||||
subop = op->cascadeop;
|
||||
|
||||
while (subop)
|
||||
{
|
||||
phase += fmsynthop_operate(subop, phase_time);
|
||||
subop = subop->parallelop;
|
||||
}
|
||||
|
||||
op->last_sigval = fmsyntheg_operate(op->eg) * op->wavegen(phase)
|
||||
/ FMSYNTH_MAX_EGLEVEL;
|
||||
|
||||
return op->last_sigval;
|
||||
}
|
||||
5
audioutils/fmsynth/test/.gitignore
vendored
Normal file
5
audioutils/fmsynth/test/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
/fmsynth_alsa
|
||||
/fmsynth_test
|
||||
/fmsyntheg_test
|
||||
/fmsynthop_test
|
||||
/opfunctest
|
||||
46
audioutils/fmsynth/test/Makefile
Normal file
46
audioutils/fmsynth/test/Makefile
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
############################################################################
|
||||
# apps/audioutils/fmsynth/test/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
SRCS = ../fmsynth_eg.c ../fmsynth_op.c ../fmsynth.c
|
||||
CFLAGS = -DFAR= -DCODE= -DOK=0 -DERROR=-1 -I .. -I ../../../include -g
|
||||
|
||||
TARGETS = opfunctest fmsyntheg_test fmsynthop_test fmsynth_test fmsynth_alsa
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
opfunctest: $(SRCS) opfunc_test.c
|
||||
gcc $(CFLAGS) -o $@ $^ -lm
|
||||
|
||||
fmsyntheg_test: $(SRCS) fmsynth_eg_test.c
|
||||
gcc $(CFLAGS) -o $@ $^
|
||||
|
||||
fmsynthop_test: $(SRCS) fmsynth_op_test.c
|
||||
gcc $(CFLAGS) -o $@ $^
|
||||
|
||||
fmsynth_test: $(SRCS) fmsynth_test.c
|
||||
gcc $(CFLAGS) -o $@ $^
|
||||
|
||||
fmsynth_alsa: $(SRCS) fmsynth_alsa_test.c
|
||||
gcc $(CFLAGS) -o $@ $^ -lasound
|
||||
|
||||
clean:
|
||||
rm -rf $(TARGETS)
|
||||
326
audioutils/fmsynth/test/fmsynth_alsa_test.c
Normal file
326
audioutils/fmsynth/test/fmsynth_alsa_test.c
Normal file
|
|
@ -0,0 +1,326 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/test/fmsynth_alsa_test.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <termios.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
#include <audioutils/fmsynth_eg.h>
|
||||
#include <audioutils/fmsynth_op.h>
|
||||
#include <audioutils/fmsynth.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define FS (48000)
|
||||
|
||||
#define CHANNEL_NUM (2)
|
||||
#define RESAMPLING_ALSA (1)
|
||||
#define LATENCY_ALSA (10000)
|
||||
|
||||
#define SAMPLE_NUM (FS / 20)
|
||||
#define BUFF_LENGTH (SAMPLE_NUM * CHANNEL_NUM)
|
||||
|
||||
#define CODE_C_FREQ (261.625565f)
|
||||
#define CODE_D_FREQ (293.6647674f)
|
||||
#define CODE_E_FREQ (329.6275561f)
|
||||
#define CODE_F_FREQ (349.2282305f)
|
||||
#define CODE_G_FREQ (391.9954347f)
|
||||
#define CODE_A_FREQ (440.f)
|
||||
#define CODE_B_FREQ (493.8833009f)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static int16_t samples[BUFF_LENGTH];
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: init_alsa
|
||||
****************************************************************************/
|
||||
|
||||
static snd_pcm_t *init_alsa(int fs)
|
||||
{
|
||||
int ret;
|
||||
snd_pcm_t *hndl = NULL;
|
||||
|
||||
ret = snd_pcm_open(&hndl, "default", SND_PCM_STREAM_PLAYBACK, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("sdn_pcm_open error\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = snd_pcm_set_params(hndl,
|
||||
SND_PCM_FORMAT_S16,
|
||||
SND_PCM_ACCESS_RW_INTERLEAVED,
|
||||
CHANNEL_NUM, fs, RESAMPLING_ALSA, LATENCY_ALSA);
|
||||
if (ret != 0)
|
||||
{
|
||||
printf("sdn_pcm_set_params error\n");
|
||||
snd_pcm_close(hndl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return hndl;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: set_nonblocking
|
||||
****************************************************************************/
|
||||
|
||||
static int set_nonblocking(struct termios *saved)
|
||||
{
|
||||
struct termios settings;
|
||||
|
||||
tcgetattr(0, saved);
|
||||
settings = *saved;
|
||||
|
||||
settings.c_lflag &= ~(ECHO | ICANON);
|
||||
settings.c_cc[VTIME] = 0;
|
||||
settings.c_cc[VMIN] = 1;
|
||||
tcsetattr(0, TCSANOW, &settings);
|
||||
fcntl(0, F_SETFL, O_NONBLOCK);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: store_setting
|
||||
****************************************************************************/
|
||||
|
||||
static void store_setting(struct termios *saved)
|
||||
{
|
||||
tcsetattr(0, TCSANOW, saved);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: set_levels
|
||||
****************************************************************************/
|
||||
|
||||
static fmsynth_eglevels_t *set_levels(fmsynth_eglevels_t *level,
|
||||
float atk_lvl, int atk_peri,
|
||||
float decbrk_lvl, int decbrk_peri,
|
||||
float dec_lvl, int dec_peri,
|
||||
float sus_lvl, int sus_peri,
|
||||
float rel_lvl, int rel_peri)
|
||||
{
|
||||
level->attack.level = atk_lvl;
|
||||
level->attack.period_ms = atk_peri;
|
||||
level->decaybrk.level = decbrk_lvl;
|
||||
level->decaybrk.period_ms = decbrk_peri;
|
||||
level->decay.level = dec_lvl;
|
||||
level->decay.period_ms = dec_peri;
|
||||
level->sustain.level = sus_lvl;
|
||||
level->sustain.period_ms = sus_peri;
|
||||
level->release.level = rel_lvl;
|
||||
level->release.period_ms = rel_peri;
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: main
|
||||
****************************************************************************/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int running;
|
||||
int dump_count = 0;
|
||||
int dump_enable = 0;
|
||||
|
||||
fmsynth_eglevels_t levels;
|
||||
fmsynth_sound_t *snd1;
|
||||
fmsynth_op_t *envop;
|
||||
fmsynth_op_t *fbop;
|
||||
snd_pcm_t *hndl = NULL;
|
||||
|
||||
struct termios save_param;
|
||||
|
||||
hndl = init_alsa(FS);
|
||||
if (!hndl)
|
||||
{
|
||||
printf("Init alsa error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialize FM synthesizer */
|
||||
|
||||
fmsynth_initialize(FS);
|
||||
|
||||
/* Operator setup */
|
||||
|
||||
envop = fmsynthop_create();
|
||||
fbop = fmsynthop_create();
|
||||
|
||||
set_levels(&levels, 0.6f, 100, 0.3f, 300, 0.1f, 500, 0.f, 0, 0.f, 70);
|
||||
|
||||
fmsynthop_set_envelope(envop, &levels);
|
||||
fmsynthop_select_opfunc(envop, FMSYNTH_OPFUNC_SIN);
|
||||
|
||||
fmsynthop_set_envelope(fbop, &levels);
|
||||
fmsynthop_select_opfunc(fbop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_bind_feedback(fbop, fbop, 0.6f);
|
||||
|
||||
fmsynthop_parallel_subop(envop, fbop);
|
||||
|
||||
/* Sound setup */
|
||||
|
||||
snd1 = fmsynthsnd_create();
|
||||
fmsynthsnd_set_operator(snd1, envop);
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_C_FREQ);
|
||||
|
||||
set_nonblocking(&save_param);
|
||||
running = 1;
|
||||
while (running)
|
||||
{
|
||||
switch (getchar())
|
||||
{
|
||||
case 'c':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_C_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Do\n");
|
||||
break;
|
||||
case 'd':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_D_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Le\n");
|
||||
break;
|
||||
case 'e':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_E_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Mi\n");
|
||||
break;
|
||||
case 'f':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_F_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Fha\n");
|
||||
break;
|
||||
case 'g':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_G_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("So\n");
|
||||
break;
|
||||
case 'a':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_A_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Ra\n");
|
||||
break;
|
||||
case 'b':
|
||||
fmsynthsnd_set_soundfreq(snd1, CODE_B_FREQ);
|
||||
if (dump_enable)
|
||||
{
|
||||
dump_count = FS;
|
||||
dump_enable = 0;
|
||||
printf("DUMP: ");
|
||||
}
|
||||
|
||||
printf("Shi\n");
|
||||
break;
|
||||
case 'z':
|
||||
dump_enable = 1;
|
||||
printf("Dump next code\n");
|
||||
break;
|
||||
case 'q':
|
||||
running = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
fmsynth_rendering(snd1, samples, BUFF_LENGTH, CHANNEL_NUM, NULL, 0);
|
||||
|
||||
if (dump_count)
|
||||
{
|
||||
for (int i = 0; i < BUFF_LENGTH; i += 2)
|
||||
{
|
||||
printf("%d\n", samples[i]);
|
||||
}
|
||||
|
||||
dump_count -= SAMPLE_NUM;
|
||||
}
|
||||
|
||||
snd_pcm_writei(hndl, samples, SAMPLE_NUM);
|
||||
}
|
||||
|
||||
snd_pcm_drain(hndl);
|
||||
snd_pcm_close(hndl);
|
||||
|
||||
fmsynthop_delete(envop);
|
||||
fmsynthop_delete(fbop);
|
||||
|
||||
fmsynthsnd_delete(snd1);
|
||||
|
||||
store_setting(&save_param);
|
||||
|
||||
return 0;
|
||||
}
|
||||
129
audioutils/fmsynth/test/fmsynth_eg_test.c
Normal file
129
audioutils/fmsynth/test/fmsynth_eg_test.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/test/fmsynth_eg_test.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <audioutils/fmsynth_eg.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define FS (48000)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: state_name
|
||||
****************************************************************************/
|
||||
|
||||
static const char *state_name(int s)
|
||||
{
|
||||
switch (s)
|
||||
{
|
||||
case EGSTATE_ATTACK:
|
||||
return "Attack ";
|
||||
case EGSTATE_DECAYBREAK:
|
||||
return "DecayBreak";
|
||||
case EGSTATE_DECAY:
|
||||
return "Decay ";
|
||||
case EGSTATE_SUSTAIN:
|
||||
return "Sustain ";
|
||||
case EGSTATE_RELEASE:
|
||||
return "Release ";
|
||||
case EGSTATE_RELEASED:
|
||||
case -1:
|
||||
return "RELEASED..";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: dump_eg
|
||||
****************************************************************************/
|
||||
|
||||
static void dump_eg(fmsynth_eg_t *env)
|
||||
{
|
||||
int i;
|
||||
fmsynth_egparam_t *last = &env->state_params[EGSTATE_RELEASED];
|
||||
|
||||
printf("===== STATE : %s =======\n", state_name(env->state));
|
||||
for (i = -1; i < EGSTATE_RELEASED; i++)
|
||||
{
|
||||
printf(" [%s] %5d <--------------> [%s] %5d\n",
|
||||
state_name(i), last->initval,
|
||||
state_name(i + 1), env->state_params[i + 1].initval);
|
||||
printf(" per %d\n", env->state_params[i + 1].period);
|
||||
printf(" dlt %d\n", env->state_params[i + 1].diff2next);
|
||||
last = &env->state_params[i + 1];
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: main
|
||||
****************************************************************************/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
fmsynth_eg_t *eg;
|
||||
fmsynth_eglevels_t levels;
|
||||
|
||||
levels.attack.level = 0.6f;
|
||||
levels.attack.period_ms = 10;
|
||||
levels.decaybrk.level = 0.3f;
|
||||
levels.decaybrk.period_ms = 20;
|
||||
levels.decay.level = 0.5f;
|
||||
levels.decay.period_ms = 15;
|
||||
levels.sustain.level = 0.65f;
|
||||
levels.sustain.period_ms = 5;
|
||||
levels.release.level = 0.f;
|
||||
levels.release.period_ms = 70;
|
||||
|
||||
eg = fmsyntheg_create();
|
||||
fmsyntheg_set_param(eg, FS, &levels);
|
||||
dump_eg(eg);
|
||||
|
||||
fmsyntheg_start(eg);
|
||||
dump_eg(eg);
|
||||
|
||||
while (eg->state != EGSTATE_RELEASED)
|
||||
{
|
||||
printf("%d\n", fmsyntheg_operate(eg));
|
||||
}
|
||||
|
||||
fmsyntheg_delete(eg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
145
audioutils/fmsynth/test/fmsynth_op_test.c
Normal file
145
audioutils/fmsynth/test/fmsynth_op_test.c
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/test/fmsynth_op_test.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <audioutils/fmsynth_op.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define FS (48000)
|
||||
#define SOUNDFREQ (261.f)
|
||||
#define TEST_LOOP (FS * (30 + 10 + 100 + 30 + 1) / 1000)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: set_levels
|
||||
****************************************************************************/
|
||||
|
||||
static fmsynth_eglevels_t *set_levels(fmsynth_eglevels_t *level,
|
||||
float atk_lvl, int atk_peri,
|
||||
float decbrk_lvl, int decbrk_peri,
|
||||
float dec_lvl, int dec_peri,
|
||||
float sus_lvl, int sus_peri,
|
||||
float rel_lvl, int rel_peri)
|
||||
{
|
||||
level->attack.level = atk_lvl;
|
||||
level->attack.period_ms = atk_peri;
|
||||
level->decaybrk.level = decbrk_lvl;
|
||||
level->decaybrk.period_ms = decbrk_peri;
|
||||
level->decay.level = dec_lvl;
|
||||
level->decay.period_ms = dec_peri;
|
||||
level->sustain.level = sus_lvl;
|
||||
level->sustain.period_ms = sus_peri;
|
||||
level->release.level = rel_lvl;
|
||||
level->release.period_ms = rel_peri;
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: main
|
||||
****************************************************************************/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int phase_time;
|
||||
fmsynth_eglevels_t levels;
|
||||
|
||||
fmsynth_op_t *envop;
|
||||
fmsynth_op_t *fbop;
|
||||
fmsynth_op_t *triop;
|
||||
fmsynth_op_t *mainop;
|
||||
fmsynth_op_t *subop;
|
||||
|
||||
fmsynth_op_t *conv1;
|
||||
fmsynth_op_t *conv2;
|
||||
|
||||
phase_time = 0;
|
||||
fmsynthop_set_samplerate(FS);
|
||||
|
||||
set_levels(&levels, 0.12f, 10, 0.06f, 20, 0.1f, 16, 0.1f, 5, 0.f, 70);
|
||||
|
||||
envop = fmsynthop_create();
|
||||
fmsynthop_set_envelope(envop, &levels);
|
||||
fmsynthop_select_opfunc(envop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_set_soundfreq(envop, SOUNDFREQ);
|
||||
fmsynthop_start(envop);
|
||||
|
||||
triop = fmsynthop_create();
|
||||
fmsynthop_select_opfunc(triop, FMSYNTH_OPFUNC_TRIANGLE);
|
||||
fmsynthop_set_soundfreq(triop, SOUNDFREQ);
|
||||
fmsynthop_start(triop);
|
||||
|
||||
fbop = fmsynthop_create();
|
||||
fmsynthop_select_opfunc(fbop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_set_soundfreq(fbop, SOUNDFREQ);
|
||||
fmsynthop_bind_feedback(fbop, fbop, 0.6f);
|
||||
fmsynthop_start(fbop);
|
||||
|
||||
mainop = fmsynthop_create();
|
||||
subop = fmsynthop_create();
|
||||
fmsynthop_select_opfunc(mainop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_select_opfunc(subop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_cascade_subop(mainop, subop);
|
||||
fmsynthop_set_soundfreq(mainop, SOUNDFREQ);
|
||||
fmsynthop_set_soundfreqrate(subop, 2.f);
|
||||
fmsynthop_start(mainop);
|
||||
|
||||
printf("idx,EnvTest,FeedbackTest,CascadeTest,Triangle\n");
|
||||
while (phase_time < TEST_LOOP)
|
||||
{
|
||||
fmsynthop_update_feedback(envop);
|
||||
fmsynthop_update_feedback(fbop);
|
||||
fmsynthop_update_feedback(mainop);
|
||||
fmsynthop_update_feedback(triop);
|
||||
|
||||
printf("%d,%d,%d,%d,%d\n",
|
||||
phase_time,
|
||||
fmsynthop_operate(envop, phase_time),
|
||||
fmsynthop_operate(fbop, phase_time),
|
||||
fmsynthop_operate(mainop, phase_time),
|
||||
fmsynthop_operate(triop, phase_time));
|
||||
|
||||
phase_time++;
|
||||
}
|
||||
|
||||
fmsynthop_delete(envop);
|
||||
fmsynthop_delete(fbop);
|
||||
fmsynthop_delete(mainop);
|
||||
fmsynthop_delete(subop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
132
audioutils/fmsynth/test/fmsynth_test.c
Normal file
132
audioutils/fmsynth/test/fmsynth_test.c
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/test/fmsynth_test.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <audioutils/fmsynth_eg.h>
|
||||
#include <audioutils/fmsynth_op.h>
|
||||
#include <audioutils/fmsynth.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define FS (48000)
|
||||
#define SOUNDFREQ (3000.f)
|
||||
#define TEST_LENGTH ((FS / 1000) * (10 + 20 + 16 + 5 + 30))
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static int16_t my_sample[TEST_LENGTH];
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: set_levels
|
||||
****************************************************************************/
|
||||
|
||||
static fmsynth_eglevels_t *set_levels(fmsynth_eglevels_t *level,
|
||||
int atk_lvl, int atk_peri,
|
||||
int decbrk_lvl, int decbrk_peri,
|
||||
int dec_lvl, int dec_peri,
|
||||
int sus_lvl, int sus_peri,
|
||||
int rel_lvl, int rel_peri)
|
||||
{
|
||||
level->attack.level = atk_lvl;
|
||||
level->attack.period_ms = atk_peri;
|
||||
level->decaybrk.level = decbrk_lvl;
|
||||
level->decaybrk.period_ms = decbrk_peri;
|
||||
level->decay.level = dec_lvl;
|
||||
level->decay.period_ms = dec_peri;
|
||||
level->sustain.level = sus_lvl;
|
||||
level->sustain.period_ms = sus_peri;
|
||||
level->release.level = rel_lvl;
|
||||
level->release.period_ms = rel_peri;
|
||||
|
||||
return level;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: main
|
||||
****************************************************************************/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int phase_time;
|
||||
|
||||
fmsynth_eglevels_t levels;
|
||||
fmsynth_sound_t *snd1;
|
||||
fmsynth_op_t *envop;
|
||||
fmsynth_op_t *fbop;
|
||||
|
||||
/* Initialize FM synthesizer */
|
||||
|
||||
fmsynth_initialize(FS);
|
||||
|
||||
/* Operator setup */
|
||||
|
||||
envop = fmsynthop_create();
|
||||
fbop = fmsynthop_create();
|
||||
|
||||
set_levels(&levels, 0.12f, 10, 0.06f, 20, 0.1f, 16, 0.1f, 5, 0.f, 70);
|
||||
|
||||
fmsynthop_set_envelope(envop, &levels);
|
||||
fmsynthop_select_opfunc(envop, FMSYNTH_OPFUNC_SIN);
|
||||
|
||||
fmsynthop_select_opfunc(fbop, FMSYNTH_OPFUNC_SIN);
|
||||
fmsynthop_bind_feedback(fbop, fbop, 0.6f);
|
||||
|
||||
fmsynthop_parallel_subop(envop, fbop);
|
||||
|
||||
/* Sound setup */
|
||||
|
||||
snd1 = fmsynthsnd_create();
|
||||
fmsynthsnd_set_operator(snd1, envop);
|
||||
fmsynthsnd_set_soundfreq(snd1, SOUNDFREQ);
|
||||
|
||||
fmsynth_rendering(snd1, my_sample, TEST_LENGTH, 1, NULL, 0);
|
||||
|
||||
for (int i = 0; i < TEST_LENGTH; i++)
|
||||
{
|
||||
printf("%d\n", my_sample[i]);
|
||||
}
|
||||
|
||||
fmsynthop_delete(envop);
|
||||
fmsynthop_delete(fbop);
|
||||
|
||||
fmsynthsnd_delete(snd1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
167
audioutils/fmsynth/test/opfunc_test.c
Normal file
167
audioutils/fmsynth/test/opfunc_test.c
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/fmsynth/test/opfunc_test.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <audioutils/fmsynth_op.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define FS (48000)
|
||||
#define DUMP_PERIOD (FS * 3 / 2000)
|
||||
#define ACCURACY_TEST_PERIOD (FS * 3)
|
||||
|
||||
#define HZ (4186)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static opfunc_t func_sin;
|
||||
static opfunc_t func_tri;
|
||||
static opfunc_t func_saw;
|
||||
static opfunc_t func_sqa;
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: prepare_opfuncs
|
||||
****************************************************************************/
|
||||
|
||||
static void prepare_opfuncs(void)
|
||||
{
|
||||
fmsynth_op_t *op;
|
||||
|
||||
op = fmsynthop_create();
|
||||
|
||||
fmsynthop_select_opfunc(op, FMSYNTH_OPFUNC_SIN);
|
||||
func_sin = op->wavegen;
|
||||
|
||||
fmsynthop_select_opfunc(op, FMSYNTH_OPFUNC_TRIANGLE);
|
||||
func_tri = op->wavegen;
|
||||
|
||||
fmsynthop_select_opfunc(op, FMSYNTH_OPFUNC_SAWTOOTH);
|
||||
func_saw = op->wavegen;
|
||||
|
||||
fmsynthop_select_opfunc(op, FMSYNTH_OPFUNC_SQUARE);
|
||||
func_sqa = op->wavegen;
|
||||
|
||||
fmsynthop_delete(op);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: wavegen_dump
|
||||
****************************************************************************/
|
||||
|
||||
static void wavegen_dump(void)
|
||||
{
|
||||
int t;
|
||||
float deltaact;
|
||||
|
||||
deltaact = (float)FMSYNTH_PI * 2. * (float)HZ / (float)FS;
|
||||
|
||||
printf("===== Wave generator Dump ====\n");
|
||||
printf("SIN, TRIANGLE, SAWTOOTH, SQUARE\n");
|
||||
for (t = 0; t < DUMP_PERIOD; t++)
|
||||
{
|
||||
printf("%d, %d, %d, %d\n",
|
||||
func_sin((int)(deltaact * t)),
|
||||
func_tri((int)(deltaact * t)),
|
||||
func_saw((int)(deltaact * t)),
|
||||
func_sqa((int)(deltaact * t))
|
||||
);
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: sin_accuracy_test
|
||||
****************************************************************************/
|
||||
|
||||
static void sin_accuracy_test(void)
|
||||
{
|
||||
int t;
|
||||
float delta;
|
||||
float deltaact;
|
||||
float max_diff = 0.f;
|
||||
float ref_sin;
|
||||
int sin_val;
|
||||
float norm_sin;
|
||||
float diff;
|
||||
|
||||
delta = M_PI * 2. * (float)HZ / (float)FS;
|
||||
deltaact = (float)FMSYNTH_PI * 2. * (float)HZ / (float)FS;
|
||||
|
||||
printf("===== Local SIN function ACCURACY TEST ====\n");
|
||||
for (t = 0; t < ACCURACY_TEST_PERIOD; t++)
|
||||
{
|
||||
sin_val = func_sin((int)(deltaact * t));
|
||||
ref_sin = sinf(delta * t);
|
||||
|
||||
norm_sin = (float)sin_val / (float)SHRT_MAX;
|
||||
printf("t=%d, operator-sin(%d)=%d, norm_sin=%f, sinf(%f)=%f ",
|
||||
t, (int)(deltaact * t), sin_val, norm_sin, delta * t, ref_sin);
|
||||
|
||||
diff = fabsf(norm_sin - ref_sin);
|
||||
max_diff = max_diff < diff ? diff : max_diff;
|
||||
|
||||
if (diff >= 0.005)
|
||||
{
|
||||
printf(" BIG-DIFF : %f\n", diff);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n\nMAX DIFF = %f\n\n", max_diff);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: main
|
||||
****************************************************************************/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
prepare_opfuncs();
|
||||
sin_accuracy_test();
|
||||
wavegen_dump();
|
||||
|
||||
return 0;
|
||||
}
|
||||
1
audioutils/lame/.gitignore
vendored
Normal file
1
audioutils/lame/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
lame
|
||||
139
audioutils/lame/CMakeLists.txt
Normal file
139
audioutils/lame/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/lame/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_AUDIOUTILS_LAME)
|
||||
|
||||
# Determine destination path
|
||||
if(NOT DEFINED DST_PATH)
|
||||
set(DST_PATH ${CMAKE_CURRENT_BINARY_DIR}/lame)
|
||||
else()
|
||||
set(DST_PATH ${DST_PATH})
|
||||
endif()
|
||||
|
||||
# Set configuration commands
|
||||
set(CFG_CMDS "")
|
||||
if(NOT "${CONFIG_ARCH}" STREQUAL "sim")
|
||||
list(APPEND CFG_CMDS "--host=${CONFIG_ARCH}")
|
||||
list(APPEND CFG_CMDS "--cross-prefix=${CROSSDEV}")
|
||||
endif()
|
||||
|
||||
# The revision to check out. See the comment in Makefile: an unpinned
|
||||
# checkout stops linking on the day lame's trunk grows its next vector tier.
|
||||
# Raise this deliberately, together with the vector source list below.
|
||||
|
||||
if(NOT DEFINED LAME_VERSION)
|
||||
set(LAME_VERSION 6720)
|
||||
endif()
|
||||
|
||||
# # Download lame if no lame/configure found
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lame/configure")
|
||||
execute_process(
|
||||
COMMAND "svn" "checkout" "-r" "${LAME_VERSION}"
|
||||
"https://svn.code.sf.net/p/lame/svn/trunk/lame" "lame"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
endif()
|
||||
|
||||
# Set source path
|
||||
set(SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/lame")
|
||||
|
||||
# Add compiler flags
|
||||
set(CFLAGS -DHAVE_CONFIG_H -Dfast_log2=lame_fast_log2)
|
||||
set(CFLAGS
|
||||
${CFLAGS}
|
||||
-Wno-address
|
||||
-Wno-array-parameter
|
||||
-Wno-builtin-declaration-mismatch
|
||||
-Wno-incompatible-pointer-types
|
||||
-Wno-implicit-function-declaration
|
||||
-Wno-shadow
|
||||
-Wno-stringop-overflow
|
||||
-Wno-unused-variable
|
||||
-Wno-unused-but-set-variable
|
||||
-msse)
|
||||
|
||||
set(INCDIR ${INCDIR_PREFIX}${DST_PATH} ${INCDIR_PREFIX}${SRC_PATH}/include
|
||||
${INCDIR_PREFIX}${SRC_PATH}/libmp3lame)
|
||||
|
||||
# Set source files
|
||||
set(CSRCS
|
||||
"${SRC_PATH}/libmp3lame/bitstream.c"
|
||||
"${SRC_PATH}/libmp3lame/encoder.c"
|
||||
"${SRC_PATH}/libmp3lame/fft.c"
|
||||
"${SRC_PATH}/libmp3lame/gain_analysis.c"
|
||||
"${SRC_PATH}/libmp3lame/id3tag.c"
|
||||
"${SRC_PATH}/libmp3lame/lame.c"
|
||||
"${SRC_PATH}/libmp3lame/newmdct.c"
|
||||
"${SRC_PATH}/libmp3lame/psymodel.c"
|
||||
"${SRC_PATH}/libmp3lame/quantize.c"
|
||||
"${SRC_PATH}/libmp3lame/quantize_pvt.c"
|
||||
"${SRC_PATH}/libmp3lame/set_get.c"
|
||||
"${SRC_PATH}/libmp3lame/vbrquantize.c"
|
||||
"${SRC_PATH}/libmp3lame/reservoir.c"
|
||||
"${SRC_PATH}/libmp3lame/tables.c"
|
||||
"${SRC_PATH}/libmp3lame/takehiro.c"
|
||||
"${SRC_PATH}/libmp3lame/util.c"
|
||||
"${SRC_PATH}/libmp3lame/VbrTag.c"
|
||||
"${SRC_PATH}/libmp3lame/version.c"
|
||||
"${SRC_PATH}/libmp3lame/presets.c")
|
||||
|
||||
if(CONFIG_HOST_X86 OR CONFIG_HOST_X86_64)
|
||||
list(
|
||||
APPEND
|
||||
CSRCS
|
||||
"${SRC_PATH}/libmp3lame/vector/xmm_quantize_sub.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/xmm_choose_table.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/xmm_quantize_lines.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/xmm_calc_sfb_noise.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/avx2_choose_table.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/avx2_quantize_lines.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/avx512_choose_table.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/avx512_quantize_lines.c"
|
||||
"${SRC_PATH}/libmp3lame/vector/avx512_calc_sfb_noise.c")
|
||||
endif()
|
||||
|
||||
# Add custom target to generate config_h
|
||||
set(CONFIG_H_FILE "${CMAKE_CURRENT_SOURCE_DIR}/lame/configure")
|
||||
set(CONFIG_OPTIONS
|
||||
--disable-cpml
|
||||
--disable-decoder
|
||||
--disable-efence
|
||||
--disable-frontend
|
||||
--disable-mp3x
|
||||
--disable-gtktest
|
||||
--disable-ipv6
|
||||
--disable-rpath
|
||||
--enable-static
|
||||
${CFG_CMDS})
|
||||
add_custom_command(
|
||||
OUTPUT "${DST_PATH}/config.h"
|
||||
COMMAND ${CONFIG_H_FILE} ${CONFIG_OPTIONS}
|
||||
WORKING_DIRECTORY "${DST_PATH}"
|
||||
COMMENT "Generating config.h file")
|
||||
add_custom_target(generate_config_h DEPENDS "${DST_PATH}/config.h")
|
||||
|
||||
nuttx_add_library(libmp3lame STATIC)
|
||||
add_dependencies(libmp3lame generate_config_h)
|
||||
target_sources(libmp3lame PRIVATE ${CSRCS})
|
||||
target_include_directories(libmp3lame PRIVATE ${INCDIR})
|
||||
target_compile_options(libmp3lame PRIVATE ${CFLAGS})
|
||||
|
||||
endif()
|
||||
8
audioutils/lame/Kconfig
Normal file
8
audioutils/lame/Kconfig
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config AUDIOUTILS_LAME
|
||||
bool "Enable LAME MP3 Encoder"
|
||||
default n
|
||||
25
audioutils/lame/Make.defs
Normal file
25
audioutils/lame/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/lame/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_LAME),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/lame
|
||||
endif
|
||||
132
audioutils/lame/Makefile
Normal file
132
audioutils/lame/Makefile
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
############################################################################
|
||||
# apps/audioutils/lame/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
# The revision to check out. lame's trunk grows vector tiers over time --
|
||||
# SSE2, then AVX2, then AVX-512 -- and each one adds sources that this file
|
||||
# and CMakeLists.txt have to name, so an unpinned checkout stops linking on
|
||||
# the day upstream adds the next one. Raise this deliberately, together with
|
||||
# the vector source list below.
|
||||
|
||||
LAME_VERSION ?= 6720
|
||||
|
||||
# Download lame if no lame/configure found
|
||||
lame-svn:
|
||||
$(Q) echo "svn checkout lame ..."
|
||||
$(Q) svn checkout -r $(LAME_VERSION) \
|
||||
https://svn.code.sf.net/p/lame/svn/trunk/lame lame
|
||||
|
||||
ifeq ($(wildcard lame/configure),)
|
||||
context:: lame-svn
|
||||
distclean::
|
||||
$(call DELDIR, lame)
|
||||
endif
|
||||
|
||||
ifeq ($(DST_PATH),)
|
||||
include $(APPDIR)/Make.defs
|
||||
# configure in place
|
||||
DST_PATH := lame
|
||||
else
|
||||
# configure out of tree
|
||||
DST_PATH := $(realpath $(DST_PATH))
|
||||
include $(DST_PATH)/Make.defs
|
||||
BIN := $(DST_PATH)/libmp3lame.a
|
||||
# enable Application.mk PREFIX
|
||||
PREFIX := $(DST_PATH)$(DELIM)
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_ARCH),sim)
|
||||
CFG_CMDS += --host=$(CONFIG_ARCH)
|
||||
CFG_CMDS += --cross-prefix=$(CROSSDEV)
|
||||
endif
|
||||
|
||||
SRC_PATH := lame
|
||||
|
||||
CFLAGS += -DHAVE_CONFIG_H -D'fast_log2=lame_fast_log2'
|
||||
CFLAGS += $(INCDIR_PREFIX)$(DST_PATH) \
|
||||
$(INCDIR_PREFIX)$(SRC_PATH)/include \
|
||||
$(INCDIR_PREFIX)$(SRC_PATH)/libmp3lame
|
||||
CFLAGS += -Wno-address -Wno-array-parameter \
|
||||
-Wno-builtin-declaration-mismatch \
|
||||
-Wno-incompatible-pointer-types \
|
||||
-Wno-implicit-function-declaration -Wno-shadow \
|
||||
-Wno-stringop-overflow -Wno-unused-variable \
|
||||
-Wno-unused-but-set-variable \
|
||||
-msse
|
||||
|
||||
CSRCS += $(SRC_PATH)/libmp3lame/bitstream.c \
|
||||
$(SRC_PATH)/libmp3lame/encoder.c \
|
||||
$(SRC_PATH)/libmp3lame/fft.c \
|
||||
$(SRC_PATH)/libmp3lame/gain_analysis.c \
|
||||
$(SRC_PATH)/libmp3lame/id3tag.c \
|
||||
$(SRC_PATH)/libmp3lame/lame.c \
|
||||
$(SRC_PATH)/libmp3lame/newmdct.c \
|
||||
$(SRC_PATH)/libmp3lame/psymodel.c \
|
||||
$(SRC_PATH)/libmp3lame/quantize.c \
|
||||
$(SRC_PATH)/libmp3lame/quantize_pvt.c \
|
||||
$(SRC_PATH)/libmp3lame/set_get.c \
|
||||
$(SRC_PATH)/libmp3lame/vbrquantize.c \
|
||||
$(SRC_PATH)/libmp3lame/reservoir.c \
|
||||
$(SRC_PATH)/libmp3lame/tables.c \
|
||||
$(SRC_PATH)/libmp3lame/takehiro.c \
|
||||
$(SRC_PATH)/libmp3lame/util.c \
|
||||
$(SRC_PATH)/libmp3lame/VbrTag.c \
|
||||
$(SRC_PATH)/libmp3lame/version.c \
|
||||
$(SRC_PATH)/libmp3lame/presets.c
|
||||
|
||||
# lame's configure enables the SSE2, AVX2 and AVX-512 dispatch paths whenever
|
||||
# the host compiler accepts their per-function target attributes, and the
|
||||
# scalar code then calls into them, so the whole group has to be built on an
|
||||
# x86 host. Other hosts keep lame's scalar implementation.
|
||||
|
||||
ifneq ($(CONFIG_HOST_X86)$(CONFIG_HOST_X86_64),)
|
||||
CSRCS += $(SRC_PATH)/libmp3lame/vector/xmm_quantize_sub.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/xmm_choose_table.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/xmm_quantize_lines.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/xmm_calc_sfb_noise.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/avx2_choose_table.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/avx2_quantize_lines.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/avx512_choose_table.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/avx512_quantize_lines.c \
|
||||
$(SRC_PATH)/libmp3lame/vector/avx512_calc_sfb_noise.c
|
||||
endif
|
||||
|
||||
LAME_CONFIG_SCRIPT := $(CURDIR)$(DELIM)lame$(DELIM)configure
|
||||
|
||||
$(DST_PATH)/config.h:
|
||||
$(Q)echo "lame configure... $(CONFIG_ARCH)"
|
||||
$(Q)cd $(DST_PATH) && $(LAME_CONFIG_SCRIPT) \
|
||||
--disable-cpml --disable-decoder --disable-efence \
|
||||
--disable-frontend --disable-mp3x --disable-gtktest \
|
||||
--disable-ipv6 --disable-rpath --enable-static \
|
||||
$(CFG_CMDS)
|
||||
|
||||
context:: $(DST_PATH)/config.h
|
||||
|
||||
ifneq ($(PREFIX),)
|
||||
@$(eval ALL_SRCS = $(CSRCS))
|
||||
@$(foreach src,$(ALL_SRCS),$(shell mkdir -p $(PREFIX)$(dir $(src))))
|
||||
endif
|
||||
|
||||
distclean::
|
||||
$(Q)if [ -d $(DST_PATH) ]; then cd $(DST_PATH) && $(MAKE) distclean; fi
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
2
audioutils/libmad/.gitignore
vendored
Normal file
2
audioutils/libmad/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/libmad
|
||||
/*.zip
|
||||
60
audioutils/libmad/CMakeLists.txt
Normal file
60
audioutils/libmad/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/libmad/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_AUDIOUTILS_LIBMAD)
|
||||
|
||||
# Download and unpack libmad if no libmad found
|
||||
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libmad/configure)
|
||||
set(VERSION "master")
|
||||
set(LIBMAD_URL
|
||||
"https://github.com/markjeee/libmad/archive/refs/heads/master.zip")
|
||||
|
||||
file(DOWNLOAD ${LIBMAD_URL} ${CMAKE_CURRENT_SOURCE_DIR}/libmad.zip)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E tar -xf ${CMAKE_CURRENT_SOURCE_DIR}/libmad.zip
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} -E rename
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libmad-${VERSION}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libmad)
|
||||
|
||||
add_custom_target(
|
||||
distclean
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libmad
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/libmad.zip)
|
||||
endif()
|
||||
|
||||
nuttx_add_library(libmad STATIC)
|
||||
|
||||
file(GLOB LIBMAD_SRCS libmad/*.c)
|
||||
set(CSRCS ${LIBMAD_SRCS})
|
||||
set(CFLAGS -Wno-shadow -Wno-stringop-overflow -DFPM_DEFAULT -DSIZEOF_INT=4)
|
||||
set(INCDIR ${CMAKE_CURRENT_LIST_DIR}/libmad
|
||||
${CMAKE_CURRENT_LIST_DIR}/libmad/msvc++)
|
||||
|
||||
target_sources(libmad PRIVATE ${CSRCS})
|
||||
target_include_directories(libmad PRIVATE ${INCDIR})
|
||||
target_compile_options(libmad PRIVATE ${CFLAGS})
|
||||
|
||||
endif()
|
||||
8
audioutils/libmad/Kconfig
Normal file
8
audioutils/libmad/Kconfig
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config AUDIOUTILS_LIBMAD
|
||||
bool "Enable libmad"
|
||||
default n
|
||||
25
audioutils/libmad/Make.defs
Normal file
25
audioutils/libmad/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/libmad/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_LIBMAD),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/libmad
|
||||
endif
|
||||
45
audioutils/libmad/Makefile
Normal file
45
audioutils/libmad/Makefile
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
############################################################################
|
||||
# apps/audioutils/libmad/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
CSRCS += $(wildcard libmad/*.c)
|
||||
CFLAGS += -DFPM_DEFAULT -DSIZEOF_INT=4
|
||||
CFLAGS += -Wno-shadow -Wno-stringop-overflow
|
||||
|
||||
# Download and unpack libmad if no git repo found
|
||||
ifeq ($(wildcard libmad/.git),)
|
||||
VERSION ?= master
|
||||
libmad.zip:
|
||||
$(Q) curl -L https://github.com/markjeee/libmad/archive/refs/heads/master.zip -o libmad.zip
|
||||
$(Q) unzip -o libmad.zip
|
||||
$(Q) mv libmad-$(VERSION) libmad
|
||||
|
||||
context:: libmad.zip
|
||||
|
||||
distclean::
|
||||
$(call DELDIR, libmad)
|
||||
$(call DELFILE, libmad.zip)
|
||||
|
||||
endif
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
24
audioutils/mml_parser/CMakeLists.txt
Normal file
24
audioutils/mml_parser/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/mml_parser/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
if(CONFIG_AUDIOUTILS_MMLPARSER_LIB)
|
||||
target_sources(apps PRIVATE mml_parser.c)
|
||||
endif()
|
||||
10
audioutils/mml_parser/Kconfig
Normal file
10
audioutils/mml_parser/Kconfig
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config AUDIOUTILS_MMLPARSER_LIB
|
||||
bool "Music Macro Language(MML) Library"
|
||||
default n
|
||||
---help---
|
||||
Enable support for the Music Macro Language library.
|
||||
25
audioutils/mml_parser/Make.defs
Normal file
25
audioutils/mml_parser/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/mml_parser/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_MMLPARSER_LIB),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/mml_parser
|
||||
endif
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
############################################################################
|
||||
# apps/system/input/Makefile
|
||||
# apps/audioutils/mml_parser/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
|
|
@ -20,11 +22,8 @@
|
|||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
PROGNAME = input
|
||||
PRIORITY = $(CONFIG_SYSTEM_INPUT_PRIORITY)
|
||||
STACKSIZE = $(CONFIG_SYSTEM_INPUT_STACKSIZE)
|
||||
MODULE = $(CONFIG_SYSTEM_INPUT)
|
||||
# NSH Library
|
||||
|
||||
MAINSRC = input.c
|
||||
CSRCS = mml_parser.c
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
870
audioutils/mml_parser/mml_parser.c
Normal file
870
audioutils/mml_parser/mml_parser.c
Normal file
|
|
@ -0,0 +1,870 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/mml_parser/mml_parser.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <audioutils/mml_parser.h>
|
||||
|
||||
#ifdef DEBUG_ON
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define LENGTH_STATE_IDLE (0)
|
||||
#define LENGTH_STATE_NUMBERD (1)
|
||||
#define LENGTH_STATE_PLUS (2)
|
||||
|
||||
#define CHORD_START '['
|
||||
#define CHORD_END ']'
|
||||
|
||||
#define TUPLET_START '{'
|
||||
#define TUPLET_END '}'
|
||||
|
||||
#ifdef DEBUG_ON
|
||||
#define DEBUG printf
|
||||
#else
|
||||
#define DEBUG(...)
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: skip_space
|
||||
****************************************************************************/
|
||||
|
||||
static char *skip_space(char *str)
|
||||
{
|
||||
while (isspace(*str))
|
||||
{
|
||||
str++;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: next_code
|
||||
****************************************************************************/
|
||||
|
||||
static char next_code(char **score)
|
||||
{
|
||||
char ret;
|
||||
*score = skip_space(*score);
|
||||
ret = **score;
|
||||
*score += 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: note_index
|
||||
****************************************************************************/
|
||||
|
||||
static int note_index(char code)
|
||||
{
|
||||
int i;
|
||||
const char *code_types = "C+D+EF+G+A+B";
|
||||
|
||||
for (i = 0; i < 12; i++)
|
||||
{
|
||||
if (code_types[i] == code)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: halfscale
|
||||
****************************************************************************/
|
||||
|
||||
static int halfscale(char **score)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
switch (**score)
|
||||
{
|
||||
case '+':
|
||||
case '#':
|
||||
ret++;
|
||||
break;
|
||||
case '-':
|
||||
ret--;
|
||||
break;
|
||||
default:
|
||||
return ret;
|
||||
}
|
||||
|
||||
*score += 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: strlendigits
|
||||
****************************************************************************/
|
||||
|
||||
static int strlendigits(FAR const char *str)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
while (isdigit(*str))
|
||||
{
|
||||
str++;
|
||||
ret++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: calc_samples
|
||||
****************************************************************************/
|
||||
|
||||
static int calc_samples(int fs, int tempo, int num, int dots)
|
||||
{
|
||||
int div = 0;
|
||||
int n = 0;
|
||||
int mul = 16;
|
||||
|
||||
DEBUG("fs=%d, tempo=%d, num=%d, dots=%d\n", fs, tempo, num, dots);
|
||||
|
||||
switch (num)
|
||||
{
|
||||
case 0:
|
||||
n = 3;
|
||||
break;
|
||||
case 1:
|
||||
n = 2;
|
||||
break;
|
||||
case 2:
|
||||
n = 1;
|
||||
break;
|
||||
case 4:
|
||||
n = 0;
|
||||
break;
|
||||
case 8:
|
||||
div = 1;
|
||||
break;
|
||||
case 16:
|
||||
div = 2;
|
||||
break;
|
||||
case 32:
|
||||
div = 3;
|
||||
break;
|
||||
case 64:
|
||||
div = 4;
|
||||
break;
|
||||
default:
|
||||
div = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dots <= 4)
|
||||
{
|
||||
while (dots)
|
||||
{
|
||||
mul += (1 << (4 - dots));
|
||||
dots--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dots = -1;
|
||||
}
|
||||
|
||||
if (div < 0 || dots < 0)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return (((15 * fs * mul) << n) >> (2 + div)) / tempo;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: get_samples
|
||||
****************************************************************************/
|
||||
|
||||
static int get_samples(FAR struct music_macro_lang_s *mml,
|
||||
int samples, int num, int dots, bool plus_mode)
|
||||
{
|
||||
int len;
|
||||
|
||||
num = num < 0 ? mml->def_length : num;
|
||||
len = calc_samples(mml->fs, mml->cur_tempo, num, dots);
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
return plus_mode ? samples + len : len;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: is_qualifire
|
||||
****************************************************************************/
|
||||
|
||||
static bool is_qualifire(char c)
|
||||
{
|
||||
if (isdigit(c) || c == '.')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: sample_length
|
||||
****************************************************************************/
|
||||
|
||||
static int sample_length(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score)
|
||||
{
|
||||
int dots = 0;
|
||||
int samples = 0;
|
||||
int state = LENGTH_STATE_IDLE;
|
||||
bool plus_mode = false;
|
||||
bool parsing = true;
|
||||
int num = -1;
|
||||
|
||||
samples = get_samples(mml, samples, num, dots, plus_mode);
|
||||
|
||||
if (!is_qualifire(**score))
|
||||
{
|
||||
return samples;
|
||||
}
|
||||
|
||||
while (parsing)
|
||||
{
|
||||
DEBUG("In Length parser\n");
|
||||
switch (state)
|
||||
{
|
||||
case LENGTH_STATE_IDLE:
|
||||
if (isdigit(**score))
|
||||
{
|
||||
DEBUG("state[IDLE]: Digits\n");
|
||||
num = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
state = LENGTH_STATE_NUMBERD;
|
||||
}
|
||||
else if (**score == '.')
|
||||
{
|
||||
DEBUG("state[IDLE]: Dot\n");
|
||||
state = LENGTH_STATE_NUMBERD;
|
||||
dots++;
|
||||
*score += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG("state[IDLE]: Other\n");
|
||||
samples = get_samples(mml, samples, num, dots, plus_mode);
|
||||
parsing = false;
|
||||
}
|
||||
|
||||
case LENGTH_STATE_NUMBERD:
|
||||
if (**score == '.')
|
||||
{
|
||||
DEBUG("state[NUM]: Dot\n");
|
||||
dots++;
|
||||
*score += 1;
|
||||
}
|
||||
else if (**score == '+')
|
||||
{
|
||||
DEBUG("state[NUM]: PLUS\n");
|
||||
samples = get_samples(mml, samples, num, dots, plus_mode);
|
||||
if (samples < 0)
|
||||
{
|
||||
parsing = false;
|
||||
}
|
||||
|
||||
plus_mode = true;
|
||||
num = -1;
|
||||
*score += 1;
|
||||
state = LENGTH_STATE_PLUS;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG("state[NUM]: Other\n");
|
||||
samples = get_samples(mml, samples, num, dots, plus_mode);
|
||||
parsing = false;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LENGTH_STATE_PLUS:
|
||||
if (isdigit(**score))
|
||||
{
|
||||
num = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
DEBUG("state[PLUS]: Digits num=%d, restscore=%s,"
|
||||
" parsing=%s\n",
|
||||
num, *score, parsing ? "True" : "False");
|
||||
state = LENGTH_STATE_NUMBERD;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUG("state[PLUS]: Other\n");
|
||||
samples = -EINVAL;
|
||||
parsing = false;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
parsing = false;
|
||||
samples = -EPROTO;
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG("Out switch : state[%s]: Digits num=%d, restscore=%s,"
|
||||
" parse=%s\n",
|
||||
state == LENGTH_STATE_IDLE ? "IDLE" :
|
||||
state == LENGTH_STATE_NUMBERD ? "NUM" :
|
||||
state == LENGTH_STATE_PLUS ? "PLUS" : "Unknown",
|
||||
num, *score, parsing ? "True" : "False");
|
||||
}
|
||||
|
||||
DEBUG("Out while\n");
|
||||
|
||||
return samples;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: tuple_length
|
||||
****************************************************************************/
|
||||
|
||||
static int tuplet_length(FAR struct music_macro_lang_s *mml)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mml->tuplet_length / mml->tuplet_notes;
|
||||
mml->cur_tuplet++;
|
||||
if (mml->cur_tuplet == mml->tuplet_notes)
|
||||
{
|
||||
/* Adjust surplus */
|
||||
|
||||
ret = mml->tuplet_length - (ret * (mml->tuplet_notes - 1));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_note
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_note(FAR struct music_macro_lang_s *mml, char code,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
result->note_idx[0] = note_index(code) + halfscale(score)
|
||||
+ mml->cur_octave * 12;
|
||||
result->length = sample_length(mml, score);
|
||||
|
||||
return result->length < 0 ? MML_TYPE_NOTE_ERROR : MML_TYPE_NOTE;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_rest
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_rest(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
if (mml->state == MML_STATE_TUPLET)
|
||||
{
|
||||
DEBUG("Tuplet : TTL %d, CUR %d\n", mml->tuplet_notes, mml->cur_tuplet);
|
||||
result->length = tuplet_length(mml);
|
||||
return MML_TYPE_REST;
|
||||
}
|
||||
else
|
||||
{
|
||||
result->length = sample_length(mml, score);
|
||||
return result->length < 0 ? MML_TYPE_REST_ERROR : MML_TYPE_REST;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_tempo
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_tempo(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_TEMPO;
|
||||
|
||||
if (isdigit(**score))
|
||||
{
|
||||
mml->cur_tempo = result->length = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = MML_TYPE_TEMPO_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_length
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_length(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_LENGTH_ERROR;
|
||||
|
||||
DEBUG("length str : %c\n", **score);
|
||||
if (isdigit(**score))
|
||||
{
|
||||
mml->def_length = result->length = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
ret = MML_TYPE_LENGTH;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_octave
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_octave(FAR struct music_macro_lang_s *mml, char code,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_OCTAVE;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case '>':
|
||||
mml->cur_octave++;
|
||||
result->length = mml->cur_octave;
|
||||
break;
|
||||
|
||||
case '<':
|
||||
mml->cur_octave--;
|
||||
result->length = mml->cur_octave;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (isdigit(**score))
|
||||
{
|
||||
mml->cur_octave = result->length = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = MML_TYPE_OCTAVE_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_volume
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_volume(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_VOLUME;
|
||||
|
||||
result->length = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
|
||||
if (result->length < 0 || result->length > 100)
|
||||
{
|
||||
ret = MML_TYPE_VOLUME_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: skip_until
|
||||
****************************************************************************/
|
||||
|
||||
static char *skip_until(FAR char *score, char until)
|
||||
{
|
||||
while (*score != until && *score != '\0')
|
||||
{
|
||||
score++;
|
||||
}
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: count_tupletnotes
|
||||
****************************************************************************/
|
||||
|
||||
static int count_tupletnotes(FAR struct music_macro_lang_s *mml,
|
||||
FAR char *score)
|
||||
{
|
||||
const char *notes = "CDEFGABR";
|
||||
|
||||
score = skip_space(score);
|
||||
|
||||
while (*score != TUPLET_END)
|
||||
{
|
||||
if (strchr(notes, *score))
|
||||
{
|
||||
mml->tuplet_notes++;
|
||||
}
|
||||
else if (*score == CHORD_START)
|
||||
{
|
||||
score = skip_until(score, CHORD_END);
|
||||
mml->tuplet_notes++;
|
||||
}
|
||||
|
||||
if (*score == '\0')
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
score++;
|
||||
score = skip_space(score);
|
||||
}
|
||||
|
||||
score++; /* Skip TUPLET_END */
|
||||
mml->tuplet_length = sample_length(mml, &score);
|
||||
|
||||
return mml->tuplet_notes != 0 ? OK : -EINVAL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_starttuplet
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_starttuplet(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (mml->state != MML_STATE_NORMAL)
|
||||
{
|
||||
return MML_TYPE_ILLIGAL_DOUBLE_TUPLET;
|
||||
}
|
||||
|
||||
mml->tuplet_notes = 0;
|
||||
ret = count_tupletnotes(mml, *score);
|
||||
if (ret < 0 || mml->tuplet_notes == 0)
|
||||
{
|
||||
return MML_TYPE_TUPLET_ERROR;
|
||||
}
|
||||
|
||||
mml->state = MML_STATE_TUPLET;
|
||||
mml->cur_tuplet = 0;
|
||||
|
||||
result->length = mml->tuplet_length;
|
||||
|
||||
return MML_TYPE_TUPLETSTART;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_stoptuplet
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_stoptuplet(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_TUPLETDONE;
|
||||
|
||||
mml->state = MML_STATE_NORMAL;
|
||||
|
||||
/* Just for skip of length block */
|
||||
|
||||
sample_length(mml, score);
|
||||
|
||||
if (mml->cur_tuplet != mml->tuplet_notes)
|
||||
{
|
||||
ret = MML_TYPE_ILLIGAL_TOOFEW_NOTES;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_tupletnote
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_tupletnote(FAR struct music_macro_lang_s *mml, char code,
|
||||
FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_NOTE;
|
||||
|
||||
DEBUG("Tuplet : TTL %d, CUR %d\n", mml->tuplet_notes, mml->cur_tuplet);
|
||||
if (mml->cur_tuplet < mml->tuplet_notes)
|
||||
{
|
||||
result->note_idx[0] = note_index(code) + halfscale(score)
|
||||
+ mml->cur_octave * 12;
|
||||
result->length = tuplet_length(mml);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = MML_TYPE_ILLIGAL_TOOMANY_NOTES;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_notes
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_notes(FAR struct music_macro_lang_s *mml, char code,
|
||||
FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret;
|
||||
|
||||
result->chord_notes = 1;
|
||||
|
||||
if (mml->state == MML_STATE_TUPLET)
|
||||
{
|
||||
ret = handle_tupletnote(mml, code, score, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = handle_note(mml, code, score, result);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_startchord
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_startchord(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
char code;
|
||||
int note_idx;
|
||||
|
||||
code = next_code(score);
|
||||
|
||||
while (code != CHORD_END && code != '\0')
|
||||
{
|
||||
DEBUG("CHORD: %c\n", code);
|
||||
note_idx = note_index(code);
|
||||
DEBUG("CHORD note_idx = %d\n", note_idx);
|
||||
if (note_idx >= 0)
|
||||
{
|
||||
note_idx += halfscale(score) + mml->cur_octave * 12;
|
||||
|
||||
if (result->chord_notes < MAX_CHORD_NOTES)
|
||||
{
|
||||
result->note_idx[result->chord_notes] = note_idx;
|
||||
result->chord_notes++;
|
||||
}
|
||||
|
||||
/* In case of chord notes are over than MAX_CHORD_NOTES,
|
||||
* just ignore overflowed notes. Not behave as an error.
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case 'O':
|
||||
case '>':
|
||||
case '<':
|
||||
if (handle_octave(mml, code, score, result) < 0)
|
||||
{
|
||||
return MML_TYPE_CHORD_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return MML_TYPE_CHORD_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
code = next_code(score);
|
||||
}
|
||||
|
||||
if (code == '\0')
|
||||
{
|
||||
return MML_TYPE_CHORD_ERROR;
|
||||
}
|
||||
|
||||
if (mml->state == MML_STATE_TUPLET)
|
||||
{
|
||||
result->length = tuplet_length(mml);
|
||||
}
|
||||
else
|
||||
{
|
||||
result->length = sample_length(mml, score);
|
||||
}
|
||||
|
||||
return result->length < 0 ? MML_TYPE_CHORD_ERROR : MML_TYPE_CHORD;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: handle_tone
|
||||
****************************************************************************/
|
||||
|
||||
static int handle_tone(FAR struct music_macro_lang_s *mml,
|
||||
FAR char **score, FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret = MML_TYPE_TONE_ERROR;
|
||||
|
||||
if (isdigit(**score))
|
||||
{
|
||||
result->note_idx[0] = atoi(*score);
|
||||
*score += strlendigits(*score);
|
||||
ret = MML_TYPE_TONE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: init_mml
|
||||
****************************************************************************/
|
||||
|
||||
int init_mml(FAR struct music_macro_lang_s *mml, int fs,
|
||||
int tempo, int octave, int length)
|
||||
{
|
||||
mml->fs = fs;
|
||||
mml->cur_tempo = tempo;
|
||||
mml->cur_octave = octave;
|
||||
mml->def_length = length;
|
||||
|
||||
mml->state = MML_STATE_NORMAL;
|
||||
mml->cur_tuplet = 0;
|
||||
mml->tuplet_notes = 0;
|
||||
mml->tuplet_length = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: parse_mml
|
||||
****************************************************************************/
|
||||
|
||||
int parse_mml(FAR struct music_macro_lang_s *mml, FAR char **score,
|
||||
FAR struct mml_result_s *result)
|
||||
{
|
||||
int ret;
|
||||
char code;
|
||||
|
||||
code = next_code(score);
|
||||
DEBUG("code=%c\n", code);
|
||||
result->chord_notes = 0;
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 'A':
|
||||
case 'B':
|
||||
case 'C':
|
||||
case 'D':
|
||||
case 'E':
|
||||
case 'F':
|
||||
case 'G':
|
||||
ret = handle_notes(mml, code, score, result);
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
ret = handle_rest(mml, score, result);
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
ret = handle_tempo(mml, score, result);
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
ret = handle_length(mml, score, result);
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
case '>':
|
||||
case '<':
|
||||
ret = handle_octave(mml, code, score, result);
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
ret = handle_volume(mml, score, result);
|
||||
break;
|
||||
|
||||
case CHORD_START:
|
||||
ret = handle_startchord(mml, score, result);
|
||||
break;
|
||||
|
||||
case TUPLET_START:
|
||||
ret = handle_starttuplet(mml, score, result);
|
||||
break;
|
||||
|
||||
case TUPLET_END:
|
||||
ret = handle_stoptuplet(mml, score, result);
|
||||
break;
|
||||
|
||||
case '@':
|
||||
ret = handle_tone(mml, score, result);
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
ret = MML_TYPE_EOF;
|
||||
*score -= 1; /* Backward */
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = MML_TYPE_ILLIGAL_COMPOSITION;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
1
audioutils/morsey/.gitignore
vendored
Normal file
1
audioutils/morsey/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
morsey
|
||||
6
audioutils/morsey/Kconfig
Normal file
6
audioutils/morsey/Kconfig
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
config AUDIOUTILS_MORSEY
|
||||
bool "Morse code playing library"
|
||||
default n
|
||||
---help---
|
||||
Simple library for parsing ASCII text into playable Morse code. Not
|
||||
necessarily restricted to audio.
|
||||
25
audioutils/morsey/Make.defs
Normal file
25
audioutils/morsey/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/morsey/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_MORSEY),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/morsey
|
||||
endif
|
||||
50
audioutils/morsey/Makefile
Normal file
50
audioutils/morsey/Makefile
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
############################################################################
|
||||
# apps/audioutils/morsey/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
CSRCS = $(MORSEY_DIR)/morsey.c
|
||||
|
||||
MORSEY_DIR = morsey
|
||||
MORSEY_VERSION = v1.0.1
|
||||
MORSEY_MORSEY_H_SHA256 = 55f45e7b9a4d810f928ffe3ee9bea4cc318e28b1f49abf9512aee2638bd1dbfa
|
||||
MORSEY_MORSEY_C_SHA256 = 12babc90d3518e026c344c38dc3701287c41fd6b41a3ec96fb36c77907be78f8
|
||||
|
||||
$(MORSEY_DIR):
|
||||
$(Q) echo "Cloning Morsey repo..."
|
||||
$(Q) git clone --depth=1 --branch=$(MORSEY_VERSION) https://github.com/linguini1/morsey.git
|
||||
$(Q) touch $(MORSEY_DIR)
|
||||
$(Q) echo "Checking Morsey hashes..."
|
||||
$(Q) $(APPDIR)/tools/check-hash.sh sha256 $(MORSEY_MORSEY_H_SHA256) $@/morsey.h
|
||||
$(Q) $(APPDIR)/tools/check-hash.sh sha256 $(MORSEY_MORSEY_C_SHA256) $@/morsey.c
|
||||
|
||||
create_includes: $(MORSEY_DIR)/morsey.h
|
||||
$(Q) cp $< $(APPDIR)/include/audioutils
|
||||
|
||||
context:: $(MORSEY_DIR)
|
||||
$(Q) $(MAKE) create_includes
|
||||
|
||||
distclean::
|
||||
$(call DELFILE, $(APPDIR)/include/audioutils/morsey.h)
|
||||
$(call DELDIR, morsey)
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
25
audioutils/nxaudio/CMakeLists.txt
Normal file
25
audioutils/nxaudio/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# ##############################################################################
|
||||
# apps/audioutils/nxaudio/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_AUDIOUTILS_NXAUDIO_LIB)
|
||||
target_sources(apps PRIVATE nxaudio.c)
|
||||
endif()
|
||||
26
audioutils/nxaudio/Kconfig
Normal file
26
audioutils/nxaudio/Kconfig
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config AUDIOUTILS_NXAUDIO_LIB
|
||||
bool "NX Audio Library"
|
||||
default n
|
||||
---help---
|
||||
Enable support for the NX Audio library.
|
||||
|
||||
if AUDIOUTILS_NXAUDIO_LIB
|
||||
|
||||
config AUDIOUTILS_NXAUDIO_DEVPATH
|
||||
string "Audio Device file path"
|
||||
default "/dev/audio/pcm1"
|
||||
---help---
|
||||
Audio device file path of target audio device.
|
||||
|
||||
config AUDIOUTILS_NXAUDIO_MSGQNAME
|
||||
string "Message queue name"
|
||||
default "/tmp/fmaudio_mq"
|
||||
---help---
|
||||
Message queue name (file path) to communicate with audio message loop.
|
||||
|
||||
endif
|
||||
25
audioutils/nxaudio/Make.defs
Normal file
25
audioutils/nxaudio/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/nxaudio/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_NXAUDIO_LIB),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/nxaudio
|
||||
endif
|
||||
27
audioutils/nxaudio/Makefile
Normal file
27
audioutils/nxaudio/Makefile
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
############################################################################
|
||||
# apps/audioutils/nxaudio/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
CSRCS = nxaudio.c
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
353
audioutils/nxaudio/nxaudio.c
Normal file
353
audioutils/nxaudio/nxaudio.c
Normal file
|
|
@ -0,0 +1,353 @@
|
|||
/****************************************************************************
|
||||
* apps/audioutils/nxaudio/nxaudio.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <mqueue.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <nuttx/audio/audio.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <audioutils/nxaudio.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: configure_audio
|
||||
****************************************************************************/
|
||||
|
||||
static int configure_audio(int fd, int ch, int fs, int bps, int chmap)
|
||||
{
|
||||
struct audio_caps_desc_s cap;
|
||||
|
||||
cap.caps.ac_len = sizeof(struct audio_caps_s);
|
||||
cap.caps.ac_type = AUDIO_TYPE_OUTPUT;
|
||||
cap.caps.ac_channels = ch;
|
||||
cap.caps.ac_chmap = chmap;
|
||||
cap.caps.ac_controls.hw[0] = fs;
|
||||
cap.caps.ac_controls.b[2] = bps;
|
||||
cap.caps.ac_controls.b[3] = 0; /* Just set 0 */
|
||||
|
||||
return ioctl(fd, AUDIOIOC_CONFIGURE, (unsigned long)(uintptr_t)&cap);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: create_audiomq
|
||||
****************************************************************************/
|
||||
|
||||
static mqd_t create_audiomq(const char *mqname, int fd, int buf_num)
|
||||
{
|
||||
mqd_t ret;
|
||||
struct mq_attr attr;
|
||||
|
||||
attr.mq_maxmsg = buf_num;
|
||||
attr.mq_msgsize = sizeof(struct audio_msg_s);
|
||||
attr.mq_curmsgs = 0;
|
||||
attr.mq_flags = 0;
|
||||
|
||||
ret = mq_open(mqname, O_RDWR | O_CREAT, 0644, &attr);
|
||||
if (ret >= (mqd_t)0)
|
||||
{
|
||||
int rr;
|
||||
if ((rr = ioctl(fd, AUDIOIOC_REGISTERMQ, (unsigned long)ret)) < 0)
|
||||
{
|
||||
printf("mq register failed: %d, %d\n", rr, errno);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: create_audio_buffers
|
||||
****************************************************************************/
|
||||
|
||||
static FAR struct ap_buffer_s **create_audio_buffers(int fd, int num, int sz)
|
||||
{
|
||||
int i;
|
||||
struct audio_buf_desc_s desc;
|
||||
FAR struct ap_buffer_s **ret;
|
||||
|
||||
ret = (FAR struct ap_buffer_s **)calloc(num, sizeof(FAR void *));
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
desc.numbytes = sz;
|
||||
desc.u.pbuffer = &ret[i];
|
||||
|
||||
ioctl(fd, AUDIOIOC_ALLOCBUFFER, (unsigned long)(uintptr_t)&desc);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: free_audio_buffers
|
||||
****************************************************************************/
|
||||
|
||||
static void free_audio_buffers(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
int x;
|
||||
struct audio_buf_desc_s desc;
|
||||
|
||||
for (x = 0; x < nxaudio->abufnum; x++)
|
||||
{
|
||||
if (nxaudio->abufs[x] != NULL)
|
||||
{
|
||||
desc.u.buffer = nxaudio->abufs[x];
|
||||
ioctl(nxaudio->fd, AUDIOIOC_FREEBUFFER,
|
||||
(unsigned long)(uintptr_t)&desc);
|
||||
}
|
||||
}
|
||||
|
||||
free(nxaudio->abufs);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* name: fin_nxaudio
|
||||
****************************************************************************/
|
||||
|
||||
void fin_nxaudio(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
ioctl(nxaudio->fd, AUDIOIOC_SHUTDOWN, 0);
|
||||
ioctl(nxaudio->fd, AUDIOIOC_UNREGISTERMQ, (unsigned long)nxaudio->mq);
|
||||
ioctl(nxaudio->fd, AUDIOIOC_RELEASE, 0);
|
||||
free_audio_buffers(nxaudio);
|
||||
close(nxaudio->fd);
|
||||
mq_close(nxaudio->mq);
|
||||
mq_unlink(CONFIG_AUDIOUTILS_NXAUDIO_MSGQNAME);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: init_nxaudio
|
||||
****************************************************************************/
|
||||
|
||||
int init_nxaudio(FAR struct nxaudio_s *nxaudio,
|
||||
int fs, int bps, int chnum)
|
||||
{
|
||||
return init_nxaudio_devname(nxaudio, fs, bps, chnum,
|
||||
CONFIG_AUDIOUTILS_NXAUDIO_DEVPATH,
|
||||
CONFIG_AUDIOUTILS_NXAUDIO_MSGQNAME);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: init_nxaudio_devname
|
||||
****************************************************************************/
|
||||
|
||||
int init_nxaudio_devname(FAR struct nxaudio_s *nxaudio,
|
||||
int fs, int bps, int chnum,
|
||||
const char *devname, const char *mqname)
|
||||
{
|
||||
struct ap_buffer_info_s buf_info;
|
||||
|
||||
nxaudio->fd = open(devname, O_RDWR | O_CLOEXEC);
|
||||
if (nxaudio->fd >= 0)
|
||||
{
|
||||
if (ioctl(nxaudio->fd, AUDIOIOC_RESERVE, 0) < 0)
|
||||
{
|
||||
close(nxaudio->fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Audio configuration: set channel num, FS and bps */
|
||||
|
||||
configure_audio(nxaudio->fd, chnum, fs, bps, 0);
|
||||
|
||||
nxaudio->chnum = chnum;
|
||||
|
||||
ioctl(nxaudio->fd, AUDIOIOC_GETBUFFERINFO,
|
||||
(unsigned long)(uintptr_t)&buf_info);
|
||||
|
||||
/* Create message queue to communicate with audio driver */
|
||||
|
||||
nxaudio->mq = create_audiomq(mqname, nxaudio->fd,
|
||||
buf_info.nbuffers + 8);
|
||||
|
||||
/* Create audio buffers to inject audio sample */
|
||||
|
||||
nxaudio->abufs = create_audio_buffers(nxaudio->fd,
|
||||
buf_info.nbuffers, buf_info.buffer_size);
|
||||
nxaudio->abufnum = buf_info.nbuffers;
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_enqbuffer
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_enqbuffer(FAR struct nxaudio_s *nxaudio,
|
||||
FAR struct ap_buffer_s *apb)
|
||||
{
|
||||
struct audio_buf_desc_s desc;
|
||||
|
||||
desc.numbytes = apb->nbytes;
|
||||
desc.u.buffer = apb;
|
||||
|
||||
return ioctl(nxaudio->fd, AUDIOIOC_ENQUEUEBUFFER,
|
||||
(unsigned long)(uintptr_t)&desc);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_pause
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_pause(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
return ioctl(nxaudio->fd, AUDIOIOC_PAUSE, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_resume
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_resume(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
return ioctl(nxaudio->fd, AUDIOIOC_RESUME, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_setvolume
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_setvolume(FAR struct nxaudio_s *nxaudio, uint16_t vol)
|
||||
{
|
||||
struct audio_caps_desc_s cap_desc;
|
||||
|
||||
cap_desc.caps.ac_len = sizeof(struct audio_caps_s);
|
||||
cap_desc.caps.ac_type = AUDIO_TYPE_FEATURE;
|
||||
cap_desc.caps.ac_format.hw = AUDIO_FU_VOLUME;
|
||||
cap_desc.caps.ac_controls.hw[0] = vol;
|
||||
|
||||
return ioctl(nxaudio->fd, AUDIOIOC_CONFIGURE,
|
||||
(unsigned long)(uintptr_t)&cap_desc);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_start
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_start(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
return ioctl(nxaudio->fd, AUDIOIOC_START, 0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_start
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_stop(FAR struct nxaudio_s *nxaudio)
|
||||
{
|
||||
struct audio_msg_s term_msg;
|
||||
|
||||
term_msg.msg_id = AUDIO_MSG_STOP;
|
||||
term_msg.u.data = 0;
|
||||
mq_send(nxaudio->mq, (FAR const char *)&term_msg, sizeof(term_msg), 0);
|
||||
|
||||
ioctl(nxaudio->fd, AUDIOIOC_STOP, 0);
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* name: nxaudio_msgloop
|
||||
****************************************************************************/
|
||||
|
||||
int nxaudio_msgloop(FAR struct nxaudio_s *nxaudio,
|
||||
FAR struct nxaudio_callbacks_s *cbs,
|
||||
unsigned long arg)
|
||||
{
|
||||
bool running = true;
|
||||
struct audio_msg_s msg;
|
||||
unsigned int prio;
|
||||
ssize_t size;
|
||||
|
||||
if (!cbs)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (running)
|
||||
{
|
||||
size = mq_receive(nxaudio->mq, (FAR char *)&msg, sizeof(msg), &prio);
|
||||
if (size != sizeof(msg))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (msg.msg_id)
|
||||
{
|
||||
case AUDIO_MSG_DEQUEUE:
|
||||
if (cbs->dequeue)
|
||||
{
|
||||
cbs->dequeue(arg, msg.u.ptr);
|
||||
}
|
||||
break;
|
||||
case AUDIO_MSG_COMPLETE:
|
||||
if (cbs->complete)
|
||||
{
|
||||
cbs->complete(arg);
|
||||
}
|
||||
break;
|
||||
|
||||
case AUDIO_MSG_STOP:
|
||||
running = false;
|
||||
break;
|
||||
|
||||
case AUDIO_MSG_USER:
|
||||
if (cbs->user)
|
||||
{
|
||||
cbs->user(arg, &msg, &running);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
1
audioutils/rtttl-c/.gitignore
vendored
Normal file
1
audioutils/rtttl-c/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/rtttl-c
|
||||
21
audioutils/rtttl-c/Kconfig
Normal file
21
audioutils/rtttl-c/Kconfig
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
config AUDIOUTILS_RTTTL_C
|
||||
bool "RTTTL parsing library"
|
||||
default n
|
||||
---help---
|
||||
Simple library for parsing Ring Tone Text Transfer Language (RTTTL)
|
||||
|
||||
Define how to make a sound:
|
||||
|
||||
void
|
||||
play_tone(struct rtttl_tone tone)
|
||||
{
|
||||
/* TODO: Make a sound with
|
||||
* tone.frequency_100hz
|
||||
* tone.period_us
|
||||
* tone.duration_us
|
||||
*/
|
||||
}
|
||||
|
||||
and then play RTTTL string:
|
||||
|
||||
rtttl_play("...", play_tone);
|
||||
25
audioutils/rtttl-c/Make.defs
Normal file
25
audioutils/rtttl-c/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/audioutils/rtttl-c/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_AUDIOUTILS_RTTTL_C),)
|
||||
CONFIGURED_APPS += $(APPDIR)/audioutils/rtttl-c
|
||||
endif
|
||||
50
audioutils/rtttl-c/Makefile
Normal file
50
audioutils/rtttl-c/Makefile
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
############################################################################
|
||||
# apps/audioutils/rtttl-c/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
CSRCS = $(RTTTL_C_DIR)/rtttl.c
|
||||
|
||||
RTTTL_C_DIR = rtttl-c
|
||||
RTTTL_C_VERSION = v0.1.0
|
||||
RTTTL_C_RTTTL_H_SHA256 = 6331174ae34a419ad427d9755f8ba9d3b6a92c09ecc4f36bbe07ec5e4d0cc007
|
||||
RTTTL_C_RTTTL_C_SHA256 = f0db64ef0b68136bac24616a3d62508bcc54ccdd68265d6447d99b264653b7b9
|
||||
|
||||
$(RTTTL_C_DIR):
|
||||
$(Q) echo "Cloning rtttl-c repo..."
|
||||
$(Q) git clone --depth=1 --branch=$(RTTTL_C_VERSION) https://git.sr.ht/~qeef/rtttl-c
|
||||
$(Q) touch $(RTTTL_C_DIR)
|
||||
$(Q) echo "Checking rtttl-c hashes..."
|
||||
$(Q) $(APPDIR)/tools/check-hash.sh sha256 $(RTTTL_C_RTTTL_H_SHA256) $@/rtttl.h
|
||||
$(Q) $(APPDIR)/tools/check-hash.sh sha256 $(RTTTL_C_RTTTL_C_SHA256) $@/rtttl.c
|
||||
|
||||
create_includes: $(RTTTL_C_DIR)/rtttl.h
|
||||
$(Q) cp $< $(APPDIR)/include/audioutils
|
||||
|
||||
context:: $(RTTTL_C_DIR)
|
||||
$(Q) $(MAKE) create_includes
|
||||
|
||||
distclean::
|
||||
$(call DELFILE, $(APPDIR)/include/audioutils/rtttl.h)
|
||||
$(call DELDIR, rtttl-c)
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
1
benchmarks/.gitignore
vendored
Normal file
1
benchmarks/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/Kconfig
|
||||
25
benchmarks/CMakeLists.txt
Normal file
25
benchmarks/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# ##############################################################################
|
||||
# apps/benchmarks/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
nuttx_add_subdirectory()
|
||||
|
||||
nuttx_generate_kconfig(MENUDESC "Benchmark Applications")
|
||||
23
benchmarks/Make.defs
Normal file
23
benchmarks/Make.defs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(wildcard $(APPDIR)/benchmarks/*/Make.defs)
|
||||
25
benchmarks/Makefile
Normal file
25
benchmarks/Makefile
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
MENUDESC = "Benchmark Applications"
|
||||
|
||||
include $(APPDIR)/Directory.mk
|
||||
33
benchmarks/cachespeed/CMakeLists.txt
Normal file
33
benchmarks/cachespeed/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# ##############################################################################
|
||||
# apps/benchmarks/cachespeed/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_BENCHMARK_CACHESPEED)
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
${CONFIG_BENCHMARK_CACHESPEED_PROGNAME}
|
||||
SRCS
|
||||
cachespeed_main.c
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_CACHESPEED_STACKSIZE}
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_CACHESPEED_PRIORITY})
|
||||
endif()
|
||||
44
benchmarks/cachespeed/Kconfig
Normal file
44
benchmarks/cachespeed/Kconfig
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
config BENCHMARK_CACHESPEED
|
||||
tristate "CACHE Speed Test"
|
||||
depends on ARCH_ICACHE && ARCH_DCACHE
|
||||
default n
|
||||
---help---
|
||||
Enable a simple CACHE speed test.
|
||||
|
||||
if BENCHMARK_CACHESPEED
|
||||
|
||||
config BENCHMARK_CACHESPEED_PROGNAME
|
||||
string "Program name"
|
||||
default "cachespeed"
|
||||
---help---
|
||||
This is the name of the program that will be used when the NSH ELF
|
||||
program is installed.
|
||||
|
||||
config BENCHMARK_CACHESPEED_PRIORITY
|
||||
int "CACHE speed test task priority"
|
||||
default 100
|
||||
|
||||
config BENCHMARK_CACHESPEED_STACKSIZE
|
||||
int "CACHE speed test stack size"
|
||||
default DEFAULT_TASK_STACKSIZE
|
||||
|
||||
config CACHESPEED_MONOTONIC_TIME
|
||||
bool "Using Clock Gettime"
|
||||
default n
|
||||
---help---
|
||||
When you turn on this option, your test loop will go from 10000 -> 1000 times
|
||||
Please consider the following scenario:
|
||||
1. By default (PERFTIME) will have a relatively high precision, but this also
|
||||
tends to cause failure in getting values on some smaller bytes, so reducing
|
||||
the precision with this option can make it easier to get data values.
|
||||
2. whether to compare data with the content of other tools (using CLOCK
|
||||
GETTIME method), if so, it is recommended to turn on, so as to ensure that
|
||||
the data precision of both consistent.
|
||||
|
||||
endif
|
||||
|
||||
25
benchmarks/cachespeed/Make.defs
Normal file
25
benchmarks/cachespeed/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/cachespeed/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_CACHESPEED),)
|
||||
CONFIGURED_APPS += $(APPDIR)/benchmarks/cachespeed
|
||||
endif
|
||||
38
benchmarks/cachespeed/Makefile
Normal file
38
benchmarks/cachespeed/Makefile
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/cachespeed/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
#CACHE speed test
|
||||
|
||||
ifneq ($(CONFIG_CACHESPEED_MONOTONIC_TIME),y)
|
||||
CFLAGS += -DCACHESPEED_PERFTIME
|
||||
endif
|
||||
|
||||
PROGNAME = $(CONFIG_BENCHMARK_CACHESPEED_PROGNAME)
|
||||
PRIORITY = $(CONFIG_BENCHMARK_CACHESPEED_PRIORITY)
|
||||
STACKSIZE = $(CONFIG_BENCHMARK_CACHESPEED_STACKSIZE)
|
||||
MODULE = $(CONFIG_BENCHMARK_CACHESPEED)
|
||||
|
||||
MAINSRC = cachespeed_main.c
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
254
benchmarks/cachespeed/cachespeed_main.c
Normal file
254
benchmarks/cachespeed/cachespeed_main.c
Normal file
|
|
@ -0,0 +1,254 @@
|
|||
/****************************************************************************
|
||||
* apps/benchmarks/cachespeed/cachespeed_main.c
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/arch.h>
|
||||
#include <nuttx/cache.h>
|
||||
#include <nuttx/config.h>
|
||||
#include <nuttx/irq.h>
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <malloc.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define CACHESPEED_PREFIX "CACHE Speed: "
|
||||
#define REPEAT_NUM 1000
|
||||
|
||||
#ifdef CACHESPEED_PERFTIME
|
||||
#define TIME uint64_t
|
||||
|
||||
#define CONVERT(cost) \
|
||||
do \
|
||||
{ \
|
||||
struct timespec ts; \
|
||||
perf_convert(cost, &ts); \
|
||||
cost = ts.tv_sec * 1000000000 + ts.tv_nsec; \
|
||||
} while (0)
|
||||
|
||||
#define TIMESTAMP(x) (x) = perf_gettime()
|
||||
#else
|
||||
#define TIME time_t
|
||||
|
||||
#define CONVERT(cost)
|
||||
|
||||
#define TIMESTAMP(x) \
|
||||
do \
|
||||
{ \
|
||||
struct timespec ts; \
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts); \
|
||||
x = ts.tv_sec * 1000000000 + ts.tv_nsec; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#define GET_DCACHE_LINE up_get_dcache_linesize()
|
||||
#define GET_ICACHE_LINE up_get_icache_linesize()
|
||||
#define GET_DCACHE_SIZE up_get_dcache_size()
|
||||
#define GET_ICACHE_SIZE up_get_icache_size()
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct cachespeed_s
|
||||
{
|
||||
uintptr_t addr;
|
||||
size_t alloc;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: setup
|
||||
****************************************************************************/
|
||||
|
||||
static void setup(FAR struct cachespeed_s *cs)
|
||||
{
|
||||
struct mallinfo info = mallinfo();
|
||||
|
||||
/* Get the currently available memory from the system. We want the
|
||||
* memset range to be as large as possible in our tests to ensure
|
||||
* that the cache is filled with our dirty data
|
||||
*/
|
||||
|
||||
cs->alloc = info.fordblks / 2;
|
||||
cs->addr = (uintptr_t)malloc(cs->alloc);
|
||||
if (cs->addr == 0)
|
||||
{
|
||||
printf(CACHESPEED_PREFIX "Unable to request memory.\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* Let's export the test message */
|
||||
|
||||
printf(CACHESPEED_PREFIX "address src: %" PRIxPTR "\n", cs->addr);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: teardown
|
||||
****************************************************************************/
|
||||
|
||||
static void teardown(FAR struct cachespeed_s *cs)
|
||||
{
|
||||
free((void *)cs->addr);
|
||||
printf(CACHESPEED_PREFIX "Done!\n");
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: report_line
|
||||
****************************************************************************/
|
||||
|
||||
static void report_line(size_t bytes, TIME cost)
|
||||
{
|
||||
double rate;
|
||||
|
||||
/* There is a situation: if the time is 0, then the
|
||||
* calculated speed is wrong.
|
||||
*/
|
||||
|
||||
CONVERT(cost);
|
||||
|
||||
if (cost == 0)
|
||||
{
|
||||
printf(CACHESPEED_PREFIX "%zu bytes cost time too small!\n", bytes);
|
||||
return;
|
||||
}
|
||||
|
||||
/* rate = Test Data Size / Execution Time */
|
||||
|
||||
rate = 1.00 * bytes * REPEAT_NUM / cost;
|
||||
|
||||
printf("%zu Bytes: %4lf, %4" PRIu64", %4" PRIu64"\n\r",
|
||||
bytes, rate, cost / REPEAT_NUM, cost);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: test_skeleton
|
||||
****************************************************************************/
|
||||
|
||||
static void test_skeleton(FAR struct cachespeed_s *cs,
|
||||
const size_t cache_size,
|
||||
const size_t cache_line_size, int align,
|
||||
void (*func)(uintptr_t, uintptr_t),
|
||||
const char *name)
|
||||
{
|
||||
size_t update_size;
|
||||
printf("** %s [rate, avg, cost] in nanoseconds(bytes/nesc) %s **\n",
|
||||
name, align ? "align" : "unalign");
|
||||
|
||||
if (!align)
|
||||
{
|
||||
update_size = cache_line_size - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
update_size = cache_line_size;
|
||||
}
|
||||
|
||||
for (size_t bytes = update_size;
|
||||
bytes <= cache_size; bytes = 2 * bytes)
|
||||
{
|
||||
irqstate_t irq;
|
||||
TIME start;
|
||||
TIME end;
|
||||
TIME cost = 0;
|
||||
|
||||
/* Make sure that test with all the contents
|
||||
* of our address in the cache.
|
||||
*/
|
||||
|
||||
up_flush_dcache_all();
|
||||
|
||||
irq = enter_critical_section();
|
||||
for (int i = 0; i < REPEAT_NUM; i++)
|
||||
{
|
||||
memset((void *)cs->addr, 1, cs->alloc);
|
||||
TIMESTAMP(start);
|
||||
func(cs->addr, (uintptr_t)(cs->addr + bytes));
|
||||
TIMESTAMP(end);
|
||||
cost += end - start;
|
||||
}
|
||||
|
||||
leave_critical_section(irq);
|
||||
report_line(bytes, cost);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cachespeed_common
|
||||
****************************************************************************/
|
||||
|
||||
static void cachespeed_common(struct cachespeed_s *cs)
|
||||
{
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 1,
|
||||
up_invalidate_dcache, "dcache invalidate");
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 0,
|
||||
up_invalidate_dcache, "dcache invalidate");
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 1,
|
||||
up_clean_dcache, "dcache clean");
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 0,
|
||||
up_clean_dcache, "dcache clean");
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 1,
|
||||
up_flush_dcache, "dcache flush");
|
||||
test_skeleton(cs, GET_DCACHE_SIZE, GET_DCACHE_LINE, 0,
|
||||
up_flush_dcache, "dcache flush");
|
||||
test_skeleton(cs, GET_ICACHE_SIZE, GET_ICACHE_LINE, 1,
|
||||
up_invalidate_icache, "icache invalidate");
|
||||
test_skeleton(cs, GET_ICACHE_SIZE, GET_ICACHE_LINE, 0,
|
||||
up_invalidate_icache, "icache invalidate");
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cachespeed_main
|
||||
****************************************************************************/
|
||||
|
||||
int main(int argc, FAR char *argv[])
|
||||
{
|
||||
struct cachespeed_s cs =
|
||||
{
|
||||
.addr = 0,
|
||||
.alloc = 0
|
||||
};
|
||||
|
||||
setup(&cs);
|
||||
cachespeed_common(&cs);
|
||||
teardown(&cs);
|
||||
return 0;
|
||||
}
|
||||
1
benchmarks/coremark-pro/.gitignore
vendored
Normal file
1
benchmarks/coremark-pro/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/coremark-pro
|
||||
333
benchmarks/coremark-pro/CMakeLists.txt
Normal file
333
benchmarks/coremark-pro/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,333 @@
|
|||
# ##############################################################################
|
||||
# apps/benchmarks/coremark-pro/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO)
|
||||
|
||||
set(COREMARKAPP_DIR ${CMAKE_CURRENT_LIST_DIR}/coremark-pro)
|
||||
|
||||
if(NOT EXISTS ${COREMARKAPP_DIR})
|
||||
FetchContent_Declare(
|
||||
coremark_fetch
|
||||
URL https://github.com/eembc/coremark-pro/archive/refs/heads/main.zip
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/coremark-pro BINARY_DIR
|
||||
${CMAKE_BINARY_DIR}/apps/benchmarks/coremark/coremark-pro
|
||||
DOWNLOAD_NO_PROGRESS true
|
||||
TIMEOUT 30)
|
||||
|
||||
FetchContent_GetProperties(coremark_fetch)
|
||||
if(NOT coremark_fetch_POPULATED)
|
||||
FetchContent_Populate(coremark_fetch)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
nuttx_add_library(coremark_pro STATIC)
|
||||
|
||||
set(CSRCS
|
||||
coremark-pro/mith/src/md5.c
|
||||
coremark-pro/mith/src/mith_lib.c
|
||||
coremark-pro/mith/src/mith_workload.c
|
||||
coremark-pro/mith/src/th_bignum.c
|
||||
coremark-pro/mith/src/th_encode.c
|
||||
coremark-pro/mith/src/th_lib.c
|
||||
coremark-pro/mith/src/th_math.c
|
||||
coremark-pro/mith/src/th_rand.c)
|
||||
|
||||
file(GLOB MITH_AL_SRCS coremark-pro/mith/al/src/*.c)
|
||||
|
||||
list(APPEND CSRCS ${MITH_AL_SRCS})
|
||||
|
||||
set(CFLAGS
|
||||
-Wno-undef
|
||||
-Wno-strict-prototypes
|
||||
-Wno-unused-variable
|
||||
-Wno-pointer-sign
|
||||
-Wno-unused-but-set-variable
|
||||
-Wno-shadow
|
||||
-DNDEBUG
|
||||
-DHOST_EXAMPLE_CODE=1
|
||||
-DHAVE_SYS_STAT_H=1
|
||||
-DGCC_INLINE_MACRO=1
|
||||
-DMAX_CONTEXTS=100
|
||||
-DEE_SIZEOF_INT=4
|
||||
-DUSE_FP128=0)
|
||||
|
||||
set(INCDIR ${CMAKE_CURRENT_LIST_DIR}/coremark-pro/mith/include
|
||||
${CMAKE_CURRENT_LIST_DIR}/coremark-pro/mith/al/include)
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_USE_SINGLE_CONTEXT)
|
||||
list(APPEND CFLAGS -DUSE_SINGLE_CONTEXT=1 -DHAVE_PTHREAD=0
|
||||
-DUSE_NATIVE_PTHREAD=0)
|
||||
else()
|
||||
list(APPEND CFLAGS -DUSE_SINGLE_CONTEXT=0 -DHAVE_PTHREAD=1
|
||||
-DUSE_NATIVE_PTHREAD=1)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_SMP)
|
||||
list(APPEND CFLAGS -DHAVE_PTHREAD_SETAFFINITY_NP=1 -DHAVE_PTHREAD_SELF=1)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_64BIT)
|
||||
list(APPEND CFLAGS -DEE_SIZEOF_PTR=8 -DEE_PTR_ALIGN=8 -DEE_SIZEOF_LONG=8)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64)
|
||||
|
||||
list(APPEND CFLAGS -DUSE_FP64=1 -DUSE_FP32=0)
|
||||
list(APPEND CSRCS coremark-pro/benchmarks/fp/linpack/ref/inputs_f64.c)
|
||||
|
||||
else()
|
||||
list(APPEND CFLAGS -DUSE_FP32=1 -DUSE_FP64=0)
|
||||
list(APPEND CSRCS coremark-pro/benchmarks/fp/linpack/ref/inputs_f32.c)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_CORE_TEST)
|
||||
file(GLOB CORE_TEST_SRCS coremark-pro/benchmarks/core/*.c)
|
||||
set(CORE_TEST_CSRCS coremark-pro/workloads/core/core.c ${CORE_TEST_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
core
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${CORE_TEST_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_CJPEG_TEST)
|
||||
file(GLOB CJPEG_SRCS coremark-pro/benchmarks/consumer_v2/cjpeg/*.c)
|
||||
set(CJPEG_CSRCS
|
||||
coremark-pro/workloads/cjpeg-rose7-preset/cjpeg-rose7-preset.c
|
||||
coremark-pro/benchmarks/consumer_v2/cjpeg/data/Rose256_bmp.c
|
||||
${CJPEG_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
cjpeg_rose7_preset
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${CJPEG_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_SHA_TEST)
|
||||
file(GLOB SHA_TEST_SRCS coremark-pro/benchmarks/darkmark/sha/*.c)
|
||||
set(SHA_TEST_CSRCS coremark-pro/workloads/sha-test/sha-test.c
|
||||
${SHA_TEST_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
sha_test
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${SHA_TEST_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_ZIP_TEST)
|
||||
set(ZIP_TEST_CSRCS coremark-pro/workloads/zip-test/zip-test.c
|
||||
coremark-pro/benchmarks/darkmark/zip/zip_darkmark.c)
|
||||
set(ZIP_TEST_FLAGS ${CFLAGS} -Dgzclose_r=coremark_zip_gzclose_r
|
||||
-Dgzclose_w=coremark_zip_gzclose_w)
|
||||
set(ZIP_TEST_INCDIR ${INCDIR} ${NUTTX_APPS_DIR}/system/zlib/zlib)
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
zip_test
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${ZIP_TEST_FLAGS}
|
||||
SRCS
|
||||
${ZIP_TEST_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${ZIP_TEST_INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_LINEAR_ALG_MID_TEST)
|
||||
set(ALG_MID_CSRCS
|
||||
coremark-pro/workloads/linear_alg-mid-100x100-sp/linear_alg-mid-100x100-sp.c
|
||||
coremark-pro/benchmarks/fp/linpack/linpack.c)
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
linear_alg_mid_100x100_sp
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${ALG_MID_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_RADIX_TEST)
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64)
|
||||
file(GLOB RADIX_SRCS coremark-pro/benchmarks/fp/fft_radix2/ref/*.c)
|
||||
else()
|
||||
file(GLOB RADIX_SRCS coremark-pro/benchmarks/fp/fft_radix2/ref-sp/*.c)
|
||||
endif()
|
||||
|
||||
set(RADIX_CSRCS
|
||||
coremark-pro/workloads/radix2-big-64k/radix2-big-64k.c
|
||||
coremark-pro/benchmarks/fp/fft_radix2/fft_radix2.c ${RADIX_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
radix2_big_64k
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${RADIX_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_LOOPS_ALL_MID_TEST)
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64)
|
||||
file(GLOB MID_SRCS coremark-pro/benchmarks/fp/loops/ref/*.c)
|
||||
else()
|
||||
file(GLOB MID_SRCS coremark-pro/benchmarks/fp/loops/ref-sp/*.c)
|
||||
endif()
|
||||
|
||||
set(MID_CSRCS
|
||||
coremark-pro/workloads/loops-all-mid-10k-sp/loops-all-mid-10k-sp.c
|
||||
coremark-pro/benchmarks/fp/loops/loops.c ${MID_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
loops_all_mid_10k_sp
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${MID_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_NNET_TEST)
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64)
|
||||
file(GLOB NNET_SRCS coremark-pro/benchmarks/fp/nnet/ref/*.c)
|
||||
else()
|
||||
file(GLOB NNET_SRCS coremark-pro/benchmarks/fp/nnet/ref-sp/*.c)
|
||||
endif()
|
||||
file(GLOB FP_NNET_SRCS coremark-pro/benchmarks/fp/nnet/*.c)
|
||||
set(NNET_CSRCS coremark-pro/workloads/nnet_test/nnet_test.c ${FP_NNET_SRCS}
|
||||
${NNET_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
nnet_test
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${NNET_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK_PRO_PARSER_125K)
|
||||
file(GLOB PARSER_SRCS coremark-pro/benchmarks/darkmark/parser/*.c)
|
||||
set(PARSER_CSRCS coremark-pro/workloads/parser-125k/parser-125k.c
|
||||
${PARSER_SRCS})
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
parser_125k
|
||||
PRIORITY
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK_PRO}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${PARSER_CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR}
|
||||
DEPENDS
|
||||
coremark_pro)
|
||||
endif()
|
||||
|
||||
target_sources(coremark_pro PRIVATE ${CSRCS})
|
||||
target_include_directories(coremark_pro PRIVATE ${INCDIR})
|
||||
target_compile_options(coremark_pro PRIVATE ${CFLAGS})
|
||||
|
||||
endif()
|
||||
81
benchmarks/coremark-pro/Kconfig
Normal file
81
benchmarks/coremark-pro/Kconfig
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
menuconfig BENCHMARK_COREMARK_PRO
|
||||
tristate "Coremark Pro Benchmark"
|
||||
default n
|
||||
depends on LIBC_FLOATINGPOINT
|
||||
|
||||
if BENCHMARK_COREMARK_PRO
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_STACKSIZE
|
||||
int "Coremark Pro stack size"
|
||||
default 131072
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_PRIORITY
|
||||
int "Coremark Pro priority"
|
||||
default 100
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_USE_SINGLE_CONTEXT
|
||||
bool "use single context"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_SMP
|
||||
bool "Relevant configurations in case of SMP"
|
||||
default n
|
||||
depends on SMP && !BENCHMARK_COREMARK_PRO_USE_SINGLE_CONTEXT
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_64BIT
|
||||
bool "Running on 64-bit operating systems"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_USE_FP64
|
||||
bool "USE FP64 Data for Test"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_CORE_TEST
|
||||
bool "Core Test"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_CJPEG_TEST
|
||||
bool "cjpeg-rose7-preset"
|
||||
default n
|
||||
---help---
|
||||
Before using this case, place the files in coremark-pro/benchmarks/libbmp
|
||||
and coremark-pro/benchmarks/libjpeg in /data/libbmp and /data/libjpeg
|
||||
respectively
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_LINEAR_ALG_MID_TEST
|
||||
bool "Linear_alg_mid TEST"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_SHA_TEST
|
||||
bool "SHA Test"
|
||||
default n
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_ZIP_TEST
|
||||
bool "Zip Test"
|
||||
depends on LIB_ZLIB
|
||||
default n
|
||||
|
||||
choice
|
||||
prompt "Coremark Pro FP Test Case configuration"
|
||||
default BENCHMARK_COREMARK_PRO_RADIX_TEST
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_RADIX_TEST
|
||||
bool "Radix Test"
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_LOOPS_ALL_MID_TEST
|
||||
bool "Loops-all-mid test"
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_NNET_TEST
|
||||
bool "Nnet Test"
|
||||
|
||||
config BENCHMARK_COREMARK_PRO_PARSER_125K
|
||||
bool "Parser 125K Test"
|
||||
|
||||
endchoice
|
||||
|
||||
endif
|
||||
25
benchmarks/coremark-pro/Make.defs
Normal file
25
benchmarks/coremark-pro/Make.defs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/coremark-pro/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO),)
|
||||
CONFIGURED_APPS += $(APPDIR)/benchmarks/coremark-pro
|
||||
endif
|
||||
160
benchmarks/coremark-pro/Makefile
Normal file
160
benchmarks/coremark-pro/Makefile
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/coremark-pro/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
PRIORITY = $(CONFIG_BENCHMARK_COREMARK_PRO_PRIORITY)
|
||||
STACKSIZE = $(CONFIG_BENCHMARK_COREMARK_PRO_STACKSIZE)
|
||||
MODULE = $(CONFIG_BENCHMARK_COREMARK_PRO)
|
||||
|
||||
CFLAGS += -Wno-undef -Wno-strict-prototypes -Wno-unused-variable \
|
||||
-Wno-pointer-sign -Wno-unused-but-set-variable -Wno-shadow
|
||||
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/benchmarks/coremark-pro/coremark-pro/mith/include
|
||||
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/benchmarks/coremark-pro/coremark-pro/mith/al/include
|
||||
CFLAGS += -DNDEBUG -DHOST_EXAMPLE_CODE=1 -DHAVE_SYS_STAT_H=1 \
|
||||
-DGCC_INLINE_MACRO=1 -DMAX_CONTEXTS=100 -DEE_SIZEOF_INT=4 \
|
||||
-DUSE_FP128=0
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_USE_SINGLE_CONTEXT),)
|
||||
CFLAGS += -DUSE_SINGLE_CONTEXT=1 -DHAVE_PTHREAD=0 -DUSE_NATIVE_PTHREAD=0
|
||||
else
|
||||
CFLAGS += -DUSE_SINGLE_CONTEXT=0 -DHAVE_PTHREAD=1 -DUSE_NATIVE_PTHREAD=1
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_SMP),)
|
||||
CFLAGS += -DHAVE_PTHREAD_SETAFFINITY_NP=1 -DHAVE_PTHREAD_SELF=1
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_64BIT),)
|
||||
CFLAGS += -DEE_SIZEOF_PTR=8 -DEE_PTR_ALIGN=8 -DEE_SIZEOF_LONG=8
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64),)
|
||||
CFLAGS += -DUSE_FP64=1 -DUSE_FP32=0
|
||||
CSRCS += coremark-pro/benchmarks/fp/linpack/ref/inputs_f64.c
|
||||
else
|
||||
CFLAGS += -DUSE_FP32=1 -DUSE_FP64=0
|
||||
CSRCS += coremark-pro/benchmarks/fp/linpack/ref/inputs_f32.c
|
||||
endif
|
||||
|
||||
CSRCS += coremark-pro/mith/src/md5.c
|
||||
CSRCS += coremark-pro/mith/src/mith_lib.c
|
||||
CSRCS += coremark-pro/mith/src/mith_workload.c
|
||||
CSRCS += coremark-pro/mith/src/th_bignum.c
|
||||
CSRCS += coremark-pro/mith/src/th_encode.c
|
||||
CSRCS += coremark-pro/mith/src/th_lib.c
|
||||
CSRCS += coremark-pro/mith/src/th_math.c
|
||||
CSRCS += coremark-pro/mith/src/th_rand.c
|
||||
|
||||
CSRCS += $(wildcard coremark-pro/mith/al/src/*.c)
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_CORE_TEST),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/core/*.c)
|
||||
MAINSRC += coremark-pro/workloads/core/core.c
|
||||
PROGNAME += core
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_CJPEG_TEST),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/consumer_v2/cjpeg/*.c)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/consumer_v2/cjpeg/data/Rose256_bmp.c)
|
||||
MAINSRC += coremark-pro/workloads/cjpeg-rose7-preset/cjpeg-rose7-preset.c
|
||||
PROGNAME += cjpeg_rose7_preset
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_SHA_TEST),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/darkmark/sha/*.c)
|
||||
MAINSRC += coremark-pro/workloads/sha-test/sha-test.c
|
||||
PROGNAME += sha_test
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_ZIP_TEST),)
|
||||
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/system/zlib/zlib
|
||||
CFLAGS += -Dgzclose_r=coremark_zip_gzclose_r -Dgzclose_w=coremark_zip_gzclose_w
|
||||
CSRCS += coremark-pro/benchmarks/darkmark/zip/zip_darkmark.c
|
||||
MAINSRC += coremark-pro/workloads/zip-test/zip-test.c
|
||||
PROGNAME += zip_test
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_LINEAR_ALG_MID_TEST),)
|
||||
CSRCS += coremark-pro/benchmarks/fp/linpack/linpack.c
|
||||
MAINSRC += coremark-pro/workloads/linear_alg-mid-100x100-sp/linear_alg-mid-100x100-sp.c
|
||||
PROGNAME += linear_alg_mid_100x100_sp
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_RADIX_TEST),)
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/fft_radix2/ref/*.c)
|
||||
else
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/fft_radix2/ref-sp/*.c)
|
||||
endif
|
||||
|
||||
CSRCS += coremark-pro/benchmarks/fp/fft_radix2/fft_radix2.c
|
||||
MAINSRC += coremark-pro/workloads/radix2-big-64k/radix2-big-64k.c
|
||||
PROGNAME += radix2_big_64k
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_LOOPS_ALL_MID_TEST),)
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/loops/ref/*.c)
|
||||
else
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/loops/ref-sp/*.c)
|
||||
endif
|
||||
|
||||
CSRCS += coremark-pro/benchmarks/fp/loops/loops.c
|
||||
MAINSRC += coremark-pro/workloads/loops-all-mid-10k-sp/loops-all-mid-10k-sp.c
|
||||
PROGNAME += loops_all_mid_10k_sp
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_NNET_TEST),)
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_USE_FP64),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/nnet/ref/*.c)
|
||||
else
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/nnet/ref-sp/*.c)
|
||||
endif
|
||||
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/fp/nnet/*.c)
|
||||
MAINSRC += coremark-pro/workloads/nnet_test/nnet_test.c
|
||||
PROGNAME += nnet_test
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK_PRO_PARSER_125K),)
|
||||
CSRCS += $(wildcard coremark-pro/benchmarks/darkmark/parser/*.c)
|
||||
MAINSRC += coremark-pro/workloads/parser-125k/parser-125k.c
|
||||
PROGNAME += parser_125k
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard coremark-pro/.git),)
|
||||
VERSION ?= main
|
||||
coremark-pro.zip:
|
||||
$(Q) curl -L https://github.com/eembc/coremark-pro/archive/refs/heads/main.zip -o coremark-pro.zip
|
||||
$(Q) unzip -o coremark-pro.zip
|
||||
$(Q) mv coremark-pro-$(VERSION) coremark-pro
|
||||
|
||||
context:: coremark-pro.zip
|
||||
|
||||
distclean::
|
||||
$(call DELDIR, coremark-pro)
|
||||
$(call DELFILE, coremark-pro.zip)
|
||||
|
||||
endif
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
2
benchmarks/coremark/.gitignore
vendored
Normal file
2
benchmarks/coremark/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/coremark
|
||||
/*.zip
|
||||
153
benchmarks/coremark/CMakeLists.txt
Normal file
153
benchmarks/coremark/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,153 @@
|
|||
# ##############################################################################
|
||||
# apps/benchmarks/coremark/CMakeLists.txt
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_BENCHMARK_COREMARK)
|
||||
|
||||
# ############################################################################
|
||||
# Config and Fetch Coremark application
|
||||
# ############################################################################
|
||||
|
||||
set(COREMARKAPP_DIR ${CMAKE_CURRENT_LIST_DIR}/coremark)
|
||||
|
||||
if(NOT EXISTS ${COREMARKAPP_DIR})
|
||||
FetchContent_Declare(
|
||||
coremark_fetch
|
||||
URL https://github.com/eembc/coremark/archive/main.zip SOURCE_DIR
|
||||
${CMAKE_CURRENT_LIST_DIR}/coremark BINARY_DIR
|
||||
${CMAKE_BINARY_DIR}/apps/benchmarks/coremark/coremark
|
||||
DOWNLOAD_NO_PROGRESS true
|
||||
TIMEOUT 30)
|
||||
|
||||
FetchContent_GetProperties(coremark_fetch)
|
||||
if(NOT coremark_fetch_POPULATED)
|
||||
FetchContent_Populate(coremark_fetch)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CONFIG_COREMARK_MULTITHREAD_OVERRIDE)
|
||||
set(COREMARK_NTHREADS ${CONFIG_COREMARK_MULTITHREAD_COUNT})
|
||||
endif()
|
||||
|
||||
if(CONFIG_SMP_NCPUS)
|
||||
set(COREMARK_NTHREADS ${CONFIG_SMP_NCPUS})
|
||||
else()
|
||||
set(COREMARK_NTHREADS 1)
|
||||
endif()
|
||||
|
||||
if(CONFIG_COREMARK_PRINT_ARGS)
|
||||
set(COREMARK_PRINT_ARGS 1)
|
||||
else()
|
||||
set(COREMARK_PRINT_ARGS 0)
|
||||
endif()
|
||||
|
||||
# ############################################################################
|
||||
# Flags
|
||||
# ############################################################################
|
||||
|
||||
if(CONFIG_COREMARK_MULTITHREAD_OVERRIDE)
|
||||
set(COREMARK_NTHREADS ${CONFIG_COREMARK_MULTITHREAD_COUNT})
|
||||
else()
|
||||
if(CONFIG_SMP_NCPUS)
|
||||
set(COREMARK_NTHREADS ${CONFIG_SMP_NCPUS})
|
||||
else()
|
||||
set(COREMARK_NTHREADS 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CONFIG_COREMARK_PRINT_ARGS)
|
||||
set(COREMARK_PRINT_ARGS 1)
|
||||
else()
|
||||
set(COREMARK_PRINT_ARGS 0)
|
||||
endif()
|
||||
|
||||
get_target_property(FLAGS_STR_LIST nuttx COMPILE_OPTIONS)
|
||||
list(JOIN FLAGS_STR_LIST " " FLAGS_STR)
|
||||
|
||||
set(CFLAGS -Dcrc16=coremark_crc16 -Wno-strict-prototypes -Wno-undef)
|
||||
|
||||
if("${CONFIG_COREMARK_MEM_METHOD}" STREQUAL "1")
|
||||
list(APPEND CFLAGS -DMEM_LOCATION=\"HEAP\")
|
||||
elseif("${CONFIG_COREMARK_MEM_METHOD}" STREQUAL "2")
|
||||
list(APPEND CFLAGS -DMEM_LOCATION=\"STACK\")
|
||||
else()
|
||||
list(APPEND CFLAGS -DMEM_LOCATION=\"GLOBAL\")
|
||||
endif()
|
||||
|
||||
list(
|
||||
APPEND
|
||||
CFLAGS
|
||||
-DCALLGRIND_RUN=0
|
||||
-DCOMPILER_REQUIRES_SORT_RETURN=0
|
||||
-DCORE_DEBUG=${CONFIG_COREMARK_DEBUG}
|
||||
-DFLAGS_STR="${FLAGS_STR}"
|
||||
-DMEM_METHOD=${CONFIG_COREMARK_MEM_METHOD}
|
||||
-DMICA=0
|
||||
-DMULTITHREAD=${COREMARK_NTHREADS}
|
||||
-DPERFORMANCE_RUN=1
|
||||
-DPRINT_ARGS=${COREMARK_PRINT_ARGS}
|
||||
-DSEED_METHOD=${CONFIG_COREMARK_SEED_METHOD}
|
||||
-DUSE_CLOCK=1
|
||||
-DUSE_PTHREAD)
|
||||
|
||||
if(CONFIG_COREMARK_ITERATIONS_OVERRIDE)
|
||||
list(APPEND CFLAGS -DITERATIONS=${CONFIG_COREMARK_ITERATIONS_COUNT})
|
||||
else()
|
||||
list(APPEND CFLAGS -DITERATIONS=0)
|
||||
|
||||
endif()
|
||||
|
||||
# ############################################################################
|
||||
# Sources
|
||||
# ############################################################################
|
||||
|
||||
set(CSRCS
|
||||
${COREMARKAPP_DIR}/core_main.c ${COREMARKAPP_DIR}/core_list_join.c
|
||||
${COREMARKAPP_DIR}/core_matrix.c ${COREMARKAPP_DIR}/core_state.c
|
||||
${COREMARKAPP_DIR}/core_util.c ${COREMARKAPP_DIR}/posix/core_portme.c)
|
||||
|
||||
# ############################################################################
|
||||
# Include Directory
|
||||
# ############################################################################
|
||||
|
||||
set(INCDIR ${COREMARKAPP_DIR} ${COREMARKAPP_DIR}/posix)
|
||||
|
||||
# ############################################################################
|
||||
# Applications Configuration
|
||||
# ############################################################################
|
||||
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
${CONFIG_COREMARK_PROGNAME}
|
||||
PRIORITY
|
||||
${CONFIG_COREMARK_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_COREMARK_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_COREMARK}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR})
|
||||
|
||||
endif()
|
||||
86
benchmarks/coremark/Kconfig
Normal file
86
benchmarks/coremark/Kconfig
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
menuconfig BENCHMARK_COREMARK
|
||||
tristate "CoreMark Benchmark"
|
||||
select LIBC_FLOATINGPOINT
|
||||
default n
|
||||
---help---
|
||||
Enable support for the EEMBC's CoreMark benchmark application.
|
||||
|
||||
if BENCHMARK_COREMARK
|
||||
|
||||
config COREMARK_PROGNAME
|
||||
string "CoreMark program name"
|
||||
default "coremark"
|
||||
---help---
|
||||
This is the name of the program that will be used when the NSH ELF
|
||||
program is installed.
|
||||
|
||||
config COREMARK_PRIORITY
|
||||
int "CoreMark task priority"
|
||||
default 100
|
||||
|
||||
config COREMARK_STACKSIZE
|
||||
int "CoreMark task stack size"
|
||||
default 4096
|
||||
|
||||
config COREMARK_SEED_METHOD
|
||||
int "Coremark Seed Method"
|
||||
default 2
|
||||
---help---
|
||||
Set Coremark Seed Method:
|
||||
0: SEED_ARG
|
||||
1: SEED_FUNC
|
||||
2: SEED_VOLATILE
|
||||
|
||||
config COREMARK_MEM_METHOD
|
||||
int "Coremark Memory Method"
|
||||
default 1
|
||||
---help---
|
||||
Set Coremark Memory Method:
|
||||
0: MEM_STATIC
|
||||
1: MEM_MALLOC
|
||||
2: MEM_STACK
|
||||
|
||||
config COREMARK_DEBUG
|
||||
int "Coremark Core Debug"
|
||||
default 0
|
||||
---help---
|
||||
Enable the Core Debug:
|
||||
0: Disable
|
||||
1: Enable
|
||||
|
||||
config COREMARK_PRINT_ARGS
|
||||
bool "Print CoreMark arguments when executing"
|
||||
default n
|
||||
---help---
|
||||
Print the command line arguments passed on to coremark.
|
||||
|
||||
config COREMARK_MULTITHREAD_OVERRIDE
|
||||
bool "Override number of threads"
|
||||
default n
|
||||
---help---
|
||||
Override the default number of threads to be executed.
|
||||
The default value is the same as the number of CPU cores.
|
||||
|
||||
config COREMARK_MULTITHREAD_COUNT
|
||||
depends on COREMARK_MULTITHREAD_OVERRIDE
|
||||
int "Number of threads to be executed"
|
||||
default 1
|
||||
|
||||
config COREMARK_ITERATIONS_OVERRIDE
|
||||
bool "Override number of iterations"
|
||||
default n
|
||||
---help---
|
||||
Override the default number of iterations for the benchmark.
|
||||
The default value is defined by the application based on the system.
|
||||
|
||||
config COREMARK_ITERATIONS_COUNT
|
||||
depends on COREMARK_ITERATIONS_OVERRIDE
|
||||
int "Number of iterations"
|
||||
default 100
|
||||
|
||||
endif # BENCHMARK_COREMARK
|
||||
27
benchmarks/coremark/Make.defs
Normal file
27
benchmarks/coremark/Make.defs
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/coremark/Make.defs
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_COREMARK),)
|
||||
CONFIGURED_APPS += $(APPDIR)/benchmarks/coremark
|
||||
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/benchmarks/coremark/coremark
|
||||
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/benchmarks/coremark/coremark/posix
|
||||
endif
|
||||
145
benchmarks/coremark/Makefile
Normal file
145
benchmarks/coremark/Makefile
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/coremark/Makefile
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
# Coremark application
|
||||
|
||||
############################################################################
|
||||
# Flags
|
||||
############################################################################
|
||||
|
||||
COREMARK_URL ?= "https://github.com/eembc/coremark/archive"
|
||||
|
||||
COREMARK_VERSION = main
|
||||
COREMARK_ZIP = $(COREMARK_VERSION).zip
|
||||
|
||||
COREMARK_UNPACKNAME = coremark
|
||||
UNPACK ?= unzip -q -o
|
||||
|
||||
VPATH += $(COREMARK_UNPACKNAME)
|
||||
VPATH += $(COREMARK_UNPACKNAME)$(DELIM)posix
|
||||
DEPPATH += --dep-path $(COREMARK_UNPACKNAME)
|
||||
DEPPATH += --dep-path $(COREMARK_UNPACKNAME)$(DELIM)posix
|
||||
|
||||
CFLAGS += -Dcrc16=coremark_crc16
|
||||
CFLAGS += -Wno-strict-prototypes -Wno-undef
|
||||
|
||||
ifeq ($(CONFIG_COREMARK_MULTITHREAD_OVERRIDE),y)
|
||||
COREMARK_NTHREADS = $(CONFIG_COREMARK_MULTITHREAD_COUNT)
|
||||
else
|
||||
ifneq ($(CONFIG_SMP_NCPUS),)
|
||||
COREMARK_NTHREADS = $(CONFIG_SMP_NCPUS)
|
||||
else
|
||||
COREMARK_NTHREADS = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_COREMARK_PRINT_ARGS),y)
|
||||
COREMARK_PRINT_ARGS = 1
|
||||
else
|
||||
COREMARK_PRINT_ARGS = 0
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_COREMARK_MEM_METHOD), 1)
|
||||
CFLAGS += ${DEFINE_PREFIX}MEM_LOCATION=\"HEAP\"
|
||||
else ifeq ($(CONFIG_COREMARK_MEM_METHOD), 2)
|
||||
CFLAGS += ${DEFINE_PREFIX}MEM_LOCATION=\"STACK\"
|
||||
else
|
||||
CFLAGS += ${DEFINE_PREFIX}MEM_LOCATION=\"GLOBAL\"
|
||||
endif
|
||||
|
||||
CFLAGS += ${DEFINE_PREFIX}CALLGRIND_RUN=0
|
||||
CFLAGS += ${DEFINE_PREFIX}COMPILER_REQUIRES_SORT_RETURN=0
|
||||
CFLAGS += ${DEFINE_PREFIX}CORE_DEBUG=$(CONFIG_COREMARK_DEBUG)
|
||||
CFLAGS += ${DEFINE_PREFIX}FLAGS_STR=\""$(ARCHOPTIMIZATION)\""
|
||||
CFLAGS += ${DEFINE_PREFIX}MEM_METHOD=$(CONFIG_COREMARK_MEM_METHOD)
|
||||
CFLAGS += ${DEFINE_PREFIX}MICA=0
|
||||
CFLAGS += ${DEFINE_PREFIX}MULTITHREAD=$(COREMARK_NTHREADS)
|
||||
CFLAGS += ${DEFINE_PREFIX}PERFORMANCE_RUN=1
|
||||
CFLAGS += ${DEFINE_PREFIX}PRINT_ARGS=$(COREMARK_PRINT_ARGS)
|
||||
CFLAGS += ${DEFINE_PREFIX}SEED_METHOD=$(CONFIG_COREMARK_SEED_METHOD)
|
||||
CFLAGS += ${DEFINE_PREFIX}USE_CLOCK=1
|
||||
CFLAGS += ${DEFINE_PREFIX}USE_PTHREAD
|
||||
|
||||
ifeq ($(CONFIG_COREMARK_ITERATIONS_OVERRIDE),y)
|
||||
CFLAGS += ${DEFINE_PREFIX}ITERATIONS=$(CONFIG_COREMARK_ITERATIONS_COUNT)
|
||||
else
|
||||
CFLAGS += ${DEFINE_PREFIX}ITERATIONS=0
|
||||
endif
|
||||
|
||||
CFLAGS += ${DEFINE_PREFIX}crcu8=coremark_crcu8
|
||||
CFLAGS += ${DEFINE_PREFIX}crcu16=coremark_crcu16
|
||||
CFLAGS += ${DEFINE_PREFIX}crcu32=coremark_crcu32
|
||||
CFLAGS += ${DEFINE_PREFIX}crc16=coremark_crc16
|
||||
|
||||
CSRCS += core_list_join.c
|
||||
CSRCS += core_matrix.c
|
||||
CSRCS += core_state.c
|
||||
CSRCS += core_util.c
|
||||
CSRCS += core_portme.c
|
||||
|
||||
############################################################################
|
||||
# Targets
|
||||
############################################################################
|
||||
|
||||
$(COREMARK_ZIP):
|
||||
@echo "Downloading: $(COREMARK_URL)/$(COREMARK_ZIP)"
|
||||
$(Q) curl -O -L $(COREMARK_URL)/$(COREMARK_ZIP)
|
||||
|
||||
$(COREMARK_UNPACKNAME): $(COREMARK_ZIP)
|
||||
@echo "Unpacking: $(COREMARK_ZIP) -> $(COREMARK_UNPACKNAME)"
|
||||
$(Q) $(UNPACK) $(COREMARK_ZIP)
|
||||
$(Q) mv coremark-$(COREMARK_VERSION) $(COREMARK_UNPACKNAME)
|
||||
$(Q) patch -p0 < add_init_message.patch # Update init message
|
||||
$(Q) touch $(COREMARK_UNPACKNAME)
|
||||
|
||||
clean::
|
||||
$(call DELFILE, $(OBJS))
|
||||
|
||||
# Download and unpack tarball if no git repo found
|
||||
|
||||
ifeq ($(wildcard $(COREMARK_UNPACKNAME)/.git),)
|
||||
context:: $(COREMARK_UNPACKNAME)
|
||||
|
||||
distclean::
|
||||
$(call DELDIR, $(COREMARK_UNPACKNAME))
|
||||
$(call DELFILE, $(COREMARK_ZIP))
|
||||
endif
|
||||
|
||||
############################################################################
|
||||
# Applications Configuration
|
||||
############################################################################
|
||||
|
||||
MODULE = $(CONFIG_BENCHMARK_COREMARK)
|
||||
|
||||
PROGNAME += $(CONFIG_COREMARK_PROGNAME)
|
||||
PRIORITY += $(CONFIG_COREMARK_PRIORITY)
|
||||
STACKSIZE += $(CONFIG_COREMARK_STACKSIZE)
|
||||
|
||||
MAINSRC += core_main.c
|
||||
|
||||
# Build with WebAssembly when CONFIG_INTERPRETERS_WAMR is enabled
|
||||
|
||||
WASM_BUILD = both
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
12
benchmarks/coremark/add_init_message.patch
Normal file
12
benchmarks/coremark/add_init_message.patch
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
--- coremark/posix/core_portme.c
|
||||
+++ coremark/posix/core_portme.c
|
||||
@@ -208,6 +208,9 @@ ee_u32 default_num_contexts = MULTITHREAD;
|
||||
void
|
||||
portable_init(core_portable *p, int *argc, char *argv[])
|
||||
{
|
||||
+
|
||||
+ ee_printf("Running CoreMark...\n");
|
||||
+
|
||||
#if PRINT_ARGS
|
||||
int i;
|
||||
for (i = 0; i < *argc; i++)
|
||||
55
benchmarks/cyclictest/CMakeLists.txt
Normal file
55
benchmarks/cyclictest/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# ##############################################################################
|
||||
# apps/benchmarks/cyclictest/CMakeLists.txt
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
# license agreements. See the NOTICE file distributed with this work for
|
||||
# additional information regarding copyright ownership. The ASF licenses this
|
||||
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
# use this file except in compliance with the License. You may obtain a copy of
|
||||
# the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under
|
||||
# the License.
|
||||
#
|
||||
# ##############################################################################
|
||||
|
||||
if(CONFIG_BENCHMARK_CYCLICTEST)
|
||||
|
||||
# ############################################################################
|
||||
# Config and Fetch Coremark application
|
||||
# ############################################################################
|
||||
|
||||
set(CYCLICTEST_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
# ############################################################################
|
||||
# Sources
|
||||
# ############################################################################
|
||||
|
||||
set(CSRCS ${CYCLICTEST_DIR}/cyclictest.c)
|
||||
|
||||
# ############################################################################
|
||||
# Applications Configuration
|
||||
# ############################################################################
|
||||
|
||||
nuttx_add_application(
|
||||
NAME
|
||||
cyclictest
|
||||
PRIORITY
|
||||
${CONFIG_CYCLICTEST_PRIORITY}
|
||||
STACKSIZE
|
||||
${CONFIG_CYCLICTEST_STACKSIZE}
|
||||
MODULE
|
||||
${CONFIG_BENCHMARK_CYCLICTEST}
|
||||
COMPILE_FLAGS
|
||||
${CFLAGS}
|
||||
SRCS
|
||||
${CSRCS}
|
||||
INCLUDE_DIRECTORIES
|
||||
${INCDIR})
|
||||
|
||||
endif()
|
||||
29
benchmarks/cyclictest/Kconfig
Normal file
29
benchmarks/cyclictest/Kconfig
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
menuconfig BENCHMARK_CYCLICTEST
|
||||
bool "Cyclictest"
|
||||
default n
|
||||
---help---
|
||||
Enable the cyclictest application.
|
||||
|
||||
if BENCHMARK_CYCLICTEST
|
||||
|
||||
config BENCHMARK_CYCLICTEST_PROGNAME
|
||||
string "Cyclictest App Name"
|
||||
default "cyclictest"
|
||||
---help---
|
||||
This is the name of the program that will be used when the NSH ELF
|
||||
program is installed.
|
||||
|
||||
config BENCHMARK_CYCLICTEST_PRIORITY
|
||||
int "Cyclictest task priority"
|
||||
default 100
|
||||
|
||||
config BENCHMARK_CYCLICTEST_STACKSIZE
|
||||
int "Cyclictest task stack size"
|
||||
default 4096
|
||||
|
||||
endif # BENCHMARK_CYCLICTEST
|
||||
23
benchmarks/cyclictest/Make.defs
Normal file
23
benchmarks/cyclictest/Make.defs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/cyclictest/Make.defs
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
ifneq ($(CONFIG_BENCHMARK_CYCLICTEST),)
|
||||
CONFIGURED_APPS += $(APPDIR)/benchmarks/cyclictest
|
||||
endif
|
||||
39
benchmarks/cyclictest/Makefile
Normal file
39
benchmarks/cyclictest/Makefile
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
############################################################################
|
||||
# apps/benchmarks/cyclictest/Makefile
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
# spinlock_bench application
|
||||
|
||||
############################################################################
|
||||
# Applications Configuration
|
||||
############################################################################
|
||||
|
||||
MODULE = $(CONFIG_BENCHMARK_CYCLICTEST)
|
||||
|
||||
PROGNAME += $(CONFIG_BENCHMARK_CYCLICTEST_PROGNAME)
|
||||
PRIORITY += $(CONFIG_BENCHMARK_CYCLICTEST_PRIORITY)
|
||||
STACKSIZE += $(CONFIG_BENCHMARK_CYCLICTEST_STACKSIZE)
|
||||
|
||||
MAINSRC += cyclictest.c
|
||||
|
||||
# Build with WebAssembly when CONFIG_INTERPRETERS_WAMR is enabled
|
||||
|
||||
include $(APPDIR)/Application.mk
|
||||
1115
benchmarks/cyclictest/cyclictest.c
Normal file
1115
benchmarks/cyclictest/cyclictest.c
Normal file
File diff suppressed because it is too large
Load diff
2
benchmarks/dhrystone/.gitignore
vendored
Normal file
2
benchmarks/dhrystone/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/dhrystone
|
||||
/dhrystone.zip
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue