Compare commits
1962 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0eeaa2389f | |||
| ef04680cc5 | |||
| 1c6cfc3ffe | |||
| 0266e7fe53 | |||
| 610ea0a9d3 | |||
| 70d942a184 | |||
| 5639237e2b | |||
| 541bd26cd7 | |||
| 7a4d601f4d | |||
| bf8675b44a | |||
| ebea672240 | |||
| ce8535f01c | |||
| 0ba4cd2b3b | |||
| afc2dd6cab | |||
| 5768b42c39 | |||
| ee8630c282 | |||
| 01094ea6aa | |||
| 6c1fd1f69c | |||
| 4f65466161 | |||
| 9b3119393f | |||
| 8594e9462c | |||
| 16acb57b22 | |||
| 04c8a3138e | |||
| 38560378fc | |||
| ffbf4a6a90 | |||
| a215bc2ca3 | |||
| cbc674ff99 | |||
| 97546bf55b | |||
| ed1391ee5d | |||
| 7fbd9ec5f4 | |||
| 63989023b8 | |||
| e668d5afd7 | |||
| a2228276bb | |||
| 3ef192e7c7 | |||
| 5fea79fd07 | |||
| 18e65f5eb4 | |||
| 5ed6bf65ba | |||
| d79bcef802 | |||
| f1a53407e7 | |||
| 4309e6ab76 | |||
| 0c3d1cf566 | |||
| aa7d571486 | |||
| 604d3e8fad | |||
| 22fc07d72b | |||
| dd3b5a10a0 | |||
| 416f94f03a | |||
| 204de723f1 | |||
| 80cd89d8f7 | |||
| 624226c91d | |||
| 3adf73a2cd | |||
| eb7b207e4c | |||
| d7e45367af | |||
| 388c7018c4 | |||
| da96607b65 | |||
| fb49645b32 | |||
| 7d751a20b1 | |||
| 9f7d5bbc86 | |||
| 0df25b1008 | |||
| cef623b7d2 | |||
| 12434e78e4 | |||
| 2200607989 | |||
| c31381183b | |||
| 76dce41580 | |||
| 1f1ca34ea6 | |||
| 8d4ab15748 | |||
| 745577693d | |||
| 3019af1c93 | |||
| 8916e6f826 | |||
| b2fd631d82 | |||
| cadef64418 | |||
| ab3497161a | |||
| 46f370ae3c | |||
| 0f43ac79f6 | |||
| ef92b6c369 | |||
| f44f9eb9f8 | |||
| 854f3315af | |||
| 1d46e67de2 | |||
| 85ded0b9bd | |||
| cb291e8d00 | |||
| 25caae1e8c | |||
| 12d7995a18 | |||
| 320b7a9ac3 | |||
| a533e9e637 | |||
| f6ecdae972 | |||
| 477b70eccf | |||
| b2dd2dc217 | |||
| b106f59eb4 | |||
| 38f483c4a6 | |||
| f4eafed188 | |||
| 5987a5464b | |||
| 3a888e956b | |||
| 4cddc61eda | |||
| 2a8c00bdeb | |||
| 4ae2a76492 | |||
| a5d097abe6 | |||
| 5e0a8d2124 | |||
| 994aa9f692 | |||
| 6e67ad51b7 | |||
| 52693f72af | |||
| 991f433ac1 | |||
| 54b7da18cb | |||
| f8771e9ad5 | |||
| be1dee7caf | |||
| 68b7802fc1 | |||
| 6d407767e7 | |||
| 4a9e102c2e | |||
| 1ac6428c82 | |||
| 7c159a20e5 | |||
| 5b74e25108 | |||
| f02fa6339f | |||
| 3b6f1bff8b | |||
| 1d615717e8 | |||
| 99c570212d | |||
| 13e82fa44a | |||
| 95878df30d | |||
| 5d1ede08aa | |||
| 2203505182 | |||
| 06dc7f4f52 | |||
| e6f1b074df | |||
| f605c045e3 | |||
| 2d97f082e5 | |||
| ba91fa09b7 | |||
| 1aeee2cd1f | |||
| 4e23e52a89 | |||
| 88cf3cb1e0 | |||
| 59d26e463a | |||
| cc641d796d | |||
| 9d324f7b1f | |||
| 654e7a84ff | |||
| d903a5ef43 | |||
| 15f26b4021 | |||
| 10d80eb894 | |||
| 858954baad | |||
| 3840663410 | |||
| bd36644d85 | |||
| c485f513d7 | |||
| 06b9e40042 | |||
| 7603023928 | |||
| dbf81f40de | |||
| bb557e5195 | |||
| 89fdfcfaf9 | |||
| d9a388bab8 | |||
| b44e68e2ab | |||
| 0f09554929 | |||
| 18b0dbb501 | |||
| fa8d2bd108 | |||
| d1ebaba71d | |||
| 71e0275a4c | |||
| 205b0a679e | |||
| 3029a6b1aa | |||
| 342048b1df | |||
| ec060f979f | |||
| 56ac5d03ed | |||
| ec7ab5a277 | |||
| 2c5468ce33 | |||
| dbdb2ecdf7 | |||
| c18294d83c | |||
| 401ba6613b | |||
| 19617b79db | |||
| eeacf76cfd | |||
| 738584d342 | |||
| f69effd2eb | |||
| 67d7562609 | |||
| 0ede16cd5a | |||
| 4a89ef6273 | |||
| 145ab7b1ec | |||
| 3f9c2f89fc | |||
| 00298e6681 | |||
| 68ab7f6bb7 | |||
| 7ab63cde62 | |||
| b90133813a | |||
| 75da3555ee | |||
| 8bce9dec90 | |||
| fef74398e4 | |||
| 775c6bb20e | |||
| 06710e54de | |||
| 81cfa23882 | |||
| f3fd9e28f5 | |||
| b94a335493 | |||
| 01aa87c307 | |||
| 473817f2f4 | |||
| a1c3a2b03a | |||
| bdfe4a108c | |||
| 10fe229aad | |||
| dfec58e5dc | |||
| 6c04cf40f4 | |||
| fe7203ee55 | |||
| 483b8dcc05 | |||
| a41e16ffee | |||
| 425af4240b | |||
| 4a4c1db606 | |||
| 2b1375c8ea | |||
| 065440891b | |||
| d58168a03f | |||
| 8cf936ccb1 | |||
| d5d45e85e4 | |||
| 0d4f41fb6d | |||
| 1c1c473910 | |||
| dde878db04 | |||
| 1a42c38e0e | |||
| e695c473af | |||
| bd6eb83250 | |||
| c484228c56 | |||
| f265fb5943 | |||
| b17d3d3e9c | |||
| c53844ff91 | |||
| e393c7fa0e | |||
| b55678a7d0 | |||
| fe8266b591 | |||
| 3d8e3c3c9a | |||
| 61349dc6d3 | |||
| 95821b07b1 | |||
| d62ee95d28 | |||
| b962014087 | |||
| 921198e81c | |||
| 3457952854 | |||
| f4228cc4c1 | |||
| dabcd65903 | |||
| 8fa4f5a40f | |||
| b95aa36b01 | |||
| 7a96a082b7 | |||
| b78f0012e9 | |||
| e958b6da9e | |||
| 86338ca835 | |||
| 8a110b80bf | |||
| 9a12f06f19 | |||
| 7d334775d0 | |||
| 0a86a5f39c | |||
| e7cf0e12ea | |||
| e41df97c42 | |||
| 20a26d5053 | |||
| 924d7769ec | |||
| 8ff937c7d8 | |||
| ae695e8309 | |||
| e98e307d17 | |||
| bd872a7a98 | |||
| fd3de02a37 | |||
| 1bee537a09 | |||
| ded942a4e4 | |||
| bf61e52390 | |||
| 2d9262cc5a | |||
| 993cc9463e | |||
| c2376d62e2 | |||
| f3473495d0 | |||
| c5b267162c | |||
| 8322848c35 | |||
| 61cb98dc0f | |||
| 2b1666fcb0 | |||
| 6ae2cde663 | |||
| cc8f7c83da | |||
| 20445b8e83 | |||
| 12881d5576 | |||
| b88cb86069 | |||
| 3d3be15665 | |||
| 0142783836 | |||
| 006768ab58 | |||
| 376673df28 | |||
| f830756356 | |||
| 1fceb7c580 | |||
| 5287cfbb59 | |||
| f345f60f73 | |||
| e2c8015199 | |||
| aed577271f | |||
| f50ca52c57 | |||
| 36e66bdd9f | |||
| 19869d3a7d | |||
| c8118c3a58 | |||
| 7fe07dc4ce | |||
| 3e8a5b6151 | |||
| 28bc19720a | |||
| a8cb89b3da | |||
| df2251e23e | |||
| 31154278b3 | |||
| 613b4105a2 | |||
| 10e06e1970 | |||
| c751dcfcf9 | |||
| 178938d957 | |||
| a8313c3b7e | |||
| dc26531207 | |||
| c74e6ad868 | |||
| a62eec4ae3 | |||
| 235ad4dd9d | |||
| d06923d0e7 | |||
| 7f59b65fc8 | |||
| 884a3249fe | |||
| d159ec5c90 | |||
| 7c43f4e696 | |||
| 7c8ea8e0e0 | |||
| 573eae8d95 | |||
| bf0acc9611 | |||
| ddc310fc4b | |||
| 10782c770d | |||
| b2758208c7 | |||
| bf5612c0ed | |||
| 9a6c2635ee | |||
| 3341683db2 | |||
| 0bdbf52bc6 | |||
| e4e85e39b3 | |||
| 0621594442 | |||
| dba613fadd | |||
| 5ac4ebad78 | |||
| cb044d989c | |||
| 0d42196d11 | |||
| cac742009c | |||
| 76f938309e | |||
| 24cf29b6a8 | |||
| 41a6f2bc8d | |||
| e0767f8675 | |||
| 5523c12cfd | |||
| a6c8afc5a9 | |||
| cb8df74a9c | |||
| 050439ccba | |||
| 6907df0bd6 | |||
| 5a259a7266 | |||
| b082f1a2b8 | |||
| c666b492c4 | |||
| aa0671fb32 | |||
| f82d0109e4 | |||
| 2a88e76002 | |||
| b25f523aca | |||
| 046439a5a1 | |||
| bcd07c2c91 | |||
| e9b04ada1d | |||
| ff5eb5de29 | |||
| fd62c42faa | |||
| 089d075c8f | |||
| 45a6e9614e | |||
| 9e6d0ea610 | |||
| c345087b41 | |||
| 8de007021a | |||
| f72588595b | |||
| 797ea5efa7 | |||
| 156e7c1c54 | |||
| b8b1aa345c | |||
| b0ece8f8df | |||
| 4b0b00c8da | |||
| 6d3122d4e8 | |||
| 0f27e38eb9 | |||
| 6156050024 | |||
| cacbe005b5 | |||
| caca5636ce | |||
| 6a35ab6557 | |||
| 87de4c134b | |||
| 7944628400 | |||
| 251a84b741 | |||
| d695e5f7bc | |||
| 4744997c16 | |||
| 5bd39ba73f | |||
| 7f887f2342 | |||
| e7e77d9612 | |||
| a7a3abb9bf | |||
| 6f68da5be4 | |||
| e9b9d634c4 | |||
| 6d301a282e | |||
| 61591fd233 | |||
| e97d82f77b | |||
| b58d5dabf8 | |||
| 047bce0cdd | |||
| c81e217334 | |||
| 9cd341c2c3 | |||
| f0ad1e9b70 | |||
| 414b1f8327 | |||
| e68320ee2b | |||
| 7fa643a11e | |||
| 375e724dee | |||
| 6c0f4bbafd | |||
| 4cab75115f | |||
| 014609ad87 | |||
| f7a3172c20 | |||
| b799f7d1f3 | |||
| f3851408fe | |||
| 03cf2b577b | |||
| b3b6f23320 | |||
| 821ba43131 | |||
| 31bf73b89b | |||
| 229ea71421 | |||
| f085e2ca93 | |||
| db98f06110 | |||
| bbb5aacc48 | |||
| 91ab18d1d2 | |||
| 273cbc6871 | |||
| 596d1ff104 | |||
| 896492442c | |||
| b9e58cd3ea | |||
| d961dbae8d | |||
| be031e1850 | |||
| 15dfbabc9c | |||
| 102de7dac3 | |||
| 7338a2fec8 | |||
| d56136f06c | |||
| 34a0c9d143 | |||
| 11f98adcce | |||
| 209fadd2e6 | |||
| 8fa6a4da2e | |||
| 4613f85bb7 | |||
| e1121a4cd0 | |||
| 20fec98f70 | |||
| adfc787a45 | |||
| 86be9a85d0 | |||
| f6de698fc8 | |||
| edc7379546 | |||
| ab8af7fa9c | |||
| fb74caebb5 | |||
| 88cdf487b4 | |||
| be91eaed2c | |||
| b5a08c2518 | |||
| b02ea02dbb | |||
| d69ce77503 | |||
| d1803ec044 | |||
| f2665e597f | |||
| db5ead4230 | |||
| f7d5188b2f | |||
| 1d17c34e12 | |||
| 49ead19d00 | |||
| 7e7dcb8692 | |||
| cf50240e82 | |||
| 79f6d9bdac | |||
| 6af6060aa0 | |||
| 2bac7835e8 | |||
| fd41757aef | |||
| f338f65bdf | |||
| 867f5e9069 | |||
| 88f5e2c639 | |||
| ca0209b868 | |||
| 4f691e622f | |||
| fecadaca82 | |||
| 709def5e7b | |||
| a5e4b4bd7d | |||
| a817794444 | |||
| ffef8f1b29 | |||
| 205a679959 | |||
| b956001d81 | |||
| 1dd3c9e73f | |||
| 8d74a63e4b | |||
| 27fd97a8bb | |||
| 4d89db5209 | |||
| f66323ecfb | |||
| 863198a73f | |||
| ad112b4d3d | |||
| c088081c00 | |||
| 06d46a0ef9 | |||
| 27e68a61fa | |||
| 4e31fa66e2 | |||
| 87231b625f | |||
| 3baa318ec7 | |||
| 820d2b58b3 | |||
| fe4819a9c1 | |||
| 8ae19e45d6 | |||
| aaa590855a | |||
| a629471ed7 | |||
| bed26734a2 | |||
| 5da7143fe5 | |||
| 2c9bc872e7 | |||
| abd1896ce2 | |||
| 347a7dc71e | |||
| ae9f2710f0 | |||
| 2a82ca87b0 | |||
| 6f8178598f | |||
| 6cc4dd10bc | |||
| d036097bca | |||
| 6ba50aa6ea | |||
| fdad658e5f | |||
| 79be07f9a4 | |||
| 5bcaae62f2 | |||
| e451dec674 | |||
| 6379d4dbca | |||
| 91c6a7180d | |||
| 9135e3f7d3 | |||
| a0e3dea8b8 | |||
| 6bc42300a1 | |||
| 45193b4a1d | |||
| 885e9cc057 | |||
| 244de2458a | |||
| 4d6e5c12b3 | |||
| a5d47f84ae | |||
| 5fd0247239 | |||
| 821d77fe4c | |||
| fef772ef29 | |||
| 3815157214 | |||
| 810c1693ac | |||
| fc2272c4b4 | |||
| 45f7ebb92b | |||
| 28f69a052c | |||
| ef3054d1a8 | |||
| bcf61cc91c | |||
| 57d26f7e4f | |||
| 67a9a7e66f | |||
| 16f19b2c1f | |||
| ed4e22b548 | |||
| 929497d527 | |||
| f479f8377d | |||
| 1feb70c91b | |||
| 179260878f | |||
| 7b8a2180ff | |||
| 3ea87ad54c | |||
| c483fe76c7 | |||
| b50add4694 | |||
| 275642b297 | |||
| 38e92b522b | |||
| 7f5b0b4008 | |||
| 60f74f3cb3 | |||
| 1a241e6e86 | |||
| 4985acafad | |||
| f9c8703e77 | |||
| b77e2a5020 | |||
| f766a90f5f | |||
| 0878b99b2c | |||
| 1bc155e810 | |||
| f14f1be168 | |||
| 7247acdece | |||
| 7b23fd3548 | |||
| d9349caeee | |||
| 97e15812fa | |||
| cb12114a7e | |||
| aee8e15fd2 | |||
| 6474773555 | |||
| be18edd604 | |||
| bbfaf7474c | |||
| 46b5753f56 | |||
| a5ac50fcbf | |||
| 574dd34c49 | |||
| 4a734e4de4 | |||
| 402c4ef5d3 | |||
| 0138aff890 | |||
| f281fb473d | |||
| a256e47b9c | |||
| 9bf95418a7 | |||
| 60f591f3b6 | |||
| 858916d628 | |||
| 2218bab542 | |||
| a58e530f92 | |||
| 1fbeac7b52 | |||
| 18ccc40443 | |||
| 8c9172cf5d | |||
| 2dc76689ea | |||
| 91401d7e5f | |||
| 733209f9a2 | |||
| d79b42c710 | |||
| 441416728c | |||
| dd1792bdfc | |||
| 927b3cc41a | |||
| c180a99c79 | |||
| a3df3d40ee | |||
| 1e5c279da3 | |||
| 5b8b8e005b | |||
| 238951a966 | |||
| 78b342661a | |||
| 41a5fbb16a | |||
| eca80db9b6 | |||
| 8261af3010 | |||
| 9728d79ade | |||
| 067091458a | |||
| 166ed28995 | |||
| 5cfe3af0ef | |||
| d26955bde6 | |||
| c3694f1c03 | |||
| 1726ba5bda | |||
| aa2f4051bb | |||
| 2ef71c6eba | |||
| d9d2dae883 | |||
| bea1a914be | |||
| 85067e14b5 | |||
| 00ab015de7 | |||
| b5d3d0141f | |||
| 3706c16729 | |||
| 0ed46406d1 | |||
| 82ddd55a1a | |||
| 34e23bcf95 | |||
| f3cda01b95 | |||
| 2a79aad2dd | |||
| bbbd6045cb | |||
| 683916e17a | |||
| 9360e13cdd | |||
| 9d830d7207 | |||
| 54a82b4337 | |||
| d1e995670d | |||
| 10947a463b | |||
| e8f5f9d732 | |||
| 984f9fe7d6 | |||
| 322d5dc29c | |||
| 8f1d80b0ba | |||
| 35016633d8 | |||
| 4b8e4ef38e | |||
| 17cc5fa872 | |||
| a6b32a5a91 | |||
| e116a99eda | |||
| bfd6be3799 | |||
| 6a29d5d5af | |||
| fbc5bd0d04 | |||
| 7680fe2b59 | |||
| 70288c6c4f | |||
| 3b681f7b74 | |||
| 6e8035e5aa | |||
| f8423f9da0 | |||
| 1a2816284c | |||
| f8c5152369 | |||
| 6136e48df5 | |||
| b8655ca0ed | |||
| ba08dcfb76 | |||
| ac954b57f7 | |||
| 739f1027f8 | |||
| a6b56d171d | |||
| ad0d700a3e | |||
| 86c811660e | |||
| 2691167afe | |||
| 32be4065ef | |||
| bc385122e9 | |||
| e45eddfd6c | |||
| 5004159550 | |||
| d9659d3177 | |||
| 2de2185d97 | |||
| 49134a9467 | |||
| 6044cb9955 | |||
| ded810cebf | |||
| 9e0dcd4a2b | |||
| ad23b8c559 | |||
| 3999d67e51 | |||
| 67f0d6ae5e | |||
| 47616c7dfa | |||
| d926d4dea4 | |||
| b4ba3dd7f3 | |||
| 0b4500155e | |||
| ef93b401c3 | |||
| 154e48ba22 | |||
| f73fe76b6c | |||
| d20ce5ff0a | |||
| a3eace117c | |||
| 772e19aab9 | |||
| 1a4e208c69 | |||
| e2a7249907 | |||
| eb439b93a5 | |||
| 317450af32 | |||
| 37d0f49a82 | |||
| 9036cec562 | |||
| e7a5d4d416 | |||
| e82ec734d9 | |||
| 9ceecefae2 | |||
| 8cd2b0976a | |||
| ae3b00db74 | |||
| d22ce55cd5 | |||
| ea63ac8f4d | |||
| 06b1f85514 | |||
| 5ed307ceb8 | |||
| 5bc84bf08c | |||
| 26dfbd0660 | |||
| 7d5bd4dfbc | |||
| 48c14f1109 | |||
| 7249c3c46f | |||
| a886906f01 | |||
| 74a6f5961b | |||
| 51fbe03016 | |||
| b2f372b20f | |||
| 3b2341fb61 | |||
| 3136435c19 | |||
| 060ddf5e95 | |||
| df078cac92 | |||
| ed66f498eb | |||
| fadd60441e | |||
| 25ddde0394 | |||
| 48496dfec1 | |||
| 6e5f41fe6b | |||
| dd184cf3c2 | |||
| 99e38c40be | |||
| 46e8b9cad9 | |||
| 2e24637bd6 | |||
| d17d86d6a5 | |||
| b364e44716 | |||
| 1c5426d4af | |||
| e66cd41654 | |||
| 5201869a55 | |||
| 18e63ad880 | |||
| 4a2db0f706 | |||
| f97a813a2a | |||
| 4e1bfc4e0d | |||
| 5859ff0280 | |||
| 40aa398285 | |||
| e89e67fde0 | |||
| de78b60252 | |||
| 30c3daf031 | |||
| d5fdbb89ea | |||
| 06aed792c0 | |||
| 18005cb91e | |||
| e41dc273c9 | |||
| e7de3b92c9 | |||
| 79b0f31585 | |||
| 5f89ef99e9 | |||
| 01f5bd3330 | |||
| 8fb9b5804e | |||
| a07b7161e9 | |||
| 7707cbf338 | |||
| 03bb28c277 | |||
| 9cf1a8891f | |||
| 53b79f5f70 | |||
| 21e3e535a6 | |||
| a6404aca45 | |||
| d52d26b4ef | |||
| 3a8809c1a7 | |||
| 1f9bfc5c74 | |||
| 3e9848f49c | |||
| 70efb515b1 | |||
| 08207fd086 | |||
| c6ea99f4be | |||
| f80e706fad | |||
| 2ee7ed084b | |||
| 1f5b886d12 | |||
| f207177098 | |||
| d3ee4eecdf | |||
| d36f43d80b | |||
| 99a9e265b0 | |||
| 12d8108fc6 | |||
| d93aa0c384 | |||
| 4528fde7f9 | |||
| 97d8a68949 | |||
| 53d06be226 | |||
| af4ba2b1ce | |||
| 40895cbcbb | |||
| 85325f585a | |||
| 9b883704bc | |||
| 2e06e05d7c | |||
| 9cc16f87e2 | |||
| f8570257f9 | |||
| 664b35b77c | |||
| 2538a7c4d6 | |||
| 1234e6af52 | |||
| 573bc7344b | |||
| 5abb594f01 | |||
| 673e6d5380 | |||
| 4e2b5b2523 | |||
| e5dfb44fe0 | |||
| 001d1fd7cb | |||
| 6bf789d93f | |||
| cfbd8a2e36 | |||
| 7642bfbf8b | |||
| dbed3f1c41 | |||
| e1f6435d44 | |||
| 21ea9bf50f | |||
| 137ea43422 | |||
| 9aa69cbc85 | |||
| 61f0dd2271 | |||
| 207535af9d | |||
| 4812ed5053 | |||
| f89fa4cec7 | |||
| b042567f76 | |||
| 4bed8a89db | |||
| 006a9e514b | |||
| 55cbe15b81 | |||
| 35dd6a3f77 | |||
| 9773160639 | |||
| f246e0d0e4 | |||
| 4937a64bcc | |||
| b88ab391bb | |||
| 3b50b6aeb1 | |||
| ec6bc15d1b | |||
| 5aef2c0afa | |||
| 4c033c3e47 | |||
| f9db5ab965 | |||
| c5a2e41647 | |||
| 7d95928cbb | |||
| a872232b15 | |||
| 6323de309f | |||
| 0e2c5b45ec | |||
| 959f7308e7 | |||
| 9a7d9e6995 | |||
| 774861b15d | |||
| 04a25ab496 | |||
| 467ab74523 | |||
| 358a54ecdc | |||
| 79b455575b | |||
| d364babbc0 | |||
| 1771d7ab64 | |||
| 68f74784a3 | |||
| 08edb6282f | |||
| a4cc9b60fd | |||
| f5a905a641 | |||
| d1738e946a | |||
| 650e6fc426 | |||
| c034819cf8 | |||
| 077a620e21 | |||
| 2954bf2697 | |||
| 743903b96f | |||
| 02a14d31b2 | |||
| df4f80622e | |||
| 9902097d91 | |||
| 10ed5ab01c | |||
| 166935641a | |||
| aaf55a21ad | |||
| 69f8da4682 | |||
| f0f7ec8882 | |||
| 921591d2b8 | |||
| 5664c02d07 | |||
| ce85b98db4 | |||
| 95cfc98fe4 | |||
| 5d8d38a911 | |||
| 31173394b8 | |||
| c8ed7950f4 | |||
| 89ccede139 | |||
| fba1f83855 | |||
| 726de7e821 | |||
| 4233e4864f | |||
| 98277f2c1c | |||
| ded9ffa1e7 | |||
| 335ba32a0e | |||
| 91cce2a7b3 | |||
| de7726ca01 | |||
| c087ad04d3 | |||
| 4ac9cfba4f | |||
| fad1dcefbc | |||
| 19b4ae862b | |||
| 5e2e00306e | |||
| 158c4de4f6 | |||
| 0c2ed8688d | |||
| c8c5ab22ce | |||
| 364d8566b0 | |||
| e6308f5d02 | |||
| 4d8ab1c401 | |||
| ff44663f5f | |||
| b39b5bbbc9 | |||
| ace9855d6f | |||
| 09ddf9c6ef | |||
| 802fe519a3 | |||
| b6a1a6273f | |||
| e49cf0665a | |||
| 2fcc140c0d | |||
| 6e3b58d76a | |||
| 883bde07c6 | |||
| cc35cb3876 | |||
| 78bdf34b7b | |||
| 9a1c02591b | |||
| 48b712fdc0 | |||
| 6d819eb8d4 | |||
| 92721d1bf7 | |||
| 42c62ff84e | |||
| cc3a355ffb | |||
| d77e921a15 | |||
| 756fd1b9ac | |||
| b44d21c595 | |||
| efc725863a | |||
| 161b99cb54 | |||
| c3921bbf3f | |||
| c8cb618fac | |||
| b3198ed929 | |||
| c3f34e4eb2 | |||
| cbe796e2d6 | |||
| 0f34163558 | |||
| f5c7b190f6 | |||
| 7369a6a37b | |||
| b1537135e4 | |||
| b3a3cf28d2 | |||
| b5899a9664 | |||
| 4e73fdd03a | |||
| c599c939c1 | |||
| 8c0ae93d2a | |||
| f53217b2c5 | |||
| 185961f898 | |||
| e9f483b480 | |||
| c6e564885e | |||
| c37797ba2c | |||
| 832f769b46 | |||
| c4aa39dc86 | |||
| 25e5a3597f | |||
| 266786406c | |||
| 182497fc39 | |||
| 7a5934ff47 | |||
| 54aef53c4d | |||
| 12d6043d86 | |||
| 8c897babce | |||
| cd5dc7203c | |||
| 56f2da8c9d | |||
| c7290f00e0 | |||
| f1970b9da8 | |||
| fa0b86ff98 | |||
| f0f5cd4734 | |||
| 836c8ce5e5 | |||
| 27b828891d | |||
| 74b205c7ab | |||
| 2fa4a77584 | |||
| 5b1f087c5b | |||
| 42a5ae8716 | |||
| 7e700c1394 | |||
| 4aec74f246 | |||
| e687490f41 | |||
| 80839cf020 | |||
| c25a6737c6 | |||
| c47189a9d9 | |||
| 1be2a7e4c1 | |||
| 06d9a2ff8f | |||
| c37fa3cc90 | |||
| 8cdf43f8fd | |||
| afb9ed73ac | |||
| 06e5273d24 | |||
| 16bd900a56 | |||
| 20e2305011 | |||
| b1398cf3ab | |||
| c91f3a7884 | |||
| 49f1cc8efe | |||
| a8ac83bbca | |||
| 6a8ebdcd50 | |||
| e60df9d0af | |||
| 6f5fd42511 | |||
| 3b425d9a38 | |||
| 54e29d75d7 | |||
| 93eeee2230 | |||
| 2c6aff5c79 | |||
| 7185b34fd7 | |||
| 83da21089f | |||
| 9911104036 | |||
| de0cd66070 | |||
| 70063fb652 | |||
| a3ab435acf | |||
| e0132f7a1e | |||
| 41487bc9e7 | |||
| 08675612d5 | |||
| c2decc3e2e | |||
| 1adf76dd23 | |||
| 61f22f34d3 | |||
| 39652d93ab | |||
| 241c062188 | |||
| 24a9a66f0a | |||
| 48b7c79113 | |||
| 0021a58943 | |||
| ea5d7e2eee | |||
| cb0a8f2fe2 | |||
| b4b2b3e61c | |||
| aeb8eabfcc | |||
| 2e4bf0ab9b | |||
| 01296788dc | |||
| 8d3142911c | |||
| de4452fda6 | |||
| 1b72729698 | |||
| aba42052c3 | |||
| d74e65362f | |||
| ec91d5a1ef | |||
| 8b6155deee | |||
| 39d08d90cd | |||
| 50b6297523 | |||
| 0914f9e0e1 | |||
| 769ad27645 | |||
| 28666f2fb2 | |||
| c641208ceb | |||
| 17b43d6b3d | |||
| 724ba4b4e6 | |||
| 91b5015a8b | |||
| 2ecd4cca1b | |||
| 8b1830c487 | |||
| 06cfd9c54a | |||
| d450f67caa | |||
| ca77850cbb | |||
| fd36e69bd2 | |||
| 9249f61a80 | |||
| 7e25e87807 | |||
| 432aeeefe3 | |||
| e6ac9ff204 | |||
| 283d093a4c | |||
| 5be895d906 | |||
| 3c88270361 | |||
| 6f2d8a3872 | |||
| 5abfc6160f | |||
| fbb1c82bc2 | |||
| 927915a4e6 | |||
| 8c64fdd091 | |||
| d0669527c4 | |||
| 88da531e5d | |||
| 98c0cc044d | |||
| ac1e2d0fbc | |||
| ce97e42aa0 | |||
| f50603ff1d | |||
| c914761327 | |||
| b5836b243a | |||
| 6f5b7a8b26 | |||
| 89e8257008 | |||
| ae4fa0ab68 | |||
| 507c122fcf | |||
| 51d3eabf46 | |||
| 41b3409ba8 | |||
| 32c7e24b4b | |||
| 0a00662b54 | |||
| 65b97438fa | |||
| 10983d0cfe | |||
| 66d94ece33 | |||
| 50893c414d | |||
| 1cf85196b6 | |||
| f90c49910d | |||
| 3156595078 | |||
| 6f5d33ce55 | |||
| 9039e99df1 | |||
| db2b8a695d | |||
| 143a8701d5 | |||
| 3365172e7c | |||
| 549419e084 | |||
| e4b83ad5f5 | |||
| e1a209d0ce | |||
| 4a0cb4fb4a | |||
| d554844a51 | |||
| 194f58740a | |||
| 4fdb0fbe8e | |||
| f9d3939d23 | |||
| cb66bff924 | |||
| 4527908c11 | |||
| fe32582262 | |||
| 3e12934ea0 | |||
| 987923ecb4 | |||
| 28b101ccef | |||
| cff395236c | |||
| 904ddf8551 | |||
| 26f96dc7a6 | |||
| 32dcd7f118 | |||
| 1d06fe8e26 | |||
| db5ff20b72 | |||
| 0b473eecbc | |||
| 4b9bb85b12 | |||
| cc31537ae3 | |||
| 0e2837e3e7 | |||
| e053827831 | |||
| 22f370a3fa | |||
| c2572de9f4 | |||
| c63577fd1d | |||
| 33ed748004 | |||
| dee4ef09f8 | |||
| f3f7b1e7e3 | |||
| f0c8c91820 | |||
| e977232735 | |||
| f359f8818a | |||
| c1ced60db0 | |||
| 8b74df0095 | |||
| 3c492793e0 | |||
| 59f30d384c | |||
| 13eab74fb8 | |||
| 593567b440 | |||
| 49911c8f5d | |||
| 41115e0590 | |||
| 31f1a0207f | |||
| 6a8ebddaf6 | |||
| 030559bf7f | |||
| 42cd314d96 | |||
| 894e378702 | |||
| 579833e2a3 | |||
| 20d4b995f7 | |||
| 6084502f80 | |||
| 18601f458f | |||
| 80f0d4ed7c | |||
| 866e7d3128 | |||
| 1068963092 | |||
| 445181fc42 | |||
| db904f1895 | |||
| 03eb9b0582 | |||
| b1f45b384b | |||
| 7552fc8f8d | |||
| acfde4e7e5 | |||
| c5d5c375fd | |||
| f9f6662a8c | |||
| d3527f5de4 | |||
| 44faf5cbab | |||
| 9e42480855 | |||
| e46a50236f | |||
| 5a8883b44f | |||
| 464bb1f149 | |||
| bc450b4582 | |||
| df44424388 | |||
| babd3b0037 | |||
| 122d4a89f6 | |||
| 03a4378670 | |||
| e002f4fd38 | |||
| 0f745468a1 | |||
| 4f212e50b6 | |||
| d67e701b75 | |||
| c950f0f5d1 | |||
| 786c666151 | |||
| 9db5bd000b | |||
| 96bc084f3d | |||
| c68a4c085d | |||
| aa9df38b05 | |||
| 38e6330236 | |||
| 90066e7160 | |||
| d925305b9e | |||
| 196f403dd6 | |||
| fc20533583 | |||
| aacb81ea60 | |||
| 2b86daa30b | |||
| aa8afe90b0 | |||
| 028b11f2ca | |||
| fb480dffe4 | |||
| 4c136c3dad | |||
| c421a2f5dd | |||
| 0ddce13ebe | |||
| db01960a0e | |||
| 58d6b5db0a | |||
| ef3f484d3c | |||
| 8a9de407a1 | |||
| 3cd9599155 | |||
| 339773dcb5 | |||
| a6b677f0ac | |||
| f595878b5b | |||
| 7e79fc5b8e | |||
| 23e2cb0c53 | |||
| 88de52210f | |||
| 842489a5dc | |||
| 88dea487c2 | |||
| 7659f522d6 | |||
| 2bc711ce58 | |||
| 444259da07 | |||
| 218ca05304 | |||
| 08d9cbb930 | |||
| 7c0b465754 | |||
| cea176ab36 | |||
| cb7af50baf | |||
| a80036e3ca | |||
| 8f11428db1 | |||
| 3be967bcb4 | |||
| 57a7e28145 | |||
| 64338dfccb | |||
| fbe9237a6c | |||
| d6f4f24658 | |||
| aae103e359 | |||
| 738f0a10f5 | |||
| 5446968a58 | |||
| 2dda0c0da2 | |||
| 7ad3586f82 | |||
| 087e19a0ed | |||
| d0a965a1df | |||
| 0c181fc9d3 | |||
| 67bc855000 | |||
| ab767a4586 | |||
| 0e748da7d3 | |||
| 2637153575 | |||
| a2c93c24a6 | |||
| 4f902ac950 | |||
| cf02107e6a | |||
| 7a49fab16d | |||
| 7393285560 | |||
| e0ae072f5a | |||
| 4099763cfc | |||
| 32688979a1 | |||
| fffc96661f | |||
| e656f108c8 | |||
| 7e72981b8c | |||
| b7c23631c5 | |||
| f2b8942adc | |||
| f81c468f1e | |||
| b3f65b674f | |||
| 99d1b04a1f | |||
| 58f64eaeba | |||
| c4482083ac | |||
| 938d7b5e14 | |||
| 6fe387b6f0 | |||
| d94defc545 | |||
| 212167b140 | |||
| d753781dc0 | |||
| da87c203c1 | |||
| 5acf738688 | |||
| 80a2555012 | |||
| 5fd5cb02f6 | |||
| 7503ac3c67 | |||
| 80dc7b290b | |||
| 3d0b11a373 | |||
| 0838f70b25 | |||
| 5af5c2a35c | |||
| fe62c8006a | |||
| 64167dfe79 | |||
| 250fd60920 | |||
| 01e58de31a | |||
| 7717beb793 | |||
| 33e5aad364 | |||
| 202114c018 | |||
| 7eccd3dd8c | |||
| 290a55ced1 | |||
| c3fe4abd44 | |||
| 8a33cfd546 | |||
| c66b3cf8a4 | |||
| 7ca6650c77 | |||
| e96e726b4e | |||
| dd068fa69f | |||
| 4aa5557136 | |||
| 6e4326b817 | |||
| 81c1c7357b | |||
| 3c929ab181 | |||
| 2f88cd9ac0 | |||
| 0374445488 | |||
| 10b16416ee | |||
| 29202d5561 | |||
| 62507cf54b | |||
| e60a7d8292 | |||
| eef88cfdf1 | |||
| 77439626a7 | |||
| 0e72c90f49 | |||
| 984a758621 | |||
| 2dcf3b8550 | |||
| b28c4fe1e6 | |||
| 6819c68a44 | |||
| 1c0a09fe98 | |||
| a786742109 | |||
| e744ca78a8 | |||
| 071f009438 | |||
| 00fad1a79b | |||
| 42cfa4f48f | |||
| fffacf4dba | |||
| 1456ba083a | |||
| 4f7df32b77 | |||
| 32e8627510 | |||
| 5026012abb | |||
| d5ff0e8aeb | |||
| fca1929beb | |||
| 88242e0b5c | |||
| f17f921b68 | |||
| add9da25e6 | |||
| 0c0ed15066 | |||
| 475114cbb7 | |||
| c7e84e8ef1 | |||
| b39ea9d870 | |||
| 14c8b7b031 | |||
| 4b4d98d282 | |||
| 19bcb77f87 | |||
| fb5a595b34 | |||
| 9be33550a1 | |||
| ebcf26ec5d | |||
| 0cf2443aa0 | |||
| 5200b36ae4 | |||
| c0045e6c0c | |||
| 8bf8836cb4 | |||
| eeea21a967 | |||
| f1a0b516cb | |||
| 01f64b649b | |||
| 78de7c8545 | |||
| 72465e4eec | |||
| ed6212e0bd | |||
| 15992f6426 | |||
| 03adbb18ef | |||
| 314e52b32a | |||
| efab854204 | |||
| 13c87c5b26 | |||
| 6d87dafc6e | |||
| 7884ce0707 | |||
| 049cfe659c | |||
| aaae56a650 | |||
| 8a5ef7420b | |||
| 809ec67e06 | |||
| 0f46ce6352 | |||
| 1c045defa9 | |||
| f8a20f6b99 | |||
| 7e60d157ad | |||
| afef612c8d | |||
| 54d873b304 | |||
| b4fbe4ff50 | |||
| a10f4c0e53 | |||
| 9949672f1d | |||
| c16d3655bf | |||
| b169d623e3 | |||
| 44b68319f1 | |||
| e0d9b7005a | |||
| 3ab36615e9 | |||
| 2216753f5a | |||
| 96b577cab0 | |||
| d8fe7364c9 | |||
| cadb1a073d | |||
| 1cd6bf7ef5 | |||
| dab43a7627 | |||
| 6d1d5e4e6a | |||
| 76ed9b1c7c | |||
| 3ba9387479 | |||
| 4d03c258dc | |||
| 5c3d87a951 | |||
| d46e87b00e | |||
| 0f08f7ab85 | |||
| 229dba6d4c | |||
| 464cc9bea9 | |||
| be380be8fb | |||
| f7ca7a92d1 | |||
| d1f09f23e5 | |||
| b6794f6a7e | |||
| 01e23af7d8 | |||
| 600591b18d | |||
| 791de40885 | |||
| a8d7c8c89d | |||
| f3108e87f1 | |||
| 89334caa52 | |||
| d4d1112ae8 | |||
| 463f35e0f2 | |||
| 84ae7d5f72 | |||
| 60931719d8 | |||
| cc1069a3f0 | |||
| e354e1c48f | |||
| 909442cb88 | |||
| a13f3cb889 | |||
| 5f831768a2 | |||
| 50e3e4d862 | |||
| 8f9d989378 | |||
| 86276a6dd2 | |||
| 74474c8a81 | |||
| 93a297ba3b | |||
| 1e5b34187e | |||
| 1d809168db | |||
| 9c092ed0fc | |||
| 59e19898ce | |||
| 393660334d | |||
| 8542e9a085 | |||
| f49731251c | |||
| e3e07354d5 | |||
| 8298a477e1 | |||
| 00156a3e31 | |||
| d62fbfbce6 | |||
| 14966c0ba2 | |||
| e283f15720 | |||
| 16faa2950a | |||
| abc931629f | |||
| dbd5dc4eb7 | |||
| 7395569055 | |||
| e1423a8740 | |||
| d123ea7346 | |||
| 4d913fbf33 | |||
| 3985d26939 | |||
| c209626bda | |||
| 885e923bff | |||
| e86c78379a | |||
| 726321bc84 | |||
| a80d2f065e | |||
| 32fa577d25 | |||
| c579250294 | |||
| cd7fa1fdba | |||
| 1c2d37eb0b | |||
| bfa5e9b584 | |||
| 622e795214 | |||
| b20db2e1a3 | |||
| 4bee77d470 | |||
| c1bc34daa7 | |||
| 846f88526f | |||
| 1ef6ddccbe | |||
| d3e3a64092 | |||
| a9fe447313 | |||
| 6b4d7b9151 | |||
| 6e1f0be215 | |||
| f4dc9d572b | |||
| 81f88fefdc | |||
| cf2311f768 | |||
| 248236b1a7 | |||
| aaf34fa96b | |||
| 2cad4420fd | |||
| 1b31a7cf2c | |||
| fd0c6fa153 | |||
| ed1252642f | |||
| a460b01c87 | |||
| f8d7090e30 | |||
| 02c43f44c7 | |||
| 86aac677ac | |||
| 70b3166715 | |||
| 42d30ed102 | |||
| 9be1554faf | |||
| b244785141 | |||
| 7e25ef9456 | |||
| 437cc48470 | |||
| 4b279ac300 | |||
| e49c3dc088 | |||
| 6aa536c08f | |||
| 81976c4360 | |||
| e298266eff | |||
| 1aa0ece8a4 | |||
| 4e1e82b122 | |||
| 52096599b3 | |||
| fa63ed6cc7 | |||
| 5cdb9c2bc8 | |||
| ce40836717 | |||
| 4d56b557aa | |||
| dd3b65bb1f | |||
| 5809bdd400 | |||
| 5a80fc2617 | |||
| 6d2b792a29 | |||
| 1b46ca1cf8 | |||
| e37a23231a | |||
| 54a5bf5edf | |||
| 670a199575 | |||
| bbf4bcf5ae | |||
| 797aafd645 | |||
| 6ad5711807 | |||
| b577691b7b | |||
| 93139e757c | |||
| 8627d4e5da | |||
| cab94bb030 | |||
| 26d01c5f2c | |||
| 6b22f8152b | |||
| e7cf3c7970 | |||
| 77227f66c2 | |||
| efde96131d | |||
| 051b95c845 | |||
| f595e40ceb | |||
| 0d8a695ea9 | |||
| fcf9f22390 | |||
| 43fa749d27 | |||
| 6cc11b76fd | |||
| c2f7a568f3 | |||
| a8f650079b | |||
| 91fafec424 | |||
| 11f8244573 | |||
| e1df912dc7 | |||
| 35594a23de | |||
| 83922dd4e6 | |||
| a5c5bb9660 | |||
| 18b6d6c8ca | |||
| 2c6ed101c1 | |||
| 644c91ce8b | |||
| 1b3941c0d2 | |||
| e14faf0413 | |||
| f84d51ec06 | |||
| 8aa3273242 | |||
| 6f68942e83 | |||
| 9881f758d7 | |||
| 945d5dbe13 | |||
| 7d08ab4fb7 | |||
| 4a2b08f883 | |||
| 1d2aecaca8 | |||
| a4297ff492 | |||
| 4f299bf867 | |||
| 038042b09e | |||
| 8f4fb42bfb | |||
| 6fdf9bf2ea | |||
| 6c813fcd16 | |||
| 1e525c5976 | |||
| b1239a42a8 | |||
| 06d7d2ada4 | |||
| 9467b68608 | |||
| e338420df8 | |||
| d0e7c2c208 | |||
| 1ab6e5cdc9 | |||
| 551f5ada94 | |||
| e927e58d32 | |||
| 8a3ad7abcc | |||
| 5b0096c350 | |||
| c3b58f1938 | |||
| e003552804 | |||
| 50f79823d2 | |||
| 3c449b220f | |||
| c5af435449 | |||
| 45cf997341 | |||
| 0820f94a5a | |||
| d5cf0b3348 | |||
| 0ae64f1140 | |||
| c80d1ea97d | |||
| 1013323f18 | |||
| 25736abc0f | |||
| dc0b490bf0 | |||
| b95d073f02 | |||
| 9e5c143b87 | |||
| 458e1aea41 | |||
| 0765dfd43f | |||
| 4f9ba7e991 | |||
| 9ab0b18256 | |||
| 57ee26e909 | |||
| d23ab529d8 | |||
| c9ef1277f3 | |||
| 2b23bdce70 | |||
| 61a543a471 | |||
| 83aac65664 | |||
| c46ed8f57d | |||
| 9fc3642f2a | |||
| 328f6d9aff | |||
| 35d4791518 | |||
| 094701cc71 | |||
| f6d109287f | |||
| fdf6445a51 | |||
| 68d4869616 | |||
| 5f61a896d9 | |||
| bcb6f6e85e | |||
| 8e71f7add4 | |||
| 243f7f2834 | |||
| 89f86bc550 | |||
| 1b03fc3f63 | |||
| aa0904600b | |||
| 6542f61aaf | |||
| b229fba98b | |||
| 8a3cd2f47b | |||
| 9b7b1a3635 | |||
| 15a100dafa | |||
| c918e90b8d | |||
| 2635182dcb | |||
| ace358327d | |||
| eabab4322d | |||
| 66e61f4de3 | |||
| 42f8cc4606 | |||
| 82d1851743 | |||
| 6053fae1ac | |||
| 2f91154cbd | |||
| 6704c0bc4c | |||
| b19d44ba0b | |||
| 2a2c161d87 | |||
| f4a5db52e8 | |||
| a76b92bce0 | |||
| e201f4e656 | |||
| 2a1c2e26ed | |||
| 20c72845a0 | |||
| d77027276c | |||
| 6e39bd6c85 | |||
| 34f3e5bd88 | |||
| da3b7ab259 | |||
| 6909f5fa4f | |||
| 03d9254079 | |||
| 4ae9bf3b9d | |||
| 306e03b03b | |||
| e701e0bb25 | |||
| dab60a1cb7 | |||
| 1be5a7b5d7 | |||
| af1c7e1a81 | |||
| 1766ee15a3 | |||
| ce26fccc3e | |||
| 0100b7be4d | |||
| fab4fb7fbb | |||
| b8bd331efd | |||
| e42cbe7500 | |||
| c84f839fc7 | |||
| c2874ca809 | |||
| 4bd4c1f3bc | |||
| 637bff9982 | |||
| 8025117ac0 | |||
| 1a1db10634 | |||
| 5b68a3f79b | |||
| d33111b215 | |||
| 53b202cf9d | |||
| 9c86ca3a19 | |||
| e33dafeb80 | |||
| 5b4af52d04 | |||
| 83320f1052 | |||
| 1dc17aa64c | |||
| 68f13ca9cf | |||
| 5a2cc41f9c | |||
| 7f10f8932e | |||
| 1866e25eef | |||
| ec4db07a51 | |||
| becef39c19 | |||
| 24a7ed44b3 | |||
| a167e2e948 | |||
| 59c2fe4561 | |||
| b7fd046d59 | |||
| 4c9146cffd | |||
| 1bed10c380 | |||
| 1c4fc4603a | |||
| 35d9920ef8 | |||
| 1ad036c52f | |||
| 7f72e78520 | |||
| 6fe317e385 | |||
| e5f2daa001 | |||
| 4ba35d3284 | |||
| 91f9e1671f | |||
| 232a104a92 | |||
| aba35ec1af | |||
| d8df9ffd61 | |||
| f4b6870ad1 | |||
| 8938e4d23c | |||
| 0f0edd2e37 | |||
| 7b0eb2d9f8 | |||
| 44c1f2ef6b | |||
| 9cdfaf693c | |||
| 6f7d14def3 | |||
| a25f321abb | |||
| 7e5d5330d6 | |||
| b4dcdcc885 | |||
| 2dff08c86b | |||
| ca8182344f | |||
| 21c48d9f92 | |||
| 90b5645223 | |||
| d816c1b38d | |||
| 8ccbac5317 | |||
| 223bbc9bca | |||
| 4ffa2e80e4 | |||
| bc0e4c6d50 | |||
| a29fb8088f | |||
| 57ca996c31 | |||
| 8cf4c0515d | |||
| 2634d0cc52 | |||
| deca553e18 | |||
| 007af47768 | |||
| 8455408382 | |||
| 3b4c759872 | |||
| edeea5a6fb | |||
| 6577fba768 | |||
| 7726e26ac0 | |||
| c2972899ca | |||
| 58329b066d | |||
| 2419a167ee | |||
| 0138cb0552 | |||
| aacc2d3dc5 | |||
| 39c5793575 | |||
| 258904e86c | |||
| 57700b4edd | |||
| c5b3bacfc9 | |||
| 999f33b1e7 | |||
| 4b8a1ec86f | |||
| bb3c5aa186 | |||
| 5f2908a117 | |||
| ed2071aabd | |||
| 48e4863cb6 | |||
| 3b4a5a1ae8 | |||
| 6d83f7a579 | |||
| 23926bb4c2 | |||
| 8fd6693d53 | |||
| 9706cd0d7d | |||
| 504fec9823 | |||
| 05a7be7b25 | |||
| fa0ad4b594 | |||
| e84de791ab | |||
| 9be1de54ae | |||
| 147fbd9d39 | |||
| 8a1643587b | |||
| 2f219d6824 | |||
| 33d261141a | |||
| fc0615fbd1 | |||
| 48f0d55097 | |||
| 6eef807520 | |||
| 0f5703a837 | |||
| de0706e52c | |||
| 7361c03aa4 | |||
| e92854b0ed | |||
| 0941e8e869 | |||
| a61fab7302 | |||
| 0dc46a8d27 | |||
| 30ec700a1d | |||
| 8fb54d4621 | |||
| c47575f244 | |||
| 3f4e4a4d89 | |||
| 2dc543c4f5 | |||
| 1d31b6215a | |||
| cee517bc24 | |||
| 3c3c9f1a8e | |||
| 068624a726 | |||
| ec2864be74 | |||
| 1bab0243fd | |||
| 57e27339b6 | |||
| d60a280bc5 | |||
| 0a7be1ac58 | |||
| f101aeb3ec | |||
| 62c0ab072c | |||
| 55b8d1b9d3 | |||
| d924d17209 | |||
| 920799e38d | |||
| f65f7a685b | |||
| 623631286f | |||
| abe139192f | |||
| 5979aab1c7 | |||
| f73fad1b2f | |||
| 1497c40379 | |||
| 64aff274b4 | |||
| 509dfe92d0 | |||
| 58048e7748 | |||
| 9805d2bc38 | |||
| a88e847295 | |||
| 55417b28fe | |||
| 6a67ad4e4a | |||
| 132c37a651 | |||
| e08b293b54 | |||
| f39e2bc1e4 | |||
| e94fa7d5dc | |||
| 954b4493d2 | |||
| fc287b44da | |||
| 54e7b933cd | |||
| 9baeeedd69 | |||
| 3826b13ab1 | |||
| b8741a59df | |||
| 2b6ce3006e | |||
| d956a6ba00 | |||
| 9c376f120c | |||
| b1bb307dab | |||
| cb4a79173b | |||
| 35dbc286bd | |||
| c7923c0397 | |||
| a811005ab2 | |||
| 71368b5fa5 | |||
| f76025b79c | |||
| f5488f96cc | |||
| 4fb1c42500 | |||
| d9ec3795fb | |||
| cc51bc29e1 | |||
| 914501f67e | |||
| 31d286750c | |||
| d6fc3d2b69 | |||
| 93ffd57383 | |||
| 307dfb15ca | |||
| 884f7c7db9 | |||
| 95b70233f2 | |||
| 76d784f75f | |||
| d8545551fe | |||
| b46191715d | |||
| dc5c5bdf82 | |||
| d976f291fd | |||
| 1e66cc39c2 | |||
| 2266f1ad67 | |||
| a0125c85d4 | |||
| 546b3066c3 | |||
| 0aebcc4ded | |||
| 12a869e2ad | |||
| 645c7dc370 | |||
| 1a79537645 | |||
| 6355798bfd | |||
| 58d1b1be28 | |||
| 3c13be165b | |||
| 8c3ba69c98 | |||
| 757156de72 | |||
| 757d66e2c5 | |||
| b06e378703 | |||
| 90d9f1acc9 | |||
| 22f0496c9b | |||
| d0e9ff0e29 | |||
| 975c8f4b77 | |||
| 4520a51bbe | |||
| 432c879328 | |||
| 6cbd7a48d1 | |||
| 751c88aa5b | |||
| 76f1f9d3b3 | |||
| a526c3d77a | |||
| 1a6a604310 | |||
| 0a3c42a87c | |||
| 70eac0fe4f | |||
| 873f6c0b63 | |||
| e1b22a5c75 | |||
| 640282b8dc | |||
| 0ff3018fd2 | |||
| 9c6e0428af | |||
| 43e9fe7f88 | |||
| 20dea22091 | |||
| ee90ae2c87 | |||
| fb76ce841b | |||
| 0ca33429b6 | |||
| e4e6abe5af | |||
| 76a0cab782 | |||
| 3e9fb34892 | |||
| 9e73fd7149 | |||
| 371ac49fc1 | |||
| f6e123430f | |||
| 3b142e531c | |||
| d355ad04a0 | |||
| a7a730f811 | |||
| c9a9b25d41 | |||
| 41a9dea149 | |||
| ec7cc59818 | |||
| ca06c6eab9 | |||
| d08223429b | |||
| 8aca38351c | |||
| 9c872b214c | |||
| 3522d5376c | |||
| 2c0b8b52d8 | |||
| 384ff264d7 | |||
| 2b3ba02f09 | |||
| bcd9bb9628 | |||
| 41f73cb457 | |||
| 845e2f6fb7 | |||
| c9b97b8d64 | |||
| 833ea4ec29 | |||
| 12aded95dc | |||
| 0e8e735e4c | |||
| 49db4ef5e4 | |||
| 08c51a405a | |||
| eda61a2cbd | |||
| f6b425613e | |||
| e260d90d21 | |||
| 30a7c4ca52 | |||
| 85c0875db2 | |||
| 6f3d7d864f | |||
| 3d70aca6e8 | |||
| 58ce5182c2 | |||
| 7dd34848b6 | |||
| 1a555b3812 | |||
| ea7bebb568 | |||
| 68a7a3f88f | |||
| 6ecf52f196 | |||
| eec9c800c9 | |||
| 41a469208a | |||
| a59766195c | |||
| 2b4a89eafe | |||
| 26f5c32872 | |||
| 21d2d22a6f | |||
| 4407ff31ec | |||
| 1f322b565f | |||
| 1d4f928342 | |||
| ff201e6552 | |||
| 460e243693 | |||
| 740f652b6a | |||
| 54c9358964 | |||
| e197695f4c | |||
| eb0c4682d5 | |||
| 0da862fd1e | |||
| 0a8672ae6c | |||
| 31413a7d77 | |||
| 639b1f64c6 | |||
| 7d9bd3a97c | |||
| f26b8bf8ef | |||
| c1ff38c7a0 | |||
| 15b6159f6a | |||
| 04d0d9431b | |||
| a5e1d4c50a | |||
| e88fabafc8 | |||
| c6b5bf7c00 | |||
| 167672dcd7 | |||
| a93146b71d | |||
| d99185be24 | |||
| c5126de559 | |||
| c16ae2451d | |||
| e340a61e52 | |||
| af59056c09 | |||
| 4b0b6e22a7 | |||
| 2bb9e0d58e | |||
| 52eefa90e1 | |||
| 12da2e9288 | |||
| 22c5bd7eae | |||
| 62057d3204 | |||
| 00075990d0 | |||
| 6a880280e4 | |||
| b523ddf1b2 | |||
| c814fe98d7 | |||
| a65e4edb1c | |||
| 310ff23676 | |||
| 7894cd9d6a | |||
| 0b787e8ed3 | |||
| 79789571bc | |||
| e092a02d77 | |||
| 66d94aad21 | |||
| 86fe4fde40 | |||
| 956f7d32fb | |||
| be0f1088f0 | |||
| 66e32cb0fa | |||
| a62dc7c70c | |||
| 0e4348c718 | |||
| 1397cf0eaa | |||
| eb352b11b9 | |||
| 6c2249451e | |||
| a7ade2d63e | |||
| c1b53d63fc | |||
| e438c77c6a | |||
| 8ccc601218 | |||
| b934a4c612 | |||
| cb31a99319 | |||
| ecc138fc9e | |||
| 1e749e4f48 | |||
| 38f4d8abfc | |||
| e039d51d18 | |||
| d1e9f53cb8 | |||
| 64ebb78892 | |||
| f1ab24d0ae | |||
| 84b9de9a19 | |||
| 30eb2aa869 | |||
| 672d0d4448 | |||
| 04fe50936e | |||
| 11c701af9b | |||
| ba95e85e53 | |||
| 918a9cf3d1 | |||
| 8e24b34160 | |||
| 9d32bc3153 | |||
| 3bf768f925 | |||
| 726a38712e | |||
| 4a17589496 | |||
| 198ef1e474 | |||
| 9e43ec9dcd | |||
| 1a9e8c047b | |||
| e43f4207a0 | |||
| 5f4ec82544 | |||
| 2a88cc0fcd | |||
| 505ab1bb62 | |||
| 659b4172aa | |||
| a5b57a09fd | |||
| 6e90272783 | |||
| 9d6b4a2e97 | |||
| 3cea0a00b1 | |||
| 81a6834876 | |||
| df40181357 | |||
| 6237a6a6d3 | |||
| 23a26e4033 | |||
| 492d91791c | |||
| 0a6c58ea71 | |||
| 4c8c02f66f | |||
| b038078541 | |||
| 43b43491ab | |||
| a1d4942f76 | |||
| 3bcbd3259f | |||
| 60f8287208 | |||
| b37d13af72 | |||
| 12eb1e0829 | |||
| 5c47476e0c | |||
| 60b6df4542 | |||
| e633ef895d | |||
| a0a963fe1d | |||
| a8419738be | |||
| 7501d253c7 | |||
| d9ccf0a144 | |||
| bd27490adb | |||
| ac4fefa49a | |||
| 6a05702c20 | |||
| 9188f57938 | |||
| 1a131d17b6 | |||
| 4a73fa18d8 | |||
| fe745fdef0 | |||
| 5b2071448f | |||
| 633fb5f941 | |||
| 741eb0c3e9 | |||
| bf38ef23e5 | |||
| 91cf4eb977 | |||
| 01bb11b415 | |||
| 0ff3035f3a | |||
| 2dcfa140e9 | |||
| 367c11dfa2 | |||
| d507ea117e | |||
| 3905234b0d | |||
| 6fc284231c | |||
| a0d28f1770 | |||
| aca0d3dba5 | |||
| d4fd39f05f | |||
| 42be79b3a2 | |||
| 5844128a77 | |||
| 8aaf64d917 | |||
| 5005c7b64c | |||
| bb5dbd13a8 | |||
| 696ae3cc14 | |||
| 9d623160a6 | |||
| 3d3898145a | |||
| 3b3dbcbeb4 | |||
| fc87834cc0 | |||
| c58c5b09ab | |||
| 2ee39b62f3 | |||
| fd082df077 | |||
| aaf5bf0218 | |||
| fb54d06582 | |||
| 5eeb6e0bca | |||
| b0e974e208 | |||
| d6cc851c67 | |||
| 14603112a4 | |||
| a52dfc0373 | |||
| 3e1dd0d640 | |||
| 2e121014b0 | |||
| cbf8622670 | |||
| 80810f1b18 | |||
| 29d3f6a024 | |||
| 80d09044f7 | |||
| 11c41600a3 | |||
| 416fb66118 | |||
| 2af7657214 | |||
| f31d3c6749 | |||
| c53af0df0b | |||
| cec7836959 | |||
| e4a8c693b0 | |||
| 7ff5e02f6b | |||
| f7cb1ce3f4 | |||
| 577831bf1a | |||
| 6cb1a4a48b | |||
| 3da29b4a04 | |||
| 6ee34331b7 | |||
| e2353be24f | |||
| 46e282bd6d | |||
| 6fa930f043 | |||
| b19f745659 | |||
| febf7e54fe | |||
| 88f36ac82f | |||
| 02f5e2de9c | |||
| 6567e0e0aa | |||
| fc50018b06 | |||
| 32e6767b5a | |||
| f22307a0af | |||
| 877e10205b | |||
| 8b8defeacc | |||
| f5daefb09d | |||
| 1fdad42c5f | |||
| 591fa8b753 | |||
| f7fff4d455 | |||
| 283aca50ba | |||
| 1bc9a530bd | |||
| 01797f74dc | |||
| ff07c2b375 | |||
| 90289b0ca0 | |||
| 19838d97be | |||
| c4873a64ec | |||
| 7ce4a7f641 |
@@ -0,0 +1,29 @@
|
|||||||
|
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3/.devcontainer/base.Dockerfile
|
||||||
|
|
||||||
|
# [Choice] Python version: 3, 3.9, 3.8, 3.7, 3.6
|
||||||
|
ARG VARIANT="3.9.0-buster"
|
||||||
|
FROM python:${VARIANT}
|
||||||
|
|
||||||
|
# [Option] Install Node.js
|
||||||
|
ARG INSTALL_NODE="true"
|
||||||
|
ARG NODE_VERSION="lts/*"
|
||||||
|
RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
|
||||||
|
|
||||||
|
# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image.
|
||||||
|
# COPY requirements.txt /tmp/pip-tmp/
|
||||||
|
# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
|
||||||
|
# && rm -rf /tmp/pip-tmp
|
||||||
|
|
||||||
|
# [Optional] Uncomment this section to install additional OS packages.
|
||||||
|
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
|
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
||||||
|
|
||||||
|
# [Optional] Uncomment this line to install global node packages.
|
||||||
|
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1
|
||||||
|
|
||||||
|
|
||||||
|
RUN pip install -U https://github.com/platformio/platformio-core/archive/develop.zip
|
||||||
|
RUN platformio update
|
||||||
|
# To get the test platforms
|
||||||
|
RUN pip install PyYaml
|
||||||
|
#ENV PATH /code/buildroot/bin/:/code/buildroot/tests/:${PATH}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
||||||
|
// https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/python-3
|
||||||
|
{
|
||||||
|
"name": "Python 3",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"context": "..",
|
||||||
|
"args": {
|
||||||
|
// Update 'VARIANT' to pick a Python version: 3, 3.6, 3.7, 3.8, 3.9
|
||||||
|
"VARIANT": "3.9.0-buster",
|
||||||
|
// Options
|
||||||
|
"INSTALL_NODE": "false",
|
||||||
|
"NODE_VERSION": "lts/*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Set *default* container specific settings.json values on container create.
|
||||||
|
"settings": {
|
||||||
|
"python.pythonPath": "/usr/local/bin/python",
|
||||||
|
"python.languageServer": "Pylance",
|
||||||
|
"python.linting.enabled": true,
|
||||||
|
"python.linting.pylintEnabled": true,
|
||||||
|
"python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8",
|
||||||
|
"python.formatting.blackPath": "/usr/local/py-utils/bin/black",
|
||||||
|
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
|
||||||
|
"python.linting.banditPath": "/usr/local/py-utils/bin/bandit",
|
||||||
|
"python.linting.flake8Path": "/usr/local/py-utils/bin/flake8",
|
||||||
|
"python.linting.mypyPath": "/usr/local/py-utils/bin/mypy",
|
||||||
|
"python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle",
|
||||||
|
"python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle",
|
||||||
|
"python.linting.pylintPath": "/usr/local/py-utils/bin/pylint"
|
||||||
|
},
|
||||||
|
|
||||||
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
|
"extensions": [
|
||||||
|
"ms-python.python",
|
||||||
|
"ms-python.vscode-pylance",
|
||||||
|
"platformio.platformio-ide",
|
||||||
|
"marlinfirmware.auto-build",
|
||||||
|
"editorconfig.editorconfig"
|
||||||
|
],
|
||||||
|
|
||||||
|
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
|
// "forwardPorts": [],
|
||||||
|
|
||||||
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
|
// "postCreateCommand": "pip3 install --user -r requirements.txt",
|
||||||
|
|
||||||
|
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
|
// "remoteUser": "vscode"
|
||||||
|
}
|
||||||
+20
-6
@@ -1,19 +1,33 @@
|
|||||||
# editorconfig.org
|
# editorconfig.org
|
||||||
root = true
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
[{*.patch,syntax_test_*}]
|
[{*.patch,syntax_test_*}]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[{*.c,*.cpp,*.h,*.ino,*.py,Makefile}]
|
||||||
|
end_of_line = lf
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,*.ino}]
|
[{*.c,*.cpp,*.h,*.ino}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|
||||||
[{*.c,*.cpp,*.h,*.ino,Makefile}]
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
insert_final_newline = true
|
|
||||||
end_of_line = lf
|
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
[{*.py,*.conf,*.sublime-project}]
|
[{Makefile}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
# Two spaces at the end of the line means newline in Markdown
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[{*.py}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[{*.conf,*.sublime-project}]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|||||||
@@ -0,0 +1,184 @@
|
|||||||
|
name: 🪲 Report a bug
|
||||||
|
description: Create a bug report to help improve Marlin Firmware
|
||||||
|
title: "[BUG] (bug summary)"
|
||||||
|
labels: ["Bug: Potential ?"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**Thank you for reporting a bug in Marlin Firmware!**
|
||||||
|
|
||||||
|
## Before Reporting a Bug
|
||||||
|
|
||||||
|
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
|
||||||
|
|
||||||
|
- Test with the [`bugfix-2.1.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.1.x.zip) to see whether the issue still exists.
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
Please follow the instructions below. Failure to do so may result in your issue being closed. See [Contributing to Marlin](https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/.github/contributing.md) for additional guidelines.
|
||||||
|
|
||||||
|
1. Provide a good title starting with [BUG].
|
||||||
|
2. Fill out all sections of this bug report form.
|
||||||
|
3. Always attach configuration files so we can build and test your setup.
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Did you test the latest `bugfix-2.1.x` code?
|
||||||
|
description: >-
|
||||||
|
Always try the latest code to make sure the issue you are reporting is not already fixed. To download
|
||||||
|
the latest code just [click this link](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.1.x.zip).
|
||||||
|
options:
|
||||||
|
- Yes, and the problem still exists.
|
||||||
|
- No, but I will test it now!
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
# Bug Details
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Bug Description
|
||||||
|
description: >-
|
||||||
|
Describe the bug in this section. Tell us what you were trying to do and what
|
||||||
|
happened that you did not expect. Provide a clear and concise description of the
|
||||||
|
problem and include as many details as possible.
|
||||||
|
|
||||||
|
When pasting formatted text don't forget to put ` ``` ` (on its own line) before and after to make it readable.
|
||||||
|
placeholder: |
|
||||||
|
Marlin doesn't work.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Bug Timeline
|
||||||
|
description: Is this a new bug or an old issue? When did it first start?
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected behavior
|
||||||
|
description: >-
|
||||||
|
What did you expect to happen?
|
||||||
|
placeholder: I expected it to move left.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Actual behavior
|
||||||
|
description: What actually happened instead?
|
||||||
|
placeholder: It moved right instead of left.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to Reproduce
|
||||||
|
description: >-
|
||||||
|
Please describe the steps needed to reproduce the issue.
|
||||||
|
placeholder: |
|
||||||
|
1. [First Step] ...
|
||||||
|
2. [Second Step] ...
|
||||||
|
3. [and so on] ...
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
# Your Setup
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Version of Marlin Firmware
|
||||||
|
description: "See the About Menu on the LCD or the output of `M115`. NOTE: For older releases we only patch critical bugs."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Printer model
|
||||||
|
description: Creality Ender-3, Prusa mini, or Kossel Delta?
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Electronics
|
||||||
|
description: Stock electronics, upgrade board, or something else?
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: LCD/Controller
|
||||||
|
description: Some Marlin behaviors are determined by the controller. Describe your LCD/Controller model and version.
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Other add-ons
|
||||||
|
description: Please list any other hardware add-ons that could be involved.
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Bed Leveling
|
||||||
|
description: What kind of bed leveling compensation are you using?
|
||||||
|
options:
|
||||||
|
- UBL Bilinear mesh
|
||||||
|
- ABL Bilinear mesh
|
||||||
|
- ABL Linear grid
|
||||||
|
- ABL 3-point
|
||||||
|
- MBL Manual Bed Leveling
|
||||||
|
- No Bed Leveling
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Your Slicer
|
||||||
|
description: Do you use Slic3r, Prusa Slicer, Simplify3D, IdeaMaker...?
|
||||||
|
options:
|
||||||
|
- Slic3r
|
||||||
|
- Simplify3D
|
||||||
|
- Prusa Slicer
|
||||||
|
- IdeaMaker
|
||||||
|
- Cura
|
||||||
|
- Other (explain below)
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Host Software
|
||||||
|
description: Do you use OctoPrint, Repetier Host, Pronterface...?
|
||||||
|
options:
|
||||||
|
- SD Card (headless)
|
||||||
|
- Repetier Host
|
||||||
|
- OctoPrint
|
||||||
|
- Pronterface
|
||||||
|
- Cura
|
||||||
|
- Same as my slicer
|
||||||
|
- Other (explain below)
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
# Attachments
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Don't forget to include
|
||||||
|
options:
|
||||||
|
- label: A ZIP file containing your `Configuration.h` and `Configuration_adv.h`.
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
### Optional items to include:
|
||||||
|
- 'Log output from the host. (`M111 S247` for maximum logging.)'
|
||||||
|
- Images or videos demonstrating the problem, if it helps to make it clear.
|
||||||
|
- A G-Code file that exposes the problem, if not affecting _all_ G-code.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional information & file uploads
|
||||||
|
description: >-
|
||||||
|
If you've made any other modifications to the firmware, please describe them in detail.
|
||||||
|
|
||||||
|
When pasting formatted text don't forget to put ` ``` ` (on its own line) before and after to make it readable.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: 📖 Marlin Documentation
|
||||||
|
url: https://marlinfw.org/
|
||||||
|
about: Lots of documentation on installing and using Marlin.
|
||||||
|
- name: 👤 MarlinFirmware Facebook group
|
||||||
|
url: https://www.facebook.com/groups/1049718498464482
|
||||||
|
about: Please ask and answer questions here.
|
||||||
|
- name: 🕹 Marlin on Discord
|
||||||
|
url: https://discord.gg/n5NJ59y
|
||||||
|
about: Join the Discord server for support and discussion.
|
||||||
|
- name: 🔗 Marlin Discussion Forum
|
||||||
|
url: https://reprap.org/forum/list.php?415
|
||||||
|
about: A searchable web forum hosted by RepRap dot org.
|
||||||
|
- name: 📺 Marlin Videos on YouTube
|
||||||
|
url: https://www.youtube.com/results?search_query=marlin+firmware
|
||||||
|
about: Tutorials and more from Marlin users all around the world. Great for new users!
|
||||||
|
- name: 💸 Want to donate?
|
||||||
|
url: https://www.thinkyhead.com/donate-to-marlin
|
||||||
|
about: Please take a look at the various options to support Marlin Firmware's development financially!
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
name: ✨ Request a feature
|
||||||
|
description: Request a new Marlin Firmware feature
|
||||||
|
title: "[FR] (feature summary)"
|
||||||
|
labels: ["T: Feature Request"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
Do you want to ask a question? Are you looking for support? Please use one of the [support links](https://github.com/MarlinFirmware/Marlin/issues/new/choose).
|
||||||
|
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
**Thank you for requesting a new Marlin Firmware feature!**
|
||||||
|
|
||||||
|
## Before Requesting a Feature
|
||||||
|
|
||||||
|
- Read and understand Marlin's [Code of Conduct](https://github.com/MarlinFirmware/Marlin/blob/master/.github/code_of_conduct.md). You are expected to comply with it, including treating everyone with respect.
|
||||||
|
|
||||||
|
- Check the latest [`bugfix-2.1.x` branch](https://github.com/MarlinFirmware/Marlin/archive/bugfix-2.1.x.zip) to see if the feature already exists.
|
||||||
|
|
||||||
|
- Before you proceed with your request, please consider if it is necessary to make it into a firmware feature, or if it may be better suited for a slicer or host feature.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Is your feature request related to a problem? Please describe.
|
||||||
|
description: A clear description of the problem (e.g., "I need X but Marlin can't do it [...]").
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Are you looking for hardware support?
|
||||||
|
description: Tell us the printer, board, or peripheral that needs support.
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the feature you want
|
||||||
|
description: A clear description of the feature and how you think it should work.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context or screenshots about the feature request here.
|
||||||
@@ -28,15 +28,9 @@ Project maintainers are responsible for clarifying the standards of acceptable b
|
|||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
|
||||||
|
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [marlinfirmware@github.com](mailto:marlinfirmware@github.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by following GitHub's [reporting abuse or spam article](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
|
|||||||
+15
-10
@@ -26,16 +26,20 @@ The following is a set of guidelines for contributing to Marlin, hosted by the [
|
|||||||
|
|
||||||
## Code of Conduct
|
## Code of Conduct
|
||||||
|
|
||||||
This project and everyone participating in it is governed by the [Marlin Code of Conduct](code_of_conduct.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to [marlinfirmware@github.com](mailto:marlinfirmware@github.com).
|
This project and everyone participating in it is governed by the [Marlin Code of Conduct](code_of_conduct.md). By participating, you are expected to uphold this code. Please report unacceptable behavior by following GitHub's [reporting abuse or spam article](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam).
|
||||||
|
|
||||||
## I don't want to read this whole thing I just have a question!!!
|
## I don't want to read this whole thing I just have a question!!!
|
||||||
|
|
||||||
> **Note:** Please don't file an issue to ask a question. You'll get faster results by using the resources below.
|
> [!NOTE]
|
||||||
|
> Please don't file an issue to ask a question. You'll get faster results by using the resources below.
|
||||||
|
|
||||||
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
||||||
|
|
||||||
* [Marlin RepRap forum](https://reprap.org/forum/list.php?415)
|
- [Marlin Documentation](https://marlinfw.org) - Official Marlin documentation
|
||||||
* [MarlinFirmware on Facebook](https://www.facebook.com/groups/1049718498464482/)
|
- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/)
|
||||||
|
- RepRap.org [Marlin Forum](https://forums.reprap.org/list.php?415)
|
||||||
|
- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/)
|
||||||
|
- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube
|
||||||
|
|
||||||
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
||||||
|
|
||||||
@@ -50,13 +54,14 @@ If chat is more your speed, you can join the MarlinFirmware Discord server:
|
|||||||
|
|
||||||
This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
|
This section guides you through submitting a Bug Report for Marlin. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
|
||||||
|
|
||||||
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](issue_template.md), the information it asks for helps us resolve issues faster.
|
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
|
||||||
|
|
||||||
> **Note:** Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
> [!NOTE]
|
||||||
|
> Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Bug Report?
|
#### How Do I Submit A (Good) Bug Report?
|
||||||
|
|
||||||
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](issue_template.md).
|
Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). Use the New Issue button to create an issue and provide the following information by filling in [the template](ISSUE_TEMPLATE/bug_report.yml).
|
||||||
|
|
||||||
Explain the problem and include additional details to help maintainers reproduce the problem:
|
Explain the problem and include additional details to help maintainers reproduce the problem:
|
||||||
|
|
||||||
@@ -88,12 +93,12 @@ Include details about your configuration and environment:
|
|||||||
|
|
||||||
This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
|
This section guides you through submitting a suggestion for Marlin, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
|
||||||
|
|
||||||
Before creating a suggestion, please check [this list](#before-submitting-a-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill in [the template](issue_template.md), including the steps that you imagine you would take if the feature you're requesting existed.
|
Before creating a suggestion, please check [this list](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-feature-request). Fill in [the template](ISSUE_TEMPLATE/feature_request.yml), including the steps that you imagine you would take if the feature you're requesting existed.
|
||||||
|
|
||||||
#### Before Submitting a Feature Request
|
#### Before Submitting a Feature Request
|
||||||
|
|
||||||
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
||||||
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aissue)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Feature Request?
|
#### How Do I Submit A (Good) Feature Request?
|
||||||
|
|
||||||
@@ -116,7 +121,7 @@ Unsure where to begin contributing to Marlin? You can start by looking through t
|
|||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
|
|
||||||
Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x` and/or `bugfix-2.0.x`) and never to release branches (e.g., `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
Pull Requests should always be targeted to working branches (e.g., `bugfix-2.1.x` and/or `bugfix-1.1.x`) and never to release branches (e.g., `2.0.x` and/or `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
||||||
|
|
||||||
* Fill in [the required template](pull_request_template.md).
|
* Fill in [the required template](pull_request_template.md).
|
||||||
* Don't include issue numbers in the PR title.
|
* Don't include issue numbers in the PR title.
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Have you read Marlin's Code of Conduct? By filing an Issue, you are expected to comply with it, including treating everyone with respect: https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.0.x/.github/code_of_conduct.md
|
|
||||||
|
|
||||||
Do you want to ask a question? Are you looking for support? Please don't post here. Instead use one of the following options:
|
|
||||||
|
|
||||||
- The Marlin Firmware forum at https://reprap.org/forum/list.php?415
|
|
||||||
- The MarlinFirmware Facebook Group at https://www.facebook.com/groups/1049718498464482/
|
|
||||||
- The MarlinFirmware Discord Server at https://discord.gg/n5NJ59y.
|
|
||||||
|
|
||||||
Before filing an issue be sure to test the latest "bugfix" branch to see whether the issue is already addressed.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
<!-- Description of the bug or requested feature -->
|
|
||||||
|
|
||||||
### Steps to Reproduce
|
|
||||||
|
|
||||||
<!-- If this is a Bug Report, please describe the steps needed to reproduce the issue -->
|
|
||||||
|
|
||||||
1. [First Step]
|
|
||||||
2. [Second Step]
|
|
||||||
3. [and so on...]
|
|
||||||
|
|
||||||
**Expected behavior:** [What you expect to happen]
|
|
||||||
|
|
||||||
**Actual behavior:** [What actually happens]
|
|
||||||
|
|
||||||
#### Additional Information
|
|
||||||
|
|
||||||
* Include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files.
|
|
||||||
* Provide pictures or links to videos that clearly demonstrate the issue.
|
|
||||||
* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines.
|
|
||||||
@@ -1,23 +1,33 @@
|
|||||||
### Requirements
|
<!--
|
||||||
|
|
||||||
* Filling out this template is required. Pull Requests without a clear description may be closed at the maintainers' discretion.
|
Submitting a Pull Request
|
||||||
|
|
||||||
|
- Please fill out all sections of this form. You can delete the helpful comments.
|
||||||
|
- Pull Requests without clear information will take longer and may even be rejected.
|
||||||
|
- We get a high volume of submissions so please be patient during review.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
### Description
|
### Description
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
We must be able to understand your proposed change from this description. If we can't understand what the code will do from this description, the Pull Request may be closed at the maintainers' discretion. Keep in mind that the maintainer reviewing this PR may not be familiar with or have worked with the code recently, so please walk us through the concepts.
|
Clearly describe the submitted changes with lots of details. Include images where helpful. Initial reviewers may not be familiar with the subject, so be as thorough as possible. You can use MarkDown syntax to improve readability with bullet lists, code blocks, and so on. PREVIEW and fix up formatting before submitting.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
<!-- Does this PR require a specific board, LCD, etc.? -->
|
||||||
|
|
||||||
### Benefits
|
### Benefits
|
||||||
|
|
||||||
<!-- What does this fix or improve? -->
|
<!-- What does this PR fix or improve? -->
|
||||||
|
|
||||||
### Configurations
|
### Configurations
|
||||||
|
|
||||||
<!-- Attach any Configuration.h, Configuration_adv.h, or platformio.ini files needed to compile/test your Pull Request. -->
|
<!-- Attach Configurations ZIP and any other files needed to test this PR. -->
|
||||||
|
|
||||||
### Related Issues
|
### Related Issues
|
||||||
|
|
||||||
<!-- Whether this fixes a bug or fulfills a feature request, please list any related Issues here. -->
|
<!-- Does this PR fix a bug or fulfill a Feature Request? Link related Issues here. -->
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#
|
||||||
|
# auto-label.yml
|
||||||
|
# - Find all open issues without a label and a title containing "[BUG]".
|
||||||
|
# - Apply the label "Bug: Potential ?" to these issues.
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Label Old Bugs
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "30 8 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
autolabel:
|
||||||
|
name: Auto Label
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Auto Label for [BUG]
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
// Get all open issues in this repository
|
||||||
|
const issueList = await github.rest.issues.listForRepo({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
state: 'open'
|
||||||
|
});
|
||||||
|
// Filter issues without labels that have a title containing '[BUG]'.
|
||||||
|
const matchingIssues = issueList.data.filter(
|
||||||
|
issue => issue.title.includes('[BUG]') && issue.labels.length === 0
|
||||||
|
);
|
||||||
|
// Process the first 50
|
||||||
|
for (const issue of matchingIssues.slice(0, 50)) {
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
labels: ['Bug: Potential ?']
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#
|
||||||
|
# bump-date.yml
|
||||||
|
# Bump the distribution date once per day
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Bump Distribution Date
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 */6 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
bump_date:
|
||||||
|
name: Bump Distribution Date
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Check out bugfix-2.0.x
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: bugfix-2.0.x
|
||||||
|
|
||||||
|
- name: Bump Date (bugfix-2.0.x)
|
||||||
|
run: |
|
||||||
|
# Inline Bump Script
|
||||||
|
if [[ ! "$( git log -1 --pretty=%B )" =~ ^\[cron\] ]]; then
|
||||||
|
DIST=$( date +"%Y-%m-%d" )
|
||||||
|
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \
|
||||||
|
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/Version.h" && \
|
||||||
|
git config user.name "${GITHUB_ACTOR}" && \
|
||||||
|
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
|
||||||
|
git add . && \
|
||||||
|
git commit -m "[cron] Bump distribution date ($DIST)" && \
|
||||||
|
git push
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
- name: Check out bugfix-2.1.x
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: bugfix-2.1.x
|
||||||
|
|
||||||
|
- name: Bump Date (bugfix-2.1.x)
|
||||||
|
run: |
|
||||||
|
# Inline Bump Script
|
||||||
|
if [[ ! "$( git log -1 --pretty=%B )" =~ ^\[cron\] ]]; then
|
||||||
|
DIST=$( date +"%Y-%m-%d" )
|
||||||
|
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \
|
||||||
|
eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/Version.h" && \
|
||||||
|
git config user.name "${GITHUB_ACTOR}" && \
|
||||||
|
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \
|
||||||
|
git add . && \
|
||||||
|
git commit -m "[cron] Bump distribution date ($DIST)" && \
|
||||||
|
git push
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# check-pr.yml
|
||||||
|
# Close PRs directed at release branches
|
||||||
|
#
|
||||||
|
|
||||||
|
name: PR Bad Target
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened]
|
||||||
|
branches:
|
||||||
|
- 1.0.x
|
||||||
|
- 1.1.x
|
||||||
|
- 2.0.x
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
bad_target:
|
||||||
|
name: PR Bad Target
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: superbrothers/close-pull-request@v3
|
||||||
|
with:
|
||||||
|
comment: >
|
||||||
|
Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases.
|
||||||
|
|
||||||
|
Please redo this PR starting with the `bugfix-2.1.x` branch and be careful to target `bugfix-2.1.x` when resubmitting the PR. Patches may also target `bugfix-2.0.x` if they are specifically for 2.0.9.x.
|
||||||
|
|
||||||
|
It may help to set your fork's default branch to `bugfix-2.1.x`.
|
||||||
|
|
||||||
|
See [this page](https://marlinfw.org/docs/development/getting_started_pull_requests.html) for full instructions.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# clean-closed.yml
|
||||||
|
# Remove obsolete labels when an Issue or PR is closed
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Clean Closed
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [closed]
|
||||||
|
issues:
|
||||||
|
types: [closed]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
remove_label:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
label:
|
||||||
|
- "S: Don't Merge"
|
||||||
|
- "S: Hold for 2.1"
|
||||||
|
- "S: Please Merge"
|
||||||
|
- "S: Please Test"
|
||||||
|
- "help wanted"
|
||||||
|
- "Bug: Potential ?"
|
||||||
|
- "Needs: Discussion"
|
||||||
|
- "Needs: Documentation"
|
||||||
|
- "Needs: More Data"
|
||||||
|
- "Needs: Patch"
|
||||||
|
- "Needs: Testing"
|
||||||
|
- "Needs: Work"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Remove Labels
|
||||||
|
uses: actions-ecosystem/action-remove-labels@v1
|
||||||
|
with:
|
||||||
|
github_token: ${{ github.token }}
|
||||||
|
labels: ${{ matrix.label }}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# close-stale.yml
|
||||||
|
# Close open issues after a period of inactivity
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Close Stale Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "22 1 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
name: Close Stale Issues
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v8
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
stale-issue-message: |
|
||||||
|
Greetings from the Marlin AutoBot!
|
||||||
|
This issue has had no activity for the last 90 days.
|
||||||
|
Do you still see this issue with the latest `bugfix-2.1.x` code?
|
||||||
|
Please add a reply within 14 days or this issue will be automatically closed.
|
||||||
|
To keep a confirmed issue open we can also add a "Bug: Confirmed" tag.
|
||||||
|
|
||||||
|
Disclaimer: This is an open community project with lots of activity and limited
|
||||||
|
resources. The main project contributors will do a bug sweep ahead of the next
|
||||||
|
release, but any skilled member of the community may jump in at any time to fix
|
||||||
|
this issue. That can take a while depending on our busy lives so please be patient,
|
||||||
|
and take advantage of other resources such as the MarlinFirmware Discord to help
|
||||||
|
solve the issue.
|
||||||
|
days-before-stale: 90
|
||||||
|
days-before-close: 14
|
||||||
|
stale-issue-label: 'stale-closing-soon'
|
||||||
|
exempt-all-assignees: true
|
||||||
|
exempt-issue-labels: 'Bug: Confirmed !,T: Feature Request,Needs: More Data,Needs: Discussion,Needs: Documentation,Needs: Patch,Needs: Work,Needs: Testing,help wanted,no-locking'
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# lock-closed.yml
|
||||||
|
# Lock closed issues after a period of inactivity
|
||||||
|
#
|
||||||
|
|
||||||
|
name: Lock Closed Issues
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 1/13 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lock:
|
||||||
|
name: Lock Closed Issues
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: dessant/lock-threads@v2
|
||||||
|
with:
|
||||||
|
github-token: ${{ github.token }}
|
||||||
|
process-only: 'issues'
|
||||||
|
issue-lock-inactive-days: '60'
|
||||||
|
issue-exclude-created-before: ''
|
||||||
|
issue-exclude-labels: 'no-locking'
|
||||||
|
issue-lock-labels: ''
|
||||||
|
issue-lock-comment: >
|
||||||
|
This issue has been automatically locked since there
|
||||||
|
has not been any recent activity after it was closed.
|
||||||
|
Please open a new issue for related bugs.
|
||||||
|
issue-lock-reason: ''
|
||||||
@@ -8,7 +8,8 @@ name: CI
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.0.x
|
- bugfix-2.1.x
|
||||||
|
- 2.1.x
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
@@ -16,7 +17,8 @@ on:
|
|||||||
- '**/*.md'
|
- '**/*.md'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.0.x
|
- bugfix-2.1.x
|
||||||
|
- 2.1.x
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
@@ -33,87 +35,121 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
test-platform:
|
test-platform:
|
||||||
# Base Environments
|
|
||||||
|
|
||||||
- DUE
|
# Native
|
||||||
- DUE_archim
|
|
||||||
- esp32
|
|
||||||
- linux_native
|
- linux_native
|
||||||
|
|
||||||
|
# AVR
|
||||||
- mega2560
|
- mega2560
|
||||||
- at90usb1286_dfu
|
|
||||||
- teensy31
|
|
||||||
- teensy35
|
|
||||||
- teensy41
|
|
||||||
- SAMD51_grandcentral_m4
|
|
||||||
|
|
||||||
# Extended AVR Environments
|
|
||||||
|
|
||||||
- FYSETC_F6
|
|
||||||
- mega1280
|
- mega1280
|
||||||
|
- at90usb1286_dfu
|
||||||
|
|
||||||
|
# AVR Extended
|
||||||
|
- FYSETC_F6
|
||||||
|
- melzi_optiboot
|
||||||
- rambo
|
- rambo
|
||||||
- sanguino1284p
|
- sanguino1284p
|
||||||
- sanguino644p
|
- sanguino644p
|
||||||
|
|
||||||
# STM32F1 (Maple) Environments
|
# SAM3X8E
|
||||||
|
- DUE
|
||||||
|
- DUE_archim
|
||||||
|
|
||||||
#- STM32F103RC_btt_maple
|
# SAMD21
|
||||||
- STM32F103RC_btt_USB_maple
|
- SAMD51_grandcentral_m4
|
||||||
- STM32F103RC_fysetc_maple
|
- SAMD21_minitronics20
|
||||||
- STM32F103RC_meeb
|
|
||||||
- jgaurora_a5s_a1_maple
|
|
||||||
- STM32F103VE_longer_maple
|
|
||||||
#- mks_robin_maple
|
|
||||||
- mks_robin_lite_maple
|
|
||||||
- mks_robin_pro_maple
|
|
||||||
#- mks_robin_nano35_maple
|
|
||||||
#- STM32F103RE_creality_maple
|
|
||||||
- STM32F103VE_ZM3E4V2_USB_maple
|
|
||||||
|
|
||||||
# STM32 (ST) Environments
|
# ESP32
|
||||||
|
- esp32
|
||||||
|
- mks_tinybee
|
||||||
|
|
||||||
|
# Teensy 2
|
||||||
|
#- at90usb1286_cdc
|
||||||
|
|
||||||
|
# Teensy MK20DX256
|
||||||
|
- teensy31
|
||||||
|
|
||||||
|
# Teensy MK64FX512, MK66FX1M0
|
||||||
|
- teensy35
|
||||||
|
|
||||||
|
# Teensy IMXRT1062DVx6A
|
||||||
|
- teensy41
|
||||||
|
|
||||||
|
# STM32F0
|
||||||
|
- malyan_M300
|
||||||
|
- STM32F070CB_malyan
|
||||||
|
- STM32F070RB_malyan
|
||||||
|
|
||||||
|
# STM32F1
|
||||||
|
- chitu_f103
|
||||||
|
- mks_robin
|
||||||
|
- mks_robin_nano_v1v2
|
||||||
|
- PANDA_PI_V29
|
||||||
- STM32F103RC_btt
|
- STM32F103RC_btt
|
||||||
#- STM32F103RC_btt_USB
|
- STM32F103RC_fysetc
|
||||||
- STM32F103RE_btt
|
- STM32F103RE_btt
|
||||||
- STM32F103RE_btt_USB
|
- STM32F103RE_btt_USB
|
||||||
- STM32F103RE_creality
|
- STM32F103RE_creality
|
||||||
- STM32F103VE_longer
|
- STM32F103VE_longer
|
||||||
- STM32F407VE_black
|
#- mks_robin_mini
|
||||||
- STM32F401VE_STEVAL
|
#- mks_robin_nano_v1_3_f4_usbmod
|
||||||
- BIGTREE_BTT002
|
#- mks_robin_nano_v1v2_usbmod
|
||||||
- BIGTREE_SKR_PRO
|
#- STM32F103CB_malyan
|
||||||
- BIGTREE_GTR_V1_0
|
#- STM32F103RC_btt_USB
|
||||||
- mks_robin
|
#- STM32F103RE
|
||||||
|
|
||||||
|
# STM32F4
|
||||||
- ARMED
|
- ARMED
|
||||||
- FYSETC_S6
|
- BIGTREE_BTT002
|
||||||
- STM32F070CB_malyan
|
- BIGTREE_GTR_V1_0
|
||||||
- STM32F070RB_malyan
|
- BIGTREE_SKR_PRO
|
||||||
- malyan_M300
|
|
||||||
- FLYF407ZG
|
- FLYF407ZG
|
||||||
- rumba32
|
- FYSETC_S6
|
||||||
- LERDGEX
|
|
||||||
- LERDGEK
|
- LERDGEK
|
||||||
- mks_robin_nano35
|
- LERDGEX
|
||||||
|
- mks_robin_pro2
|
||||||
|
- Opulo_Lumen_REV3
|
||||||
|
- rumba32
|
||||||
|
- STM32F401RC_creality
|
||||||
|
- STM32F407VE_black
|
||||||
|
- I3DBEEZ9_V1
|
||||||
|
|
||||||
|
# STM32F7
|
||||||
- NUCLEO_F767ZI
|
- NUCLEO_F767ZI
|
||||||
- REMRAM_V1
|
- REMRAM_V1
|
||||||
|
|
||||||
|
# STM32H7
|
||||||
- BTT_SKR_SE_BX
|
- BTT_SKR_SE_BX
|
||||||
- chitu_f103
|
- STM32H743VI_btt
|
||||||
- Index_Mobo_Rev03
|
|
||||||
|
|
||||||
# Put lengthy tests last
|
# STM32F1 (Maple)
|
||||||
|
- jgaurora_a5s_a1_maple
|
||||||
|
- mks_robin_lite_maple
|
||||||
|
- mks_robin_pro_maple
|
||||||
|
- STM32F103RC_btt_USB_maple
|
||||||
|
- STM32F103RC_fysetc_maple
|
||||||
|
- STM32F103RC_meeb_maple
|
||||||
|
- STM32F103VE_longer_maple
|
||||||
|
- STM32F103VE_ZM3E4V2_USB_maple
|
||||||
|
#- mks_robin_maple
|
||||||
|
#- mks_robin_nano_v1v2_maple
|
||||||
|
#- STM32F103RC_btt_maple
|
||||||
|
#- STM32F103RE_creality_maple
|
||||||
|
|
||||||
|
# STM32G0
|
||||||
|
- STM32G0B1RE_btt
|
||||||
|
|
||||||
|
# HC32
|
||||||
|
- HC32F460C_aquila_101
|
||||||
|
|
||||||
|
# LPC176x - Lengthy tests
|
||||||
- LPC1768
|
- LPC1768
|
||||||
- LPC1769
|
- LPC1769
|
||||||
|
|
||||||
# Non-working environment tests
|
|
||||||
#- at90usb1286_cdc
|
|
||||||
#- STM32F103CB_malyan
|
|
||||||
#- STM32F103RE
|
|
||||||
#- mks_robin_mini
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Cache pip
|
- name: Cache pip
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
@@ -129,16 +165,17 @@ jobs:
|
|||||||
path: ~/.platformio
|
path: ~/.platformio
|
||||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||||
|
|
||||||
- name: Select Python 3.7
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v3
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax.
|
python-version: '3.9'
|
||||||
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
|
architecture: 'x64'
|
||||||
|
|
||||||
- name: Install PlatformIO
|
- name: Install PlatformIO
|
||||||
run: |
|
run: |
|
||||||
pip install -U https://github.com/platformio/platformio-core/archive/v5.2.5.zip
|
pip install -U platformio
|
||||||
platformio update
|
pio upgrade --dev
|
||||||
|
pio pkg update --global
|
||||||
|
|
||||||
- name: Run ${{ matrix.test-platform }} Tests
|
- name: Run ${{ matrix.test-platform }} Tests
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#
|
||||||
|
# unlock-reopened.yml
|
||||||
|
# Unlock an issue whenever it is re-opened
|
||||||
|
#
|
||||||
|
|
||||||
|
name: "Unlock reopened issue"
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [reopened]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
unlock:
|
||||||
|
name: Unlock Reopened
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: OSDKDev/unlock-issues@v1.1
|
||||||
|
with:
|
||||||
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
+25
-26
@@ -21,35 +21,21 @@
|
|||||||
|
|
||||||
# Generated files
|
# Generated files
|
||||||
_Version.h
|
_Version.h
|
||||||
bdf2u8g
|
bdf2u8g.exe
|
||||||
|
genpages.exe
|
||||||
marlin_config.json
|
marlin_config.json
|
||||||
mczip.h
|
mczip.h
|
||||||
|
language*.csv
|
||||||
|
out-csv/
|
||||||
|
out-language/
|
||||||
*.gen
|
*.gen
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
|
||||||
#
|
|
||||||
# OS
|
# OS
|
||||||
#
|
|
||||||
applet/
|
applet/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
#
|
# Compiled C++ Object files
|
||||||
# Misc
|
|
||||||
#
|
|
||||||
*~
|
|
||||||
*.orig
|
|
||||||
*.rej
|
|
||||||
*.bak
|
|
||||||
*.idea
|
|
||||||
*.i
|
|
||||||
*.ii
|
|
||||||
*.swp
|
|
||||||
tags
|
|
||||||
|
|
||||||
#
|
|
||||||
# C++
|
|
||||||
#
|
|
||||||
# Compiled Object files
|
|
||||||
*.slo
|
*.slo
|
||||||
*.lo
|
*.lo
|
||||||
*.o
|
*.o
|
||||||
@@ -80,10 +66,7 @@ tags
|
|||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
#
|
# Compiled C Object files
|
||||||
# C
|
|
||||||
#
|
|
||||||
# Object files
|
|
||||||
*.o
|
*.o
|
||||||
*.ko
|
*.ko
|
||||||
*.obj
|
*.obj
|
||||||
@@ -143,13 +126,16 @@ vc-fileutils.settings
|
|||||||
.vscode/*
|
.vscode/*
|
||||||
!.vscode/extensions.json
|
!.vscode/extensions.json
|
||||||
|
|
||||||
#Simulation
|
# Simulation files
|
||||||
imgui.ini
|
imgui.ini
|
||||||
eeprom.dat
|
eeprom.dat
|
||||||
spi_flash.bin
|
spi_flash.bin
|
||||||
|
fs.img
|
||||||
|
|
||||||
#cmake
|
# CMake
|
||||||
|
buildroot/share/cmake/*
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
|
!buildroot/share/cmake/CMakeLists.txt
|
||||||
src/CMakeLists.txt
|
src/CMakeLists.txt
|
||||||
CMakeListsPrivate.txt
|
CMakeListsPrivate.txt
|
||||||
build/
|
build/
|
||||||
@@ -169,3 +155,16 @@ __pycache__
|
|||||||
|
|
||||||
# IOLogger logs
|
# IOLogger logs
|
||||||
*_log.csv
|
*_log.csv
|
||||||
|
|
||||||
|
# Misc.
|
||||||
|
*~
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.bak
|
||||||
|
*.idea
|
||||||
|
*.i
|
||||||
|
*.ii
|
||||||
|
*.swp
|
||||||
|
tags
|
||||||
|
*.logs
|
||||||
|
*.bak
|
||||||
|
|||||||
Vendored
+1
@@ -6,6 +6,7 @@
|
|||||||
"platformio.platformio-ide"
|
"platformio.platformio-ide"
|
||||||
],
|
],
|
||||||
"unwantedRecommendations": [
|
"unwantedRecommendations": [
|
||||||
|
"ms-vscode-remote.remote-containers",
|
||||||
"ms-vscode.cpptools-extension-pack"
|
"ms-vscode.cpptools-extension-pack"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,18 @@
|
|||||||
|
SCRIPTS_DIR := buildroot/share/scripts
|
||||||
|
CONTAINER_RT_BIN := docker
|
||||||
|
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
||||||
|
CONTAINER_IMAGE := marlin-dev
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo "Tasks for local development:"
|
@echo "Tasks for local development:"
|
||||||
@echo "* tests-single-ci: Run a single test from inside the CI"
|
@echo "make marlin : Build marlin for the configured board"
|
||||||
@echo "* tests-single-local: Run a single test locally"
|
@echo "make format-pins : Reformat all pins files"
|
||||||
@echo "* tests-single-local-docker: Run a single test locally, using docker-compose"
|
@echo "make tests-single-ci : Run a single test from inside the CI"
|
||||||
@echo "* tests-all-local: Run all tests locally"
|
@echo "make tests-single-local : Run a single test locally"
|
||||||
@echo "* tests-all-local-docker: Run all tests locally, using docker-compose"
|
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
||||||
@echo "* setup-local-docker: Setup local docker-compose"
|
@echo "make tests-all-local : Run all tests locally"
|
||||||
|
@echo "make tests-all-local-docker : Run all tests locally, using docker"
|
||||||
|
@echo "make setup-local-docker : Build the local docker image"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Options for testing:"
|
@echo "Options for testing:"
|
||||||
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||||
@@ -18,35 +25,41 @@ help:
|
|||||||
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
@echo " VERBOSE_PLATFORMIO If you want the full PIO output, set any value"
|
||||||
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
@echo " GIT_RESET_HARD Used by CI: reset all local changes. WARNING:"
|
||||||
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
@echo " THIS WILL UNDO ANY CHANGES YOU'VE MADE!"
|
||||||
.PHONY: help
|
|
||||||
|
marlin:
|
||||||
|
./buildroot/bin/mftest -a
|
||||||
|
.PHONY: marlin
|
||||||
|
|
||||||
tests-single-ci:
|
tests-single-ci:
|
||||||
export GIT_RESET_HARD=true
|
export GIT_RESET_HARD=true
|
||||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET)
|
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
||||||
.PHONY: tests-single-ci
|
|
||||||
|
|
||||||
tests-single-local:
|
tests-single-local:
|
||||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local" ; return 1; fi
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
&& run_tests . $(TEST_TARGET) "$(ONLY_TEST)"
|
||||||
.PHONY: tests-single-local
|
|
||||||
|
|
||||||
tests-single-local-docker:
|
tests-single-local-docker:
|
||||||
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
@if ! test -n "$(TEST_TARGET)" ; then echo "***ERROR*** Set TEST_TARGET=<your-module> or use make tests-all-local-docker" ; return 1; fi
|
||||||
docker-compose run --rm marlin $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||||
.PHONY: tests-single-local-docker
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||||
|
|
||||||
tests-all-local:
|
tests-all-local:
|
||||||
export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} \
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
&& for TEST_TARGET in $$(./get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
&& for TEST_TARGET in $$($(SCRIPTS_DIR)/get_test_targets.py) ; do echo "Running tests for $$TEST_TARGET" ; run_tests . $$TEST_TARGET ; done
|
||||||
.PHONY: tests-all-local
|
|
||||||
|
|
||||||
tests-all-local-docker:
|
tests-all-local-docker:
|
||||||
docker-compose run --rm marlin $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||||
.PHONY: tests-all-local-docker
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) $(MAKE) tests-all-local VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD)
|
||||||
|
|
||||||
setup-local-docker:
|
setup-local-docker:
|
||||||
docker-compose build
|
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
||||||
.PHONY: setup-local-docker
|
|
||||||
|
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
||||||
|
|
||||||
|
$(PINS): %:
|
||||||
|
@echo "Formatting $@" && node $(SCRIPTS_DIR)/pinsformat.js $@
|
||||||
|
|
||||||
|
format-pins: $(PINS)
|
||||||
|
|||||||
+975
-478
File diff suppressed because it is too large
Load Diff
+1046
-984
File diff suppressed because it is too large
Load Diff
+33
-144
@@ -63,8 +63,8 @@ HARDWARE_MOTHERBOARD ?= 1020
|
|||||||
|
|
||||||
ifeq ($(OS),Windows_NT)
|
ifeq ($(OS),Windows_NT)
|
||||||
# Windows
|
# Windows
|
||||||
ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
|
ARDUINO_INSTALL_DIR ?= ${HOME}/AppData/Local/Arduino
|
||||||
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino
|
||||||
else
|
else
|
||||||
UNAME_S := $(shell uname -s)
|
UNAME_S := $(shell uname -s)
|
||||||
ifeq ($(UNAME_S),Linux)
|
ifeq ($(UNAME_S),Linux)
|
||||||
@@ -82,11 +82,11 @@ endif
|
|||||||
|
|
||||||
# Arduino source install directory, and version number
|
# Arduino source install directory, and version number
|
||||||
# On most linuxes this will be /usr/share/arduino
|
# On most linuxes this will be /usr/share/arduino
|
||||||
ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino
|
ARDUINO_INSTALL_DIR ?= ${HOME}/AppData/Local/Arduino # C:/Users/${USERNAME}/AppData/Local/Arduino
|
||||||
ARDUINO_VERSION ?= 106
|
ARDUINO_VERSION ?= 10819
|
||||||
|
|
||||||
# The installed Libraries are in the User folder
|
# The installed Libraries are in the User folder
|
||||||
ARDUINO_USER_DIR ?= ${HOME}/Arduino
|
ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino
|
||||||
|
|
||||||
# You can optionally set a path to the avr-gcc tools.
|
# You can optionally set a path to the avr-gcc tools.
|
||||||
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
|
# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/
|
||||||
@@ -109,7 +109,7 @@ LIQUID_TWI2 ?= 0
|
|||||||
# This defines if Wire is needed
|
# This defines if Wire is needed
|
||||||
WIRE ?= 0
|
WIRE ?= 0
|
||||||
|
|
||||||
# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h)
|
# This defines if Tone is needed (i.e., SPEAKER is defined in Configuration.h)
|
||||||
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory.
|
# Disabling this (and SPEAKER) saves approximately 350 bytes of memory.
|
||||||
TONE ?= 1
|
TONE ?= 1
|
||||||
|
|
||||||
@@ -307,133 +307,22 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||||
# Tenlog D3 Hero IDEX printer
|
# Tenlog D3 Hero IDEX printer
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
# Tenlog D3,5,6 Pro IDEX printers
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||||
|
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||||
# 3Drag Controller
|
# Zonestar zrib V5.3 (Chinese RAMPS replica)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1100)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||||
# Velleman K8200 Controller (derived from 3Drag Controller)
|
# Pxmalion Core I3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1101)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||||
# Velleman K8400 Controller (derived from 3Drag Controller)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1102)
|
|
||||||
# Velleman K8600 Controller (Vertex Nano)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1103)
|
|
||||||
# Velleman K8800 Controller (Vertex Delta)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1104)
|
|
||||||
# 2PrintBeta BAM&DICE with STK drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1105)
|
|
||||||
# 2PrintBeta BAM&DICE Due with STK drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1106)
|
|
||||||
# MKS BASE v1.0
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1107)
|
|
||||||
# MKS v1.4 with A4982 stepper drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1108)
|
|
||||||
# MKS v1.5 with Allegro A4982 stepper drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1109)
|
|
||||||
# MKS v1.6 with Allegro A4982 stepper drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1110)
|
|
||||||
# MKS BASE 1.0 with Heroic HR4982 stepper drivers
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1111)
|
|
||||||
# MKS GEN v1.3 or 1.4
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
|
||||||
# MKS GEN L
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
|
||||||
# zrib V2.0 control board (Chinese RAMPS replica)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
|
||||||
# BigTreeTech or BIQU KFB2.0
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
|
||||||
# Felix 2.0+ Electronics Board (RAMPS like)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
|
||||||
# Invent-A-Part RigidBoard
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
|
||||||
# Invent-A-Part RigidBoard V2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
|
||||||
# Sainsmart 2-in-1 board
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
|
||||||
# Ultimaker
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
|
||||||
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
|
||||||
MCU ?= atmega1280
|
|
||||||
PROG_MCU ?= m1280
|
|
||||||
|
|
||||||
# Azteeg X3
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
|
||||||
# Azteeg X3 Pro
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
|
||||||
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
|
||||||
# Rumba
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
|
||||||
# Raise3D Rumba
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
|
||||||
# Rapide Lite RL200 Rumba
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
|
||||||
# Formbot T-Rex 2 Plus
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
|
||||||
# Formbot T-Rex 3
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
|
||||||
# Formbot Raptor
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
|
||||||
# Formbot Raptor 2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
|
||||||
# bq ZUM Mega 3D
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
|
||||||
# MakeBoard Mini v2.1.2 is a control board sold by MicroMake
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
|
||||||
# TriGorilla Anycubic version 1.3 based on RAMPS EFB
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
|
||||||
# TriGorilla Anycubic version 1.4 based on RAMPS EFB
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
|
||||||
# TriGorilla Anycubic version 1.4 Rev 1.1
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
|
||||||
# Creality: Ender-4, CR-8
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
|
||||||
# Creality: CR10S, CR20, CR-X
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
|
||||||
# Dagoma F5
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
|
||||||
# FYSETC F6 1.3
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
|
||||||
# FYSETC F6 1.5
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
|
||||||
# Duplicator i3 Plus
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
|
||||||
# VORON
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
|
||||||
# TRONXY V3 1.0
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
|
||||||
# Z-Bolt X Series
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
|
||||||
# TT OSCAR
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
|
||||||
# Overlord/Overlord Pro
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
|
||||||
# ADIMLab Gantry v1
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
|
||||||
# ADIMLab Gantry v2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
|
||||||
# BIQU Tango V1
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
|
||||||
# MKS GEN L V2
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
|
||||||
# MKS GEN L V2.1
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
|
||||||
# Copymaster 3D
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
|
||||||
# Ortur 4
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
|
||||||
# Tenlog D3 Hero
|
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMBo and derivatives
|
# RAMBo and derivatives
|
||||||
@@ -512,7 +401,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||||
# Intamsys 4.0 (Funmat HT)
|
# Intamsys 4.0 (Funmat HT)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||||
# Malyan M180 Mainboard Version 2 (no display function, direct gcode only)
|
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||||
@@ -767,18 +656,18 @@ ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)
|
|||||||
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SPI/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(IS_MCU),1)
|
ifeq ($(IS_MCU),1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/cores/arduino
|
||||||
|
|
||||||
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
# Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial
|
||||||
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SPI/src
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/arduino/avr/1.8.6/libraries/SoftwareSerial/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src
|
||||||
@@ -792,17 +681,17 @@ ifeq ($(WIRE), 1)
|
|||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
|
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility
|
||||||
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
# New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/libraries/Wire/src/utility
|
||||||
endif
|
endif
|
||||||
ifeq ($(NEOPIXEL), 1)
|
ifeq ($(NEOPIXEL), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel
|
||||||
endif
|
endif
|
||||||
ifeq ($(U8GLIB), 1)
|
ifeq ($(U8GLIB), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib-HAL
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/csrc
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib-HAL/src
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/cppsrc
|
# VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/fntsrc
|
# VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/src
|
||||||
endif
|
endif
|
||||||
ifeq ($(TMC), 1)
|
ifeq ($(TMC), 1)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src
|
VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src
|
||||||
@@ -811,9 +700,9 @@ endif
|
|||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), arduino)
|
ifeq ($(HARDWARE_VARIANT), arduino)
|
||||||
HARDWARE_SUB_VARIANT ?= mega
|
HARDWARE_SUB_VARIANT ?= mega
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT)
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/$(HARDWARE_SUB_VARIANT)
|
||||||
else ifeq ($(HARDWARE_VARIANT), Sanguino)
|
else ifeq ($(HARDWARE_VARIANT), Sanguino)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/sanguino
|
||||||
else ifeq ($(HARDWARE_VARIANT), archim)
|
else ifeq ($(HARDWARE_VARIANT), archim)
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/
|
||||||
@@ -829,7 +718,7 @@ else ifeq ($(HARDWARE_VARIANT), archim)
|
|||||||
LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a
|
LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a
|
||||||
else
|
else
|
||||||
HARDWARE_SUB_VARIANT ?= standard
|
HARDWARE_SUB_VARIANT ?= standard
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT)
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/avr/1.8.6/variants/$(HARDWARE_SUB_VARIANT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIB_SRC = wiring.c \
|
LIB_SRC = wiring.c \
|
||||||
@@ -844,7 +733,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(HARDWARE_VARIANT), Teensy)
|
ifeq ($(HARDWARE_VARIANT), Teensy)
|
||||||
LIB_SRC = wiring.c
|
LIB_SRC = wiring.c
|
||||||
VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy
|
VPATH += $(ARDUINO_INSTALL_DIR)/packages/arduino/hardware/teensy/cores/teensy
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp
|
LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp
|
||||||
@@ -991,7 +880,7 @@ AVRDUDE_WRITE_FLASH = -Uflash:w:$(BUILD_DIR)/$(TARGET).hex:i
|
|||||||
ifeq ($(shell uname -s), Linux)
|
ifeq ($(shell uname -s), Linux)
|
||||||
AVRDUDE_CONF = /etc/avrdude/avrdude.conf
|
AVRDUDE_CONF = /etc/avrdude/avrdude.conf
|
||||||
else
|
else
|
||||||
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf
|
||||||
endif
|
endif
|
||||||
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \
|
||||||
-p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
-p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Marlin Firmware
|
Marlin Firmware
|
||||||
|
|
||||||
(c) 2011-2020 MarlinFirmware
|
(c) 2011-2024 MarlinFirmware
|
||||||
Portions of Marlin are (c) by their respective authors.
|
Portions of Marlin are (c) by their respective authors.
|
||||||
All code complies with GPLv2 and/or GPLv3
|
All code complies with GPLv2 and/or GPLv3
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ Configuration
|
|||||||
- https://github.com/MarlinFirmware/Configurations
|
- https://github.com/MarlinFirmware/Configurations
|
||||||
Example configurations for several printer models.
|
Example configurations for several printer models.
|
||||||
|
|
||||||
- https://www.youtube.com/watch?v=3gwWVFtdg-4
|
- https://youtu.be/3gwWVFtdg-4
|
||||||
A good 20-minute overview of Marlin configuration by Tom Sanladerer.
|
A good 20-minute overview of Marlin configuration by Tom Sanladerer.
|
||||||
(Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.)
|
(Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.)
|
||||||
Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin
|
Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin
|
||||||
|
|||||||
+2
-2
@@ -28,7 +28,7 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin release version identifier
|
* Marlin release version identifier
|
||||||
*/
|
*/
|
||||||
//#define SHORT_BUILD_VERSION "bugfix-2.0.x"
|
//#define SHORT_BUILD_VERSION "bugfix-2.1.x"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verbose version identifier which should contain a reference to the location
|
* Verbose version identifier which should contain a reference to the location
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
* here we define this default string as the date where the latest release
|
* here we define this default string as the date where the latest release
|
||||||
* version was tagged.
|
* version was tagged.
|
||||||
*/
|
*/
|
||||||
//#define STRING_DISTRIBUTION_DATE "2022-04-03"
|
//#define STRING_DISTRIBUTION_DATE "2024-01-31"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||||
|
|||||||
@@ -0,0 +1,247 @@
|
|||||||
|
#
|
||||||
|
# Marlin Firmware
|
||||||
|
# config.ini - Options to apply before the build
|
||||||
|
#
|
||||||
|
[config:base]
|
||||||
|
#
|
||||||
|
# ini_use_config - A comma-separated list of actions to apply to the Configuration files.
|
||||||
|
# The actions will be applied in the listed order.
|
||||||
|
# - none
|
||||||
|
# Ignore this file and don't apply any configuration options
|
||||||
|
#
|
||||||
|
# - base
|
||||||
|
# Just apply the options in config:base to the configuration
|
||||||
|
#
|
||||||
|
# - minimal
|
||||||
|
# Just apply the options in config:minimal to the configuration
|
||||||
|
#
|
||||||
|
# - all
|
||||||
|
# Apply all 'config:*' sections in this file to the configuration
|
||||||
|
#
|
||||||
|
# - another.ini
|
||||||
|
# Load another INI file with a path relative to this config.ini file (i.e., within Marlin/)
|
||||||
|
#
|
||||||
|
# - https://me.myserver.com/path/to/configs
|
||||||
|
# Fetch configurations from any URL.
|
||||||
|
#
|
||||||
|
# - example/Creality/Ender-5 Plus @ bugfix-2.1.x
|
||||||
|
# Fetch example configuration files from the MarlinFirmware/Configurations repository
|
||||||
|
# https://raw.githubusercontent.com/MarlinFirmware/Configurations/bugfix-2.1.x/config/examples/Creality/Ender-5%20Plus/
|
||||||
|
#
|
||||||
|
# - example/default @ release-2.0.9.7
|
||||||
|
# Fetch default configuration files from the MarlinFirmware/Configurations repository
|
||||||
|
# https://raw.githubusercontent.com/MarlinFirmware/Configurations/release-2.0.9.7/config/default/
|
||||||
|
#
|
||||||
|
# - [disable]
|
||||||
|
# Comment out all #defines in both Configuration.h and Configuration_adv.h. This is useful
|
||||||
|
# to start with a clean slate before applying any config: options, so only the options explicitly
|
||||||
|
# set in config.ini will be enabled in the configuration.
|
||||||
|
#
|
||||||
|
# - [flatten] (Not yet implemented)
|
||||||
|
# Produce a flattened set of Configuration.h and Configuration_adv.h files with only the enabled
|
||||||
|
# #defines and no comments. A clean look, but context-free.
|
||||||
|
#
|
||||||
|
ini_use_config = none
|
||||||
|
|
||||||
|
# Load all config: sections in this file
|
||||||
|
;ini_use_config = all
|
||||||
|
# Disable everything and apply subsequent config:base options
|
||||||
|
;ini_use_config = [disable], base
|
||||||
|
# Load config file relative to Marlin/
|
||||||
|
;ini_use_config = another.ini
|
||||||
|
# Download configurations from GitHub
|
||||||
|
;ini_use_config = example/Creality/Ender-5 Plus @ bugfix-2.1.x
|
||||||
|
# Download configurations from your server
|
||||||
|
;ini_use_config = https://me.myserver.com/path/to/configs
|
||||||
|
# Evaluate config:base and do a config dump
|
||||||
|
;ini_use_config = base
|
||||||
|
;config_export = 2
|
||||||
|
|
||||||
|
[config:minimal]
|
||||||
|
motherboard = BOARD_RAMPS_14_EFB
|
||||||
|
serial_port = 0
|
||||||
|
baudrate = 250000
|
||||||
|
|
||||||
|
use_watchdog = on
|
||||||
|
thermal_protection_hotends = on
|
||||||
|
thermal_protection_hysteresis = 4
|
||||||
|
thermal_protection_period = 40
|
||||||
|
|
||||||
|
bufsize = 4
|
||||||
|
block_buffer_size = 16
|
||||||
|
max_cmd_size = 96
|
||||||
|
|
||||||
|
extruders = 1
|
||||||
|
temp_sensor_0 = 1
|
||||||
|
|
||||||
|
temp_hysteresis = 3
|
||||||
|
heater_0_mintemp = 5
|
||||||
|
heater_0_maxtemp = 275
|
||||||
|
preheat_1_temp_hotend = 180
|
||||||
|
|
||||||
|
bang_max = 255
|
||||||
|
pidtemp = on
|
||||||
|
pid_k1 = 0.95
|
||||||
|
pid_max = 255
|
||||||
|
pid_functional_range = 10
|
||||||
|
|
||||||
|
default_kp = 22.20
|
||||||
|
default_ki = 1.08
|
||||||
|
default_kd = 114.00
|
||||||
|
|
||||||
|
x_driver_type = A4988
|
||||||
|
y_driver_type = A4988
|
||||||
|
z_driver_type = A4988
|
||||||
|
e0_driver_type = A4988
|
||||||
|
|
||||||
|
x_bed_size = 200
|
||||||
|
x_min_pos = 0
|
||||||
|
x_max_pos = X_BED_SIZE
|
||||||
|
|
||||||
|
y_bed_size = 200
|
||||||
|
y_min_pos = 0
|
||||||
|
y_max_pos = Y_BED_SIZE
|
||||||
|
|
||||||
|
z_min_pos = 0
|
||||||
|
z_max_pos = 200
|
||||||
|
|
||||||
|
x_home_dir = -1
|
||||||
|
y_home_dir = -1
|
||||||
|
z_home_dir = -1
|
||||||
|
|
||||||
|
x_min_endstop_hit_state = HIGH
|
||||||
|
y_min_endstop_hit_state = HIGH
|
||||||
|
z_min_endstop_hit_state = HIGH
|
||||||
|
|
||||||
|
default_axis_steps_per_unit = { 80, 80, 400, 500 }
|
||||||
|
axis_relative_modes = { false, false, false, false }
|
||||||
|
default_max_feedrate = { 300, 300, 5, 25 }
|
||||||
|
default_max_acceleration = { 3000, 3000, 100, 10000 }
|
||||||
|
|
||||||
|
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
||||||
|
homing_bump_divisor = { 2, 2, 4 }
|
||||||
|
|
||||||
|
x_enable_on = 0
|
||||||
|
y_enable_on = 0
|
||||||
|
z_enable_on = 0
|
||||||
|
e_enable_on = 0
|
||||||
|
|
||||||
|
invert_x_dir = false
|
||||||
|
invert_y_dir = true
|
||||||
|
invert_z_dir = false
|
||||||
|
invert_e0_dir = false
|
||||||
|
|
||||||
|
step_state_e = HIGH
|
||||||
|
step_state_x = HIGH
|
||||||
|
step_state_y = HIGH
|
||||||
|
step_state_z = HIGH
|
||||||
|
|
||||||
|
disable_x = off
|
||||||
|
disable_y = off
|
||||||
|
disable_z = off
|
||||||
|
disable_e = off
|
||||||
|
|
||||||
|
proportional_font_ratio = 1.0
|
||||||
|
default_nominal_filament_dia = 1.75
|
||||||
|
|
||||||
|
junction_deviation_mm = 0.013
|
||||||
|
|
||||||
|
default_acceleration = 3000
|
||||||
|
default_travel_acceleration = 3000
|
||||||
|
default_retract_acceleration = 3000
|
||||||
|
|
||||||
|
default_minimumfeedrate = 0.0
|
||||||
|
default_mintravelfeedrate = 0.0
|
||||||
|
|
||||||
|
minimum_planner_speed = 0.05
|
||||||
|
min_steps_per_segment = 6
|
||||||
|
default_minsegmenttime = 20000
|
||||||
|
|
||||||
|
[config:basic]
|
||||||
|
bed_overshoot = 10
|
||||||
|
busy_while_heating = on
|
||||||
|
default_ejerk = 5.0
|
||||||
|
default_keepalive_interval = 2
|
||||||
|
default_leveling_fade_height = 0.0
|
||||||
|
disable_other_extruders = on
|
||||||
|
display_charset_hd44780 = JAPANESE
|
||||||
|
eeprom_boot_silent = on
|
||||||
|
eeprom_chitchat = on
|
||||||
|
endstoppullups = on
|
||||||
|
extrude_maxlength = 200
|
||||||
|
extrude_mintemp = 170
|
||||||
|
host_keepalive_feature = on
|
||||||
|
hotend_overshoot = 15
|
||||||
|
jd_handle_small_segments = on
|
||||||
|
lcd_info_screen_style = 0
|
||||||
|
lcd_language = en
|
||||||
|
max_bed_power = 255
|
||||||
|
mesh_inset = 0
|
||||||
|
min_software_endstops = on
|
||||||
|
max_software_endstops = on
|
||||||
|
min_software_endstop_x = on
|
||||||
|
min_software_endstop_y = on
|
||||||
|
min_software_endstop_z = on
|
||||||
|
max_software_endstop_x = on
|
||||||
|
max_software_endstop_y = on
|
||||||
|
max_software_endstop_z = on
|
||||||
|
preheat_1_fan_speed = 0
|
||||||
|
preheat_1_label = "PLA"
|
||||||
|
preheat_1_temp_bed = 70
|
||||||
|
prevent_cold_extrusion = on
|
||||||
|
prevent_lengthy_extrude = on
|
||||||
|
printjob_timer_autostart = on
|
||||||
|
probing_margin = 10
|
||||||
|
show_bootscreen = on
|
||||||
|
soft_pwm_scale = 0
|
||||||
|
string_config_h_author = "(none, default config)"
|
||||||
|
temp_bed_hysteresis = 3
|
||||||
|
temp_bed_residency_time = 10
|
||||||
|
temp_bed_window = 1
|
||||||
|
temp_residency_time = 10
|
||||||
|
temp_window = 1
|
||||||
|
validate_homing_endstops = on
|
||||||
|
xy_probe_feedrate = (133*60)
|
||||||
|
z_clearance_between_probes = 5
|
||||||
|
z_clearance_deploy_probe = 10
|
||||||
|
z_clearance_multi_probe = 5
|
||||||
|
|
||||||
|
[config:advanced]
|
||||||
|
arc_support = on
|
||||||
|
auto_report_temperatures = on
|
||||||
|
autotemp = on
|
||||||
|
autotemp_oldweight = 0.98
|
||||||
|
bed_check_interval = 5000
|
||||||
|
default_stepper_timeout_sec = 120
|
||||||
|
default_volumetric_extruder_limit = 0.00
|
||||||
|
disable_idle_x = on
|
||||||
|
disable_idle_y = on
|
||||||
|
disable_idle_z = on
|
||||||
|
disable_idle_e = on
|
||||||
|
e0_auto_fan_pin = -1
|
||||||
|
encoder_100x_steps_per_sec = 80
|
||||||
|
encoder_10x_steps_per_sec = 30
|
||||||
|
encoder_rate_multiplier = on
|
||||||
|
extended_capabilities_report = on
|
||||||
|
extruder_auto_fan_speed = 255
|
||||||
|
extruder_auto_fan_temperature = 50
|
||||||
|
fanmux0_pin = -1
|
||||||
|
fanmux1_pin = -1
|
||||||
|
fanmux2_pin = -1
|
||||||
|
faster_gcode_parser = on
|
||||||
|
homing_bump_mm = { 5, 5, 2 }
|
||||||
|
max_arc_segment_mm = 1.0
|
||||||
|
min_arc_segment_mm = 0.1
|
||||||
|
min_circle_segments = 72
|
||||||
|
n_arc_correction = 25
|
||||||
|
serial_overrun_protection = on
|
||||||
|
slowdown = on
|
||||||
|
slowdown_divisor = 2
|
||||||
|
temp_sensor_bed = 0
|
||||||
|
thermal_protection_bed_hysteresis = 2
|
||||||
|
thermocouple_max_errors = 15
|
||||||
|
tx_buffer_size = 0
|
||||||
|
watch_bed_temp_increase = 2
|
||||||
|
watch_bed_temp_period = 60
|
||||||
|
watch_temp_increase = 2
|
||||||
|
watch_temp_period = 20
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "HAL.h"
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
DefaultSerial1 MSerial0(false, Serial);
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
@@ -60,23 +61,46 @@ void save_reset_reason() {
|
|||||||
wdt_disable();
|
wdt_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "registers.h"
|
||||||
|
|
||||||
|
MarlinHAL::MarlinHAL() {
|
||||||
|
TERN_(HAL_AVR_DIRTY_INIT, _ATmega_resetperipherals()); // Clean-wipe the device state.
|
||||||
|
}
|
||||||
|
|
||||||
void MarlinHAL::init() {
|
void MarlinHAL::init() {
|
||||||
// Init Servo Pins
|
// Init Servo Pins
|
||||||
#define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW)
|
|
||||||
#if HAS_SERVO_0
|
#if HAS_SERVO_0
|
||||||
INIT_SERVO(0);
|
OUT_WRITE(SERVO0_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_SERVO_1
|
#if HAS_SERVO_1
|
||||||
INIT_SERVO(1);
|
OUT_WRITE(SERVO1_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_SERVO_2
|
#if HAS_SERVO_2
|
||||||
INIT_SERVO(2);
|
OUT_WRITE(SERVO2_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_SERVO_3
|
#if HAS_SERVO_3
|
||||||
INIT_SERVO(3);
|
OUT_WRITE(SERVO3_PIN, LOW);
|
||||||
|
#endif
|
||||||
|
#if HAS_SERVO_4
|
||||||
|
OUT_WRITE(SERVO4_PIN, LOW);
|
||||||
|
#endif
|
||||||
|
#if HAS_SERVO_5
|
||||||
|
OUT_WRITE(SERVO5_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
init_pwm_timers(); // Init user timers to default frequency - 1000HZ
|
init_pwm_timers(); // Init user timers to default frequency - 1000HZ
|
||||||
|
|
||||||
|
#if PIN_EXISTS(BEEPER) && ENABLED(HAL_AVR_DIRTY_INIT) && DISABLED(ATMEGA_NO_BEEPFIX)
|
||||||
|
// Make sure no alternative is locked onto the BEEPER.
|
||||||
|
// This fixes the issue where the ATmega is constantly beeping.
|
||||||
|
// Might disable other peripherals using the pin; to circumvent that please undefine one of the above things!
|
||||||
|
// The true culprit is the AVR ArduinoCore that enables peripherals redundantly.
|
||||||
|
// (USART1 on the GeeeTech GT2560)
|
||||||
|
// https://www.youtube.com/watch?v=jMgCvRXkexk
|
||||||
|
_ATmega_savePinAlternate(BEEPER_PIN);
|
||||||
|
|
||||||
|
OUT_WRITE(BEEPER_PIN, LOW);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarlinHAL::reboot() {
|
void MarlinHAL::reboot() {
|
||||||
@@ -88,12 +112,68 @@ void MarlinHAL::reboot() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
// ------------------------
|
||||||
|
// Watchdog Timer
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
|
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
||||||
|
void MarlinHAL::watchdog_init() {
|
||||||
|
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
|
||||||
|
#define WDTO_NS WDTO_8S
|
||||||
|
#else
|
||||||
|
#define WDTO_NS WDTO_4S
|
||||||
|
#endif
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
// Enable the watchdog timer, but only for the interrupt.
|
||||||
|
// Take care, as this requires the correct order of operation, with interrupts disabled.
|
||||||
|
// See the datasheet of any AVR chip for details.
|
||||||
|
wdt_reset();
|
||||||
|
cli();
|
||||||
|
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
|
||||||
|
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
|
||||||
|
// So worked for up to WDTO_2S
|
||||||
|
sei();
|
||||||
|
wdt_reset();
|
||||||
|
#else
|
||||||
|
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
|
||||||
|
#endif
|
||||||
|
//delay(10000); // test it!
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//=================================== ISR ===================================
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
ISR(WDT_vect) {
|
||||||
|
sei(); // With the interrupt driven serial we need to allow interrupts.
|
||||||
|
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
||||||
|
minkill(); // interrupt-safe final kill and infinite loop
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset watchdog. MUST be called at least every 4 seconds after the
|
||||||
|
// first watchdog_init or AVR will go into emergency procedures.
|
||||||
|
void MarlinHAL::watchdog_refresh() { wdt_reset(); }
|
||||||
|
|
||||||
|
#endif // USE_WATCHDOG
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Free Memory Accessor
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if HAS_MEDIA
|
||||||
|
|
||||||
#include "../../sd/SdFatUtil.h"
|
#include "../../sd/SdFatUtil.h"
|
||||||
int freeMemory() { return SdFatUtil::FreeRam(); }
|
int freeMemory() { return SdFatUtil::FreeRam(); }
|
||||||
|
|
||||||
#else // !SDSUPPORT
|
#else // !HAS_MEDIA
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern char __bss_end;
|
extern char __bss_end;
|
||||||
@@ -110,6 +190,6 @@ void MarlinHAL::reboot() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !SDSUPPORT
|
#endif // !HAS_MEDIA
|
||||||
|
|
||||||
#endif // __AVR__
|
#endif // __AVR__
|
||||||
|
|||||||
+28
-19
@@ -1,7 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,17 +21,20 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HAL for Arduino AVR
|
||||||
|
*/
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../shared/Marduino.h"
|
||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
#ifdef USBCON
|
#ifdef USBCON
|
||||||
#include <HardwareSerial.h>
|
#include <HardwareSerial.h>
|
||||||
#else
|
#else
|
||||||
#define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
|
#define BOARD_NO_NATIVE_USB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -104,48 +109,48 @@ typedef Servo hal_servo_t;
|
|||||||
|
|
||||||
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
#define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0)
|
||||||
#else
|
#else
|
||||||
#if !WITHIN(SERIAL_PORT, -1, 3)
|
#if !WITHIN(SERIAL_PORT, 0, 3)
|
||||||
#error "SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL1 customizedSerial1
|
#define MYSERIAL1 customizedSerial1
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_2
|
#ifdef SERIAL_PORT_2
|
||||||
#if !WITHIN(SERIAL_PORT_2, -1, 3)
|
#if !WITHIN(SERIAL_PORT_2, 0, 3)
|
||||||
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT_2 must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL2 customizedSerial2
|
#define MYSERIAL2 customizedSerial2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SERIAL_PORT_3
|
#ifdef SERIAL_PORT_3
|
||||||
#if !WITHIN(SERIAL_PORT_3, -1, 3)
|
#if !WITHIN(SERIAL_PORT_3, 0, 3)
|
||||||
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
#error "SERIAL_PORT_3 must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define MYSERIAL3 customizedSerial3
|
#define MYSERIAL3 customizedSerial3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MMU2_SERIAL_PORT
|
#ifdef MMU2_SERIAL_PORT
|
||||||
#if !WITHIN(MMU2_SERIAL_PORT, -1, 3)
|
#if !WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||||
#error "MMU2_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "MMU2_SERIAL_PORT must be from 0 to 3"
|
||||||
#endif
|
#endif
|
||||||
#define MMU2_SERIAL mmuSerial
|
#define MMU2_SERIAL mmuSerial
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LCD_SERIAL_PORT
|
#ifdef LCD_SERIAL_PORT
|
||||||
#if !WITHIN(LCD_SERIAL_PORT, -1, 3)
|
#if !WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||||
#error "LCD_SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||||
#endif
|
#endif
|
||||||
#define LCD_SERIAL lcdSerial
|
#define LCD_SERIAL lcdSerial
|
||||||
#if HAS_DGUS_LCD
|
#if HAS_DGUS_LCD
|
||||||
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
|
#define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
//
|
//
|
||||||
#define HAL_ADC_VREF 5.0
|
#define HAL_ADC_VREF_MV 5000
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
|
|
||||||
//
|
//
|
||||||
// Pin Mapping for M42, M43, M226
|
// Pin Mapping for M42, M43, M226
|
||||||
@@ -164,7 +169,7 @@ typedef Servo hal_servo_t;
|
|||||||
#define strtof strtod
|
#define strtof strtod
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Class Utilities
|
// Free Memory Accessor
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
@@ -184,7 +189,11 @@ class MarlinHAL {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
// Earliest possible init, before setup()
|
// Earliest possible init, before setup()
|
||||||
MarlinHAL() {}
|
MarlinHAL();
|
||||||
|
|
||||||
|
// Watchdog
|
||||||
|
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
|
||||||
static void init(); // Called early in setup()
|
static void init(); // Called early in setup()
|
||||||
static void init_board() {} // Called less early in setup()
|
static void init_board() {} // Called less early in setup()
|
||||||
@@ -229,7 +238,7 @@ public:
|
|||||||
SBI(DIDR0, ch);
|
SBI(DIDR0, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Begin ADC sampling on the given channel
|
// Begin ADC sampling on the given channel. Called from Temperature::isr!
|
||||||
static void adc_start(const uint8_t ch) {
|
static void adc_start(const uint8_t ch) {
|
||||||
#ifdef MUX5
|
#ifdef MUX5
|
||||||
ADCSRB = ch > 7 ? _BV(MUX5) : 0;
|
ADCSRB = ch > 7 ? _BV(MUX5) : 0;
|
||||||
|
|||||||
@@ -119,7 +119,6 @@ void spiBegin() {
|
|||||||
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** begin spi transaction */
|
/** begin spi transaction */
|
||||||
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
|
||||||
// Based on Arduino SPI library
|
// Based on Arduino SPI library
|
||||||
@@ -175,7 +174,6 @@ void spiBegin() {
|
|||||||
SPSR = clockDiv | 0x01;
|
SPSR = clockDiv | 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#else // SOFTWARE_SPI || FORCE_SOFT_SPI
|
#else // SOFTWARE_SPI || FORCE_SOFT_SPI
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -198,7 +196,7 @@ void spiBegin() {
|
|||||||
// output pin high - like sending 0xFF
|
// output pin high - like sending 0xFF
|
||||||
WRITE(SD_MOSI_PIN, HIGH);
|
WRITE(SD_MOSI_PIN, HIGH);
|
||||||
|
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
|
|
||||||
nop; // adjust so SCK is nice
|
nop; // adjust so SCK is nice
|
||||||
@@ -225,7 +223,7 @@ void spiBegin() {
|
|||||||
void spiSend(uint8_t data) {
|
void spiSend(uint8_t data) {
|
||||||
// no interrupts during byte send - about 8µs
|
// no interrupts during byte send - about 8µs
|
||||||
cli();
|
cli();
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
WRITE(SD_MOSI_PIN, data & 0x80);
|
WRITE(SD_MOSI_PIN, data & 0x80);
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
|
|||||||
@@ -34,12 +34,9 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/types.h"
|
||||||
#include "../../core/serial_hook.h"
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
#ifndef SERIAL_PORT
|
|
||||||
#define SERIAL_PORT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef USBCON
|
#ifndef USBCON
|
||||||
|
|
||||||
// The presence of the UBRRH register is used to detect a UART.
|
// The presence of the UBRRH register is used to detect a UART.
|
||||||
@@ -138,10 +135,6 @@
|
|||||||
|
|
||||||
#define BYTE 0
|
#define BYTE 0
|
||||||
|
|
||||||
// Templated type selector
|
|
||||||
template<bool b, typename T, typename F> struct TypeSelector { typedef T type;} ;
|
|
||||||
template<typename T, typename F> struct TypeSelector<false, T, F> { typedef F type; };
|
|
||||||
|
|
||||||
template<typename Cfg>
|
template<typename Cfg>
|
||||||
class MarlinSerial {
|
class MarlinSerial {
|
||||||
protected:
|
protected:
|
||||||
@@ -164,7 +157,7 @@
|
|||||||
static constexpr B_U2Xx<Cfg::PORT> B_U2X = 0;
|
static constexpr B_U2Xx<Cfg::PORT> B_U2X = 0;
|
||||||
|
|
||||||
// Base size of type on buffer size
|
// Base size of type on buffer size
|
||||||
typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
|
typedef uvalue_t(Cfg::RX_SIZE - 1) ring_buffer_pos_t;
|
||||||
|
|
||||||
struct ring_buffer_r {
|
struct ring_buffer_r {
|
||||||
volatile ring_buffer_pos_t head, tail;
|
volatile ring_buffer_pos_t head, tail;
|
||||||
@@ -283,7 +276,7 @@
|
|||||||
static constexpr bool DROPPED_RX = false;
|
static constexpr bool DROPPED_RX = false;
|
||||||
static constexpr bool RX_FRAMING_ERRORS = false;
|
static constexpr bool RX_FRAMING_ERRORS = false;
|
||||||
static constexpr bool MAX_RX_QUEUED = false;
|
static constexpr bool MAX_RX_QUEUED = false;
|
||||||
static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
static constexpr bool RX_OVERRUNS = ALL(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
typedef Serial1Class< MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> > > MSerialLCD;
|
||||||
|
|||||||
+102
-93
@@ -63,30 +63,28 @@
|
|||||||
|
|
||||||
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
|
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
|
||||||
|
|
||||||
|
|
||||||
/************ static functions common to all instances ***********************/
|
/************ static functions common to all instances ***********************/
|
||||||
|
|
||||||
static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
|
static inline void handle_interrupts(const timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) {
|
||||||
if (Channel[timer] < 0)
|
int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
|
||||||
*TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer
|
if (cho < 0) // Channel -1 indicates the refresh interval completed...
|
||||||
else {
|
*TCNTn = 0; // ...so reset the timer
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive)
|
else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
|
||||||
}
|
|
||||||
|
|
||||||
Channel[timer]++; // increment to the next channel
|
Channel[timer] = ++cho; // Handle the next channel (or 0)
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) {
|
if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
|
||||||
*OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks;
|
*OCRnA = *TCNTn + SERVO(timer, cho).ticks; // set compare to current ticks plus duration
|
||||||
if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated
|
if (SERVO(timer, cho).Pin.isActive) // activated?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// finished all channels so wait for the refresh period to expire before starting over
|
// finished all channels so wait for the refresh period to expire before starting over
|
||||||
if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed
|
const unsigned int cval = ((unsigned)*TCNTn) + 32 / (SERVO_TIMER_PRESCALER), // allow 32 cycles to ensure the next OCR1A not missed
|
||||||
*OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL);
|
ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
|
||||||
else
|
*OCRnA = max(cval, ival);
|
||||||
*OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed
|
|
||||||
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel
|
Channel[timer] = -1; // reset the timer counter to 0 on the next call
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,91 +121,102 @@ static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t
|
|||||||
|
|
||||||
/****************** end of static functions ******************************/
|
/****************** end of static functions ******************************/
|
||||||
|
|
||||||
void initISR(timer16_Sequence_t timer) {
|
void initISR(const timer16_Sequence_t timer_index) {
|
||||||
#ifdef _useTimer1
|
switch (timer_index) {
|
||||||
if (timer == _timer1) {
|
default: break;
|
||||||
TCCR1A = 0; // normal counting mode
|
|
||||||
TCCR1B = _BV(CS11); // set prescaler of 8
|
|
||||||
TCNT1 = 0; // clear the timer count
|
|
||||||
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
|
|
||||||
SBI(TIFR, OCF1A); // clear any pending interrupts;
|
|
||||||
SBI(TIMSK, OCIE1A); // enable the output compare interrupt
|
|
||||||
#else
|
|
||||||
// here if not ATmega8 or ATmega128
|
|
||||||
SBI(TIFR1, OCF1A); // clear any pending interrupts;
|
|
||||||
SBI(TIMSK1, OCIE1A); // enable the output compare interrupt
|
|
||||||
#endif
|
|
||||||
#ifdef WIRING
|
|
||||||
timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _useTimer3
|
#ifdef _useTimer1
|
||||||
if (timer == _timer3) {
|
case _timer1:
|
||||||
TCCR3A = 0; // normal counting mode
|
TCCR1A = 0; // normal counting mode
|
||||||
TCCR3B = _BV(CS31); // set prescaler of 8
|
TCCR1B = _BV(CS11); // set prescaler of 8
|
||||||
TCNT3 = 0; // clear the timer count
|
TCNT1 = 0; // clear the timer count
|
||||||
#ifdef __AVR_ATmega128__
|
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__)
|
||||||
SBI(TIFR, OCF3A); // clear any pending interrupts;
|
SBI(TIFR, OCF1A); // clear any pending interrupts;
|
||||||
SBI(ETIMSK, OCIE3A); // enable the output compare interrupt
|
SBI(TIMSK, OCIE1A); // enable the output compare interrupt
|
||||||
#else
|
#else
|
||||||
SBI(TIFR3, OCF3A); // clear any pending interrupts;
|
// here if not ATmega8 or ATmega128
|
||||||
SBI(TIMSK3, OCIE3A); // enable the output compare interrupt
|
SBI(TIFR1, OCF1A); // clear any pending interrupts;
|
||||||
#endif
|
SBI(TIMSK1, OCIE1A); // enable the output compare interrupt
|
||||||
#ifdef WIRING
|
#endif
|
||||||
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
|
#ifdef WIRING
|
||||||
#endif
|
timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service);
|
||||||
}
|
#endif
|
||||||
#endif
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _useTimer4
|
#ifdef _useTimer3
|
||||||
if (timer == _timer4) {
|
case _timer3:
|
||||||
TCCR4A = 0; // normal counting mode
|
TCCR3A = 0; // normal counting mode
|
||||||
TCCR4B = _BV(CS41); // set prescaler of 8
|
TCCR3B = _BV(CS31); // set prescaler of 8
|
||||||
TCNT4 = 0; // clear the timer count
|
TCNT3 = 0; // clear the timer count
|
||||||
TIFR4 = _BV(OCF4A); // clear any pending interrupts;
|
#ifdef __AVR_ATmega128__
|
||||||
TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
|
SBI(TIFR, OCF3A); // clear any pending interrupts;
|
||||||
}
|
SBI(ETIMSK, OCIE3A); // enable the output compare interrupt
|
||||||
#endif
|
#else
|
||||||
|
SBI(TIFR3, OCF3A); // clear any pending interrupts;
|
||||||
|
SBI(TIMSK3, OCIE3A); // enable the output compare interrupt
|
||||||
|
#endif
|
||||||
|
#ifdef WIRING
|
||||||
|
timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _useTimer5
|
#ifdef _useTimer4
|
||||||
if (timer == _timer5) {
|
case _timer4:
|
||||||
TCCR5A = 0; // normal counting mode
|
TCCR4A = 0; // normal counting mode
|
||||||
TCCR5B = _BV(CS51); // set prescaler of 8
|
TCCR4B = _BV(CS41); // set prescaler of 8
|
||||||
TCNT5 = 0; // clear the timer count
|
TCNT4 = 0; // clear the timer count
|
||||||
TIFR5 = _BV(OCF5A); // clear any pending interrupts;
|
TIFR4 = _BV(OCF4A); // clear any pending interrupts;
|
||||||
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
|
TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt
|
||||||
}
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _useTimer5
|
||||||
|
case _timer5:
|
||||||
|
TCCR5A = 0; // normal counting mode
|
||||||
|
TCCR5B = _BV(CS51); // set prescaler of 8
|
||||||
|
TCNT5 = 0; // clear the timer count
|
||||||
|
TIFR5 = _BV(OCF5A); // clear any pending interrupts;
|
||||||
|
TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void finISR(timer16_Sequence_t timer) {
|
void finISR(const timer16_Sequence_t timer_index) {
|
||||||
// Disable use of the given timer
|
// Disable use of the given timer
|
||||||
#ifdef WIRING
|
#ifdef WIRING
|
||||||
if (timer == _timer1) {
|
switch (timer_index) {
|
||||||
CBI(
|
default: break;
|
||||||
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
|
||||||
TIMSK1
|
case _timer1:
|
||||||
#else
|
CBI(
|
||||||
TIMSK
|
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
#endif
|
TIMSK1
|
||||||
, OCIE1A); // disable timer 1 output compare interrupt
|
#else
|
||||||
timerDetach(TIMER1OUTCOMPAREA_INT);
|
TIMSK
|
||||||
}
|
#endif
|
||||||
else if (timer == _timer3) {
|
, OCIE1A // disable timer 1 output compare interrupt
|
||||||
CBI(
|
);
|
||||||
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
timerDetach(TIMER1OUTCOMPAREA_INT);
|
||||||
TIMSK3
|
break;
|
||||||
#else
|
|
||||||
ETIMSK
|
case _timer3:
|
||||||
#endif
|
CBI(
|
||||||
, OCIE3A); // disable the timer3 output compare A interrupt
|
#if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
timerDetach(TIMER3OUTCOMPAREA_INT);
|
TIMSK3
|
||||||
|
#else
|
||||||
|
ETIMSK
|
||||||
|
#endif
|
||||||
|
, OCIE3A // disable the timer3 output compare A interrupt
|
||||||
|
);
|
||||||
|
timerDetach(TIMER3OUTCOMPAREA_INT);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
#else // !WIRING
|
#else // !WIRING
|
||||||
// For arduino - in future: call here to a currently undefined function to reset the timer
|
// For arduino - in future: call here to a currently undefined function to reset the timer
|
||||||
UNUSED(timer);
|
UNUSED(timer_index);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
|
#if ANY(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PersistentStore for Arduino-style EEPROM interface
|
* PersistentStore for Arduino-style EEPROM interface
|
||||||
@@ -35,14 +35,14 @@
|
|||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
||||||
#endif
|
#endif
|
||||||
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; }
|
||||||
bool PersistentStore::access_start() { return true; }
|
bool PersistentStore::access_start() { return true; }
|
||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
@@ -61,7 +61,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
crc16(crc, &c, 1);
|
crc16(crc, &c, 1);
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ void endstop_ISR() { endstops.update(); }
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Install Pin change interrupt for a pin. Can be called multiple times.
|
// Install Pin change interrupt for a pin. Can be called multiple times.
|
||||||
void pciSetup(const int8_t pin) {
|
void pciSetup(const int8_t pin) {
|
||||||
if (digitalPinHasPCICR(pin)) {
|
if (digitalPinHasPCICR(pin)) {
|
||||||
@@ -120,7 +119,7 @@ void pciSetup(const int8_t pin) {
|
|||||||
|
|
||||||
void setup_endstop_interrupts() {
|
void setup_endstop_interrupts() {
|
||||||
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
||||||
#if HAS_X_MAX
|
#if USE_X_MAX
|
||||||
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MAX_PIN);
|
_ATTACH(X_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -128,7 +127,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(X_MAX_PIN);
|
pciSetup(X_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_X_MIN
|
#if USE_X_MIN
|
||||||
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X_MIN_PIN);
|
_ATTACH(X_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -136,7 +135,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(X_MIN_PIN);
|
pciSetup(X_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y_MAX
|
#if USE_Y_MAX
|
||||||
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MAX_PIN);
|
_ATTACH(Y_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -144,7 +143,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Y_MAX_PIN);
|
pciSetup(Y_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y_MIN
|
#if USE_Y_MIN
|
||||||
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y_MIN_PIN);
|
_ATTACH(Y_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -152,7 +151,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Y_MIN_PIN);
|
pciSetup(Y_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MAX
|
#if USE_Z_MAX
|
||||||
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MAX_PIN);
|
_ATTACH(Z_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -160,7 +159,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z_MAX_PIN);
|
pciSetup(Z_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MIN
|
#if USE_Z_MIN
|
||||||
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PIN);
|
_ATTACH(Z_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -168,97 +167,97 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z_MIN_PIN);
|
pciSetup(Z_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_I_MAX
|
#if USE_I_MAX
|
||||||
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(I_MAX_PIN);
|
_ATTACH(I_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(I_MAX_PIN);
|
pciSetup(I_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_I_MIN
|
#elif USE_I_MIN
|
||||||
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(I_MIN_PIN);
|
_ATTACH(I_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(I_MIN_PIN);
|
pciSetup(I_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_J_MAX
|
#if USE_J_MAX
|
||||||
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(J_MAX_PIN);
|
_ATTACH(J_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(J_MAX_PIN);
|
pciSetup(J_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_J_MIN
|
#elif USE_J_MIN
|
||||||
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(J_MIN_PIN);
|
_ATTACH(J_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(J_MIN_PIN);
|
pciSetup(J_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_K_MAX
|
#if USE_K_MAX
|
||||||
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(K_MAX_PIN);
|
_ATTACH(K_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(K_MAX_PIN);
|
pciSetup(K_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_K_MIN
|
#elif USE_K_MIN
|
||||||
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(K_MIN_PIN);
|
_ATTACH(K_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(K_MIN_PIN);
|
pciSetup(K_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_U_MAX
|
#if USE_U_MAX
|
||||||
#if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(U_MAX_PIN);
|
_ATTACH(U_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(U_MAX_PIN);
|
pciSetup(U_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_U_MIN
|
#elif USE_U_MIN
|
||||||
#if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(U_MIN_PIN);
|
_ATTACH(U_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(U_MIN_PIN);
|
pciSetup(U_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_V_MAX
|
#if USE_V_MAX
|
||||||
#if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(V_MAX_PIN);
|
_ATTACH(V_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(V_MAX_PIN);
|
pciSetup(V_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_V_MIN
|
#elif USE_V_MIN
|
||||||
#if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(V_MIN_PIN);
|
_ATTACH(V_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(V_MIN_PIN);
|
pciSetup(V_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_W_MAX
|
#if USE_W_MAX
|
||||||
#if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(W_MAX_PIN);
|
_ATTACH(W_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(W_MAX_PIN);
|
pciSetup(W_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#elif HAS_W_MIN
|
#elif USE_W_MIN
|
||||||
#if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(W_MIN_PIN);
|
_ATTACH(W_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable");
|
static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||||
pciSetup(W_MIN_PIN);
|
pciSetup(W_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_X2_MAX
|
#if USE_X2_MAX
|
||||||
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MAX_PIN);
|
_ATTACH(X2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -266,7 +265,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(X2_MAX_PIN);
|
pciSetup(X2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_X2_MIN
|
#if USE_X2_MIN
|
||||||
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(X2_MIN_PIN);
|
_ATTACH(X2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -274,7 +273,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(X2_MIN_PIN);
|
pciSetup(X2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y2_MAX
|
#if USE_Y2_MAX
|
||||||
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MAX_PIN);
|
_ATTACH(Y2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -282,7 +281,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Y2_MAX_PIN);
|
pciSetup(Y2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Y2_MIN
|
#if USE_Y2_MIN
|
||||||
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Y2_MIN_PIN);
|
_ATTACH(Y2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -290,7 +289,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Y2_MIN_PIN);
|
pciSetup(Y2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z2_MAX
|
#if USE_Z2_MAX
|
||||||
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MAX_PIN);
|
_ATTACH(Z2_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -298,7 +297,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z2_MAX_PIN);
|
pciSetup(Z2_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z2_MIN
|
#if USE_Z2_MIN
|
||||||
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z2_MIN_PIN);
|
_ATTACH(Z2_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -306,7 +305,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z2_MIN_PIN);
|
pciSetup(Z2_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z3_MAX
|
#if USE_Z3_MAX
|
||||||
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MAX_PIN);
|
_ATTACH(Z3_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -314,7 +313,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z3_MAX_PIN);
|
pciSetup(Z3_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z3_MIN
|
#if USE_Z3_MIN
|
||||||
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z3_MIN_PIN);
|
_ATTACH(Z3_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -322,7 +321,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z3_MIN_PIN);
|
pciSetup(Z3_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z4_MAX
|
#if USE_Z4_MAX
|
||||||
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MAX_PIN);
|
_ATTACH(Z4_MAX_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -330,7 +329,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z4_MAX_PIN);
|
pciSetup(Z4_MAX_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z4_MIN
|
#if USE_Z4_MIN
|
||||||
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z4_MIN_PIN);
|
_ATTACH(Z4_MIN_PIN);
|
||||||
#else
|
#else
|
||||||
@@ -338,7 +337,7 @@ void setup_endstop_interrupts() {
|
|||||||
pciSetup(Z4_MIN_PIN);
|
pciSetup(Z4_MIN_PIN);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if HAS_Z_MIN_PROBE_PIN
|
#if USE_Z_MIN_PROBE
|
||||||
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
#if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT)
|
||||||
_ATTACH(Z_MIN_PROBE_PIN);
|
_ATTACH(Z_MIN_PROBE_PIN);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -23,6 +23,10 @@
|
|||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
|
//#define DEBUG_AVR_FAST_PWM
|
||||||
|
#define DEBUG_OUT ENABLED(DEBUG_AVR_FAST_PWM)
|
||||||
|
#include "../../core/debug_out.h"
|
||||||
|
|
||||||
struct Timer {
|
struct Timer {
|
||||||
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
|
volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer
|
||||||
volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer
|
volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer
|
||||||
@@ -108,12 +112,15 @@ const Timer get_pwm_timer(const pin_t pin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
||||||
|
DEBUG_ECHOLNPGM("set_pwm_frequency(pin=", pin, ", freq=", f_desired, ")");
|
||||||
const Timer timer = get_pwm_timer(pin);
|
const Timer timer = get_pwm_timer(pin);
|
||||||
if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
|
if (timer.isProtected || !timer.isPWM) return; // Don't proceed if protected timer or not recognized
|
||||||
|
|
||||||
const bool is_timer2 = timer.n == 2;
|
const bool is_timer2 = timer.n == 2;
|
||||||
const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
|
const uint16_t maxtop = is_timer2 ? 0xFF : 0xFFFF;
|
||||||
|
|
||||||
|
DEBUG_ECHOLNPGM("maxtop=", maxtop);
|
||||||
|
|
||||||
uint16_t res = 0xFF; // resolution (TOP value)
|
uint16_t res = 0xFF; // resolution (TOP value)
|
||||||
uint8_t j = CS_NONE; // prescaler index
|
uint8_t j = CS_NONE; // prescaler index
|
||||||
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
|
uint8_t wgm = WGM_PWM_PC_8; // waveform generation mode
|
||||||
@@ -121,23 +128,29 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
|||||||
// Calculating the prescaler and resolution to use to achieve closest frequency
|
// Calculating the prescaler and resolution to use to achieve closest frequency
|
||||||
if (f_desired != 0) {
|
if (f_desired != 0) {
|
||||||
constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
|
constexpr uint16_t prescaler[] = { 1, 8, (32), 64, (128), 256, 1024 }; // (*) are Timer 2 only
|
||||||
uint16_t f = (F_CPU) / (2 * 1024 * maxtop) + 1; // Start with the lowest non-zero frequency achievable (1 or 31)
|
uint16_t f = (F_CPU) / (uint32_t(maxtop) << 11) + 1; // Start with the lowest non-zero frequency achievable (for 16MHz, 1 or 31)
|
||||||
|
|
||||||
LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values
|
DEBUG_ECHOLNPGM("f=", f);
|
||||||
const uint16_t p = prescaler[i];
|
DEBUG_ECHOLNPGM("(prescaler loop)");
|
||||||
|
for (uint8_t i = 0; i < COUNT(prescaler); ++i) { // Loop through all prescaler values
|
||||||
|
const uint32_t p = prescaler[i]; // Extend to 32 bits for calculations
|
||||||
|
DEBUG_ECHOLNPGM("prescaler[", i, "]=", p);
|
||||||
uint16_t res_fast_temp, res_pc_temp;
|
uint16_t res_fast_temp, res_pc_temp;
|
||||||
if (is_timer2) {
|
if (is_timer2) {
|
||||||
#if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
|
#if ENABLED(USE_OCR2A_AS_TOP) // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP
|
||||||
const uint16_t rft = (F_CPU) / (p * f_desired);
|
const uint16_t rft = (F_CPU) / (p * f_desired);
|
||||||
res_fast_temp = rft - 1;
|
res_fast_temp = rft - 1;
|
||||||
res_pc_temp = rft / 2;
|
res_pc_temp = rft / 2;
|
||||||
|
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", res_fast_temp, " res_pc_temp=", res_pc_temp);
|
||||||
#else
|
#else
|
||||||
res_fast_temp = res_pc_temp = maxtop;
|
res_fast_temp = res_pc_temp = maxtop;
|
||||||
|
DEBUG_ECHOLNPGM("(Timer2) res_fast_temp=", maxtop, " res_pc_temp=", maxtop);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
|
if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
|
||||||
const uint16_t rft = (F_CPU) / (p * f_desired);
|
const uint16_t rft = (F_CPU) / (p * f_desired);
|
||||||
|
DEBUG_ECHOLNPGM("(Not Timer 2) F_CPU=" STRINGIFY(F_CPU), " prescaler=", p, " f_desired=", f_desired);
|
||||||
res_fast_temp = rft - 1;
|
res_fast_temp = rft - 1;
|
||||||
res_pc_temp = rft / 2;
|
res_pc_temp = rft / 2;
|
||||||
}
|
}
|
||||||
@@ -146,24 +159,28 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
|||||||
LIMIT(res_pc_temp, 1U, maxtop);
|
LIMIT(res_pc_temp, 1U, maxtop);
|
||||||
|
|
||||||
// Calculate frequencies of test prescaler and resolution values
|
// Calculate frequencies of test prescaler and resolution values
|
||||||
const uint32_t f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
|
const uint16_t f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
|
||||||
f_fast_temp = (F_CPU) / (p * (1 + res_fast_temp)),
|
f_pc_temp = (F_CPU) / ((p * res_pc_temp) << 1),
|
||||||
|
f_diff = _MAX(f, f_desired) - _MIN(f, f_desired),
|
||||||
f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
|
f_fast_diff = _MAX(f_fast_temp, f_desired) - _MIN(f_fast_temp, f_desired),
|
||||||
f_pc_temp = (F_CPU) / (2 * p * res_pc_temp),
|
|
||||||
f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
|
f_pc_diff = _MAX(f_pc_temp, f_desired) - _MIN(f_pc_temp, f_desired);
|
||||||
|
|
||||||
|
DEBUG_ECHOLNPGM("f_fast_temp=", f_fast_temp, " f_pc_temp=", f_pc_temp, " f_diff=", f_diff, " f_fast_diff=", f_fast_diff, " f_pc_diff=", f_pc_diff);
|
||||||
|
|
||||||
if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
|
if (f_fast_diff < f_diff && f_fast_diff <= f_pc_diff) { // FAST values are closest to desired f
|
||||||
// Set the Wave Generation Mode to FAST PWM
|
// Set the Wave Generation Mode to FAST PWM
|
||||||
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
|
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_FAST_PWM_OCR2A, WGM2_FAST_PWM)) : uint8_t(WGM_FAST_PWM_ICRn);
|
||||||
// Remember this combination
|
// Remember this combination
|
||||||
f = f_fast_temp; res = res_fast_temp; j = i + 1;
|
f = f_fast_temp; res = res_fast_temp; j = i + 1;
|
||||||
|
DEBUG_ECHOLNPGM("(FAST) updated f=", f);
|
||||||
}
|
}
|
||||||
else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
|
else if (f_pc_diff < f_diff) { // PHASE CORRECT values are closes to desired f
|
||||||
// Set the Wave Generation Mode to PWM PHASE CORRECT
|
// Set the Wave Generation Mode to PWM PHASE CORRECT
|
||||||
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
|
wgm = is_timer2 ? uint8_t(TERN(USE_OCR2A_AS_TOP, WGM2_PWM_PC_OCR2A, WGM2_PWM_PC)) : uint8_t(WGM_PWM_PC_ICRn);
|
||||||
f = f_pc_temp; res = res_pc_temp; j = i + 1;
|
f = f_pc_temp; res = res_pc_temp; j = i + 1;
|
||||||
|
DEBUG_ECHOLNPGM("(PHASE) updated f=", f);
|
||||||
}
|
}
|
||||||
}
|
} // prescaler loop
|
||||||
}
|
}
|
||||||
|
|
||||||
_SET_WGMnQ(timer, wgm);
|
_SET_WGMnQ(timer, wgm);
|
||||||
@@ -215,7 +232,7 @@ void MarlinHAL::init_pwm_timers() {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
LOOP_L_N(i, COUNT(pwm_pin))
|
for (uint8_t i = 0; i < COUNT(pwm_pin); ++i)
|
||||||
set_pwm_frequency(pwm_pin[i], 1000);
|
set_pwm_frequency(pwm_pin[i], 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -255,84 +255,6 @@ enum ClockSource2 : uint8_t {
|
|||||||
#define SET_FOCB(T,V) SET_FOC(T,B,V)
|
#define SET_FOCB(T,V) SET_FOC(T,B,V)
|
||||||
#define SET_FOCC(T,V) SET_FOC(T,C,V)
|
#define SET_FOCC(T,V) SET_FOC(T,C,V)
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PWM availability macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Determine which hardware PWMs are already in use
|
|
||||||
#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN)
|
|
||||||
#if PIN_EXISTS(CONTROLLER_FAN)
|
|
||||||
#define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN)
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_FAN_B(P) _PWM_CHK_FAN_B(P)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANY_PIN(FAN, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7)
|
|
||||||
#if PIN_EXISTS(FAN7)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN || P == FAN7_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN6)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN5)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN4)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN3)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN2)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN)
|
|
||||||
#elif PIN_EXISTS(FAN1)
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN)
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_FAN_A(P) (P == FAN0_PIN)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_FAN_A(P) false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_MOTOR_CURRENT_PWM
|
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
|
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY)
|
|
||||||
#elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z)
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_MOTOR_CURRENT(P) false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NUM_SERVOS
|
|
||||||
#if AVR_ATmega2560_FAMILY
|
|
||||||
#define PWM_CHK_SERVO(P) (P == 5 || (NUM_SERVOS > 12 && P == 6) || (NUM_SERVOS > 24 && P == 46)) // PWMS 3A, 4A & 5A
|
|
||||||
#elif AVR_ATmega2561_FAMILY
|
|
||||||
#define PWM_CHK_SERVO(P) (P == 5) // PWM3A
|
|
||||||
#elif AVR_ATmega1284_FAMILY
|
|
||||||
#define PWM_CHK_SERVO(P) false
|
|
||||||
#elif AVR_AT90USB1286_FAMILY
|
|
||||||
#define PWM_CHK_SERVO(P) (P == 16) // PWM3A
|
|
||||||
#elif AVR_ATmega328_FAMILY
|
|
||||||
#define PWM_CHK_SERVO(P) false
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_SERVO(P) false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(BARICUDA)
|
|
||||||
#if HAS_HEATER_1 && HAS_HEATER_2
|
|
||||||
#define PWM_CHK_HEATER(P) (P == HEATER_1_PIN || P == HEATER_2_PIN)
|
|
||||||
#elif HAS_HEATER_1
|
|
||||||
#define PWM_CHK_HEATER(P) (P == HEATER_1_PIN)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define PWM_CHK_HEATER(P) false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PWM_CHK(P) (PWM_CHK_HEATER(P) || PWM_CHK_SERVO(P) || PWM_CHK_MOTOR_CURRENT(P) || PWM_CHK_FAN_A(P) || PWM_CHK_FAN_B(P))
|
|
||||||
|
|
||||||
#endif // PWM_CHK is not used in Marlin
|
|
||||||
|
|
||||||
// define which hardware PWMs are available for the current CPU
|
// define which hardware PWMs are available for the current CPU
|
||||||
// all timer 1 PWMS deleted from this list because they are never available
|
// all timer 1 PWMS deleted from this list because they are never available
|
||||||
#if AVR_ATmega2560_FAMILY
|
#if AVR_ATmega2560_FAMILY
|
||||||
|
|||||||
@@ -27,43 +27,44 @@
|
|||||||
* Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
|
* Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100
|
||||||
* Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
|
* Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx
|
||||||
* Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx
|
* Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx
|
||||||
|
* Analog Input : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||||
|
*
|
||||||
|
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||||
|
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
// change for your board
|
|
||||||
#define DEBUG_LED DIO21
|
|
||||||
|
|
||||||
// UART
|
// UART
|
||||||
#define RXD DIO0
|
#define RXD 0
|
||||||
#define TXD DIO1
|
#define TXD 1
|
||||||
|
|
||||||
// SPI
|
// SPI
|
||||||
#define SCK DIO52
|
#define MISO 50
|
||||||
#define MISO DIO50
|
#define MOSI 51
|
||||||
#define MOSI DIO51
|
#define SCK 52
|
||||||
#define SS DIO53
|
#define SS 53
|
||||||
|
|
||||||
// TWI (I2C)
|
// TWI (I2C)
|
||||||
#define SCL DIO21
|
#define SCL 21
|
||||||
#define SDA DIO20
|
#define SDA 20
|
||||||
|
|
||||||
// Timers and PWM
|
// Timers and PWM
|
||||||
#define OC0A DIO13
|
#define OC0A 13
|
||||||
#define OC0B DIO4
|
#define OC0B 4
|
||||||
#define OC1A DIO11
|
#define OC1A 11
|
||||||
#define OC1B DIO12
|
#define OC1B 12
|
||||||
#define OC2A DIO10
|
#define OC2A 10
|
||||||
#define OC2B DIO9
|
#define OC2B 9
|
||||||
#define OC3A DIO5
|
#define OC3A 5
|
||||||
#define OC3B DIO2
|
#define OC3B 2
|
||||||
#define OC3C DIO3
|
#define OC3C 3
|
||||||
#define OC4A DIO6
|
#define OC4A 6
|
||||||
#define OC4B DIO7
|
#define OC4B 7
|
||||||
#define OC4C DIO8
|
#define OC4C 8
|
||||||
#define OC5A DIO46
|
#define OC5A 46
|
||||||
#define OC5B DIO45
|
#define OC5B 45
|
||||||
#define OC5C DIO44
|
#define OC5C 44
|
||||||
|
|
||||||
// Digital I/O
|
// Digital I/O
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,36 @@
|
|||||||
*
|
*
|
||||||
* Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04
|
* Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04
|
||||||
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5
|
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5
|
||||||
|
*
|
||||||
|
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||||
|
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
// change for your board
|
|
||||||
#define DEBUG_LED DIO46
|
|
||||||
|
|
||||||
// UART
|
// UART
|
||||||
#define RXD DIO0
|
#define RXD 0
|
||||||
#define TXD DIO1
|
#define TXD 1
|
||||||
|
|
||||||
// SPI
|
// SPI
|
||||||
#define SCK DIO10
|
#define SCK 10
|
||||||
#define MISO DIO12
|
#define MISO 12
|
||||||
#define MOSI DIO11
|
#define MOSI 11
|
||||||
#define SS DIO16
|
#define SS 16
|
||||||
|
|
||||||
// TWI (I2C)
|
// TWI (I2C)
|
||||||
#define SCL DIO17
|
#define SCL 17
|
||||||
#define SDA DIO18
|
#define SDA 18
|
||||||
|
|
||||||
// Timers and PWM
|
// Timers and PWM
|
||||||
#define OC0A DIO9
|
#define OC0A 9
|
||||||
#define OC0B DIO4
|
#define OC0B 4
|
||||||
#define OC1A DIO7
|
#define OC1A 7
|
||||||
#define OC1B DIO8
|
#define OC1B 8
|
||||||
#define OC2A DIO6
|
#define OC2A 6
|
||||||
#define OC3A DIO5
|
#define OC3A 5
|
||||||
#define OC3B DIO2
|
#define OC3B 2
|
||||||
#define OC3C DIO3
|
#define OC3C 3
|
||||||
|
|
||||||
// Digital I/O
|
// Digital I/O
|
||||||
|
|
||||||
|
|||||||
@@ -26,33 +26,34 @@
|
|||||||
*
|
*
|
||||||
* Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07
|
* Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07
|
||||||
* Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7
|
* Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7
|
||||||
|
*
|
||||||
|
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||||
|
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
#define DEBUG_LED AIO5
|
|
||||||
|
|
||||||
// UART
|
// UART
|
||||||
#define RXD DIO0
|
#define RXD 0
|
||||||
#define TXD DIO1
|
#define TXD 1
|
||||||
|
|
||||||
// SPI
|
// SPI
|
||||||
#define SCK DIO13
|
#define SS 10
|
||||||
#define MISO DIO12
|
#define MOSI 11
|
||||||
#define MOSI DIO11
|
#define MISO 12
|
||||||
#define SS DIO10
|
#define SCK 13
|
||||||
|
|
||||||
// TWI (I2C)
|
// TWI (I2C)
|
||||||
#define SCL AIO5
|
#define SCL AIO5
|
||||||
#define SDA AIO4
|
#define SDA AIO4
|
||||||
|
|
||||||
// Timers and PWM
|
// Timers and PWM
|
||||||
#define OC0A DIO6
|
#define OC0A 6
|
||||||
#define OC0B DIO5
|
#define OC0B 5
|
||||||
#define OC1A DIO9
|
#define OC1A 9
|
||||||
#define OC1B DIO10
|
#define OC1B 10
|
||||||
#define OC2A DIO11
|
#define OC2A 11
|
||||||
#define OC2B DIO3
|
#define OC2B 3
|
||||||
|
|
||||||
// Digital I/O
|
// Digital I/O
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
*
|
*
|
||||||
* Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
* Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
||||||
* Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0
|
* Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0
|
||||||
|
*
|
||||||
|
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||||
|
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** ATMega644
|
/** ATMega644
|
||||||
@@ -56,34 +59,32 @@
|
|||||||
|
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
#define DEBUG_LED DIO0
|
|
||||||
|
|
||||||
// UART
|
// UART
|
||||||
#define RXD DIO8
|
#define RXD 8
|
||||||
#define TXD DIO9
|
#define TXD 9
|
||||||
#define RXD0 DIO8
|
#define RXD0 8
|
||||||
#define TXD0 DIO9
|
#define TXD0 9
|
||||||
|
|
||||||
#define RXD1 DIO10
|
#define RXD1 10
|
||||||
#define TXD1 DIO11
|
#define TXD1 11
|
||||||
|
|
||||||
// SPI
|
// SPI
|
||||||
#define SCK DIO7
|
#define SS 4
|
||||||
#define MISO DIO6
|
#define MOSI 5
|
||||||
#define MOSI DIO5
|
#define MISO 6
|
||||||
#define SS DIO4
|
#define SCK 7
|
||||||
|
|
||||||
// TWI (I2C)
|
// TWI (I2C)
|
||||||
#define SCL DIO16
|
#define SCL 16
|
||||||
#define SDA DIO17
|
#define SDA 17
|
||||||
|
|
||||||
// Timers and PWM
|
// Timers and PWM
|
||||||
#define OC0A DIO3
|
#define OC0A 3
|
||||||
#define OC0B DIO4
|
#define OC0B 4
|
||||||
#define OC1A DIO13
|
#define OC1A 13
|
||||||
#define OC1B DIO12
|
#define OC1B 12
|
||||||
#define OC2A DIO15
|
#define OC2A 15
|
||||||
#define OC2B DIO14
|
#define OC2B 14
|
||||||
|
|
||||||
// Digital I/O
|
// Digital I/O
|
||||||
|
|
||||||
|
|||||||
@@ -27,18 +27,18 @@
|
|||||||
* Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45
|
* Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45
|
||||||
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7
|
* Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7
|
||||||
* The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3
|
* The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3
|
||||||
|
*
|
||||||
|
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||||
|
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../fastio.h"
|
#include "../fastio.h"
|
||||||
|
|
||||||
// change for your board
|
|
||||||
#define DEBUG_LED DIO31 /* led D5 red */
|
|
||||||
|
|
||||||
// SPI
|
// SPI
|
||||||
#define SCK DIO21 // 9
|
#define SS 20 // 8
|
||||||
#define MISO DIO23 // 11
|
#define SCK 21 // 9
|
||||||
#define MOSI DIO22 // 10
|
#define MOSI 22 // 10
|
||||||
#define SS DIO20 // 8
|
#define MISO 23 // 11
|
||||||
|
|
||||||
// Digital I/O
|
// Digital I/O
|
||||||
|
|
||||||
@@ -679,7 +679,6 @@
|
|||||||
#define PF7_PWM 0
|
#define PF7_PWM 0
|
||||||
#define PF7_DDR DDRF
|
#define PF7_DDR DDRF
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Some of the pin mapping functions of the Teensduino extension to the Arduino IDE
|
* Some of the pin mapping functions of the Teensduino extension to the Arduino IDE
|
||||||
* do not function the same as the other Arduino extensions.
|
* do not function the same as the other Arduino extensions.
|
||||||
|
|||||||
@@ -21,6 +21,6 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
#ifndef SERIAL_PORT
|
||||||
#error "Sorry! TFT displays are not available for HAL/AVR."
|
#define SERIAL_PORT 0
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
@@ -25,6 +25,44 @@
|
|||||||
* Test AVR-specific configuration values for errors at compile-time.
|
* Test AVR-specific configuration values for errors at compile-time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
||||||
|
#error "Sorry! TFT displays are not available for HAL/AVR."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for common serial pin conflicts
|
||||||
|
*/
|
||||||
|
#define CHECK_SERIAL_PIN(N) ( \
|
||||||
|
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|
||||||
|
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|
||||||
|
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|
||||||
|
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|
||||||
|
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|
||||||
|
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|
||||||
|
|| BTN_EN1 == N || BTN_EN2 == N || LCD_PINS_EN == N \
|
||||||
|
)
|
||||||
|
#if SERIAL_IN_USE(0)
|
||||||
|
// D0-D1. No known conflicts.
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(1)
|
||||||
|
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
|
||||||
|
#if CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19)
|
||||||
|
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if CHECK_SERIAL_PIN(10) || CHECK_SERIAL_PIN(11)
|
||||||
|
#error "Serial Port 1 pin D10 and/or D11 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
|
||||||
|
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
|
||||||
|
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#undef CHECK_SERIAL_PIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks for FAST PWM
|
* Checks for FAST PWM
|
||||||
*/
|
*/
|
||||||
@@ -35,8 +73,8 @@
|
|||||||
/**
|
/**
|
||||||
* Checks for SOFT PWM
|
* Checks for SOFT PWM
|
||||||
*/
|
*/
|
||||||
#if HAS_FAN0 && FAN_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
|
#if HAS_FAN0 && FAN0_PIN == 9 && DISABLED(FAN_SOFT_PWM) && ENABLED(SPEAKER)
|
||||||
#error "FAN_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
|
#error "FAN0_PIN 9 Hardware PWM uses Timer 2 which conflicts with Arduino AVR Tone Timer (for SPEAKER)."
|
||||||
#error "Disable SPEAKER or enable FAN_SOFT_PWM."
|
#error "Disable SPEAKER or enable FAN_SOFT_PWM."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -57,11 +95,11 @@
|
|||||||
/**
|
/**
|
||||||
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
||||||
*/
|
*/
|
||||||
#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
||||||
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
#if ALL(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS)
|
||||||
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
#error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+26
-30
@@ -27,13 +27,14 @@
|
|||||||
|
|
||||||
// intRes = longIn1 * longIn2 >> 24
|
// intRes = longIn1 * longIn2 >> 24
|
||||||
// uses:
|
// uses:
|
||||||
// A[tmp] to store 0
|
// r1, r0 for the result of mul.
|
||||||
// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result.
|
// [tmp1] to store 0.
|
||||||
// note that the lower two bytes and the upper byte of the 48bit result are not calculated.
|
// [tmp2] to store bits 16-23 of the 56 bit result. The top bit of [tmp2] is used for rounding.
|
||||||
// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones.
|
// Note that the lower two bytes and the upper two bytes of the 56 bit result are not calculated.
|
||||||
// B A are bits 24-39 and are the returned value
|
// This can cause the result to be out by one as the lower bytes may cause carries into the upper ones.
|
||||||
// C B A is longIn1
|
// [intRes] (A B) is bits 24-39 and is the returned value.
|
||||||
// D C B A is longIn2
|
// [longIn1] (C B A) is a 24 bit parameter.
|
||||||
|
// [longIn2] (D C B A) is a 32 bit parameter.
|
||||||
//
|
//
|
||||||
FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
|
FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) {
|
||||||
uint8_t tmp1;
|
uint8_t tmp1;
|
||||||
@@ -66,11 +67,9 @@ FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2
|
|||||||
A("add %[tmp2], r1")
|
A("add %[tmp2], r1")
|
||||||
A("adc %A[intRes], %[tmp1]")
|
A("adc %A[intRes], %[tmp1]")
|
||||||
A("adc %B[intRes], %[tmp1]")
|
A("adc %B[intRes], %[tmp1]")
|
||||||
A("lsr %[tmp2]")
|
|
||||||
A("adc %A[intRes], %[tmp1]")
|
|
||||||
A("adc %B[intRes], %[tmp1]")
|
|
||||||
A("mul %D[longIn2], %A[longIn1]")
|
A("mul %D[longIn2], %A[longIn1]")
|
||||||
A("add %A[intRes], r0")
|
A("lsl %[tmp2]")
|
||||||
|
A("adc %A[intRes], r0")
|
||||||
A("adc %B[intRes], r1")
|
A("adc %B[intRes], r1")
|
||||||
A("mul %D[longIn2], %B[longIn1]")
|
A("mul %D[longIn2], %B[longIn1]")
|
||||||
A("add %B[intRes], r0")
|
A("add %B[intRes], r0")
|
||||||
@@ -85,29 +84,26 @@ FORCE_INLINE static uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2
|
|||||||
return intRes;
|
return intRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
// intRes = intIn1 * intIn2 >> 16
|
// charRes = charIn1 * charIn2 >> 8
|
||||||
// uses:
|
// uses:
|
||||||
// r26 to store 0
|
// r1, r0 for the result of mul. After the mul, r0 holds bits 0-7 of the 16 bit result,
|
||||||
// r27 to store the byte 1 of the 24 bit result
|
// and the top bit of r0 is used for rounding.
|
||||||
FORCE_INLINE static uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) {
|
// [charRes] is bits 8-15 and is the returned value.
|
||||||
uint8_t tmp;
|
// [charIn1] is an 8 bit parameter.
|
||||||
uint16_t intRes;
|
// [charIn2] is an 8 bit parameter.
|
||||||
|
//
|
||||||
|
FORCE_INLINE static uint8_t MultiU8X8toH8(uint8_t charIn1, uint8_t charIn2) {
|
||||||
|
uint8_t charRes;
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
A("clr %[tmp]")
|
A("mul %[charIn1], %[charIn2]")
|
||||||
A("mul %[charIn1], %B[intIn2]")
|
A("mov %[charRes], r1")
|
||||||
A("movw %A[intRes], r0")
|
|
||||||
A("mul %[charIn1], %A[intIn2]")
|
|
||||||
A("add %A[intRes], r1")
|
|
||||||
A("adc %B[intRes], %[tmp]")
|
|
||||||
A("lsr r0")
|
|
||||||
A("adc %A[intRes], %[tmp]")
|
|
||||||
A("adc %B[intRes], %[tmp]")
|
|
||||||
A("clr r1")
|
A("clr r1")
|
||||||
: [intRes] "=&r" (intRes),
|
A("lsl r0")
|
||||||
[tmp] "=&r" (tmp)
|
A("adc %[charRes], r1")
|
||||||
|
: [charRes] "=&r" (charRes)
|
||||||
: [charIn1] "d" (charIn1),
|
: [charIn1] "d" (charIn1),
|
||||||
[intIn2] "d" (intIn2)
|
[charIn2] "d" (charIn2)
|
||||||
: "cc"
|
: "cc"
|
||||||
);
|
);
|
||||||
return intRes;
|
return charRes;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,23 +64,25 @@
|
|||||||
|
|
||||||
#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
|
#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
|
||||||
#if AVR_ATmega1284_FAMILY
|
#if AVR_ATmega1284_FAMILY
|
||||||
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P))
|
#define IS_ANALOG(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
||||||
#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0))
|
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(IS_ANALOG(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
||||||
#else
|
#else
|
||||||
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0))
|
#define _ANALOG1(P) WITHIN(P, analogInputToDigitalPin(0), analogInputToDigitalPin(7))
|
||||||
#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7)))
|
#define _ANALOG2(P) WITHIN(P, analogInputToDigitalPin(8), analogInputToDigitalPin(15))
|
||||||
|
#define IS_ANALOG(P) (_ANALOG1(P) || _ANALOG2(P))
|
||||||
|
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
||||||
#endif
|
#endif
|
||||||
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
|
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
|
||||||
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
void PRINT_ARRAY_NAME(uint8_t x) {
|
void PRINT_ARRAY_NAME(uint8_t x) {
|
||||||
char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name);
|
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
|
||||||
LOOP_L_N(y, MAX_NAME_LENGTH) {
|
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) {
|
||||||
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
||||||
if (temp_char != 0)
|
if (temp_char != 0)
|
||||||
SERIAL_CHAR(temp_char);
|
SERIAL_CHAR(temp_char);
|
||||||
else {
|
else {
|
||||||
LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' ');
|
for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; ++i) SERIAL_CHAR(' ');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,7 +90,6 @@ void PRINT_ARRAY_NAME(uint8_t x) {
|
|||||||
|
|
||||||
#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital)
|
#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital)
|
||||||
|
|
||||||
|
|
||||||
#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of
|
#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of
|
||||||
#undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it
|
#undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it
|
||||||
#define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog
|
#define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog
|
||||||
@@ -108,7 +109,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
|
|||||||
* Print a pin's PWM status.
|
* Print a pin's PWM status.
|
||||||
* Return true if it's currently a PWM pin.
|
* Return true if it's currently a PWM pin.
|
||||||
*/
|
*/
|
||||||
static bool pwm_status(uint8_t pin) {
|
bool pwm_status(uint8_t pin) {
|
||||||
char buffer[20]; // for the sprintf statements
|
char buffer[20]; // for the sprintf statements
|
||||||
|
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
@@ -162,7 +163,6 @@ static bool pwm_status(uint8_t pin) {
|
|||||||
SERIAL_ECHO_SP(2);
|
SERIAL_ECHO_SP(2);
|
||||||
} // pwm_status
|
} // pwm_status
|
||||||
|
|
||||||
|
|
||||||
const volatile uint8_t* const PWM_other[][3] PROGMEM = {
|
const volatile uint8_t* const PWM_other[][3] PROGMEM = {
|
||||||
{ &TCCR0A, &TCCR0B, &TIMSK0 },
|
{ &TCCR0A, &TCCR0B, &TIMSK0 },
|
||||||
{ &TCCR1A, &TCCR1B, &TIMSK1 },
|
{ &TCCR1A, &TCCR1B, &TIMSK1 },
|
||||||
@@ -180,7 +180,6 @@ const volatile uint8_t* const PWM_other[][3] PROGMEM = {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
||||||
|
|
||||||
#ifdef TIMER0A
|
#ifdef TIMER0A
|
||||||
@@ -216,7 +215,6 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define TCCR_A(T) pgm_read_word(&PWM_other[T][0])
|
#define TCCR_A(T) pgm_read_word(&PWM_other[T][0])
|
||||||
#define TCCR_B(T) pgm_read_word(&PWM_other[T][1])
|
#define TCCR_B(T) pgm_read_word(&PWM_other[T][1])
|
||||||
#define TIMSK(T) pgm_read_word(&PWM_other[T][2])
|
#define TIMSK(T) pgm_read_word(&PWM_other[T][2])
|
||||||
@@ -231,12 +229,12 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = {
|
|||||||
|
|
||||||
#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L])
|
#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L])
|
||||||
|
|
||||||
static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); }
|
void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); }
|
||||||
static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); }
|
void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); }
|
||||||
static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); }
|
void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); }
|
||||||
static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); }
|
void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); }
|
||||||
|
|
||||||
inline void com_print(const uint8_t N, const uint8_t Z) {
|
void com_print(const uint8_t N, const uint8_t Z) {
|
||||||
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
const uint8_t *TCCRA = (uint8_t*)TCCR_A(N);
|
||||||
SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
|
SERIAL_ECHOPGM(" COM", AS_DIGIT(N));
|
||||||
SERIAL_CHAR(Z);
|
SERIAL_CHAR(Z);
|
||||||
@@ -278,7 +276,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
|||||||
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pwm_details(uint8_t pin) {
|
void pwm_details(uint8_t pin) {
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
|
|
||||||
#if ABTEST(0)
|
#if ABTEST(0)
|
||||||
@@ -352,47 +350,41 @@ static void pwm_details(uint8_t pin) {
|
|||||||
} // pwm_details
|
} // pwm_details
|
||||||
|
|
||||||
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
|
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
|
||||||
int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed
|
int digitalRead_mod(const pin_t pin) { // same as digitalRead except the PWM stop section has been removed
|
||||||
const uint8_t port = digitalPinToPort_DEBUG(pin);
|
const uint8_t port = digitalPinToPort_DEBUG(pin);
|
||||||
return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW;
|
return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PRINT_PORT
|
void print_port(const pin_t pin) { // print port number
|
||||||
|
#ifdef digitalPinToPort_DEBUG
|
||||||
|
uint8_t x;
|
||||||
|
SERIAL_ECHOPGM(" Port: ");
|
||||||
|
#if AVR_AT90USB1286_FAMILY
|
||||||
|
x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64;
|
||||||
|
#else
|
||||||
|
x = digitalPinToPort_DEBUG(pin) + 64;
|
||||||
|
#endif
|
||||||
|
SERIAL_CHAR(x);
|
||||||
|
|
||||||
void print_port(int8_t pin) { // print port number
|
#if AVR_AT90USB1286_FAMILY
|
||||||
#ifdef digitalPinToPort_DEBUG
|
if (pin == 46)
|
||||||
uint8_t x;
|
x = '2';
|
||||||
SERIAL_ECHOPGM(" Port: ");
|
else if (pin == 47)
|
||||||
#if AVR_AT90USB1286_FAMILY
|
x = '3';
|
||||||
x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64;
|
else {
|
||||||
#else
|
|
||||||
x = digitalPinToPort_DEBUG(pin) + 64;
|
|
||||||
#endif
|
|
||||||
SERIAL_CHAR(x);
|
|
||||||
|
|
||||||
#if AVR_AT90USB1286_FAMILY
|
|
||||||
if (pin == 46)
|
|
||||||
x = '2';
|
|
||||||
else if (pin == 47)
|
|
||||||
x = '3';
|
|
||||||
else {
|
|
||||||
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
|
||||||
for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
||||||
for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
|
for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
|
||||||
#endif
|
}
|
||||||
SERIAL_CHAR(x);
|
|
||||||
#else
|
#else
|
||||||
SERIAL_ECHO_SP(10);
|
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
||||||
|
for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1;
|
||||||
#endif
|
#endif
|
||||||
}
|
SERIAL_CHAR(x);
|
||||||
|
#else
|
||||||
#define PRINT_PORT(p) print_port(p)
|
SERIAL_ECHO_SP(10);
|
||||||
|
#endif
|
||||||
#endif
|
}
|
||||||
|
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
|||||||
@@ -22,11 +22,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
//
|
//
|
||||||
// some of the pin mapping functions of the Teensduino extension to the Arduino IDE
|
// Some of the pin mapping functions of the Arduino IDE Teensduino extension
|
||||||
// do not function the same as the other Arduino extensions
|
// function differently from other Arduino extensions.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
#define TEENSYDUINO_IDE
|
#define TEENSYDUINO_IDE
|
||||||
|
|
||||||
//digitalPinToTimer(pin) function works like Arduino but Timers are not defined
|
//digitalPinToTimer(pin) function works like Arduino but Timers are not defined
|
||||||
@@ -48,8 +47,6 @@
|
|||||||
#define PE 5
|
#define PE 5
|
||||||
#define PF 6
|
#define PF 6
|
||||||
|
|
||||||
#undef digitalPinToPort
|
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
PD, // 0 - PD0 - INT0 - PWM
|
PD, // 0 - PD0 - INT0 - PWM
|
||||||
PD, // 1 - PD1 - INT1 - PWM
|
PD, // 1 - PD1 - INT1 - PWM
|
||||||
@@ -101,7 +98,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
|||||||
PE, // 47 - PE3 (not defined in teensyduino)
|
PE, // 47 - PE3 (not defined in teensyduino)
|
||||||
};
|
};
|
||||||
|
|
||||||
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
|
#define digitalPinToPort(P) pgm_read_byte(digital_pin_to_port_PGM[P])
|
||||||
|
|
||||||
// digitalPinToBitMask(pin) is OK
|
// digitalPinToBitMask(pin) is OK
|
||||||
|
|
||||||
|
|||||||
@@ -231,7 +231,6 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
|||||||
|
|
||||||
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
|
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
|
||||||
|
|
||||||
|
|
||||||
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
|
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
|
||||||
// TIMERS
|
// TIMERS
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|||||||
@@ -0,0 +1,979 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __AVR__
|
||||||
|
|
||||||
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
|
#if ENABLED(HAL_AVR_DIRTY_INIT)
|
||||||
|
|
||||||
|
#include "registers.h"
|
||||||
|
|
||||||
|
// Since the compiler could be creating multiple copies of function code-graphs for each header inline-inclusion,
|
||||||
|
// we want to off-load the function definitions that define static memory into this solitary compilation unit.
|
||||||
|
// This way the ROM is NOT bloated (who knows if the compiler is optimizing same-content constant objects into one?)
|
||||||
|
|
||||||
|
ATmegaPinFunctions _ATmega_getPinFunctions(int pin) {
|
||||||
|
if (pin < 0) return {};
|
||||||
|
|
||||||
|
ATmegaPinInfo info = _ATmega_getPinInfo((unsigned int)pin);
|
||||||
|
|
||||||
|
#ifdef __AVR_TRM01__
|
||||||
|
if (info.port == eATmegaPort::PORT_A) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_B) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC0A, eATmegaPinFunc::TOC1C, eATmegaPinFunc::PCI7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1B, eATmegaPinFunc::PCI6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1A, eATmegaPinFunc::PCI5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC2A, eATmegaPinFunc::PCI4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MISO, eATmegaPinFunc::PCI3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MOSI, eATmegaPinFunc::PCI2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_SCK, eATmegaPinFunc::PCI1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_CS, eATmegaPinFunc::PCI0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_C) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD15 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD14 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD13 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD12 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD11 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_D) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER0_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART1_CLK };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ICP };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT3, eATmegaPinFunc::USART1_TXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT2, eATmegaPinFunc::USART1_RXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT1, eATmegaPinFunc::TWI_SDA };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT0, eATmegaPinFunc::TWI_CLK };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_E) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT7, eATmegaPinFunc::TIMER3_ICP, eATmegaPinFunc::CLKO };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT6, eATmegaPinFunc::TIMER3_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT5, eATmegaPinFunc::TOC3C };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT4, eATmegaPinFunc::TOC3B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN1, eATmegaPinFunc::TOC3A };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN0, eATmegaPinFunc::USART0_CLK };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PDO, eATmegaPinFunc::USART0_TXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PDI, eATmegaPinFunc::USART0_RXD, eATmegaPinFunc::PCI8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_F) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_G) {
|
||||||
|
if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC0B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3 ) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_ALE };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_RD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_WR };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_H) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER4_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC2B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC4C };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC4B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC4A };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART2_CLK };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART2_TXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART2_RXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_J) {
|
||||||
|
if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI15 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI14 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI13 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI12 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART3_CLK, eATmegaPinFunc::PCI11 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART3_TXD, eATmegaPinFunc::PCI10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART3_RXD, eATmegaPinFunc::PCI9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_K) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC15, eATmegaPinFunc::PCI23 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC14, eATmegaPinFunc::PCI22 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC13, eATmegaPinFunc::PCI21 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC12, eATmegaPinFunc::PCI20 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC11, eATmegaPinFunc::PCI19 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC10, eATmegaPinFunc::PCI18 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC9, eATmegaPinFunc::PCI17 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC8, eATmegaPinFunc::PCI16 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_L) {
|
||||||
|
if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC5C };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC5B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC5A };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER5_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER5_ICP };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER4_ICP };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__AVR_TRM02__)
|
||||||
|
if (info.port == eATmegaPort::PORT_A) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI7, eATmegaPinFunc::ADC7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI6, eATmegaPinFunc::ADC6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI5, eATmegaPinFunc::ADC5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI4, eATmegaPinFunc::ADC4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI3, eATmegaPinFunc::ADC3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI2, eATmegaPinFunc::ADC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI1, eATmegaPinFunc::ADC1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI0, eATmegaPinFunc::ADC0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_B) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_SCK, eATmegaPinFunc::TOC3B, eATmegaPinFunc::PCI15 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MISO, eATmegaPinFunc::TOC3A, eATmegaPinFunc::PCI14 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MOSI, eATmegaPinFunc::TIMER3_ICP, eATmegaPinFunc::PCI13 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_CS, eATmegaPinFunc::TOC0B, eATmegaPinFunc::PCI12 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN1, eATmegaPinFunc::TOC0A, eATmegaPinFunc::PCI11 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN0, eATmegaPinFunc::EINT2, eATmegaPinFunc::PCI10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ECI, eATmegaPinFunc::CLKO, eATmegaPinFunc::PCI9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER0_ECI, eATmegaPinFunc::USART0_CLK, eATmegaPinFunc::PCI8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_C) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC2, eATmegaPinFunc::PCI23 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC1, eATmegaPinFunc::PCI22 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI21 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI20 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI19 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI18 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI17, eATmegaPinFunc::TWI_SDA };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TWI_CLK, eATmegaPinFunc::PCI16 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_D) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC2A, eATmegaPinFunc::PCI31 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ICP, eATmegaPinFunc::TOC2B, eATmegaPinFunc::PCI30 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1A, eATmegaPinFunc::PCI29 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1B, eATmegaPinFunc::USART1_CLK, eATmegaPinFunc::PCI28 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT1, eATmegaPinFunc::USART1_TXD, eATmegaPinFunc::PCI27 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT0, eATmegaPinFunc::USART1_RXD, eATmegaPinFunc::PCI26 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART0_TXD, eATmegaPinFunc::PCI25 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART0_TXD, eATmegaPinFunc::PCI24, eATmegaPinFunc::TIMER3_ECI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__AVR_TRM03__)
|
||||||
|
if (info.port == eATmegaPort::PORT_B) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::XTAL2, eATmegaPinFunc::TOSC2, eATmegaPinFunc::PCI7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::XTAL1, eATmegaPinFunc::TOSC1, eATmegaPinFunc::PCI6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_SCK, eATmegaPinFunc::PCI5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MISO, eATmegaPinFunc::PCI4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MOSI, eATmegaPinFunc::TOC2A, eATmegaPinFunc::PCI3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_CS, eATmegaPinFunc::TOC1B, eATmegaPinFunc::PCI2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1A, eATmegaPinFunc::PCI1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ICP, eATmegaPinFunc::CLKO, eATmegaPinFunc::PCI0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_C) {
|
||||||
|
if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI14 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC5, eATmegaPinFunc::TWI_CLK, eATmegaPinFunc::PCI13 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC4, eATmegaPinFunc::TWI_SDA, eATmegaPinFunc::PCI12 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC3, eATmegaPinFunc::PCI11 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC2, eATmegaPinFunc::PCI10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC1, eATmegaPinFunc::PCI9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC0, eATmegaPinFunc::PCI8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_D) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN1, eATmegaPinFunc::PCI23 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN0, eATmegaPinFunc::TOC0A, eATmegaPinFunc::PCI22 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ECI, eATmegaPinFunc::TOC0B, eATmegaPinFunc::PCI21 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART_CLK, eATmegaPinFunc::TIMER0_ECI, eATmegaPinFunc::PCI20 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT1, eATmegaPinFunc::TOC2B, eATmegaPinFunc::PCI19 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT0, eATmegaPinFunc::PCI18 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART_TXD, eATmegaPinFunc::PCI17 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART_RXD, eATmegaPinFunc::PCI16 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__AVR_TRM04__)
|
||||||
|
if (info.port == eATmegaPort::PORT_A) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_B) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC0A, eATmegaPinFunc::TOC1C, eATmegaPinFunc::PCI7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1B, eATmegaPinFunc::PCI6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1A, eATmegaPinFunc::PCI5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC2A, eATmegaPinFunc::PCI4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PDO, eATmegaPinFunc::SPI_MISO, eATmegaPinFunc::PCI3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PDI, eATmegaPinFunc::SPI_MOSI, eATmegaPinFunc::PCI2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_SCK, eATmegaPinFunc::PCI1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_CS, eATmegaPinFunc::PCI0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_C) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD15, eATmegaPinFunc::TIMER3_ICP, eATmegaPinFunc::CLKO };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD14, eATmegaPinFunc::TOC3A };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD13, eATmegaPinFunc::TOC3B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD12, eATmegaPinFunc::TOC3C };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD11, eATmegaPinFunc::TIMER3_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_AD8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_D) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER0_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_CLKI };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART1_CLK };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ICP };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT3, eATmegaPinFunc::USART1_TXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT2, eATmegaPinFunc::USART1_RXD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT1, eATmegaPinFunc::TWI_SDA, eATmegaPinFunc::TOC2B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT0, eATmegaPinFunc::TWI_CLK, eATmegaPinFunc::TOC0B };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_E) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT7, eATmegaPinFunc::AIN1, eATmegaPinFunc::UVCON };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT6, eATmegaPinFunc::AIN0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT5, eATmegaPinFunc::TOSC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT4, eATmegaPinFunc::TOSC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::UID };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_ALE };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_RD };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EXTMEM_WR };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_F) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif defined(__AVR_TRM05__)
|
||||||
|
if (info.port == eATmegaPort::PORT_A) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC7, eATmegaPinFunc::PCI7 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC6, eATmegaPinFunc::PCI6 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC5, eATmegaPinFunc::PCI5 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC4, eATmegaPinFunc::PCI4 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC3, eATmegaPinFunc::PCI3 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC2, eATmegaPinFunc::PCI2 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC1, eATmegaPinFunc::PCI1 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::ADC0, eATmegaPinFunc::PCI0 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_B) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_SCK, eATmegaPinFunc::PCI15 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MISO, eATmegaPinFunc::PCI14 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_MOSI, eATmegaPinFunc::PCI13 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::SPI_CS, eATmegaPinFunc::TOC0B, eATmegaPinFunc::PCI12 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN1, eATmegaPinFunc::TOC0A, eATmegaPinFunc::PCI11 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::AIN0, eATmegaPinFunc::EINT2, eATmegaPinFunc::PCI10 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ECI, eATmegaPinFunc::CLKO, eATmegaPinFunc::PCI9 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER0_ECI, eATmegaPinFunc::USART0_CLK, eATmegaPinFunc::PCI8 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_C) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC2, eATmegaPinFunc::PCI23 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOSC1, eATmegaPinFunc::PCI22 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI21 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI20 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI19 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::PCI18 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TWI_SDA, eATmegaPinFunc::PCI17 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
else if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TWI_CLK, eATmegaPinFunc::PCI16 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (info.port == eATmegaPort::PORT_D) {
|
||||||
|
if (info.pinidx == 7) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC2A, eATmegaPinFunc::PCI31 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 6) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TIMER1_ICP, eATmegaPinFunc::TOC2B, eATmegaPinFunc::PCI30 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 5) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1A, eATmegaPinFunc::PCI29 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 4) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::TOC1B, eATmegaPinFunc::USART1_CLK, eATmegaPinFunc::PCI28 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 3) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT1, eATmegaPinFunc::USART1_TXD, eATmegaPinFunc::PCI27 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 2) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::EINT0, eATmegaPinFunc::USART1_RXD, eATmegaPinFunc::PCI26 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 1) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART0_TXD, eATmegaPinFunc::PCI25 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
if (info.pinidx == 0) {
|
||||||
|
static const eATmegaPinFunc funcs[] = { eATmegaPinFunc::USART0_RXD, eATmegaPinFunc::PCI24 };
|
||||||
|
return { funcs, countof(funcs) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ATmegaPinFunctions(); // default and empty.
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HAL_AVR_DIRTY_INIT
|
||||||
|
#endif // __AVR__
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -44,14 +46,14 @@ typedef uint16_t hal_timer_t;
|
|||||||
#define MF_TIMER_TEMP 0
|
#define MF_TIMER_TEMP 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
#define TEMP_TIMER_FREQUENCY (((F_CPU) + 0x2000) / 0x4000)
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
#define STEPPER_TIMER_PRESCALE 8
|
#define STEPPER_TIMER_PRESCALE 8
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AVR LCD-specific defines
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
||||||
|
#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_AVR_sw_sp_fn
|
||||||
@@ -88,7 +88,7 @@ void u8g_spiSend_sw_AVR_mode_0(uint8_t val) {
|
|||||||
volatile uint8_t *outData = u8g_outData,
|
volatile uint8_t *outData = u8g_outData,
|
||||||
*outClock = u8g_outClock;
|
*outClock = u8g_outClock;
|
||||||
U8G_ATOMIC_START();
|
U8G_ATOMIC_START();
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
*outData |= bitData;
|
*outData |= bitData;
|
||||||
else
|
else
|
||||||
@@ -108,7 +108,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
|
|||||||
volatile uint8_t *outData = u8g_outData,
|
volatile uint8_t *outData = u8g_outData,
|
||||||
*outClock = u8g_outClock;
|
*outClock = u8g_outClock;
|
||||||
U8G_ATOMIC_START();
|
U8G_ATOMIC_START();
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
*outClock &= bitNotClock;
|
*outClock &= bitNotClock;
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
*outData |= bitData;
|
*outData |= bitData;
|
||||||
@@ -120,7 +120,6 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
|
|||||||
U8G_ATOMIC_END();
|
U8G_ATOMIC_END();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if ENABLED(FYSETC_MINI_12864)
|
#if ENABLED(FYSETC_MINI_12864)
|
||||||
#define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
|
#define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
/**
|
|
||||||
* Marlin 3D Printer Firmware
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
||||||
*
|
|
||||||
* Based on Sprinter and grbl.
|
|
||||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifdef __AVR__
|
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
|
||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
|
||||||
|
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
|
||||||
void watchdog_init() {
|
|
||||||
#if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S)
|
|
||||||
#define WDTO_NS WDTO_8S
|
|
||||||
#else
|
|
||||||
#define WDTO_NS WDTO_4S
|
|
||||||
#endif
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
// Enable the watchdog timer, but only for the interrupt.
|
|
||||||
// Take care, as this requires the correct order of operation, with interrupts disabled.
|
|
||||||
// See the datasheet of any AVR chip for details.
|
|
||||||
wdt_reset();
|
|
||||||
cli();
|
|
||||||
_WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE);
|
|
||||||
_WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5
|
|
||||||
// So worked for up to WDTO_2S
|
|
||||||
sei();
|
|
||||||
wdt_reset();
|
|
||||||
#else
|
|
||||||
wdt_enable(WDTO_NS); // The function handles the upper bit correct.
|
|
||||||
#endif
|
|
||||||
//delay(10000); // test it!
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//=================================== ISR ===================================
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled.
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
|
||||||
ISR(WDT_vect) {
|
|
||||||
sei(); // With the interrupt driven serial we need to allow interrupts.
|
|
||||||
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
|
||||||
minkill(); // interrupt-safe final kill and infinite loop
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // USE_WATCHDOG
|
|
||||||
#endif // __AVR__
|
|
||||||
+110
-6
@@ -1,7 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -25,7 +27,7 @@
|
|||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "HAL.h"
|
#include "../../MarlinCore.h"
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include "usb/usb_task.h"
|
#include "usb/usb_task.h"
|
||||||
@@ -40,14 +42,15 @@ uint16_t MarlinHAL::adc_result;
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial());
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
extern void install_min_serial();
|
||||||
|
#endif
|
||||||
|
|
||||||
void MarlinHAL::init() {
|
void MarlinHAL::init() {
|
||||||
// Initialize the USB stack
|
#if HAS_MEDIA
|
||||||
#if ENABLED(SDSUPPORT)
|
|
||||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||||
#endif
|
#endif
|
||||||
usb_task_init();
|
usb_task_init(); // Initialize the USB stack
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +75,103 @@ uint8_t MarlinHAL::get_reset_source() {
|
|||||||
|
|
||||||
void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); }
|
void MarlinHAL::reboot() { rstc_start_software_reset(RSTC); }
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Watchdog Timer
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
// Initialize watchdog - On SAM3X, Watchdog was already configured
|
||||||
|
// and enabled or disabled at startup, so no need to reconfigure it
|
||||||
|
// here.
|
||||||
|
void MarlinHAL::watchdog_init() { WDT_Restart(WDT); } // Reset watchdog to start clean
|
||||||
|
|
||||||
|
// Reset watchdog. MUST be called at least every 4 seconds after the
|
||||||
|
// first watchdog_init or AVR will go into emergency procedures.
|
||||||
|
void MarlinHAL::watchdog_refresh() { watchdogReset(); }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Override Arduino runtime to either config or disable the watchdog
|
||||||
|
//
|
||||||
|
// We need to configure the watchdog as soon as possible in the boot
|
||||||
|
// process, because watchdog initialization at hardware reset on SAM3X8E
|
||||||
|
// is unreliable, and there is risk of unintended resets if we delay
|
||||||
|
// that initialization to a later time.
|
||||||
|
void watchdogSetup() {
|
||||||
|
|
||||||
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
// 4 seconds timeout
|
||||||
|
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||||
|
|
||||||
|
// Calculate timeout value in WDT counter ticks: This assumes
|
||||||
|
// the slow clock is running at 32.768 kHz watchdog
|
||||||
|
// frequency is therefore 32768 / 128 = 256 Hz
|
||||||
|
timeout = (timeout << 8) / 1000;
|
||||||
|
if (timeout == 0)
|
||||||
|
timeout = 1;
|
||||||
|
else if (timeout > 0xFFF)
|
||||||
|
timeout = 0xFFF;
|
||||||
|
|
||||||
|
// We want to enable the watchdog with the specified timeout
|
||||||
|
uint32_t value =
|
||||||
|
WDT_MR_WDV(timeout) | // With the specified timeout
|
||||||
|
WDT_MR_WDD(timeout) | // and no invalid write window
|
||||||
|
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
|
||||||
|
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
|
||||||
|
// to keep PIO controller state
|
||||||
|
#endif
|
||||||
|
WDT_MR_WDDBGHLT | // WDT stops in debug state.
|
||||||
|
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
|
||||||
|
|
||||||
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
|
// We enable the watchdog timer, but only for the interrupt.
|
||||||
|
|
||||||
|
// Configure WDT to only trigger an interrupt
|
||||||
|
value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt.
|
||||||
|
|
||||||
|
// Disable WDT interrupt (just in case, to avoid triggering it!)
|
||||||
|
NVIC_DisableIRQ(WDT_IRQn);
|
||||||
|
|
||||||
|
// We NEED memory barriers to ensure Interrupts are actually disabled!
|
||||||
|
// ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the )
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
|
||||||
|
// Initialize WDT with the given parameters
|
||||||
|
WDT_Enable(WDT, value);
|
||||||
|
|
||||||
|
// Configure and enable WDT interrupt.
|
||||||
|
NVIC_ClearPendingIRQ(WDT_IRQn);
|
||||||
|
NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups
|
||||||
|
NVIC_EnableIRQ(WDT_IRQn);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// a WDT fault triggers a reset
|
||||||
|
value |= WDT_MR_WDRSTEN;
|
||||||
|
|
||||||
|
// Initialize WDT with the given parameters
|
||||||
|
WDT_Enable(WDT, value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reset the watchdog
|
||||||
|
WDT_Restart(WDT);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Make sure to completely disable the Watchdog
|
||||||
|
WDT_Disable(WDT);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Free Memory Accessor
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern unsigned int _ebss; // end of bss section
|
extern unsigned int _ebss; // end of bss section
|
||||||
}
|
}
|
||||||
@@ -82,6 +182,10 @@ int freeMemory() {
|
|||||||
return (int)&free_memory - (heap_end ?: (int)&_ebss);
|
return (int)&free_memory - (heap_end ?: (int)&_ebss);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// Serial Ports
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
// Forward the default serial ports
|
// Forward the default serial ports
|
||||||
#if USING_HW_SERIAL0
|
#if USING_HW_SERIAL0
|
||||||
DefaultSerial1 MSerial0(false, Serial);
|
DefaultSerial1 MSerial0(false, Serial);
|
||||||
|
|||||||
+15
-12
@@ -1,9 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
#include "../shared/math_32bit.h"
|
#include "../shared/math_32bit.h"
|
||||||
#include "../shared/HAL_SPI.h"
|
#include "../shared/HAL_SPI.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "watchdog.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@@ -115,8 +114,8 @@ typedef Servo hal_servo_t;
|
|||||||
//
|
//
|
||||||
// Interrupts
|
// Interrupts
|
||||||
//
|
//
|
||||||
#define sei() noInterrupts()
|
#define sei() interrupts()
|
||||||
#define cli() interrupts()
|
#define cli() noInterrupts()
|
||||||
|
|
||||||
#define CRITICAL_SECTION_START() const bool _irqon = hal.isr_state(); hal.isr_off()
|
#define CRITICAL_SECTION_START() const bool _irqon = hal.isr_state(); hal.isr_off()
|
||||||
#define CRITICAL_SECTION_END() if (_irqon) hal.isr_on()
|
#define CRITICAL_SECTION_END() if (_irqon) hal.isr_on()
|
||||||
@@ -124,7 +123,7 @@ typedef Servo hal_servo_t;
|
|||||||
//
|
//
|
||||||
// ADC
|
// ADC
|
||||||
//
|
//
|
||||||
#define HAL_ADC_VREF 3.3
|
#define HAL_ADC_VREF_MV 3300
|
||||||
#define HAL_ADC_RESOLUTION 10
|
#define HAL_ADC_RESOLUTION 10
|
||||||
|
|
||||||
#ifndef analogInputToDigitalPin
|
#ifndef analogInputToDigitalPin
|
||||||
@@ -176,9 +175,13 @@ public:
|
|||||||
// Earliest possible init, before setup()
|
// Earliest possible init, before setup()
|
||||||
MarlinHAL() {}
|
MarlinHAL() {}
|
||||||
|
|
||||||
static void init(); // Called early in setup()
|
// Watchdog
|
||||||
static void init_board(); // Called less early in setup()
|
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
static void reboot(); // Software reset
|
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||||
|
|
||||||
|
static void init(); // Called early in setup()
|
||||||
|
static void init_board(); // Called less early in setup()
|
||||||
|
static void reboot(); // Restart the firmware
|
||||||
|
|
||||||
// Interrupts
|
// Interrupts
|
||||||
static bool isr_state() { return !__get_PRIMASK(); }
|
static bool isr_state() { return !__get_PRIMASK(); }
|
||||||
@@ -207,9 +210,9 @@ public:
|
|||||||
static void adc_init() {}
|
static void adc_init() {}
|
||||||
|
|
||||||
// Called by Temperature::init for each sensor at startup
|
// Called by Temperature::init for each sensor at startup
|
||||||
static void adc_enable(const uint8_t ch) {}
|
static void adc_enable(const uint8_t /*ch*/) {}
|
||||||
|
|
||||||
// Begin ADC sampling on the given channel
|
// Begin ADC sampling on the given channel. Called from Temperature::isr!
|
||||||
static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }
|
static void adc_start(const uint8_t ch) { adc_result = analogRead(ch); }
|
||||||
|
|
||||||
// Is the ADC ready for reading?
|
// Is the ADC ready for reading?
|
||||||
|
|||||||
@@ -31,8 +31,6 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* HAL for Arduino Due and compatible (SAM3X8E)
|
* HAL for Arduino Due and compatible (SAM3X8E)
|
||||||
*
|
|
||||||
* For ARDUINO_ARCH_SAM
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
@@ -44,7 +42,7 @@
|
|||||||
// Public functions
|
// Public functions
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI)
|
#if ANY(SOFTWARE_SPI, FORCE_SOFT_SPI)
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Software SPI
|
// Software SPI
|
||||||
@@ -249,12 +247,12 @@
|
|||||||
b <<= 1; // little setup time
|
b <<= 1; // little setup time
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, HIGH);
|
WRITE(SD_SCK_PIN, HIGH);
|
||||||
DELAY_NS(spiDelayNS);
|
DELAY_NS_VAR(spiDelayNS);
|
||||||
|
|
||||||
b |= (READ(SD_MISO_PIN) != 0);
|
b |= (READ(SD_MISO_PIN) != 0);
|
||||||
|
|
||||||
WRITE(SD_SCK_PIN, LOW);
|
WRITE(SD_SCK_PIN, LOW);
|
||||||
DELAY_NS(spiDelayNS);
|
DELAY_NS_VAR(spiDelayNS);
|
||||||
} while (--bits);
|
} while (--bits);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
practice, we need alignment to 256 bytes to make this work in all
|
practice, we need alignment to 256 bytes to make this work in all
|
||||||
cases */
|
cases */
|
||||||
__attribute__ ((aligned(256)))
|
__attribute__ ((aligned(256)))
|
||||||
static DeviceVectors ram_tab = { nullptr };
|
static DeviceVectors ram_tab[61] = { nullptr };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function checks if the exception/interrupt table is already in SRAM or not.
|
* This function checks if the exception/interrupt table is already in SRAM or not.
|
||||||
|
|||||||
@@ -474,7 +474,6 @@ void MarlinSerial<Cfg>::flushTX() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// If not using the USB port as serial port
|
// If not using the USB port as serial port
|
||||||
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
#if defined(SERIAL_PORT) && SERIAL_PORT >= 0
|
||||||
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
template class MarlinSerial< MarlinSerialCfg<SERIAL_PORT> >;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include <WString.h>
|
#include <WString.h>
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../inc/MarlinConfigPre.h"
|
||||||
|
#include "../../core/types.h"
|
||||||
#include "../../core/serial_hook.h"
|
#include "../../core/serial_hook.h"
|
||||||
|
|
||||||
// Define constants and variables for buffering incoming serial data. We're
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
@@ -52,10 +53,6 @@
|
|||||||
// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256."
|
// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256."
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
// Templated type selector
|
|
||||||
template<bool b, typename T, typename F> struct TypeSelector { typedef T type;} ;
|
|
||||||
template<typename T, typename F> struct TypeSelector<false, T, F> { typedef F type; };
|
|
||||||
|
|
||||||
// Templated structure wrapper
|
// Templated structure wrapper
|
||||||
template<typename S, unsigned int addr> struct StructWrapper {
|
template<typename S, unsigned int addr> struct StructWrapper {
|
||||||
constexpr StructWrapper(int) {}
|
constexpr StructWrapper(int) {}
|
||||||
@@ -76,7 +73,7 @@ protected:
|
|||||||
static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT];
|
static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT];
|
||||||
|
|
||||||
// Base size of type on buffer size
|
// Base size of type on buffer size
|
||||||
typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t;
|
typedef uvalue_t(Cfg::RX_SIZE - 1) ring_buffer_pos_t;
|
||||||
|
|
||||||
struct ring_buffer_r {
|
struct ring_buffer_r {
|
||||||
volatile ring_buffer_pos_t head, tail;
|
volatile ring_buffer_pos_t head, tail;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||||
|
|
||||||
#include "../shared/HAL_MinSerial.h"
|
#include "../shared/MinSerial.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
@@ -73,18 +73,18 @@ void install_min_serial() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if DISABLED(DYNAMIC_VECTORTABLE)
|
#if DISABLED(DYNAMIC_VECTORTABLE)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
__attribute__((naked)) void JumpHandler_ASM() {
|
__attribute__((naked)) void JumpHandler_ASM() {
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"b CommonHandler_ASM\n"
|
"b CommonHandler_ASM\n"
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
||||||
|
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
||||||
}
|
}
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler();
|
|
||||||
void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // POSTMORTEM_DEBUGGING
|
#endif // POSTMORTEM_DEBUGGING
|
||||||
@@ -47,12 +47,12 @@
|
|||||||
#include "../shared/servo.h"
|
#include "../shared/servo.h"
|
||||||
#include "../shared/servo_private.h"
|
#include "../shared/servo_private.h"
|
||||||
|
|
||||||
static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval)
|
static Flags<_Nbr_16timers> DisablePending; // ISR should disable the timer at the next timer reset
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
/// Interrupt handler for the TC0 channel 1.
|
/// Interrupt handler for the TC0 channel 1.
|
||||||
// ------------------------
|
// ------------------------
|
||||||
void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel);
|
void Servo_Handler(const timer16_Sequence_t, Tc*, const uint8_t);
|
||||||
|
|
||||||
#ifdef _useTimer1
|
#ifdef _useTimer1
|
||||||
void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
|
void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); }
|
||||||
@@ -70,88 +70,92 @@ void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel);
|
|||||||
void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
|
void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) {
|
void Servo_Handler(const timer16_Sequence_t timer, Tc *tc, const uint8_t channel) {
|
||||||
// clear interrupt
|
static int8_t Channel[_Nbr_16timers]; // Servo counters to pulse (or -1 for refresh interval)
|
||||||
tc->TC_CHANNEL[channel].TC_SR;
|
int8_t cho = Channel[timer]; // Handle the prior Channel[timer] first
|
||||||
if (Channel[timer] < 0)
|
if (cho < 0) { // Channel -1 indicates the refresh interval completed...
|
||||||
tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer
|
tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // ...so reset the timer
|
||||||
else if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive)
|
if (DisablePending[timer]) {
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated
|
// Disabling only after the full servo period expires prevents
|
||||||
|
// pulses being too close together if immediately re-enabled.
|
||||||
|
DisablePending.clear(timer);
|
||||||
|
TC_Stop(tc, channel);
|
||||||
|
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (SERVO_INDEX(timer, cho) < ServoCount) // prior channel handled?
|
||||||
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, LOW); // pulse the prior channel LOW
|
||||||
|
|
||||||
Channel[timer]++; // increment to the next channel
|
Channel[timer] = ++cho; // go to the next channel (or 0)
|
||||||
if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) {
|
if (cho < SERVOS_PER_TIMER && SERVO_INDEX(timer, cho) < ServoCount) {
|
||||||
tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks;
|
tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer, cho).ticks;
|
||||||
if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated
|
if (SERVO(timer, cho).Pin.isActive) // activated?
|
||||||
extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // its an active channel so pulse it high
|
extDigitalWrite(SERVO(timer, cho).Pin.nbr, HIGH); // yes: pulse HIGH
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// finished all channels so wait for the refresh period to expire before starting over
|
// finished all channels so wait for the refresh period to expire before starting over
|
||||||
tc->TC_CHANNEL[channel].TC_RA =
|
const unsigned int cval = tc->TC_CHANNEL[channel].TC_CV + 128 / (SERVO_TIMER_PRESCALER), // allow 128 cycles to ensure the next CV not missed
|
||||||
tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4
|
ival = (unsigned int)usToTicks(REFRESH_INTERVAL); // at least REFRESH_INTERVAL has elapsed
|
||||||
? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed
|
tc->TC_CHANNEL[channel].TC_RA = max(cval, ival);
|
||||||
: tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed
|
|
||||||
Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel
|
Channel[timer] = -1; // reset the timer CCR on the next call
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tc->TC_CHANNEL[channel].TC_SR; // clear interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
|
static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) {
|
||||||
pmc_enable_periph_clk(id);
|
pmc_enable_periph_clk(id);
|
||||||
TC_Configure(tc, channel,
|
TC_Configure(tc, channel,
|
||||||
TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32
|
TC_CMR_WAVE // Waveform mode
|
||||||
TC_CMR_WAVE | // Waveform mode
|
| TC_CMR_WAVSEL_UP_RC // Counter running up and reset when equal to RC
|
||||||
TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC
|
| (SERVO_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0) // MCK/2
|
||||||
|
| (SERVO_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0) // MCK/8
|
||||||
|
| (SERVO_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0) // MCK/32
|
||||||
|
| (SERVO_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0) // MCK/128
|
||||||
|
);
|
||||||
|
|
||||||
/* 84MHz, MCK/32, for 1.5ms: 3937 */
|
// Wait 1ms before the first ISR
|
||||||
TC_SetRA(tc, channel, 2625); // 1ms
|
TC_SetRA(tc, channel, (F_CPU) / (SERVO_TIMER_PRESCALER) / 1000UL); // 1ms
|
||||||
|
|
||||||
/* Configure and enable interrupt */
|
// Configure and enable interrupt
|
||||||
NVIC_EnableIRQ(irqn);
|
NVIC_EnableIRQ(irqn);
|
||||||
// TC_IER_CPAS: RA Compare
|
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; // TC_IER_CPAS: RA Compare
|
||||||
tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS;
|
|
||||||
|
|
||||||
// Enables the timer clock and performs a software reset to start the counting
|
// Enables the timer clock and performs a software reset to start the counting
|
||||||
TC_Start(tc, channel);
|
TC_Start(tc, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initISR(timer16_Sequence_t timer) {
|
void initISR(const timer16_Sequence_t timer_index) {
|
||||||
#ifdef _useTimer1
|
CRITICAL_SECTION_START();
|
||||||
if (timer == _timer1)
|
const bool disable_soon = DisablePending[timer_index];
|
||||||
_initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
|
DisablePending.clear(timer_index);
|
||||||
#endif
|
CRITICAL_SECTION_END();
|
||||||
#ifdef _useTimer2
|
|
||||||
if (timer == _timer2)
|
if (!disable_soon) switch (timer_index) {
|
||||||
_initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
|
default: break;
|
||||||
#endif
|
#ifdef _useTimer1
|
||||||
#ifdef _useTimer3
|
case _timer1: return _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1);
|
||||||
if (timer == _timer3)
|
#endif
|
||||||
_initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
|
#ifdef _useTimer2
|
||||||
#endif
|
case _timer2: return _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2);
|
||||||
#ifdef _useTimer4
|
#endif
|
||||||
if (timer == _timer4)
|
#ifdef _useTimer3
|
||||||
_initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
|
case _timer3: return _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3);
|
||||||
#endif
|
#endif
|
||||||
#ifdef _useTimer5
|
#ifdef _useTimer4
|
||||||
if (timer == _timer5)
|
case _timer4: return _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4);
|
||||||
_initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
|
#endif
|
||||||
#endif
|
#ifdef _useTimer5
|
||||||
|
case _timer5: return _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void finISR(timer16_Sequence_t) {
|
void finISR(const timer16_Sequence_t timer_index) {
|
||||||
#ifdef _useTimer1
|
// Timer is disabled from the ISR, to ensure proper final pulse length.
|
||||||
TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1);
|
DisablePending.set(timer_index);
|
||||||
#endif
|
|
||||||
#ifdef _useTimer2
|
|
||||||
TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer3
|
|
||||||
TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer4
|
|
||||||
TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4);
|
|
||||||
#endif
|
|
||||||
#ifdef _useTimer5
|
|
||||||
TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAS_SERVOS
|
#endif // HAS_SERVOS
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#define _useTimer5
|
#define _useTimer5
|
||||||
|
|
||||||
#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
|
#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays
|
||||||
#define SERVO_TIMER_PRESCALER 32 // timer prescaler
|
#define SERVO_TIMER_PRESCALER 2 // timer prescaler
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TC0, chan 0 => TC0_Handler
|
TC0, chan 0 => TC0_Handler
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
* Based on Sprinter and grbl.
|
||||||
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -199,8 +198,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
for (i = 0; i <PageSize >> 2; i++)
|
for (i = 0; i <PageSize >> 2; i++)
|
||||||
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
|
pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i]));
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM PageWrite ", page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM PageWrite ", page);
|
|
||||||
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
||||||
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
@@ -245,8 +243,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Unlock failure for page ", page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ", page);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,8 +267,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Write failure for page ", page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Write failure for page ", page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -286,8 +282,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
|||||||
if (memcmp(getFlashStorage(page),data,PageSize)) {
|
if (memcmp(getFlashStorage(page),data,PageSize)) {
|
||||||
|
|
||||||
#ifdef EE_EMU_DEBUG
|
#ifdef EE_EMU_DEBUG
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Verify Write failure for page ", page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Verify Write failure for page ", page);
|
|
||||||
|
|
||||||
ee_Dump( page, (uint32_t *)addrflash);
|
ee_Dump( page, (uint32_t *)addrflash);
|
||||||
ee_Dump(-page, data);
|
ee_Dump(-page, data);
|
||||||
@@ -325,8 +320,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
uint16_t i;
|
uint16_t i;
|
||||||
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
uint32_t addrflash = uint32_t(getFlashStorage(page));
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM PageErase ", page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM PageErase ", page);
|
|
||||||
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
DEBUG_ECHOLNPGM(" in FLASH address ", (uint32_t)addrflash);
|
||||||
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
DEBUG_ECHOLNPGM(" base address ", (uint32_t)getFlashStorage(0));
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
@@ -370,8 +364,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Unlock failure for page ",page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Unlock failure for page ",page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -394,8 +387,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
// Reenable interrupts
|
// Reenable interrupts
|
||||||
__enable_irq();
|
__enable_irq();
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Erase failure for page ",page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Erase failure for page ",page);
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -410,8 +402,7 @@ static bool ee_PageErase(uint16_t page) {
|
|||||||
uint32_t * aligned_src = (uint32_t *) addrflash;
|
uint32_t * aligned_src = (uint32_t *) addrflash;
|
||||||
for (i = 0; i < PageSize >> 2; i++) {
|
for (i = 0; i < PageSize >> 2; i++) {
|
||||||
if (*aligned_src++ != 0xFFFFFFFF) {
|
if (*aligned_src++ != 0xFFFFFFFF) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Verify Erase failure for page ",page);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Verify Erase failure for page ",page);
|
|
||||||
ee_Dump(page, (uint32_t *)addrflash);
|
ee_Dump(page, (uint32_t *)addrflash);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -921,8 +912,7 @@ static void ee_Init() {
|
|||||||
// If all groups seem to be used, default to first group
|
// If all groups seem to be used, default to first group
|
||||||
if (curGroup >= GroupCount) curGroup = 0;
|
if (curGroup >= GroupCount) curGroup = 0;
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Current Group: ",curGroup);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Current Group: ",curGroup);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Now, validate that all the other group pages are empty
|
// Now, validate that all the other group pages are empty
|
||||||
@@ -931,8 +921,7 @@ static void ee_Init() {
|
|||||||
|
|
||||||
for (int page = 0; page < PagesPerGroup; page++) {
|
for (int page = 0; page < PagesPerGroup; page++) {
|
||||||
if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
|
if (!ee_IsPageClean(grp * PagesPerGroup + page)) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on group ", grp);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on group ", grp);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
ee_PageErase(grp * PagesPerGroup + page);
|
ee_PageErase(grp * PagesPerGroup + page);
|
||||||
}
|
}
|
||||||
@@ -948,15 +937,13 @@ static void ee_Init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Active page: ", curPage);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Active page: ", curPage);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
|
|
||||||
// Make sure the pages following the first clean one are also clean
|
// Make sure the pages following the first clean one are also clean
|
||||||
for (int page = curPage + 1; page < PagesPerGroup; page++) {
|
for (int page = curPage + 1; page < PagesPerGroup; page++) {
|
||||||
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
|
if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) {
|
||||||
DEBUG_ECHO_START();
|
DEBUG_ECHO_MSG("EEPROM Page ", page, " not clean on active group ", curGroup);
|
||||||
DEBUG_ECHOLNPGM("EEPROM Page ", page, " not clean on active group ", curGroup);
|
|
||||||
DEBUG_FLUSH();
|
DEBUG_FLUSH();
|
||||||
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
|
ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page));
|
||||||
ee_PageErase(curGroup * PagesPerGroup + page);
|
ee_PageErase(curGroup * PagesPerGroup + page);
|
||||||
@@ -971,14 +958,14 @@ static void ee_Init() {
|
|||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||||
#endif
|
#endif
|
||||||
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; }
|
||||||
bool PersistentStore::access_start() { ee_Init(); return true; }
|
bool PersistentStore::access_start() { ee_Init(); return true; }
|
||||||
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
bool PersistentStore::access_finish() { ee_Flush(); return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
ee_Write(uint32_t(p), v);
|
ee_Write(uint32_t(p), v);
|
||||||
@@ -997,7 +984,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = ee_Read(uint32_t(pos));
|
uint8_t c = ee_Read(uint32_t(REAL_EEPROM_ADDR(pos)));
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
crc16(crc, &c, 1);
|
crc16(crc, &c, 1);
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
* Based on Sprinter and grbl.
|
||||||
* Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,14 +36,14 @@
|
|||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
||||||
#endif
|
#endif
|
||||||
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE - eeprom_exclude_size; }
|
||||||
bool PersistentStore::access_start() { eeprom_init(); return true; }
|
bool PersistentStore::access_start() { eeprom_init(); return true; }
|
||||||
bool PersistentStore::access_finish() { return true; }
|
bool PersistentStore::access_finish() { return true; }
|
||||||
|
|
||||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||||
uint16_t written = 0;
|
uint16_t written = 0;
|
||||||
while (size--) {
|
while (size--) {
|
||||||
uint8_t * const p = (uint8_t * const)pos;
|
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
||||||
uint8_t v = *value;
|
uint8_t v = *value;
|
||||||
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
|
||||||
eeprom_write_byte(p, v);
|
eeprom_write_byte(p, v);
|
||||||
@@ -63,7 +62,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
|
|||||||
|
|
||||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||||
do {
|
do {
|
||||||
uint8_t c = eeprom_read_byte((uint8_t*)pos);
|
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
||||||
if (writing) *value = c;
|
if (writing) *value = c;
|
||||||
crc16(crc, &c, 1);
|
crc16(crc, &c, 1);
|
||||||
pos++;
|
pos++;
|
||||||
|
|||||||
@@ -47,33 +47,33 @@ void endstop_ISR() { endstops.update(); }
|
|||||||
|
|
||||||
void setup_endstop_interrupts() {
|
void setup_endstop_interrupts() {
|
||||||
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
#define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE)
|
||||||
TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN));
|
TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN));
|
||||||
TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN));
|
TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN));
|
||||||
TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN));
|
TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN));
|
||||||
TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN));
|
TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN));
|
||||||
TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN));
|
TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN));
|
||||||
TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN));
|
TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN));
|
||||||
TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN));
|
TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN));
|
||||||
TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN));
|
TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN));
|
||||||
TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN));
|
TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN));
|
||||||
TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN));
|
TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN));
|
||||||
TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN));
|
TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN));
|
||||||
TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN));
|
TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN));
|
||||||
TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN));
|
TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN));
|
||||||
TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN));
|
TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN));
|
||||||
TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||||
TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||||
TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN));
|
TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN));
|
||||||
TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN));
|
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN));
|
||||||
TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN));
|
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN));
|
||||||
TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN));
|
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN));
|
||||||
TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN));
|
TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN));
|
||||||
TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN));
|
TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN));
|
||||||
TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN));
|
TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN));
|
||||||
TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN));
|
TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN));
|
||||||
TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN));
|
TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN));
|
||||||
TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN));
|
TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN));
|
||||||
TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN));
|
TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN));
|
||||||
TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN));
|
TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN));
|
||||||
TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN));
|
TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,12 +189,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// UART
|
// UART
|
||||||
#define RXD DIO0
|
#define RXD 0
|
||||||
#define TXD DIO1
|
#define TXD 1
|
||||||
|
|
||||||
// TWI (I2C)
|
// TWI (I2C)
|
||||||
#define SCL DIO21
|
#define SCL 21
|
||||||
#define SDA DIO20
|
#define SDA 20
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pins
|
* pins
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ extern volatile uint32_t *SODR_A, *SODR_B, *CODR_A, *CODR_B;
|
|||||||
|
|
||||||
#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) }
|
#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) }
|
||||||
|
|
||||||
|
|
||||||
#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \
|
#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \
|
||||||
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \
|
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \
|
||||||
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \
|
PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \
|
||||||
@@ -63,7 +62,7 @@ extern PWM_map ISR_table[NUM_PWMS];
|
|||||||
extern uint32_t motor_current_setting[3];
|
extern uint32_t motor_current_setting[3];
|
||||||
|
|
||||||
#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4)
|
#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4)
|
||||||
#define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0)
|
#define COPY_ACTIVE_TABLE() do{ for (uint8_t i = 0; i < 6; ++i) work_table[i] = active_table[i]; }while(0)
|
||||||
|
|
||||||
#define PWM_MR0 19999 // base repetition rate minus one count - 20mS
|
#define PWM_MR0 19999 // base repetition rate minus one count - 20mS
|
||||||
#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output
|
#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output
|
||||||
|
|||||||
@@ -168,7 +168,6 @@ const G2_PinDescription G2_g_APinDescription[] = {
|
|||||||
{ PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52
|
{ PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52
|
||||||
{ PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53
|
{ PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53
|
||||||
|
|
||||||
|
|
||||||
// 54 .. 65 - Analog pins
|
// 54 .. 65 - Analog pins
|
||||||
// ----------------------
|
// ----------------------
|
||||||
{ PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0
|
{ PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0
|
||||||
|
|||||||
@@ -20,7 +20,3 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
|
||||||
#error "Sorry! TFT displays are not available for HAL/DUE."
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -23,6 +23,6 @@
|
|||||||
|
|
||||||
#if USE_FALLBACK_EEPROM
|
#if USE_FALLBACK_EEPROM
|
||||||
#define FLASH_EEPROM_EMULATION
|
#define FLASH_EEPROM_EMULATION
|
||||||
#elif EITHER(I2C_EEPROM, SPI_EEPROM)
|
#elif ANY(I2C_EEPROM, SPI_EEPROM)
|
||||||
#define USE_SHARED_EEPROM 1
|
#define USE_SHARED_EEPROM 1
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2024 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
@@ -25,6 +25,34 @@
|
|||||||
* Test Arduino Due specific configuration values for errors at compile-time.
|
* Test Arduino Due specific configuration values for errors at compile-time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if HAS_SPI_TFT || HAS_FSMC_TFT
|
||||||
|
#error "Sorry! TFT displays are not available for HAL/DUE."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for common serial pin conflicts
|
||||||
|
*/
|
||||||
|
#define CHECK_SERIAL_PIN(N) ( \
|
||||||
|
X_STOP_PIN == N || Y_STOP_PIN == N || Z_STOP_PIN == N \
|
||||||
|
|| X_MIN_PIN == N || Y_MIN_PIN == N || Z_MIN_PIN == N \
|
||||||
|
|| X_MAX_PIN == N || Y_MAX_PIN == N || Z_MAX_PIN == N \
|
||||||
|
|| X_STEP_PIN == N || Y_STEP_PIN == N || Z_STEP_PIN == N \
|
||||||
|
|| X_DIR_PIN == N || Y_DIR_PIN == N || Z_DIR_PIN == N \
|
||||||
|
|| X_ENA_PIN == N || Y_ENA_PIN == N || Z_ENA_PIN == N \
|
||||||
|
)
|
||||||
|
#if SERIAL_IN_USE(0) // D0-D1. No known conflicts.
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(1) && (CHECK_SERIAL_PIN(18) || CHECK_SERIAL_PIN(19))
|
||||||
|
#error "Serial Port 1 pin D18 and/or D19 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(2) && (CHECK_SERIAL_PIN(16) || CHECK_SERIAL_PIN(17))
|
||||||
|
#error "Serial Port 2 pin D16 and/or D17 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#if SERIAL_IN_USE(3) && (CHECK_SERIAL_PIN(14) || CHECK_SERIAL_PIN(15))
|
||||||
|
#error "Serial Port 3 pin D14 and/or D15 conflicts with another pin on the board."
|
||||||
|
#endif
|
||||||
|
#undef CHECK_SERIAL_PIN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HARDWARE VS. SOFTWARE SPI COMPATIBILITY
|
* HARDWARE VS. SOFTWARE SPI COMPATIBILITY
|
||||||
*
|
*
|
||||||
@@ -40,20 +68,20 @@
|
|||||||
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
* Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time
|
||||||
* as the TMC2130 soft SPI the most common setup.
|
* as the TMC2130 soft SPI the most common setup.
|
||||||
*/
|
*/
|
||||||
#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == SD_MOSI_PIN || TMC_SW_##P == SD_MISO_PIN || TMC_SW_##P == SD_SCK_PIN))
|
#define _IS_HW_SPI(P) (defined(TMC_SPI_##P) && (TMC_SPI_##P == SD_MOSI_PIN || TMC_SPI_##P == SD_MISO_PIN || TMC_SPI_##P == SD_SCK_PIN))
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130)
|
#if HAS_MEDIA && HAS_DRIVER(TMC2130)
|
||||||
#if ENABLED(TMC_USE_SW_SPI)
|
#if ENABLED(TMC_USE_SW_SPI)
|
||||||
#if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK))
|
#if DISABLED(SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK))
|
||||||
#error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs."
|
#error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs."
|
||||||
#endif
|
#endif
|
||||||
#elif ENABLED(DUE_SOFTWARE_SPI)
|
#elif ENABLED(SOFTWARE_SPI)
|
||||||
#error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix."
|
#error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix."
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
|
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
|
||||||
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE."
|
#error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported for HAL/DUE."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_TMC_SW_SERIAL
|
#if HAS_TMC_SW_SERIAL
|
||||||
|
|||||||
@@ -64,13 +64,12 @@
|
|||||||
#define NUMBER_PINS_TOTAL PINS_COUNT
|
#define NUMBER_PINS_TOTAL PINS_COUNT
|
||||||
|
|
||||||
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
|
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
|
||||||
#define PRINT_PORT(p)
|
|
||||||
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
#define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
#define GET_ARRAY_PIN(p) pin_array[p].pin
|
||||||
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital
|
||||||
#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0)
|
#define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
|
||||||
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
|
#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0))
|
||||||
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||||
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
||||||
@@ -86,7 +85,6 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|
|||||||
|| pwm_status(pin));
|
|| pwm_status(pin));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pwm_details(int32_t pin) {
|
void pwm_details(int32_t pin) {
|
||||||
if (pwm_status(pin)) {
|
if (pwm_status(pin)) {
|
||||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||||
@@ -94,6 +92,8 @@ void pwm_details(int32_t pin) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void print_port(const pin_t) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DUE Board pin | PORT | Label
|
* DUE Board pin | PORT | Label
|
||||||
* ----------------+--------+-------
|
* ----------------+--------+-------
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
#define SD_MOSI_PIN 75
|
#define SD_MOSI_PIN 75
|
||||||
#else
|
#else
|
||||||
// defaults
|
// defaults
|
||||||
#define DUE_SOFTWARE_SPI
|
#define SOFTWARE_SPI
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SD_SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
* Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -89,10 +89,17 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
|||||||
NVIC_SetPriority(irq, timer_config[timer_num].priority);
|
NVIC_SetPriority(irq, timer_config[timer_num].priority);
|
||||||
|
|
||||||
// wave mode, reset counter on match with RC,
|
// wave mode, reset counter on match with RC,
|
||||||
TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1);
|
TC_Configure(tc, channel,
|
||||||
|
TC_CMR_WAVE
|
||||||
|
| TC_CMR_WAVSEL_UP_RC
|
||||||
|
| (HAL_TIMER_PRESCALER == 2 ? TC_CMR_TCCLKS_TIMER_CLOCK1 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 8 ? TC_CMR_TCCLKS_TIMER_CLOCK2 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 32 ? TC_CMR_TCCLKS_TIMER_CLOCK3 : 0)
|
||||||
|
| (HAL_TIMER_PRESCALER == 128 ? TC_CMR_TCCLKS_TIMER_CLOCK4 : 0)
|
||||||
|
);
|
||||||
|
|
||||||
// Set compare value
|
// Set compare value
|
||||||
TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency);
|
TC_SetRC(tc, channel, VARIANT_MCK / (HAL_TIMER_PRESCALER) / frequency);
|
||||||
|
|
||||||
// And start timer
|
// And start timer
|
||||||
TC_Start(tc, channel);
|
TC_Start(tc, channel);
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* Marlin 3D Printer Firmware
|
* Marlin 3D Printer Firmware
|
||||||
*
|
|
||||||
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
* Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -35,7 +36,8 @@
|
|||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
#define HAL_TIMER_PRESCALER 2
|
||||||
|
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
||||||
|
|
||||||
#ifndef MF_TIMER_STEP
|
#ifndef MF_TIMER_STEP
|
||||||
#define MF_TIMER_STEP 2 // Timer Index for Stepper
|
#define MF_TIMER_STEP 2 // Timer Index for Stepper
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* Marlin 3D Printer Firmware
|
||||||
|
* Copyright (c) 2023 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||||
|
*
|
||||||
|
* Based on Sprinter and grbl.
|
||||||
|
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DUE (SAM3X8E) LCD-specific defines
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
||||||
|
uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
||||||
|
uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);
|
||||||
|
|
||||||
|
#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_DUE_sw_spi_fn
|
||||||
|
#define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_DUE_shared_hw_spi_fn
|
||||||
|
#define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_DUE_ST7920_sw_spi_fn
|
||||||
+2
-2
@@ -81,7 +81,7 @@ Pio *SCK_pPio, *MOSI_pPio;
|
|||||||
uint32_t SCK_dwMask, MOSI_dwMask;
|
uint32_t SCK_dwMask, MOSI_dwMask;
|
||||||
|
|
||||||
void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
|
void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
MOSI_pPio->PIO_SODR = MOSI_dwMask;
|
MOSI_pPio->PIO_SODR = MOSI_dwMask;
|
||||||
else
|
else
|
||||||
@@ -95,7 +95,7 @@ void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz
|
|||||||
}
|
}
|
||||||
|
|
||||||
void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
|
void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
|
||||||
LOOP_L_N(i, 8) {
|
for (uint8_t i = 0; i < 8; ++i) {
|
||||||
SCK_pPio->PIO_CODR = SCK_dwMask;
|
SCK_pPio->PIO_CODR = SCK_dwMask;
|
||||||
DELAY_NS(50);
|
DELAY_NS(50);
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
@@ -6,14 +6,14 @@
|
|||||||
#
|
#
|
||||||
import pioutil
|
import pioutil
|
||||||
if pioutil.is_pio_build():
|
if pioutil.is_pio_build():
|
||||||
import platform
|
import platform
|
||||||
current_OS = platform.system()
|
current_OS = platform.system()
|
||||||
|
|
||||||
if current_OS == 'Windows':
|
if current_OS == 'Windows':
|
||||||
|
|
||||||
Import("env")
|
Import("env")
|
||||||
|
|
||||||
# Use bossac.exe on Windows
|
# Use bossac.exe on Windows
|
||||||
env.Replace(
|
env.Replace(
|
||||||
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
|
UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# USB Files Source Documentation
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
We sourced the USB files in Marlin from the Atmel ASF (Advanced Software Framework). The framework provides a variety of examples which were utilized in this project.
|
||||||
|
|
||||||
|
Atmel doesn't provide these files in a source repository but they can be extracted from ASF, which can be downloaded from Atmel.
|
||||||
|
|
||||||
|
[Advanced Software Framework](https://www.microchip.com/en-us/tools-resources/develop/libraries/advanced-software-framework)
|
||||||
|
|
||||||
|
## Modifications
|
||||||
|
|
||||||
|
The files are mostly unmodified except for minor cosmetic changes but some more significant changes were needed.
|
||||||
|
|
||||||
|
The changes that prompted the addition of this README file are listed below. Other changes may have been made prior to this.
|
||||||
|
|
||||||
|
1. Modified `uotghs_device_due.c` to resolve race conditions that could leave interrupts asserted when freezing the peripheral clock, resulting in hangs and watchdog resets due to the ensuing interrupt storm.
|
||||||
|
|
||||||
|
## Version Information
|
||||||
|
|
||||||
|
We don't know the exact version of ASF used as the source. However, the copyright information in the files indicates they are from 2015.
|
||||||
|
|
||||||
|
## Upgrade Considerations
|
||||||
|
|
||||||
|
We looked at the ASF 3.52.0 files released in 2022 but saw no immediate benefits to justify an upgrade. It's important to note that the files in Marlin don't follow the same folder structure as the files in ASF, which complicates the process of comparing and applying updated files.
|
||||||
|
|
||||||
|
When these files are updated it's important to carefully compare them to Marlin's versions so any improvements in the Marlin sources are brought forward.
|
||||||
|
|
||||||
|
It would be best to make Marlin's directory structure align with ASF or at least document the source of each file to ease future updates.
|
||||||
@@ -142,7 +142,6 @@
|
|||||||
*/
|
*/
|
||||||
#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
|
#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Set aligned boundary.
|
* \brief Set aligned boundary.
|
||||||
*/
|
*/
|
||||||
@@ -283,7 +282,6 @@ typedef double F64; //!< 64-bit floating-point number.
|
|||||||
typedef uint32_t iram_size_t;
|
typedef uint32_t iram_size_t;
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Status Types
|
/*! \name Status Types
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -291,7 +289,6 @@ typedef bool Status_bool_t; //!< Boolean status.
|
|||||||
typedef U8 Status_t; //!< 8-bit-coded status.
|
typedef U8 Status_t; //!< 8-bit-coded status.
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Aliasing Aggregate Types
|
/*! \name Aliasing Aggregate Types
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -462,7 +459,6 @@ typedef struct
|
|||||||
#endif
|
#endif
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__ // not for assembling.
|
#ifndef __ASSEMBLY__ // not for assembling.
|
||||||
|
|
||||||
//! \name Optimization Control
|
//! \name Optimization Control
|
||||||
@@ -581,7 +577,6 @@ typedef struct
|
|||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Zero-Bit Counting
|
/*! \name Zero-Bit Counting
|
||||||
*
|
*
|
||||||
* Under GCC, __builtin_clz and __builtin_ctz behave like macros when
|
* Under GCC, __builtin_clz and __builtin_ctz behave like macros when
|
||||||
@@ -692,7 +687,6 @@ typedef struct
|
|||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Bit Reversing
|
/*! \name Bit Reversing
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -732,7 +726,6 @@ typedef struct
|
|||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Alignment
|
/*! \name Alignment
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -798,7 +791,6 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
#define Long_call(addr) ((*(void (*)(void))(addr))())
|
#define Long_call(addr) ((*(void (*)(void))(addr))())
|
||||||
|
|
||||||
|
|
||||||
/*! \name MCU Endianism Handling
|
/*! \name MCU Endianism Handling
|
||||||
* ARM is MCU little endianism.
|
* ARM is MCU little endianism.
|
||||||
*/
|
*/
|
||||||
@@ -868,7 +860,6 @@ typedef struct
|
|||||||
#define CPU_TO_BE32(x) swap32(x)
|
#define CPU_TO_BE32(x) swap32(x)
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Endianism Conversion
|
/*! \name Endianism Conversion
|
||||||
*
|
*
|
||||||
* The same considerations as for clz and ctz apply here but GCC's
|
* The same considerations as for clz and ctz apply here but GCC's
|
||||||
@@ -955,7 +946,6 @@ typedef struct
|
|||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Target Abstraction
|
/*! \name Target Abstraction
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -997,7 +987,6 @@ typedef U8 Byte; //!< 8-bit unsigned integer.
|
|||||||
|
|
||||||
#endif // #ifndef __ASSEMBLY__
|
#endif // #ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
||||||
#ifdef __ICCARM__
|
#ifdef __ICCARM__
|
||||||
#define SHORTENUM __packed
|
#define SHORTENUM __packed
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
@@ -1059,7 +1048,7 @@ static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data)
|
|||||||
while (val_index < 8)
|
while (val_index < 8)
|
||||||
{
|
{
|
||||||
data[val_index++] = value & 0xFF;
|
data[val_index++] = value & 0xFF;
|
||||||
value = value >> 8;
|
value >>= 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,7 +81,6 @@
|
|||||||
#define LUN_0_NAME "\"SD/MMC Card\""
|
#define LUN_0_NAME "\"SD/MMC Card\""
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
/*! \name Actions Associated with Memory Accesses
|
/*! \name Actions Associated with Memory Accesses
|
||||||
*
|
*
|
||||||
* Write here the action to associate with each memory access.
|
* Write here the action to associate with each memory access.
|
||||||
@@ -112,5 +111,4 @@
|
|||||||
#define GLOBAL_WR_PROTECT false //!< Management of a global write protection.
|
#define GLOBAL_WR_PROTECT false //!< Management of a global write protection.
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
#endif // _CONF_ACCESS_H_
|
#endif // _CONF_ACCESS_H_
|
||||||
|
|||||||
@@ -96,5 +96,4 @@
|
|||||||
// - UPLL frequency: 480MHz
|
// - UPLL frequency: 480MHz
|
||||||
// - USB clock: 480 / 1 = 480MHz
|
// - USB clock: 480 / 1 = 480MHz
|
||||||
|
|
||||||
|
|
||||||
#endif /* CONF_CLOCK_H_INCLUDED */
|
#endif /* CONF_CLOCK_H_INCLUDED */
|
||||||
|
|||||||
@@ -88,7 +88,6 @@
|
|||||||
#endif
|
#endif
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* USB Device Callbacks definitions (Optional)
|
* USB Device Callbacks definitions (Optional)
|
||||||
* @{
|
* @{
|
||||||
@@ -101,7 +100,7 @@
|
|||||||
#define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests()
|
#define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests()
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if HAS_MEDIA
|
||||||
/**
|
/**
|
||||||
* USB Device low level configuration
|
* USB Device low level configuration
|
||||||
* When only one interface is used, these configurations are defined by the class module.
|
* When only one interface is used, these configurations are defined by the class module.
|
||||||
@@ -150,7 +149,6 @@
|
|||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* USB Interface Configuration
|
* USB Interface Configuration
|
||||||
* @{
|
* @{
|
||||||
@@ -185,7 +183,7 @@
|
|||||||
//! Enable id string of interface to add an extra USB string
|
//! Enable id string of interface to add an extra USB string
|
||||||
#define UDI_CDC_IAD_STRING_ID 4
|
#define UDI_CDC_IAD_STRING_ID 4
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if HAS_MEDIA
|
||||||
/**
|
/**
|
||||||
* USB CDC low level configuration
|
* USB CDC low level configuration
|
||||||
* In standalone these configurations are defined by the CDC module.
|
* In standalone these configurations are defined by the CDC module.
|
||||||
@@ -210,7 +208,6 @@
|
|||||||
//@}
|
//@}
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration of MSC interface
|
* Configuration of MSC interface
|
||||||
* @{
|
* @{
|
||||||
@@ -245,7 +242,6 @@
|
|||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description of Composite Device
|
* Description of Composite Device
|
||||||
* @{
|
* @{
|
||||||
|
|||||||
@@ -68,7 +68,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "ctrl_access.h"
|
#include "ctrl_access.h"
|
||||||
|
|
||||||
|
|
||||||
//_____ D E F I N I T I O N S ______________________________________________
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
#ifdef FREERTOS_USED
|
#ifdef FREERTOS_USED
|
||||||
@@ -112,7 +111,6 @@ static xSemaphoreHandle ctrl_access_semphr = NULL;
|
|||||||
|
|
||||||
#endif // FREERTOS_USED
|
#endif // FREERTOS_USED
|
||||||
|
|
||||||
|
|
||||||
#if MAX_LUN
|
#if MAX_LUN
|
||||||
|
|
||||||
/*! \brief Initializes an entry of the LUN descriptor table.
|
/*! \brief Initializes an entry of the LUN descriptor table.
|
||||||
@@ -242,17 +240,14 @@ static const struct
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if GLOBAL_WR_PROTECT == true
|
#if GLOBAL_WR_PROTECT == true
|
||||||
bool g_wr_protect;
|
bool g_wr_protect;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*! \name Control Interface
|
/*! \name Control Interface
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
#ifdef FREERTOS_USED
|
#ifdef FREERTOS_USED
|
||||||
|
|
||||||
bool ctrl_access_init(void)
|
bool ctrl_access_init(void)
|
||||||
@@ -270,7 +265,6 @@ bool ctrl_access_init(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Locks accesses to LUNs.
|
/*! \brief Locks accesses to LUNs.
|
||||||
*
|
*
|
||||||
* \return \c true if the access was successfully locked, else \c false.
|
* \return \c true if the access was successfully locked, else \c false.
|
||||||
@@ -288,7 +282,6 @@ static bool ctrl_access_lock(void)
|
|||||||
|
|
||||||
#endif // FREERTOS_USED
|
#endif // FREERTOS_USED
|
||||||
|
|
||||||
|
|
||||||
U8 get_nb_lun(void)
|
U8 get_nb_lun(void)
|
||||||
{
|
{
|
||||||
#if MEM_USB == ENABLE
|
#if MEM_USB == ENABLE
|
||||||
@@ -309,13 +302,11 @@ U8 get_nb_lun(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
U8 get_cur_lun(void)
|
U8 get_cur_lun(void)
|
||||||
{
|
{
|
||||||
return LUN_ID_0;
|
return LUN_ID_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status mem_test_unit_ready(U8 lun)
|
Ctrl_status mem_test_unit_ready(U8 lun)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -337,7 +328,6 @@ Ctrl_status mem_test_unit_ready(U8 lun)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector)
|
Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -359,7 +349,6 @@ Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
U8 mem_sector_size(U8 lun)
|
U8 mem_sector_size(U8 lun)
|
||||||
{
|
{
|
||||||
U8 sector_size;
|
U8 sector_size;
|
||||||
@@ -381,7 +370,6 @@ U8 mem_sector_size(U8 lun)
|
|||||||
return sector_size;
|
return sector_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool mem_unload(U8 lun, bool unload)
|
bool mem_unload(U8 lun, bool unload)
|
||||||
{
|
{
|
||||||
bool unloaded;
|
bool unloaded;
|
||||||
@@ -433,7 +421,6 @@ bool mem_wr_protect(U8 lun)
|
|||||||
return wr_protect;
|
return wr_protect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool mem_removal(U8 lun)
|
bool mem_removal(U8 lun)
|
||||||
{
|
{
|
||||||
bool removal;
|
bool removal;
|
||||||
@@ -458,7 +445,6 @@ bool mem_removal(U8 lun)
|
|||||||
return removal;
|
return removal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *mem_name(U8 lun)
|
const char *mem_name(U8 lun)
|
||||||
{
|
{
|
||||||
#if MAX_LUN==0
|
#if MAX_LUN==0
|
||||||
@@ -475,17 +461,14 @@ const char *mem_name(U8 lun)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
|
|
||||||
/*! \name MEM <-> USB Interface
|
/*! \name MEM <-> USB Interface
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector)
|
Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -505,7 +488,6 @@ Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector)
|
Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -525,19 +507,16 @@ Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
#endif // ACCESS_USB == true
|
#endif // ACCESS_USB == true
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_MEM_TO_RAM == true
|
#if ACCESS_MEM_TO_RAM == true
|
||||||
|
|
||||||
/*! \name MEM <-> RAM Interface
|
/*! \name MEM <-> RAM Interface
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram)
|
Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -564,7 +543,6 @@ Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram)
|
Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram)
|
||||||
{
|
{
|
||||||
Ctrl_status status;
|
Ctrl_status status;
|
||||||
@@ -591,19 +569,16 @@ Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
#endif // ACCESS_MEM_TO_RAM == true
|
#endif // ACCESS_MEM_TO_RAM == true
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_STREAM == true
|
#if ACCESS_STREAM == true
|
||||||
|
|
||||||
/*! \name Streaming MEM <-> MEM Interface
|
/*! \name Streaming MEM <-> MEM Interface
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_MEM_TO_MEM == true
|
#if ACCESS_MEM_TO_MEM == true
|
||||||
|
|
||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
@@ -625,21 +600,18 @@ Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_ad
|
|||||||
|
|
||||||
#endif // ACCESS_MEM_TO_MEM == true
|
#endif // ACCESS_MEM_TO_MEM == true
|
||||||
|
|
||||||
|
|
||||||
Ctrl_status stream_state(U8 id)
|
Ctrl_status stream_state(U8 id)
|
||||||
{
|
{
|
||||||
UNUSED(id);
|
UNUSED(id);
|
||||||
return CTRL_GOOD;
|
return CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
U16 stream_stop(U8 id)
|
U16 stream_stop(U8 id)
|
||||||
{
|
{
|
||||||
UNUSED(id);
|
UNUSED(id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
#endif // ACCESS_STREAM
|
#endif // ACCESS_STREAM
|
||||||
|
|||||||
@@ -56,7 +56,6 @@
|
|||||||
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _CTRL_ACCESS_H_
|
#ifndef _CTRL_ACCESS_H_
|
||||||
#define _CTRL_ACCESS_H_
|
#define _CTRL_ACCESS_H_
|
||||||
|
|
||||||
@@ -89,7 +88,6 @@ typedef enum
|
|||||||
CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed.
|
CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed.
|
||||||
} Ctrl_status;
|
} Ctrl_status;
|
||||||
|
|
||||||
|
|
||||||
// FYI: Each Logical Unit Number (LUN) corresponds to a memory.
|
// FYI: Each Logical Unit Number (LUN) corresponds to a memory.
|
||||||
|
|
||||||
// Check LUN defines.
|
// Check LUN defines.
|
||||||
@@ -136,7 +134,6 @@ typedef enum
|
|||||||
#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage).
|
#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage).
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
// Include LUN header files.
|
// Include LUN header files.
|
||||||
#if LUN_0 == ENABLE
|
#if LUN_0 == ENABLE
|
||||||
#include LUN_0_INCLUDE
|
#include LUN_0_INCLUDE
|
||||||
@@ -166,13 +163,11 @@ typedef enum
|
|||||||
#include LUN_USB_INCLUDE
|
#include LUN_USB_INCLUDE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Check the configuration of write protection in conf_access.h.
|
// Check the configuration of write protection in conf_access.h.
|
||||||
#ifndef GLOBAL_WR_PROTECT
|
#ifndef GLOBAL_WR_PROTECT
|
||||||
#error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h
|
#error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if GLOBAL_WR_PROTECT == true
|
#if GLOBAL_WR_PROTECT == true
|
||||||
|
|
||||||
//! Write protect.
|
//! Write protect.
|
||||||
@@ -180,7 +175,6 @@ extern bool g_wr_protect;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*! \name Control Interface
|
/*! \name Control Interface
|
||||||
*/
|
*/
|
||||||
//! @{
|
//! @{
|
||||||
@@ -279,7 +273,6 @@ extern const char *mem_name(U8 lun);
|
|||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
|
|
||||||
/*! \name MEM <-> USB Interface
|
/*! \name MEM <-> USB Interface
|
||||||
@@ -310,7 +303,6 @@ extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector);
|
|||||||
|
|
||||||
#endif // ACCESS_USB == true
|
#endif // ACCESS_USB == true
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_MEM_TO_RAM == true
|
#if ACCESS_MEM_TO_RAM == true
|
||||||
|
|
||||||
/*! \name MEM <-> RAM Interface
|
/*! \name MEM <-> RAM Interface
|
||||||
@@ -341,7 +333,6 @@ extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram);
|
|||||||
|
|
||||||
#endif // ACCESS_MEM_TO_RAM == true
|
#endif // ACCESS_MEM_TO_RAM == true
|
||||||
|
|
||||||
|
|
||||||
#if ACCESS_STREAM == true
|
#if ACCESS_STREAM == true
|
||||||
|
|
||||||
/*! \name Streaming MEM <-> MEM Interface
|
/*! \name Streaming MEM <-> MEM Interface
|
||||||
|
|||||||
+125
-139
@@ -74,17 +74,17 @@ extern "C" {
|
|||||||
//@{
|
//@{
|
||||||
|
|
||||||
enum genclk_source {
|
enum genclk_source {
|
||||||
GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock
|
GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock
|
GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock
|
GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock
|
GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock
|
GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock
|
GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock
|
GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock
|
GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock
|
||||||
GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock
|
GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock
|
||||||
GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock
|
GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock
|
||||||
GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock
|
GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock
|
||||||
};
|
};
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
@@ -93,176 +93,162 @@ enum genclk_source {
|
|||||||
//@{
|
//@{
|
||||||
|
|
||||||
enum genclk_divider {
|
enum genclk_divider {
|
||||||
GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1
|
GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1
|
||||||
GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2
|
GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2
|
||||||
GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4
|
GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4
|
||||||
GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8
|
GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8
|
||||||
GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16
|
GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16
|
||||||
GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32
|
GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32
|
||||||
GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64
|
GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64
|
||||||
};
|
};
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
struct genclk_config {
|
struct genclk_config {
|
||||||
uint32_t ctrl;
|
uint32_t ctrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void genclk_config_defaults(struct genclk_config *p_cfg,
|
static inline void genclk_config_defaults(struct genclk_config *p_cfg, uint32_t ul_id) {
|
||||||
uint32_t ul_id)
|
ul_id = ul_id;
|
||||||
{
|
p_cfg->ctrl = 0;
|
||||||
ul_id = ul_id;
|
|
||||||
p_cfg->ctrl = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void genclk_config_read(struct genclk_config *p_cfg,
|
static inline void genclk_config_read(struct genclk_config *p_cfg, uint32_t ul_id) {
|
||||||
uint32_t ul_id)
|
p_cfg->ctrl = PMC->PMC_PCK[ul_id];
|
||||||
{
|
|
||||||
p_cfg->ctrl = PMC->PMC_PCK[ul_id];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void genclk_config_write(const struct genclk_config *p_cfg,
|
static inline void genclk_config_write(const struct genclk_config *p_cfg, uint32_t ul_id) {
|
||||||
uint32_t ul_id)
|
PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
|
||||||
{
|
|
||||||
PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \name Programmable Clock Source and Prescaler configuration
|
//! \name Programmable Clock Source and Prescaler configuration
|
||||||
//@{
|
//@{
|
||||||
|
|
||||||
static inline void genclk_config_set_source(struct genclk_config *p_cfg,
|
static inline void genclk_config_set_source(struct genclk_config *p_cfg, enum genclk_source e_src) {
|
||||||
enum genclk_source e_src)
|
p_cfg->ctrl &= (~PMC_PCK_CSS_Msk);
|
||||||
{
|
|
||||||
p_cfg->ctrl &= (~PMC_PCK_CSS_Msk);
|
|
||||||
|
|
||||||
switch (e_src) {
|
switch (e_src) {
|
||||||
case GENCLK_PCK_SRC_SLCK_RC:
|
case GENCLK_PCK_SRC_SLCK_RC:
|
||||||
case GENCLK_PCK_SRC_SLCK_XTAL:
|
case GENCLK_PCK_SRC_SLCK_XTAL:
|
||||||
case GENCLK_PCK_SRC_SLCK_BYPASS:
|
case GENCLK_PCK_SRC_SLCK_BYPASS:
|
||||||
p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK);
|
p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_4M_RC:
|
case GENCLK_PCK_SRC_MAINCK_4M_RC:
|
||||||
case GENCLK_PCK_SRC_MAINCK_8M_RC:
|
case GENCLK_PCK_SRC_MAINCK_8M_RC:
|
||||||
case GENCLK_PCK_SRC_MAINCK_12M_RC:
|
case GENCLK_PCK_SRC_MAINCK_12M_RC:
|
||||||
case GENCLK_PCK_SRC_MAINCK_XTAL:
|
case GENCLK_PCK_SRC_MAINCK_XTAL:
|
||||||
case GENCLK_PCK_SRC_MAINCK_BYPASS:
|
case GENCLK_PCK_SRC_MAINCK_BYPASS:
|
||||||
p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK);
|
p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_PLLACK:
|
case GENCLK_PCK_SRC_PLLACK:
|
||||||
p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK);
|
p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_PLLBCK:
|
case GENCLK_PCK_SRC_PLLBCK:
|
||||||
p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK);
|
p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MCK:
|
case GENCLK_PCK_SRC_MCK:
|
||||||
p_cfg->ctrl |= (PMC_PCK_CSS_MCK);
|
p_cfg->ctrl |= (PMC_PCK_CSS_MCK);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void genclk_config_set_divider(struct genclk_config *p_cfg,
|
static inline void genclk_config_set_divider(struct genclk_config *p_cfg, uint32_t e_divider) {
|
||||||
uint32_t e_divider)
|
p_cfg->ctrl &= ~PMC_PCK_PRES_Msk;
|
||||||
{
|
p_cfg->ctrl |= e_divider;
|
||||||
p_cfg->ctrl &= ~PMC_PCK_PRES_Msk;
|
|
||||||
p_cfg->ctrl |= e_divider;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
static inline void genclk_enable(const struct genclk_config *p_cfg,
|
static inline void genclk_enable(const struct genclk_config *p_cfg, uint32_t ul_id) {
|
||||||
uint32_t ul_id)
|
PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
|
||||||
{
|
pmc_enable_pck(ul_id);
|
||||||
PMC->PMC_PCK[ul_id] = p_cfg->ctrl;
|
|
||||||
pmc_enable_pck(ul_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void genclk_disable(uint32_t ul_id)
|
static inline void genclk_disable(uint32_t ul_id) {
|
||||||
{
|
pmc_disable_pck(ul_id);
|
||||||
pmc_disable_pck(ul_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void genclk_enable_source(enum genclk_source e_src)
|
static inline void genclk_enable_source(enum genclk_source e_src) {
|
||||||
{
|
switch (e_src) {
|
||||||
switch (e_src) {
|
case GENCLK_PCK_SRC_SLCK_RC:
|
||||||
case GENCLK_PCK_SRC_SLCK_RC:
|
if (!osc_is_ready(OSC_SLCK_32K_RC)) {
|
||||||
if (!osc_is_ready(OSC_SLCK_32K_RC)) {
|
osc_enable(OSC_SLCK_32K_RC);
|
||||||
osc_enable(OSC_SLCK_32K_RC);
|
osc_wait_ready(OSC_SLCK_32K_RC);
|
||||||
osc_wait_ready(OSC_SLCK_32K_RC);
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_SLCK_XTAL:
|
case GENCLK_PCK_SRC_SLCK_XTAL:
|
||||||
if (!osc_is_ready(OSC_SLCK_32K_XTAL)) {
|
if (!osc_is_ready(OSC_SLCK_32K_XTAL)) {
|
||||||
osc_enable(OSC_SLCK_32K_XTAL);
|
osc_enable(OSC_SLCK_32K_XTAL);
|
||||||
osc_wait_ready(OSC_SLCK_32K_XTAL);
|
osc_wait_ready(OSC_SLCK_32K_XTAL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_SLCK_BYPASS:
|
case GENCLK_PCK_SRC_SLCK_BYPASS:
|
||||||
if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) {
|
if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) {
|
||||||
osc_enable(OSC_SLCK_32K_BYPASS);
|
osc_enable(OSC_SLCK_32K_BYPASS);
|
||||||
osc_wait_ready(OSC_SLCK_32K_BYPASS);
|
osc_wait_ready(OSC_SLCK_32K_BYPASS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_4M_RC:
|
case GENCLK_PCK_SRC_MAINCK_4M_RC:
|
||||||
if (!osc_is_ready(OSC_MAINCK_4M_RC)) {
|
if (!osc_is_ready(OSC_MAINCK_4M_RC)) {
|
||||||
osc_enable(OSC_MAINCK_4M_RC);
|
osc_enable(OSC_MAINCK_4M_RC);
|
||||||
osc_wait_ready(OSC_MAINCK_4M_RC);
|
osc_wait_ready(OSC_MAINCK_4M_RC);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_8M_RC:
|
case GENCLK_PCK_SRC_MAINCK_8M_RC:
|
||||||
if (!osc_is_ready(OSC_MAINCK_8M_RC)) {
|
if (!osc_is_ready(OSC_MAINCK_8M_RC)) {
|
||||||
osc_enable(OSC_MAINCK_8M_RC);
|
osc_enable(OSC_MAINCK_8M_RC);
|
||||||
osc_wait_ready(OSC_MAINCK_8M_RC);
|
osc_wait_ready(OSC_MAINCK_8M_RC);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_12M_RC:
|
case GENCLK_PCK_SRC_MAINCK_12M_RC:
|
||||||
if (!osc_is_ready(OSC_MAINCK_12M_RC)) {
|
if (!osc_is_ready(OSC_MAINCK_12M_RC)) {
|
||||||
osc_enable(OSC_MAINCK_12M_RC);
|
osc_enable(OSC_MAINCK_12M_RC);
|
||||||
osc_wait_ready(OSC_MAINCK_12M_RC);
|
osc_wait_ready(OSC_MAINCK_12M_RC);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_XTAL:
|
case GENCLK_PCK_SRC_MAINCK_XTAL:
|
||||||
if (!osc_is_ready(OSC_MAINCK_XTAL)) {
|
if (!osc_is_ready(OSC_MAINCK_XTAL)) {
|
||||||
osc_enable(OSC_MAINCK_XTAL);
|
osc_enable(OSC_MAINCK_XTAL);
|
||||||
osc_wait_ready(OSC_MAINCK_XTAL);
|
osc_wait_ready(OSC_MAINCK_XTAL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MAINCK_BYPASS:
|
case GENCLK_PCK_SRC_MAINCK_BYPASS:
|
||||||
if (!osc_is_ready(OSC_MAINCK_BYPASS)) {
|
if (!osc_is_ready(OSC_MAINCK_BYPASS)) {
|
||||||
osc_enable(OSC_MAINCK_BYPASS);
|
osc_enable(OSC_MAINCK_BYPASS);
|
||||||
osc_wait_ready(OSC_MAINCK_BYPASS);
|
osc_wait_ready(OSC_MAINCK_BYPASS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_PLL0_SOURCE
|
#ifdef CONFIG_PLL0_SOURCE
|
||||||
case GENCLK_PCK_SRC_PLLACK:
|
case GENCLK_PCK_SRC_PLLACK:
|
||||||
pll_enable_config_defaults(0);
|
pll_enable_config_defaults(0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PLL1_SOURCE
|
#ifdef CONFIG_PLL1_SOURCE
|
||||||
case GENCLK_PCK_SRC_PLLBCK:
|
case GENCLK_PCK_SRC_PLLBCK:
|
||||||
pll_enable_config_defaults(1);
|
pll_enable_config_defaults(1);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case GENCLK_PCK_SRC_MCK:
|
case GENCLK_PCK_SRC_MCK:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Assert(false);
|
Assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|||||||
@@ -57,7 +57,6 @@
|
|||||||
|
|
||||||
#include "preprocessor.h"
|
#include "preprocessor.h"
|
||||||
|
|
||||||
|
|
||||||
//! Maximal number of repetitions supported by MREPEAT.
|
//! Maximal number of repetitions supported by MREPEAT.
|
||||||
#define MREPEAT_LIMIT 256
|
#define MREPEAT_LIMIT 256
|
||||||
|
|
||||||
|
|||||||
+97
-104
@@ -62,28 +62,28 @@ extern "C" {
|
|||||||
* should be defined by the board code, otherwise default value are used.
|
* should be defined by the board code, otherwise default value are used.
|
||||||
*/
|
*/
|
||||||
#ifndef BOARD_FREQ_SLCK_XTAL
|
#ifndef BOARD_FREQ_SLCK_XTAL
|
||||||
# warning The board slow clock xtal frequency has not been defined.
|
#warning The board slow clock xtal frequency has not been defined.
|
||||||
# define BOARD_FREQ_SLCK_XTAL (32768UL)
|
#define BOARD_FREQ_SLCK_XTAL (32768UL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOARD_FREQ_SLCK_BYPASS
|
#ifndef BOARD_FREQ_SLCK_BYPASS
|
||||||
# warning The board slow clock bypass frequency has not been defined.
|
#warning The board slow clock bypass frequency has not been defined.
|
||||||
# define BOARD_FREQ_SLCK_BYPASS (32768UL)
|
#define BOARD_FREQ_SLCK_BYPASS (32768UL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOARD_FREQ_MAINCK_XTAL
|
#ifndef BOARD_FREQ_MAINCK_XTAL
|
||||||
# warning The board main clock xtal frequency has not been defined.
|
#warning The board main clock xtal frequency has not been defined.
|
||||||
# define BOARD_FREQ_MAINCK_XTAL (12000000UL)
|
#define BOARD_FREQ_MAINCK_XTAL (12000000UL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOARD_FREQ_MAINCK_BYPASS
|
#ifndef BOARD_FREQ_MAINCK_BYPASS
|
||||||
# warning The board main clock bypass frequency has not been defined.
|
#warning The board main clock bypass frequency has not been defined.
|
||||||
# define BOARD_FREQ_MAINCK_BYPASS (12000000UL)
|
#define BOARD_FREQ_MAINCK_BYPASS (12000000UL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef BOARD_OSC_STARTUP_US
|
#ifndef BOARD_OSC_STARTUP_US
|
||||||
# warning The board main clock xtal startup time has not been defined.
|
#warning The board main clock xtal startup time has not been defined.
|
||||||
# define BOARD_OSC_STARTUP_US (15625UL)
|
#define BOARD_OSC_STARTUP_US (15625UL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -115,122 +115,116 @@ extern "C" {
|
|||||||
#define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator.
|
#define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator.
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
static inline void osc_enable(uint32_t ul_id)
|
static inline void osc_enable(uint32_t ul_id) {
|
||||||
{
|
switch (ul_id) {
|
||||||
switch (ul_id) {
|
case OSC_SLCK_32K_RC:
|
||||||
case OSC_SLCK_32K_RC:
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case OSC_SLCK_32K_XTAL:
|
case OSC_SLCK_32K_XTAL:
|
||||||
pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL);
|
pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_SLCK_32K_BYPASS:
|
case OSC_SLCK_32K_BYPASS:
|
||||||
pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS);
|
pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OSC_MAINCK_4M_RC:
|
||||||
|
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz);
|
||||||
|
break;
|
||||||
|
|
||||||
case OSC_MAINCK_4M_RC:
|
case OSC_MAINCK_8M_RC:
|
||||||
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz);
|
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_MAINCK_8M_RC:
|
case OSC_MAINCK_12M_RC:
|
||||||
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz);
|
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_MAINCK_12M_RC:
|
case OSC_MAINCK_XTAL:
|
||||||
pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz);
|
pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*,
|
||||||
break;
|
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
|
||||||
|
OSC_SLCK_32K_RC_HZ)*/);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OSC_MAINCK_BYPASS:
|
||||||
case OSC_MAINCK_XTAL:
|
pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*,
|
||||||
pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*,
|
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
|
||||||
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
|
OSC_SLCK_32K_RC_HZ)*/);
|
||||||
OSC_SLCK_32K_RC_HZ)*/);
|
break;
|
||||||
break;
|
}
|
||||||
|
|
||||||
case OSC_MAINCK_BYPASS:
|
|
||||||
pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*,
|
|
||||||
pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US,
|
|
||||||
OSC_SLCK_32K_RC_HZ)*/);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void osc_disable(uint32_t ul_id)
|
static inline void osc_disable(uint32_t ul_id) {
|
||||||
{
|
switch (ul_id) {
|
||||||
switch (ul_id) {
|
case OSC_SLCK_32K_RC:
|
||||||
case OSC_SLCK_32K_RC:
|
case OSC_SLCK_32K_XTAL:
|
||||||
case OSC_SLCK_32K_XTAL:
|
case OSC_SLCK_32K_BYPASS:
|
||||||
case OSC_SLCK_32K_BYPASS:
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case OSC_MAINCK_4M_RC:
|
case OSC_MAINCK_4M_RC:
|
||||||
case OSC_MAINCK_8M_RC:
|
case OSC_MAINCK_8M_RC:
|
||||||
case OSC_MAINCK_12M_RC:
|
case OSC_MAINCK_12M_RC:
|
||||||
pmc_osc_disable_fastrc();
|
pmc_osc_disable_fastrc();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_MAINCK_XTAL:
|
case OSC_MAINCK_XTAL:
|
||||||
pmc_osc_disable_xtal(PMC_OSC_XTAL);
|
pmc_osc_disable_xtal(PMC_OSC_XTAL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSC_MAINCK_BYPASS:
|
case OSC_MAINCK_BYPASS:
|
||||||
pmc_osc_disable_xtal(PMC_OSC_BYPASS);
|
pmc_osc_disable_xtal(PMC_OSC_BYPASS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool osc_is_ready(uint32_t ul_id)
|
static inline bool osc_is_ready(uint32_t ul_id) {
|
||||||
{
|
switch (ul_id) {
|
||||||
switch (ul_id) {
|
case OSC_SLCK_32K_RC:
|
||||||
case OSC_SLCK_32K_RC:
|
return 1;
|
||||||
return 1;
|
|
||||||
|
|
||||||
case OSC_SLCK_32K_XTAL:
|
case OSC_SLCK_32K_XTAL:
|
||||||
case OSC_SLCK_32K_BYPASS:
|
case OSC_SLCK_32K_BYPASS:
|
||||||
return pmc_osc_is_ready_32kxtal();
|
return pmc_osc_is_ready_32kxtal();
|
||||||
|
|
||||||
case OSC_MAINCK_4M_RC:
|
case OSC_MAINCK_4M_RC:
|
||||||
case OSC_MAINCK_8M_RC:
|
case OSC_MAINCK_8M_RC:
|
||||||
case OSC_MAINCK_12M_RC:
|
case OSC_MAINCK_12M_RC:
|
||||||
case OSC_MAINCK_XTAL:
|
case OSC_MAINCK_XTAL:
|
||||||
case OSC_MAINCK_BYPASS:
|
case OSC_MAINCK_BYPASS:
|
||||||
return pmc_osc_is_ready_mainck();
|
return pmc_osc_is_ready_mainck();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t osc_get_rate(uint32_t ul_id)
|
static inline uint32_t osc_get_rate(uint32_t ul_id) {
|
||||||
{
|
switch (ul_id) {
|
||||||
switch (ul_id) {
|
case OSC_SLCK_32K_RC:
|
||||||
case OSC_SLCK_32K_RC:
|
return OSC_SLCK_32K_RC_HZ;
|
||||||
return OSC_SLCK_32K_RC_HZ;
|
|
||||||
|
|
||||||
case OSC_SLCK_32K_XTAL:
|
case OSC_SLCK_32K_XTAL:
|
||||||
return BOARD_FREQ_SLCK_XTAL;
|
return BOARD_FREQ_SLCK_XTAL;
|
||||||
|
|
||||||
case OSC_SLCK_32K_BYPASS:
|
case OSC_SLCK_32K_BYPASS:
|
||||||
return BOARD_FREQ_SLCK_BYPASS;
|
return BOARD_FREQ_SLCK_BYPASS;
|
||||||
|
|
||||||
case OSC_MAINCK_4M_RC:
|
case OSC_MAINCK_4M_RC:
|
||||||
return OSC_MAINCK_4M_RC_HZ;
|
return OSC_MAINCK_4M_RC_HZ;
|
||||||
|
|
||||||
case OSC_MAINCK_8M_RC:
|
case OSC_MAINCK_8M_RC:
|
||||||
return OSC_MAINCK_8M_RC_HZ;
|
return OSC_MAINCK_8M_RC_HZ;
|
||||||
|
|
||||||
case OSC_MAINCK_12M_RC:
|
case OSC_MAINCK_12M_RC:
|
||||||
return OSC_MAINCK_12M_RC_HZ;
|
return OSC_MAINCK_12M_RC_HZ;
|
||||||
|
|
||||||
case OSC_MAINCK_XTAL:
|
case OSC_MAINCK_XTAL:
|
||||||
return BOARD_FREQ_MAINCK_XTAL;
|
return BOARD_FREQ_MAINCK_XTAL;
|
||||||
|
|
||||||
case OSC_MAINCK_BYPASS:
|
case OSC_MAINCK_BYPASS:
|
||||||
return BOARD_FREQ_MAINCK_BYPASS;
|
return BOARD_FREQ_MAINCK_BYPASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -241,11 +235,10 @@ static inline uint32_t osc_get_rate(uint32_t ul_id)
|
|||||||
*
|
*
|
||||||
* \param id A number identifying the oscillator to wait for.
|
* \param id A number identifying the oscillator to wait for.
|
||||||
*/
|
*/
|
||||||
static inline void osc_wait_ready(uint8_t id)
|
static inline void osc_wait_ready(uint8_t id) {
|
||||||
{
|
while (!osc_is_ready(id)) {
|
||||||
while (!osc_is_ready(id)) {
|
/* Do nothing */
|
||||||
/* Do nothing */
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|||||||
+110
-128
@@ -77,22 +77,22 @@ extern "C" {
|
|||||||
#define PLL_COUNT 0x3FU
|
#define PLL_COUNT 0x3FU
|
||||||
|
|
||||||
enum pll_source {
|
enum pll_source {
|
||||||
PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator.
|
PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator.
|
||||||
PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator.
|
PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator.
|
||||||
PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator.
|
PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator.
|
||||||
PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator.
|
PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator.
|
||||||
PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator.
|
PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator.
|
||||||
PLL_NR_SOURCES, //!< Number of PLL sources.
|
PLL_NR_SOURCES, //!< Number of PLL sources.
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pll_config {
|
struct pll_config {
|
||||||
uint32_t ctrl;
|
uint32_t ctrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define pll_get_default_rate(pll_id) \
|
#define pll_get_default_rate(pll_id) \
|
||||||
((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \
|
((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \
|
||||||
* CONFIG_PLL##pll_id##_MUL) \
|
* CONFIG_PLL##pll_id##_MUL) \
|
||||||
/ CONFIG_PLL##pll_id##_DIV)
|
/ CONFIG_PLL##pll_id##_DIV)
|
||||||
|
|
||||||
/* Force UTMI PLL parameters (Hardware defined) */
|
/* Force UTMI PLL parameters (Hardware defined) */
|
||||||
#ifdef CONFIG_PLL1_SOURCE
|
#ifdef CONFIG_PLL1_SOURCE
|
||||||
@@ -113,145 +113,130 @@ struct pll_config {
|
|||||||
* is hidden in this implementation. Use mul as mul effective value.
|
* is hidden in this implementation. Use mul as mul effective value.
|
||||||
*/
|
*/
|
||||||
static inline void pll_config_init(struct pll_config *p_cfg,
|
static inline void pll_config_init(struct pll_config *p_cfg,
|
||||||
enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul)
|
enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) {
|
||||||
{
|
uint32_t vco_hz;
|
||||||
uint32_t vco_hz;
|
|
||||||
|
|
||||||
Assert(e_src < PLL_NR_SOURCES);
|
Assert(e_src < PLL_NR_SOURCES);
|
||||||
|
|
||||||
if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */
|
if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */
|
||||||
p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT);
|
p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT);
|
||||||
} else { /* PLLA */
|
}
|
||||||
/* Calculate internal VCO frequency */
|
else { /* PLLA */
|
||||||
vco_hz = osc_get_rate(e_src) / ul_div;
|
/* Calculate internal VCO frequency */
|
||||||
Assert(vco_hz >= PLL_INPUT_MIN_HZ);
|
vco_hz = osc_get_rate(e_src) / ul_div;
|
||||||
Assert(vco_hz <= PLL_INPUT_MAX_HZ);
|
Assert(vco_hz >= PLL_INPUT_MIN_HZ);
|
||||||
|
Assert(vco_hz <= PLL_INPUT_MAX_HZ);
|
||||||
|
|
||||||
vco_hz *= ul_mul;
|
vco_hz *= ul_mul;
|
||||||
Assert(vco_hz >= PLL_OUTPUT_MIN_HZ);
|
Assert(vco_hz >= PLL_OUTPUT_MIN_HZ);
|
||||||
Assert(vco_hz <= PLL_OUTPUT_MAX_HZ);
|
Assert(vco_hz <= PLL_OUTPUT_MAX_HZ);
|
||||||
|
|
||||||
/* PMC hardware will automatically make it mul+1 */
|
/* PMC hardware will automatically make it mul+1 */
|
||||||
p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT);
|
p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define pll_config_defaults(cfg, pll_id) \
|
#define pll_config_defaults(cfg, pll_id) \
|
||||||
pll_config_init(cfg, \
|
pll_config_init(cfg, \
|
||||||
CONFIG_PLL##pll_id##_SOURCE, \
|
CONFIG_PLL##pll_id##_SOURCE, \
|
||||||
CONFIG_PLL##pll_id##_DIV, \
|
CONFIG_PLL##pll_id##_DIV, \
|
||||||
CONFIG_PLL##pll_id##_MUL)
|
CONFIG_PLL##pll_id##_MUL)
|
||||||
|
|
||||||
static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id)
|
static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) {
|
||||||
{
|
Assert(ul_pll_id < NR_PLLS);
|
||||||
Assert(ul_pll_id < NR_PLLS);
|
p_cfg->ctrl = ul_pll_id == PLLA_ID ? PMC->CKGR_PLLAR : PMC->CKGR_UCKR;
|
||||||
|
|
||||||
if (ul_pll_id == PLLA_ID) {
|
|
||||||
p_cfg->ctrl = PMC->CKGR_PLLAR;
|
|
||||||
} else {
|
|
||||||
p_cfg->ctrl = PMC->CKGR_UCKR;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id)
|
static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) {
|
||||||
{
|
Assert(ul_pll_id < NR_PLLS);
|
||||||
Assert(ul_pll_id < NR_PLLS);
|
|
||||||
|
|
||||||
if (ul_pll_id == PLLA_ID) {
|
if (ul_pll_id == PLLA_ID) {
|
||||||
pmc_disable_pllack(); // Always stop PLL first!
|
pmc_disable_pllack(); // Always stop PLL first!
|
||||||
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
|
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
|
||||||
} else {
|
}
|
||||||
PMC->CKGR_UCKR = p_cfg->ctrl;
|
else
|
||||||
}
|
PMC->CKGR_UCKR = p_cfg->ctrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id)
|
static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) {
|
||||||
{
|
Assert(ul_pll_id < NR_PLLS);
|
||||||
Assert(ul_pll_id < NR_PLLS);
|
|
||||||
|
|
||||||
if (ul_pll_id == PLLA_ID) {
|
if (ul_pll_id == PLLA_ID) {
|
||||||
pmc_disable_pllack(); // Always stop PLL first!
|
pmc_disable_pllack(); // Always stop PLL first!
|
||||||
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
|
PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl;
|
||||||
} else {
|
}
|
||||||
PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN;
|
else
|
||||||
}
|
PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \note This will only disable the selected PLL, not the underlying oscillator (mainck).
|
* \note This will only disable the selected PLL, not the underlying oscillator (mainck).
|
||||||
*/
|
*/
|
||||||
static inline void pll_disable(uint32_t ul_pll_id)
|
static inline void pll_disable(uint32_t ul_pll_id) {
|
||||||
{
|
Assert(ul_pll_id < NR_PLLS);
|
||||||
Assert(ul_pll_id < NR_PLLS);
|
|
||||||
|
|
||||||
if (ul_pll_id == PLLA_ID) {
|
if (ul_pll_id == PLLA_ID)
|
||||||
pmc_disable_pllack();
|
pmc_disable_pllack();
|
||||||
} else {
|
else
|
||||||
PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN;
|
PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t pll_is_locked(uint32_t ul_pll_id)
|
static inline uint32_t pll_is_locked(uint32_t ul_pll_id) {
|
||||||
{
|
Assert(ul_pll_id < NR_PLLS);
|
||||||
Assert(ul_pll_id < NR_PLLS);
|
|
||||||
|
|
||||||
if (ul_pll_id == PLLA_ID) {
|
if (ul_pll_id == PLLA_ID)
|
||||||
return pmc_is_locked_pllack();
|
return pmc_is_locked_pllack();
|
||||||
} else {
|
else
|
||||||
return pmc_is_locked_upll();
|
return pmc_is_locked_upll();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void pll_enable_source(enum pll_source e_src)
|
static inline void pll_enable_source(enum pll_source e_src) {
|
||||||
{
|
switch (e_src) {
|
||||||
switch (e_src) {
|
case PLL_SRC_MAINCK_4M_RC:
|
||||||
case PLL_SRC_MAINCK_4M_RC:
|
case PLL_SRC_MAINCK_8M_RC:
|
||||||
case PLL_SRC_MAINCK_8M_RC:
|
case PLL_SRC_MAINCK_12M_RC:
|
||||||
case PLL_SRC_MAINCK_12M_RC:
|
case PLL_SRC_MAINCK_XTAL:
|
||||||
case PLL_SRC_MAINCK_XTAL:
|
case PLL_SRC_MAINCK_BYPASS:
|
||||||
case PLL_SRC_MAINCK_BYPASS:
|
osc_enable(e_src);
|
||||||
osc_enable(e_src);
|
osc_wait_ready(e_src);
|
||||||
osc_wait_ready(e_src);
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Assert(false);
|
Assert(false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void pll_enable_config_defaults(unsigned int ul_pll_id)
|
static inline void pll_enable_config_defaults(unsigned int ul_pll_id) {
|
||||||
{
|
struct pll_config pllcfg;
|
||||||
struct pll_config pllcfg;
|
|
||||||
|
|
||||||
if (pll_is_locked(ul_pll_id)) {
|
if (pll_is_locked(ul_pll_id)) return; // Pll already running
|
||||||
return; // Pll already running
|
|
||||||
}
|
switch (ul_pll_id) {
|
||||||
switch (ul_pll_id) {
|
#ifdef CONFIG_PLL0_SOURCE
|
||||||
#ifdef CONFIG_PLL0_SOURCE
|
case 0:
|
||||||
case 0:
|
pll_enable_source(CONFIG_PLL0_SOURCE);
|
||||||
pll_enable_source(CONFIG_PLL0_SOURCE);
|
pll_config_init(&pllcfg,
|
||||||
pll_config_init(&pllcfg,
|
CONFIG_PLL0_SOURCE,
|
||||||
CONFIG_PLL0_SOURCE,
|
CONFIG_PLL0_DIV,
|
||||||
CONFIG_PLL0_DIV,
|
CONFIG_PLL0_MUL);
|
||||||
CONFIG_PLL0_MUL);
|
break;
|
||||||
break;
|
#endif
|
||||||
#endif
|
#ifdef CONFIG_PLL1_SOURCE
|
||||||
#ifdef CONFIG_PLL1_SOURCE
|
case 1:
|
||||||
case 1:
|
pll_enable_source(CONFIG_PLL1_SOURCE);
|
||||||
pll_enable_source(CONFIG_PLL1_SOURCE);
|
pll_config_init(&pllcfg,
|
||||||
pll_config_init(&pllcfg,
|
CONFIG_PLL1_SOURCE,
|
||||||
CONFIG_PLL1_SOURCE,
|
CONFIG_PLL1_DIV,
|
||||||
CONFIG_PLL1_DIV,
|
CONFIG_PLL1_MUL);
|
||||||
CONFIG_PLL1_MUL);
|
break;
|
||||||
break;
|
#endif
|
||||||
#endif
|
default:
|
||||||
default:
|
Assert(false);
|
||||||
Assert(false);
|
break;
|
||||||
break;
|
}
|
||||||
}
|
pll_enable(&pllcfg, ul_pll_id);
|
||||||
pll_enable(&pllcfg, ul_pll_id);
|
while (!pll_is_locked(ul_pll_id));
|
||||||
while (!pll_is_locked(ul_pll_id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -264,15 +249,12 @@ static inline void pll_enable_config_defaults(unsigned int ul_pll_id)
|
|||||||
* \retval STATUS_OK The PLL is now locked.
|
* \retval STATUS_OK The PLL is now locked.
|
||||||
* \retval ERR_TIMEOUT Timed out waiting for PLL to become locked.
|
* \retval ERR_TIMEOUT Timed out waiting for PLL to become locked.
|
||||||
*/
|
*/
|
||||||
static inline int pll_wait_for_lock(unsigned int pll_id)
|
static inline int pll_wait_for_lock(unsigned int pll_id) {
|
||||||
{
|
Assert(pll_id < NR_PLLS);
|
||||||
Assert(pll_id < NR_PLLS);
|
|
||||||
|
|
||||||
while (!pll_is_locked(pll_id)) {
|
while (!pll_is_locked(pll_id)) { /* Do nothing */ }
|
||||||
/* Do nothing */
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|||||||
@@ -51,5 +51,4 @@
|
|||||||
#include "stringz.h"
|
#include "stringz.h"
|
||||||
#include "mrepeat.h"
|
#include "mrepeat.h"
|
||||||
|
|
||||||
|
|
||||||
#endif // _PREPROCESSOR_H_
|
#endif // _PREPROCESSOR_H_
|
||||||
|
|||||||
@@ -57,7 +57,6 @@
|
|||||||
#ifndef _SBC_PROTOCOL_H_
|
#ifndef _SBC_PROTOCOL_H_
|
||||||
#define _SBC_PROTOCOL_H_
|
#define _SBC_PROTOCOL_H_
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \ingroup usb_msc_protocol
|
* \ingroup usb_msc_protocol
|
||||||
* \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions
|
* \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions
|
||||||
@@ -81,82 +80,81 @@
|
|||||||
//@{
|
//@{
|
||||||
|
|
||||||
enum scsi_sbc_mode {
|
enum scsi_sbc_mode {
|
||||||
SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page
|
SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page
|
||||||
SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page
|
SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page
|
||||||
SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page
|
SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page
|
||||||
SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page
|
SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//! \name SBC-2 Device-Specific Parameter
|
//! \name SBC-2 Device-Specific Parameter
|
||||||
//@{
|
//@{
|
||||||
#define SCSI_MS_SBC_WP 0x80 //!< Write Protected
|
#define SCSI_MS_SBC_WP 0x80 //!< Write Protected
|
||||||
#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported
|
#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief SBC-2 Short LBA mode parameter block descriptor
|
* \brief SBC-2 Short LBA mode parameter block descriptor
|
||||||
*/
|
*/
|
||||||
struct sbc_slba_block_desc {
|
struct sbc_slba_block_desc {
|
||||||
be32_t nr_blocks; //!< Number of Blocks
|
be32_t nr_blocks; //!< Number of Blocks
|
||||||
be32_t block_len; //!< Block Length
|
be32_t block_len; //!< Block Length
|
||||||
#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits
|
#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief SBC-2 Caching mode page
|
* \brief SBC-2 Caching mode page
|
||||||
*/
|
*/
|
||||||
struct sbc_caching_mode_page {
|
struct sbc_caching_mode_page {
|
||||||
uint8_t page_code;
|
uint8_t page_code;
|
||||||
uint8_t page_length;
|
uint8_t page_length;
|
||||||
uint8_t flags2;
|
uint8_t flags2;
|
||||||
#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control
|
#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control
|
||||||
#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch
|
#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch
|
||||||
#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted
|
#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted
|
||||||
#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity
|
#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity
|
||||||
#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable
|
#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable
|
||||||
#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable
|
#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable
|
||||||
#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor
|
#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor
|
||||||
#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable
|
#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable
|
||||||
uint8_t retention;
|
uint8_t retention;
|
||||||
be16_t dis_pf_transfer_len;
|
be16_t dis_pf_transfer_len;
|
||||||
be16_t min_prefetch;
|
be16_t min_prefetch;
|
||||||
be16_t max_prefetch;
|
be16_t max_prefetch;
|
||||||
be16_t max_prefetch_ceil;
|
be16_t max_prefetch_ceil;
|
||||||
uint8_t flags12;
|
uint8_t flags12;
|
||||||
#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write
|
#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write
|
||||||
#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz
|
#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz
|
||||||
#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead
|
#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead
|
||||||
#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable
|
#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable
|
||||||
uint8_t nr_cache_segments;
|
uint8_t nr_cache_segments;
|
||||||
be16_t cache_segment_size;
|
be16_t cache_segment_size;
|
||||||
uint8_t reserved[4];
|
uint8_t reserved[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief SBC-2 Read-Write Error Recovery mode page
|
* \brief SBC-2 Read-Write Error Recovery mode page
|
||||||
*/
|
*/
|
||||||
struct sbc_rdwr_error_recovery_mode_page {
|
struct sbc_rdwr_error_recovery_mode_page {
|
||||||
uint8_t page_code;
|
uint8_t page_code;
|
||||||
uint8_t page_length;
|
uint8_t page_length;
|
||||||
#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A
|
#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A
|
||||||
uint8_t flags1;
|
uint8_t flags1;
|
||||||
#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7)
|
#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7)
|
||||||
#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6)
|
#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6)
|
||||||
#define SBC_MP_RW_ERR_RECOV_TB (1 << 5)
|
#define SBC_MP_RW_ERR_RECOV_TB (1 << 5)
|
||||||
#define SBC_MP_RW_ERR_RECOV_RC (1 << 4)
|
#define SBC_MP_RW_ERR_RECOV_RC (1 << 4)
|
||||||
#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3)
|
#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3)
|
||||||
#define SBC_MP_RW_ERR_RECOV_PER (1 << 2)
|
#define SBC_MP_RW_ERR_RECOV_PER (1 << 2)
|
||||||
#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1)
|
#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1)
|
||||||
#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0)
|
#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0)
|
||||||
uint8_t read_retry_count;
|
uint8_t read_retry_count;
|
||||||
uint8_t correction_span;
|
uint8_t correction_span;
|
||||||
uint8_t head_offset_count;
|
uint8_t head_offset_count;
|
||||||
uint8_t data_strobe_offset_count;
|
uint8_t data_strobe_offset_count;
|
||||||
uint8_t flags2;
|
uint8_t flags2;
|
||||||
uint8_t write_retry_count;
|
uint8_t write_retry_count;
|
||||||
uint8_t flags3;
|
uint8_t flags3;
|
||||||
be16_t recovery_time_limit;
|
be16_t recovery_time_limit;
|
||||||
};
|
};
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
@@ -164,8 +162,8 @@ struct sbc_rdwr_error_recovery_mode_page {
|
|||||||
* \brief SBC-2 READ CAPACITY (10) parameter data
|
* \brief SBC-2 READ CAPACITY (10) parameter data
|
||||||
*/
|
*/
|
||||||
struct sbc_read_capacity10_data {
|
struct sbc_read_capacity10_data {
|
||||||
be32_t max_lba; //!< LBA of last logical block
|
be32_t max_lba; //!< LBA of last logical block
|
||||||
be32_t block_len; //!< Number of bytes in the last logical block
|
be32_t block_len; //!< Number of bytes in the last logical block
|
||||||
};
|
};
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "../../../inc/MarlinConfig.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if ENABLED(SDSUPPORT)
|
#if HAS_MEDIA
|
||||||
|
|
||||||
#include "../../../sd/cardreader.h"
|
#include "../../../sd/cardreader.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -138,5 +138,5 @@ Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
|||||||
|
|
||||||
#endif // ACCESS_USB == true
|
#endif // ACCESS_USB == true
|
||||||
|
|
||||||
#endif // SDSUPPORT
|
#endif // HAS_MEDIA
|
||||||
#endif // ARDUINO_ARCH_SAM
|
#endif // ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
* Support and FAQ: visit <a href="https://www.atmel.com/design-support/">Atmel Support</a>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _SD_MMC_SPI_MEM_H_
|
#ifndef _SD_MMC_SPI_MEM_H_
|
||||||
#define _SD_MMC_SPI_MEM_H_
|
#define _SD_MMC_SPI_MEM_H_
|
||||||
|
|
||||||
@@ -63,17 +62,14 @@
|
|||||||
#error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled
|
#error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "ctrl_access.h"
|
#include "ctrl_access.h"
|
||||||
|
|
||||||
|
|
||||||
//_____ D E F I N I T I O N S ______________________________________________
|
//_____ D E F I N I T I O N S ______________________________________________
|
||||||
|
|
||||||
#define SD_MMC_REMOVED 0
|
#define SD_MMC_REMOVED 0
|
||||||
#define SD_MMC_INSERTED 1
|
#define SD_MMC_INSERTED 1
|
||||||
#define SD_MMC_REMOVING 2
|
#define SD_MMC_REMOVING 2
|
||||||
|
|
||||||
|
|
||||||
//---- CONTROL FUNCTIONS ----
|
//---- CONTROL FUNCTIONS ----
|
||||||
//!
|
//!
|
||||||
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI.
|
||||||
@@ -133,7 +129,6 @@ extern bool sd_mmc_spi_wr_protect(void);
|
|||||||
//!
|
//!
|
||||||
extern bool sd_mmc_spi_removal(void);
|
extern bool sd_mmc_spi_removal(void);
|
||||||
|
|
||||||
|
|
||||||
//---- ACCESS DATA FUNCTIONS ----
|
//---- ACCESS DATA FUNCTIONS ----
|
||||||
|
|
||||||
#if ACCESS_USB == true
|
#if ACCESS_USB == true
|
||||||
|
|||||||
@@ -59,23 +59,23 @@
|
|||||||
|
|
||||||
//! \name SCSI commands defined by SPC-2
|
//! \name SCSI commands defined by SPC-2
|
||||||
//@{
|
//@{
|
||||||
#define SPC_TEST_UNIT_READY 0x00
|
#define SPC_TEST_UNIT_READY 0x00
|
||||||
#define SPC_REQUEST_SENSE 0x03
|
#define SPC_REQUEST_SENSE 0x03
|
||||||
#define SPC_INQUIRY 0x12
|
#define SPC_INQUIRY 0x12
|
||||||
#define SPC_MODE_SELECT6 0x15
|
#define SPC_MODE_SELECT6 0x15
|
||||||
#define SPC_MODE_SENSE6 0x1A
|
#define SPC_MODE_SENSE6 0x1A
|
||||||
#define SPC_SEND_DIAGNOSTIC 0x1D
|
#define SPC_SEND_DIAGNOSTIC 0x1D
|
||||||
#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E
|
#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E
|
||||||
#define SPC_MODE_SENSE10 0x5A
|
#define SPC_MODE_SENSE10 0x5A
|
||||||
#define SPC_REPORT_LUNS 0xA0
|
#define SPC_REPORT_LUNS 0xA0
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//! \brief May be set in byte 0 of the INQUIRY CDB
|
//! \brief May be set in byte 0 of the INQUIRY CDB
|
||||||
//@{
|
//@{
|
||||||
//! Enable Vital Product Data
|
//! Enable Vital Product Data
|
||||||
#define SCSI_INQ_REQ_EVPD 0x01
|
#define SCSI_INQ_REQ_EVPD 0x01
|
||||||
//! Command Support Data specified by the PAGE OR OPERATION CODE field
|
//! Command Support Data specified by the PAGE OR OPERATION CODE field
|
||||||
#define SCSI_INQ_REQ_CMDT 0x02
|
#define SCSI_INQ_REQ_CMDT 0x02
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
COMPILER_PACK_SET(1)
|
COMPILER_PACK_SET(1)
|
||||||
@@ -84,110 +84,110 @@ COMPILER_PACK_SET(1)
|
|||||||
* \brief SCSI Standard Inquiry data structure
|
* \brief SCSI Standard Inquiry data structure
|
||||||
*/
|
*/
|
||||||
struct scsi_inquiry_data {
|
struct scsi_inquiry_data {
|
||||||
uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type
|
uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type
|
||||||
#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected
|
#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected
|
||||||
#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected
|
#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected
|
||||||
#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported
|
#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported
|
||||||
#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC)
|
#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC)
|
||||||
#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access
|
#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access
|
||||||
#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer
|
#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer
|
||||||
#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device
|
#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device
|
||||||
#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device
|
#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device
|
||||||
#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device
|
#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device
|
||||||
#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory
|
#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory
|
||||||
#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer
|
#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer
|
||||||
#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller
|
#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller
|
||||||
#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services
|
#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services
|
||||||
#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access
|
#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access
|
||||||
#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer
|
#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer
|
||||||
#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands
|
#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands
|
||||||
#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage
|
#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage
|
||||||
#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral
|
#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral
|
||||||
uint8_t flags1; //!< Flags (byte 1)
|
uint8_t flags1; //!< Flags (byte 1)
|
||||||
#define SCSI_INQ_RMB 0x80 //!< Removable Medium
|
#define SCSI_INQ_RMB 0x80 //!< Removable Medium
|
||||||
uint8_t version; //!< Version
|
uint8_t version; //!< Version
|
||||||
#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance
|
#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance
|
||||||
#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC)
|
#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC)
|
||||||
#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2)
|
#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2)
|
||||||
#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2)
|
#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2)
|
||||||
#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3)
|
#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3)
|
||||||
uint8_t flags3; //!< Flags (byte 3)
|
uint8_t flags3; //!< Flags (byte 3)
|
||||||
#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported
|
#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported
|
||||||
#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing
|
#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing
|
||||||
#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format
|
#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format
|
||||||
uint8_t addl_len; //!< Additional Length (n-4)
|
uint8_t addl_len; //!< Additional Length (n-4)
|
||||||
#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot
|
#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot
|
||||||
uint8_t flags5; //!< Flags (byte 5)
|
uint8_t flags5; //!< Flags (byte 5)
|
||||||
#define SCSI_INQ_SCCS 0x80
|
#define SCSI_INQ_SCCS 0x80
|
||||||
uint8_t flags6; //!< Flags (byte 6)
|
uint8_t flags6; //!< Flags (byte 6)
|
||||||
#define SCSI_INQ_BQUE 0x80
|
#define SCSI_INQ_BQUE 0x80
|
||||||
#define SCSI_INQ_ENCSERV 0x40
|
#define SCSI_INQ_ENCSERV 0x40
|
||||||
#define SCSI_INQ_MULTIP 0x10
|
#define SCSI_INQ_MULTIP 0x10
|
||||||
#define SCSI_INQ_MCHGR 0x08
|
#define SCSI_INQ_MCHGR 0x08
|
||||||
#define SCSI_INQ_ADDR16 0x01
|
#define SCSI_INQ_ADDR16 0x01
|
||||||
uint8_t flags7; //!< Flags (byte 7)
|
uint8_t flags7; //!< Flags (byte 7)
|
||||||
#define SCSI_INQ_WBUS16 0x20
|
#define SCSI_INQ_WBUS16 0x20
|
||||||
#define SCSI_INQ_SYNC 0x10
|
#define SCSI_INQ_SYNC 0x10
|
||||||
#define SCSI_INQ_LINKED 0x08
|
#define SCSI_INQ_LINKED 0x08
|
||||||
#define SCSI_INQ_CMDQUE 0x02
|
#define SCSI_INQ_CMDQUE 0x02
|
||||||
uint8_t vendor_id[8]; //!< T10 Vendor Identification
|
uint8_t vendor_id[8]; //!< T10 Vendor Identification
|
||||||
uint8_t product_id[16]; //!< Product Identification
|
uint8_t product_id[16]; //!< Product Identification
|
||||||
uint8_t product_rev[4]; //!< Product Revision Level
|
uint8_t product_rev[4]; //!< Product Revision Level
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief SCSI Standard Request sense data structure
|
* \brief SCSI Standard Request sense data structure
|
||||||
*/
|
*/
|
||||||
struct scsi_request_sense_data {
|
struct scsi_request_sense_data {
|
||||||
/* 1st byte: REQUEST SENSE response flags*/
|
/* 1st byte: REQUEST SENSE response flags*/
|
||||||
uint8_t valid_reponse_code;
|
uint8_t valid_reponse_code;
|
||||||
#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information
|
#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information
|
||||||
#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F
|
#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F
|
||||||
#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors)
|
#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors)
|
||||||
#define SCSI_SENSE_DEFERRED 0x71
|
#define SCSI_SENSE_DEFERRED 0x71
|
||||||
|
|
||||||
/* 2nd byte */
|
/* 2nd byte */
|
||||||
uint8_t obsolete;
|
uint8_t obsolete;
|
||||||
|
|
||||||
/* 3rd byte */
|
/* 3rd byte */
|
||||||
uint8_t sense_flag_key;
|
uint8_t sense_flag_key;
|
||||||
#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark.
|
#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark.
|
||||||
#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists.
|
#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists.
|
||||||
#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium.
|
#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium.
|
||||||
#define SCSI_SENSE_RESERVED 0x10 //!< Reserved
|
#define SCSI_SENSE_RESERVED 0x10 //!< Reserved
|
||||||
#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key
|
#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key
|
||||||
|
|
||||||
/* 4th to 7th bytes - INFORMATION field */
|
/* 4th to 7th bytes - INFORMATION field */
|
||||||
uint8_t information[4];
|
uint8_t information[4];
|
||||||
|
|
||||||
/* 8th byte - ADDITIONAL SENSE LENGTH field */
|
/* 8th byte - ADDITIONAL SENSE LENGTH field */
|
||||||
uint8_t AddSenseLen;
|
uint8_t AddSenseLen;
|
||||||
#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8)
|
#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8)
|
||||||
|
|
||||||
/* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */
|
/* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */
|
||||||
uint8_t CmdSpecINFO[4];
|
uint8_t CmdSpecINFO[4];
|
||||||
|
|
||||||
/* 13th byte - ADDITIONAL SENSE CODE field */
|
/* 13th byte - ADDITIONAL SENSE CODE field */
|
||||||
uint8_t AddSenseCode;
|
uint8_t AddSenseCode;
|
||||||
|
|
||||||
/* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */
|
/* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */
|
||||||
uint8_t AddSnsCodeQlfr;
|
uint8_t AddSnsCodeQlfr;
|
||||||
|
|
||||||
/* 15th byte - FIELD REPLACEABLE UNIT CODE field */
|
/* 15th byte - FIELD REPLACEABLE UNIT CODE field */
|
||||||
uint8_t FldReplUnitCode;
|
uint8_t FldReplUnitCode;
|
||||||
|
|
||||||
/* 16th byte */
|
/* 16th byte */
|
||||||
uint8_t SenseKeySpec[3];
|
uint8_t SenseKeySpec[3];
|
||||||
#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information
|
#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information
|
||||||
};
|
};
|
||||||
|
|
||||||
COMPILER_PACK_RESET()
|
COMPILER_PACK_RESET()
|
||||||
|
|
||||||
/* Vital Product Data page codes */
|
/* Vital Product Data page codes */
|
||||||
enum scsi_vpd_page_code {
|
enum scsi_vpd_page_code {
|
||||||
SCSI_VPD_SUPPORTED_PAGES = 0x00,
|
SCSI_VPD_SUPPORTED_PAGES = 0x00,
|
||||||
SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80,
|
SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80,
|
||||||
SCSI_VPD_DEVICE_IDENTIFICATION = 0x83,
|
SCSI_VPD_DEVICE_IDENTIFICATION = 0x83,
|
||||||
};
|
};
|
||||||
#define SCSI_VPD_HEADER_SIZE 4
|
#define SCSI_VPD_HEADER_SIZE 4
|
||||||
|
|
||||||
@@ -200,37 +200,36 @@ enum scsi_vpd_page_code {
|
|||||||
|
|
||||||
#define SCSI_VPD_ID_TYPE_T10 1
|
#define SCSI_VPD_ID_TYPE_T10 1
|
||||||
|
|
||||||
|
|
||||||
/* Sense keys */
|
/* Sense keys */
|
||||||
enum scsi_sense_key {
|
enum scsi_sense_key {
|
||||||
SCSI_SK_NO_SENSE = 0x0,
|
SCSI_SK_NO_SENSE = 0x0,
|
||||||
SCSI_SK_RECOVERED_ERROR = 0x1,
|
SCSI_SK_RECOVERED_ERROR = 0x1,
|
||||||
SCSI_SK_NOT_READY = 0x2,
|
SCSI_SK_NOT_READY = 0x2,
|
||||||
SCSI_SK_MEDIUM_ERROR = 0x3,
|
SCSI_SK_MEDIUM_ERROR = 0x3,
|
||||||
SCSI_SK_HARDWARE_ERROR = 0x4,
|
SCSI_SK_HARDWARE_ERROR = 0x4,
|
||||||
SCSI_SK_ILLEGAL_REQUEST = 0x5,
|
SCSI_SK_ILLEGAL_REQUEST = 0x5,
|
||||||
SCSI_SK_UNIT_ATTENTION = 0x6,
|
SCSI_SK_UNIT_ATTENTION = 0x6,
|
||||||
SCSI_SK_DATA_PROTECT = 0x7,
|
SCSI_SK_DATA_PROTECT = 0x7,
|
||||||
SCSI_SK_BLANK_CHECK = 0x8,
|
SCSI_SK_BLANK_CHECK = 0x8,
|
||||||
SCSI_SK_VENDOR_SPECIFIC = 0x9,
|
SCSI_SK_VENDOR_SPECIFIC = 0x9,
|
||||||
SCSI_SK_COPY_ABORTED = 0xA,
|
SCSI_SK_COPY_ABORTED = 0xA,
|
||||||
SCSI_SK_ABORTED_COMMAND = 0xB,
|
SCSI_SK_ABORTED_COMMAND = 0xB,
|
||||||
SCSI_SK_VOLUME_OVERFLOW = 0xD,
|
SCSI_SK_VOLUME_OVERFLOW = 0xD,
|
||||||
SCSI_SK_MISCOMPARE = 0xE,
|
SCSI_SK_MISCOMPARE = 0xE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Additional Sense Code / Additional Sense Code Qualifier pairs */
|
/* Additional Sense Code / Additional Sense Code Qualifier pairs */
|
||||||
enum scsi_asc_ascq {
|
enum scsi_asc_ascq {
|
||||||
SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000,
|
SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000,
|
||||||
SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405,
|
SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405,
|
||||||
SCSI_ASC_WRITE_ERROR = 0x0C00,
|
SCSI_ASC_WRITE_ERROR = 0x0C00,
|
||||||
SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100,
|
SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100,
|
||||||
SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000,
|
SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000,
|
||||||
SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400,
|
SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400,
|
||||||
SCSI_ASC_WRITE_PROTECTED = 0x2700,
|
SCSI_ASC_WRITE_PROTECTED = 0x2700,
|
||||||
SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800,
|
SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800,
|
||||||
SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00,
|
SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00,
|
||||||
SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400,
|
SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -240,9 +239,9 @@ enum scsi_asc_ascq {
|
|||||||
* that are applicable to all SCSI devices.
|
* that are applicable to all SCSI devices.
|
||||||
*/
|
*/
|
||||||
enum scsi_spc_mode {
|
enum scsi_spc_mode {
|
||||||
SCSI_MS_MODE_VENDOR_SPEC = 0x00,
|
SCSI_MS_MODE_VENDOR_SPEC = 0x00,
|
||||||
SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page
|
SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page
|
||||||
SCSI_MS_MODE_ALL = 0x3F,
|
SCSI_MS_MODE_ALL = 0x3F,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -250,51 +249,45 @@ enum scsi_spc_mode {
|
|||||||
* See chapter 8.3.8
|
* See chapter 8.3.8
|
||||||
*/
|
*/
|
||||||
struct spc_control_page_info_execpt {
|
struct spc_control_page_info_execpt {
|
||||||
uint8_t page_code;
|
uint8_t page_code;
|
||||||
uint8_t page_length;
|
uint8_t page_length;
|
||||||
#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A
|
#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A
|
||||||
uint8_t flags1;
|
uint8_t flags1;
|
||||||
#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control
|
#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control
|
||||||
#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted
|
#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted
|
||||||
#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity
|
#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity
|
||||||
#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable
|
#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable
|
||||||
#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable
|
#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable
|
||||||
#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit
|
#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit
|
||||||
uint8_t mrie;
|
uint8_t mrie;
|
||||||
#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00
|
#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00
|
||||||
#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01
|
#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01
|
||||||
#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02
|
#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02
|
||||||
#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03
|
#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03
|
||||||
#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04
|
#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04
|
||||||
#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05
|
#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05
|
||||||
#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06
|
#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06
|
||||||
be32_t interval_timer;
|
be32_t interval_timer;
|
||||||
be32_t report_count;
|
be32_t report_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum scsi_spc_mode_sense_pc {
|
enum scsi_spc_mode_sense_pc {
|
||||||
SCSI_MS_SENSE_PC_CURRENT = 0,
|
SCSI_MS_SENSE_PC_CURRENT = 0,
|
||||||
SCSI_MS_SENSE_PC_CHANGEABLE = 1,
|
SCSI_MS_SENSE_PC_CHANGEABLE = 1,
|
||||||
SCSI_MS_SENSE_PC_DEFAULT = 2,
|
SCSI_MS_SENSE_PC_DEFAULT = 2,
|
||||||
SCSI_MS_SENSE_PC_SAVED = 3,
|
SCSI_MS_SENSE_PC_SAVED = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) {
|
||||||
|
return (cdb[1] >> 3) & 1;
|
||||||
static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb)
|
|
||||||
{
|
|
||||||
return (cdb[1] >> 3) & 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb)
|
static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) {
|
||||||
{
|
return cdb[2] & 0x3F;
|
||||||
return cdb[2] & 0x3F;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb)
|
static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) {
|
||||||
{
|
return cdb[2] >> 6;
|
||||||
return cdb[2] >> 6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -302,10 +295,10 @@ static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb)
|
|||||||
* SENSE(6)
|
* SENSE(6)
|
||||||
*/
|
*/
|
||||||
struct scsi_mode_param_header6 {
|
struct scsi_mode_param_header6 {
|
||||||
uint8_t mode_data_length; //!< Number of bytes after this
|
uint8_t mode_data_length; //!< Number of bytes after this
|
||||||
uint8_t medium_type; //!< Medium Type
|
uint8_t medium_type; //!< Medium Type
|
||||||
uint8_t device_specific_parameter; //!< Defined by command set
|
uint8_t device_specific_parameter; //!< Defined by command set
|
||||||
uint8_t block_descriptor_length; //!< Length of block descriptors
|
uint8_t block_descriptor_length; //!< Length of block descriptors
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -313,23 +306,23 @@ struct scsi_mode_param_header6 {
|
|||||||
* SENSE(10)
|
* SENSE(10)
|
||||||
*/
|
*/
|
||||||
struct scsi_mode_param_header10 {
|
struct scsi_mode_param_header10 {
|
||||||
be16_t mode_data_length; //!< Number of bytes after this
|
be16_t mode_data_length; //!< Number of bytes after this
|
||||||
uint8_t medium_type; //!< Medium Type
|
uint8_t medium_type; //!< Medium Type
|
||||||
uint8_t device_specific_parameter; //!< Defined by command set
|
uint8_t device_specific_parameter; //!< Defined by command set
|
||||||
uint8_t flags4; //!< LONGLBA in bit 0
|
uint8_t flags4; //!< LONGLBA in bit 0
|
||||||
uint8_t reserved;
|
uint8_t reserved;
|
||||||
be16_t block_descriptor_length; //!< Length of block descriptors
|
be16_t block_descriptor_length; //!< Length of block descriptors
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief SCSI Page_0 Mode Page header (SPF not set)
|
* \brief SCSI Page_0 Mode Page header (SPF not set)
|
||||||
*/
|
*/
|
||||||
struct scsi_mode_page_0_header {
|
struct scsi_mode_page_0_header {
|
||||||
uint8_t page_code;
|
uint8_t page_code;
|
||||||
#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable
|
#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable
|
||||||
#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format
|
#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format
|
||||||
uint8_t page_length; //!< Number of bytes after this
|
uint8_t page_length; //!< Number of bytes after this
|
||||||
#define SCSI_MS_PAGE_LEN(total) ((total) - 2)
|
#define SCSI_MS_PAGE_LEN(total) ((total) - 2)
|
||||||
};
|
};
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user