Compare commits
716 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| de17f4b98b | |||
| 8f10152068 | |||
| f182427e38 | |||
| 4c15b7222f | |||
| 7f8de10a81 | |||
| 04ba9937bf | |||
| 019915b097 | |||
| b74c81d3e4 | |||
| e16885c558 | |||
| 4096beaf52 | |||
| 48cc310c58 | |||
| 1c719fd10d | |||
| e3433ea599 | |||
| 585cbbb203 | |||
| fea70777df | |||
| 827c03b056 | |||
| 85f6090f20 | |||
| 99c29cd924 | |||
| f78aaf9562 | |||
| 38d6d61912 | |||
| 4d8f82df32 | |||
| 75d60b77ba | |||
| f60bc278fa | |||
| e0d8ea57a8 | |||
| ad71b81b0c | |||
| 1383a4e413 | |||
| 06ef78dd19 | |||
| 5c0e8d594d | |||
| d16667838f | |||
| 62f2b8fc17 | |||
| 1e6326e85f | |||
| e3a28afd51 | |||
| ef9cec9e40 | |||
| 3df75188f3 | |||
| 7ee745b2da | |||
| 3696cc3513 | |||
| efd875766a | |||
| 21dadce958 | |||
| 4b419eefd2 | |||
| 28a1355f29 | |||
| 9a901941aa | |||
| db3c5dd877 | |||
| 24928f93ba | |||
| 1e009c2aa5 | |||
| d434729da6 | |||
| b23f86f83f | |||
| d3687d933c | |||
| 4b32be9df0 | |||
| f6c8915545 | |||
| b97b09413f | |||
| 87f26e77ff | |||
| 26b3f0b00f | |||
| 067c830e84 | |||
| d40bf0d6b2 | |||
| d009c48b11 | |||
| 3c32770faf | |||
| a653c3aca0 | |||
| 98f636ef1d | |||
| 7b083be5c5 | |||
| 65b8ced80c | |||
| 4ea75ad284 | |||
| 58f03953b8 | |||
| 62c1c116f7 | |||
| bd382fb8a1 | |||
| f3be22c4ff | |||
| 8867c45831 | |||
| c0e108b21d | |||
| f149e14d1a | |||
| 1242e875aa | |||
| 1d4c002c2a | |||
| 7cd1b7708f | |||
| 5e8a5230a3 | |||
| b5d7b4aee6 | |||
| 7d82f95df8 | |||
| 69464790e2 | |||
| db42741537 | |||
| 9a6bf16938 | |||
| c173ecd89a | |||
| aee25d75ea | |||
| a55355d088 | |||
| 6d2dfcaa1c | |||
| d1947fac07 | |||
| 893dddcbd1 | |||
| 8cb6e57789 | |||
| 47820cac8a | |||
| 6f5e6fd25b | |||
| db4990f2c4 | |||
| cbd79a5e87 | |||
| bdc0bd0eef | |||
| ed4afab004 | |||
| 6984c7f308 | |||
| 7bfecf659b | |||
| d7b73542a1 | |||
| 9f0879785e | |||
| bc85f5bebf | |||
| 493c5eec21 | |||
| 489727330b | |||
| c5de0c69e5 | |||
| 7a257ef3e1 | |||
| c080518b12 | |||
| c6dad4d1aa | |||
| a4c35b1555 | |||
| 9758f5e0ce | |||
| 2f7d88d5c3 | |||
| 13db322f0e | |||
| 30a10077cf | |||
| 26551c17c2 | |||
| a80e790cf6 | |||
| 546a014a59 | |||
| 2004198b07 | |||
| 59423da42f | |||
| 99b790cc92 | |||
| 766dfda80e | |||
| d638ee02c6 | |||
| 15ce5d0612 | |||
| d2b47c354c | |||
| 43177af21c | |||
| 73ed54308a | |||
| fd17cc962b | |||
| aad10ea1c7 | |||
| 849e432d62 | |||
| 78d6fec652 | |||
| f6eaca6fcd | |||
| efa175820f | |||
| 448ff71899 | |||
| c1e8d46d21 | |||
| b5068bbc17 | |||
| 9a8ad9d101 | |||
| 5c59abaf6f | |||
| 460bf112d8 | |||
| 7bd74fecbb | |||
| add72fd045 | |||
| ac5fa61de5 | |||
| dda42fb599 | |||
| a8fea3d674 | |||
| 1701fd8f64 | |||
| 14fa705771 | |||
| 91a87f45d9 | |||
| 363f324179 | |||
| a68b70de15 | |||
| c29b44fcca | |||
| 2cf4d02a32 | |||
| 9a8b1eab93 | |||
| 57fe45a2a6 | |||
| 5d755676a9 | |||
| d9f2c6444f | |||
| 4895388909 | |||
| c7e64371c9 | |||
| 58749a9a0e | |||
| 26aac7aaab | |||
| a7684ecd67 | |||
| fc49efcaef | |||
| 4f3279fa31 | |||
| 719bb9c03b | |||
| 15ee0d0e08 | |||
| 23fa94178e | |||
| 4ad6fa59df | |||
| 367cea0d0d | |||
| 0a07bba213 | |||
| 2f4f2bce15 | |||
| 0d87dd9d51 | |||
| e11a5ee717 | |||
| e8c0363051 | |||
| 2d6454b352 | |||
| 28548efa75 | |||
| da0bef50e1 | |||
| b954959f55 | |||
| 434bf81f8e | |||
| 82d3d78e31 | |||
| fb4d465360 | |||
| 3827ceaf66 | |||
| 6ba08130f0 | |||
| 78f871567f | |||
| 9e30173b13 | |||
| f0bd400002 | |||
| 0fa3d2642a | |||
| 4cf4647c9a | |||
| 5766dc0ece | |||
| 01990f2bf4 | |||
| d74ee8ccc4 | |||
| 953b6844ca | |||
| e6ccf3b72b | |||
| d9229ff355 | |||
| ee35929b61 | |||
| 07b979012a | |||
| 126e78dcce | |||
| e02de3a256 | |||
| 97a7c2160e | |||
| caf5d5b134 | |||
| 05a46084b6 | |||
| e676d833a3 | |||
| 73a0f33767 | |||
| e787c8f26b | |||
| 147dcaf600 | |||
| dd3bf2995b | |||
| 142177426b | |||
| 072b90d105 | |||
| efba06c4ce | |||
| 2cc35a9ad1 | |||
| b748506230 | |||
| c3a4ef77af | |||
| 86c1fde309 | |||
| 89def456e8 | |||
| 0518737119 | |||
| 12b3f18bb2 | |||
| 4d0c6841f8 | |||
| 99c3a7136d | |||
| cd3997f045 | |||
| 479074ccba | |||
| a21fc27056 | |||
| 485fbf2040 | |||
| 09a519bfb5 | |||
| 81ef02e41f | |||
| 0226692e6b | |||
| 0cd1d9c3c9 | |||
| ab7137ab8e | |||
| 84113367fc | |||
| c24ecfb6f0 | |||
| 442f0baf14 | |||
| 40aab1e298 | |||
| 09fbe372da | |||
| 279a393e81 | |||
| 1e2e0c3a36 | |||
| 86f03cf57a | |||
| 7f598ae66d | |||
| 0a598071af | |||
| 861dd33fa1 | |||
| ac14c65643 | |||
| 0f7fb5d88d | |||
| 428f721cbf | |||
| 31bc23b6e3 | |||
| a1ba166740 | |||
| 88829bd92d | |||
| 7e0208940b | |||
| 12d491c5f7 | |||
| 29635232d3 | |||
| 4e72b17a88 | |||
| 8b8c862615 | |||
| 45ca25a4ab | |||
| 8f35e9a797 | |||
| b4688346ab | |||
| e0c60a83a2 | |||
| b7358449e0 | |||
| 85ebd170a9 | |||
| 70cdfbe8fc | |||
| 5dc55150bd | |||
| ef34fd1a3f | |||
| 854cfc016d | |||
| b7f628ce2f | |||
| f54ec92ba8 | |||
| 2e142725a6 | |||
| 6eca4bbab1 | |||
| de7ac7f594 | |||
| 28c591309f | |||
| 55add905cb | |||
| 8d7ecad531 | |||
| a7d79618b9 | |||
| acd825972c | |||
| 7eee772f60 | |||
| 63bc413da8 | |||
| 22977c885b | |||
| de76f2f21a | |||
| d57feeadaf | |||
| 36623a2382 | |||
| 83278bdc17 | |||
| 30697cb53f | |||
| 4eb8a87193 | |||
| d2814c7aa7 | |||
| 6f71a14150 | |||
| 1067950697 | |||
| 7b7add3843 | |||
| 05e67a9262 | |||
| c4ef2d63e1 | |||
| 2a137d6744 | |||
| c0becd6ce1 | |||
| d5dfd18c24 | |||
| dcc10565f8 | |||
| 4c388d7118 | |||
| 94ca5487ab | |||
| a23212bd95 | |||
| a748eaade7 | |||
| ba88365364 | |||
| 8d9db0f899 | |||
| 23bc810e6e | |||
| 7ad4de2c08 | |||
| d21e1d4dc8 | |||
| 8b7cfa0429 | |||
| 906dcc7536 | |||
| 061e026384 | |||
| 5d591fd91d | |||
| 854da5fd9e | |||
| 7e45d56e66 | |||
| 71ce7803e7 | |||
| c5bf705717 | |||
| e82b4e98a4 | |||
| c271a89a4f | |||
| ea993a657f | |||
| 5813488412 | |||
| a365163ff0 | |||
| 4668b27158 | |||
| e733e50207 | |||
| 5549d07da3 | |||
| 257ffe98b1 | |||
| 2ed5937daf | |||
| 00c28eb9e3 | |||
| 63a7d42f30 | |||
| 94bd6d52e9 | |||
| 9cbab467b4 | |||
| db7828504e | |||
| 4797f25428 | |||
| 6bd541d730 | |||
| 3591eb5d5d | |||
| 22182d9a98 | |||
| 1f61b743a6 | |||
| f071274493 | |||
| 2a4a89d8cb | |||
| a9f44e37a9 | |||
| af05b6e482 | |||
| 2b39e51a40 | |||
| 37f490fdd0 | |||
| c57f715d00 | |||
| 580c99ece2 | |||
| eaab2dea92 | |||
| a7bd35b993 | |||
| 8d864d797a | |||
| 61649aa3c0 | |||
| 220cd5a640 | |||
| 72f2657a0e | |||
| fb61a50e21 | |||
| 21257f7e21 | |||
| 8df61893c3 | |||
| 095f060c24 | |||
| f5a5d7a620 | |||
| fabc2002ed | |||
| 3f264942cb | |||
| 3810986dba | |||
| 5951e646d0 | |||
| d4c34205b5 | |||
| c6bbed7cdb | |||
| a531c01889 | |||
| 0f0e239264 | |||
| fa55caed1f | |||
| bf98c16a00 | |||
| 72603b627a | |||
| 284d07d4d8 | |||
| 09a290cc61 | |||
| 25b9bb35ab | |||
| 9e96b89856 | |||
| 92efc33ace | |||
| 81bad7b124 | |||
| 1df97254cb | |||
| aa80cb0620 | |||
| 4b6109f4e7 | |||
| 70c3060769 | |||
| 472f1ece2a | |||
| f6c58c59c3 | |||
| e6099fd83f | |||
| 13af4e1ef1 | |||
| 4869a3ffd9 | |||
| c2d0008d2a | |||
| 68ae15e2df | |||
| 91e4811534 | |||
| d2fab914cd | |||
| 846ec6c66b | |||
| d876b5ee3c | |||
| 98ae2ad60a | |||
| a261a5b9a6 | |||
| a7fcb495e4 | |||
| ea554a0609 | |||
| 08717d3f60 | |||
| 7b104a108f | |||
| 9133a2f0f5 | |||
| dff2104c96 | |||
| 163ca2783f | |||
| 16f28e747b | |||
| 3b7aadb359 | |||
| 9e8d561549 | |||
| b4a3e29fb6 | |||
| d2bda128ab | |||
| f8bbabfa31 | |||
| fc769ef023 | |||
| 9192ae5213 | |||
| 4c0e612376 | |||
| b9f7d721ed | |||
| b43d6ed5d3 | |||
| e824e16a41 | |||
| 0b72b8d819 | |||
| 37eb8bb1d5 | |||
| d2ff2adabd | |||
| f31cc84c2b | |||
| 8beec5eaa5 | |||
| 4e41ff32e1 | |||
| cf137cb73a | |||
| d5cc11d996 | |||
| d62a631467 | |||
| d6c3f45bda | |||
| 81760d6818 | |||
| 282f90c1b3 | |||
| 5de9fc556f | |||
| 3482e9632c | |||
| a6493e0cc8 | |||
| a08a7b3459 | |||
| bd4936330b | |||
| 4bb33a0cb9 | |||
| 83e38b3625 | |||
| 5b7bb3ea64 | |||
| f0b115a999 | |||
| cebed347f5 | |||
| a66b22c4f1 | |||
| fadaa2db09 | |||
| f8954ca79b | |||
| 4a3f69ad6d | |||
| 4bf13bea42 | |||
| 3a6bd6920e | |||
| 70ef7978b4 | |||
| 37bc552f3b | |||
| e310f20279 | |||
| 4708635f4f | |||
| f5d5b0a881 | |||
| 30f5dd339d | |||
| 556d716919 | |||
| 76afd5afc1 | |||
| 5c3bc2194a | |||
| 763cd7c5f2 | |||
| 11046b23a9 | |||
| 36b72926f3 | |||
| b35e16b1d8 | |||
| 767c87810b | |||
| 52b6c45451 | |||
| df5d08aec0 | |||
| 8c61606691 | |||
| e70bd3c785 | |||
| 83cc983276 | |||
| bbb8275d66 | |||
| 2afc2f268a | |||
| aa44542f76 | |||
| 248648708f | |||
| e2c0150fa8 | |||
| 4ef5372151 | |||
| a923771611 | |||
| 74ffa0cc3e | |||
| f2d585ac7f | |||
| 80cfdb182c | |||
| 39463268fb | |||
| a7b3989bca | |||
| 829212d76a | |||
| 0de4a70203 | |||
| febfb3218e | |||
| 4da46c5dd2 | |||
| 353ede8208 | |||
| 09de5e76a7 | |||
| 73b6ba8fe3 | |||
| 72b09fe4cb | |||
| e5ad13a8e2 | |||
| b122e46adb | |||
| 1a5866f5c6 | |||
| c7e62b33d1 | |||
| 1916d4e27f | |||
| ce55a7bd9b | |||
| 540120f863 | |||
| b99a26d6ab | |||
| 6528109176 | |||
| b94a0d036c | |||
| 7634ffe8e5 | |||
| 8bae8bbf7a | |||
| 5ce013f414 | |||
| da4a374b49 | |||
| 81b13456b1 | |||
| ee35fb07b0 | |||
| 99c991755a | |||
| a96ae85d88 | |||
| 45b9680c57 | |||
| 83cbed8527 | |||
| d36d9cb506 | |||
| 9e6981ea60 | |||
| 2c6f8a30f3 | |||
| 17a5a1f97d | |||
| a0815deb9a | |||
| 76a7ab6893 | |||
| 7cd56a57f9 | |||
| 56e2b60e6d | |||
| 8c15a093fd | |||
| 7901eb97ad | |||
| 7aaba66d4d | |||
| 5f0b9d429f | |||
| d34b62eafa | |||
| 3743980192 | |||
| 41d53a15f2 | |||
| f234fbf87f | |||
| 5c728d1fb1 | |||
| 162ea81894 | |||
| 97b9fe83ee | |||
| 9953230550 | |||
| 80bd10025b | |||
| 0876bcd027 | |||
| 3d7ac162fb | |||
| 68a2459808 | |||
| 21fddc1cc8 | |||
| 528a1ad3e0 | |||
| dabe374983 | |||
| 8ac0f14796 | |||
| 934fc52d06 | |||
| cf46d1880c | |||
| 4f159a94cd | |||
| b53e14c7f8 | |||
| 94e9f26544 | |||
| 9e87af70b7 | |||
| fe56f5d3a6 | |||
| 90e5826256 | |||
| bb73c335a5 | |||
| 4c1f76567c | |||
| d193c814d3 | |||
| 2cb252da4a | |||
| 9a04c32f7f | |||
| 3b8e9fdd25 | |||
| e0b045da49 | |||
| 4220491a23 | |||
| 3abe1fcf20 | |||
| 02ed020f3f | |||
| 934ac24ad8 | |||
| e2d8b2fc26 | |||
| 3e8483d389 | |||
| a9c529f004 | |||
| a664587219 | |||
| 1619838592 | |||
| 98a33d37c7 | |||
| 12a2e5ae1b | |||
| 9b472a02e9 | |||
| c84bea7110 | |||
| 20f71fafa7 | |||
| 056e5a430e | |||
| 21a604407d | |||
| deb076b9cd | |||
| b8e2ad9d8f | |||
| 0cd9643957 | |||
| 8c78315f71 | |||
| 35dad3fdfe | |||
| bebf5dc6ab | |||
| 2fd1c48e1a | |||
| 301727defc | |||
| 1afd53a933 | |||
| 381aeb94c6 | |||
| 4a36520820 | |||
| 430eedf5c0 | |||
| 793a851d10 | |||
| 2d609487ac | |||
| 295f50379f | |||
| ecfff5099a | |||
| 986344640f | |||
| 69f69606e6 | |||
| 2aa2e5487a | |||
| 23d9020a65 | |||
| 43d9d1ce1b | |||
| ed7f3b21c0 | |||
| b062a3b226 | |||
| 89b0143b09 | |||
| 0790a9d5df | |||
| e05ac66561 | |||
| 3b33f7ec03 | |||
| b94c75bcda | |||
| 8dc8906d78 | |||
| ab684dc484 | |||
| 37fb26b557 | |||
| 7397e5a41d | |||
| 4a9d380117 | |||
| 0ec1a54309 | |||
| ab6e68c312 | |||
| c509603530 | |||
| e5ce65c32b | |||
| 851257c44b | |||
| 1662e953fc | |||
| dde89795c9 | |||
| 6e69ff93ef | |||
| 01b7d6c413 | |||
| 58398832a1 | |||
| 29469a0615 | |||
| b4dd20c0eb | |||
| eab13752dd | |||
| ad60cdd030 | |||
| 78e111a4d0 | |||
| 5558729562 | |||
| 2d32f7c377 | |||
| bcbdac6f6c | |||
| acc8bf1c79 | |||
| 4f107e9fee | |||
| 7844f3fa4f | |||
| 2f3af438ee | |||
| 4483aa5b45 | |||
| 20e6b6315e | |||
| ca4248bdd5 | |||
| 4a5d8ba87e | |||
| 7a5d849857 | |||
| 95c23e55a4 | |||
| 94ce0d24d6 | |||
| cdea1b8460 | |||
| cc122bec82 | |||
| 6afaf0034c | |||
| 7f0d7e760b | |||
| 69004322f6 | |||
| 7441094a41 | |||
| 29a5006df9 | |||
| 1aca038daf | |||
| ce92eb46ec | |||
| c852e9c6a1 | |||
| 2b8db0c2e2 | |||
| 74f297c871 | |||
| 76411392b7 | |||
| 74c81117c3 | |||
| 6f04d8dc77 | |||
| ade05c045e | |||
| 5140726c70 | |||
| 5334a8f0ed | |||
| ee99eed3bf | |||
| 9a5f1d2f51 | |||
| 170df9040b | |||
| f0bc4274f8 | |||
| 20a704b154 | |||
| 30a70c480c | |||
| 1d5e9c7dee | |||
| b8ab2d4987 | |||
| ce796cec97 | |||
| ad4de747ad | |||
| 95c1b7fb31 | |||
| 29b742cfc4 | |||
| 57bda2ff3b | |||
| 228179e09b | |||
| c961f3ab2b | |||
| 3469cb9d24 | |||
| 6c09b83f30 | |||
| 17a1363f4d | |||
| 115350317c | |||
| 44c2682168 | |||
| 8b81aae870 | |||
| 72a2699b10 | |||
| b7c07f1329 | |||
| 2b9a62093a | |||
| 3385b4c280 | |||
| 7c1f82cd96 | |||
| 9ebfdc4a86 | |||
| 586313c2fb | |||
| 571783fc04 | |||
| 4af5229cee | |||
| e0dcc610da | |||
| 4aff10785e | |||
| d0e110d666 | |||
| 10ffb9cb68 | |||
| b303bb1e56 | |||
| e6a61b182f | |||
| 785b1da021 | |||
| a4d20031ec | |||
| 3c60145792 | |||
| f2940adcf1 | |||
| b5b9cc0b79 | |||
| 1d1eb97567 | |||
| 0103cffcd0 | |||
| 6fed66dd42 | |||
| c81416438d | |||
| c95825a0ff | |||
| b6284c9f01 | |||
| f84a97f51c | |||
| 563296fc8b | |||
| 13290e798b | |||
| 96e3dfed46 | |||
| cb6fd130ba | |||
| 11f90de873 | |||
| 9240ec89d0 | |||
| 8cf2a41f81 | |||
| 1f9fc665ec | |||
| bf1995140a | |||
| 7b21cd5d72 | |||
| 37fc32d972 | |||
| 9a6d4b5e56 | |||
| 1e0719dac5 | |||
| f2248f79d3 | |||
| 60d843b540 | |||
| 6d7d281559 | |||
| b3d462b890 | |||
| a7444021c6 | |||
| a93acbd35c | |||
| d978123289 | |||
| ee8dada752 | |||
| 7bc6261d2a | |||
| 013c3bcd82 | |||
| 2fc86ad836 | |||
| 082dc24865 | |||
| d7b6acc03d | |||
| a1dc2856de | |||
| 959be66cc2 | |||
| ae2843940f | |||
| 611ceedc1d | |||
| 38298076d6 | |||
| 1f0b8d6cd8 | |||
| e0d683baed | |||
| f4f75b6b12 | |||
| fb6dc90a85 | |||
| b99391c810 | |||
| d9fc4f3a99 | |||
| daeffbc944 | |||
| 87dde46fb0 | |||
| d96c6f867d | |||
| 1f2e6d5434 | |||
| 232b989d50 | |||
| d38261c908 | |||
| 3075bc3b7b | |||
| 842d0b1c9f | |||
| 042b238dd8 | |||
| c30904b631 | |||
| 225a71f4cd | |||
| 1d29a56344 | |||
| 320e00267d | |||
| 9869629b67 | |||
| 3da78e85bf | |||
| 11a4314261 | |||
| 65c19f82b9 | |||
| 0169cde8a4 | |||
| ab0173b7e6 |
@@ -0,0 +1,21 @@
|
||||
# Build artifacts
|
||||
buildroot/
|
||||
*.o
|
||||
*.a
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
*.exe
|
||||
|
||||
# Web assets
|
||||
*.min.js
|
||||
*.min.css
|
||||
|
||||
# Generated files
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.DS_Store
|
||||
|
||||
# IDE files
|
||||
.vscode/
|
||||
.idea/
|
||||
@@ -7,7 +7,7 @@ contact_links:
|
||||
url: https://www.facebook.com/groups/1049718498464482
|
||||
about: Please ask and answer questions here.
|
||||
- name: 🕹 Marlin on Discord
|
||||
url: https://discord.gg/n5NJ59y
|
||||
url: https://discord.com/servers/marlin-firmware-461605380783472640
|
||||
about: Join the Discord server for support and discussion.
|
||||
- name: 🔗 Marlin Discussion Forum
|
||||
url: https://reprap.org/forum/list.php?415
|
||||
|
||||
@@ -43,7 +43,7 @@ We have a Message Board and a Facebook group where our knowledgable user communi
|
||||
|
||||
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
||||
|
||||
* Use the link https://discord.gg/n5NJ59y to join up as a General User.
|
||||
* Use the link https://discord.com/servers/marlin-firmware-461605380783472640 to join up as a General User.
|
||||
* Even though our Discord is pretty active, it may take a while for community members to respond — please be patient!
|
||||
* Use the `#general` channel for general questions or discussion about Marlin.
|
||||
* Other channels exist for certain topics or are limited to Patrons. Check the channel list.
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
autolabel:
|
||||
name: Auto Label
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Auto Label for [BUG]
|
||||
uses: actions/github-script@v7
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
name: Bump Distribution Date
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
name: PR Bad Target
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: superbrothers/close-pull-request@v3
|
||||
|
||||
@@ -34,14 +34,19 @@ jobs:
|
||||
name: Build Test
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
test-platform:
|
||||
|
||||
# RP2040
|
||||
- SKR_Pico
|
||||
|
||||
# Native
|
||||
- linux_native
|
||||
- simulator_linux_release
|
||||
|
||||
# AVR
|
||||
- mega2560
|
||||
@@ -104,11 +109,11 @@ jobs:
|
||||
|
||||
# STM32F4
|
||||
- ARMED
|
||||
- BIGTREE_BTT002
|
||||
- BIGTREE_GTR_V1_0
|
||||
- BIGTREE_SKR_PRO
|
||||
- BTT_BTT002
|
||||
- BTT_GTR_V1_0
|
||||
- BTT_SKR_PRO
|
||||
- FLYF407ZG
|
||||
- FYSETC_S6
|
||||
- STM32F446VE_fysetc
|
||||
- LERDGEK
|
||||
- LERDGEX
|
||||
- mks_robin_pro2
|
||||
@@ -146,6 +151,12 @@ jobs:
|
||||
# HC32
|
||||
- HC32F460C_aquila_101
|
||||
|
||||
# GD32F3
|
||||
- GD32F303RE_creality_mfl
|
||||
|
||||
# GD32F1
|
||||
- GD32F103RC_aquila_mfl
|
||||
|
||||
# LPC176x - Lengthy tests
|
||||
- LPC1768
|
||||
- LPC1769
|
||||
@@ -159,15 +170,20 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
key: ${{ runner.os }}-pip-build-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-pip-build-
|
||||
|
||||
- name: Cache PlatformIO
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.platformio
|
||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||
path: |
|
||||
~/.platformio
|
||||
.pio/build
|
||||
.pio/libdeps
|
||||
key: ${{ runner.os }}-pio-build-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pio-build-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
@@ -181,6 +197,14 @@ jobs:
|
||||
pio upgrade --dev
|
||||
pio pkg update --global
|
||||
|
||||
- name: Install Simulator dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install build-essential
|
||||
sudo apt-get install libsdl2-dev
|
||||
sudo apt-get install libsdl2-net-dev
|
||||
sudo apt-get install libglm-dev
|
||||
|
||||
- name: Run ${{ matrix.test-platform }} Tests
|
||||
run: |
|
||||
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}
|
||||
|
||||
@@ -36,7 +36,7 @@ jobs:
|
||||
# pulls them into additional branches.
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check out the PR
|
||||
@@ -46,15 +46,20 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
key: ${{ runner.os }}-pip-unit-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-pip-unit-
|
||||
|
||||
- name: Cache PlatformIO
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.platformio
|
||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
||||
path: |
|
||||
~/.platformio
|
||||
.pio/build
|
||||
.pio/libdeps
|
||||
key: ${{ runner.os }}-pio-tests-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pio-tests-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#
|
||||
# ci-validate-boards.yml
|
||||
# Validate boards.h to make sure it's all set up correctly
|
||||
#
|
||||
|
||||
name: CI - Validate boards.h
|
||||
|
||||
# We can do the on: section as two items, one for pull requests and one for pushes...
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/core/boards.h'
|
||||
push:
|
||||
branches:
|
||||
- bugfix-2.1.x
|
||||
paths:
|
||||
- 'Marlin/src/core/boards.h'
|
||||
|
||||
jobs:
|
||||
validate_pins_files:
|
||||
name: Validate boards.h
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check out the PR
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Cache pip
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-boards-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-boards-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.9'
|
||||
architecture: 'x64'
|
||||
|
||||
- name: Validate core/boards.h
|
||||
run: |
|
||||
make validate-boards -j
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
name: Validate Pins Files
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- name: Check out the PR
|
||||
@@ -36,9 +36,9 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
key: ${{ runner.os }}-pip-pins-v1
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-pip-pins-
|
||||
|
||||
- name: Select Python 3.9
|
||||
uses: actions/setup-python@v5
|
||||
|
||||
@@ -13,7 +13,7 @@ on:
|
||||
|
||||
jobs:
|
||||
remove_label:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
name: Close Stale Issues
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
name: Lock Closed Issues
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
name: Unlock Reopened
|
||||
if: github.repository == 'MarlinFirmware/Marlin'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: OSDKDev/unlock-issues@v1.1
|
||||
|
||||
@@ -125,6 +125,7 @@ vc-fileutils.settings
|
||||
# Visual Studio Code
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
*.code-workspace
|
||||
|
||||
# Simulation files
|
||||
imgui.ini
|
||||
@@ -168,3 +169,6 @@ __pycache__
|
||||
tags
|
||||
*.logs
|
||||
*.bak
|
||||
.aider*
|
||||
!.aiderignore
|
||||
.env
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Marlin-specific settings for Zed
|
||||
*
|
||||
* For a full list of overridable settings, and general information on folder-specific settings,
|
||||
* see the documentation: https://zed.dev/docs/configuring-zed#settings-files
|
||||
*/
|
||||
{
|
||||
"languages": {
|
||||
"C": {
|
||||
"enable_language_server": false
|
||||
},
|
||||
"C++": {
|
||||
"enable_language_server": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,9 +6,10 @@ UNIT_TEST_CONFIG ?= default
|
||||
|
||||
help:
|
||||
@echo "Tasks for local development:"
|
||||
@echo "make marlin : Build marlin for the configured board"
|
||||
@echo "make marlin : Build Marlin for the configured board"
|
||||
@echo "make format-pins -j : Reformat all pins files (-j for parallel execution)"
|
||||
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
|
||||
@echo "make validate-boards -j : Validate boards.h and pins.h for standards compliance"
|
||||
@echo "make tests-single-ci : Run a single test from inside the CI"
|
||||
@echo "make tests-single-local : Run a single test locally"
|
||||
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
||||
@@ -16,7 +17,7 @@ help:
|
||||
@echo "make tests-all-local-docker : Run all tests locally, using docker"
|
||||
@echo "make unit-test-single-local : Run unit tests for a single config locally"
|
||||
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
|
||||
@echo "make unit-test-all-local : Run all code tests locally"
|
||||
@echo "make unit-test-all-local : Run all code tests locally"
|
||||
@echo "make unit-test-all-local-docker : Run all code tests locally, using docker"
|
||||
@echo "make setup-local-docker : Setup local docker using buildx"
|
||||
@echo ""
|
||||
@@ -102,3 +103,11 @@ format-pins: $(PINS)
|
||||
validate-pins: format-pins
|
||||
@echo "Validating pins files"
|
||||
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
|
||||
|
||||
BOARDS_FILE := Marlin/src/core/boards.h
|
||||
|
||||
.PHONY: validate-boards
|
||||
|
||||
validate-boards:
|
||||
@echo "Validating boards.h file"
|
||||
@python $(SCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)
|
||||
|
||||
+216
-108
@@ -50,7 +50,7 @@
|
||||
*
|
||||
* Calibration Guides: https://reprap.org/wiki/Calibration
|
||||
* https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide
|
||||
* https://web.archive.org/web/20220907014303/https://sites.google.com/site/repraplogphase/calibration-of-your-reprap
|
||||
* https://web.archive.org/web/20220907014303/sites.google.com/site/repraplogphase/calibration-of-your-reprap
|
||||
* https://youtu.be/wAL9d7FgInk
|
||||
* https://teachingtechyt.github.io/calibration.html
|
||||
*
|
||||
@@ -61,7 +61,7 @@
|
||||
// @section info
|
||||
|
||||
// Author info of this build printed to the host during boot and M115
|
||||
#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
|
||||
#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Original author or contributor.
|
||||
//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
|
||||
|
||||
// @section machine
|
||||
@@ -71,13 +71,15 @@
|
||||
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
||||
#endif
|
||||
|
||||
// @section serial
|
||||
|
||||
/**
|
||||
* Select the serial port on the board to use for communication with the host.
|
||||
* This allows the connection of wireless adapters (for instance) to non-default port pins.
|
||||
* Serial port -1 is the USB emulated serial port, if available.
|
||||
* Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader.
|
||||
*
|
||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
*/
|
||||
#define SERIAL_PORT 0
|
||||
|
||||
@@ -99,24 +101,35 @@
|
||||
/**
|
||||
* Select a secondary serial port on the board to use for communication with the host.
|
||||
* Currently Ethernet (-2) is only supported on Teensy 4.1 boards.
|
||||
* :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||
* :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
*/
|
||||
//#define SERIAL_PORT_2 -1
|
||||
//#define BAUDRATE_2 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
|
||||
|
||||
/**
|
||||
* Select a third serial port on the board to use for communication with the host.
|
||||
* Currently only supported for AVR, DUE, LPC1768/9 and STM32/STM32F1
|
||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7]
|
||||
* Currently supported for AVR, DUE, SAMD51, LPC1768/9, STM32/STM32F1/HC32, and Teensy 4.x
|
||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
*/
|
||||
//#define SERIAL_PORT_3 1
|
||||
//#define BAUDRATE_3 250000 // :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] Enable to override BAUDRATE
|
||||
|
||||
/**
|
||||
* Select a serial port to communicate with RS485 protocol
|
||||
* :[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
*/
|
||||
//#define RS485_SERIAL_PORT 1
|
||||
#ifdef RS485_SERIAL_PORT
|
||||
//#define M485_PROTOCOL 1 // Check your host for protocol compatibility
|
||||
//#define RS485_BUS_BUFFER_SIZE 128
|
||||
#endif
|
||||
|
||||
// Enable the Bluetooth serial interface on AT90USB devices
|
||||
//#define BLUETOOTH
|
||||
|
||||
// Name displayed in the LCD "Ready" message and Info menu
|
||||
//#define CUSTOM_MACHINE_NAME "3D Printer"
|
||||
//#define CONFIGURABLE_MACHINE_NAME // Add G-code M550 to set/report the machine name
|
||||
|
||||
// Printer's unique ID, used by some programs to differentiate between machines.
|
||||
// Choose your own or use a service like https://www.uuidgenerator.net/version4
|
||||
@@ -247,6 +260,7 @@
|
||||
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
||||
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
|
||||
#define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move
|
||||
#define SWITCHING_NOZZLE_LIFT_TO_PROBE // Lift toolheads out of the way while probing
|
||||
#endif
|
||||
|
||||
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
||||
@@ -375,14 +389,15 @@
|
||||
* PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version)
|
||||
* PRUSA_MMU2 : Průša MMU2
|
||||
* PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5)
|
||||
* PRUSA_MMU3 : Průša MMU3 (Requires MK3S extruder with motion sensor and MMU firmware version 3.x.x, EXTRUDERS = 5)
|
||||
* EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
|
||||
* EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware)
|
||||
*
|
||||
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
|
||||
* See additional options in Configuration_adv.h.
|
||||
* :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"]
|
||||
* :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "PRUSA_MMU3", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"]
|
||||
*/
|
||||
//#define MMU_MODEL PRUSA_MMU2
|
||||
//#define MMU_MODEL PRUSA_MMU3
|
||||
|
||||
// @section psu control
|
||||
|
||||
@@ -573,7 +588,7 @@
|
||||
#define DUMMY_THERMISTOR_998_VALUE 25
|
||||
#define DUMMY_THERMISTOR_999_VALUE 100
|
||||
|
||||
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1
|
||||
// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 / 2 / BED
|
||||
#if TEMP_SENSOR_IS_MAX_TC(0)
|
||||
#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
||||
#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
|
||||
@@ -586,6 +601,10 @@
|
||||
#define MAX31865_SENSOR_OHMS_2 100
|
||||
#define MAX31865_CALIBRATION_OHMS_2 430
|
||||
#endif
|
||||
#if TEMP_SENSOR_IS_MAX_TC(BED)
|
||||
#define MAX31865_SENSOR_OHMS_BED 100
|
||||
#define MAX31865_CALIBRATION_OHMS_BED 430
|
||||
#endif
|
||||
|
||||
#if HAS_E_TEMP_SENSOR
|
||||
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
||||
@@ -678,7 +697,9 @@
|
||||
#define PID_K1 0.95 // Smoothing factor within any PID loop
|
||||
|
||||
#if ENABLED(PIDTEMP)
|
||||
//#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation.
|
||||
//#define MIN_POWER 0 // Min power to improve PID stability (0..PID_MAX).
|
||||
// Get the power from the temperature report ('M105' => @:nnn) and try P*2-20 to P*2-10.
|
||||
//#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
||||
//#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders)
|
||||
// Set/get with G-code: M301 E[extruder number, 0-2]
|
||||
|
||||
@@ -703,10 +724,13 @@
|
||||
* Use a physical model of the hotend to control temperature. When configured correctly this gives
|
||||
* better responsiveness and stability than PID and removes the need for PID_EXTRUSION_SCALING
|
||||
* and PID_FAN_SCALING. Enable MPC_AUTOTUNE and use M306 T to autotune the model.
|
||||
* @section mpctemp
|
||||
* @section mpc temp
|
||||
*/
|
||||
#if ENABLED(MPCTEMP)
|
||||
#define MPC_AUTOTUNE // Include a method to do MPC auto-tuning (~6.3K bytes of flash)
|
||||
#if ENABLED(MPC_AUTOTUNE)
|
||||
//#define MPC_AUTOTUNE_DEBUG // Enable MPC debug logging (~870 bytes of flash)
|
||||
#endif
|
||||
//#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1.3K bytes of flash)
|
||||
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
|
||||
|
||||
@@ -774,8 +798,9 @@
|
||||
//#define PIDTEMPBED
|
||||
|
||||
#if ENABLED(PIDTEMPBED)
|
||||
//#define MIN_BED_POWER 0
|
||||
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
|
||||
//#define MIN_BED_POWER 0 // Min power to improve PID stability (0..MAX_BED_POWER).
|
||||
// Get the power from the temperature report ('M105' => B@:nnn) and try P*2-20 to P*2-10.
|
||||
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
||||
|
||||
// 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
|
||||
// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
|
||||
@@ -788,6 +813,40 @@
|
||||
//#define BED_LIMIT_SWITCHING // Keep the bed temperature within BED_HYSTERESIS of the target
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Peltier Bed - Heating and Cooling
|
||||
*
|
||||
* A Peltier device transfers heat from one side to the other in proportion to the amount of
|
||||
* current flowing through the device and the direction of current flow. So the same device
|
||||
* can both heat and cool.
|
||||
*
|
||||
* When "cooling" in addition to rejecting the heat transferred from the hot side to the cold
|
||||
* side, the dissipated power (voltage * current) must also be rejected. Be sure to set up a
|
||||
* fan that can be powered in sync with the Peltier unit.
|
||||
*
|
||||
* This feature is only set up to run in bang-bang mode because Peltiers don't handle PWM
|
||||
* well without filter circuitry.
|
||||
*
|
||||
* Since existing 3D printers are made to handle relatively high current for the heated bed,
|
||||
* we can use the heated bed power pins to control the Peltier power using the same G-codes
|
||||
* as the heated bed (M140, M190, etc.).
|
||||
*
|
||||
* A second GPIO pin is required to control current direction.
|
||||
* Two configurations are possible: Relay and H-Bridge
|
||||
*
|
||||
* (At this time only relay is supported. H-bridge requires 4 MOS switches configured in H-Bridge.)
|
||||
*
|
||||
* Power is handled by the bang-bang control loop: 0 or 255.
|
||||
* Cooling applications are more common than heating, so the pin states are commonly:
|
||||
* LOW = Heating = Relay Energized
|
||||
* HIGH = Cooling = Relay in "Normal" state
|
||||
*/
|
||||
//#define PELTIER_BED
|
||||
#if ENABLED(PELTIER_BED)
|
||||
#define PELTIER_DIR_PIN -1 // Relay control pin for Peltier
|
||||
#define PELTIER_DIR_HEAT_STATE LOW // The relay pin state that causes the Peltier to heat
|
||||
#endif
|
||||
|
||||
// Add 'M190 R T' for more gradual M190 R bed cooling.
|
||||
//#define BED_ANNEALING_GCODE
|
||||
|
||||
@@ -822,24 +881,26 @@
|
||||
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
||||
|
||||
#if ENABLED(PIDTEMPCHAMBER)
|
||||
#define MIN_CHAMBER_POWER 0
|
||||
//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port.
|
||||
//#define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER)
|
||||
// Get the power from the temperature report ('M105' => C@:nnn) and try P*2-20 to P*2-10.
|
||||
//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port. Use 'M303 D' to enable/disable.
|
||||
|
||||
// Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element
|
||||
// and placed inside the small Creality printer enclosure tent.
|
||||
//
|
||||
#define DEFAULT_chamberKp 37.04
|
||||
#define DEFAULT_chamberKi 1.40
|
||||
#define DEFAULT_chamberKp 37.04
|
||||
#define DEFAULT_chamberKi 1.40
|
||||
#define DEFAULT_chamberKd 655.17
|
||||
// M309 P37.04 I1.04 D655.17
|
||||
|
||||
// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
|
||||
#endif // PIDTEMPCHAMBER
|
||||
|
||||
// @section pid temp
|
||||
|
||||
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
|
||||
//#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
|
||||
//#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
|
||||
#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
|
||||
#define PID_FUNCTIONAL_RANGE 20 // If the temperature difference between the target temperature and the actual temperature
|
||||
// is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
|
||||
|
||||
//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
|
||||
@@ -891,7 +952,7 @@
|
||||
//============================= Mechanical Settings =========================
|
||||
//===========================================================================
|
||||
|
||||
// @section machine
|
||||
// @section kinematics
|
||||
|
||||
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
|
||||
// either in the usual order or reversed
|
||||
@@ -915,6 +976,15 @@
|
||||
// Enable for a belt style printer with endless "Z" motion
|
||||
//#define BELTPRINTER
|
||||
|
||||
// Articulated robot (arm). Joints are directly mapped to axes with no kinematics.
|
||||
//#define ARTICULATED_ROBOT_ARM
|
||||
|
||||
// For a hot wire cutter with parallel horizontal axes (X, I) where the heights of the two wire
|
||||
// ends are controlled by parallel axes (Y, J). Joints are directly mapped to axes (no kinematics).
|
||||
//#define FOAMCUTTER_XYUV
|
||||
|
||||
// @section polargraph
|
||||
|
||||
// Enable for Polargraph Kinematics
|
||||
//#define POLARGRAPH
|
||||
#if ENABLED(POLARGRAPH)
|
||||
@@ -958,9 +1028,6 @@
|
||||
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
|
||||
#define PRINTABLE_RADIUS 140.0 // (mm)
|
||||
|
||||
// Maximum reachable area
|
||||
#define DELTA_MAX_RADIUS 140.0 // (mm)
|
||||
|
||||
// Center-to-center distance of the holes in the diagonal push rods.
|
||||
#define DELTA_DIAGONAL_ROD 250.0 // (mm)
|
||||
|
||||
@@ -1101,15 +1168,6 @@
|
||||
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
||||
#endif
|
||||
|
||||
// @section machine
|
||||
|
||||
// Articulated robot (arm). Joints are directly mapped to axes with no kinematics.
|
||||
//#define ARTICULATED_ROBOT_ARM
|
||||
|
||||
// For a hot wire cutter with parallel horizontal axes (X, I) where the heights of the two wire
|
||||
// ends are controlled by parallel axes (Y, J). Joints are directly mapped to axes (no kinematics).
|
||||
//#define FOAMCUTTER_XYUV
|
||||
|
||||
//===========================================================================
|
||||
//============================== Endstop Settings ===========================
|
||||
//===========================================================================
|
||||
@@ -1454,7 +1512,7 @@
|
||||
* A lightweight, solenoid-driven probe.
|
||||
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
||||
*
|
||||
* Also requires: PROBE_ENABLE_DISABLE
|
||||
* Also requires PROBE_ENABLE_DISABLE
|
||||
*/
|
||||
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
||||
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
||||
@@ -1482,6 +1540,20 @@
|
||||
#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
|
||||
#define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed
|
||||
|
||||
/**
|
||||
* Magnetically Mounted Probe with a Servo mechanism
|
||||
* Probe Deploy and Stow both follow the same basic sequence:
|
||||
* - Rotate the SERVO to its Deployed angle
|
||||
* - Perform XYZ moves to deploy or stow the PROBE
|
||||
* - Rotate the SERVO to its Stowed angle
|
||||
*/
|
||||
//#define MAG_MOUNTED_PROBE_SERVO_NR 0 // Servo Number for this probe
|
||||
#ifdef MAG_MOUNTED_PROBE_SERVO_NR
|
||||
#define MAG_MOUNTED_PROBE_SERVO_ANGLES { 90, 0 } // Servo Angles for Deployed, Stowed
|
||||
#define MAG_MOUNTED_PRE_DEPLOY { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo activation
|
||||
#define MAG_MOUNTED_PRE_STOW { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo deactivation
|
||||
#endif
|
||||
|
||||
#define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe
|
||||
#define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock
|
||||
#define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
|
||||
@@ -1593,14 +1665,15 @@
|
||||
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
||||
#define PROBING_MARGIN 10
|
||||
|
||||
// X and Y axis travel speed (mm/min) between probes
|
||||
#define XY_PROBE_FEEDRATE (133*60)
|
||||
// X and Y axis travel speed between probes.
|
||||
// Leave undefined to use the average of the current XY homing feedrate.
|
||||
#define XY_PROBE_FEEDRATE (133*60) // (mm/min)
|
||||
|
||||
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
||||
#define Z_PROBE_FEEDRATE_FAST (4*60)
|
||||
// Feedrate for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
||||
#define Z_PROBE_FEEDRATE_FAST (4*60) // (mm/min)
|
||||
|
||||
// Feedrate (mm/min) for the "accurate" probe of each point
|
||||
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2)
|
||||
// Feedrate for the "accurate" probe of each point
|
||||
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) // (mm/min)
|
||||
|
||||
/**
|
||||
* Probe Activation Switch
|
||||
@@ -1624,6 +1697,7 @@
|
||||
#define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
|
||||
#define PROBE_TARE_STATE HIGH // State to write pin for tare
|
||||
//#define PROBE_TARE_PIN PA5 // Override default pin
|
||||
//#define PROBE_TARE_MENU // Display a menu item to tare the probe
|
||||
#if ENABLED(PROBE_ACTIVATION_SWITCH)
|
||||
//#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
|
||||
#endif
|
||||
@@ -1661,8 +1735,8 @@
|
||||
* probe Z Offset set with NOZZLE_TO_PROBE_OFFSET, M851, or the LCD.
|
||||
* Only integer values >= 1 are valid here.
|
||||
*
|
||||
* Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle.
|
||||
* But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle.
|
||||
* Example: 'M851 Z-5' with a CLEARANCE of 4 => 9mm from bed to nozzle.
|
||||
* But: 'M851 Z+1' with a CLEARANCE of 2 => 2mm from bed to nozzle.
|
||||
*/
|
||||
#define Z_CLEARANCE_DEPLOY_PROBE 10 // (mm) Z Clearance for Deploy/Stow
|
||||
#define Z_CLEARANCE_BETWEEN_PROBES 5 // (mm) Z Clearance between probe points
|
||||
@@ -1713,18 +1787,20 @@
|
||||
#define PROBING_BED_TEMP 50
|
||||
#endif
|
||||
|
||||
// @section stepper drivers
|
||||
|
||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||
// :{ 0:'Low', 1:'High' }
|
||||
#define X_ENABLE_ON 0
|
||||
#define Y_ENABLE_ON 0
|
||||
#define Z_ENABLE_ON 0
|
||||
#define E_ENABLE_ON 0 // For all extruders
|
||||
//#define I_ENABLE_ON 0
|
||||
//#define J_ENABLE_ON 0
|
||||
//#define K_ENABLE_ON 0
|
||||
//#define U_ENABLE_ON 0
|
||||
//#define V_ENABLE_ON 0
|
||||
//#define W_ENABLE_ON 0
|
||||
// :['LOW', 'HIGH']
|
||||
#define X_ENABLE_ON LOW
|
||||
#define Y_ENABLE_ON LOW
|
||||
#define Z_ENABLE_ON LOW
|
||||
#define E_ENABLE_ON LOW // For all extruders
|
||||
//#define I_ENABLE_ON LOW
|
||||
//#define J_ENABLE_ON LOW
|
||||
//#define K_ENABLE_ON LOW
|
||||
//#define U_ENABLE_ON LOW
|
||||
//#define V_ENABLE_ON LOW
|
||||
//#define W_ENABLE_ON LOW
|
||||
|
||||
// Disable axis steppers immediately when they're not being stepped.
|
||||
// WARNING: When motors turn off there is a chance of losing position accuracy!
|
||||
@@ -1886,6 +1962,8 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @section filament runout sensors
|
||||
*
|
||||
* Filament Runout Sensors
|
||||
* Mechanical or opto endstops are used to check for the presence of filament.
|
||||
*
|
||||
@@ -1997,9 +2075,9 @@
|
||||
//#define FIL_MOTION8_PULLUP
|
||||
//#define FIL_MOTION8_PULLDOWN
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif // FILAMENT_MOTION_SENSOR
|
||||
#endif // FILAMENT_RUNOUT_DISTANCE_MM
|
||||
#endif // FILAMENT_RUNOUT_SENSOR
|
||||
|
||||
//===========================================================================
|
||||
//=============================== Bed Leveling ==============================
|
||||
@@ -2045,6 +2123,12 @@
|
||||
//#define AUTO_BED_LEVELING_UBL
|
||||
//#define MESH_BED_LEVELING
|
||||
|
||||
/**
|
||||
* Commands to execute at the start of G29 probing,
|
||||
* after switching to the PROBING_TOOL.
|
||||
*/
|
||||
//#define EVENT_GCODE_BEFORE_G29 "M300 P440 S200"
|
||||
|
||||
/**
|
||||
* Commands to execute at the end of G29 probing.
|
||||
* Useful to retract or move the Z probe out of the way.
|
||||
@@ -2193,7 +2277,7 @@
|
||||
//===========================================================================
|
||||
|
||||
#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
|
||||
#define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited.
|
||||
#define GRID_MAX_POINTS_X 3
|
||||
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X
|
||||
|
||||
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
|
||||
@@ -2282,6 +2366,9 @@
|
||||
// Homing speeds (linear=mm/min, rotational=°/min)
|
||||
#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) }
|
||||
|
||||
// Edit homing feedrates with M210 and MarlinUI menu items
|
||||
//#define EDITABLE_HOMING_FEEDRATE
|
||||
|
||||
// Validate that endstops are triggered on homing moves
|
||||
#define VALIDATE_HOMING_ENDSTOPS
|
||||
|
||||
@@ -2408,9 +2495,9 @@
|
||||
#define PREHEAT_2_TEMP_CHAMBER 35
|
||||
#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255
|
||||
|
||||
// @section motion
|
||||
|
||||
/**
|
||||
* @section nozzle park
|
||||
*
|
||||
* Nozzle Park
|
||||
*
|
||||
* Park the nozzle at the given XYZ position on idle or G27.
|
||||
@@ -2433,6 +2520,8 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @section nozzle clean
|
||||
*
|
||||
* Clean Nozzle Feature
|
||||
*
|
||||
* Adds the G12 command to perform a nozzle cleaning process.
|
||||
@@ -2593,9 +2682,24 @@
|
||||
//#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE
|
||||
#endif
|
||||
|
||||
//=============================================================================
|
||||
//============================= LCD and SD support ============================
|
||||
//=============================================================================
|
||||
// @section media
|
||||
|
||||
/**
|
||||
* SD CARD
|
||||
*
|
||||
* SD Card support is disabled by default. If your controller has an SD slot,
|
||||
* you must uncomment the following option or it won't work.
|
||||
*/
|
||||
//#define SDSUPPORT
|
||||
|
||||
/**
|
||||
* SD CARD: ENABLE CRC
|
||||
*
|
||||
* Use CRC checks and retries on the SD communication.
|
||||
*/
|
||||
#if ENABLED(SDSUPPORT)
|
||||
//#define SD_CHECK_AND_RETRY
|
||||
#endif
|
||||
|
||||
// @section interface
|
||||
|
||||
@@ -2642,21 +2746,6 @@
|
||||
*/
|
||||
#define LCD_INFO_SCREEN_STYLE 0
|
||||
|
||||
/**
|
||||
* SD CARD
|
||||
*
|
||||
* SD Card support is disabled by default. If your controller has an SD slot,
|
||||
* you must uncomment the following option or it won't work.
|
||||
*/
|
||||
//#define SDSUPPORT
|
||||
|
||||
/**
|
||||
* SD CARD: ENABLE CRC
|
||||
*
|
||||
* Use CRC checks and retries on the SD communication.
|
||||
*/
|
||||
//#define SD_CHECK_AND_RETRY
|
||||
|
||||
/**
|
||||
* LCD Menu Items
|
||||
*
|
||||
@@ -2785,7 +2874,7 @@
|
||||
|
||||
//
|
||||
// Original RADDS LCD Display+Encoder+SDCardReader
|
||||
// https://web.archive.org/web/20200719145306/http://doku.radds.org/dokumentation/lcd-display/
|
||||
// https://web.archive.org/web/20200719145306/doku.radds.org/dokumentation/lcd-display/
|
||||
//
|
||||
//#define RADDS_DISPLAY
|
||||
|
||||
@@ -2824,13 +2913,15 @@
|
||||
//
|
||||
//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
|
||||
|
||||
//
|
||||
// ANET and Tronxy 20x4 Controller
|
||||
//
|
||||
//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
||||
// This LCD is known to be susceptible to electrical interference
|
||||
// which scrambles the display. Pressing any button clears it up.
|
||||
// This is a LCD2004 display with 5 analog buttons.
|
||||
/**
|
||||
* ANET and Tronxy 20x4 Controller
|
||||
* LCD2004 display with 5 analog buttons.
|
||||
*
|
||||
* NOTE: Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
||||
* This LCD is known to be susceptible to electrical interference which
|
||||
* scrambles the display. Press any button to clear it up.
|
||||
*/
|
||||
//#define ZONESTAR_LCD
|
||||
|
||||
//
|
||||
// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
|
||||
@@ -2851,7 +2942,7 @@
|
||||
|
||||
//
|
||||
// Elefu RA Board Control Panel
|
||||
// https://web.archive.org/web/20140823033947/http://www.elefu.com/index.php?route=product/product&product_id=53
|
||||
// https://web.archive.org/web/20140823033947/www.elefu.com/index.php?route=product/product&product_id=53
|
||||
//
|
||||
//#define RA_CONTROL_PANEL
|
||||
|
||||
@@ -2983,7 +3074,7 @@
|
||||
|
||||
//
|
||||
// Cartesio UI
|
||||
// https://web.archive.org/web/20180605050442/http://mauk.cc/webshop/cartesio-shop/electronics/user-interface
|
||||
// https://web.archive.org/web/20180605050442/mauk.cc/webshop/cartesio-shop/electronics/user-interface
|
||||
//
|
||||
//#define CARTESIO_UI
|
||||
|
||||
@@ -3107,14 +3198,14 @@
|
||||
//
|
||||
// Tiny, but very sharp OLED display
|
||||
//
|
||||
//#define MKS_12864OLED // Uses the SH1106 controller (default)
|
||||
//#define MKS_12864OLED // Uses the SH1106 controller
|
||||
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
||||
|
||||
//
|
||||
// Zonestar OLED 128×64 Full Graphics Controller
|
||||
//
|
||||
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller
|
||||
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default)
|
||||
//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller
|
||||
//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller
|
||||
|
||||
//
|
||||
@@ -3192,7 +3283,7 @@
|
||||
#endif
|
||||
|
||||
//
|
||||
// Touch-screen LCD for Malyan M200/M300 printers
|
||||
// LCD for Malyan M200/M300 printers
|
||||
//
|
||||
//#define MALYAN_LCD
|
||||
|
||||
@@ -3220,6 +3311,11 @@
|
||||
//
|
||||
//#define ANYCUBIC_LCD_VYPER
|
||||
|
||||
//
|
||||
// Sovol SV-06 Resistive Touch Screen
|
||||
//
|
||||
//#define SOVOL_SV06_RTS
|
||||
|
||||
//
|
||||
// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028
|
||||
//
|
||||
@@ -3358,7 +3454,7 @@
|
||||
|
||||
#if ENABLED(TFT_COLOR_UI)
|
||||
/**
|
||||
* TFT Font for Color_UI. Choose one of the following:
|
||||
* TFT Font for Color UI. Choose one of the following:
|
||||
*
|
||||
* NOTOSANS - Default font with anti-aliasing. Supports Latin Extended and non-Latin characters.
|
||||
* UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters.
|
||||
@@ -3367,7 +3463,7 @@
|
||||
#define TFT_FONT NOTOSANS
|
||||
|
||||
/**
|
||||
* TFT Theme for Color_UI. Choose one of the following or add a new one to 'Marlin/src/lcd/tft/themes' directory
|
||||
* TFT Theme for Color UI. Choose one of the following or add a new one to 'Marlin/src/lcd/tft/themes' directory
|
||||
*
|
||||
* BLUE_MARLIN - Default theme with 'midnight blue' background
|
||||
* BLACK_MARLIN - Theme with 'black' background
|
||||
@@ -3391,6 +3487,8 @@
|
||||
* TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
|
||||
* TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
|
||||
* TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
|
||||
*
|
||||
* :{ 'TFT_NO_ROTATION':'None', 'TFT_ROTATE_90':'90°', 'TFT_ROTATE_90_MIRROR_X':'90° (Mirror X)', 'TFT_ROTATE_90_MIRROR_Y':'90° (Mirror Y)', 'TFT_ROTATE_180':'180°', 'TFT_ROTATE_180_MIRROR_X':'180° (Mirror X)', 'TFT_ROTATE_180_MIRROR_Y':'180° (Mirror Y)', 'TFT_ROTATE_270':'270°', 'TFT_ROTATE_270_MIRROR_X':'270° (Mirror X)', 'TFT_ROTATE_270_MIRROR_Y':'270° (Mirror Y)', 'TFT_MIRROR_X':'Mirror X', 'TFT_MIRROR_Y':'Mirror Y' }
|
||||
*/
|
||||
//#define TFT_ROTATION TFT_NO_ROTATION
|
||||
|
||||
@@ -3415,7 +3513,9 @@
|
||||
#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
|
||||
#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
|
||||
|
||||
//#define DISABLE_ENCODER // Disable the click encoder, if any
|
||||
#if ANY(TFT_CLASSIC_UI, TFT_COLOR_UI)
|
||||
//#define NO_BACK_MENU_ITEM // Don't display a top menu item to go back to the parent menu
|
||||
#endif
|
||||
|
||||
#define TOUCH_SCREEN_CALIBRATION
|
||||
|
||||
@@ -3439,7 +3539,9 @@
|
||||
// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
|
||||
//
|
||||
//#define REPRAPWORLD_KEYPAD
|
||||
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
||||
#if ENABLED(REPRAPWORLD_KEYPAD)
|
||||
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
||||
#endif
|
||||
|
||||
//
|
||||
// EasyThreeD ET-4000+ with button input and status LED
|
||||
@@ -3456,22 +3558,26 @@
|
||||
// :[1,2,3,4,5,6,7,8]
|
||||
//#define NUM_M106_FANS 1
|
||||
|
||||
// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
|
||||
// which is not as annoying as with the hardware PWM. On the other hand, if this frequency
|
||||
// is too low, you should also increment SOFT_PWM_SCALE.
|
||||
/**
|
||||
* Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
|
||||
* which is not as annoying as with the hardware PWM. On the other hand, if this frequency
|
||||
* is too low, you should also increment SOFT_PWM_SCALE.
|
||||
*/
|
||||
//#define FAN_SOFT_PWM
|
||||
|
||||
// Incrementing this by 1 will double the software PWM frequency,
|
||||
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
|
||||
// However, control resolution will be halved for each increment;
|
||||
// at zero value, there are 128 effective control positions.
|
||||
// :[0,1,2,3,4,5,6,7]
|
||||
/**
|
||||
* Incrementing this by 1 will double the software PWM frequency, affecting heaters, and
|
||||
* the fan if FAN_SOFT_PWM is enabled. However, control resolution will be halved for each
|
||||
* increment; at zero value, there are 128 effective control positions.
|
||||
* :[0,1,2,3,4,5,6,7]
|
||||
*/
|
||||
#define SOFT_PWM_SCALE 0
|
||||
|
||||
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
|
||||
// be used to mitigate the associated resolution loss. If enabled,
|
||||
// some of the PWM cycles are stretched so on average the desired
|
||||
// duty cycle is attained.
|
||||
/**
|
||||
* If SOFT_PWM_SCALE is set to a value higher than 0, dithering can be used to mitigate the
|
||||
* associated resolution loss. If enabled, some of the PWM cycles are stretched so on average
|
||||
* the desired duty cycle is attained.
|
||||
*/
|
||||
//#define SOFT_PWM_DITHER
|
||||
|
||||
// @section extras
|
||||
@@ -3481,9 +3587,11 @@
|
||||
|
||||
// @section lights
|
||||
|
||||
// Temperature status LEDs that display the hotend and bed temperature.
|
||||
// If all hotends, bed temperature, and target temperature are under 54C
|
||||
// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
|
||||
/**
|
||||
* Temperature status LEDs that display the hotend and bed temperature.
|
||||
* If all hotends, bed temperature, and target temperature are under 54C
|
||||
* the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
|
||||
*/
|
||||
//#define TEMP_STAT_LEDS
|
||||
|
||||
// Support for BlinkM/CyzRgb
|
||||
|
||||
+322
-157
@@ -47,8 +47,9 @@
|
||||
* 2 = config.ini - File format for PlatformIO preprocessing.
|
||||
* 3 = schema.json - The entire configuration schema. (13 = pattern groups)
|
||||
* 4 = schema.yml - The entire configuration schema.
|
||||
* 5 = Config.h - Minimal configuration by popular demand.
|
||||
*/
|
||||
//#define CONFIG_EXPORT 2 // :[1:'JSON', 2:'config.ini', 3:'schema.json', 4:'schema.yml']
|
||||
//#define CONFIG_EXPORT 105 // :[1:'JSON', 2:'config.ini', 3:'schema.json', 4:'schema.yml', 5:'Config.h']
|
||||
|
||||
//===========================================================================
|
||||
//============================= Thermal Settings ============================
|
||||
@@ -173,9 +174,10 @@
|
||||
* Thermocouple Options — for MAX6675 (-2), MAX31855 (-3), and MAX31865 (-5).
|
||||
*/
|
||||
//#define TEMP_SENSOR_FORCE_HW_SPI // Ignore SCK/MOSI/MISO pins; use CS and the default SPI bus.
|
||||
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
|
||||
//#define MAX31865_SENSOR_WIRES_1 2
|
||||
//#define MAX31865_SENSOR_WIRES_2 2
|
||||
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
|
||||
//#define MAX31865_SENSOR_WIRES_1 2
|
||||
//#define MAX31865_SENSOR_WIRES_2 2
|
||||
//#define MAX31865_SENSOR_WIRES_BED 2
|
||||
|
||||
//#define MAX31865_50HZ_FILTER // Use a 50Hz filter instead of the default 60Hz.
|
||||
//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors.
|
||||
@@ -187,6 +189,7 @@
|
||||
//#define MAX31865_WIRE_OHMS_0 0.95f // For 2-wire, set the wire resistances for more accurate readings.
|
||||
//#define MAX31865_WIRE_OHMS_1 0.0f
|
||||
//#define MAX31865_WIRE_OHMS_2 0.0f
|
||||
//#define MAX31865_WIRE_OHMS_BED 0.0f
|
||||
|
||||
/**
|
||||
* Hephestos 2 24V heated bed upgrade kit.
|
||||
@@ -202,7 +205,7 @@
|
||||
//
|
||||
#if DISABLED(PIDTEMPBED)
|
||||
#define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
||||
#if ENABLED(BED_LIMIT_SWITCHING)
|
||||
#if ANY(BED_LIMIT_SWITCHING, PELTIER_BED)
|
||||
#define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS
|
||||
#endif
|
||||
#endif
|
||||
@@ -210,18 +213,19 @@
|
||||
//
|
||||
// Heated Chamber options
|
||||
//
|
||||
#if DISABLED(PIDTEMPCHAMBER)
|
||||
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
||||
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
||||
#define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if TEMP_SENSOR_CHAMBER
|
||||
//#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug)
|
||||
//#define HEATER_CHAMBER_INVERTING false
|
||||
//#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug)
|
||||
|
||||
#if DISABLED(PIDTEMPCHAMBER)
|
||||
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
||||
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
||||
#define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//#define CHAMBER_FAN // Enable a fan on the chamber
|
||||
#if ENABLED(CHAMBER_FAN)
|
||||
//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
|
||||
@@ -303,9 +307,9 @@
|
||||
* If you get false positives for "Thermal Runaway", increase
|
||||
* THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD
|
||||
*/
|
||||
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
|
||||
#define THERMAL_PROTECTION_PERIOD 40 // (seconds)
|
||||
#define THERMAL_PROTECTION_HYSTERESIS 4 // (°C)
|
||||
#if ALL(HAS_HOTEND, THERMAL_PROTECTION_HOTENDS)
|
||||
#define THERMAL_PROTECTION_PERIOD 40 // (seconds)
|
||||
#define THERMAL_PROTECTION_HYSTERESIS 4 // (°C)
|
||||
|
||||
//#define ADAPTIVE_FAN_SLOWING // Slow down the part-cooling fan if the temperature drops
|
||||
#if ENABLED(ADAPTIVE_FAN_SLOWING)
|
||||
@@ -334,7 +338,7 @@
|
||||
/**
|
||||
* Thermal Protection parameters for the bed are just as above for hotends.
|
||||
*/
|
||||
#if ENABLED(THERMAL_PROTECTION_BED)
|
||||
#if TEMP_SENSOR_BED && ENABLED(THERMAL_PROTECTION_BED)
|
||||
#define THERMAL_PROTECTION_BED_PERIOD 20 // (seconds)
|
||||
#define THERMAL_PROTECTION_BED_HYSTERESIS 2 // (°C)
|
||||
|
||||
@@ -348,7 +352,7 @@
|
||||
/**
|
||||
* Thermal Protection parameters for the heated chamber.
|
||||
*/
|
||||
#if ENABLED(THERMAL_PROTECTION_CHAMBER)
|
||||
#if TEMP_SENSOR_CHAMBER && ENABLED(THERMAL_PROTECTION_CHAMBER)
|
||||
#define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // (seconds)
|
||||
#define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // (°C)
|
||||
|
||||
@@ -362,7 +366,7 @@
|
||||
/**
|
||||
* Thermal Protection parameters for the laser cooler.
|
||||
*/
|
||||
#if ENABLED(THERMAL_PROTECTION_COOLER)
|
||||
#if TEMP_SENSOR_COOLER && ENABLED(THERMAL_PROTECTION_COOLER)
|
||||
#define THERMAL_PROTECTION_COOLER_PERIOD 10 // (seconds)
|
||||
#define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // (°C)
|
||||
|
||||
@@ -590,6 +594,8 @@
|
||||
// Use TEMP_SENSOR_SOC as a trigger for enabling the controller fan
|
||||
//#define CONTROLLER_FAN_MIN_SOC_TEMP 40 // (°C) Turn on the fan if the SoC reaches this temperature
|
||||
|
||||
#define CONTROLLER_FAN_BED_HEATING // Turn on the fan when heating the bed
|
||||
|
||||
//#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings
|
||||
#if ENABLED(CONTROLLER_FAN_EDITABLE)
|
||||
#define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu
|
||||
@@ -604,6 +610,8 @@
|
||||
*/
|
||||
//#define FAN_KICKSTART_TIME 100 // (ms)
|
||||
//#define FAN_KICKSTART_POWER 180 // 64-255
|
||||
//#define FAN_KICKSTART_LINEAR // Set kickstart time linearly based on the speed, e.g., for 20% (51) it will be FAN_KICKSTART_TIME * 0.2.
|
||||
// Useful for quick speed up to low speed. Kickstart power must be set to 255.
|
||||
|
||||
// Some coolers may require a non-zero "off" state.
|
||||
//#define FAN_OFF_PWM 1
|
||||
@@ -1014,7 +1022,7 @@
|
||||
|
||||
#endif // BLTOUCH
|
||||
|
||||
// @section calibration
|
||||
// @section calibrate
|
||||
|
||||
/**
|
||||
* Z Steppers Auto-Alignment
|
||||
@@ -1079,9 +1087,11 @@
|
||||
#define HOME_AFTER_G34
|
||||
#endif
|
||||
|
||||
//
|
||||
// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe.
|
||||
//
|
||||
/**
|
||||
* Assisted Tramming
|
||||
*
|
||||
* Add the G35 command to measure bed corners and help adjust screws. Requires a bed probe.
|
||||
*/
|
||||
//#define ASSISTED_TRAMMING
|
||||
#if ENABLED(ASSISTED_TRAMMING)
|
||||
|
||||
@@ -1102,29 +1112,35 @@
|
||||
//#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment
|
||||
|
||||
/**
|
||||
* Screw thread:
|
||||
* M3: 30 = Clockwise, 31 = Counter-Clockwise
|
||||
* M4: 40 = Clockwise, 41 = Counter-Clockwise
|
||||
* M5: 50 = Clockwise, 51 = Counter-Clockwise
|
||||
* Screw Thread. Use one of the following defines:
|
||||
*
|
||||
* M3_CW = M3 Clockwise, M3_CCW = M3 Counter-Clockwise
|
||||
* M4_CW = M4 Clockwise, M4_CCW = M4 Counter-Clockwise
|
||||
* M5_CW = M5 Clockwise, M5_CCW = M5 Counter-Clockwise
|
||||
*
|
||||
* :{'M3_CW':'M3 Clockwise','M3_CCW':'M3 Counter-Clockwise','M4_CW':'M4 Clockwise','M4_CCW':'M4 Counter-Clockwise','M5_CW':'M5 Clockwise','M5_CCW':'M5 Counter-Clockwise'}
|
||||
*/
|
||||
#define TRAMMING_SCREW_THREAD 30
|
||||
#define TRAMMING_SCREW_THREAD M3_CW
|
||||
|
||||
#endif
|
||||
|
||||
// @section motion control
|
||||
|
||||
/**
|
||||
* Fixed-time-based Motion Control -- EXPERIMENTAL
|
||||
* Fixed-time-based Motion Control -- BETA FEATURE
|
||||
* Enable/disable and set parameters with G-code M493.
|
||||
* See ft_types.h for named values used by FTM options.
|
||||
*/
|
||||
//#define FT_MOTION
|
||||
#if ENABLED(FT_MOTION)
|
||||
#define FTM_DEFAULT_MODE ftMotionMode_DISABLED // Default mode of fixed time control. (Enums in ft_types.h)
|
||||
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (Enums in ft_types.h)
|
||||
#define FTM_SHAPING_DEFAULT_X_FREQ 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
#define FTM_SHAPING_DEFAULT_Y_FREQ 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
|
||||
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
|
||||
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
|
||||
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
|
||||
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
|
||||
#define FTM_LINEAR_ADV_DEFAULT_ENA false // Default linear advance enable (true) or disable (false)
|
||||
#define FTM_LINEAR_ADV_DEFAULT_K 0.0f // Default linear advance gain
|
||||
#define FTM_LINEAR_ADV_DEFAULT_K 0.0f // Default linear advance gain. (Acceleration-based scaling factor.)
|
||||
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
|
||||
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
|
||||
|
||||
@@ -1147,18 +1163,13 @@
|
||||
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (Reciprocal of FTM_TS)
|
||||
#define FTM_TS 0.001f // (s) Time step for trajectory generation. (Reciprocal of FTM_FS)
|
||||
|
||||
// These values may be configured to adjust the duration of loop().
|
||||
#define FTM_STEPS_PER_LOOP 60 // Number of stepper commands to generate each loop()
|
||||
#define FTM_POINTS_PER_LOOP 100 // Number of trajectory points to generate each loop()
|
||||
|
||||
#if DISABLED(COREXY)
|
||||
#define FTM_STEPPER_FS 20000 // (Hz) Frequency for stepper I/O update
|
||||
|
||||
// Use this to adjust the time required to consume the command buffer.
|
||||
// Try increasing this value if stepper motion is choppy.
|
||||
#define FTM_STEPPERCMD_BUFF_SIZE 3000 // Size of the stepper command buffers
|
||||
// (FTM_STEPS_PER_LOOP * FTM_POINTS_PER_LOOP) is a good start
|
||||
// If you run out of memory, fall back to 3000 and increase progressively
|
||||
|
||||
#else
|
||||
// CoreXY motion needs a larger buffer size. These values are based on our testing.
|
||||
#define FTM_STEPPER_FS 30000
|
||||
@@ -1180,7 +1191,7 @@
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Input Shaping -- EXPERIMENTAL
|
||||
* Input Shaping
|
||||
*
|
||||
* Zero Vibration (ZV) Input Shaping for X and/or Y movements.
|
||||
*
|
||||
@@ -1252,8 +1263,8 @@
|
||||
#define DISABLE_IDLE_E // Shut down all idle extruders
|
||||
|
||||
// Default Minimum Feedrates for printing and travel moves
|
||||
#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum feedrate. Set with M205 S.
|
||||
#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s. °/s for rotational-only moves) Minimum travel feedrate. Set with M205 T.
|
||||
#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S.
|
||||
#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T.
|
||||
|
||||
// Minimum time that a segment needs to take as the buffer gets emptied
|
||||
#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B.
|
||||
@@ -1331,22 +1342,20 @@
|
||||
//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
|
||||
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
|
||||
|
||||
#define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm
|
||||
|
||||
#define CALIBRATION_FEEDRATE_SLOW 60 // mm/min
|
||||
#define CALIBRATION_FEEDRATE_FAST 1200 // mm/min
|
||||
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min
|
||||
#define CALIBRATION_FEEDRATE_SLOW 60 // (mm/min)
|
||||
#define CALIBRATION_FEEDRATE_FAST 1200 // (mm/min)
|
||||
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // (mm/min)
|
||||
|
||||
// The following parameters refer to the conical section of the nozzle tip.
|
||||
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm
|
||||
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm
|
||||
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // (mm)
|
||||
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // (mm)
|
||||
|
||||
// Uncomment to enable reporting (required for "G425 V", but consumes flash).
|
||||
//#define CALIBRATION_REPORTING
|
||||
|
||||
// The true location and dimension the cube/bolt/washer on the bed.
|
||||
#define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm
|
||||
#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm
|
||||
#define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // (mm)
|
||||
#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // (mm)
|
||||
|
||||
// Comment out any sides which are unreachable by the probe. For best
|
||||
// auto-calibration results, all sides must be reachable.
|
||||
@@ -1410,24 +1419,24 @@
|
||||
#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16]
|
||||
|
||||
/**
|
||||
* @section stepper motor current
|
||||
* @section stepper motor current
|
||||
*
|
||||
* Some boards have a means of setting the stepper motor current via firmware.
|
||||
* Some boards have a means of setting the stepper motor current via firmware.
|
||||
*
|
||||
* The power on motor currents are set by:
|
||||
* PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
|
||||
* known compatible chips: A4982
|
||||
* DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
|
||||
* known compatible chips: AD5206
|
||||
* DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||
* known compatible chips: MCP4728
|
||||
* DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
|
||||
* known compatible chips: MCP4451, MCP4018
|
||||
* The power on motor currents are set by:
|
||||
* PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
|
||||
* known compatible chips: A4982
|
||||
* DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
|
||||
* known compatible chips: AD5206
|
||||
* DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||
* known compatible chips: MCP4728
|
||||
* DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
|
||||
* known compatible chips: MCP4451, MCP4018
|
||||
*
|
||||
* Motor currents can also be set by M907 - M910 and by the LCD.
|
||||
* M907 - applies to all.
|
||||
* M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
|
||||
* M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||
* Motor currents can also be set by M907 - M910 and by the LCD.
|
||||
* M907 - applies to all.
|
||||
* M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
|
||||
* M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
|
||||
*/
|
||||
//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps
|
||||
//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
|
||||
@@ -1491,8 +1500,17 @@
|
||||
#define FEEDRATE_CHANGE_BEEP_FREQUENCY 440
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Probe Offset Wizard
|
||||
* Add a Probe Z Offset calibration option to the LCD menu.
|
||||
* Use this helper to get a perfect 'M851 Z' probe offset.
|
||||
* When launched this powerful wizard:
|
||||
* - Measures the bed height at the configured position with the probe.
|
||||
* - Moves the nozzle to the same position for a "paper" measurement.
|
||||
* - The difference is used to set the probe Z offset.
|
||||
*/
|
||||
#if HAS_BED_PROBE && ANY(HAS_MARLINUI_MENU, HAS_TFT_LVGL_UI)
|
||||
//#define PROBE_OFFSET_WIZARD // Add a Probe Z Offset calibration option to the LCD menu
|
||||
//#define PROBE_OFFSET_WIZARD
|
||||
#if ENABLED(PROBE_OFFSET_WIZARD)
|
||||
/**
|
||||
* Enable to init the Probe Z-Offset when starting the Wizard.
|
||||
@@ -1509,6 +1527,10 @@
|
||||
#if HAS_MARLINUI_MENU
|
||||
|
||||
#if HAS_BED_PROBE
|
||||
|
||||
// Show Deploy / Stow Probe options in the Motion menu.
|
||||
#define PROBE_DEPLOY_STOW_MENU
|
||||
|
||||
// Add calibration in the Probe Offsets menu to compensate for X-axis twist.
|
||||
//#define X_AXIS_TWIST_COMPENSATION
|
||||
#if ENABLED(X_AXIS_TWIST_COMPENSATION)
|
||||
@@ -1523,14 +1545,13 @@
|
||||
#define XATC_Z_OFFSETS { 0, 0, 0 } // Z offsets for X axis sample points
|
||||
#endif
|
||||
|
||||
// Show Deploy / Stow Probe options in the Motion menu.
|
||||
#define PROBE_DEPLOY_STOW_MENU
|
||||
#endif
|
||||
|
||||
// Include a page of printer information in the LCD Main Menu
|
||||
//#define LCD_INFO_MENU
|
||||
#if ENABLED(LCD_INFO_MENU)
|
||||
//#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages
|
||||
//#define BUILD_INFO_MENU_ITEM // Add a menu item to display the build date and time
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -1555,6 +1576,9 @@
|
||||
// BACK menu items keep the highlight at the top
|
||||
//#define TURBO_BACK_MENU_ITEM
|
||||
|
||||
// BACK menu items show "Back" instead of the previous menu name
|
||||
//#define GENERIC_BACK_MENU_ITEM
|
||||
|
||||
// Insert a menu for preheating at the top level to allow for quick access
|
||||
//#define PREHEAT_SHORTCUT_MENU_ITEM
|
||||
|
||||
@@ -1595,6 +1619,10 @@
|
||||
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
|
||||
#define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
|
||||
|
||||
#if ENABLED(U8GLIB_SSD1309)
|
||||
//#define LCD_DOUBLE_BUFFER // Optimize display updates. Costs ~1K of SRAM.
|
||||
#endif
|
||||
|
||||
#if HAS_WIRED_LCD
|
||||
//#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards.
|
||||
#endif
|
||||
@@ -1846,7 +1874,7 @@
|
||||
*
|
||||
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
|
||||
* INT --> SD_DETECT_PIN [1]
|
||||
* SS --> SDSS
|
||||
* SS --> SD_SS_PIN
|
||||
*
|
||||
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
|
||||
*/
|
||||
@@ -1873,7 +1901,7 @@
|
||||
//#define USE_OTG_USB_HOST
|
||||
|
||||
#if DISABLED(USE_OTG_USB_HOST)
|
||||
#define USB_CS_PIN SDSS
|
||||
#define USB_CS_PIN SD_SS_PIN
|
||||
#define USB_INTR_PIN SD_DETECT_PIN
|
||||
#endif
|
||||
#endif
|
||||
@@ -1932,8 +1960,8 @@
|
||||
#if ENABLED(MULTI_VOLUME)
|
||||
#define VOLUME_SD_ONBOARD
|
||||
#define VOLUME_USB_FLASH_DRIVE
|
||||
#define DEFAULT_VOLUME SV_SD_ONBOARD
|
||||
#define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE
|
||||
#define DEFAULT_VOLUME SD_ONBOARD // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
||||
#define DEFAULT_SHARED_VOLUME USB_FLASH_DRIVE // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
||||
#endif
|
||||
|
||||
#endif // HAS_MEDIA
|
||||
@@ -1984,7 +2012,7 @@
|
||||
#if IS_U8GLIB_ST7920
|
||||
// Enable this option and reduce the value to optimize screen updates.
|
||||
// The normal delay is 10µs. Use the lowest value that still gives a reliable display.
|
||||
//#define DOGM_SPI_DELAY_US 5
|
||||
//#define DOGM_SPI_DELAY_US 5 // (µs) Delay after each SPI transfer
|
||||
|
||||
//#define LIGHTWEIGHT_UI
|
||||
#if ENABLED(LIGHTWEIGHT_UI)
|
||||
@@ -2014,17 +2042,17 @@
|
||||
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
|
||||
//#define STATUS_HEAT_POWER // Show heater output power as a vertical bar
|
||||
|
||||
// Frivolous Game Options
|
||||
//#define MARLIN_BRICKOUT
|
||||
//#define MARLIN_INVADERS
|
||||
//#define MARLIN_SNAKE
|
||||
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
|
||||
|
||||
#endif // HAS_MARLINUI_U8GLIB
|
||||
|
||||
#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI
|
||||
#define MENU_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens
|
||||
//#define OVERLAY_GFX_REVERSE // Swap the CW/CCW indicators in the graphics overlay
|
||||
|
||||
// Frivolous Game Options
|
||||
//#define MARLIN_BRICKOUT
|
||||
//#define MARLIN_INVADERS
|
||||
//#define MARLIN_SNAKE
|
||||
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
|
||||
#endif
|
||||
|
||||
//
|
||||
@@ -2203,7 +2231,7 @@
|
||||
|
||||
// Developer menu (accessed by touching "About Printer" copyright text)
|
||||
//#define TOUCH_UI_DEVELOPER_MENU
|
||||
#endif
|
||||
#endif // TOUCH_UI_FTDI_EVE
|
||||
|
||||
//
|
||||
// Classic UI Options
|
||||
@@ -2237,9 +2265,11 @@
|
||||
// ADC Button Debounce
|
||||
//
|
||||
#if HAS_ADC_BUTTONS
|
||||
#define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast
|
||||
#define ADC_BUTTON_DEBOUNCE_DELAY 16 // (count) Increase if buttons bounce or repeat too fast
|
||||
#endif
|
||||
|
||||
//#define FAST_BUTTON_POLLING // Poll buttons at ~1kHz on 8-bit AVR. Set to 'false' for slow polling on 32-bit.
|
||||
|
||||
// @section safety
|
||||
|
||||
/**
|
||||
@@ -2278,7 +2308,7 @@
|
||||
|
||||
//#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
|
||||
#if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING)
|
||||
#define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds.
|
||||
#define DOUBLECLICK_MAX_INTERVAL 1250 // (ms) Maximum interval between clicks.
|
||||
// Note: Extra time may be added to mitigate controller latency.
|
||||
//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle.
|
||||
#if ENABLED(MOVE_Z_WHEN_IDLE)
|
||||
@@ -2322,6 +2352,24 @@
|
||||
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L.
|
||||
//#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
|
||||
//#define EXPERIMENTAL_I2S_LA // Allow I2S_STEPPER_STREAM to be used with LA. Performance degrades as the LA step rate reaches ~20kHz.
|
||||
|
||||
//#define SMOOTH_LIN_ADVANCE // Remove limits on acceleration by gradual increase of nozzle pressure
|
||||
#if ENABLED(SMOOTH_LIN_ADVANCE)
|
||||
/**
|
||||
* ADVANCE_TAU is also the time ahead that the smoother needs to look
|
||||
* into the planner, so the planner needs to have enough blocks loaded.
|
||||
* For k=0.04 at 10k acceleration and an "Orbiter 2" extruder it can be as low as 0.0075.
|
||||
* Adjust by lowering the value until you observe the extruder skipping, then raise slightly.
|
||||
* Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps.
|
||||
*/
|
||||
#if ENABLED(DISTINCT_E_FACTORS)
|
||||
#define ADVANCE_TAU { 0.01 } // (s) Smoothing time to reduce extruder acceleration, per extruder
|
||||
#else
|
||||
#define ADVANCE_TAU 0.01 // (s) Smoothing time to reduce extruder acceleration
|
||||
#endif
|
||||
#define SMOOTH_LIN_ADV_HZ 5000 // (Hz) How often to update extruder speed
|
||||
#define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -2329,6 +2377,7 @@
|
||||
*
|
||||
* Control extrusion rate based on instantaneous extruder velocity. Can be used to correct for
|
||||
* underextrusion at high extruder speeds that are otherwise well-behaved (i.e., not skipping).
|
||||
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
||||
*/
|
||||
//#define NONLINEAR_EXTRUSION
|
||||
|
||||
@@ -2556,27 +2605,28 @@
|
||||
//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650
|
||||
|
||||
/**
|
||||
* Minimum stepper driver pulse width (in µs)
|
||||
* 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers
|
||||
* 0 : Minimum 500ns for LV8729, adjusted in stepper.h
|
||||
* 1 : Minimum for A4988 and A5984 stepper drivers
|
||||
* 2 : Minimum for DRV8825 stepper drivers
|
||||
* 3 : Minimum for TB6600 stepper drivers
|
||||
* 30 : Minimum for TB6560 stepper drivers
|
||||
* Minimum stepper driver pulse width (in ns)
|
||||
* If undefined, these defaults (from Conditionals-4-adv.h) apply:
|
||||
* 100 : Minimum for TMC2xxx stepper drivers
|
||||
* 500 : Minimum for LV8729
|
||||
* 1000 : Minimum for A4988 and A5984 stepper drivers
|
||||
* 2000 : Minimum for DRV8825 stepper drivers
|
||||
* 3000 : Minimum for TB6600 stepper drivers
|
||||
* 30000 : Minimum for TB6560 stepper drivers
|
||||
*
|
||||
* Override the default value based on the driver type set in Configuration.h.
|
||||
*/
|
||||
//#define MINIMUM_STEPPER_PULSE 2
|
||||
//#define MINIMUM_STEPPER_PULSE_NS 2000
|
||||
|
||||
/**
|
||||
* Maximum stepping rate (in Hz) the stepper driver allows
|
||||
* If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE)
|
||||
* If undefined, these defaults (from Conditionals-4-adv.h) apply:
|
||||
* 5000000 : Maximum for TMC2xxx stepper drivers
|
||||
* 1000000 : Maximum for LV8729 stepper driver
|
||||
* 500000 : Maximum for A4988 stepper driver
|
||||
* 250000 : Maximum for DRV8825 stepper driver
|
||||
* 150000 : Maximum for TB6600 stepper driver
|
||||
* 15000 : Maximum for TB6560 stepper driver
|
||||
* 500000 : Maximum for A4988 stepper driver
|
||||
* 250000 : Maximum for DRV8825 stepper driver
|
||||
* 150000 : Maximum for TB6600 stepper driver
|
||||
* 15000 : Maximum for TB6560 stepper driver
|
||||
*
|
||||
* Override the default value based on the driver type set in Configuration.h.
|
||||
*/
|
||||
@@ -2608,19 +2658,23 @@
|
||||
#define MAX_CMD_SIZE 96
|
||||
#define BUFSIZE 4
|
||||
|
||||
// Transmission to Host Buffer Size
|
||||
// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
|
||||
// To buffer a simple "ok" you need 4 bytes.
|
||||
// For ADVANCED_OK (M105) you need 32 bytes.
|
||||
// For debug-echo: 128 bytes for the optimal speed.
|
||||
// Other output doesn't need to be that speedy.
|
||||
// :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
||||
/**
|
||||
* Host Transmit Buffer Size
|
||||
* - Costs 386 bytes of flash and TX_BUFFER_SIZE+3 bytes of SRAM (if not 0).
|
||||
* - 4 bytes required to buffer a simple "ok".
|
||||
* - 32 bytes for ADVANCED_OK (M105).
|
||||
* - 128 bytes for the optimal speed of 'debug-echo:'
|
||||
* - Other output doesn't need to be that speedy.
|
||||
* :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
||||
*/
|
||||
#define TX_BUFFER_SIZE 0
|
||||
|
||||
// Host Receive Buffer Size
|
||||
// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
||||
// To use flow control, set this buffer size to at least 1024 bytes.
|
||||
// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
|
||||
/**
|
||||
* Host Receive Buffer Size
|
||||
* Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
||||
* To use flow control, set this buffer size to at least 1024 bytes.
|
||||
* :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
|
||||
*/
|
||||
//#define RX_BUFFER_SIZE 1024
|
||||
|
||||
#if RX_BUFFER_SIZE >= 1024
|
||||
@@ -2704,7 +2758,7 @@
|
||||
|
||||
/**
|
||||
* Set the number of proportional font spaces required to fill up a typical character space.
|
||||
* This can help to better align the output of commands like `G29 O` Mesh Output.
|
||||
* This can help to better align the output of commands like 'G29 O' Mesh Output.
|
||||
*
|
||||
* For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0.
|
||||
* Otherwise, adjust according to your client and font.
|
||||
@@ -2961,6 +3015,8 @@
|
||||
|
||||
#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
|
||||
|
||||
//#define EDITABLE_HOMING_CURRENT // Add a G-code and menu to modify the Homing Current
|
||||
|
||||
/**
|
||||
* Interpolate microsteps to 256
|
||||
* Override for each driver with <driver>_INTERPOLATE settings below
|
||||
@@ -2969,7 +3025,7 @@
|
||||
|
||||
#if AXIS_IS_TMC_CONFIG(X)
|
||||
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
|
||||
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing
|
||||
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
|
||||
#define X_MICROSTEPS 16 // 0..256
|
||||
#define X_RSENSE 0.11
|
||||
#define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ...
|
||||
@@ -3179,6 +3235,13 @@
|
||||
//#define E7_HOLD_MULTIPLIER 0.5
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Use the homing current for all probing. (e.g., Current may be reduced to the
|
||||
* point where a collision makes the motor skip instead of damaging the bed,
|
||||
* though this is unlikely to save delicate probes from being damaged.
|
||||
*/
|
||||
//#define PROBING_USE_CURRENT_HOME
|
||||
|
||||
// @section tmc/spi
|
||||
|
||||
/**
|
||||
@@ -3443,7 +3506,7 @@
|
||||
/**
|
||||
* Step on both rising and falling edge signals (as with a square wave).
|
||||
*/
|
||||
//#define EDGE_STEPPING
|
||||
#define EDGE_STEPPING
|
||||
|
||||
/**
|
||||
* Enable M122 debugging command for TMC stepper drivers.
|
||||
@@ -3525,7 +3588,7 @@
|
||||
//#define PHOTOGRAPH_PIN 23
|
||||
|
||||
// Canon Hack Development Kit
|
||||
// https://web.archive.org/web/20200920094805/https://captain-slow.dk/2014/03/09/3d-printing-timelapses/
|
||||
// https://web.archive.org/web/20200920094805/captain-slow.dk/2014/03/09/3d-printing-timelapses/
|
||||
//#define CHDK_PIN 4
|
||||
|
||||
// Optional second move with delay to trigger the camera shutter
|
||||
@@ -3639,6 +3702,8 @@
|
||||
#define SPEED_POWER_MIN 5000 // (RPM)
|
||||
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
|
||||
#define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
|
||||
|
||||
//#define DEFAULT_ACCELERATION_SPINDLE 1000 // (°/s/s) Default spindle acceleration (speed change with time)
|
||||
#endif
|
||||
|
||||
#else
|
||||
@@ -3880,7 +3945,7 @@
|
||||
/**
|
||||
* Extra options for the M114 "Current Position" report
|
||||
*/
|
||||
//#define M114_DETAIL // Use 'M114` for details to check planner calculations
|
||||
//#define M114_DETAIL // Use 'M114 D' for details to check planner calculations
|
||||
//#define M114_REALTIME // Real current position based on forward kinematics
|
||||
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
|
||||
|
||||
@@ -3927,7 +3992,6 @@
|
||||
* Spend 28 bytes of SRAM to optimize the G-code parser
|
||||
*/
|
||||
#define FASTER_GCODE_PARSER
|
||||
|
||||
#if ENABLED(FASTER_GCODE_PARSER)
|
||||
//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
|
||||
#endif
|
||||
@@ -4378,58 +4442,81 @@
|
||||
//#define E_MUX0_PIN 40 // Always Required
|
||||
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
|
||||
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
|
||||
#elif HAS_PRUSA_MMU2
|
||||
// Serial port used for communication with MMU2.
|
||||
#define MMU2_SERIAL_PORT 2
|
||||
|
||||
// Use hardware reset for MMU if a pin is defined for it
|
||||
//#define MMU2_RST_PIN 23
|
||||
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
|
||||
// Common settings for MMU2/MMU2S/MMU3
|
||||
// Serial port used for communication with MMU2/MMU2S/MMU3.
|
||||
#define MMU_SERIAL_PORT 2
|
||||
#define MMU_BAUD 115200
|
||||
|
||||
// Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up)
|
||||
//#define MMU2_MODE_12V
|
||||
//#define MMU_RST_PIN 23 // Define this pin to use Hardware Reset for MMU2/MMU2S/MMU3
|
||||
|
||||
// G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout
|
||||
#define MMU2_FILAMENT_RUNOUT_SCRIPT "M600"
|
||||
//#define MMU_MENUS // Add an LCD menu for MMU2/MMU2S/MMU3
|
||||
|
||||
// Add an LCD menu for MMU2
|
||||
//#define MMU2_MENUS
|
||||
//#define MMU_DEBUG // Write debug info to serial output
|
||||
|
||||
// Settings for filament load / unload from the LCD menu.
|
||||
// This is for Průša MK3-style extruders. Customize for your hardware.
|
||||
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
|
||||
#define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
|
||||
{ 7.2, 1145 }, \
|
||||
{ 14.4, 871 }, \
|
||||
{ 36.0, 1393 }, \
|
||||
{ 14.4, 871 }, \
|
||||
{ 50.0, 198 }
|
||||
// Options pertaining to MMU2 and MMU2S
|
||||
#if HAS_PRUSA_MMU2
|
||||
// Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up)
|
||||
//#define MMU2_MODE_12V
|
||||
|
||||
#define MMU2_RAMMING_SEQUENCE \
|
||||
{ 1.0, 1000 }, \
|
||||
{ 1.0, 1500 }, \
|
||||
{ 2.0, 2000 }, \
|
||||
{ 1.5, 3000 }, \
|
||||
{ 2.5, 4000 }, \
|
||||
{ -15.0, 5000 }, \
|
||||
{ -14.0, 1200 }, \
|
||||
{ -6.0, 600 }, \
|
||||
{ 10.0, 700 }, \
|
||||
{ -10.0, 400 }, \
|
||||
{ -50.0, 2000 }
|
||||
// Settings for filament load / unload from the LCD menu.
|
||||
// This is for Průša MK3-style extruders. Customize for your hardware.
|
||||
#define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0
|
||||
|
||||
// G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout
|
||||
#define MMU2_FILAMENT_RUNOUT_SCRIPT "M600"
|
||||
|
||||
// MMU2 sequences use mm/min. Not compatible with MMU3, which use mm/sec.
|
||||
#define MMU2_LOAD_TO_NOZZLE_SEQUENCE \
|
||||
{ 4.4, 871 }, \
|
||||
{ 10.0, 1393 }, \
|
||||
{ 4.4, 871 }, \
|
||||
{ 10.0, 198 }
|
||||
|
||||
#define MMU2_RAMMING_SEQUENCE \
|
||||
{ 1.0, 1000 }, \
|
||||
{ 1.0, 1500 }, \
|
||||
{ 2.0, 2000 }, \
|
||||
{ 1.5, 3000 }, \
|
||||
{ 2.5, 4000 }, \
|
||||
{ -15.0, 5000 }, \
|
||||
{ -14.0, 1200 }, \
|
||||
{ -6.0, 600 }, \
|
||||
{ 10.0, 700 }, \
|
||||
{ -10.0, 400 }, \
|
||||
{ -50.0, 2000 }
|
||||
|
||||
#endif // HAS_PRUSA_MMU2
|
||||
|
||||
/**
|
||||
* Using a sensor like the MMU2S
|
||||
* This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S.
|
||||
* Options pertaining to MMU2S devices
|
||||
* Requires the MK3S extruder with a sensor at the extruder idler, like the MMU2S.
|
||||
* See https://help.prusa3d.com/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560#42048, step 11
|
||||
*/
|
||||
#if HAS_PRUSA_MMU2S
|
||||
#define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries)
|
||||
|
||||
/**
|
||||
* This is called after the filament runout sensor is triggered to check if
|
||||
* the filament has been loaded properly by moving the filament back and
|
||||
* forth to see if the filament runout sensor is going to get triggered
|
||||
* again, which should not occur if the filament is properly loaded.
|
||||
*
|
||||
* Thus, the MMU2_CAN_LOAD_SEQUENCE should contain some forward and
|
||||
* backward moves. The forward moves should be greater than the backward
|
||||
* moves.
|
||||
*
|
||||
* This is useless if your filament runout sensor is way behind the gears.
|
||||
* In that case use {0, MMU2_CAN_LOAD_FEEDRATE}
|
||||
*
|
||||
* Adjust MMU2_CAN_LOAD_SEQUENCE according to your setup.
|
||||
*/
|
||||
#define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min)
|
||||
#define MMU2_CAN_LOAD_SEQUENCE \
|
||||
{ 0.1, MMU2_CAN_LOAD_FEEDRATE }, \
|
||||
{ 60.0, MMU2_CAN_LOAD_FEEDRATE }, \
|
||||
{ -52.0, MMU2_CAN_LOAD_FEEDRATE }
|
||||
{ 5.0, MMU2_CAN_LOAD_FEEDRATE }, \
|
||||
{ 15.0, MMU2_CAN_LOAD_FEEDRATE }, \
|
||||
{ -10.0, MMU2_CAN_LOAD_FEEDRATE }
|
||||
|
||||
#define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values
|
||||
#define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation
|
||||
@@ -4440,10 +4527,90 @@
|
||||
|
||||
// Continue unloading if sensor detects filament after the initial unload move
|
||||
//#define MMU_IR_UNLOAD_MOVE
|
||||
#else
|
||||
|
||||
#elif HAS_PRUSA_MMU3
|
||||
|
||||
// MMU3 settings
|
||||
|
||||
#define MMU3_HAS_CUTTER // Enable cutter related functionality
|
||||
|
||||
#define MMU3_MAX_RETRIES 3 // Number of retries (total time = timeout*retries)
|
||||
|
||||
// As discussed with our PrusaSlicer profile specialist
|
||||
// - ToolChange shall not try to push filament into the very tip of the nozzle
|
||||
// to have some space for additional G-code to tune the extruded filament length
|
||||
// in the profile
|
||||
// Beware - this value is used to initialize the MMU logic layer - it will be sent to the MMU upon line up (written into its 8bit register 0x0b)
|
||||
// However - in the G-code we can get a request to set the extra load distance at runtime to something else (M708 A0xb Xsomething).
|
||||
// The printer intercepts such a call and sets its extra load distance to match the new value as well.
|
||||
#define MMU3_FILAMENT_SENSOR_E_POSITION 0 // (mm)
|
||||
#define _MMU3_LOAD_DISTANCE_PAST_GEARS 5 // (mm)
|
||||
#define MMU3_TOOL_CHANGE_LOAD_LENGTH (MMU3_FILAMENT_SENSOR_E_POSITION + _MMU3_LOAD_DISTANCE_PAST_GEARS) // (mm)
|
||||
|
||||
#define MMU3_LOAD_TO_NOZZLE_FEED_RATE 20.0 // (mm/s)
|
||||
|
||||
#define MMU3_VERIFY_LOAD_TO_NOZZLE_FEED_RATE 50.0 // (mm/s)
|
||||
#define _MMU3_VERIFY_LOAD_TO_NOZZLE_TWEAK -5.0 // (mm) Amount to adjust the length for verifying load-to-nozzle
|
||||
|
||||
// The first thing the MMU does is initialize its axis.
|
||||
// Meanwhile the E-motor will unload 20mm of filament in about 1 second.
|
||||
#define MMU3_RETRY_UNLOAD_TO_FINDA_LENGTH 80.0 // (mm)
|
||||
#define MMU3_RETRY_UNLOAD_TO_FINDA_FEED_RATE 80.0 // (mm/s)
|
||||
|
||||
// After loading a new filament, the printer will extrude this length of filament
|
||||
// then retract to the original position. This is used to check if the filament sensor
|
||||
// reading flickers or filament is jammed.
|
||||
#define _MMU_EXTRUDER_PTFE_LENGTH 42.3 // (mm)
|
||||
#define _MMU_EXTRUDER_HEATBREAK_LENGTH 17.7 // (mm)
|
||||
#define MMU3_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH (MMU3_FILAMENT_SENSOR_E_POSITION + _MMU_EXTRUDER_PTFE_LENGTH + _MMU_EXTRUDER_HEATBREAK_LENGTH + _MMU3_VERIFY_LOAD_TO_NOZZLE_TWEAK) // (mm)
|
||||
|
||||
/**
|
||||
* MMU1 Extruder Sensor
|
||||
* SpoolJoin Consumes All Filament -- EXPERIMENTAL
|
||||
*
|
||||
* SpoolJoin normally triggers when FINDA sensor untriggers while printing.
|
||||
* This is the default behaviour and it doesn't consume all the filament
|
||||
* before triggering a filament change. This leaves some filament in the
|
||||
* current slot and before switching to the next slot it is unloaded.
|
||||
*
|
||||
* Enabling this option will trigger the filament change when both FINDA
|
||||
* and Filament Runout Sensor triggers during the print and it allows the
|
||||
* filament in the current slot to be completely consumed before doing the
|
||||
* filament change. But this can cause problems as a little bit of filament
|
||||
* will be left between the extruder gears (thinking that the filament
|
||||
* sensor is triggered through the gears) and the end of the PTFE tube and
|
||||
* can cause filament load issues.
|
||||
*/
|
||||
//#define MMU3_SPOOL_JOIN_CONSUMES_ALL_FILAMENT
|
||||
|
||||
// MMU3 sequences use mm/sec. Not compatible with MMU2 which use mm/min.
|
||||
#define MMU3_LOAD_TO_NOZZLE_SEQUENCE \
|
||||
{ _MMU_EXTRUDER_PTFE_LENGTH, MMM_TO_MMS(810) }, /* (13.5 mm/s) Fast load ahead of heatbreak */ \
|
||||
{ _MMU_EXTRUDER_HEATBREAK_LENGTH, MMM_TO_MMS(198) } /* ( 3.3 mm/s) Slow load after heatbreak */
|
||||
|
||||
#define MMU3_RAMMING_SEQUENCE \
|
||||
{ 0.2816, MMM_TO_MMS(1339.0) }, \
|
||||
{ 0.3051, MMM_TO_MMS(1451.0) }, \
|
||||
{ 0.3453, MMM_TO_MMS(1642.0) }, \
|
||||
{ 0.3990, MMM_TO_MMS(1897.0) }, \
|
||||
{ 0.4761, MMM_TO_MMS(2264.0) }, \
|
||||
{ 0.5767, MMM_TO_MMS(2742.0) }, \
|
||||
{ 0.5691, MMM_TO_MMS(3220.0) }, \
|
||||
{ 0.1081, MMM_TO_MMS(3220.0) }, \
|
||||
{ 0.7644, MMM_TO_MMS(3635.0) }, \
|
||||
{ 0.8248, MMM_TO_MMS(3921.0) }, \
|
||||
{ 0.8483, MMM_TO_MMS(4033.0) }, \
|
||||
{ -15.0, MMM_TO_MMS(6000.0) }, \
|
||||
{ -24.5, MMM_TO_MMS(1200.0) }, \
|
||||
{ -7.0, MMM_TO_MMS( 600.0) }, \
|
||||
{ -3.5, MMM_TO_MMS( 360.0) }, \
|
||||
{ 20.0, MMM_TO_MMS( 454.0) }, \
|
||||
{ -20.0, MMM_TO_MMS( 303.0) }, \
|
||||
{ -35.0, MMM_TO_MMS(2000.0) }
|
||||
|
||||
#else // MMU2 (not MMU2S)
|
||||
|
||||
/**
|
||||
* MMU2 Extruder Sensor
|
||||
*
|
||||
* Support for a Průša (or other) IR Sensor to detect filament near the extruder
|
||||
* and make loading more reliable. Suitable for an extruder equipped with a filament
|
||||
@@ -4453,16 +4620,14 @@
|
||||
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
|
||||
* If all attempts fail, a filament runout will be triggered.
|
||||
*/
|
||||
//#define MMU_EXTRUDER_SENSOR
|
||||
#if ENABLED(MMU_EXTRUDER_SENSOR)
|
||||
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
|
||||
//#define MMU2_EXTRUDER_SENSOR
|
||||
#if ENABLED(MMU2_EXTRUDER_SENSOR)
|
||||
#define MMU2_LOADING_ATTEMPTS_NR 5 // Number of times to try loading filament before failure
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
//#define MMU2_DEBUG // Write debug info to serial output
|
||||
|
||||
#endif // HAS_PRUSA_MMU2
|
||||
#endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3
|
||||
|
||||
/**
|
||||
* Advanced Print Counter settings
|
||||
|
||||
+114
-83
@@ -127,9 +127,9 @@ NEOPIXEL ?= 0
|
||||
# on GCC versions:
|
||||
# https://www.avrfreaks.net/comment/1789106#comment-1789106
|
||||
|
||||
CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ )
|
||||
CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ )
|
||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
||||
CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d' ' )
|
||||
CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d' ' )
|
||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d' ' )
|
||||
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
||||
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
||||
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
||||
@@ -187,6 +187,17 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033)
|
||||
# RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
||||
|
||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1035)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1036)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1037)
|
||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1038)
|
||||
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1039)
|
||||
|
||||
#
|
||||
# RAMPS Derivatives - ATmega1280, ATmega2560
|
||||
#
|
||||
@@ -221,108 +232,113 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1112)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1113)
|
||||
# BigTreeTech or BIQU KFB2.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1114)
|
||||
# zrib V2.0 (Chinese RAMPS replica)
|
||||
# Zonestar zrib V2.0 (Chinese RAMPS replica)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1115)
|
||||
# zrib V5.2 (Chinese RAMPS replica)
|
||||
# Zonestar zrib V5.2 (Chinese RAMPS replica)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1116)
|
||||
# Felix 2.0+ Electronics Board (RAMPS like)
|
||||
# Zonestar zrib V5.3 (Chinese RAMPS replica)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1117)
|
||||
# Invent-A-Part RigidBoard
|
||||
# Felix 2.0+ Electronics Board (RAMPS like)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1118)
|
||||
# Invent-A-Part RigidBoard V2
|
||||
# Invent-A-Part RigidBoard
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1119)
|
||||
# Sainsmart 2-in-1 board
|
||||
# Invent-A-Part RigidBoard V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1120)
|
||||
# Ultimaker
|
||||
# Sainsmart 2-in-1 board
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1121)
|
||||
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
||||
# Ultimaker
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1122)
|
||||
# Ultimaker (Older electronics. Pre 1.5.4. This is rare)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
||||
MCU ?= atmega1280
|
||||
PROG_MCU ?= m1280
|
||||
# Azteeg X3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1123)
|
||||
# Azteeg X3 Pro
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1124)
|
||||
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
||||
# Azteeg X3 Pro
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1125)
|
||||
# Rumba
|
||||
# Ultimainboard 2.x (Uses TEMP_SENSOR 20)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1126)
|
||||
# Raise3D N series Rumba derivative
|
||||
# Rumba
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1127)
|
||||
# Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
|
||||
# Raise3D N series Rumba derivative
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1128)
|
||||
# Formbot T-Rex 2 Plus
|
||||
# Rapide Lite 200 (v1, low-cost RUMBA clone with drv)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1129)
|
||||
# Formbot T-Rex 3
|
||||
# Formbot T-Rex 2 Plus
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1130)
|
||||
# Formbot Raptor
|
||||
# Formbot T-Rex 3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1131)
|
||||
# Formbot Raptor 2
|
||||
# Formbot Raptor
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1132)
|
||||
# bq ZUM Mega 3D
|
||||
# Formbot Raptor 2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1133)
|
||||
# MakeBoard Mini v2.1.2 by MicroMake
|
||||
# bq ZUM Mega 3D
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1134)
|
||||
# TriGorilla Anycubic version 1.3-based on RAMPS EFB
|
||||
# MakeBoard Mini v2.1.2 by MicroMake
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1135)
|
||||
# ... Ver 1.4
|
||||
# TriGorilla Anycubic version 1.3-based on RAMPS EFB
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1136)
|
||||
# ... Rev 1.1 (new servo pin order)
|
||||
# ... Ver 1.4
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1137)
|
||||
# Creality: Ender-4, CR-8
|
||||
# ... Rev 1.1 (new servo pin order)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
||||
# Creality: CR10S, CR20, CR-X
|
||||
# Creality: Ender-4, CR-8
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||
# Dagoma F5
|
||||
# Creality: CR10S, CR20, CR-X
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||
# FYSETC F6 1.3
|
||||
# Dagoma F5
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||
# FYSETC F6 1.4
|
||||
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||
# Wanhao Duplicator i3 Plus
|
||||
# FYSETC F6 1.3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||
# VORON Design
|
||||
# FYSETC F6 1.4
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||
# Tronxy TRONXY-V3-1.0
|
||||
# Wanhao Duplicator i3 Plus
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||
# Z-Bolt X Series
|
||||
# VORON Design
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||
# TT OSCAR
|
||||
# Tronxy TRONXY-V3-1.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||
# Overlord/Overlord Pro
|
||||
# Z-Bolt X Series
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||
# ADIMLab Gantry v1
|
||||
# TT OSCAR
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||
# ADIMLab Gantry v2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||
# BIQU Tango V1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||
# MKS GEN L V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||
# MKS GEN L V2.1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||
# Copymaster 3D
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||
# Ortur 4
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||
# Tenlog D3 Hero IDEX printer
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||
# Tenlog D3, D5, D6 IDEX Printer
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||
# Tenlog D3,5,6 Pro IDEX printers
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||
# Zonestar zrib V5.3 (Chinese RAMPS replica)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||
# Pxmalion Core I3
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||
# Panowin Cutlass (as found in the Panowin F1)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||
# XTLW MFF V1.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
||||
# XTLW MFF V2.0
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
||||
|
||||
|
||||
#
|
||||
# RAMBo and derivatives
|
||||
@@ -340,7 +356,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1204)
|
||||
# abee Scoovo X9H
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1205)
|
||||
# Rambo ThinkerV2
|
||||
# ThinkerV2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1206)
|
||||
|
||||
#
|
||||
@@ -383,30 +399,40 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1315)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1316)
|
||||
# Geeetech GT2560 Rev B for A10(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1317)
|
||||
# Geeetech GT2560 Rev B for A10(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
|
||||
# Geeetech GT2560 Rev B for Mecreator2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1318)
|
||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||
# Geeetech GT2560 Rev B for A10(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
||||
# Einstart retrofit
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
||||
# Wanhao 0ne+ i3 Mini
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||
# Leapfrog Xeed 2015
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||
# PICA Shield (original version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||
# PICA Shield (rev C or later)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||
# Intamsys 4.0 (Funmat HT)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
||||
# Einstart retrofit
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||
# Wanhao 0ne+ i3 Mini
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||
# Overlord/Overlord Pro
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||
# ADIMLab Gantry v1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||
# ADIMLab Gantry v2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||
# Leapfrog Xeed 2015
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||
# PICA Shield (original version)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||
# Mega controller & Protoneer CNC Shield V3.00
|
||||
# PICA Shield (rev C or later)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||
# Intamsys 4.0 (Funmat HT)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
||||
# Malyan M180 Mainboard Version 2 (no display function, direct G-code only)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
||||
# Mega controller & Protoneer CNC Shield V3.00
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
||||
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
||||
# Geeetech GT2560 V4.1B for A10(M/T/D)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
||||
|
||||
#
|
||||
# ATmega1281, ATmega2561
|
||||
@@ -440,7 +466,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1502)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega644p
|
||||
PROG_MCU ?= m644p
|
||||
# Melzi V2.0
|
||||
# Melzi V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1503)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
@@ -450,36 +476,41 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1504)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Melzi Creality3D board (for CR-10 etc)
|
||||
# Melzi Creality3D (for CR-10 etc)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1505)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Melzi Malyan M150 board
|
||||
# Melzi Creality3D (for Ender-2)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1506)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Tronxy X5S
|
||||
# Melzi Malyan M150
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1507)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# STB V1.1
|
||||
# Tronxy X5S
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1508)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Azteeg X1
|
||||
# STB V1.1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1509)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Anet 1.0 (Melzi clone)
|
||||
# Azteeg X1
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1510)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# Anet 1.0 (Melzi clone)
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
MCU ?= atmega1284p
|
||||
PROG_MCU ?= m1284p
|
||||
# ZoneStar ZMIB V2
|
||||
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
||||
HARDWARE_VARIANT ?= Sanguino
|
||||
@@ -837,8 +868,8 @@ else ifeq ($(HARDWARE_VARIANT), archim)
|
||||
endif
|
||||
|
||||
# Add all the source directories as include directories too
|
||||
CINCS = ${addprefix -I ,${VPATH}}
|
||||
CXXINCS = ${addprefix -I ,${VPATH}}
|
||||
CINCS = ${addprefix -I, ${VPATH}}
|
||||
CXXINCS = ${addprefix -I, ${VPATH}}
|
||||
|
||||
# Silence warnings for library code (won't work for .h files, unfortunately)
|
||||
LIBWARN = -w -Wno-packed-bitfield-compat
|
||||
@@ -995,7 +1026,7 @@ extcoff: $(TARGET).elf
|
||||
$(NM) -n $< > $@
|
||||
|
||||
# Link: create ELF output file from library.
|
||||
|
||||
LDFLAGS+= -Wl,-V
|
||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
||||
$(Pecho) " CXX $@"
|
||||
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
||||
|
||||
+10
-3
@@ -41,7 +41,14 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
//#define STRING_DISTRIBUTION_DATE "2024-05-29"
|
||||
//#define STRING_DISTRIBUTION_DATE "2025-05-02"
|
||||
|
||||
/**
|
||||
* The protocol for communication to the host. Protocol indicates communication
|
||||
* standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc.
|
||||
* (Other behaviors are given by the firmware version and capabilities report.)
|
||||
*/
|
||||
//#define PROTOCOL_VERSION "1.0"
|
||||
|
||||
/**
|
||||
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||
@@ -68,8 +75,8 @@
|
||||
//#define WEBSITE_URL "marlinfw.org"
|
||||
|
||||
/**
|
||||
* Set the vendor info the serial USB interface, if changable
|
||||
* Currently only supported by DUE platform
|
||||
* Set the vendor info the serial USB interface, if changeable.
|
||||
* Currently only supported by DUE platform.
|
||||
*/
|
||||
//#define USB_DEVICE_VENDOR_ID 0x0000
|
||||
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
||||
|
||||
+40
-43
@@ -62,6 +62,11 @@ motherboard = BOARD_RAMPS_14_EFB
|
||||
serial_port = 0
|
||||
baudrate = 250000
|
||||
|
||||
string_config_h_author = "(default from config.ini)"
|
||||
|
||||
capabilities_report = on
|
||||
extended_capabilities_report = on
|
||||
|
||||
use_watchdog = on
|
||||
thermal_protection_hotends = on
|
||||
thermal_protection_hysteresis = 4
|
||||
@@ -77,9 +82,7 @@ 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
|
||||
@@ -89,6 +92,14 @@ default_kp = 22.20
|
||||
default_ki = 1.08
|
||||
default_kd = 114.00
|
||||
|
||||
temp_sensor_bed = 1
|
||||
bed_mintemp = 5
|
||||
bed_maxtemp = 150
|
||||
|
||||
thermal_protection_bed = on
|
||||
thermal_protection_bed_hysteresis = 2
|
||||
thermal_protection_bed_period = 20
|
||||
|
||||
x_driver_type = A4988
|
||||
y_driver_type = A4988
|
||||
z_driver_type = A4988
|
||||
@@ -121,10 +132,10 @@ 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
|
||||
x_enable_on = LOW
|
||||
y_enable_on = LOW
|
||||
z_enable_on = LOW
|
||||
e_enable_on = LOW
|
||||
|
||||
invert_x_dir = false
|
||||
invert_y_dir = true
|
||||
@@ -136,11 +147,6 @@ 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
|
||||
|
||||
@@ -153,18 +159,13 @@ 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
|
||||
@@ -173,10 +174,8 @@ 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
|
||||
@@ -185,50 +184,48 @@ 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_hotend = 180
|
||||
preheat_1_temp_bed = 70
|
||||
preheat_1_fan_speed = 0
|
||||
|
||||
preheat_2_label = "ABS"
|
||||
preheat_2_temp_hotend = 240
|
||||
preheat_2_temp_bed = 110
|
||||
preheat_2_fan_speed = 0
|
||||
|
||||
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
|
||||
|
||||
editable_steps_per_unit = on
|
||||
|
||||
[config:advanced]
|
||||
arc_support = on
|
||||
auto_report_temperatures = on
|
||||
|
||||
autotemp = on
|
||||
autotemp_min = 210
|
||||
autotemp_max = 250
|
||||
autotemp_factor = 0.1f
|
||||
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
|
||||
debug_flags_gcode = on
|
||||
homing_bump_mm = { 5, 5, 2 }
|
||||
max_arc_segment_mm = 1.0
|
||||
min_arc_segment_mm = 0.1
|
||||
@@ -237,11 +234,11 @@ 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
|
||||
|
||||
bed_check_interval = 5000
|
||||
watch_bed_temp_increase = 2
|
||||
watch_bed_temp_period = 60
|
||||
|
||||
watch_temp_increase = 2
|
||||
watch_temp_period = 20
|
||||
watch_temp_period = 40
|
||||
|
||||
@@ -129,11 +129,11 @@ typedef Servo hal_servo_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef MMU2_SERIAL_PORT
|
||||
#if !WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||
#error "MMU2_SERIAL_PORT must be from 0 to 3"
|
||||
#ifdef MMU_SERIAL_PORT
|
||||
#if !WITHIN(MMU_SERIAL_PORT, 0, 3)
|
||||
#error "MMU_SERIAL_PORT must be from 0 to 3"
|
||||
#endif
|
||||
#define MMU2_SERIAL mmuSerial
|
||||
#define MMU_SERIAL mmuSerial
|
||||
#endif
|
||||
|
||||
#ifdef LCD_SERIAL_PORT
|
||||
@@ -141,7 +141,7 @@ typedef Servo hal_servo_t;
|
||||
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||
#endif
|
||||
#define LCD_SERIAL lcdSerial
|
||||
#if HAS_DGUS_LCD
|
||||
#if ANY(HAS_DGUS_LCD, EXTENSIBLE_UI)
|
||||
#define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free()
|
||||
#endif
|
||||
#endif
|
||||
@@ -159,7 +159,7 @@ typedef Servo hal_servo_t;
|
||||
#define GET_PIN_MAP_INDEX(pin) pin
|
||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||
|
||||
#define HAL_SENSITIVE_PINS 0, 1,
|
||||
#define HAL_SENSITIVE_PINS 0, 1
|
||||
|
||||
#ifdef __AVR_AT90USB1286__
|
||||
#define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0)
|
||||
@@ -204,7 +204,7 @@ public:
|
||||
static void isr_on() { sei(); }
|
||||
static void isr_off() { cli(); }
|
||||
|
||||
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
static void idletask() {}
|
||||
|
||||
@@ -601,20 +601,20 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
||||
|
||||
#endif // SERIAL_PORT_3
|
||||
|
||||
#ifdef MMU2_SERIAL_PORT
|
||||
#ifdef MMU_SERIAL_PORT
|
||||
|
||||
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) {
|
||||
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::store_rxd_char();
|
||||
ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _RX_vect)) {
|
||||
MarlinSerial<MMU2SerialCfg<MMU_SERIAL_PORT>>::store_rxd_char();
|
||||
}
|
||||
|
||||
ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) {
|
||||
MarlinSerial<MMU2SerialCfg<MMU2_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||
ISR(SERIAL_REGNAME(USART, MMU_SERIAL_PORT, _UDRE_vect)) {
|
||||
MarlinSerial<MMU2SerialCfg<MMU_SERIAL_PORT>>::_tx_udr_empty_irq();
|
||||
}
|
||||
|
||||
template class MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> >;
|
||||
template class MarlinSerial< MMU2SerialCfg<MMU_SERIAL_PORT> >;
|
||||
MSerialMMU2 mmuSerial(MSerialMMU2::HasEmergencyParser);
|
||||
|
||||
#endif // MMU2_SERIAL_PORT
|
||||
#endif // MMU_SERIAL_PORT
|
||||
|
||||
#ifdef LCD_SERIAL_PORT
|
||||
|
||||
@@ -629,7 +629,7 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser);
|
||||
template class MarlinSerial< LCDSerialCfg<LCD_SERIAL_PORT> >;
|
||||
MSerialLCD lcdSerial(MSerialLCD::HasEmergencyParser);
|
||||
|
||||
#if HAS_DGUS_LCD
|
||||
#if ANY(HAS_DGUS_LCD, EXTENSIBLE_UI)
|
||||
template<typename Cfg>
|
||||
typename MarlinSerial<Cfg>::ring_buffer_pos_t MarlinSerial<Cfg>::get_tx_buffer_free() {
|
||||
const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send.
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
static ring_buffer_pos_t available();
|
||||
static void write(const uint8_t c);
|
||||
static void flushTX();
|
||||
#if HAS_DGUS_LCD
|
||||
#if ANY(HAS_DGUS_LCD, EXTENSIBLE_UI)
|
||||
static ring_buffer_pos_t get_tx_buffer_free();
|
||||
#endif
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
|
||||
#endif // !USBCON
|
||||
|
||||
#ifdef MMU2_SERIAL_PORT
|
||||
#ifdef MMU_SERIAL_PORT
|
||||
template <uint8_t serial>
|
||||
struct MMU2SerialCfg {
|
||||
static constexpr int PORT = serial;
|
||||
@@ -260,7 +260,7 @@
|
||||
static constexpr bool RX_OVERRUNS = false;
|
||||
};
|
||||
|
||||
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU2_SERIAL_PORT> > > MSerialMMU2;
|
||||
typedef Serial1Class< MarlinSerial< MMU2SerialCfg<MMU_SERIAL_PORT> > > MSerialMMU2;
|
||||
extern MSerialMMU2 mmuSerial;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -345,6 +345,14 @@ void setup_endstop_interrupts() {
|
||||
pciSetup(Z_MIN_PROBE_PIN);
|
||||
#endif
|
||||
#endif
|
||||
#if USE_CALIBRATION
|
||||
#if (digitalPinToInterrupt(CALIBRATION_PIN) != NOT_AN_INTERRUPT)
|
||||
_ATTACH(CALIBRATION_PIN);
|
||||
#else
|
||||
static_assert(digitalPinHasPCICR(CALIBRATION_PIN), "CALIBRATION_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue.");
|
||||
pciSetup(CALIBRATION_PIN);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI.
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
||||
else {
|
||||
if (p == 32 || p == 128) continue; // Skip TIMER2 specific prescalers when not TIMER2
|
||||
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);
|
||||
DEBUG_ECHOLNPGM("(Not Timer 2) F_CPU=", STRINGIFY(F_CPU), " prescaler=", p, " f_desired=", f_desired);
|
||||
res_fast_temp = rft - 1;
|
||||
res_pc_temp = rft / 2;
|
||||
}
|
||||
|
||||
@@ -28,9 +28,6 @@
|
||||
* 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
|
||||
* 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"
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||
*/
|
||||
|
||||
#include "../fastio.h"
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||
*/
|
||||
|
||||
#include "../fastio.h"
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* Arduino Pin Layout video: https://youtu.be/rIqeVCX09FA
|
||||
* AVR alternate pin function overview video: https://youtu.be/1yd8wuI5Plg
|
||||
*/
|
||||
|
||||
/** ATMega644
|
||||
|
||||
@@ -26,10 +26,7 @@
|
||||
*
|
||||
* 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
|
||||
* 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
|
||||
* Logical pins 46-47 aren't supported by Teensyduino, but are supported below as E2 and E3
|
||||
*/
|
||||
|
||||
#include "../fastio.h"
|
||||
@@ -366,8 +363,11 @@
|
||||
#define AIO7_PWM 0
|
||||
#define AIO7_DDR DDRF
|
||||
|
||||
//-- Begin not supported by Teensyduino
|
||||
//-- don't use Arduino functions on these pins pinMode/digitalWrite/etc
|
||||
//-- 46-47 are not supported by Teensyduino
|
||||
//-- Don't use Arduino functions (pinMode, digitalWrite, etc.) on these pins
|
||||
#define PIN_E2 46
|
||||
#define PIN_E3 47
|
||||
|
||||
#define DIO46_PIN PINE2
|
||||
#define DIO46_RPORT PINE
|
||||
#define DIO46_WPORT PORTE
|
||||
@@ -380,10 +380,7 @@
|
||||
#define DIO47_PWM 0
|
||||
#define DIO47_DDR DDRE
|
||||
|
||||
#define TEENSY_E2 46
|
||||
#define TEENSY_E3 47
|
||||
|
||||
//-- end not supported by Teensyduino
|
||||
//--
|
||||
|
||||
#undef PA0
|
||||
#define PA0_PIN PINA0
|
||||
|
||||
@@ -22,7 +22,23 @@
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* PWM print routines for Atmel 8 bit AVR CPUs
|
||||
* Pins Debugging for Atmel 8 bit AVR CPUs
|
||||
*
|
||||
* - NUMBER_PINS_TOTAL
|
||||
* - MULTI_NAME_PAD
|
||||
* - getPinByIndex(index)
|
||||
* - printPinNameByIndex(index)
|
||||
* - getPinIsDigitalByIndex(index)
|
||||
* - digitalPinToAnalogIndex(pin)
|
||||
* - getValidPinMode(pin)
|
||||
* - isValidPin(pin)
|
||||
* - isAnalogPin(pin)
|
||||
* - digitalRead_mod(pin)
|
||||
* - pwm_status(pin)
|
||||
* - printPinPWM(pin)
|
||||
* - printPinPort(pin)
|
||||
* - printPinNumber(pin)
|
||||
* - printPinAnalog(pin)
|
||||
*/
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
@@ -39,44 +55,44 @@
|
||||
#include "pinsDebug_Teensyduino.h"
|
||||
// Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
|
||||
// portModeRegister takes a different argument
|
||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||
#define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
||||
#define getValidPinMode(P) (*portModeRegister(P) & digitalPinToBitMask_DEBUG(P))
|
||||
|
||||
#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70
|
||||
|
||||
#include "pinsDebug_plus_70.h"
|
||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p)
|
||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p)
|
||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p)
|
||||
bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer_plus_70(P)
|
||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask_plus_70(P)
|
||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort_plus_70(P)
|
||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||
|
||||
#else
|
||||
|
||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
||||
bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
|
||||
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
||||
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
||||
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||
#define getPinByIndex(x) pgm_read_byte(&pin_array[x].pin)
|
||||
|
||||
#endif
|
||||
|
||||
#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
|
||||
#define isValidPin(P) (P >= 0 && P < NUMBER_PINS_TOTAL)
|
||||
#if AVR_ATmega1284_FAMILY
|
||||
#define IS_ANALOG(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
||||
#define DIGITAL_PIN_TO_ANALOG_PIN(P) int(IS_ANALOG(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
||||
#define isAnalogPin(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
||||
#define digitalPinToAnalogIndex(P) int(isAnalogPin(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
||||
#else
|
||||
#define _ANALOG1(P) WITHIN(P, analogInputToDigitalPin(0), 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)
|
||||
#define isAnalogPin(P) (_ANALOG1(P) || _ANALOG2(P))
|
||||
#define digitalPinToAnalogIndex(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
||||
#endif
|
||||
#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin)
|
||||
#define getPinByIndex(x) pgm_read_byte(&pin_array[x].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) {
|
||||
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
|
||||
void printPinNameByIndex(const uint8_t index) {
|
||||
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[index].name);
|
||||
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) {
|
||||
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
||||
if (temp_char != 0)
|
||||
@@ -88,7 +104,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
|
||||
}
|
||||
}
|
||||
|
||||
#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital)
|
||||
#define getPinIsDigitalByIndex(x) pgm_read_byte(&pin_array[x].is_digital)
|
||||
|
||||
#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
|
||||
@@ -109,7 +125,7 @@ void PRINT_ARRAY_NAME(uint8_t x) {
|
||||
* Print a pin's PWM status.
|
||||
* Return true if it's currently a PWM pin.
|
||||
*/
|
||||
bool pwm_status(uint8_t pin) {
|
||||
bool pwm_status(const uint8_t pin) {
|
||||
char buffer[20]; // for the sprintf statements
|
||||
|
||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||
@@ -276,7 +292,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N -
|
||||
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
||||
}
|
||||
|
||||
void pwm_details(uint8_t pin) {
|
||||
void printPinPWM(const uint8_t pin) {
|
||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||
|
||||
#if ABTEST(0)
|
||||
@@ -347,7 +363,7 @@ void pwm_details(uint8_t pin) {
|
||||
#else
|
||||
UNUSED(print_is_also_tied);
|
||||
#endif
|
||||
} // pwm_details
|
||||
} // printPinPWM
|
||||
|
||||
#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs
|
||||
int digitalRead_mod(const pin_t pin) { // same as digitalRead except the PWM stop section has been removed
|
||||
@@ -356,21 +372,21 @@ void pwm_details(uint8_t pin) {
|
||||
}
|
||||
#endif
|
||||
|
||||
void print_port(const pin_t pin) { // print port number
|
||||
void printPinPort(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;
|
||||
x = (pin == PIN_E2 || pin == PIN_E3) ? 'E' : 'A' + digitalPinToPort_DEBUG(pin) - 1;
|
||||
#else
|
||||
x = digitalPinToPort_DEBUG(pin) + 64;
|
||||
x = 'A' + digitalPinToPort_DEBUG(pin) - 1;
|
||||
#endif
|
||||
SERIAL_CHAR(x);
|
||||
|
||||
#if AVR_AT90USB1286_FAMILY
|
||||
if (pin == 46)
|
||||
if (pin == PIN_E2)
|
||||
x = '2';
|
||||
else if (pin == 47)
|
||||
else if (pin == PIN_E3)
|
||||
x = '3';
|
||||
else {
|
||||
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
||||
@@ -386,7 +402,7 @@ void print_port(const pin_t pin) { // print port number
|
||||
#endif
|
||||
}
|
||||
|
||||
#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 printPinNumber(P) do{ sprintf_P(buffer, PSTR("%3d "), P); SERIAL_ECHO(buffer); }while(0)
|
||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||
|
||||
#undef ABTEST
|
||||
|
||||
@@ -102,7 +102,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||
|
||||
// digitalPinToBitMask(pin) is OK
|
||||
|
||||
#define digitalRead_mod(p) extDigitalRead(p) // Teensyduino's version of digitalRead doesn't
|
||||
#define digitalRead_mod(P) extDigitalRead(P) // Teensyduino's version of digitalRead doesn't
|
||||
// disable the PWMs so we can use it as is
|
||||
|
||||
// portModeRegister(pin) is OK
|
||||
|
||||
@@ -48,92 +48,92 @@
|
||||
const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
|
||||
// PORTLIST
|
||||
// ------------------------
|
||||
PE , // PE 0 ** 0 ** USART0_RX
|
||||
PE , // PE 1 ** 1 ** USART0_TX
|
||||
PE , // PE 4 ** 2 ** PWM2
|
||||
PE , // PE 5 ** 3 ** PWM3
|
||||
PG , // PG 5 ** 4 ** PWM4
|
||||
PE , // PE 3 ** 5 ** PWM5
|
||||
PH , // PH 3 ** 6 ** PWM6
|
||||
PH , // PH 4 ** 7 ** PWM7
|
||||
PH , // PH 5 ** 8 ** PWM8
|
||||
PH , // PH 6 ** 9 ** PWM9
|
||||
PB , // PB 4 ** 10 ** PWM10
|
||||
PB , // PB 5 ** 11 ** PWM11
|
||||
PB , // PB 6 ** 12 ** PWM12
|
||||
PB , // PB 7 ** 13 ** PWM13
|
||||
PJ , // PJ 1 ** 14 ** USART3_TX
|
||||
PJ , // PJ 0 ** 15 ** USART3_RX
|
||||
PH , // PH 1 ** 16 ** USART2_TX
|
||||
PH , // PH 0 ** 17 ** USART2_RX
|
||||
PD , // PD 3 ** 18 ** USART1_TX
|
||||
PD , // PD 2 ** 19 ** USART1_RX
|
||||
PD , // PD 1 ** 20 ** I2C_SDA
|
||||
PD , // PD 0 ** 21 ** I2C_SCL
|
||||
PA , // PA 0 ** 22 ** D22
|
||||
PA , // PA 1 ** 23 ** D23
|
||||
PA , // PA 2 ** 24 ** D24
|
||||
PA , // PA 3 ** 25 ** D25
|
||||
PA , // PA 4 ** 26 ** D26
|
||||
PA , // PA 5 ** 27 ** D27
|
||||
PA , // PA 6 ** 28 ** D28
|
||||
PA , // PA 7 ** 29 ** D29
|
||||
PC , // PC 7 ** 30 ** D30
|
||||
PC , // PC 6 ** 31 ** D31
|
||||
PC , // PC 5 ** 32 ** D32
|
||||
PC , // PC 4 ** 33 ** D33
|
||||
PC , // PC 3 ** 34 ** D34
|
||||
PC , // PC 2 ** 35 ** D35
|
||||
PC , // PC 1 ** 36 ** D36
|
||||
PC , // PC 0 ** 37 ** D37
|
||||
PD , // PD 7 ** 38 ** D38
|
||||
PG , // PG 2 ** 39 ** D39
|
||||
PG , // PG 1 ** 40 ** D40
|
||||
PG , // PG 0 ** 41 ** D41
|
||||
PL , // PL 7 ** 42 ** D42
|
||||
PL , // PL 6 ** 43 ** D43
|
||||
PL , // PL 5 ** 44 ** D44
|
||||
PL , // PL 4 ** 45 ** D45
|
||||
PL , // PL 3 ** 46 ** D46
|
||||
PL , // PL 2 ** 47 ** D47
|
||||
PL , // PL 1 ** 48 ** D48
|
||||
PL , // PL 0 ** 49 ** D49
|
||||
PB , // PB 3 ** 50 ** SPI_MISO
|
||||
PB , // PB 2 ** 51 ** SPI_MOSI
|
||||
PB , // PB 1 ** 52 ** SPI_SCK
|
||||
PB , // PB 0 ** 53 ** SPI_SS
|
||||
PF , // PF 0 ** 54 ** A0
|
||||
PF , // PF 1 ** 55 ** A1
|
||||
PF , // PF 2 ** 56 ** A2
|
||||
PF , // PF 3 ** 57 ** A3
|
||||
PF , // PF 4 ** 58 ** A4
|
||||
PF , // PF 5 ** 59 ** A5
|
||||
PF , // PF 6 ** 60 ** A6
|
||||
PF , // PF 7 ** 61 ** A7
|
||||
PK , // PK 0 ** 62 ** A8
|
||||
PK , // PK 1 ** 63 ** A9
|
||||
PK , // PK 2 ** 64 ** A10
|
||||
PK , // PK 3 ** 65 ** A11
|
||||
PK , // PK 4 ** 66 ** A12
|
||||
PK , // PK 5 ** 67 ** A13
|
||||
PK , // PK 6 ** 68 ** A14
|
||||
PK , // PK 7 ** 69 ** A15
|
||||
PG , // PG 4 ** 70 **
|
||||
PG , // PG 3 ** 71 **
|
||||
PJ , // PJ 2 ** 72 **
|
||||
PJ , // PJ 3 ** 73 **
|
||||
PJ , // PJ 7 ** 74 **
|
||||
PJ , // PJ 4 ** 75 **
|
||||
PJ , // PJ 5 ** 76 **
|
||||
PJ , // PJ 6 ** 77 **
|
||||
PE , // PE 2 ** 78 **
|
||||
PE , // PE 6 ** 79 **
|
||||
PE , // PE 7 ** 80 **
|
||||
PD , // PD 4 ** 81 **
|
||||
PD , // PD 5 ** 82 **
|
||||
PD , // PD 6 ** 83 **
|
||||
PH , // PH 2 ** 84 **
|
||||
PH , // PH 7 ** 85 **
|
||||
PE, // PE 0 ** 0 ** USART0_RX
|
||||
PE, // PE 1 ** 1 ** USART0_TX
|
||||
PE, // PE 4 ** 2 ** PWM2
|
||||
PE, // PE 5 ** 3 ** PWM3
|
||||
PG, // PG 5 ** 4 ** PWM4
|
||||
PE, // PE 3 ** 5 ** PWM5
|
||||
PH, // PH 3 ** 6 ** PWM6
|
||||
PH, // PH 4 ** 7 ** PWM7
|
||||
PH, // PH 5 ** 8 ** PWM8
|
||||
PH, // PH 6 ** 9 ** PWM9
|
||||
PB, // PB 4 ** 10 ** PWM10
|
||||
PB, // PB 5 ** 11 ** PWM11
|
||||
PB, // PB 6 ** 12 ** PWM12
|
||||
PB, // PB 7 ** 13 ** PWM13
|
||||
PJ, // PJ 1 ** 14 ** USART3_TX
|
||||
PJ, // PJ 0 ** 15 ** USART3_RX
|
||||
PH, // PH 1 ** 16 ** USART2_TX
|
||||
PH, // PH 0 ** 17 ** USART2_RX
|
||||
PD, // PD 3 ** 18 ** USART1_TX
|
||||
PD, // PD 2 ** 19 ** USART1_RX
|
||||
PD, // PD 1 ** 20 ** I2C_SDA
|
||||
PD, // PD 0 ** 21 ** I2C_SCL
|
||||
PA, // PA 0 ** 22 ** D22
|
||||
PA, // PA 1 ** 23 ** D23
|
||||
PA, // PA 2 ** 24 ** D24
|
||||
PA, // PA 3 ** 25 ** D25
|
||||
PA, // PA 4 ** 26 ** D26
|
||||
PA, // PA 5 ** 27 ** D27
|
||||
PA, // PA 6 ** 28 ** D28
|
||||
PA, // PA 7 ** 29 ** D29
|
||||
PC, // PC 7 ** 30 ** D30
|
||||
PC, // PC 6 ** 31 ** D31
|
||||
PC, // PC 5 ** 32 ** D32
|
||||
PC, // PC 4 ** 33 ** D33
|
||||
PC, // PC 3 ** 34 ** D34
|
||||
PC, // PC 2 ** 35 ** D35
|
||||
PC, // PC 1 ** 36 ** D36
|
||||
PC, // PC 0 ** 37 ** D37
|
||||
PD, // PD 7 ** 38 ** D38
|
||||
PG, // PG 2 ** 39 ** D39
|
||||
PG, // PG 1 ** 40 ** D40
|
||||
PG, // PG 0 ** 41 ** D41
|
||||
PL, // PL 7 ** 42 ** D42
|
||||
PL, // PL 6 ** 43 ** D43
|
||||
PL, // PL 5 ** 44 ** D44
|
||||
PL, // PL 4 ** 45 ** D45
|
||||
PL, // PL 3 ** 46 ** D46
|
||||
PL, // PL 2 ** 47 ** D47
|
||||
PL, // PL 1 ** 48 ** D48
|
||||
PL, // PL 0 ** 49 ** D49
|
||||
PB, // PB 3 ** 50 ** SPI_MISO
|
||||
PB, // PB 2 ** 51 ** SPI_MOSI
|
||||
PB, // PB 1 ** 52 ** SPI_SCK
|
||||
PB, // PB 0 ** 53 ** SPI_SS
|
||||
PF, // PF 0 ** 54 ** A0
|
||||
PF, // PF 1 ** 55 ** A1
|
||||
PF, // PF 2 ** 56 ** A2
|
||||
PF, // PF 3 ** 57 ** A3
|
||||
PF, // PF 4 ** 58 ** A4
|
||||
PF, // PF 5 ** 59 ** A5
|
||||
PF, // PF 6 ** 60 ** A6
|
||||
PF, // PF 7 ** 61 ** A7
|
||||
PK, // PK 0 ** 62 ** A8
|
||||
PK, // PK 1 ** 63 ** A9
|
||||
PK, // PK 2 ** 64 ** A10
|
||||
PK, // PK 3 ** 65 ** A11
|
||||
PK, // PK 4 ** 66 ** A12
|
||||
PK, // PK 5 ** 67 ** A13
|
||||
PK, // PK 6 ** 68 ** A14
|
||||
PK, // PK 7 ** 69 ** A15
|
||||
PG, // PG 4 ** 70 **
|
||||
PG, // PG 3 ** 71 **
|
||||
PJ, // PJ 2 ** 72 **
|
||||
PJ, // PJ 3 ** 73 **
|
||||
PJ, // PJ 7 ** 74 **
|
||||
PJ, // PJ 4 ** 75 **
|
||||
PJ, // PJ 5 ** 76 **
|
||||
PJ, // PJ 6 ** 77 **
|
||||
PE, // PE 2 ** 78 **
|
||||
PE, // PE 6 ** 79 **
|
||||
PE, // PE 7 ** 80 **
|
||||
PD, // PD 4 ** 81 **
|
||||
PD, // PD 5 ** 82 **
|
||||
PD, // PD 6 ** 83 **
|
||||
PH, // PH 2 ** 84 **
|
||||
PH, // PH 7 ** 85 **
|
||||
};
|
||||
|
||||
#define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) )
|
||||
@@ -141,92 +141,92 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = {
|
||||
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
||||
// PIN IN PORT
|
||||
// ------------------------
|
||||
_BV( 0 ) , // PE 0 ** 0 ** USART0_RX
|
||||
_BV( 1 ) , // PE 1 ** 1 ** USART0_TX
|
||||
_BV( 4 ) , // PE 4 ** 2 ** PWM2
|
||||
_BV( 5 ) , // PE 5 ** 3 ** PWM3
|
||||
_BV( 5 ) , // PG 5 ** 4 ** PWM4
|
||||
_BV( 3 ) , // PE 3 ** 5 ** PWM5
|
||||
_BV( 3 ) , // PH 3 ** 6 ** PWM6
|
||||
_BV( 4 ) , // PH 4 ** 7 ** PWM7
|
||||
_BV( 5 ) , // PH 5 ** 8 ** PWM8
|
||||
_BV( 6 ) , // PH 6 ** 9 ** PWM9
|
||||
_BV( 4 ) , // PB 4 ** 10 ** PWM10
|
||||
_BV( 5 ) , // PB 5 ** 11 ** PWM11
|
||||
_BV( 6 ) , // PB 6 ** 12 ** PWM12
|
||||
_BV( 7 ) , // PB 7 ** 13 ** PWM13
|
||||
_BV( 1 ) , // PJ 1 ** 14 ** USART3_TX
|
||||
_BV( 0 ) , // PJ 0 ** 15 ** USART3_RX
|
||||
_BV( 1 ) , // PH 1 ** 16 ** USART2_TX
|
||||
_BV( 0 ) , // PH 0 ** 17 ** USART2_RX
|
||||
_BV( 3 ) , // PD 3 ** 18 ** USART1_TX
|
||||
_BV( 2 ) , // PD 2 ** 19 ** USART1_RX
|
||||
_BV( 1 ) , // PD 1 ** 20 ** I2C_SDA
|
||||
_BV( 0 ) , // PD 0 ** 21 ** I2C_SCL
|
||||
_BV( 0 ) , // PA 0 ** 22 ** D22
|
||||
_BV( 1 ) , // PA 1 ** 23 ** D23
|
||||
_BV( 2 ) , // PA 2 ** 24 ** D24
|
||||
_BV( 3 ) , // PA 3 ** 25 ** D25
|
||||
_BV( 4 ) , // PA 4 ** 26 ** D26
|
||||
_BV( 5 ) , // PA 5 ** 27 ** D27
|
||||
_BV( 6 ) , // PA 6 ** 28 ** D28
|
||||
_BV( 7 ) , // PA 7 ** 29 ** D29
|
||||
_BV( 7 ) , // PC 7 ** 30 ** D30
|
||||
_BV( 6 ) , // PC 6 ** 31 ** D31
|
||||
_BV( 5 ) , // PC 5 ** 32 ** D32
|
||||
_BV( 4 ) , // PC 4 ** 33 ** D33
|
||||
_BV( 3 ) , // PC 3 ** 34 ** D34
|
||||
_BV( 2 ) , // PC 2 ** 35 ** D35
|
||||
_BV( 1 ) , // PC 1 ** 36 ** D36
|
||||
_BV( 0 ) , // PC 0 ** 37 ** D37
|
||||
_BV( 7 ) , // PD 7 ** 38 ** D38
|
||||
_BV( 2 ) , // PG 2 ** 39 ** D39
|
||||
_BV( 1 ) , // PG 1 ** 40 ** D40
|
||||
_BV( 0 ) , // PG 0 ** 41 ** D41
|
||||
_BV( 7 ) , // PL 7 ** 42 ** D42
|
||||
_BV( 6 ) , // PL 6 ** 43 ** D43
|
||||
_BV( 5 ) , // PL 5 ** 44 ** D44
|
||||
_BV( 4 ) , // PL 4 ** 45 ** D45
|
||||
_BV( 3 ) , // PL 3 ** 46 ** D46
|
||||
_BV( 2 ) , // PL 2 ** 47 ** D47
|
||||
_BV( 1 ) , // PL 1 ** 48 ** D48
|
||||
_BV( 0 ) , // PL 0 ** 49 ** D49
|
||||
_BV( 3 ) , // PB 3 ** 50 ** SPI_MISO
|
||||
_BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI
|
||||
_BV( 1 ) , // PB 1 ** 52 ** SPI_SCK
|
||||
_BV( 0 ) , // PB 0 ** 53 ** SPI_SS
|
||||
_BV( 0 ) , // PF 0 ** 54 ** A0
|
||||
_BV( 1 ) , // PF 1 ** 55 ** A1
|
||||
_BV( 2 ) , // PF 2 ** 56 ** A2
|
||||
_BV( 3 ) , // PF 3 ** 57 ** A3
|
||||
_BV( 4 ) , // PF 4 ** 58 ** A4
|
||||
_BV( 5 ) , // PF 5 ** 59 ** A5
|
||||
_BV( 6 ) , // PF 6 ** 60 ** A6
|
||||
_BV( 7 ) , // PF 7 ** 61 ** A7
|
||||
_BV( 0 ) , // PK 0 ** 62 ** A8
|
||||
_BV( 1 ) , // PK 1 ** 63 ** A9
|
||||
_BV( 2 ) , // PK 2 ** 64 ** A10
|
||||
_BV( 3 ) , // PK 3 ** 65 ** A11
|
||||
_BV( 4 ) , // PK 4 ** 66 ** A12
|
||||
_BV( 5 ) , // PK 5 ** 67 ** A13
|
||||
_BV( 6 ) , // PK 6 ** 68 ** A14
|
||||
_BV( 7 ) , // PK 7 ** 69 ** A15
|
||||
_BV( 4 ) , // PG 4 ** 70 **
|
||||
_BV( 3 ) , // PG 3 ** 71 **
|
||||
_BV( 2 ) , // PJ 2 ** 72 **
|
||||
_BV( 3 ) , // PJ 3 ** 73 **
|
||||
_BV( 7 ) , // PJ 7 ** 74 **
|
||||
_BV( 4 ) , // PJ 4 ** 75 **
|
||||
_BV( 5 ) , // PJ 5 ** 76 **
|
||||
_BV( 6 ) , // PJ 6 ** 77 **
|
||||
_BV( 2 ) , // PE 2 ** 78 **
|
||||
_BV( 6 ) , // PE 6 ** 79 **
|
||||
_BV( 7 ) , // PE 7 ** 80 **
|
||||
_BV( 4 ) , // PD 4 ** 81 **
|
||||
_BV( 5 ) , // PD 5 ** 82 **
|
||||
_BV( 6 ) , // PD 6 ** 83 **
|
||||
_BV( 2 ) , // PH 2 ** 84 **
|
||||
_BV( 7 ) , // PH 7 ** 85 **
|
||||
_BV( 0 ), // PE 0 ** 0 ** USART0_RX
|
||||
_BV( 1 ), // PE 1 ** 1 ** USART0_TX
|
||||
_BV( 4 ), // PE 4 ** 2 ** PWM2
|
||||
_BV( 5 ), // PE 5 ** 3 ** PWM3
|
||||
_BV( 5 ), // PG 5 ** 4 ** PWM4
|
||||
_BV( 3 ), // PE 3 ** 5 ** PWM5
|
||||
_BV( 3 ), // PH 3 ** 6 ** PWM6
|
||||
_BV( 4 ), // PH 4 ** 7 ** PWM7
|
||||
_BV( 5 ), // PH 5 ** 8 ** PWM8
|
||||
_BV( 6 ), // PH 6 ** 9 ** PWM9
|
||||
_BV( 4 ), // PB 4 ** 10 ** PWM10
|
||||
_BV( 5 ), // PB 5 ** 11 ** PWM11
|
||||
_BV( 6 ), // PB 6 ** 12 ** PWM12
|
||||
_BV( 7 ), // PB 7 ** 13 ** PWM13
|
||||
_BV( 1 ), // PJ 1 ** 14 ** USART3_TX
|
||||
_BV( 0 ), // PJ 0 ** 15 ** USART3_RX
|
||||
_BV( 1 ), // PH 1 ** 16 ** USART2_TX
|
||||
_BV( 0 ), // PH 0 ** 17 ** USART2_RX
|
||||
_BV( 3 ), // PD 3 ** 18 ** USART1_TX
|
||||
_BV( 2 ), // PD 2 ** 19 ** USART1_RX
|
||||
_BV( 1 ), // PD 1 ** 20 ** I2C_SDA
|
||||
_BV( 0 ), // PD 0 ** 21 ** I2C_SCL
|
||||
_BV( 0 ), // PA 0 ** 22 ** D22
|
||||
_BV( 1 ), // PA 1 ** 23 ** D23
|
||||
_BV( 2 ), // PA 2 ** 24 ** D24
|
||||
_BV( 3 ), // PA 3 ** 25 ** D25
|
||||
_BV( 4 ), // PA 4 ** 26 ** D26
|
||||
_BV( 5 ), // PA 5 ** 27 ** D27
|
||||
_BV( 6 ), // PA 6 ** 28 ** D28
|
||||
_BV( 7 ), // PA 7 ** 29 ** D29
|
||||
_BV( 7 ), // PC 7 ** 30 ** D30
|
||||
_BV( 6 ), // PC 6 ** 31 ** D31
|
||||
_BV( 5 ), // PC 5 ** 32 ** D32
|
||||
_BV( 4 ), // PC 4 ** 33 ** D33
|
||||
_BV( 3 ), // PC 3 ** 34 ** D34
|
||||
_BV( 2 ), // PC 2 ** 35 ** D35
|
||||
_BV( 1 ), // PC 1 ** 36 ** D36
|
||||
_BV( 0 ), // PC 0 ** 37 ** D37
|
||||
_BV( 7 ), // PD 7 ** 38 ** D38
|
||||
_BV( 2 ), // PG 2 ** 39 ** D39
|
||||
_BV( 1 ), // PG 1 ** 40 ** D40
|
||||
_BV( 0 ), // PG 0 ** 41 ** D41
|
||||
_BV( 7 ), // PL 7 ** 42 ** D42
|
||||
_BV( 6 ), // PL 6 ** 43 ** D43
|
||||
_BV( 5 ), // PL 5 ** 44 ** D44
|
||||
_BV( 4 ), // PL 4 ** 45 ** D45
|
||||
_BV( 3 ), // PL 3 ** 46 ** D46
|
||||
_BV( 2 ), // PL 2 ** 47 ** D47
|
||||
_BV( 1 ), // PL 1 ** 48 ** D48
|
||||
_BV( 0 ), // PL 0 ** 49 ** D49
|
||||
_BV( 3 ), // PB 3 ** 50 ** SPI_MISO
|
||||
_BV( 2 ), // PB 2 ** 51 ** SPI_MOSI
|
||||
_BV( 1 ), // PB 1 ** 52 ** SPI_SCK
|
||||
_BV( 0 ), // PB 0 ** 53 ** SPI_SS
|
||||
_BV( 0 ), // PF 0 ** 54 ** A0
|
||||
_BV( 1 ), // PF 1 ** 55 ** A1
|
||||
_BV( 2 ), // PF 2 ** 56 ** A2
|
||||
_BV( 3 ), // PF 3 ** 57 ** A3
|
||||
_BV( 4 ), // PF 4 ** 58 ** A4
|
||||
_BV( 5 ), // PF 5 ** 59 ** A5
|
||||
_BV( 6 ), // PF 6 ** 60 ** A6
|
||||
_BV( 7 ), // PF 7 ** 61 ** A7
|
||||
_BV( 0 ), // PK 0 ** 62 ** A8
|
||||
_BV( 1 ), // PK 1 ** 63 ** A9
|
||||
_BV( 2 ), // PK 2 ** 64 ** A10
|
||||
_BV( 3 ), // PK 3 ** 65 ** A11
|
||||
_BV( 4 ), // PK 4 ** 66 ** A12
|
||||
_BV( 5 ), // PK 5 ** 67 ** A13
|
||||
_BV( 6 ), // PK 6 ** 68 ** A14
|
||||
_BV( 7 ), // PK 7 ** 69 ** A15
|
||||
_BV( 4 ), // PG 4 ** 70 **
|
||||
_BV( 3 ), // PG 3 ** 71 **
|
||||
_BV( 2 ), // PJ 2 ** 72 **
|
||||
_BV( 3 ), // PJ 3 ** 73 **
|
||||
_BV( 7 ), // PJ 7 ** 74 **
|
||||
_BV( 4 ), // PJ 4 ** 75 **
|
||||
_BV( 5 ), // PJ 5 ** 76 **
|
||||
_BV( 6 ), // PJ 6 ** 77 **
|
||||
_BV( 2 ), // PE 2 ** 78 **
|
||||
_BV( 6 ), // PE 6 ** 79 **
|
||||
_BV( 7 ), // PE 7 ** 80 **
|
||||
_BV( 4 ), // PD 4 ** 81 **
|
||||
_BV( 5 ), // PD 5 ** 82 **
|
||||
_BV( 6 ), // PD 6 ** 83 **
|
||||
_BV( 2 ), // PH 2 ** 84 **
|
||||
_BV( 7 ), // PH 7 ** 85 **
|
||||
};
|
||||
|
||||
#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) )
|
||||
@@ -234,86 +234,86 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = {
|
||||
const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = {
|
||||
// TIMERS
|
||||
// ------------------------
|
||||
NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX
|
||||
NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX
|
||||
TIMER3B , // PE 4 ** 2 ** PWM2
|
||||
TIMER3C , // PE 5 ** 3 ** PWM3
|
||||
TIMER0B , // PG 5 ** 4 ** PWM4
|
||||
TIMER3A , // PE 3 ** 5 ** PWM5
|
||||
TIMER4A , // PH 3 ** 6 ** PWM6
|
||||
TIMER4B , // PH 4 ** 7 ** PWM7
|
||||
TIMER4C , // PH 5 ** 8 ** PWM8
|
||||
TIMER2B , // PH 6 ** 9 ** PWM9
|
||||
TIMER2A , // PB 4 ** 10 ** PWM10
|
||||
TIMER1A , // PB 5 ** 11 ** PWM11
|
||||
TIMER1B , // PB 6 ** 12 ** PWM12
|
||||
TIMER0A , // PB 7 ** 13 ** PWM13
|
||||
NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX
|
||||
NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX
|
||||
NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX
|
||||
NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX
|
||||
NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX
|
||||
NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX
|
||||
NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA
|
||||
NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL
|
||||
NOT_ON_TIMER , // PA 0 ** 22 ** D22
|
||||
NOT_ON_TIMER , // PA 1 ** 23 ** D23
|
||||
NOT_ON_TIMER , // PA 2 ** 24 ** D24
|
||||
NOT_ON_TIMER , // PA 3 ** 25 ** D25
|
||||
NOT_ON_TIMER , // PA 4 ** 26 ** D26
|
||||
NOT_ON_TIMER , // PA 5 ** 27 ** D27
|
||||
NOT_ON_TIMER , // PA 6 ** 28 ** D28
|
||||
NOT_ON_TIMER , // PA 7 ** 29 ** D29
|
||||
NOT_ON_TIMER , // PC 7 ** 30 ** D30
|
||||
NOT_ON_TIMER , // PC 6 ** 31 ** D31
|
||||
NOT_ON_TIMER , // PC 5 ** 32 ** D32
|
||||
NOT_ON_TIMER , // PC 4 ** 33 ** D33
|
||||
NOT_ON_TIMER , // PC 3 ** 34 ** D34
|
||||
NOT_ON_TIMER , // PC 2 ** 35 ** D35
|
||||
NOT_ON_TIMER , // PC 1 ** 36 ** D36
|
||||
NOT_ON_TIMER , // PC 0 ** 37 ** D37
|
||||
NOT_ON_TIMER , // PD 7 ** 38 ** D38
|
||||
NOT_ON_TIMER , // PG 2 ** 39 ** D39
|
||||
NOT_ON_TIMER , // PG 1 ** 40 ** D40
|
||||
NOT_ON_TIMER , // PG 0 ** 41 ** D41
|
||||
NOT_ON_TIMER , // PL 7 ** 42 ** D42
|
||||
NOT_ON_TIMER , // PL 6 ** 43 ** D43
|
||||
TIMER5C , // PL 5 ** 44 ** D44
|
||||
TIMER5B , // PL 4 ** 45 ** D45
|
||||
TIMER5A , // PL 3 ** 46 ** D46
|
||||
NOT_ON_TIMER , // PL 2 ** 47 ** D47
|
||||
NOT_ON_TIMER , // PL 1 ** 48 ** D48
|
||||
NOT_ON_TIMER , // PL 0 ** 49 ** D49
|
||||
NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO
|
||||
NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI
|
||||
NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK
|
||||
NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS
|
||||
NOT_ON_TIMER , // PF 0 ** 54 ** A0
|
||||
NOT_ON_TIMER , // PF 1 ** 55 ** A1
|
||||
NOT_ON_TIMER , // PF 2 ** 56 ** A2
|
||||
NOT_ON_TIMER , // PF 3 ** 57 ** A3
|
||||
NOT_ON_TIMER , // PF 4 ** 58 ** A4
|
||||
NOT_ON_TIMER , // PF 5 ** 59 ** A5
|
||||
NOT_ON_TIMER , // PF 6 ** 60 ** A6
|
||||
NOT_ON_TIMER , // PF 7 ** 61 ** A7
|
||||
NOT_ON_TIMER , // PK 0 ** 62 ** A8
|
||||
NOT_ON_TIMER , // PK 1 ** 63 ** A9
|
||||
NOT_ON_TIMER , // PK 2 ** 64 ** A10
|
||||
NOT_ON_TIMER , // PK 3 ** 65 ** A11
|
||||
NOT_ON_TIMER , // PK 4 ** 66 ** A12
|
||||
NOT_ON_TIMER , // PK 5 ** 67 ** A13
|
||||
NOT_ON_TIMER , // PK 6 ** 68 ** A14
|
||||
NOT_ON_TIMER , // PK 7 ** 69 ** A15
|
||||
NOT_ON_TIMER , // PG 4 ** 70 **
|
||||
NOT_ON_TIMER , // PG 3 ** 71 **
|
||||
NOT_ON_TIMER , // PJ 2 ** 72 **
|
||||
NOT_ON_TIMER , // PJ 3 ** 73 **
|
||||
NOT_ON_TIMER , // PJ 7 ** 74 **
|
||||
NOT_ON_TIMER , // PJ 4 ** 75 **
|
||||
NOT_ON_TIMER , // PJ 5 ** 76 **
|
||||
NOT_ON_TIMER , // PJ 6 ** 77 **
|
||||
NOT_ON_TIMER , // PE 2 ** 78 **
|
||||
NOT_ON_TIMER , // PE 6 ** 79 **
|
||||
NOT_ON_TIMER, // PE 0 ** 0 ** USART0_RX
|
||||
NOT_ON_TIMER, // PE 1 ** 1 ** USART0_TX
|
||||
TIMER3B, // PE 4 ** 2 ** PWM2
|
||||
TIMER3C, // PE 5 ** 3 ** PWM3
|
||||
TIMER0B, // PG 5 ** 4 ** PWM4
|
||||
TIMER3A, // PE 3 ** 5 ** PWM5
|
||||
TIMER4A, // PH 3 ** 6 ** PWM6
|
||||
TIMER4B, // PH 4 ** 7 ** PWM7
|
||||
TIMER4C, // PH 5 ** 8 ** PWM8
|
||||
TIMER2B, // PH 6 ** 9 ** PWM9
|
||||
TIMER2A, // PB 4 ** 10 ** PWM10
|
||||
TIMER1A, // PB 5 ** 11 ** PWM11
|
||||
TIMER1B, // PB 6 ** 12 ** PWM12
|
||||
TIMER0A, // PB 7 ** 13 ** PWM13
|
||||
NOT_ON_TIMER, // PJ 1 ** 14 ** USART3_TX
|
||||
NOT_ON_TIMER, // PJ 0 ** 15 ** USART3_RX
|
||||
NOT_ON_TIMER, // PH 1 ** 16 ** USART2_TX
|
||||
NOT_ON_TIMER, // PH 0 ** 17 ** USART2_RX
|
||||
NOT_ON_TIMER, // PD 3 ** 18 ** USART1_TX
|
||||
NOT_ON_TIMER, // PD 2 ** 19 ** USART1_RX
|
||||
NOT_ON_TIMER, // PD 1 ** 20 ** I2C_SDA
|
||||
NOT_ON_TIMER, // PD 0 ** 21 ** I2C_SCL
|
||||
NOT_ON_TIMER, // PA 0 ** 22 ** D22
|
||||
NOT_ON_TIMER, // PA 1 ** 23 ** D23
|
||||
NOT_ON_TIMER, // PA 2 ** 24 ** D24
|
||||
NOT_ON_TIMER, // PA 3 ** 25 ** D25
|
||||
NOT_ON_TIMER, // PA 4 ** 26 ** D26
|
||||
NOT_ON_TIMER, // PA 5 ** 27 ** D27
|
||||
NOT_ON_TIMER, // PA 6 ** 28 ** D28
|
||||
NOT_ON_TIMER, // PA 7 ** 29 ** D29
|
||||
NOT_ON_TIMER, // PC 7 ** 30 ** D30
|
||||
NOT_ON_TIMER, // PC 6 ** 31 ** D31
|
||||
NOT_ON_TIMER, // PC 5 ** 32 ** D32
|
||||
NOT_ON_TIMER, // PC 4 ** 33 ** D33
|
||||
NOT_ON_TIMER, // PC 3 ** 34 ** D34
|
||||
NOT_ON_TIMER, // PC 2 ** 35 ** D35
|
||||
NOT_ON_TIMER, // PC 1 ** 36 ** D36
|
||||
NOT_ON_TIMER, // PC 0 ** 37 ** D37
|
||||
NOT_ON_TIMER, // PD 7 ** 38 ** D38
|
||||
NOT_ON_TIMER, // PG 2 ** 39 ** D39
|
||||
NOT_ON_TIMER, // PG 1 ** 40 ** D40
|
||||
NOT_ON_TIMER, // PG 0 ** 41 ** D41
|
||||
NOT_ON_TIMER, // PL 7 ** 42 ** D42
|
||||
NOT_ON_TIMER, // PL 6 ** 43 ** D43
|
||||
TIMER5C, // PL 5 ** 44 ** D44
|
||||
TIMER5B, // PL 4 ** 45 ** D45
|
||||
TIMER5A, // PL 3 ** 46 ** D46
|
||||
NOT_ON_TIMER, // PL 2 ** 47 ** D47
|
||||
NOT_ON_TIMER, // PL 1 ** 48 ** D48
|
||||
NOT_ON_TIMER, // PL 0 ** 49 ** D49
|
||||
NOT_ON_TIMER, // PB 3 ** 50 ** SPI_MISO
|
||||
NOT_ON_TIMER, // PB 2 ** 51 ** SPI_MOSI
|
||||
NOT_ON_TIMER, // PB 1 ** 52 ** SPI_SCK
|
||||
NOT_ON_TIMER, // PB 0 ** 53 ** SPI_SS
|
||||
NOT_ON_TIMER, // PF 0 ** 54 ** A0
|
||||
NOT_ON_TIMER, // PF 1 ** 55 ** A1
|
||||
NOT_ON_TIMER, // PF 2 ** 56 ** A2
|
||||
NOT_ON_TIMER, // PF 3 ** 57 ** A3
|
||||
NOT_ON_TIMER, // PF 4 ** 58 ** A4
|
||||
NOT_ON_TIMER, // PF 5 ** 59 ** A5
|
||||
NOT_ON_TIMER, // PF 6 ** 60 ** A6
|
||||
NOT_ON_TIMER, // PF 7 ** 61 ** A7
|
||||
NOT_ON_TIMER, // PK 0 ** 62 ** A8
|
||||
NOT_ON_TIMER, // PK 1 ** 63 ** A9
|
||||
NOT_ON_TIMER, // PK 2 ** 64 ** A10
|
||||
NOT_ON_TIMER, // PK 3 ** 65 ** A11
|
||||
NOT_ON_TIMER, // PK 4 ** 66 ** A12
|
||||
NOT_ON_TIMER, // PK 5 ** 67 ** A13
|
||||
NOT_ON_TIMER, // PK 6 ** 68 ** A14
|
||||
NOT_ON_TIMER, // PK 7 ** 69 ** A15
|
||||
NOT_ON_TIMER, // PG 4 ** 70 **
|
||||
NOT_ON_TIMER, // PG 3 ** 71 **
|
||||
NOT_ON_TIMER, // PJ 2 ** 72 **
|
||||
NOT_ON_TIMER, // PJ 3 ** 73 **
|
||||
NOT_ON_TIMER, // PJ 7 ** 74 **
|
||||
NOT_ON_TIMER, // PJ 4 ** 75 **
|
||||
NOT_ON_TIMER, // PJ 5 ** 76 **
|
||||
NOT_ON_TIMER, // PJ 6 ** 77 **
|
||||
NOT_ON_TIMER, // PE 2 ** 78 **
|
||||
NOT_ON_TIMER, // PE 6 ** 79 **
|
||||
};
|
||||
|
||||
#define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) )
|
||||
|
||||
@@ -23,43 +23,41 @@
|
||||
|
||||
/**
|
||||
* Define SPI Pins: SCK, MISO, MOSI, SS
|
||||
* Platform pins have parentheses, e.g., "(53)", so we cannot use them.
|
||||
*/
|
||||
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
|
||||
#define AVR_SCK_PIN 13
|
||||
#define AVR_MISO_PIN 12
|
||||
#define AVR_MOSI_PIN 11
|
||||
#define AVR_SS_PIN 10
|
||||
#define _PIN_SPI_SCK 13
|
||||
#define _PIN_SPI_MISO 12
|
||||
#define _PIN_SPI_MOSI 11
|
||||
#define _PIN_SPI_SS 10
|
||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
||||
#define AVR_SCK_PIN 7
|
||||
#define AVR_MISO_PIN 6
|
||||
#define AVR_MOSI_PIN 5
|
||||
#define AVR_SS_PIN 4
|
||||
#define _PIN_SPI_SCK 7
|
||||
#define _PIN_SPI_MISO 6
|
||||
#define _PIN_SPI_MOSI 5
|
||||
#define _PIN_SPI_SS 4
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
#define AVR_SCK_PIN 52
|
||||
#define AVR_MISO_PIN 50
|
||||
#define AVR_MOSI_PIN 51
|
||||
#define AVR_SS_PIN 53
|
||||
#define _PIN_SPI_SCK 52
|
||||
#define _PIN_SPI_MISO 50
|
||||
#define _PIN_SPI_MOSI 51
|
||||
#define _PIN_SPI_SS 53
|
||||
#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
|
||||
#define AVR_SCK_PIN 21
|
||||
#define AVR_MISO_PIN 23
|
||||
#define AVR_MOSI_PIN 22
|
||||
#define AVR_SS_PIN 20
|
||||
#define _PIN_SPI_SCK 21
|
||||
#define _PIN_SPI_MISO 23
|
||||
#define _PIN_SPI_MOSI 22
|
||||
#define _PIN_SPI_SS 20
|
||||
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||
#define AVR_SCK_PIN 10
|
||||
#define AVR_MISO_PIN 12
|
||||
#define AVR_MOSI_PIN 11
|
||||
#define AVR_SS_PIN 16
|
||||
#define _PIN_SPI_SCK 10
|
||||
#define _PIN_SPI_MISO 12
|
||||
#define _PIN_SPI_MOSI 11
|
||||
#define _PIN_SPI_SS 16
|
||||
#endif
|
||||
|
||||
#ifndef SD_SCK_PIN
|
||||
#define SD_SCK_PIN AVR_SCK_PIN
|
||||
#define SD_SCK_PIN _PIN_SPI_SCK
|
||||
#endif
|
||||
#ifndef SD_MISO_PIN
|
||||
#define SD_MISO_PIN AVR_MISO_PIN
|
||||
#define SD_MISO_PIN _PIN_SPI_MISO
|
||||
#endif
|
||||
#ifndef SD_MOSI_PIN
|
||||
#define SD_MOSI_PIN AVR_MOSI_PIN
|
||||
#endif
|
||||
#ifndef SD_SS_PIN
|
||||
#define SD_SS_PIN AVR_SS_PIN
|
||||
#define SD_MOSI_PIN _PIN_SPI_MOSI
|
||||
#endif
|
||||
|
||||
+7
-7
@@ -55,12 +55,12 @@
|
||||
|
||||
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if HAS_MARLINUI_U8GLIB
|
||||
|
||||
#include "../shared/Marduino.h"
|
||||
#include "../shared/Delay.h"
|
||||
#include "../../shared/Marduino.h"
|
||||
#include "../../shared/Delay.h"
|
||||
|
||||
#include <U8glib-HAL.h>
|
||||
|
||||
@@ -120,7 +120,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) {
|
||||
U8G_ATOMIC_END();
|
||||
}
|
||||
|
||||
#if ENABLED(FYSETC_MINI_12864)
|
||||
#if U8G_SPI_USE_MODE_3
|
||||
#define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3
|
||||
#else
|
||||
#define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_0
|
||||
@@ -143,9 +143,9 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
||||
break;
|
||||
|
||||
case U8G_COM_MSG_CHIP_SELECT:
|
||||
#if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
|
||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
||||
// the next chip select goes active
|
||||
#if U8G_SPI_USE_MODE_3 // LCD SPI is running mode 3 while SD card is running mode 0
|
||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
||||
// the next chip select goes active
|
||||
u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active
|
||||
u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW);
|
||||
}
|
||||
+15
-10
@@ -48,7 +48,7 @@ uint16_t MarlinHAL::adc_result;
|
||||
|
||||
void MarlinHAL::init() {
|
||||
#if HAS_MEDIA
|
||||
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||
OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SDSS inactive before any other SPI users start up
|
||||
#endif
|
||||
usb_task_init(); // Initialize the USB stack
|
||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||
@@ -102,6 +102,10 @@ void watchdogSetup() {
|
||||
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
|
||||
#ifndef WATCHDOG_PIO_RESET
|
||||
#define WATCHDOG_PIO_RESET
|
||||
#endif
|
||||
|
||||
// 4 seconds timeout
|
||||
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||
|
||||
@@ -115,15 +119,16 @@ void watchdogSetup() {
|
||||
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.
|
||||
uint32_t value = (0
|
||||
| WDT_MR_WDV(timeout) // With the specified timeout
|
||||
| WDT_MR_WDD(timeout) // and no invalid write window
|
||||
#if NONE(WATCHDOG_PIO_RESET, SAMV70, SAMV71, SAME70, SAMS70)
|
||||
| WDT_MR_WDRPROC // WDT fault resets processor only with this flag.
|
||||
// Omit to also reset the PIO controller.
|
||||
#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.
|
||||
|
||||
@@ -35,67 +35,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "../../core/serial_hook.h"
|
||||
|
||||
// ------------------------
|
||||
// Serial ports
|
||||
// ------------------------
|
||||
|
||||
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
||||
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
||||
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
||||
extern DefaultSerial1 MSerial0;
|
||||
extern DefaultSerial2 MSerial1;
|
||||
extern DefaultSerial3 MSerial2;
|
||||
extern DefaultSerial4 MSerial3;
|
||||
|
||||
#define _MSERIAL(X) MSerial##X
|
||||
#define MSERIAL(X) _MSERIAL(X)
|
||||
|
||||
#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER)
|
||||
#define MYSERIAL1 customizedSerial1
|
||||
#elif WITHIN(SERIAL_PORT, 0, 3)
|
||||
#define MYSERIAL1 MSERIAL(SERIAL_PORT)
|
||||
#else
|
||||
#error "The required SERIAL_PORT must be from 0 to 3, or -1 for USB Serial."
|
||||
#endif
|
||||
|
||||
#ifdef SERIAL_PORT_2
|
||||
#if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||
#define MYSERIAL2 customizedSerial2
|
||||
#elif WITHIN(SERIAL_PORT_2, 0, 3)
|
||||
#define MYSERIAL2 MSERIAL(SERIAL_PORT_2)
|
||||
#else
|
||||
#error "SERIAL_PORT_2 must be from 0 to 3, or -1 for USB Serial."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SERIAL_PORT_3
|
||||
#if SERIAL_PORT_3 == -1 || ENABLED(EMERGENCY_PARSER)
|
||||
#define MYSERIAL3 customizedSerial3
|
||||
#elif WITHIN(SERIAL_PORT_3, 0, 3)
|
||||
#define MYSERIAL3 MSERIAL(SERIAL_PORT_3)
|
||||
#else
|
||||
#error "SERIAL_PORT_3 must be from 0 to 3, or -1 for USB Serial."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef MMU2_SERIAL_PORT
|
||||
#if WITHIN(MMU2_SERIAL_PORT, 0, 3)
|
||||
#define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT)
|
||||
#else
|
||||
#error "MMU2_SERIAL_PORT must be from 0 to 3."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef LCD_SERIAL_PORT
|
||||
#if WITHIN(LCD_SERIAL_PORT, 0, 3)
|
||||
#define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT)
|
||||
#else
|
||||
#error "LCD_SERIAL_PORT must be from 0 to 3."
|
||||
#endif
|
||||
#endif
|
||||
//
|
||||
// Serial Ports
|
||||
//
|
||||
|
||||
#include "MarlinSerial.h"
|
||||
#include "MarlinSerialUSB.h"
|
||||
@@ -127,7 +69,7 @@ typedef Servo hal_servo_t;
|
||||
#define HAL_ADC_RESOLUTION 10
|
||||
|
||||
#ifndef analogInputToDigitalPin
|
||||
#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1)
|
||||
#define analogInputToDigitalPin(p) pin_t((p < 12U) ? (p) + 54U : -1)
|
||||
#endif
|
||||
|
||||
//
|
||||
|
||||
@@ -208,8 +208,8 @@
|
||||
A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */
|
||||
A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */
|
||||
|
||||
: [bin]"+r"(bin),
|
||||
[work]"+r"(work)
|
||||
: [bin]"+r"( bin ),
|
||||
[work]"+r"( work )
|
||||
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
||||
[sck_mask]"r"( SCK_MASK ),
|
||||
[sck_port]"r"( SCK_PORT_PLUS30 )
|
||||
@@ -350,7 +350,7 @@
|
||||
static void spiRxBlock0(uint8_t *ptr, uint32_t todo) {
|
||||
uint32_t bin = 0;
|
||||
uint32_t work = 0;
|
||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||
uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS(((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */
|
||||
uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */
|
||||
uint32_t SCK_MASK = PIN_MASK(SD_SCK_PIN);
|
||||
|
||||
@@ -412,10 +412,10 @@
|
||||
A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */
|
||||
A("bne.n loop%=") /* Repeat until done */
|
||||
|
||||
: [ptr]"+r"(ptr),
|
||||
[todo]"+r"(todo),
|
||||
[bin]"+r"(bin),
|
||||
[work]"+r"(work)
|
||||
: [ptr]"+r"( ptr ),
|
||||
[todo]"+r"( todo ),
|
||||
[bin]"+r"( bin ),
|
||||
[work]"+r"( work )
|
||||
: [bitband_miso_port]"r"( BITBAND_MISO_PORT ),
|
||||
[sck_mask]"r"( SCK_MASK ),
|
||||
[sck_port]"r"( SCK_PORT_PLUS30 )
|
||||
@@ -600,9 +600,8 @@
|
||||
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
||||
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
||||
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
||||
WRITE(SD_SS_PIN, HIGH);
|
||||
|
||||
OUT_WRITE(SDSS, LOW);
|
||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||
WRITE(SD_SS_PIN, LOW);
|
||||
|
||||
PIO_Configure(
|
||||
g_APinDescription[SPI_PIN].pPort,
|
||||
@@ -767,7 +766,7 @@
|
||||
|
||||
// Disable PIO on A26 and A27
|
||||
REG_PIOA_PDR = 0x0C000000;
|
||||
OUT_WRITE(SDSS, HIGH);
|
||||
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||
|
||||
// Reset SPI0 (from sam lib)
|
||||
SPI0->SPI_CR = SPI_CR_SPIDIS;
|
||||
|
||||
@@ -33,6 +33,21 @@
|
||||
#include "../../core/types.h"
|
||||
#include "../../core/serial_hook.h"
|
||||
|
||||
typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1;
|
||||
typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2;
|
||||
typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3;
|
||||
typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4;
|
||||
extern DefaultSerial1 MSerial0;
|
||||
extern DefaultSerial2 MSerial1;
|
||||
extern DefaultSerial3 MSerial2;
|
||||
extern DefaultSerial4 MSerial3;
|
||||
|
||||
#define SERIAL_INDEX_MIN 0
|
||||
#define SERIAL_INDEX_MAX 3
|
||||
#define EP_SERIAL_PORT(N) customizedSerial##N
|
||||
#define USB_SERIAL_PORT(N) customizedSerial##N
|
||||
#include "../shared/serial_ports.h"
|
||||
|
||||
// Define constants and variables for buffering incoming serial data. We're
|
||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||
// location to which to write the next incoming character and rx_buffer_tail
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
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(const timer16_Sequence_t, Tc*, const uint8_t);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_SAM
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(FLASH_EEPROM_EMULATION)
|
||||
|
||||
@@ -132,7 +132,7 @@ static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes
|
||||
curGroup = 0xFF; // Current FLASH group
|
||||
|
||||
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
||||
#include "../../core/debug_out.h"
|
||||
#include "../../../core/debug_out.h"
|
||||
|
||||
static void ee_Dump(const int page, const void *data) {
|
||||
|
||||
@@ -291,7 +291,7 @@ static bool ee_PageWrite(uint16_t page, const void *data) {
|
||||
uint32_t *p1 = (uint32_t*)addrflash;
|
||||
uint32_t *p2 = (uint32_t*)data;
|
||||
int count = 0;
|
||||
for (i =0; i<PageSize >> 2; i++) {
|
||||
for (i = 0; i < PageSize >> 2; i++) {
|
||||
if (p1[i] != p2[i]) {
|
||||
uint32_t delta = p1[i] ^ p2[i];
|
||||
while (delta) {
|
||||
@@ -953,7 +953,7 @@ static void ee_Init() {
|
||||
|
||||
/* PersistentStore -----------------------------------------------------------*/
|
||||
|
||||
#include "../shared/eeprom_api.h"
|
||||
#include "../../shared/eeprom_api.h"
|
||||
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_SAM
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if USE_WIRED_EEPROM
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
* with simple implementations supplied by Marlin.
|
||||
*/
|
||||
|
||||
#include "../shared/eeprom_if.h"
|
||||
#include "../shared/eeprom_api.h"
|
||||
#include "../../shared/eeprom_if.h"
|
||||
#include "../../shared/eeprom_api.h"
|
||||
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
||||
@@ -64,6 +64,7 @@ void setup_endstop_interrupts() {
|
||||
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||
TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN));
|
||||
TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN));
|
||||
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN));
|
||||
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN));
|
||||
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN));
|
||||
|
||||
@@ -40,11 +40,12 @@
|
||||
* Some jitter in the Vref signal is OK so the interrupt priority is left at its default value.
|
||||
*/
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if MB(PRINTRBOARD_G2)
|
||||
|
||||
#include "G2_PWM.h"
|
||||
#include "../../../module/stepper.h"
|
||||
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
||||
#define G2_PWM_X 1
|
||||
@@ -56,16 +57,12 @@
|
||||
#else
|
||||
#define G2_PWM_Y 0
|
||||
#endif
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
||||
#if HAS_MOTOR_CURRENT_PWM_Z
|
||||
#define G2_PWM_Z 1
|
||||
#else
|
||||
#define G2_PWM_Z 0
|
||||
#endif
|
||||
#if HAS_MOTOR_CURRENT_PWM_E
|
||||
#define G2_PWM_E 1
|
||||
#else
|
||||
#define G2_PWM_E 0
|
||||
#endif
|
||||
#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E
|
||||
#define G2_MASK_X(V) (G2_PWM_X * (V))
|
||||
#define G2_MASK_Y(V) (G2_PWM_Y * (V))
|
||||
#define G2_MASK_Z(V) (G2_PWM_Z * (V))
|
||||
@@ -80,17 +77,22 @@ PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT;
|
||||
|
||||
void Stepper::digipot_init() {
|
||||
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins
|
||||
#if G2_PWM_X
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins
|
||||
#endif
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y)
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0);
|
||||
#if G2_PWM_Y
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW);
|
||||
#endif
|
||||
#if G2_PWM_Z
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0);
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW);
|
||||
#endif
|
||||
#if G2_PWM_E
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0);
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, LOW);
|
||||
#endif
|
||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E0)
|
||||
OUT_WRITE(MOTOR_CURRENT_PWM_E0_PIN, LOW);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define WPKEY (0x50574D << 8) // “PWM” in ASCII
|
||||
|
||||
@@ -26,10 +26,7 @@
|
||||
* PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
|
||||
*/
|
||||
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
#include "../../../module/stepper.h"
|
||||
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\stepper.h
|
||||
//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\G2_PWM.h
|
||||
#include <stdint.h>
|
||||
|
||||
#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
|
||||
|
||||
|
||||
@@ -68,16 +68,15 @@
|
||||
* 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.
|
||||
*/
|
||||
#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 HAS_MEDIA && HAS_DRIVER(TMC2130)
|
||||
#if ENABLED(TMC_USE_SW_SPI)
|
||||
#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."
|
||||
#endif
|
||||
#elif ENABLED(SOFTWARE_SPI)
|
||||
#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 DISABLED(SOFTWARE_SPI) && ENABLED(TMC_USE_SW_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."
|
||||
#endif
|
||||
#if ENABLED(SOFTWARE_SPI) && DISABLED(TMC_USE_SW_SPI)
|
||||
#error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix."
|
||||
#endif
|
||||
#undef _IS_HW_SPI
|
||||
#endif
|
||||
|
||||
#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY
|
||||
|
||||
@@ -19,13 +19,26 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/**
|
||||
* Support routines for Due
|
||||
*/
|
||||
|
||||
/**
|
||||
* Translation of routines & variables used by pinsDebug.h
|
||||
* Pins Debugging for DUE
|
||||
*
|
||||
* - NUMBER_PINS_TOTAL
|
||||
* - MULTI_NAME_PAD
|
||||
* - getPinByIndex(index)
|
||||
* - printPinNameByIndex(index)
|
||||
* - getPinIsDigitalByIndex(index)
|
||||
* - digitalPinToAnalogIndex(pin)
|
||||
* - getValidPinMode(pin)
|
||||
* - isValidPin(pin)
|
||||
* - isAnalogPin(pin)
|
||||
* - digitalRead_mod(pin)
|
||||
* - pwm_status(pin)
|
||||
* - printPinPWM(pin)
|
||||
* - printPinPort(pin)
|
||||
* - printPinNumber(pin)
|
||||
* - printPinAnalog(pin)
|
||||
*/
|
||||
|
||||
#include "../shared/Marduino.h"
|
||||
@@ -63,20 +76,20 @@
|
||||
|
||||
#define NUMBER_PINS_TOTAL PINS_COUNT
|
||||
|
||||
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
|
||||
#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_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_IS_DIGITAL(p) pin_array[p].is_digital
|
||||
#define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
|
||||
#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 pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
||||
((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM))
|
||||
#define digitalRead_mod(P) extDigitalRead(P) // AVR digitalRead disabled PWM before it read the pin
|
||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||
#define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%02d"), P); SERIAL_ECHO(buffer); }while(0)
|
||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||
#define getPinByIndex(x) pin_array[x].pin
|
||||
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
||||
#define isValidPin(P) (P >= 0 && P < pin_t(NUMBER_PINS_TOTAL))
|
||||
#define digitalPinToAnalogIndex(P) int(P - analogInputToDigitalPin(0))
|
||||
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||
#define pwm_status(P) (((g_pinStatus[P] & 0xF) == PIN_STATUS_PWM) && \
|
||||
((g_APinDescription[P].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM))
|
||||
#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|
||||
bool getValidPinMode(const pin_t pin) { // 1: output, 0: input
|
||||
volatile Pio* port = g_APinDescription[pin].pPort;
|
||||
uint32_t mask = g_APinDescription[pin].ulPin;
|
||||
uint8_t pin_status = g_pinStatus[pin] & 0xF;
|
||||
@@ -85,14 +98,14 @@ bool GET_PINMODE(int8_t pin) { // 1: output, 0: input
|
||||
|| pwm_status(pin));
|
||||
}
|
||||
|
||||
void pwm_details(int32_t pin) {
|
||||
void printPinPWM(const int32_t pin) {
|
||||
if (pwm_status(pin)) {
|
||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
||||
}
|
||||
}
|
||||
|
||||
void print_port(const pin_t) {}
|
||||
void printPinPort(const pin_t) {}
|
||||
|
||||
/**
|
||||
* DUE Board pin | PORT | Label
|
||||
|
||||
@@ -24,41 +24,38 @@
|
||||
/**
|
||||
* Define SPI Pins: SCK, MISO, MOSI, SS
|
||||
*
|
||||
* Available chip select pins for HW SPI are 4 10 52 77
|
||||
* Available chip select pins for HW SPI are 4 10 52 77 87
|
||||
*/
|
||||
#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87
|
||||
#if SDSS == 4
|
||||
#define SPI_PIN 87
|
||||
#define SPI_CHAN 1
|
||||
#elif SDSS == 10
|
||||
#define SPI_PIN 77
|
||||
#define SPI_CHAN 0
|
||||
#elif SDSS == 52
|
||||
#define SPI_PIN 86
|
||||
#define SPI_CHAN 2
|
||||
#elif SDSS == 77
|
||||
#define SPI_PIN 77
|
||||
#define SPI_CHAN 0
|
||||
#else
|
||||
#define SPI_PIN 87
|
||||
#define SPI_CHAN 1
|
||||
#endif
|
||||
#define SD_SCK_PIN 76
|
||||
#define SD_MISO_PIN 74
|
||||
#define SD_MOSI_PIN 75
|
||||
#else
|
||||
// defaults
|
||||
#define SOFTWARE_SPI
|
||||
#ifndef SD_SCK_PIN
|
||||
#define SD_SCK_PIN 52
|
||||
#endif
|
||||
#ifndef SD_MISO_PIN
|
||||
#define SD_MISO_PIN 50
|
||||
#endif
|
||||
#ifndef SD_MOSI_PIN
|
||||
#define SD_MOSI_PIN 51
|
||||
#endif
|
||||
#if SD_SS_PIN == 4 || SD_SS_PIN == 10 || SD_SS_PIN == 52 || SD_SS_PIN == 77 || SD_SS_PIN == 87
|
||||
#define SD_SCK_PIN 76
|
||||
#define SD_MISO_PIN 74
|
||||
#define SD_MOSI_PIN 75
|
||||
#endif
|
||||
|
||||
/* A.28, A.29, B.21, C.26, C.29 */
|
||||
#define SD_SS_PIN SDSS
|
||||
#if SD_SS_PIN == 4
|
||||
#define SPI_PIN 87
|
||||
#define SPI_CHAN 1
|
||||
#elif SD_SS_PIN == 10
|
||||
#define SPI_PIN 77
|
||||
#define SPI_CHAN 0
|
||||
#elif SD_SS_PIN == 52
|
||||
#define SPI_PIN 86
|
||||
#define SPI_CHAN 2
|
||||
#elif SD_SS_PIN == 77
|
||||
#define SPI_PIN 77
|
||||
#define SPI_CHAN 0
|
||||
#elif SD_SS_PIN == 87
|
||||
#define SPI_PIN 87
|
||||
#define SPI_CHAN 1
|
||||
#else
|
||||
#define SOFTWARE_SPI
|
||||
#ifndef SD_SCK_PIN
|
||||
#define SD_SCK_PIN 52
|
||||
#endif
|
||||
#ifndef SD_MISO_PIN
|
||||
#define SD_MISO_PIN 50
|
||||
#endif
|
||||
#ifndef SD_MOSI_PIN
|
||||
#define SD_MOSI_PIN 51
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
#include <U8glib-HAL.h>
|
||||
|
||||
#if ENABLED(FYSETC_MINI_12864)
|
||||
#if U8G_SPI_USE_MODE_3
|
||||
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3
|
||||
#else
|
||||
#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0
|
||||
@@ -96,15 +96,15 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
|
||||
break;
|
||||
|
||||
case U8G_COM_MSG_CHIP_SELECT:
|
||||
#if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0
|
||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
||||
// the next chip select goes active
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); //set SCK to mode 3 idle state before CS goes active
|
||||
#if U8G_SPI_USE_MODE_3 // LCD SPI is running mode 3 while SD card is running mode 0
|
||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
||||
// the next chip select goes active
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, LOW);
|
||||
}
|
||||
else {
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, HIGH);
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); //set SCK to mode 0 idle state after CS goes inactive
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive
|
||||
}
|
||||
#else
|
||||
u8g_SetPILevel_DUE(u8g, U8G_PI_CS, !arg_val);
|
||||
|
||||
@@ -11,7 +11,7 @@ if pioutil.is_pio_build():
|
||||
|
||||
if current_OS == 'Windows':
|
||||
|
||||
Import("env")
|
||||
env = pioutil.env
|
||||
|
||||
# Use bossac.exe on Windows
|
||||
env.Replace(
|
||||
|
||||
@@ -63,8 +63,8 @@
|
||||
#include "compiler.h"
|
||||
#include "preprocessor.h"
|
||||
#ifdef FREERTOS_USED
|
||||
#include "FreeRTOS.h"
|
||||
#include "semphr.h"
|
||||
#include <FreeRTOS.h>
|
||||
#include <semphr.h>
|
||||
#endif
|
||||
#include "ctrl_access.h"
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ void sd_mmc_spi_mem_init() {
|
||||
}
|
||||
|
||||
inline bool media_ready() {
|
||||
return IS_SD_INSERTED() && !IS_SD_PRINTING() && !IS_SD_FILE_OPEN() && card.isMounted();
|
||||
return card.isMounted() && card.isInserted() && !card.isFileOpen() && !card.isStillPrinting();
|
||||
}
|
||||
|
||||
bool sd_mmc_spi_unload(bool) { return true; }
|
||||
@@ -29,17 +29,16 @@ bool sd_mmc_spi_wr_protect() { return false; }
|
||||
bool sd_mmc_spi_removal() { return !media_ready(); }
|
||||
|
||||
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
||||
#ifdef DISABLE_DUE_SD_MMC
|
||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||
return CTRL_NO_PRESENT;
|
||||
#endif
|
||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
||||
return CTRL_GOOD;
|
||||
return sd_mmc_spi_removal() ? CTRL_NO_PRESENT : CTRL_GOOD;
|
||||
}
|
||||
|
||||
// NOTE: This function is defined as returning the address of the last block
|
||||
// in the card, which is cardSize() - 1
|
||||
Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) {
|
||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||
*nb_sector = card.diskIODriver()->cardSize() - 1;
|
||||
return CTRL_GOOD;
|
||||
}
|
||||
@@ -58,10 +57,11 @@ uint8_t sector_buf[SD_MMC_BLOCK_SIZE];
|
||||
// #define DEBUG_MMC
|
||||
|
||||
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
||||
#ifdef DISABLE_DUE_SD_MMC
|
||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||
return CTRL_NO_PRESENT;
|
||||
#endif
|
||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
||||
|
||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||
|
||||
#ifdef DEBUG_MMC
|
||||
{
|
||||
@@ -97,10 +97,11 @@ Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
||||
}
|
||||
|
||||
Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
||||
#ifdef DISABLE_DUE_SD_MMC
|
||||
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||
return CTRL_NO_PRESENT;
|
||||
#endif
|
||||
if (!media_ready()) return CTRL_NO_PRESENT;
|
||||
|
||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||
|
||||
#ifdef DEBUG_MMC
|
||||
{
|
||||
|
||||
@@ -34,13 +34,13 @@
|
||||
|
||||
#if ENABLED(WIFISUPPORT)
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include "wifi.h"
|
||||
#include "wifi/wifi.h"
|
||||
#if ENABLED(OTASUPPORT)
|
||||
#include "ota.h"
|
||||
#include "wifi/ota.h"
|
||||
#endif
|
||||
#if ENABLED(WEBSUPPORT)
|
||||
#include "spiffs.h"
|
||||
#include "web.h"
|
||||
#include "wifi/spiffs.h"
|
||||
#include "wifi/web.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -175,8 +175,6 @@ uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
|
||||
|
||||
void MarlinHAL::reboot() { ESP.restart(); }
|
||||
|
||||
void _delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// return free memory between end of heap (or end bss) and whatever is current
|
||||
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
||||
|
||||
@@ -209,16 +207,17 @@ int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
||||
// ADC
|
||||
// ------------------------
|
||||
|
||||
#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL
|
||||
|
||||
// https://docs.espressif.com/projects/esp-idf/en/release-v4.4/esp32/api-reference/peripherals/adc.html
|
||||
adc1_channel_t get_channel(int pin) {
|
||||
switch (pin) {
|
||||
case 39: return ADC1_CHANNEL(39);
|
||||
case 36: return ADC1_CHANNEL(36);
|
||||
case 35: return ADC1_CHANNEL(35);
|
||||
case 34: return ADC1_CHANNEL(34);
|
||||
case 33: return ADC1_CHANNEL(33);
|
||||
case 32: return ADC1_CHANNEL(32);
|
||||
case 39: return ADC1_CHANNEL_3;
|
||||
case 36: return ADC1_CHANNEL_0;
|
||||
case 35: return ADC1_CHANNEL_7;
|
||||
case 34: return ADC1_CHANNEL_6;
|
||||
case 33: return ADC1_CHANNEL_5;
|
||||
case 32: return ADC1_CHANNEL_4;
|
||||
case 37: return ADC1_CHANNEL_1;
|
||||
case 38: return ADC1_CHANNEL_2;
|
||||
}
|
||||
return ADC1_CHANNEL_MAX;
|
||||
}
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
#include "i2s.h"
|
||||
|
||||
#if ENABLED(WIFISUPPORT)
|
||||
#include "WebSocketSerial.h"
|
||||
#include "wifi/WebSocketSerial.h"
|
||||
#endif
|
||||
|
||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||
#include "esp3dlib.h"
|
||||
#include <esp3dlib.h>
|
||||
#endif
|
||||
|
||||
#include "FlushableHardwareSerial.h"
|
||||
@@ -165,8 +165,6 @@ int freeMemory();
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
void _delay_ms(const int ms);
|
||||
|
||||
// ------------------------
|
||||
// MarlinHAL Class
|
||||
// ------------------------
|
||||
@@ -194,7 +192,7 @@ public:
|
||||
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
||||
static void isr_off() { portENTER_CRITICAL(&spinlock); }
|
||||
|
||||
static void delay_ms(const int ms) { _delay_ms(ms); }
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks, called from idle()
|
||||
static void idletask();
|
||||
|
||||
@@ -59,6 +59,7 @@ void setup_endstop_interrupts() {
|
||||
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||
TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN));
|
||||
TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN));
|
||||
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN));
|
||||
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN));
|
||||
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN));
|
||||
|
||||
@@ -37,6 +37,10 @@
|
||||
// Set pin as output
|
||||
#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT)
|
||||
|
||||
// TODO: Store set modes in an array and use those to get the mode
|
||||
#define _IS_OUTPUT(IO) true
|
||||
#define _IS_INPUT(IO) true
|
||||
|
||||
// Set pin as input with pullup mode
|
||||
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
||||
|
||||
@@ -70,6 +74,9 @@
|
||||
// Set pin as output and init
|
||||
#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
||||
|
||||
#define IS_OUTPUT(IO) _IS_OUTPUT(IO)
|
||||
#define IS_INPUT(IO) _IS_INPUT(IO)
|
||||
|
||||
// digitalRead/Write wrappers
|
||||
#define extDigitalRead(IO) digitalRead(IO)
|
||||
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
||||
|
||||
@@ -145,14 +145,14 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
|
||||
void stepperTask(void *parameter) {
|
||||
uint32_t nextMainISR = 0;
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER;
|
||||
uint32_t nextAdvanceISR = stepper.LA_ADV_NEVER;
|
||||
#endif
|
||||
|
||||
for (;;) {
|
||||
xQueueReceive(dma.queue, &dma.current, portMAX_DELAY);
|
||||
dma.rw_pos = 0;
|
||||
|
||||
const bool using_ftMotion = TERN0(FT_MOTION, ftMotion.cfg.mode);
|
||||
const bool using_ftMotion = TERN0(FT_MOTION, ftMotion.cfg.active);
|
||||
|
||||
while (dma.rw_pos < DMA_SAMPLE_COUNT) {
|
||||
|
||||
@@ -167,13 +167,13 @@ void stepperTask(void *parameter) {
|
||||
|
||||
if (!using_ftMotion) {
|
||||
if (!nextMainISR) {
|
||||
Stepper::pulse_phase_isr();
|
||||
nextMainISR = Stepper::block_phase_isr();
|
||||
stepper.pulse_phase_isr();
|
||||
nextMainISR = stepper.block_phase_isr();
|
||||
}
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
else if (!nextAdvanceISR) {
|
||||
Stepper::advance_isr();
|
||||
nextAdvanceISR = Stepper::la_interval;
|
||||
stepper.advance_isr();
|
||||
nextAdvanceISR = stepper.la_interval;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
@@ -182,10 +182,10 @@ void stepperTask(void *parameter) {
|
||||
nextMainISR--;
|
||||
|
||||
#if ENABLED(LIN_ADVANCE)
|
||||
if (nextAdvanceISR == Stepper::LA_ADV_NEVER)
|
||||
nextAdvanceISR = Stepper::la_interval;
|
||||
if (nextAdvanceISR == stepper.LA_ADV_NEVER)
|
||||
nextAdvanceISR = stepper.la_interval;
|
||||
|
||||
if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER)
|
||||
if (nextAdvanceISR && nextAdvanceISR != stepper.LA_ADV_NEVER)
|
||||
nextAdvanceISR--;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* 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
|
||||
|
||||
#error "PINS_DEBUGGING is not yet supported for ESP32!"
|
||||
|
||||
/**
|
||||
* Pins Debugging for ESP32
|
||||
*
|
||||
* - NUMBER_PINS_TOTAL
|
||||
* - MULTI_NAME_PAD
|
||||
* - getPinByIndex(index)
|
||||
* - printPinNameByIndex(index)
|
||||
* - getPinIsDigitalByIndex(index)
|
||||
* - digitalPinToAnalogIndex(pin)
|
||||
* - getValidPinMode(pin)
|
||||
* - isValidPin(pin)
|
||||
* - isAnalogPin(pin)
|
||||
* - digitalRead_mod(pin)
|
||||
* - pwm_status(pin)
|
||||
* - printPinPWM(pin)
|
||||
* - printPinPort(pin)
|
||||
* - printPinNumber(pin)
|
||||
* - printPinAnalog(pin)
|
||||
*/
|
||||
|
||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
#define digitalRead_mod(P) extDigitalRead(P)
|
||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0)
|
||||
#define printPinNumber(P) do{ sprintf_P(buffer, PSTR("%02d"), P); SERIAL_ECHO(buffer); }while(0)
|
||||
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||
#define getPinByIndex(x) pin_array[x].pin
|
||||
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
||||
#define isValidPin(P) (P >= 0 && P < pin_t(NUMBER_PINS_TOTAL))
|
||||
#define digitalPinToAnalogIndex(P) int(P - analogInputToDigitalPin(0))
|
||||
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||
bool pwm_status(const pin_t) { return false; }
|
||||
|
||||
void printPinPort(const pin_t) {}
|
||||
|
||||
static bool getValidPinMode(const pin_t pin) {
|
||||
return isValidPin(pin) && !IS_INPUT(pin);
|
||||
}
|
||||
|
||||
void printPinPWM(const int32_t pin) {
|
||||
if (pwm_status(pin)) {
|
||||
//uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative;
|
||||
//SERIAL_ECHOPGM("PWM = ", duty);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,16 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define SD_SS_PIN SDSS
|
||||
#define SD_SCK_PIN 18
|
||||
#define SD_MISO_PIN 19
|
||||
#define SD_MOSI_PIN 23
|
||||
#define PIN_SPI_SCK 18
|
||||
#define PIN_SPI_MISO 19
|
||||
#define PIN_SPI_MOSI 23
|
||||
|
||||
#ifndef SD_SCK_PIN
|
||||
#define SD_SCK_PIN PIN_SPI_SCK
|
||||
#endif
|
||||
#ifndef SD_MISO_PIN
|
||||
#define SD_MISO_PIN PIN_SPI_MISO
|
||||
#endif
|
||||
#ifndef SD_MOSI_PIN
|
||||
#define SD_MOSI_PIN PIN_SPI_MOSI
|
||||
#endif
|
||||
|
||||
@@ -90,7 +90,7 @@ void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) {
|
||||
config.counter_en = TIMER_PAUSE;
|
||||
config.alarm_en = TIMER_ALARM_EN;
|
||||
config.intr_type = TIMER_INTR_LEVEL;
|
||||
config.auto_reload = true;
|
||||
config.auto_reload = TIMER_AUTORELOAD_EN;
|
||||
|
||||
// Select and initialize the timer
|
||||
timer_init(timer.group, timer.idx, &config);
|
||||
|
||||
@@ -53,12 +53,11 @@ typedef uint64_t hal_timer_t;
|
||||
#if ENABLED(I2S_STEPPER_STREAM)
|
||||
#define STEPPER_TIMER_PRESCALE 1
|
||||
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs // wrong would be 0.25
|
||||
#else
|
||||
#define STEPPER_TIMER_PRESCALE 40
|
||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
#endif
|
||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||
|
||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#if HAS_MEDIA
|
||||
#include "../../sd/cardreader.h"
|
||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||
#include "sd_ESP32.h"
|
||||
#include <sd_ESP32.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(WIFISUPPORT)
|
||||
|
||||
+2
-2
@@ -21,8 +21,8 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../core/serial_hook.h"
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
#include "../../../core/serial_hook.h"
|
||||
|
||||
#include <Stream.h>
|
||||
|
||||
@@ -22,11 +22,15 @@
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include <WiFi.h>
|
||||
|
||||
#undef ENABLED
|
||||
#undef DISABLED
|
||||
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ALL(WIFISUPPORT, OTASUPPORT)
|
||||
|
||||
#include <WiFi.h>
|
||||
#include <ESPmDNS.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <ArduinoOTA.h>
|
||||
@@ -21,11 +21,11 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||
|
||||
#include "../../core/serial.h"
|
||||
#include "../../../core/serial.h"
|
||||
|
||||
#include <FS.h>
|
||||
#include <SPIFFS.h>
|
||||
@@ -21,11 +21,11 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#undef DISABLED // esp32-hal-gpio.h
|
||||
#include <SPIFFS.h>
|
||||
@@ -21,11 +21,12 @@
|
||||
*/
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
|
||||
#include "../../core/serial.h"
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
#include "../../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(WIFISUPPORT)
|
||||
|
||||
#include "../../../core/serial.h"
|
||||
|
||||
#include <WiFi.h>
|
||||
#include <ESPmDNS.h>
|
||||
#include <ESPAsyncWebServer.h>
|
||||
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "../shared/Delay.h"
|
||||
|
||||
uint16_t MarlinHAL::adc_result;
|
||||
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
extern void install_min_serial();
|
||||
#endif
|
||||
|
||||
#if ENABLED(MARLIN_DEV_MODE)
|
||||
// Dump the clock frequencies of the system, AHB, APB1, APB2, and F_CPU.
|
||||
static inline void HAL_clock_frequencies_dump() {
|
||||
auto& rcuInstance = rcu::RCU::get_instance();
|
||||
uint32_t freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_SYS);
|
||||
SERIAL_ECHOPGM("\nSYSTEM_CLOCK=", freq);
|
||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_AHB);
|
||||
SERIAL_ECHOPGM("\nABH_CLOCK=", freq);
|
||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB1);
|
||||
SERIAL_ECHOPGM("\nAPB1_CLOCK=", freq);
|
||||
freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB2);
|
||||
SERIAL_ECHOPGM("\nAPB2_CLOCK=", freq,
|
||||
"\nF_CPU=", F_CPU);
|
||||
// Done
|
||||
SERIAL_ECHOPGM("\n--\n");
|
||||
}
|
||||
#endif // MARLIN_DEV_MODE
|
||||
|
||||
// Initializes the Marlin HAL
|
||||
void MarlinHAL::init() {
|
||||
constexpr unsigned int cpuFreq = F_CPU;
|
||||
UNUSED(cpuFreq);
|
||||
|
||||
#if PIN_EXISTS(LED)
|
||||
OUT_WRITE(LED_PIN, LOW);
|
||||
#endif
|
||||
|
||||
SetTimerInterruptPriorities();
|
||||
|
||||
// Print clock frequencies to host serial
|
||||
TERN_(MARLIN_DEV_MODE, HAL_clock_frequencies_dump());
|
||||
|
||||
// Register min serial
|
||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial());
|
||||
}
|
||||
|
||||
// Returns the reset source based on the flags set in the RCU module
|
||||
uint8_t MarlinHAL::get_reset_source() {
|
||||
return
|
||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_FWDGTRST)) ? RST_WATCHDOG :
|
||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_SWRST)) ? RST_SOFTWARE :
|
||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_EPRST)) ? RST_EXTERNAL :
|
||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_PORRST)) ? RST_POWER_ON :
|
||||
(RCU_I.get_flag(rcu::Status_Flags::FLAG_LPRST)) ? RST_BROWN_OUT :
|
||||
0;
|
||||
}
|
||||
|
||||
// Returns the amount of free memory available in bytes
|
||||
int MarlinHAL::freeMemory() {
|
||||
volatile char top;
|
||||
return &top - reinterpret_cast<char*>(_sbrk(0));
|
||||
}
|
||||
|
||||
// Watchdog Timer
|
||||
#if ENABLED(USE_WATCHDOG)
|
||||
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
|
||||
|
||||
#include <FWatchdogTimer.h>
|
||||
|
||||
FWatchdogTimer& watchdogTimer = FWatchdogTimer::get_instance();
|
||||
|
||||
// Initializes the watchdog timer
|
||||
void MarlinHAL::watchdog_init() {
|
||||
IF_DISABLED(DISABLE_WATCHDOG_INIT, watchdogTimer.begin(WDT_TIMEOUT_US));
|
||||
}
|
||||
|
||||
// Refreshes the watchdog timer to prevent system reset
|
||||
void MarlinHAL::watchdog_refresh() {
|
||||
watchdogTimer.reload();
|
||||
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
|
||||
TOGGLE(LED_PIN); // Heartbeat indicator
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
extern unsigned int _ebss; // End of bss section
|
||||
}
|
||||
|
||||
// Resets the system to initiate a firmware flash.
|
||||
WEAK void flashFirmware(const int16_t) {
|
||||
hal.reboot();
|
||||
}
|
||||
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,160 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
#define CPU_32_BIT
|
||||
|
||||
#include "../../core/macros.h"
|
||||
#include "../shared/Marduino.h"
|
||||
#include "../shared/math_32bit.h"
|
||||
#include "../shared/HAL_SPI.h"
|
||||
|
||||
#include "temp_soc.h"
|
||||
#include "fastio.h"
|
||||
#include "Servo.h"
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <GPIO.hpp>
|
||||
#include <AFIO.hpp>
|
||||
|
||||
// Default graphical display delays
|
||||
#define CPU_ST7920_DELAY_1 300
|
||||
#define CPU_ST7920_DELAY_2 40
|
||||
#define CPU_ST7920_DELAY_3 340
|
||||
|
||||
// Serial Ports
|
||||
#include "MarlinSerial.h"
|
||||
|
||||
// Interrupts
|
||||
#define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq()
|
||||
#define CRITICAL_SECTION_END() if (irqon) __enable_irq()
|
||||
|
||||
#define cli() __disable_irq()
|
||||
#define sei() __enable_irq()
|
||||
|
||||
// Alias of __bss_end__
|
||||
#define __bss_end __bss_end__
|
||||
|
||||
// Types
|
||||
typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs.
|
||||
typedef uint8_t pin_t; // Parity with mfl platform
|
||||
|
||||
// Servo
|
||||
class libServo;
|
||||
typedef libServo hal_servo_t;
|
||||
#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos()
|
||||
#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos()
|
||||
|
||||
// Debugging
|
||||
#define JTAG_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_DP_ONLY_REMAP)
|
||||
#define JTAGSWD_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_ALL_DISABLED_REMAP)
|
||||
#define JTAGSWD_RESET() AFIO_I.set_remap(gpio::Pin_Remap_Select::FULL_SWJ_REMAP)
|
||||
|
||||
// ADC
|
||||
#ifdef ADC_RESOLUTION
|
||||
#define HAL_ADC_RESOLUTION ADC_RESOLUTION
|
||||
#else
|
||||
#define HAL_ADC_RESOLUTION 12
|
||||
#endif
|
||||
|
||||
#define HAL_ADC_VREF_MV 3300
|
||||
|
||||
// Disable Marlin's software oversampling.
|
||||
// The MFL framework uses 16x hardware oversampling by default
|
||||
#ifdef GD32F303RE
|
||||
#define HAL_ADC_FILTERED
|
||||
#endif
|
||||
|
||||
#define GET_PIN_MAP_PIN(index) index
|
||||
#define GET_PIN_MAP_INDEX(pin) pin
|
||||
#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval)
|
||||
|
||||
#ifndef PLATFORM_M997_SUPPORT
|
||||
#define PLATFORM_M997_SUPPORT
|
||||
#endif
|
||||
|
||||
void flashFirmware(const int16_t);
|
||||
|
||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||
|
||||
extern "C" char* _sbrk(int incr);
|
||||
extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char* sout);
|
||||
|
||||
// MarlinHAL Class
|
||||
class MarlinHAL {
|
||||
public:
|
||||
// Before setup()
|
||||
MarlinHAL() {}
|
||||
|
||||
// Watchdog
|
||||
static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {});
|
||||
static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {});
|
||||
|
||||
static void init(); // called early in setup()
|
||||
static void init_board() {} // called less early in setup()
|
||||
static void reboot() { NVIC_SystemReset(); } // restart the firmware from 0x0
|
||||
|
||||
// Interrupts
|
||||
static bool isr_state() { return !__get_PRIMASK(); }
|
||||
static void isr_on() { sei(); }
|
||||
static void isr_off() { cli(); }
|
||||
static void delay_ms(const int ms) { delay(ms); }
|
||||
|
||||
// Tasks called from idle()
|
||||
static void idletask() {}
|
||||
|
||||
// Reset
|
||||
static uint8_t get_reset_source();
|
||||
static void clear_reset_source() { RCU_I.clear_all_reset_flags(); }
|
||||
|
||||
// Free SRAM
|
||||
static int freeMemory();
|
||||
|
||||
// ADC methods
|
||||
static uint16_t adc_result;
|
||||
|
||||
// Called by Temperature::init once at startup
|
||||
static void adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); }
|
||||
|
||||
// Called by Temperature::init for each sensor at startup
|
||||
static void adc_enable(const pin_t pin) { pinMode(pin, INPUT); }
|
||||
|
||||
// Called from Temperature::isr to start ADC sampling on the given pin
|
||||
static void adc_start(const pin_t pin) { adc_result = static_cast<uint16_t>(analogRead(pin)); }
|
||||
|
||||
// Check if ADC is ready for reading
|
||||
static bool adc_ready() { return true; }
|
||||
|
||||
// Current value of the ADC register
|
||||
static uint16_t adc_value() { return adc_result; }
|
||||
|
||||
// Set the PWM duty cycle for the pin to the given value.
|
||||
// Optionally invert the duty cycle [default = false]
|
||||
// Optionally change the maximum size of the provided value to enable finer PWM duty control [default = 255]
|
||||
static void set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale = 255U, const bool invert = false);
|
||||
|
||||
// Set the frequency of the timer for the given pin.
|
||||
// All Timer PWM pins run at the same frequency.
|
||||
static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired);
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <SPI.h>
|
||||
|
||||
using MarlinSPI = SPIClass;
|
||||
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include "MarlinSerial.h"
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
#include "../../feature/e_parser.h"
|
||||
#endif
|
||||
|
||||
using namespace arduino;
|
||||
|
||||
MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) {
|
||||
UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin);
|
||||
return *reinterpret_cast<MarlinSerial*>(&serial);
|
||||
}
|
||||
|
||||
#if USING_HW_SERIAL0
|
||||
MSerialT MSerial0(true, MarlinSerial::get_instance(usart::USART_Base::USART0_BASE, NO_PIN, NO_PIN));
|
||||
#endif
|
||||
#if USING_HW_SERIAL1
|
||||
MSerialT MSerial1(true, MarlinSerial::get_instance(usart::USART_Base::USART1_BASE, NO_PIN, NO_PIN));
|
||||
#endif
|
||||
#if USING_HW_SERIAL2
|
||||
MSerialT MSerial2(true, MarlinSerial::get_instance(usart::USART_Base::USART2_BASE, NO_PIN, NO_PIN));
|
||||
#endif
|
||||
#if USING_HW_SERIAL3
|
||||
MSerialT MSerial3(true, MarlinSerial::get_instance(usart::USART_Base::UART3_BASE, NO_PIN, NO_PIN));
|
||||
#endif
|
||||
#if USING_HW_SERIAL4
|
||||
MSerialT MSerial4(true, MarlinSerial::get_instance(usart::USART_Base::UART4_BASE, NO_PIN, NO_PIN));
|
||||
#endif
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
// This callback needs to access the specific MarlinSerial instance
|
||||
// We'll use a static pointer to track the current instance
|
||||
static MarlinSerial* current_serial_instance = nullptr;
|
||||
|
||||
static void emergency_callback() {
|
||||
if (!current_serial_instance) return;
|
||||
const uint8_t last_data = current_serial_instance->get_last_data();
|
||||
emergency_parser.update(current_serial_instance->emergency_state, last_data);
|
||||
}
|
||||
|
||||
void MarlinSerial::register_emergency_callback(void (*callback)()) {
|
||||
usart_.register_interrupt_callback(usart::Interrupt_Type::INTR_RBNEIE, callback);
|
||||
}
|
||||
#endif
|
||||
|
||||
void MarlinSerial::begin(unsigned long baudrate, uint16_t config) {
|
||||
UsartSerial::begin(baudrate, config, ENABLED(SERIAL_DMA));
|
||||
#if ENABLED(EMERGENCY_PARSER) && DISABLED(SERIAL_DMA)
|
||||
current_serial_instance = this;
|
||||
register_emergency_callback(emergency_callback);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MarlinSerial::updateRxDmaBuffer() {
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
// Get the number of bytes available in the receive buffer
|
||||
const size_t available_bytes = usart_.available_for_read(true);
|
||||
|
||||
// Process only the available data
|
||||
for (size_t i = 0; i < available_bytes; ++i) {
|
||||
uint8_t data;
|
||||
if (usart_.read_rx_buffer(data))
|
||||
emergency_parser.update(emergency_state, data);
|
||||
}
|
||||
#endif
|
||||
// Call the base class implementation to handle any additional updates
|
||||
UsartSerial::updateRxDmaBuffer();
|
||||
}
|
||||
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
#include "../../feature/e_parser.h"
|
||||
#endif
|
||||
|
||||
#include <UsartSerial.hpp>
|
||||
|
||||
#include "../../core/serial_hook.h"
|
||||
|
||||
#define SERIAL_INDEX_MIN 0
|
||||
#define SERIAL_INDEX_MAX 4
|
||||
|
||||
#include "../shared/serial_ports.h"
|
||||
|
||||
#if defined(LCD_SERIAL_PORT) && ANY(HAS_DGUS_LCD, EXTENSIBLE_UI)
|
||||
#define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite()
|
||||
#endif
|
||||
|
||||
using namespace arduino;
|
||||
|
||||
struct MarlinSerial : public UsartSerial {
|
||||
static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN);
|
||||
|
||||
void begin(unsigned long baudrate, uint16_t config);
|
||||
inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); }
|
||||
void updateRxDmaBuffer();
|
||||
|
||||
#if DISABLED(SERIAL_DMA)
|
||||
FORCE_INLINE static uint8_t buffer_overruns() { return 0; }
|
||||
#endif
|
||||
|
||||
#if ENABLED(EMERGENCY_PARSER)
|
||||
EmergencyParser::State emergency_state;
|
||||
|
||||
// Accessor method to get the last received byte
|
||||
uint8_t get_last_data() { return usart_.get_last_data(); }
|
||||
|
||||
// Register the emergency callback
|
||||
void register_emergency_callback(void (*callback)());
|
||||
#endif
|
||||
|
||||
protected:
|
||||
using UsartSerial::UsartSerial;
|
||||
};
|
||||
|
||||
typedef Serial1Class<MarlinSerial> MSerialT;
|
||||
extern MSerialT MSerial0;
|
||||
extern MSerialT MSerial1;
|
||||
extern MSerialT MSerial2;
|
||||
extern MSerialT MSerial3;
|
||||
extern MSerialT MSerial4;
|
||||
@@ -0,0 +1,163 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
#include "../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../inc/MarlinConfigPre.h"
|
||||
|
||||
#if ENABLED(POSTMORTEM_DEBUGGING)
|
||||
#include "../shared/MinSerial.h"
|
||||
|
||||
// Base addresses for USART peripherals
|
||||
static constexpr uintptr_t USART_base[] = {
|
||||
0x40013800, // USART0
|
||||
0x40004400, // USART1
|
||||
0x40004800, // USART2
|
||||
0x40004C00, // UART3
|
||||
0x40005000 // UART4
|
||||
};
|
||||
|
||||
// Register offsets
|
||||
static constexpr uint32_t STAT0_OFFSET = 0x00U;
|
||||
static constexpr uint32_t DATA_OFFSET = 0x04U;
|
||||
static constexpr uint32_t BAUD_OFFSET = 0x08U;
|
||||
static constexpr uint32_t CTL0_OFFSET = 0x0CU;
|
||||
static constexpr uint32_t CTL1_OFFSET = 0x14U;
|
||||
|
||||
// Bit positions
|
||||
static constexpr uint32_t TBE_BIT = 7;
|
||||
static constexpr uint32_t TEN_BIT = 3;
|
||||
static constexpr uint32_t UEN_BIT = 13;
|
||||
|
||||
// NVIC interrupt numbers for USART
|
||||
static constexpr int nvicUART[] = { 37, 38, 39, 52, 53 };
|
||||
|
||||
// RCU PCLK values for USART
|
||||
static constexpr rcu::RCU_PCLK clockRegs[] = {
|
||||
rcu::RCU_PCLK::PCLK_USART0,
|
||||
rcu::RCU_PCLK::PCLK_USART1,
|
||||
rcu::RCU_PCLK::PCLK_USART2,
|
||||
rcu::RCU_PCLK::PCLK_UART3,
|
||||
rcu::RCU_PCLK::PCLK_UART4
|
||||
};
|
||||
|
||||
// Memory barrier instructions
|
||||
#define isb() __asm__ __volatile__ ("isb" : : : "memory")
|
||||
#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
|
||||
#define sw_barrier() __asm__ volatile("" : : : "memory")
|
||||
|
||||
// Direct register access macros
|
||||
#define USART_REG(offset) (*(volatile uint32_t*)(USART_base[SERIAL_PORT] + (offset)))
|
||||
#define USART_STAT0 USART_REG(STAT0_OFFSET)
|
||||
#define USART_DATA USART_REG(DATA_OFFSET)
|
||||
#define USART_BAUD USART_REG(BAUD_OFFSET)
|
||||
#define USART_CTL0 USART_REG(CTL0_OFFSET)
|
||||
#define USART_CTL1 USART_REG(CTL1_OFFSET)
|
||||
|
||||
// Bit manipulation macros
|
||||
#define READ_BIT(reg, bit) (((reg) >> (bit)) & 1U)
|
||||
#define SET_BIT(reg, bit) ((reg) |= (1U << (bit)))
|
||||
#define CLEAR_BIT(reg, bit) ((reg) &= ~(1U << (bit)))
|
||||
|
||||
// Initializes the MinSerial interface.
|
||||
// This function sets up the USART interface for serial communication.
|
||||
// If the selected serial port is not a hardware port, it disables the severe error reporting feature.
|
||||
static void MinSerialBegin() {
|
||||
#if !WITHIN(SERIAL_PORT, 0, 4)
|
||||
#warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error."
|
||||
#warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port."
|
||||
#else
|
||||
int nvicIndex = nvicUART[SERIAL_PORT];
|
||||
|
||||
// NVIC base address for interrupt disable
|
||||
struct NVICMin {
|
||||
volatile uint32_t ISER[32];
|
||||
volatile uint32_t ICER[32];
|
||||
};
|
||||
NVICMin *nvicBase = (NVICMin*)0xE000E100;
|
||||
|
||||
SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F);
|
||||
|
||||
// We require memory barriers to properly disable interrupts
|
||||
// (https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the)
|
||||
dsb();
|
||||
isb();
|
||||
|
||||
// Get the RCU PCLK for this USART
|
||||
rcu::RCU_PCLK pclk = clockRegs[SERIAL_PORT];
|
||||
|
||||
// Disable then enable usart peripheral clocks
|
||||
rcu::RCU_DEVICE.set_pclk_enable(pclk, false);
|
||||
rcu::RCU_DEVICE.set_pclk_enable(pclk, true);
|
||||
|
||||
// Save current baudrate
|
||||
uint32_t baudrate = USART_BAUD;
|
||||
|
||||
// Reset USART control registers
|
||||
USART_CTL0 = 0;
|
||||
USART_CTL1 = 0; // 1 stop bit
|
||||
|
||||
// Restore baudrate
|
||||
USART_BAUD = baudrate;
|
||||
|
||||
// Enable transmitter and USART (8 bits, no parity, 1 stop bit)
|
||||
SET_BIT(USART_CTL0, TEN_BIT);
|
||||
SET_BIT(USART_CTL0, UEN_BIT);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Writes a single character to the serial port.
|
||||
static void MinSerialWrite(char c) {
|
||||
#if WITHIN(SERIAL_PORT, 0, 4)
|
||||
// Wait until transmit buffer is empty
|
||||
while (!READ_BIT(USART_STAT0, TBE_BIT)) {
|
||||
hal.watchdog_refresh();
|
||||
sw_barrier();
|
||||
}
|
||||
// Write character to data register
|
||||
USART_DATA = c;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Installs the minimum serial interface.
|
||||
// Sets the HAL_min_serial_init and HAL_min_serial_out function pointers to MinSerialBegin and MinSerialWrite respectively.
|
||||
void install_min_serial() {
|
||||
HAL_min_serial_init = &MinSerialBegin;
|
||||
HAL_min_serial_out = &MinSerialWrite;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
// A low-level assembly-based jump handler.
|
||||
// Unconditionally branches to the CommonHandler_ASM function.
|
||||
__attribute__((naked, aligned(4))) void JumpHandler_ASM() {
|
||||
__asm__ __volatile__ ("b CommonHandler_ASM\n");
|
||||
}
|
||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler();
|
||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler();
|
||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler();
|
||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler();
|
||||
void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler();
|
||||
}
|
||||
|
||||
#endif // POSTMORTEM_DEBUGGING
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,8 @@
|
||||
# Generic GD32 HAL based on the MFL Arduino Core
|
||||
|
||||
This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library.
|
||||
|
||||
Currently it supports:
|
||||
* GD32F303RET6
|
||||
|
||||
Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL).
|
||||
@@ -0,0 +1,125 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
#include "../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#if HAS_SERVOS
|
||||
|
||||
#include "Servo.h"
|
||||
|
||||
static uint_fast8_t servoCount = 0;
|
||||
static libServo* servos[NUM_SERVOS] = {0};
|
||||
constexpr millis_t servoDelay[] = SERVO_DELAY;
|
||||
static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
|
||||
|
||||
// Initialize to the default timer priority. This will be overridden by a call from timers.cpp.
|
||||
// This allows all timer interrupt priorities to be managed from a single location in the HAL.
|
||||
static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 12, 0);
|
||||
|
||||
// This must be called after the MFL Servo class has initialized the timer.
|
||||
// To be safe this is currently called after every call to attach().
|
||||
static void fixServoTimerInterruptPriority() {
|
||||
auto& servoTimerIdx = GeneralTimer::get_instance(static_cast<timer::TIMER_Base>(TIMER_SERVO));
|
||||
NVIC_SetPriority(servoTimerIdx.getTimerUpIRQ(), servo_interrupt_priority);
|
||||
}
|
||||
|
||||
// Default constructor for libServo class.
|
||||
// Initializes the servo delay, pause state, and pause value.
|
||||
// Registers the servo instance in the servos array.
|
||||
libServo::libServo() :
|
||||
delay(servoDelay[servoCount]),
|
||||
was_attached_before_pause(false),
|
||||
value_before_pause(0)
|
||||
{
|
||||
servos[servoCount++] = this;
|
||||
}
|
||||
|
||||
// Attaches a servo to a specified pin.
|
||||
int8_t libServo::attach(const int pin) {
|
||||
if (servoCount >= MAX_SERVOS) return -1;
|
||||
if (pin > 0) servoPin = pin;
|
||||
auto result = mflServo.attach(servoPin);
|
||||
fixServoTimerInterruptPriority();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Attaches a servo to a specified pin with minimum and maximum pulse widths.
|
||||
int8_t libServo::attach(const int pin, const int min, const int max) {
|
||||
if (servoCount >= MAX_SERVOS) return -1;
|
||||
if (pin > 0) servoPin = pin;
|
||||
auto result = mflServo.attach(servoPin, min, max);
|
||||
fixServoTimerInterruptPriority();
|
||||
return result;
|
||||
}
|
||||
|
||||
// Moves the servo to a specified position.
|
||||
void libServo::move(const int value) {
|
||||
if (attach(0) >= 0) {
|
||||
mflServo.write(value);
|
||||
safe_delay(delay);
|
||||
TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach());
|
||||
}
|
||||
}
|
||||
|
||||
// Pause the servo by detaching it and storing its current state.
|
||||
void libServo::pause() {
|
||||
was_attached_before_pause = mflServo.attached();
|
||||
if (was_attached_before_pause) {
|
||||
value_before_pause = mflServo.read();
|
||||
mflServo.detach();
|
||||
}
|
||||
}
|
||||
|
||||
// Resume a previously paused servo.
|
||||
// If the servo was attached before the pause, this function re-attaches
|
||||
// the servo and moves it to the position it was in before the pause.
|
||||
void libServo::resume() {
|
||||
if (was_attached_before_pause) {
|
||||
attach();
|
||||
move(value_before_pause);
|
||||
}
|
||||
}
|
||||
|
||||
// Pause all servos by stopping their timers.
|
||||
void libServo::pause_all_servos() {
|
||||
for (auto& servo : servos)
|
||||
if (servo) servo->pause();
|
||||
}
|
||||
|
||||
// Resume all paused servos by starting their timers.
|
||||
void libServo::resume_all_servos() {
|
||||
for (auto& servo : servos)
|
||||
if (servo) servo->resume();
|
||||
}
|
||||
|
||||
// Set the interrupt priority for the servo.
|
||||
// @param preemptPriority The preempt priority level.
|
||||
// @param subPriority The sub priority level.
|
||||
void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) {
|
||||
servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority);
|
||||
}
|
||||
|
||||
#endif // HAS_SERVOS
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <Servo.h>
|
||||
|
||||
#include "../../core/millis_t.h"
|
||||
|
||||
// Inherit and expand on the official library
|
||||
class libServo {
|
||||
public:
|
||||
libServo();
|
||||
|
||||
int8_t attach(const int pin = 0); // pin == 0 uses value from previous call
|
||||
int8_t attach(const int pin, const int min, const int max);
|
||||
void detach() { mflServo.detach(); }
|
||||
|
||||
int read() { return mflServo.read(); }
|
||||
void move(const int value);
|
||||
|
||||
void pause();
|
||||
void resume();
|
||||
|
||||
static void pause_all_servos();
|
||||
static void resume_all_servos();
|
||||
|
||||
static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority);
|
||||
|
||||
private:
|
||||
Servo mflServo;
|
||||
|
||||
int servoPin = 0;
|
||||
millis_t delay = 0;
|
||||
|
||||
bool was_attached_before_pause;
|
||||
int value_before_pause;
|
||||
};
|
||||
@@ -0,0 +1,129 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm / Ryan Power
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
|
||||
|
||||
#include <U8glib-HAL.h>
|
||||
#include "../../shared/HAL_SPI.h"
|
||||
|
||||
#define nop asm volatile ("\tnop\n")
|
||||
|
||||
static inline uint8_t swSpiTransfer_mode_0(uint8_t b) {
|
||||
for (uint8_t i = 0; i < 8; ++i) {
|
||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
||||
WRITE(DOGLCD_SCK, HIGH);
|
||||
WRITE(DOGLCD_MOSI, state);
|
||||
b <<= 1;
|
||||
WRITE(DOGLCD_SCK, LOW);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
static inline uint8_t swSpiTransfer_mode_3(uint8_t b) {
|
||||
for (uint8_t i = 0; i < 8; ++i) {
|
||||
const uint8_t state = (b & 0x80) ? HIGH : LOW;
|
||||
WRITE(DOGLCD_SCK, LOW);
|
||||
WRITE(DOGLCD_MOSI, state);
|
||||
b <<= 1;
|
||||
WRITE(DOGLCD_SCK, HIGH);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
static void u8g_sw_spi_shift_out(uint8_t val) {
|
||||
#if U8G_SPI_USE_MODE_3
|
||||
swSpiTransfer_mode_3(val);
|
||||
#else
|
||||
swSpiTransfer_mode_0(val);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void swSpiInit() {
|
||||
#if PIN_EXISTS(LCD_RESET)
|
||||
SET_OUTPUT(LCD_RESET_PIN);
|
||||
#endif
|
||||
SET_OUTPUT(DOGLCD_A0);
|
||||
OUT_WRITE(DOGLCD_SCK, LOW);
|
||||
OUT_WRITE(DOGLCD_MOSI, LOW);
|
||||
OUT_WRITE(DOGLCD_CS, HIGH);
|
||||
}
|
||||
|
||||
uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
|
||||
switch (msg) {
|
||||
case U8G_COM_MSG_INIT:
|
||||
swSpiInit();
|
||||
break;
|
||||
case U8G_COM_MSG_STOP:
|
||||
break;
|
||||
case U8G_COM_MSG_RESET:
|
||||
#if PIN_EXISTS(LCD_RESET)
|
||||
WRITE(LCD_RESET_PIN, arg_val);
|
||||
#endif
|
||||
break;
|
||||
case U8G_COM_MSG_CHIP_SELECT:
|
||||
#if U8G_SPI_USE_MODE_3 // This LCD SPI is running mode 3 while SD card is running mode 0
|
||||
if (arg_val) { // SCK idle state needs to be set to the proper idle state before
|
||||
// the next chip select goes active
|
||||
WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active
|
||||
WRITE(DOGLCD_CS, LOW);
|
||||
nop; // Hold SCK high for a few ns
|
||||
nop;
|
||||
}
|
||||
else {
|
||||
WRITE(DOGLCD_CS, HIGH);
|
||||
WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive
|
||||
}
|
||||
#else
|
||||
WRITE(DOGLCD_CS, !arg_val);
|
||||
#endif
|
||||
break;
|
||||
case U8G_COM_MSG_WRITE_BYTE:
|
||||
u8g_sw_spi_shift_out(arg_val);
|
||||
break;
|
||||
case U8G_COM_MSG_WRITE_SEQ: {
|
||||
uint8_t* ptr = (uint8_t*)arg_ptr;
|
||||
while (arg_val > 0) {
|
||||
u8g_sw_spi_shift_out(*ptr++);
|
||||
arg_val--;
|
||||
}
|
||||
} break;
|
||||
case U8G_COM_MSG_WRITE_SEQ_P: {
|
||||
uint8_t* ptr = (uint8_t*)arg_ptr;
|
||||
while (arg_val > 0) {
|
||||
u8g_sw_spi_shift_out(u8g_pgm_read(ptr));
|
||||
ptr++;
|
||||
arg_val--;
|
||||
}
|
||||
} break;
|
||||
case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1)
|
||||
WRITE(DOGLCD_A0, arg_val);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* PersistentStore for Arduino-style EEPROM interface
|
||||
* with simple implementations supplied by Marlin.
|
||||
*/
|
||||
|
||||
#include "../../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(IIC_BL24CXX_EEPROM)
|
||||
|
||||
#include "../../shared/eeprom_if.h"
|
||||
#include "../../shared/eeprom_api.h"
|
||||
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM."
|
||||
#endif
|
||||
|
||||
size_t PersistentStore::capacity() {
|
||||
return MARLIN_EEPROM_SIZE - eeprom_exclude_size;
|
||||
}
|
||||
|
||||
bool PersistentStore::access_start() {
|
||||
eeprom_init();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistentStore::access_finish() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||
uint16_t written = 0;
|
||||
while (size--) {
|
||||
uint8_t v = *value;
|
||||
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
||||
// EPROM has only ~100,000 write cycles,
|
||||
// so only write bytes that have changed!
|
||||
if (v != eeprom_read_byte(p)) {
|
||||
eeprom_write_byte(p, v);
|
||||
if (++written & 0x7F) delay(4); else safe_delay(4);
|
||||
if (eeprom_read_byte(p) != v) {
|
||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
crc16(crc, &v, 1);
|
||||
pos++;
|
||||
value++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||
do {
|
||||
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
||||
if (writing) *value = c;
|
||||
crc16(crc, &c, 1);
|
||||
pos++;
|
||||
value++;
|
||||
} while (--size);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // IIC_BL24CXX_EEPROM
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Platform-independent Arduino functions for I2C EEPROM.
|
||||
* Enable USE_SHARED_EEPROM if not supplied by the framework.
|
||||
*/
|
||||
|
||||
#include "../../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(IIC_BL24CXX_EEPROM)
|
||||
|
||||
#include "../../../libs/BL24CXX.h"
|
||||
#include "../../shared/eeprom_if.h"
|
||||
|
||||
void eeprom_init() {
|
||||
BL24CXX::init();
|
||||
}
|
||||
|
||||
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
|
||||
const unsigned eeprom_address = (unsigned)pos;
|
||||
return BL24CXX::writeOneByte(eeprom_address, value);
|
||||
}
|
||||
|
||||
uint8_t eeprom_read_byte(uint8_t *pos) {
|
||||
const unsigned eeprom_address = (unsigned)pos;
|
||||
return BL24CXX::readOneByte(eeprom_address);
|
||||
}
|
||||
|
||||
#endif // IIC_BL24CXX_EEPROM
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,96 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
#include "../../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if USE_WIRED_EEPROM
|
||||
|
||||
/**
|
||||
* PersistentStore for Arduino-style EEPROM interface
|
||||
* with simple implementations supplied by Marlin.
|
||||
*/
|
||||
|
||||
#include "../../shared/eeprom_if.h"
|
||||
#include "../../shared/eeprom_api.h"
|
||||
|
||||
#ifndef MARLIN_EEPROM_SIZE
|
||||
#define MARLIN_EEPROM_SIZE size_t(E2END + 1)
|
||||
#endif
|
||||
|
||||
size_t PersistentStore::capacity() {
|
||||
return MARLIN_EEPROM_SIZE - eeprom_exclude_size;
|
||||
}
|
||||
|
||||
bool PersistentStore::access_start() {
|
||||
eeprom_init();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistentStore::access_finish() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
|
||||
uint16_t written = 0;
|
||||
while (size--) {
|
||||
uint8_t v = *value;
|
||||
uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos);
|
||||
// EEPROM has only ~100,000 write cycles,
|
||||
// so only write bytes that have changed!
|
||||
if (v != eeprom_read_byte(p)) {
|
||||
eeprom_write_byte(p, v);
|
||||
// Avoid triggering watchdog during long EEPROM writes
|
||||
if (++written & 0x7F)
|
||||
delay(2);
|
||||
else
|
||||
safe_delay(2);
|
||||
if (eeprom_read_byte(p) != v) {
|
||||
SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
crc16(crc, &v, 1);
|
||||
pos++;
|
||||
value++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
|
||||
do {
|
||||
const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos));
|
||||
if (writing)
|
||||
*value = c;
|
||||
crc16(crc, &c, 1);
|
||||
pos++;
|
||||
value++;
|
||||
} while (--size);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // USE_WIRED_EEPROM
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "../../module/endstops.h"
|
||||
|
||||
// One ISR for all EXT-Interrupts
|
||||
void endstop_ISR() { endstops.update(); }
|
||||
|
||||
void setup_endstop_interrupts() {
|
||||
#define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE)
|
||||
TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN));
|
||||
TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN));
|
||||
TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN));
|
||||
TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN));
|
||||
TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN));
|
||||
TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN));
|
||||
TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN));
|
||||
TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN));
|
||||
TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN));
|
||||
TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN));
|
||||
TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN));
|
||||
TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN));
|
||||
TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN));
|
||||
TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN));
|
||||
TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN));
|
||||
TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN));
|
||||
TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN));
|
||||
TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN));
|
||||
TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN));
|
||||
TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN));
|
||||
TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN));
|
||||
TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN));
|
||||
TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN));
|
||||
TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN));
|
||||
TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN));
|
||||
TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN));
|
||||
TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN));
|
||||
TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN));
|
||||
TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN));
|
||||
TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN));
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
|
||||
#include <PinOpsMap.hpp>
|
||||
#include <PinOps.hpp>
|
||||
#include "timers.h"
|
||||
|
||||
static uint16_t timer_frequency[TIMER_COUNT];
|
||||
|
||||
void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale, const bool invert) {
|
||||
// Calculate duty cycle based on inversion flag
|
||||
const uint16_t duty = invert ? scale - value : value;
|
||||
|
||||
// Check if the pin supports PWM
|
||||
if (PWM_PIN(pin)) {
|
||||
// Get the timer peripheral base associated with the pin
|
||||
const auto timer_base = getPinOpsPeripheralBase<TIMERPinOps, timer::TIMER_Base>(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
||||
|
||||
// Initialize the timer instance
|
||||
auto& TimerInstance = GeneralTimer::get_instance(timer_base);
|
||||
|
||||
// Get channel and previous channel mode
|
||||
const auto channel = getPackedPinChannel(getPackedPinOps(TIMER_PinOps, static_cast<pin_size_t>(pin)));
|
||||
const InputOutputMode previous = TimerInstance.getChannelMode(channel);
|
||||
|
||||
if (timer_frequency[static_cast<size_t>(timer_base)] == 0) {
|
||||
set_pwm_frequency(pin, PWM_FREQUENCY);
|
||||
}
|
||||
|
||||
// Set the PWM duty cycle
|
||||
TimerInstance.setCaptureCompare(channel, duty, CCFormat::B8);
|
||||
|
||||
// Configure pin as PWM output
|
||||
pinOpsPinout(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
||||
|
||||
// Set channel mode if not already set and start timer
|
||||
if (previous != InputOutputMode::PWM0) {
|
||||
TimerInstance.setChannelMode(channel, InputOutputMode::PWM0, static_cast<pin_size_t>(pin));
|
||||
TimerInstance.start();
|
||||
}
|
||||
} else {
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, duty < scale / 2 ? LOW : HIGH);
|
||||
}
|
||||
}
|
||||
|
||||
void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) {
|
||||
// Check if the pin supports PWM
|
||||
if (!PWM_PIN(pin)) return;
|
||||
|
||||
// Get the timer peripheral base associated with the pin
|
||||
const auto timer_base = getPinOpsPeripheralBase<TIMERPinOps, timer::TIMER_Base>(TIMER_PinOps, static_cast<pin_size_t>(pin));
|
||||
|
||||
// Guard against modifying protected timers
|
||||
#ifdef STEP_TIMER
|
||||
if (timer_base == static_cast<timer::TIMER_Base>(STEP_TIMER)) return;
|
||||
#endif
|
||||
#ifdef TEMP_TIMER
|
||||
if (timer_base == static_cast<timer::TIMER_Base>(TEMP_TIMER)) return;
|
||||
#endif
|
||||
#if defined(PULSE_TIMER) && MF_TIMER_PULSE != MF_TIMER_STEP
|
||||
if (timer_base == static_cast<timer::TIMER_Base>(PULSE_TIMER)) return;
|
||||
#endif
|
||||
|
||||
// Initialize the timer instance
|
||||
auto& TimerInstance = GeneralTimer::get_instance(timer_base);
|
||||
|
||||
TimerInstance.setRolloverValue(f_desired, TimerFormat::HERTZ);
|
||||
timer_frequency[timer_base_to_index(timer_base)] = f_desired;
|
||||
}
|
||||
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
// Fast I/O interfaces for GD32F303RE
|
||||
|
||||
#include <GPIO.hpp>
|
||||
#include <PinOps.hpp>
|
||||
#include <PinOpsMap.hpp>
|
||||
|
||||
template<typename T>
|
||||
static inline void fast_write_pin_wrapper(pin_size_t IO, T V) {
|
||||
auto port = getPortFromPin(IO);
|
||||
auto pin = getPinInPort(IO);
|
||||
if (static_cast<bool>(V)) gpio::fast_set_pin(port, pin);
|
||||
else gpio::fast_clear_pin(port, pin);
|
||||
}
|
||||
|
||||
static inline bool fast_read_pin_wrapper(pin_size_t IO) {
|
||||
return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO));
|
||||
}
|
||||
|
||||
static inline void fast_toggle_pin_wrapper(pin_size_t IO) {
|
||||
gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO));
|
||||
}
|
||||
|
||||
// ------------------------
|
||||
// Defines
|
||||
// ------------------------
|
||||
|
||||
#ifndef PWM
|
||||
#define PWM OUTPUT
|
||||
#endif
|
||||
|
||||
#define _WRITE(IO, V) fast_write_pin_wrapper(IO, V)
|
||||
#define _READ(IO) fast_read_pin_wrapper(IO)
|
||||
#define _TOGGLE(IO) fast_toggle_pin_wrapper(IO)
|
||||
|
||||
#define _GET_MODE(IO)
|
||||
#define _SET_MODE(IO, M) pinMode((IO), (M))
|
||||
#define _SET_OUTPUT(IO) pinMode((IO), OUTPUT)
|
||||
#define _SET_OUTPUT_OD(IO) pinMode((IO), OUTPUT_OPEN_DRAIN)
|
||||
|
||||
#define WRITE(IO, V) _WRITE((IO), (V))
|
||||
#define READ(IO) _READ(IO)
|
||||
#define TOGGLE(IO) _TOGGLE(IO)
|
||||
|
||||
#define OUT_WRITE(IO, V) do { _SET_OUTPUT(IO); WRITE((IO), (V)); } while (0)
|
||||
#define OUT_WRITE_OD(IO, V) do { _SET_OUTPUT_OD(IO); WRITE((IO), (V)); } while (0)
|
||||
|
||||
#define SET_INPUT(IO) _SET_MODE((IO), INPUT)
|
||||
#define SET_INPUT_PULLUP(IO) _SET_MODE((IO), INPUT_PULLUP)
|
||||
#define SET_INPUT_PULLDOWN(IO) _SET_MODE((IO), INPUT_PULLDOWN)
|
||||
#define SET_OUTPUT(IO) OUT_WRITE((IO), LOW)
|
||||
#define SET_OUTPUT_OD(IO) OUT_WRITE_OD((IO), LOW)
|
||||
#define SET_PWM(IO) _SET_MODE((IO), PWM)
|
||||
|
||||
#define IS_INPUT(IO)
|
||||
#define IS_OUTPUT(IO)
|
||||
|
||||
#define PWM_PIN(P) isPinInPinOps(TIMER_PinOps, P)
|
||||
#define NO_COMPILE_TIME_PWM
|
||||
|
||||
// Wrappers for digitalRead and digitalWrite
|
||||
#define extDigitalRead(IO) digitalRead(IO)
|
||||
#define extDigitalWrite(IO, V) digitalWrite((IO), (V))
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
|
||||
#define U8G_SW_SPI_MFL 1
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
#if ALL(HAS_MEDIA, USBD_USE_CDC_MSC)
|
||||
#define HAS_SD_HOST_DRIVE 1
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
// If no real or emulated EEPROM selected, fall back to SD emulation
|
||||
#if USE_FALLBACK_EEPROM
|
||||
#define SDCARD_EEPROM_EMULATION
|
||||
#elif ANY(I2C_EEPROM, SPI_EEPROM)
|
||||
#define USE_SHARED_EEPROM 1
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
// Test MFL GD32 specific configuration values for errors at compile-time.
|
||||
#if ENABLED(SDCARD_EEPROM_EMULATION) && !HAS_MEDIA
|
||||
#undef SDCARD_EEPROM_EMULATION // avoid additional error noise
|
||||
#if USE_FALLBACK_EEPROM
|
||||
#warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION."
|
||||
#endif
|
||||
#error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation."
|
||||
#endif
|
||||
|
||||
#if ENABLED(FLASH_EEPROM_LEVELING)
|
||||
#error "FLASH_EEPROM_LEVELING is not supported on GD32."
|
||||
#endif
|
||||
|
||||
#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED)
|
||||
#error "SERIAL_STATS_MAX_RX_QUEUED is not supported on GD32."
|
||||
#elif ENABLED(SERIAL_STATS_DROPPED_RX)
|
||||
#error "SERIAL_STATS_DROPPED_RX is not supported on GD32."
|
||||
#endif
|
||||
|
||||
#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP
|
||||
#error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on GD32"
|
||||
#endif
|
||||
|
||||
// Check for common serial pin conflicts
|
||||
#define _CHECK_SERIAL_PIN(N) (( \
|
||||
BTN_EN1 == N || BTN_EN2 == N || DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \
|
||||
SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N || \
|
||||
Y_STEP_PIN == N || Y_ENABLE_PIN == N || E0_ENABLE_PIN == N || POWER_LOSS_PIN == N \
|
||||
))
|
||||
|
||||
#define CHECK_SERIAL_PIN(T, N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN)
|
||||
|
||||
#if SERIAL_IN_USE(0)
|
||||
#if CHECK_SERIAL_PIN(TX, 0)
|
||||
#error "Serial Port 0 TX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#if CHECK_SERIAL_PIN(RX, 0)
|
||||
#error "Serial Port 0 RX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#endif
|
||||
#if SERIAL_IN_USE(1)
|
||||
#if CHECK_SERIAL_PIN(TX, 1)
|
||||
#error "Serial Port 1 TX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#if CHECK_SERIAL_PIN(RX, 1)
|
||||
#error "Serial Port 1 RX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#endif
|
||||
#if SERIAL_IN_USE(2)
|
||||
#if CHECK_SERIAL_PIN(TX, 2)
|
||||
#error "Serial Port 2 TX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#if CHECK_SERIAL_PIN(RX, 2)
|
||||
#error "Serial Port 2 RX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#endif
|
||||
#if SERIAL_IN_USE(3)
|
||||
#if CHECK_SERIAL_PIN(TX, 3)
|
||||
#error "Serial Port 3 TX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#if CHECK_SERIAL_PIN(RX, 3)
|
||||
#error "Serial Port 3 RX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#endif
|
||||
#if SERIAL_IN_USE(4)
|
||||
#if CHECK_SERIAL_PIN(TX, 4)
|
||||
#error "Serial Port 4 TX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#if CHECK_SERIAL_PIN(RX, 4)
|
||||
#error "Serial Port 4 RX IO pins conflict with another pin on the board."
|
||||
#endif
|
||||
#endif
|
||||
#undef CHECK_SERIAL_PIN
|
||||
#undef _CHECK_SERIAL_PIN
|
||||
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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
|
||||
|
||||
/**
|
||||
* Pins Debugging for GD32
|
||||
*
|
||||
* - NUMBER_PINS_TOTAL
|
||||
* - MULTI_NAME_PAD
|
||||
* - getPinByIndex(index)
|
||||
* - printPinNameByIndex(index)
|
||||
* - getPinIsDigitalByIndex(index)
|
||||
* - digitalPinToAnalogIndex(pin)
|
||||
* - getValidPinMode(pin)
|
||||
* - isValidPin(pin)
|
||||
* - isAnalogPin(pin)
|
||||
* - digitalRead_mod(pin)
|
||||
* - pwm_status(pin)
|
||||
* - printPinPWM(pin)
|
||||
* - printPinPort(pin)
|
||||
* - printPinNumber(pin)
|
||||
* - printPinAnalog(pin)
|
||||
*/
|
||||
|
||||
#include "../../inc/MarlinConfig.h"
|
||||
#include <Arduino.h>
|
||||
#include <PinOps.hpp>
|
||||
#include <Analog.h>
|
||||
|
||||
#ifndef TOTAL_PIN_COUNT
|
||||
#error "Expected TOTAL_PIN_COUNT not found."
|
||||
#endif
|
||||
|
||||
#define NUM_DIGITAL_PINS TOTAL_PIN_COUNT
|
||||
#define NUMBER_PINS_TOTAL TOTAL_PIN_COUNT
|
||||
|
||||
#define getPinByIndex(x) pin_t(pin_array[x].pin)
|
||||
#define isValidPin(P) WITHIN(P, 0, (NUM_DIGITAL_PINS - 1))
|
||||
#define digitalRead_mod(P) extDigitalRead(P)
|
||||
#define printPinNumber(P) do { sprintf_P(buffer, PSTR("%3hd "), pin_t(P)); SERIAL_ECHO(buffer); } while (0)
|
||||
#define printPinAnalog(P) do { sprintf_P(buffer, PSTR(" (A%2d) "), pin_t(getAdcChannelFromPin(P))); SERIAL_ECHO(buffer); } while (0)
|
||||
#define printPinNameByIndex(x) do { sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); } while (0)
|
||||
|
||||
#define MULTI_NAME_PAD 21 // Space needed to be pretty if not first name assigned to a pin
|
||||
|
||||
#ifndef M43_NEVER_TOUCH
|
||||
#define M43_NEVER_TOUCH(x) WITHIN(x, 9, 10) // SERIAL pins: PA9(TX) PA10(RX)
|
||||
#endif
|
||||
|
||||
bool isAnalogPin(const pin_t pin) {
|
||||
if (!isValidPin(pin)) return false;
|
||||
|
||||
if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) {
|
||||
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value();
|
||||
return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool getValidPinMode(const pin_t pin) {
|
||||
if (!isValidPin(pin)) return false;
|
||||
|
||||
auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value();
|
||||
gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin));
|
||||
|
||||
return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING &&
|
||||
mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN;
|
||||
}
|
||||
|
||||
bool getPinIsDigitalByIndex(const int16_t index) {
|
||||
const pin_t pin = getPinByIndex(index);
|
||||
return (!isAnalogPin(pin));
|
||||
}
|
||||
|
||||
int8_t digitalPinToAnalogIndex(const pin_t pin) {
|
||||
if (!isValidPin(pin) || !isAnalogPin(pin)) return -1;
|
||||
return pin; // Analog and digital pin indexes are shared
|
||||
}
|
||||
|
||||
bool pwm_status(const pin_t pin) { return false; }
|
||||
void printPinPWM(const pin_t pin) { /* TODO */ }
|
||||
void printPinPort(const pin_t pin) { /* TODO */ }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,214 @@
|
||||
//
|
||||
// MFL gd32f30x SDCARD using DMA through SDIO in C++
|
||||
//
|
||||
// Copyright (C) 2025 B. Mourit <bnmguy@gmail.com>
|
||||
//
|
||||
// This software is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU Lesser General Public License as published by the Free Software Foundation,
|
||||
// either version 3 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This software 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 Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License along with this software.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#include <SDIO.hpp>
|
||||
|
||||
namespace sdio {
|
||||
|
||||
class DMA;
|
||||
|
||||
class CardDMA {
|
||||
public:
|
||||
static CardDMA& get_instance();
|
||||
|
||||
SDIO_Error_Type init();
|
||||
SDIO_Error_Type card_init();
|
||||
SDIO_Error_Type begin_startup_procedure();
|
||||
void begin_shutdown_procedure();
|
||||
// Configuration
|
||||
SDIO_Error_Type set_hardware_bus_width(Bus_Width width);
|
||||
// Main read/write functions for single and multiblock transfers
|
||||
SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count);
|
||||
SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count);
|
||||
// DMA transfers
|
||||
// Other card functions
|
||||
SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end);
|
||||
// Interrupt handler
|
||||
void handle_interrupts();
|
||||
// Card select
|
||||
SDIO_Error_Type select_deselect();
|
||||
|
||||
SDIO_Error_Type get_card_interface_status(uint32_t* status);
|
||||
SDIO_Error_Type get_sdcard_status(uint32_t* status);
|
||||
|
||||
void check_dma_complete();
|
||||
SDIO_Error_Type stop_transfer();
|
||||
|
||||
Transfer_State get_transfer_state();
|
||||
uint32_t get_card_capacity() const;
|
||||
|
||||
SDIO_Error_Type send_bus_width_command(uint32_t width_value);
|
||||
|
||||
SDIO_Error_Type get_card_specific_data(Card_Info* info);
|
||||
constexpr Block_Size get_data_block_size_index(uint16_t size);
|
||||
|
||||
SDIO_Error_Type get_card_state(Card_State* card_state);
|
||||
SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false);
|
||||
|
||||
// DMA configuration
|
||||
void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write);
|
||||
|
||||
// SDIO configuration
|
||||
void sdio_configure(const SDIO_Config config) { sdio_.init(config); }
|
||||
|
||||
// Varaible stored parameters
|
||||
SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr);
|
||||
SDIO_Error_Type store_cid();
|
||||
SDIO_Error_Type store_csd();
|
||||
|
||||
// Accessor methods
|
||||
SDIO_Config& get_config() { return config_; }
|
||||
dma::DMA& get_dma_instance() { return dma_; }
|
||||
void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); }
|
||||
void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); }
|
||||
bool get_is_sdio_rx() { return is_rx_; }
|
||||
void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); }
|
||||
void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); }
|
||||
void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); }
|
||||
Operational_State get_state() { return current_state_; }
|
||||
void set_state(Operational_State state) { current_state_ = state; }
|
||||
void set_transfer_end(bool value) { transfer_end_ = value; }
|
||||
void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; }
|
||||
|
||||
inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) {
|
||||
sdio_.init({
|
||||
desired_clock,
|
||||
Clock_Edge::RISING_EDGE,
|
||||
wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT,
|
||||
false,
|
||||
low_power,
|
||||
false
|
||||
});
|
||||
sync_domains();
|
||||
desired_clock_ = desired_clock;
|
||||
|
||||
return SDIO_Error_Type::OK;
|
||||
}
|
||||
|
||||
private:
|
||||
CardDMA();
|
||||
|
||||
// Prevent copying or assigning
|
||||
CardDMA(const CardDMA&) = delete;
|
||||
CardDMA& operator=(const CardDMA&) = delete;
|
||||
|
||||
// Helper function
|
||||
SDIO_Error_Type wait_for_card_ready();
|
||||
|
||||
// Member variables
|
||||
alignas(4) uint32_t sdcard_csd_[4];
|
||||
alignas(4) uint32_t sdcard_cid_[4];
|
||||
alignas(4) uint32_t sdcard_scr_[2];
|
||||
uint32_t desired_clock_;
|
||||
uint32_t stop_condition_;
|
||||
uint32_t total_bytes_;
|
||||
uint32_t count_;
|
||||
SDIO& sdio_;
|
||||
SDIO_Config& config_;
|
||||
const dma::DMA_Base dmaBase_;
|
||||
const dma::DMA_Channel dmaChannel_;
|
||||
dma::DMA& dma_;
|
||||
uint16_t sdcard_rca_;
|
||||
SDIO_Error_Type transfer_error_;
|
||||
Interface_Version interface_version_;
|
||||
Card_Type card_type_;
|
||||
volatile bool transfer_end_;
|
||||
volatile bool is_rx_;
|
||||
volatile bool multiblock_;
|
||||
volatile Operational_State current_state_;
|
||||
|
||||
// Private helper methods
|
||||
SDIO_Error_Type validate_voltage();
|
||||
SDIO_Error_Type get_r1_result(Command_Index index);
|
||||
//SDIO_Error_Type get_r2_r3_result();
|
||||
SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca);
|
||||
SDIO_Error_Type get_r7_result();
|
||||
//SDIO_Error_Type get_r1_error_type(uint32_t response);
|
||||
SDIO_Error_Type get_command_sent_result();
|
||||
|
||||
inline void sync_domains() {
|
||||
delayMicroseconds(8);
|
||||
}
|
||||
|
||||
inline bool validate_transfer_params(uint32_t* buf, uint16_t size) {
|
||||
if (buf == nullptr) return false;
|
||||
// Size must be > 0, <= 2048 and power of 2
|
||||
if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
||||
info->csd.device_size = (static_cast<uint32_t>(csd_bytes[6] & 0x03U) << 10U) |
|
||||
(static_cast<uint32_t>(csd_bytes[7]) << 2U) |
|
||||
(static_cast<uint32_t>((csd_bytes[8] & 0xC0U) >> 6U));
|
||||
info->csd.device_size_multiplier = static_cast<uint8_t>((csd_bytes[9] & 0x03U) << 1U |
|
||||
(csd_bytes[10] & 0x80U) >> 7U);
|
||||
|
||||
info->block_size = static_cast<uint32_t>(1 << info->csd.read_block_length);
|
||||
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) *
|
||||
(1U << (info->csd.device_size_multiplier + 2U)) *
|
||||
info->block_size);
|
||||
}
|
||||
|
||||
void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
||||
info->csd.device_size = static_cast<uint32_t>((csd_bytes[7] & 0x3FU) << 16U) |
|
||||
static_cast<uint32_t>((csd_bytes[8]) << 8U) |
|
||||
static_cast<uint32_t>(csd_bytes[9]);
|
||||
|
||||
info->block_size = BLOCK_SIZE;
|
||||
info->capacity = static_cast<uint32_t>((info->csd.device_size + 1U) *
|
||||
BLOCK_SIZE * KILOBYTE);
|
||||
}
|
||||
|
||||
void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) {
|
||||
info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1U) |
|
||||
(csd_bytes[10] & 0x80U) >> 7U);
|
||||
info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2U);
|
||||
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x03U) << 2U) |
|
||||
((csd_bytes[12] & 0xC0U) >> 6U));
|
||||
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1U);
|
||||
}
|
||||
|
||||
inline void disable_all_interrupts() {
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::TFHIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::RFHIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, false);
|
||||
sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, false);
|
||||
}
|
||||
|
||||
template <typename CheckFunc>
|
||||
inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument,
|
||||
Command_Response response, Wait_Type type, CheckFunc check_result) {
|
||||
sdio_.set_command_state_machine(command, argument, response, type);
|
||||
sync_domains();
|
||||
sdio_.set_command_state_machine_enable(true);
|
||||
return check_result();
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace sdio
|
||||
|
||||
extern sdio::CardDMA& CardDMA_I;
|
||||
@@ -0,0 +1,231 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../../platforms.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_MFL
|
||||
|
||||
#include "../../../inc/MarlinConfig.h"
|
||||
|
||||
#if ENABLED(ONBOARD_SDIO)
|
||||
|
||||
#include <PinOpsMap.hpp>
|
||||
#include <PinOps.hpp>
|
||||
#include "SDCard.h"
|
||||
#include "sdio.h"
|
||||
|
||||
using namespace sdio;
|
||||
|
||||
#define TARGET_CLOCK 6000000U
|
||||
#define BLOCK_SIZE 512U
|
||||
#define CARD_TIMEOUT 500 // ms
|
||||
#define READ_RETRIES 3U
|
||||
|
||||
inline constexpr uint32_t TARGET_SDIO_CLOCK = TARGET_CLOCK;
|
||||
inline constexpr uint32_t SDIO_BLOCK_SIZE = BLOCK_SIZE;
|
||||
inline constexpr uint32_t SD_TIMEOUT = CARD_TIMEOUT;
|
||||
inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES;
|
||||
|
||||
Card_State cardState = Card_State::READY;
|
||||
|
||||
bool SDIO_SetBusWidth(Bus_Width width) {
|
||||
return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK);
|
||||
}
|
||||
|
||||
void mfl_sdio_init() {
|
||||
pinOpsPinout(SD_CMD_PinOps, static_cast<pin_size_t>(SDIO_CMD_PIN));
|
||||
pinOpsPinout(SD_CK_PinOps, static_cast<pin_size_t>(SDIO_CK_PIN));
|
||||
pinOpsPinout(SD_DATA0_PinOps, static_cast<pin_size_t>(SDIO_D0_PIN));
|
||||
pinOpsPinout(SD_DATA1_PinOps, static_cast<pin_size_t>(SDIO_D1_PIN));
|
||||
pinOpsPinout(SD_DATA2_PinOps, static_cast<pin_size_t>(SDIO_D2_PIN));
|
||||
pinOpsPinout(SD_DATA3_PinOps, static_cast<pin_size_t>(SDIO_D3_PIN));
|
||||
|
||||
NVIC_EnableIRQ(DMA1_Channel3_4_IRQn);
|
||||
NVIC_EnableIRQ(SDIO_IRQn);
|
||||
}
|
||||
|
||||
bool SDIO_Init() {
|
||||
SDIO_Error_Type result = SDIO_Error_Type::OK;
|
||||
uint8_t retryCount = SDIO_READ_RETRIES;
|
||||
|
||||
mfl_sdio_init();
|
||||
|
||||
uint8_t retries = retryCount;
|
||||
for (;;) {
|
||||
hal.watchdog_refresh();
|
||||
result = CardDMA_I.init();
|
||||
if (result == SDIO_Error_Type::OK) break;
|
||||
if (!--retries) return false;
|
||||
}
|
||||
|
||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, false);
|
||||
|
||||
retries = retryCount;
|
||||
for (;;) {
|
||||
hal.watchdog_refresh();
|
||||
if (SDIO_SetBusWidth(Bus_Width::WIDTH_4BIT)) break;
|
||||
if (!--retries) break;
|
||||
}
|
||||
|
||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, true, true);
|
||||
|
||||
// Fallback
|
||||
if (!retries) {
|
||||
mfl_sdio_init();
|
||||
retries = retryCount;
|
||||
for (;;) {
|
||||
hal.watchdog_refresh();
|
||||
result = CardDMA_I.init();
|
||||
if (result == SDIO_Error_Type::OK) break;
|
||||
if (!--retries) return false;
|
||||
}
|
||||
CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t* src, uint8_t* dst) {
|
||||
hal.watchdog_refresh();
|
||||
SDIO_Error_Type result = SDIO_Error_Type::OK;
|
||||
|
||||
// Write
|
||||
if (src) {
|
||||
result = CardDMA_I.write(reinterpret_cast<uint8_t*>(const_cast<uint8_t*>(src)), block, 1);
|
||||
}
|
||||
// Read
|
||||
else {
|
||||
result = CardDMA_I.read(dst, block, 1);
|
||||
}
|
||||
|
||||
if (result != SDIO_Error_Type::OK) {
|
||||
return false;
|
||||
}
|
||||
|
||||
millis_t timeout = millis() + SD_TIMEOUT;
|
||||
while (CardDMA_I.get_state() != sdio::Operational_State::READY) {
|
||||
if (ELAPSED(millis(), timeout)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
CardDMA_I.check_dma_complete();
|
||||
|
||||
timeout = millis() + SD_TIMEOUT;
|
||||
do {
|
||||
result = CardDMA_I.get_card_state(&cardState);
|
||||
if (ELAPSED(millis(), timeout)) {
|
||||
return false;
|
||||
}
|
||||
} while (result == SDIO_Error_Type::OK && cardState != sdio::Card_State::TRANSFER);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SDIO_ReadBlock(uint32_t block, uint8_t* dst) {
|
||||
// Check if the address is aligned to 4 bytes
|
||||
if (reinterpret_cast<uint32_t>(dst) & 0x03) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t retries = SDIO_READ_RETRIES;
|
||||
while (retries--) {
|
||||
if (SDIO_ReadWriteBlock_DMA(block, nullptr, dst)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SDIO_WriteBlock(uint32_t block, const uint8_t* src) {
|
||||
// Check if the address is aligned to 4 bytes
|
||||
if (reinterpret_cast<uint32_t>(src) & 0x03) {
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t retries = SDIO_READ_RETRIES;
|
||||
while (retries--) {
|
||||
if (SDIO_ReadWriteBlock_DMA(block, src, nullptr)) {
|
||||
return true;
|
||||
delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SDIO_IsReady() {
|
||||
return (CardDMA_I.get_state() == sdio::Operational_State::READY);
|
||||
}
|
||||
|
||||
uint32_t SDIO_GetCardSize() {
|
||||
return CardDMA_I.get_card_capacity();
|
||||
}
|
||||
|
||||
// DMA interrupt handler
|
||||
void DMA1_IRQHandler() {
|
||||
auto& dma_instance = CardDMA_I.get_dma_instance();
|
||||
bool is_receive = CardDMA_I.get_is_sdio_rx();
|
||||
|
||||
// Check for Transfer Complete Interrupt
|
||||
if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF)) {
|
||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false);
|
||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false);
|
||||
dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF);
|
||||
if (is_receive) {
|
||||
CardDMA_I.set_sdio_dma_enable(false);
|
||||
CardDMA_I.clear_sdio_data_flags();
|
||||
CardDMA_I.set_state(sdio::Operational_State::READY);
|
||||
} else {
|
||||
CardDMA_I.set_data_end_interrupt();
|
||||
}
|
||||
// Signal that transfer is complete
|
||||
CardDMA_I.set_transfer_end(true);
|
||||
}
|
||||
|
||||
else if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_ERRIF)) {
|
||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_HTFIE, false);
|
||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false);
|
||||
dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false);
|
||||
// Clear all flags
|
||||
dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_GIF);
|
||||
// Signal that an error occurred
|
||||
CardDMA_I.set_transfer_error(SDIO_Error_Type::ERROR);
|
||||
CardDMA_I.set_state(sdio::Operational_State::READY);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void SDIO_IRQHandler(void) {
|
||||
CardDMA_I.handle_interrupts();
|
||||
}
|
||||
|
||||
void DMA1_Channel3_4_IRQHandler(void) {
|
||||
DMA1_IRQHandler();
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
#endif // ONBOARD_SDIO
|
||||
#endif // ARDUINO_ARCH_MFL
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <SDIO.hpp>
|
||||
#include <DMA.hpp>
|
||||
|
||||
#define SDIO_D0_PIN PC8
|
||||
#define SDIO_D1_PIN PC9
|
||||
#define SDIO_D2_PIN PC10
|
||||
#define SDIO_D3_PIN PC11
|
||||
#define SDIO_CK_PIN PC12
|
||||
#define SDIO_CMD_PIN PD2
|
||||
|
||||
void sdio_mfl_init();
|
||||
bool SDIO_SetBusWidth(sdio::Bus_Width width);
|
||||
void DMA1_IRQHandler(dma::DMA_Channel channel);
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user