Compare commits
1047 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d2a0d2c43a | |||
| ed66cebb33 | |||
| e915349bc7 | |||
| 02c3bf0302 | |||
| 6537174e1c | |||
| 95cbcdc655 | |||
| 76283bf616 | |||
| 0e5da486a8 | |||
| 6999985333 | |||
| 4d0dc3518c | |||
| d9acf9f01f | |||
| 5eae93e4ab | |||
| c73245a3d9 | |||
| 7a226ad73b | |||
| 9139c1bd0d | |||
| 7cc8b157c0 | |||
| 48b7279b9d | |||
| 33735ffe01 | |||
| 12f0fa1a57 | |||
| b869afd4b2 | |||
| a6ebfe14cc | |||
| 71d5661fe4 | |||
| cf347df937 | |||
| 10967373aa | |||
| b553c0e62a | |||
| da7cfd1551 | |||
| ca1dc3e81e | |||
| 07b95a3c1b | |||
| 63ca8f0a42 | |||
| 9fc25dfe29 | |||
| fcf9f67f5f | |||
| 4d41e46481 | |||
| 58405e3901 | |||
| b7a1abfa2d | |||
| 3ec17b3bdc | |||
| f6eee956a5 | |||
| 55070498db | |||
| 55b5971739 | |||
| fed6eb36c7 | |||
| 2a1b3fd181 | |||
| a74237306f | |||
| c50c71a33c | |||
| ab9e452d40 | |||
| 59bcaca96b | |||
| f8cc1a0b4b | |||
| ba9606694d | |||
| 0aded84207 | |||
| 097fc30201 | |||
| 5b71e64a77 | |||
| eba2e7b669 | |||
| 0e4d82b680 | |||
| bdc57af40c | |||
| 544f9e6104 | |||
| e524a98418 | |||
| 4eea9e5d7b | |||
| 12ee7e45f1 | |||
| 8da0d0871c | |||
| 7f51e49b08 | |||
| 20d035d78c | |||
| f9d6093051 | |||
| 6561ecfcf5 | |||
| a6a5be0ad4 | |||
| 643704e318 | |||
| 488bd82db0 | |||
| 3f98310004 | |||
| 6179563e0b | |||
| d92f2e2f20 | |||
| 8add6b12f5 | |||
| 18b5301c0d | |||
| 3f4b22fef5 | |||
| e4eb1b5943 | |||
| 3ac92f243c | |||
| 384ce42a45 | |||
| 05af2a49ed | |||
| c8207fbc15 | |||
| b1fe363f2f | |||
| 16913e0163 | |||
| 91a91562c2 | |||
| 2e456cea8f | |||
| 981f54a78e | |||
| a68f7a0426 | |||
| 99768cffbe | |||
| ae6c9c154c | |||
| 5ba219a1d0 | |||
| 3ac64db2ae | |||
| fc641d39b6 | |||
| 7c29cdb685 | |||
| 367e2219e3 | |||
| 1f4445a096 | |||
| ae5ae96e62 | |||
| 803b78f196 | |||
| dc5fabe3a9 | |||
| 1692996979 | |||
| 3791ca788b | |||
| 4ba13912b7 | |||
| 2aa4baa5f8 | |||
| 834241dfb5 | |||
| d897251c17 | |||
| e0f73f51ee | |||
| a73b08eba5 | |||
| 2048e8b173 | |||
| c1e01eee35 | |||
| 3bf6b3dee9 | |||
| 6ec2a395e1 | |||
| 468ad6f79e | |||
| a5a6732508 | |||
| 1e457650f3 | |||
| 75f0939b44 | |||
| 33cd1e0767 | |||
| 561c409d59 | |||
| 606b6fe64f | |||
| 4447c3e445 | |||
| e966b83bb2 | |||
| ffa5adb077 | |||
| f2532ec07a | |||
| bc97723e02 | |||
| 65b62a900f | |||
| e61469f8c1 | |||
| 4489832bf3 | |||
| 868843fc89 | |||
| 5cb9474a7d | |||
| 777bc842de | |||
| 04416f8cc3 | |||
| d9ed6f0e5f | |||
| c45354a38c | |||
| 3ac9068e0e | |||
| 4fccfa14e9 | |||
| d22e61a12c | |||
| a595c48526 | |||
| 0ca11bc2f0 | |||
| c346b07b91 | |||
| 8d54de83d3 | |||
| 6d416b34f6 | |||
| aa889ad8d4 | |||
| e08f8498d2 | |||
| f8c6ba224f | |||
| cc3269a50b | |||
| b28ad90d0e | |||
| c81e74b478 | |||
| 574332c3d3 | |||
| e561058051 | |||
| a47f53b8a6 | |||
| 1a2bb68f85 | |||
| fc519143fe | |||
| 5a9ce77ab3 | |||
| 47fed759b6 | |||
| 07565d9016 | |||
| b73ebafa0f | |||
| 3e6a0ab713 | |||
| ec752068a5 | |||
| 54dfe6237c | |||
| c39f32c542 | |||
| 53c27cdd66 | |||
| 3ba633a9e2 | |||
| 6cf98d0f82 | |||
| 9aade7f5df | |||
| 0952a372b6 | |||
| 44948ebc1f | |||
| 1b194088e1 | |||
| f74713da0c | |||
| 575136a82a | |||
| bcece89ad0 | |||
| 02e1199d51 | |||
| 6f653f5993 | |||
| 89379cd373 | |||
| b99f5c3618 | |||
| e434fd0aef | |||
| 7816f5dc46 | |||
| f2ac2e7cad | |||
| 4cd972c3bb | |||
| 9eb82d8894 | |||
| a889336b25 | |||
| 9c29c634b7 | |||
| 6b18b1bb8a | |||
| 0e5a4cacf8 | |||
| 2cee78634c | |||
| 19d7cd1a16 | |||
| d56fbe21fc | |||
| d14b8e4435 | |||
| ef2fbcd2b6 | |||
| 3551a2613d | |||
| 1acaa6dc15 | |||
| f139ffed75 | |||
| 98875d424f | |||
| a995cbef50 | |||
| 5f9205ef8f | |||
| 54f26e61dc | |||
| e42059f34a | |||
| e819ba832e | |||
| d23ac65dd4 | |||
| 938d3db36f | |||
| 4cb827b51e | |||
| 92da094c9f | |||
| 09e943a10c | |||
| a6d8c6d5b0 | |||
| 3ee18bc667 | |||
| 291a90ace4 | |||
| dd02b5ff0a | |||
| 14bed5aee8 | |||
| 0265975178 | |||
| 61a1c05d3a | |||
| bfe9885603 | |||
| 333608a692 | |||
| e99d801e6b | |||
| 0ac1435a8c | |||
| 584abc5835 | |||
| 73fa80f128 | |||
| 7fcc605595 | |||
| 35319049fe | |||
| 544cde20fb | |||
| 084b065f46 | |||
| ec8a6fc7e2 | |||
| 3d7f84dbb6 | |||
| 7b70e39ff6 | |||
| 58bce3781e | |||
| 578ee04243 | |||
| d061e6dbd6 | |||
| 12ac094992 | |||
| ac0fc603ae | |||
| e3ef8d2089 | |||
| b9f0c68e3c | |||
| 64182d60aa | |||
| 3e4344ad7a | |||
| efb58a9a0d | |||
| 2700af52c8 | |||
| c420a0b96a | |||
| 1832500eca | |||
| 5bbf953711 | |||
| 1f38b509e1 | |||
| 38d9b97bbd | |||
| c1908c865e | |||
| ba34902610 | |||
| e35bedab48 | |||
| 50297c65d4 | |||
| fe1d6f93e2 | |||
| 46ee5b0a08 | |||
| 9da6b580d9 | |||
| ccc69582ef | |||
| 8dee0c1281 | |||
| 06c6c479dd | |||
| 402aab968c | |||
| 85b82e3ab6 | |||
| 543af426ef | |||
| 646f4c7d69 | |||
| 9788a35107 | |||
| 2774ee8290 | |||
| 4f39b9c09d | |||
| e98d36555b | |||
| e81433f46f | |||
| cf0e921f3e | |||
| 0c98019093 | |||
| ba27dce42d | |||
| 7e5ac3f38f | |||
| e6a615d882 | |||
| 9d55440d38 | |||
| c7e6b7924a | |||
| c6f4bc1aa1 | |||
| 98c72a3b65 | |||
| ef8873d6ef | |||
| eb2b8a1ddb | |||
| a1a9904d32 | |||
| 1f3309ac06 | |||
| b9e89a5378 | |||
| e2250ce037 | |||
| f872750b70 | |||
| c9488b4f63 | |||
| 8cd9c06084 | |||
| 1c6b723ee6 | |||
| 0f044f76ec | |||
| 8342a5a83e | |||
| e3fa27ac9f | |||
| 3293b2780e | |||
| ebf9aa5c82 | |||
| 54fe84ea32 | |||
| b0f6155d99 | |||
| ba8b685ede | |||
| 579545177d | |||
| 10009b018d | |||
| 689c7b83e1 | |||
| 9393c1ed1b | |||
| 5e3f61cc7c | |||
| 80a1c129f1 | |||
| cda684b6fd | |||
| 629d262ed3 | |||
| a420e3c155 | |||
| 88a4e55945 | |||
| 27dcfe0ea8 | |||
| cf609152c2 | |||
| 6e01ba3ce8 | |||
| cf9f205030 | |||
| df12f6d723 | |||
| 21499f1c74 | |||
| 59cee1cb87 | |||
| e53f2a3d82 | |||
| 412513be43 | |||
| f946b60670 | |||
| 90363cefd0 | |||
| 07630e6559 | |||
| 5b34686dda | |||
| 667aa15b87 | |||
| f48aa53d7c | |||
| dd3c3d09f2 | |||
| d1f2b2d27b | |||
| 2073b67e45 | |||
| e176df1e6d | |||
| f6dbb59748 | |||
| 39697628e7 | |||
| e9c5b99722 | |||
| 8e9e039672 | |||
| ce7edc6223 | |||
| 924c2ca0fe | |||
| e0f0a9491d | |||
| 8547f4f5b9 | |||
| ac5836a2a2 | |||
| 6b14b948a9 | |||
| 1774dbd539 | |||
| e9810691ec | |||
| 29ad078fda | |||
| 0c4beea9be | |||
| 79bd65be35 | |||
| 150425e480 | |||
| 61cc3cdf09 | |||
| 252085f462 | |||
| 1ead60ec46 | |||
| 5a0923ed28 | |||
| 40beddeaa3 | |||
| 05a64e2013 | |||
| 3fc45df62f | |||
| 9c3d74f6d1 | |||
| bdfb0cc63f | |||
| 8bf127afe6 | |||
| 33ad711ee8 | |||
| 20e99497dd | |||
| baa20d9ea2 | |||
| 367bcedea7 | |||
| 5d59779a80 | |||
| 1c19cfcbc7 | |||
| 14a83342e1 | |||
| f11f42a23e | |||
| 4bfbe70d66 | |||
| 93394f1ff5 | |||
| fa4b73ee04 | |||
| 5249d10369 | |||
| 89a43a8b1a | |||
| db279967da | |||
| 41c860dce1 | |||
| bfb5430217 | |||
| e1e13ad72c | |||
| c941ce1a5b | |||
| 7c760bd232 | |||
| 42dc89ad32 | |||
| 3a9394c308 | |||
| 97b5c2d3ea | |||
| f635a9d0c3 | |||
| d7550018e3 | |||
| 6918959c07 | |||
| 908d30d4ce | |||
| 49b11f9490 | |||
| d09bf9d088 | |||
| 47727cf0ae | |||
| 51ce1a147d | |||
| 0f6f125724 | |||
| 52a4954b8a | |||
| 4cab99e1d1 | |||
| 2c57b184da | |||
| 14b5d5ba84 | |||
| 5bd28cd840 | |||
| fbc2c76870 | |||
| 4349f4ab0c | |||
| 9eea88bbfc | |||
| 3a77a7eefd | |||
| 788e86ccc6 | |||
| 27da1995f3 | |||
| e3a5319e3c | |||
| e4bc675fbf | |||
| 898dd19175 | |||
| 1b307f7c99 | |||
| d5977e7e2d | |||
| 7aaaaec355 | |||
| 8acd39c494 | |||
| cfac549240 | |||
| 0279f9cf09 | |||
| 37b5b49cce | |||
| 1a5550f643 | |||
| a3929b435b | |||
| 7e6e25929b | |||
| f2b2389b8f | |||
| 9012b9a993 | |||
| fde861ab8c | |||
| 9f0fa5a040 | |||
| fb95e66652 | |||
| c44b9c1c28 | |||
| 3753cb9a94 | |||
| 81d8663f1f | |||
| 2860d048e6 | |||
| cc20b30775 | |||
| 21f0333b43 | |||
| 70d910ac8e | |||
| 23e7905b20 | |||
| 5e1a1fffcf | |||
| e48dd40b53 | |||
| 4ddf626d46 | |||
| 991fc9cf63 | |||
| ef3e9134dc | |||
| 35da223f0a | |||
| 0937fe55a4 | |||
| de98df1651 | |||
| d7156decdc | |||
| e43c2752c7 | |||
| bdf8b0703a | |||
| a506701a8b | |||
| b60838508b | |||
| 0f76f17f16 | |||
| c00415b017 | |||
| 3b149c3505 | |||
| d20d1f8712 | |||
| c626e3efb2 | |||
| 1cea29598c | |||
| cb0706f9cc | |||
| dadbedc4fd | |||
| 3165beeba0 | |||
| 1c9b1240ec | |||
| 122dfa13a2 | |||
| b32a818f37 | |||
| d8b83160ab | |||
| 98d79fb8bb | |||
| eaefa299fb | |||
| ba840750a0 | |||
| cdc960fd1d | |||
| c0a544d385 | |||
| 84b22fcc1d | |||
| c6cd10a92d | |||
| d08a7d4fd2 | |||
| 0ee1c1e4e1 | |||
| dc9e57464f | |||
| 657929740f | |||
| 6e74409c14 | |||
| 5af8425776 | |||
| 0ca860b292 | |||
| 4dd5b713eb | |||
| 0628573fc3 | |||
| 52cc705e60 | |||
| 2f987accaa | |||
| 66aa848b2f | |||
| 6f3de26a4d | |||
| b723e3fd02 | |||
| 7e4c6db12d | |||
| e228a222a3 | |||
| fdac56da15 | |||
| 7e62b60c94 | |||
| b6b0fccd5f | |||
| f2f6b6bd85 | |||
| 6ff18a942c | |||
| 25a2a89517 | |||
| 5917aa73b5 | |||
| d0dc3b619f | |||
| d628d7de44 | |||
| 8fe6bc6745 | |||
| dcbcbb54f9 | |||
| 41f9eec4df | |||
| 33e942514b | |||
| 2aa9f70f5e | |||
| 8aac26275e | |||
| 294903439a | |||
| daa68d560e | |||
| 4ce809380b | |||
| a614352fcf | |||
| a54daeeb39 | |||
| fc4abd1335 | |||
| 881ee69f34 | |||
| 5a8b9d649a | |||
| e80d8e9dcf | |||
| 950d141958 | |||
| 52ea53a3dd | |||
| 7526309ccf | |||
| 4342a0f512 | |||
| 4bca73dc5a | |||
| 67dc3e432f | |||
| 349c3a7243 | |||
| 1bee2dab60 | |||
| 1e51ff1306 | |||
| aa0558eb3a | |||
| 0878147f31 | |||
| 7086ca632f | |||
| 93783e993b | |||
| ab69f87989 | |||
| b0c0074092 | |||
| 2110215a16 | |||
| 50d847a2fe | |||
| 61c57825d7 | |||
| f81ca65a16 | |||
| a020a09903 | |||
| 6361146f0f | |||
| 4fb984e960 | |||
| 081458a3c8 | |||
| 02fe1ff95e | |||
| beb3a0fc4b | |||
| 71834e204b | |||
| 9417af14e9 | |||
| 84448a78be | |||
| 1244a21a21 | |||
| eff0de499f | |||
| de1b97a0ce | |||
| 624f429086 | |||
| 0303a1bfb0 | |||
| 573c21e690 | |||
| 80b8e66189 | |||
| 8ec9c37940 | |||
| 2e8833e315 | |||
| c403381172 | |||
| 02e5225e10 | |||
| 28839c60da | |||
| e7ac0d14cd | |||
| 9a23bcec0b | |||
| 6b9ec417b6 | |||
| 66474f6a13 | |||
| 4f0329bb43 | |||
| dc6f23e435 | |||
| c7fc6eeb1e | |||
| 72c0437b48 | |||
| a6377e5215 | |||
| 0459407a8e | |||
| 685ccf3fdf | |||
| de219dcd63 | |||
| cdc996dd68 | |||
| fe6eb1745f | |||
| 533d752707 | |||
| 037b0096e2 | |||
| eefd63e408 | |||
| 5e410e35ab | |||
| 62bb61b3d9 | |||
| a7f12169b9 | |||
| 29ceba972c | |||
| 7965e066c7 | |||
| f499735280 | |||
| 1e03f696f5 | |||
| 7ac308fe4d | |||
| 54a7ce999f | |||
| 89416a583c | |||
| 9ad9323aac | |||
| cf7f5bcdee | |||
| 950f492ce7 | |||
| 1bb1603886 | |||
| 68dc89cf75 | |||
| c2d586cf5f | |||
| fbce327402 | |||
| c09638f821 | |||
| 348099dabb | |||
| fbee2a2ff7 | |||
| 781d9c470e | |||
| 5a5354107b | |||
| 127bc94891 | |||
| fca60335e1 | |||
| 27621290b8 | |||
| 951b8be3a1 | |||
| f1bb46f5b8 | |||
| 3bb9364c44 | |||
| 7df503de93 | |||
| 098e0961dc | |||
| 6ea4a16212 | |||
| 9f6cafbae3 | |||
| 8c6e9526b0 | |||
| cc05123a80 | |||
| 823014868c | |||
| 7c30124f80 | |||
| 3ddf728333 | |||
| 9dbce712fc | |||
| b59251c388 | |||
| c377237fd8 | |||
| a2452a577b | |||
| a6bfdf351f | |||
| e8f2430dac | |||
| 8f19e2d7d4 | |||
| a270cc36e6 | |||
| fa25737a9f | |||
| 38eee76839 | |||
| 5b59424447 | |||
| c20c6b61f1 | |||
| d0e8edad3c | |||
| 88d368ad9d | |||
| 843f79589c | |||
| 3494482cb0 | |||
| 3572fd75b5 | |||
| ebecd76492 | |||
| 3f3c8257f7 | |||
| e9ae5208cb | |||
| fde0eaf1e7 | |||
| 122c4116f2 | |||
| 21559b0c59 | |||
| 0916d32589 | |||
| af7b126edc | |||
| bc990ccca6 | |||
| c7bcbf944e | |||
| 7f9eb688ad | |||
| dbd60fb38e | |||
| 6a871b2879 | |||
| bd9d7a3c4d | |||
| 2976bb48ed | |||
| 4f93f31af0 | |||
| d76c8c1fbd | |||
| 86c564121e | |||
| db137df6df | |||
| 202ec4b58f | |||
| 1258657b8d | |||
| f49e730b23 | |||
| aa02bb05d3 | |||
| e7662920a6 | |||
| 9c9ed690f7 | |||
| a4382b4dcd | |||
| d5723fcafd | |||
| af553d5fbd | |||
| 3cd945ab5d | |||
| ade6dbf01e | |||
| 88a8e2127d | |||
| fe747ae4bf | |||
| bd4900d6cd | |||
| 8643fa0afb | |||
| 487542083b | |||
| b79f7f203a | |||
| 0927e49756 | |||
| fbea4c6048 | |||
| 4a0b3d1c9b | |||
| 8e0f271f55 | |||
| 8f13c1ecb2 | |||
| 10ecea62c1 | |||
| 7a841cd8cf | |||
| c8265d61d5 | |||
| eaa836b6fc | |||
| 5a88a80690 | |||
| 12fdde24d8 | |||
| 4de6d655ac | |||
| b12028f4dd | |||
| 54c1a1df4e | |||
| fad7bc66e9 | |||
| 6cda10de0f | |||
| b22df8b189 | |||
| 94e2558e6c | |||
| fd117480d2 | |||
| 72f3a4ac31 | |||
| aa7af2e2ea | |||
| a4d254ee62 | |||
| 222efe1382 | |||
| d806175a80 | |||
| 5266ffb922 | |||
| b7a1681d38 | |||
| 3a3c3b8a22 | |||
| 67948ad6c6 | |||
| e2583b4f85 | |||
| c9e7d6f55c | |||
| 735cd9a092 | |||
| 555b080d85 | |||
| 44ef6e2b70 | |||
| 9bbbcd439b | |||
| cbe8a6867c | |||
| 1f31027fd2 | |||
| 4e1e7fa1b0 | |||
| 414951e42c | |||
| a8d18a0554 | |||
| b9ffe93d1f | |||
| 0c72dc376c | |||
| 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 | |||
| 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 | |||
| 7d40f2b29d | |||
| a701b9bc60 | |||
| a349550924 |
@@ -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/
|
||||||
@@ -38,14 +38,14 @@
|
|||||||
"platformio.platformio-ide",
|
"platformio.platformio-ide",
|
||||||
"marlinfirmware.auto-build",
|
"marlinfirmware.auto-build",
|
||||||
"editorconfig.editorconfig"
|
"editorconfig.editorconfig"
|
||||||
],
|
]
|
||||||
|
|
||||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
// "forwardPorts": [],
|
// , "forwardPorts": []
|
||||||
|
|
||||||
// Use 'postCreateCommand' to run commands after the container is created.
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
// "postCreateCommand": "pip3 install --user -r requirements.txt",
|
// , "postCreateCommand": "pip3 install --user -r requirements.txt"
|
||||||
|
|
||||||
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
// Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
// "remoteUser": "vscode"
|
// , "remoteUser": "vscode"
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-10
@@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo
|
|||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment include:
|
Examples of behavior that contributes to creating a positive environment include:
|
||||||
|
|
||||||
* Using welcoming and inclusive language
|
- Using welcoming and inclusive language
|
||||||
* Being respectful of differing viewpoints and experiences
|
- Being respectful of differing viewpoints and experiences
|
||||||
* Gracefully accepting constructive criticism
|
- Gracefully accepting constructive criticism
|
||||||
* Focusing on what is best for the community
|
- Focusing on what is best for the community
|
||||||
* Showing empathy towards other community members
|
- Showing empathy towards other community members
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
- The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
- Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
* Public or private harassment
|
- Public or private harassment
|
||||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
- Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
|
|
||||||
## Our Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
|
|||||||
+58
-53
@@ -11,18 +11,21 @@ The following is a set of guidelines for contributing to Marlin, hosted by the [
|
|||||||
[I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question)
|
[I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question)
|
||||||
|
|
||||||
[How Can I Contribute?](#how-can-i-contribute)
|
[How Can I Contribute?](#how-can-i-contribute)
|
||||||
* [Reporting Bugs](#reporting-bugs)
|
|
||||||
* [Suggesting Features or Changes](#suggesting-features-or-changes)
|
- [Reporting Bugs](#reporting-bugs)
|
||||||
* [Your First Code Contribution](#your-first-code-contribution)
|
- [Suggesting Features or Changes](#suggesting-features-or-changes)
|
||||||
* [Pull Requests](#pull-requests)
|
- [Your First Code Contribution](#your-first-code-contribution)
|
||||||
|
- [Pull Requests](#pull-requests)
|
||||||
|
|
||||||
[Styleguides](#styleguides)
|
[Styleguides](#styleguides)
|
||||||
* [Git Commit Messages](#git-commit-messages)
|
|
||||||
* [C++ Coding Standards](#c++-coding-standards)
|
- [Git Commit Messages](#git-commit-messages)
|
||||||
* [Documentation Styleguide](#documentation)
|
- [C++ Coding Standards](#c++-coding-standards)
|
||||||
|
- [Documentation Styleguide](#documentation)
|
||||||
|
|
||||||
[Additional Notes](#additional-notes)
|
[Additional Notes](#additional-notes)
|
||||||
* [Issue and Pull Request Labels](#issue-and-pull-request-labels)
|
|
||||||
|
- [Issue and Pull Request Labels](#issue-and-pull-request-labels)
|
||||||
|
|
||||||
## Code of Conduct
|
## Code of Conduct
|
||||||
|
|
||||||
@@ -31,6 +34,7 @@ This project and everyone participating in it is governed by the [Marlin Code of
|
|||||||
## I don't want to read this whole thing I just have a question!!!
|
## I don't want to read this whole thing I just have a question!!!
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
|
>
|
||||||
> Please don't file an issue to ask a question. You'll get faster results by using the resources below.
|
> Please don't file an issue to ask a question. You'll get faster results by using the resources below.
|
||||||
|
|
||||||
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions.
|
||||||
@@ -43,10 +47,10 @@ 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:
|
If chat is more your speed, you can join the MarlinFirmware Discord server:
|
||||||
|
|
||||||
* Use the link https://discord.com/servers/marlin-firmware-461605380783472640 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!
|
- 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.
|
- 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.
|
- Other channels exist for certain topics or are limited to Patrons. Check the channel list.
|
||||||
|
|
||||||
## How Can I Contribute?
|
## How Can I Contribute?
|
||||||
|
|
||||||
@@ -57,6 +61,7 @@ This section guides you through submitting a Bug Report for Marlin. Following th
|
|||||||
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
|
Before creating a Bug Report, please test the "nightly" development branch, as you might find out that you don't need to create one. When you are creating a Bug Report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template](ISSUE_TEMPLATE/bug_report.yml), the information it asks for helps us resolve issues faster.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
|
>
|
||||||
> Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
> Regressions can happen. If you find a **Closed** issue that seems like your issue, go ahead and open a new issue and include a link to the original issue in the body of your new one. All you need to create a link is the issue number, preceded by #. For example, #8888.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Bug Report?
|
#### How Do I Submit A (Good) Bug Report?
|
||||||
@@ -65,29 +70,29 @@ Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/).
|
|||||||
|
|
||||||
Explain the problem and include additional details to help maintainers reproduce the problem:
|
Explain the problem and include additional details to help maintainers reproduce the problem:
|
||||||
|
|
||||||
* **Use a clear and descriptive title** for the issue to identify the problem.
|
- **Use a clear and descriptive title** for the issue to identify the problem.
|
||||||
* **Describe the exact steps which reproduce the problem** in as many details as possible. For example, start by explaining how you started Marlin, e.g. which command exactly you used in the terminal, or how you started Marlin otherwise. When listing steps, **don't just say what you did, but explain how you did it**. For example, if you moved the cursor to the end of a line, explain if you used the mouse, or a keyboard shortcut or an Marlin command, and if so which one?
|
- **Describe the exact steps which reproduce the problem** in as many details as possible. For example, start by explaining how you started Marlin, e.g. which command exactly you used in the terminal, or how you started Marlin otherwise. When listing steps, **don't just say what you did, but explain how you did it**. For example, if you moved the cursor to the end of a line, explain if you used the mouse, or a keyboard shortcut or an Marlin command, and if so which one?
|
||||||
* **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets or log output in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
|
- **Provide specific examples to demonstrate the steps**. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. If you're providing snippets or log output in the issue, use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines).
|
||||||
* **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
|
- **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior.
|
||||||
* **Explain which behavior you expected to see instead and why.**
|
- **Explain which behavior you expected to see instead and why.**
|
||||||
* **Include detailed log output** especially for probing and leveling. See below for usage of `DEBUG_LEVELING_FEATURE`.
|
- **Include detailed log output** especially for probing and leveling. See below for usage of `DEBUG_LEVELING_FEATURE`.
|
||||||
* **Include screenshots, links to videos, etc.** which clearly demonstrate the problem.
|
- **Include screenshots, links to videos, etc.** which clearly demonstrate the problem.
|
||||||
* **Include G-code** (if relevant) that reliably causes the problem to show itself.
|
- **Include G-code** (if relevant) that reliably causes the problem to show itself.
|
||||||
* **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more information using the guidelines below.
|
- **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more information using the guidelines below.
|
||||||
|
|
||||||
Provide more context:
|
Provide more context:
|
||||||
|
|
||||||
* **Can you reproduce the problem with a minimum of options enabled?**
|
- **Can you reproduce the problem with a minimum of options enabled?**
|
||||||
* **Did the problem start happening recently** (e.g. after updating to a new version of Marlin) or was this always a problem?
|
- **Did the problem start happening recently** (e.g. after updating to a new version of Marlin) or was this always a problem?
|
||||||
* If the problem started happening recently, **can you reproduce the problem in an older version of Marlin?** What's the most recent version in which the problem doesn't happen? You can download older versions of Marlin from [the releases page](https://github.com/MarlinFirmware/Marlin/releases).
|
- If the problem started happening recently, **can you reproduce the problem in an older version of Marlin?** What's the most recent version in which the problem doesn't happen? You can download older versions of Marlin from [the releases page](https://github.com/MarlinFirmware/Marlin/releases).
|
||||||
* **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens.
|
- **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens.
|
||||||
|
|
||||||
Include details about your configuration and environment:
|
Include details about your configuration and environment:
|
||||||
|
|
||||||
* **Which version of Marlin are you using?** Marlin's exact version and build date can be seen in the startup message when a host connects to Marlin, or in the LCD Info menu (if enabled).
|
- **Which version of Marlin are you using?** Marlin's exact version and build date can be seen in the startup message when a host connects to Marlin, or in the LCD Info menu (if enabled).
|
||||||
* **What kind of 3D Printer and electronics are you using**?
|
- **What kind of 3D Printer and electronics are you using**?
|
||||||
* **What kind of add-ons (probe, filament sensor) do you have**?
|
- **What kind of add-ons (probe, filament sensor) do you have**?
|
||||||
* **Include your Configuration files.** Make a ZIP file containing `Configuration.h` and `Configuration_adv.h` and drop it on your reply.
|
- **Include your Configuration files.** Make a ZIP file containing `Configuration.h` and `Configuration_adv.h` and drop it on your reply.
|
||||||
|
|
||||||
### Suggesting Features or Changes
|
### Suggesting Features or Changes
|
||||||
|
|
||||||
@@ -97,52 +102,52 @@ Before creating a suggestion, please check [this list](https://github.com/Marlin
|
|||||||
|
|
||||||
#### Before Submitting a Feature Request
|
#### Before Submitting a Feature Request
|
||||||
|
|
||||||
* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
- **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html).
|
||||||
* **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
- **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aopen+is%3Aissue+label%3A%22T%3A+Feature+Request%22)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
||||||
|
|
||||||
#### How Do I Submit A (Good) Feature Request?
|
#### How Do I Submit A (Good) Feature Request?
|
||||||
|
|
||||||
Feature Requests are tracked as [GitHub issues](https://guides.github.com/features/issues/). Please follow these guidelines in your request:
|
Feature Requests are tracked as [GitHub issues](https://guides.github.com/features/issues/). Please follow these guidelines in your request:
|
||||||
|
|
||||||
* **Use a clear and descriptive title** for the issue to identify the suggestion.
|
- **Use a clear and descriptive title** for the issue to identify the suggestion.
|
||||||
* **Provide a step-by-step description of the requested feature** in as much detail as possible.
|
- **Provide a step-by-step description of the requested feature** in as much detail as possible.
|
||||||
* **Provide specific examples to demonstrate the steps**.
|
- **Provide specific examples to demonstrate the steps**.
|
||||||
* **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
|
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why.
|
||||||
* **Include screenshots and links to videos** which demonstrate the feature or point out the part of Marlin to which the request is related.
|
- **Include screenshots and links to videos** which demonstrate the feature or point out the part of Marlin to which the request is related.
|
||||||
* **Explain why this feature would be useful** to most Marlin users.
|
- **Explain why this feature would be useful** to most Marlin users.
|
||||||
* **Name other firmwares that have this feature, if any.**
|
- **Name other firmwares that have this feature, if any.**
|
||||||
|
|
||||||
### Your First Code Contribution
|
### Your First Code Contribution
|
||||||
|
|
||||||
Unsure where to begin contributing to Marlin? You can start by looking through these `good-first-issue` and `help-wanted` issues:
|
Unsure where to begin contributing to Marlin? You can start by looking through these `good-first-issue` and `help-wanted` issues:
|
||||||
|
|
||||||
* [Beginner issues][good-first-issue] - issues which should only require a few lines of code, and a test or two.
|
- [Beginner issues][good-first-issue] - issues which should only require a few lines of code, and a test or two.
|
||||||
* [Help Wanted issues][help-wanted] - issues which should be a bit more involved than `beginner` issues.
|
- [Help Wanted issues][help-wanted] - issues which should be a bit more involved than `beginner` issues.
|
||||||
|
|
||||||
### Pull Requests
|
### Pull Requests
|
||||||
|
|
||||||
Pull Requests should always be targeted to working branches (e.g., `bugfix-2.1.x` and/or `bugfix-1.1.x`) and never to release branches (e.g., `2.0.x` and/or `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
Pull Requests should always be targeted to working branches (e.g., `bugfix-2.1.x` and/or `bugfix-1.1.x`) and never to release branches (e.g., `2.0.x` and/or `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and GitHub's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation.
|
||||||
|
|
||||||
* Fill in [the required template](pull_request_template.md).
|
- Fill in [the required template](pull_request_template.md).
|
||||||
* Don't include issue numbers in the PR title.
|
- Don't include issue numbers in the PR title.
|
||||||
* Include pictures, diagrams, and links to videos in your Pull Request to demonstrate your changes, if needed.
|
- Include pictures, diagrams, and links to videos in your Pull Request to demonstrate your changes, if needed.
|
||||||
* Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website.
|
- Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website.
|
||||||
* Document new code with clear and concise comments.
|
- Document new code with clear and concise comments.
|
||||||
* End all files with a newline.
|
- End all files with a newline.
|
||||||
|
|
||||||
## Styleguides
|
## Styleguides
|
||||||
|
|
||||||
### Git Commit Messages
|
### Git Commit Messages
|
||||||
|
|
||||||
* Use the present tense ("Add feature" not "Added feature").
|
- Use the present tense ("Add feature" not "Added feature").
|
||||||
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
|
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
|
||||||
* Limit the first line to 72 characters or fewer.
|
- Limit the first line to 72 characters or fewer.
|
||||||
* Reference issues and Pull Requests liberally after the first line.
|
- Reference issues and Pull Requests liberally after the first line.
|
||||||
|
|
||||||
### C++ Coding Standards
|
### C++ Coding Standards
|
||||||
|
|
||||||
* Please read and follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website. Failure to follow these guidelines will delay evaluation and acceptance of Pull Requests.
|
- Please read and follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website. Failure to follow these guidelines will delay evaluation and acceptance of Pull Requests.
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
* Guidelines for documentation are still under development. In-general, be clear, concise, and to-the-point.
|
- Guidelines for documentation are still under development. In-general, be clear, concise, and to-the-point.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
autolabel:
|
autolabel:
|
||||||
name: Auto Label
|
name: Auto Label
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Auto Label for [BUG]
|
- name: Auto Label for [BUG]
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v7
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Bump Distribution Date
|
name: Bump Distribution Date
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
name: PR Bad Target
|
name: PR Bad Target
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: superbrothers/close-pull-request@v3
|
- uses: superbrothers/close-pull-request@v3
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
- 2.1.x
|
- 2.1.x
|
||||||
|
- release-*
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- config/**
|
- config/**
|
||||||
- data/**
|
- data/**
|
||||||
@@ -34,13 +35,19 @@ jobs:
|
|||||||
name: Build Test
|
name: Build Test
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONFIG_BRANCH: ${{ github.base_ref || github.ref_name }}
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
test-platform:
|
test-platform:
|
||||||
|
|
||||||
|
# RP2040
|
||||||
|
- SKR_Pico
|
||||||
|
|
||||||
# Native
|
# Native
|
||||||
- linux_native
|
- linux_native
|
||||||
- simulator_linux_release
|
- simulator_linux_release
|
||||||
@@ -51,7 +58,7 @@ jobs:
|
|||||||
- at90usb1286_dfu
|
- at90usb1286_dfu
|
||||||
|
|
||||||
# AVR Extended
|
# AVR Extended
|
||||||
- FYSETC_F6
|
- mega2560ext
|
||||||
- melzi_optiboot
|
- melzi_optiboot
|
||||||
- rambo
|
- rambo
|
||||||
- sanguino1284p
|
- sanguino1284p
|
||||||
@@ -110,7 +117,7 @@ jobs:
|
|||||||
- BTT_GTR_V1_0
|
- BTT_GTR_V1_0
|
||||||
- BTT_SKR_PRO
|
- BTT_SKR_PRO
|
||||||
- FLYF407ZG
|
- FLYF407ZG
|
||||||
- FYSETC_S6
|
- STM32F446VE_fysetc
|
||||||
- LERDGEK
|
- LERDGEK
|
||||||
- LERDGEX
|
- LERDGEX
|
||||||
- mks_robin_pro2
|
- mks_robin_pro2
|
||||||
@@ -148,6 +155,12 @@ jobs:
|
|||||||
# HC32
|
# HC32
|
||||||
- HC32F460C_aquila_101
|
- HC32F460C_aquila_101
|
||||||
|
|
||||||
|
# GD32F3
|
||||||
|
- GD32F303RE_creality_mfl
|
||||||
|
|
||||||
|
# GD32F1
|
||||||
|
- GD32F103RC_aquila_mfl
|
||||||
|
|
||||||
# LPC176x - Lengthy tests
|
# LPC176x - Lengthy tests
|
||||||
- LPC1768
|
- LPC1768
|
||||||
- LPC1769
|
- LPC1769
|
||||||
@@ -161,15 +174,20 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
key: ${{ runner.os }}-pip-build-v1
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-build-
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
- name: Cache PlatformIO
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.platformio
|
path: |
|
||||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
~/.platformio
|
||||||
|
.pio/build
|
||||||
|
.pio/libdeps
|
||||||
|
key: ${{ runner.os }}-pio-build-v1
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pio-build-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
@@ -185,6 +203,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Simulator dependencies
|
- name: Install Simulator dependencies
|
||||||
run: |
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
sudo apt-get install build-essential
|
sudo apt-get install build-essential
|
||||||
sudo apt-get install libsdl2-dev
|
sudo apt-get install libsdl2-dev
|
||||||
sudo apt-get install libsdl2-net-dev
|
sudo apt-get install libsdl2-net-dev
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
# pulls them into additional branches.
|
# pulls them into additional branches.
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
@@ -46,15 +46,20 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
key: ${{ runner.os }}-pip-unit-v1
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-unit-
|
||||||
|
|
||||||
- name: Cache PlatformIO
|
- name: Cache PlatformIO
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.platformio
|
path: |
|
||||||
key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
|
~/.platformio
|
||||||
|
.pio/build
|
||||||
|
.pio/libdeps
|
||||||
|
key: ${{ runner.os }}-pio-tests-v1
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pio-tests-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
|
|||||||
@@ -11,19 +11,19 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
paths:
|
paths:
|
||||||
- 'Marlin/src/core/boards.h'
|
- "Marlin/src/core/boards.h"
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
paths:
|
paths:
|
||||||
- 'Marlin/src/core/boards.h'
|
- "Marlin/src/core/boards.h"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate_pins_files:
|
validate_pins_files:
|
||||||
name: Validate boards.h
|
name: Validate boards.h
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
@@ -33,15 +33,15 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
key: ${{ runner.os }}-pip-validation-v1
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-validation-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: "3.9"
|
||||||
architecture: 'x64'
|
architecture: "x64"
|
||||||
|
|
||||||
- name: Validate core/boards.h
|
- name: Validate core/boards.h
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
#
|
||||||
|
# ci-validate-lines.yml
|
||||||
|
# Validate that all text files are unchanged by linesformat.py
|
||||||
|
#
|
||||||
|
|
||||||
|
name: CI - Validate Source Files
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- bugfix-2.1.x
|
||||||
|
- 2.1.x
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- bugfix-2.1.x
|
||||||
|
- 2.1.x
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate_source_files:
|
||||||
|
name: Validate Source Files
|
||||||
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out the PR
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache node_modules
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: node_modules
|
||||||
|
key: ${{ runner.os }}-npm-lines-v1
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-npm-lines-
|
||||||
|
|
||||||
|
- name: Validate text file formatting
|
||||||
|
run: |
|
||||||
|
npm install --save-dev prettier
|
||||||
|
make validate-lines -j
|
||||||
@@ -12,21 +12,21 @@ on:
|
|||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||||
#- 2.1.x
|
#- 2.1.x
|
||||||
paths:
|
paths:
|
||||||
- 'Marlin/src/pins/*/**'
|
- "Marlin/src/pins/*/**"
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- bugfix-2.1.x
|
- bugfix-2.1.x
|
||||||
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
# Cannot be enabled on 2.1.x until it contains the unit test framework
|
||||||
#- 2.1.x
|
#- 2.1.x
|
||||||
paths:
|
paths:
|
||||||
- 'Marlin/src/pins/*/**'
|
- "Marlin/src/pins/*/**"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate_pins_files:
|
validate_pins_files:
|
||||||
name: Validate Pins Files
|
name: Validate Pins Files
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out the PR
|
- name: Check out the PR
|
||||||
@@ -36,15 +36,15 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/pip
|
path: ~/.cache/pip
|
||||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
key: ${{ runner.os }}-pip-validation-v1
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-pip-
|
${{ runner.os }}-pip-validation-
|
||||||
|
|
||||||
- name: Select Python 3.9
|
- name: Select Python 3.9
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: "3.9"
|
||||||
architecture: 'x64'
|
architecture: "x64"
|
||||||
|
|
||||||
- name: Validate all pins files
|
- name: Validate all pins files
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
remove_label:
|
remove_label:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Close Stale Issues
|
name: Close Stale Issues
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v9
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Lock Closed Issues
|
name: Lock Closed Issues
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v5
|
- uses: dessant/lock-threads@v5
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
name: Unlock Reopened
|
name: Unlock Reopened
|
||||||
if: github.repository == 'MarlinFirmware/Marlin'
|
if: github.repository == 'MarlinFirmware/Marlin'
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: OSDKDev/unlock-issues@v1.1
|
- uses: OSDKDev/unlock-issues@v1.1
|
||||||
|
|||||||
Executable → Regular
+8
@@ -31,6 +31,11 @@ out-language/
|
|||||||
*.gen
|
*.gen
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
|
||||||
|
# npm
|
||||||
|
node_modules/
|
||||||
|
package.json
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
# OS
|
# OS
|
||||||
applet/
|
applet/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -169,3 +174,6 @@ __pycache__
|
|||||||
tags
|
tags
|
||||||
*.logs
|
*.logs
|
||||||
*.bak
|
*.bak
|
||||||
|
.aider*
|
||||||
|
!.aiderignore
|
||||||
|
.env
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
# Prettier Ignore file
|
||||||
|
*.min.js
|
||||||
|
web-ui/
|
||||||
|
buildroot/share/PlatformIO/boards
|
||||||
|
buildroot/share/PlatformIO/variants
|
||||||
|
*.sublime-project
|
||||||
|
*.sublime-syntax
|
||||||
|
.github
|
||||||
|
.vscode
|
||||||
|
launch.json
|
||||||
@@ -1,15 +1,42 @@
|
|||||||
SCRIPTS_DIR := buildroot/share/scripts
|
SCRIPTS_DIR := buildroot/share/scripts
|
||||||
|
MAKESCRIPTS_DIR := buildroot/share/make
|
||||||
CONTAINER_RT_BIN := docker
|
CONTAINER_RT_BIN := docker
|
||||||
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
CONTAINER_RT_OPTS := --rm -v $(PWD):/code -v platformio-cache:/root/.platformio
|
||||||
CONTAINER_IMAGE := marlin-dev
|
CONTAINER_IMAGE := marlin-dev
|
||||||
UNIT_TEST_CONFIG ?= default
|
UNIT_TEST_CONFIG ?= default
|
||||||
|
|
||||||
|
# Find a Python 3 interpreter
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
# Windows: use `where` – fall back through the three common names
|
||||||
|
PYTHON := $(shell which python 2>nul || which python3 2>nul || which py 2>nul)
|
||||||
|
# Windows: Use Python script to find pins files
|
||||||
|
PINS := $(shell $(PYTHON) $(MAKESCRIPTS_DIR)/find.py Marlin/src/pins -mindepth 2 -name 'pins_*.h')
|
||||||
|
else
|
||||||
|
# POSIX: use `command -v` – prefer python3 over python
|
||||||
|
PYTHON := $(shell command -v python3 2>/dev/null || command -v python 2>/dev/null)
|
||||||
|
# Unix/Linux: Use find command
|
||||||
|
PINS := $(shell find Marlin/src/pins -mindepth 2 -name 'pins_*.h')
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Check that the found interpreter is Python 3
|
||||||
|
# Error if there's no Python 3 available
|
||||||
|
ifneq ($(strip $(PYTHON)),)
|
||||||
|
PYTHON_VERSION := $(shell $(PYTHON) -c "import sys; print(sys.version_info[0])" 2>/dev/null)
|
||||||
|
ifneq ($(PYTHON_VERSION),3)
|
||||||
|
$(error $(PYTHON) is not Python 3 – install a Python‑3.x interpreter or adjust your PATH)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
$(error No Python executable found – install Python 3.x and make sure it is in your PATH)
|
||||||
|
endif
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo "Tasks for local development:"
|
@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 format-pins -j : Reformat all pins files (-j for parallel execution)"
|
||||||
|
@echo "make validate-lines -j : Validate line endings, fails on trailing whitespace, etc."
|
||||||
@echo "make validate-pins -j : Validate all pins files, fails if any require reformatting"
|
@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 validate-boards -j : Validate boards.h and pins.h for standards compliance"
|
||||||
|
@echo "make validate-urls : Validate URLs in source files"
|
||||||
@echo "make tests-single-ci : Run a single test from inside the CI"
|
@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 : Run a single test locally"
|
||||||
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
@echo "make tests-single-local-docker : Run a single test locally, using docker"
|
||||||
@@ -19,7 +46,7 @@ help:
|
|||||||
@echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker"
|
@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 unit-test-all-local-docker : Run all code tests locally, using docker"
|
||||||
@echo "make setup-local-docker : Setup local docker using buildx"
|
@echo "make setup-local-docker : Setup local docker"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Options for testing:"
|
@echo "Options for testing:"
|
||||||
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
@echo " TEST_TARGET Set when running tests-single-*, to select the"
|
||||||
@@ -40,6 +67,9 @@ marlin:
|
|||||||
./buildroot/bin/mftest -a
|
./buildroot/bin/mftest -a
|
||||||
.PHONY: marlin
|
.PHONY: marlin
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf .pio/build*
|
||||||
|
|
||||||
tests-single-ci:
|
tests-single-ci:
|
||||||
export GIT_RESET_HARD=true
|
export GIT_RESET_HARD=true
|
||||||
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
$(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION
|
||||||
@@ -56,10 +86,10 @@ tests-single-local-docker:
|
|||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make tests-single-local TEST_TARGET=$(TEST_TARGET) VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) GIT_RESET_HARD=$(GIT_RESET_HARD) ONLY_TEST="$(ONLY_TEST)"
|
||||||
|
|
||||||
tests-all-local:
|
tests-all-local:
|
||||||
@python -c "import yaml" 2>/dev/null || (echo 'pyyaml module is not installed. Install it with "python -m pip install pyyaml"' && exit 1)
|
@$(PYTHON) -c "import yaml" 2>/dev/null || (echo 'pyyaml module is not installed. Install it with "$(PYTHON) -m pip install pyyaml"' && exit 1)
|
||||||
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
export PATH="./buildroot/bin/:./buildroot/tests/:${PATH}" \
|
||||||
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
&& export VERBOSE_PLATFORMIO=$(VERBOSE_PLATFORMIO) \
|
||||||
&& for TEST_TARGET in $$(python $(SCRIPTS_DIR)/get_test_targets.py) ; do \
|
&& for TEST_TARGET in $$($(PYTHON) $(MAKESCRIPTS_DIR)/get_test_targets.py) ; do \
|
||||||
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
|
if [ "$$TEST_TARGET" = "linux_native" ] && [ "$$(uname)" = "Darwin" ]; then \
|
||||||
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
echo "Skipping tests for $$TEST_TARGET on macOS" ; \
|
||||||
continue ; \
|
continue ; \
|
||||||
@@ -87,27 +117,60 @@ unit-test-all-local-docker:
|
|||||||
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
@if ! $(CONTAINER_RT_BIN) images -q $(CONTAINER_IMAGE) > /dev/null ; then $(MAKE) setup-local-docker ; fi
|
||||||
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
|
$(CONTAINER_RT_BIN) run $(CONTAINER_RT_OPTS) $(CONTAINER_IMAGE) make unit-test-all-local
|
||||||
|
|
||||||
setup-local-docker:
|
USERNAME := $(shell whoami)
|
||||||
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
USER_ID := $(shell id -u)
|
||||||
|
GROUP_ID := $(shell id -g)
|
||||||
|
|
||||||
PINS := $(shell find Marlin/src/pins -mindepth 2 -name '*.h')
|
.PHONY: setup-local-docker setup-local-docker-old
|
||||||
|
|
||||||
|
setup-local-docker:
|
||||||
|
@echo "Building marlin-dev Docker image..."
|
||||||
|
$(CONTAINER_RT_BIN) build -t $(CONTAINER_IMAGE) \
|
||||||
|
--build-arg USERNAME=$(USERNAME) \
|
||||||
|
--build-arg USER_ID=$(USER_ID) \
|
||||||
|
--build-arg GROUP_ID=$(GROUP_ID) \
|
||||||
|
-f docker/Dockerfile .
|
||||||
|
@echo
|
||||||
|
@echo "To run all tests in Docker:"
|
||||||
|
@echo " make tests-all-local-docker"
|
||||||
|
@echo "To run a single test in Docker:"
|
||||||
|
@echo " make tests-single-local-docker TEST_TARGET=mega2560"
|
||||||
|
|
||||||
|
setup-local-docker-old:
|
||||||
|
$(CONTAINER_RT_BIN) buildx build -t $(CONTAINER_IMAGE) -f docker/Dockerfile .
|
||||||
|
|
||||||
.PHONY: $(PINS) format-pins validate-pins
|
.PHONY: $(PINS) format-pins validate-pins
|
||||||
|
|
||||||
$(PINS): %:
|
$(PINS): %:
|
||||||
@echo "Formatting $@"
|
@echo "Formatting pins $@"
|
||||||
@python $(SCRIPTS_DIR)/pinsformat.py $< $@
|
@$(PYTHON) $(SCRIPTS_DIR)/pinsformat.py $< $@
|
||||||
|
|
||||||
format-pins: $(PINS)
|
format-pins: $(PINS)
|
||||||
|
@echo "Processed $(words $(PINS)) pins files"
|
||||||
|
|
||||||
validate-pins: format-pins
|
validate-pins: format-pins
|
||||||
@echo "Validating pins files"
|
@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)
|
@git diff --exit-code || (git status && echo "\nError: Pins files are not formatted correctly. Run \"make format-pins\" to fix.\n" && exit 1)
|
||||||
|
|
||||||
|
.PHONY: format-lines validate-lines validate-urls
|
||||||
|
|
||||||
|
format-lines:
|
||||||
|
@echo "Formatting all sources"
|
||||||
|
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py buildroot
|
||||||
|
@$(PYTHON) $(SCRIPTS_DIR)/linesformat.py Marlin
|
||||||
|
|
||||||
|
validate-lines:
|
||||||
|
@echo "Validating text formatting"
|
||||||
|
@npx prettier --check . --editorconfig --object-wrap preserve --prose-wrap never
|
||||||
|
|
||||||
|
validate-urls:
|
||||||
|
@echo "Checking URLs in source files"
|
||||||
|
@$(MAKESCRIPTS_DIR)/check-urls.sh
|
||||||
|
|
||||||
BOARDS_FILE := Marlin/src/core/boards.h
|
BOARDS_FILE := Marlin/src/core/boards.h
|
||||||
|
|
||||||
.PHONY: validate-boards
|
.PHONY: validate-boards
|
||||||
|
|
||||||
validate-boards:
|
validate-boards:
|
||||||
@echo "Validating boards.h file"
|
@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)
|
@$(PYTHON) $(MAKESCRIPTS_DIR)/validate_boards.py $(BOARDS_FILE) || (echo "\nError: boards.h file is not valid. Please check and correct it.\n" && exit 1)
|
||||||
|
|||||||
+218
-113
@@ -61,7 +61,7 @@
|
|||||||
// @section info
|
// @section info
|
||||||
|
|
||||||
// Author info of this build printed to the host during boot and M115
|
// Author info of this build printed to the host during boot and M115
|
||||||
#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Original author or contributor.
|
#define STRING_CONFIG_H_AUTHOR "(MarlinFirmware)" // Original author or contributor.
|
||||||
//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
|
//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes)
|
||||||
|
|
||||||
// @section machine
|
// @section machine
|
||||||
@@ -71,6 +71,8 @@
|
|||||||
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
#define MOTHERBOARD BOARD_RAMPS_14_EFB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// @section serial
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select the serial port on the board to use for communication with the host.
|
* 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.
|
* This allows the connection of wireless adapters (for instance) to non-default port pins.
|
||||||
@@ -127,6 +129,7 @@
|
|||||||
|
|
||||||
// Name displayed in the LCD "Ready" message and Info menu
|
// Name displayed in the LCD "Ready" message and Info menu
|
||||||
//#define CUSTOM_MACHINE_NAME "3D Printer"
|
//#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.
|
// 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
|
// Choose your own or use a service like https://www.uuidgenerator.net/version4
|
||||||
@@ -145,9 +148,9 @@
|
|||||||
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
|
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
|
||||||
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
|
||||||
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
|
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
|
||||||
* TMC2660, TMC2660_STANDALONE, TMC5130, TMC5130_STANDALONE,
|
* TMC2240, TMC2660, TMC2660_STANDALONE,
|
||||||
* TMC5160, TMC5160_STANDALONE
|
* TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
|
||||||
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
* :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
|
||||||
*/
|
*/
|
||||||
#define X_DRIVER_TYPE A4988
|
#define X_DRIVER_TYPE A4988
|
||||||
#define Y_DRIVER_TYPE A4988
|
#define Y_DRIVER_TYPE A4988
|
||||||
@@ -257,6 +260,7 @@
|
|||||||
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
#define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }.
|
||||||
// For Dual Servo use two pairs: { { lower, raise }, { lower, raise } }
|
// 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_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
|
#endif
|
||||||
|
|
||||||
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
// Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#.
|
||||||
@@ -301,6 +305,18 @@
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Differential Extruder
|
||||||
|
*
|
||||||
|
* The X and E steppers work together to create a differential drive system.
|
||||||
|
* Simple : E steps = X + E ; X steps = X (E drives a loop, X stays the same)
|
||||||
|
* Balanced: E steps = X + E/2 ; X steps = X - E/2 (Dual loop system)
|
||||||
|
*/
|
||||||
|
//#define DIFFERENTIAL_EXTRUDER
|
||||||
|
#if ENABLED(DIFFERENTIAL_EXTRUDER)
|
||||||
|
//#define BALANCED_DIFFERENTIAL_EXTRUDER
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Switching Toolhead
|
* Switching Toolhead
|
||||||
*
|
*
|
||||||
@@ -452,7 +468,7 @@
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Thermal Settings ============================
|
//============================= Thermal Settings ============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// @section temperature
|
// @section temperature sensors
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Temperature Sensors:
|
* Temperature Sensors:
|
||||||
@@ -484,8 +500,8 @@
|
|||||||
* 10 : 100kΩ RS PRO 198-961
|
* 10 : 100kΩ RS PRO 198-961
|
||||||
* 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1%
|
* 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1%
|
||||||
* 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed
|
* 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed
|
||||||
* 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1%
|
* 13 : 100kΩ Hisense up to 300°C - for "Simple ONE" & "All In ONE" hotend - R25 = 100 kOhm, beta25 = 4100 K, 4.7kΩ pull-up
|
||||||
* 14 : 100kΩ (R25), 4092K (beta25), 4.7kΩ pull-up, bed thermistor as used in Ender-5 S1
|
* 14 : 100kΩ (R25), 4092K (beta25), 4.7kΩ pull-up, bed thermistor (as used in Ender-5 S1)
|
||||||
* 15 : 100kΩ Calibrated for JGAurora A5 hotend
|
* 15 : 100kΩ Calibrated for JGAurora A5 hotend
|
||||||
* 17 : 100kΩ Dagoma NTC white thermistor
|
* 17 : 100kΩ Dagoma NTC white thermistor
|
||||||
* 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327
|
* 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327
|
||||||
@@ -584,7 +600,7 @@
|
|||||||
#define DUMMY_THERMISTOR_998_VALUE 25
|
#define DUMMY_THERMISTOR_998_VALUE 25
|
||||||
#define DUMMY_THERMISTOR_999_VALUE 100
|
#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)
|
#if TEMP_SENSOR_IS_MAX_TC(0)
|
||||||
#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000)
|
#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
|
#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for Adafruit PT100; 4300 for Adafruit PT1000
|
||||||
@@ -597,6 +613,10 @@
|
|||||||
#define MAX31865_SENSOR_OHMS_2 100
|
#define MAX31865_SENSOR_OHMS_2 100
|
||||||
#define MAX31865_CALIBRATION_OHMS_2 430
|
#define MAX31865_CALIBRATION_OHMS_2 430
|
||||||
#endif
|
#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
|
#if HAS_E_TEMP_SENSOR
|
||||||
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109
|
||||||
@@ -632,6 +652,8 @@
|
|||||||
#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort.
|
#define TEMP_SENSOR_REDUNDANT_MAX_DIFF 10 // (°C) Temperature difference that will trigger a print abort.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// @section temperature
|
||||||
|
|
||||||
// Below this temperature the heater will be switched off
|
// Below this temperature the heater will be switched off
|
||||||
// because it probably indicates a broken thermistor wire.
|
// because it probably indicates a broken thermistor wire.
|
||||||
#define HEATER_0_MINTEMP 5
|
#define HEATER_0_MINTEMP 5
|
||||||
@@ -689,20 +711,22 @@
|
|||||||
#define PID_K1 0.95 // Smoothing factor within any PID loop
|
#define PID_K1 0.95 // Smoothing factor within any PID loop
|
||||||
|
|
||||||
#if ENABLED(PIDTEMP)
|
#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)
|
//#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]
|
// Set/get with G-code: M301 E[extruder number, 0-2]
|
||||||
|
|
||||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||||
// Specify up to one value per hotend here, according to your setup.
|
// Specify up to one value per hotend here, according to your setup.
|
||||||
// If there are fewer values, the last one applies to the remaining hotends.
|
// If there are fewer values, the last one applies to the remaining hotends.
|
||||||
#define DEFAULT_Kp_LIST { 22.20, 22.20 }
|
#define DEFAULT_KP_LIST { 22.20, 22.20 }
|
||||||
#define DEFAULT_Ki_LIST { 1.08, 1.08 }
|
#define DEFAULT_KI_LIST { 1.08, 1.08 }
|
||||||
#define DEFAULT_Kd_LIST { 114.00, 114.00 }
|
#define DEFAULT_KD_LIST { 114.00, 114.00 }
|
||||||
#else
|
#else
|
||||||
#define DEFAULT_Kp 22.20
|
#define DEFAULT_KP 22.20
|
||||||
#define DEFAULT_Ki 1.08
|
#define DEFAULT_KI 1.08
|
||||||
#define DEFAULT_Kd 114.00
|
#define DEFAULT_KD 114.00
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
|
#define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current
|
||||||
@@ -725,7 +749,12 @@
|
|||||||
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
|
//#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash)
|
||||||
|
|
||||||
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active.
|
#define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active.
|
||||||
#define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers.
|
#define MPC_HEATER_POWER { 40.0f } // (W) Nominal heat cartridge powers.
|
||||||
|
//#define MPC_PTC // Hotend power changes with temperature (e.g., PTC heat cartridges).
|
||||||
|
#if ENABLED(MPC_PTC)
|
||||||
|
#define MPC_HEATER_ALPHA { 0.0028f } // Temperature coefficient of resistance of the heat cartridges.
|
||||||
|
#define MPC_HEATER_REFTEMP { 20 } // (°C) Reference temperature for MPC_HEATER_POWER and MPC_HEATER_ALPHA.
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MPC_INCLUDE_FAN // Model the fan speed?
|
#define MPC_INCLUDE_FAN // Model the fan speed?
|
||||||
|
|
||||||
@@ -757,6 +786,7 @@
|
|||||||
|
|
||||||
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
|
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
|
||||||
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
|
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
|
||||||
|
//#define EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -788,14 +818,15 @@
|
|||||||
//#define PIDTEMPBED
|
//#define PIDTEMPBED
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPBED)
|
#if ENABLED(PIDTEMPBED)
|
||||||
//#define MIN_BED_POWER 0
|
//#define MIN_BED_POWER 0 // Min power to improve PID stability (0..MAX_BED_POWER).
|
||||||
//#define PID_BED_DEBUG // Print Bed PID debug data to the serial port.
|
// 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+)
|
// 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)
|
// from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
|
||||||
#define DEFAULT_bedKp 10.00
|
#define DEFAULT_BED_KP 10.00
|
||||||
#define DEFAULT_bedKi .023
|
#define DEFAULT_BED_KI 0.023
|
||||||
#define DEFAULT_bedKd 305.4
|
#define DEFAULT_BED_KD 305.4
|
||||||
|
|
||||||
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
// FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles.
|
||||||
#else
|
#else
|
||||||
@@ -870,15 +901,15 @@
|
|||||||
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current
|
||||||
|
|
||||||
#if ENABLED(PIDTEMPCHAMBER)
|
#if ENABLED(PIDTEMPCHAMBER)
|
||||||
#define MIN_CHAMBER_POWER 0
|
//#define MIN_CHAMBER_POWER 0 // Min power to improve PID stability. (0..MAX_CHAMBER_POWER)
|
||||||
//#define PID_CHAMBER_DEBUG // Print Chamber PID debug data to the serial port.
|
// 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
|
// 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.
|
// and placed inside the small Creality printer enclosure tent.
|
||||||
//
|
#define DEFAULT_CHAMBER_KP 37.04
|
||||||
#define DEFAULT_chamberKp 37.04
|
#define DEFAULT_CHAMBER_KI 1.40
|
||||||
#define DEFAULT_chamberKi 1.40
|
#define DEFAULT_CHAMBER_KD 655.17
|
||||||
#define DEFAULT_chamberKd 655.17
|
|
||||||
// M309 P37.04 I1.04 D655.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.
|
// FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles.
|
||||||
@@ -889,7 +920,7 @@
|
|||||||
#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
|
#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 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 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.
|
// 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)
|
//#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of flash)
|
||||||
@@ -925,7 +956,7 @@
|
|||||||
* protect against a broken or disconnected thermistor wire.
|
* protect against a broken or disconnected thermistor wire.
|
||||||
*
|
*
|
||||||
* The issue: If a thermistor falls out, it will report the much lower
|
* The issue: If a thermistor falls out, it will report the much lower
|
||||||
* temperature of the air in the room, and the the firmware will keep
|
* temperature of the air in the room, and the firmware will keep
|
||||||
* the heater on.
|
* the heater on.
|
||||||
*
|
*
|
||||||
* If you get "Thermal Runaway" or "Heating failed" errors the
|
* If you get "Thermal Runaway" or "Heating failed" errors the
|
||||||
@@ -941,7 +972,7 @@
|
|||||||
//============================= Mechanical Settings =========================
|
//============================= Mechanical Settings =========================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
// @section machine
|
// @section kinematics
|
||||||
|
|
||||||
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
|
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
|
||||||
// either in the usual order or reversed
|
// either in the usual order or reversed
|
||||||
@@ -965,6 +996,15 @@
|
|||||||
// Enable for a belt style printer with endless "Z" motion
|
// Enable for a belt style printer with endless "Z" motion
|
||||||
//#define BELTPRINTER
|
//#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
|
// Enable for Polargraph Kinematics
|
||||||
//#define POLARGRAPH
|
//#define POLARGRAPH
|
||||||
#if ENABLED(POLARGRAPH)
|
#if ENABLED(POLARGRAPH)
|
||||||
@@ -1008,9 +1048,6 @@
|
|||||||
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
|
// Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers).
|
||||||
#define PRINTABLE_RADIUS 140.0 // (mm)
|
#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.
|
// Center-to-center distance of the holes in the diagonal push rods.
|
||||||
#define DELTA_DIAGONAL_ROD 250.0 // (mm)
|
#define DELTA_DIAGONAL_ROD 250.0 // (mm)
|
||||||
|
|
||||||
@@ -1030,7 +1067,8 @@
|
|||||||
// Delta radius and diagonal rod adjustments
|
// Delta radius and diagonal rod adjustments
|
||||||
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
//#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
||||||
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
//#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm)
|
||||||
#endif
|
|
||||||
|
#endif // DELTA
|
||||||
|
|
||||||
// @section scara
|
// @section scara
|
||||||
|
|
||||||
@@ -1086,17 +1124,37 @@
|
|||||||
#define TPARA_LINKAGE_1 120 // (mm)
|
#define TPARA_LINKAGE_1 120 // (mm)
|
||||||
#define TPARA_LINKAGE_2 120 // (mm)
|
#define TPARA_LINKAGE_2 120 // (mm)
|
||||||
|
|
||||||
// TPARA tower offset (position of Tower relative to bed zero position)
|
// Height of the Shoulder axis (pivot) relative to the tower floor
|
||||||
|
#define TPARA_SHOULDER_AXIS_HEIGHT 135.0 // (mm)
|
||||||
|
|
||||||
|
// The position of the last linkage relative to the robot arm origin
|
||||||
|
// (intersection of the base axis and floor) when at the home position
|
||||||
|
#define TPARA_ARM_X_HOME_POS 28.75 // (mm) Measured from shoulder axis to tool holder axis in home position
|
||||||
|
#define TPARA_ARM_Y_HOME_POS 0 // (mm)
|
||||||
|
#define TPARA_ARM_Z_HOME_POS 250.00 // (mm) Measured from tool holder axis to the floor
|
||||||
|
|
||||||
|
// TPARA Workspace offset relative to the tower (position of workspace origin relative to robot Tower origin )
|
||||||
// This needs to be reasonably accurate as it defines the printbed position in the TPARA space.
|
// This needs to be reasonably accurate as it defines the printbed position in the TPARA space.
|
||||||
#define TPARA_OFFSET_X 0 // (mm)
|
#define TPARA_OFFSET_X 127.0 // (mm) to coincide with minimum radius MIDDLE_DEAD_ZONE_R, and W(0,0,0) is reachable
|
||||||
#define TPARA_OFFSET_Y 0 // (mm)
|
#define TPARA_OFFSET_Y 0.0 // (mm)
|
||||||
#define TPARA_OFFSET_Z 0 // (mm)
|
#define TPARA_OFFSET_Z 0.0 // (mm)
|
||||||
|
|
||||||
|
// TPARA tool connection point offset, relative to the tool moving frame origin which is in the last linkage axis,
|
||||||
|
// (TCP: tool center/connection point) of the robot,
|
||||||
|
// the plane of measured offset must be alligned with home position plane
|
||||||
|
#define TPARA_TCP_OFFSET_X 27.0 // (mm) Tool flange: 27 (distance from pivot to bolt holes), extruder tool: 50.0,
|
||||||
|
#define TPARA_TCP_OFFSET_Y 0.0 // (mm)
|
||||||
|
#define TPARA_TCP_OFFSET_Z -65.0 // (mm) Tool flange (bottom): -6 (caution as Z 0 posiion will crash second linkage to the floor, -35 is safe for testing with no tool), extruder tool (depends on extruder): -65.0
|
||||||
|
|
||||||
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
||||||
|
|
||||||
// Radius around the center where the arm cannot reach
|
// Radius around the center where the arm cannot reach
|
||||||
#define MIDDLE_DEAD_ZONE_R 0 // (mm)
|
// For now use a hardcoded uniform limit, although it should be calculated, or fix a limit for each axis angle
|
||||||
#endif
|
#define MIDDLE_DEAD_ZONE_R 100 // (mm)
|
||||||
|
|
||||||
|
// Max angle between L1 and L2
|
||||||
|
#define TPARA_MAX_L1L2_ANGLE 140.0f // (degrees)
|
||||||
|
#endif // AXEL_TPARA
|
||||||
|
|
||||||
// @section polar
|
// @section polar
|
||||||
|
|
||||||
@@ -1151,15 +1209,6 @@
|
|||||||
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
#define FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly
|
||||||
#endif
|
#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 ===========================
|
//============================== Endstop Settings ===========================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@@ -1381,6 +1430,11 @@
|
|||||||
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
|
* See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained
|
||||||
*/
|
*/
|
||||||
//#define S_CURVE_ACCELERATION
|
//#define S_CURVE_ACCELERATION
|
||||||
|
#if ENABLED(S_CURVE_ACCELERATION)
|
||||||
|
// Define to use 4th instead of 6th order motion curve
|
||||||
|
//#define S_CURVE_FACTOR 0.25 // Initial and final acceleration factor, ideally 0.1 to 0.4.
|
||||||
|
// Shouldn't generally require tuning.
|
||||||
|
#endif
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= Z Probe Options =============================
|
//============================= Z Probe Options =============================
|
||||||
@@ -1505,7 +1559,6 @@
|
|||||||
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
* For information about this sensor https://github.com/bigtreetech/MicroProbe
|
||||||
*
|
*
|
||||||
* Also requires PROBE_ENABLE_DISABLE
|
* Also requires PROBE_ENABLE_DISABLE
|
||||||
* With FT_MOTION requires ENDSTOP_INTERRUPTS_FEATURE
|
|
||||||
*/
|
*/
|
||||||
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
//#define BIQU_MICROPROBE_V1 // Triggers HIGH
|
||||||
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
//#define BIQU_MICROPROBE_V2 // Triggers LOW
|
||||||
@@ -1533,6 +1586,20 @@
|
|||||||
#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
|
#define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed
|
||||||
#define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow 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_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_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
|
#define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed
|
||||||
@@ -1596,7 +1663,7 @@
|
|||||||
* Nozzle-to-Probe offsets { X, Y, Z }
|
* Nozzle-to-Probe offsets { X, Y, Z }
|
||||||
*
|
*
|
||||||
* X and Y offset
|
* X and Y offset
|
||||||
* Use a caliper or ruler to measure the distance from the tip of
|
* Use a caliper or ruler to measure the distance (in mm) from the tip of
|
||||||
* the Nozzle to the center-point of the Probe in the X and Y axes.
|
* the Nozzle to the center-point of the Probe in the X and Y axes.
|
||||||
*
|
*
|
||||||
* Z offset
|
* Z offset
|
||||||
@@ -1632,7 +1699,7 @@
|
|||||||
* | [-] |
|
* | [-] |
|
||||||
* O-- FRONT --+
|
* O-- FRONT --+
|
||||||
*/
|
*/
|
||||||
#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 }
|
#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } // (mm) X, Y, Z distance from Nozzle tip to Probe trigger-point
|
||||||
|
|
||||||
// Enable and set to use a specific tool for probing. Disable to allow any tool.
|
// Enable and set to use a specific tool for probing. Disable to allow any tool.
|
||||||
#define PROBING_TOOL 0
|
#define PROBING_TOOL 0
|
||||||
@@ -1640,19 +1707,21 @@
|
|||||||
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
|
//#define PROBE_TOOLCHANGE_NO_MOVE // Suppress motion on probe tool-change
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//#define PROBE_WAKEUP_TIME_MS 30 // (ms) Time for the probe to wake up
|
||||||
|
|
||||||
// Most probes should stay away from the edges of the bed, but
|
// Most probes should stay away from the edges of the bed, but
|
||||||
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
// with NOZZLE_AS_PROBE this can be negative for a wider probing area.
|
||||||
#define PROBING_MARGIN 10
|
#define PROBING_MARGIN 10
|
||||||
|
|
||||||
// X and Y axis travel speed (mm/min) between probes.
|
// X and Y axis travel speed between probes.
|
||||||
// Leave undefined to use the average of the current XY homing feedrate.
|
// Leave undefined to use the average of the current XY homing feedrate.
|
||||||
#define XY_PROBE_FEEDRATE (133*60)
|
#define XY_PROBE_FEEDRATE (133*60) // (mm/min)
|
||||||
|
|
||||||
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
// Feedrate for the first approach when double-probing (MULTIPLE_PROBING == 2)
|
||||||
#define Z_PROBE_FEEDRATE_FAST (4*60)
|
#define Z_PROBE_FEEDRATE_FAST (4*60) // (mm/min)
|
||||||
|
|
||||||
// Feedrate (mm/min) for the "accurate" probe of each point
|
// Feedrate for the "accurate" probe of each point
|
||||||
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2)
|
#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) // (mm/min)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Probe Activation Switch
|
* Probe Activation Switch
|
||||||
@@ -1769,17 +1838,17 @@
|
|||||||
// @section stepper drivers
|
// @section stepper drivers
|
||||||
|
|
||||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||||
// :{ 0:'Low', 1:'High' }
|
// :['LOW', 'HIGH']
|
||||||
#define X_ENABLE_ON 0
|
#define X_ENABLE_ON LOW
|
||||||
#define Y_ENABLE_ON 0
|
#define Y_ENABLE_ON LOW
|
||||||
#define Z_ENABLE_ON 0
|
#define Z_ENABLE_ON LOW
|
||||||
#define E_ENABLE_ON 0 // For all extruders
|
#define E_ENABLE_ON LOW // For all extruders
|
||||||
//#define I_ENABLE_ON 0
|
//#define I_ENABLE_ON LOW
|
||||||
//#define J_ENABLE_ON 0
|
//#define J_ENABLE_ON LOW
|
||||||
//#define K_ENABLE_ON 0
|
//#define K_ENABLE_ON LOW
|
||||||
//#define U_ENABLE_ON 0
|
//#define U_ENABLE_ON LOW
|
||||||
//#define V_ENABLE_ON 0
|
//#define V_ENABLE_ON LOW
|
||||||
//#define W_ENABLE_ON 0
|
//#define W_ENABLE_ON LOW
|
||||||
|
|
||||||
// Disable axis steppers immediately when they're not being stepped.
|
// Disable axis steppers immediately when they're not being stepped.
|
||||||
// WARNING: When motors turn off there is a chance of losing position accuracy!
|
// WARNING: When motors turn off there is a chance of losing position accuracy!
|
||||||
@@ -1793,15 +1862,12 @@
|
|||||||
//#define DISABLE_V
|
//#define DISABLE_V
|
||||||
//#define DISABLE_W
|
//#define DISABLE_W
|
||||||
|
|
||||||
// Turn off the display blinking that warns about possible accuracy reduction
|
|
||||||
//#define DISABLE_REDUCED_ACCURACY_WARNING
|
|
||||||
|
|
||||||
// @section extruder
|
// @section extruder
|
||||||
|
|
||||||
//#define DISABLE_E // Disable the extruder when not stepping
|
//#define DISABLE_E // Disable the extruder when not stepping
|
||||||
#define DISABLE_OTHER_EXTRUDERS // Keep only the active extruder enabled
|
#define DISABLE_OTHER_EXTRUDERS // Keep only the active extruder enabled
|
||||||
|
|
||||||
// @section motion
|
// @section stepper drivers
|
||||||
|
|
||||||
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
|
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
|
||||||
#define INVERT_X_DIR false
|
#define INVERT_X_DIR false
|
||||||
@@ -1814,8 +1880,6 @@
|
|||||||
//#define INVERT_V_DIR false
|
//#define INVERT_V_DIR false
|
||||||
//#define INVERT_W_DIR false
|
//#define INVERT_W_DIR false
|
||||||
|
|
||||||
// @section extruder
|
|
||||||
|
|
||||||
// For direct drive extruder v9 set to true, for geared extruder set to false.
|
// For direct drive extruder v9 set to true, for geared extruder set to false.
|
||||||
#define INVERT_E0_DIR false
|
#define INVERT_E0_DIR false
|
||||||
#define INVERT_E1_DIR false
|
#define INVERT_E1_DIR false
|
||||||
@@ -2016,8 +2080,11 @@
|
|||||||
//#define FILAMENT_MOTION_SENSOR
|
//#define FILAMENT_MOTION_SENSOR
|
||||||
|
|
||||||
#if ENABLED(FILAMENT_MOTION_SENSOR)
|
#if ENABLED(FILAMENT_MOTION_SENSOR)
|
||||||
//#define FILAMENT_SWITCH_AND_MOTION
|
//#define FILAMENT_SWITCH_AND_MOTION // Define separate pins below to sense motion
|
||||||
#if ENABLED(FILAMENT_SWITCH_AND_MOTION)
|
#if ENABLED(FILAMENT_SWITCH_AND_MOTION)
|
||||||
|
|
||||||
|
#define FILAMENT_MOTION_DISTANCE_MM 3.0 // (mm) Missing distance required to trigger runout
|
||||||
|
|
||||||
#define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each.
|
#define NUM_MOTION_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_MOTION#_PIN for each.
|
||||||
//#define FIL_MOTION1_PIN -1
|
//#define FIL_MOTION1_PIN -1
|
||||||
|
|
||||||
@@ -2053,10 +2120,10 @@
|
|||||||
//#define FIL_MOTION8_STATE LOW
|
//#define FIL_MOTION8_STATE LOW
|
||||||
//#define FIL_MOTION8_PULLUP
|
//#define FIL_MOTION8_PULLUP
|
||||||
//#define FIL_MOTION8_PULLDOWN
|
//#define FIL_MOTION8_PULLDOWN
|
||||||
#endif
|
#endif // FILAMENT_SWITCH_AND_MOTION
|
||||||
#endif
|
#endif // FILAMENT_MOTION_SENSOR
|
||||||
#endif
|
#endif // FILAMENT_RUNOUT_DISTANCE_MM
|
||||||
#endif
|
#endif // FILAMENT_RUNOUT_SENSOR
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================== Bed Leveling ==============================
|
//=============================== Bed Leveling ==============================
|
||||||
@@ -2102,6 +2169,12 @@
|
|||||||
//#define AUTO_BED_LEVELING_UBL
|
//#define AUTO_BED_LEVELING_UBL
|
||||||
//#define MESH_BED_LEVELING
|
//#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.
|
* Commands to execute at the end of G29 probing.
|
||||||
* Useful to retract or move the Z probe out of the way.
|
* Useful to retract or move the Z probe out of the way.
|
||||||
@@ -2250,7 +2323,7 @@
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
#define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed
|
#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 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
|
//#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS
|
||||||
@@ -2273,7 +2346,6 @@
|
|||||||
//#define LCD_BED_TRAMMING
|
//#define LCD_BED_TRAMMING
|
||||||
|
|
||||||
#if ENABLED(LCD_BED_TRAMMING)
|
#if ENABLED(LCD_BED_TRAMMING)
|
||||||
#define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets
|
|
||||||
#define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at tramming points
|
#define BED_TRAMMING_HEIGHT 0.0 // (mm) Z height of nozzle at tramming points
|
||||||
#define BED_TRAMMING_Z_HOP 4.0 // (mm) Z raise between tramming points
|
#define BED_TRAMMING_Z_HOP 4.0 // (mm) Z raise between tramming points
|
||||||
//#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner
|
//#define BED_TRAMMING_INCLUDE_CENTER // Move to the center after the last corner
|
||||||
@@ -2282,6 +2354,8 @@
|
|||||||
#define BED_TRAMMING_PROBE_TOLERANCE 0.1 // (mm)
|
#define BED_TRAMMING_PROBE_TOLERANCE 0.1 // (mm)
|
||||||
#define BED_TRAMMING_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
|
#define BED_TRAMMING_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify
|
||||||
//#define BED_TRAMMING_AUDIO_FEEDBACK
|
//#define BED_TRAMMING_AUDIO_FEEDBACK
|
||||||
|
#else
|
||||||
|
#define BED_TRAMMING_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2451,7 +2525,7 @@
|
|||||||
//
|
//
|
||||||
//#define TEMPERATURE_UNITS_SUPPORT
|
//#define TEMPERATURE_UNITS_SUPPORT
|
||||||
|
|
||||||
// @section temperature
|
// @section temperature presets
|
||||||
|
|
||||||
//
|
//
|
||||||
// Preheat Constants - Up to 10 are supported without changes
|
// Preheat Constants - Up to 10 are supported without changes
|
||||||
@@ -2681,10 +2755,10 @@
|
|||||||
*
|
*
|
||||||
* Select the language to display on the LCD. These languages are available:
|
* Select the language to display on the LCD. These languages are available:
|
||||||
*
|
*
|
||||||
* en, an, bg, ca, cz, da, de, el, el_CY, es, eu, fi, fr, gl, hr, hu, it,
|
* en, an, bg, ca, cz, da, de, el, el_CY, es, eu, fi, fr, gl, hg, hr, hu, id, it,
|
||||||
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
|
* jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW
|
||||||
*
|
*
|
||||||
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek (Greece)', 'el_CY':'Greek (Cyprus)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
|
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek (Greece)', 'el_CY':'Greek (Cyprus)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hg':'Hinglish (Hindi-Latin)', 'hr':'Croatian', 'hu':'Hungarian', 'id':'Indonesian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' }
|
||||||
*/
|
*/
|
||||||
#define LCD_LANGUAGE en
|
#define LCD_LANGUAGE en
|
||||||
|
|
||||||
@@ -2886,13 +2960,15 @@
|
|||||||
//
|
//
|
||||||
//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
|
//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602
|
||||||
|
|
||||||
//
|
/**
|
||||||
// ANET and Tronxy 20x4 Controller
|
* ANET and Tronxy 20x4 Controller
|
||||||
//
|
* LCD2004 display with 5 analog buttons.
|
||||||
//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
*
|
||||||
// This LCD is known to be susceptible to electrical interference
|
* NOTE: Requires ADC_KEYPAD_PIN to be assigned to an analog pin.
|
||||||
// which scrambles the display. Pressing any button clears it up.
|
* This LCD is known to be susceptible to electrical interference which
|
||||||
// This is a LCD2004 display with 5 analog buttons.
|
* scrambles the display. Press any button to clear it up.
|
||||||
|
*/
|
||||||
|
//#define ZONESTAR_LCD
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
|
// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD.
|
||||||
@@ -2967,6 +3043,18 @@
|
|||||||
//
|
//
|
||||||
//#define FF_INTERFACEBOARD
|
//#define FF_INTERFACEBOARD
|
||||||
|
|
||||||
|
//
|
||||||
|
// MightyBoard LCD and Interface
|
||||||
|
//
|
||||||
|
//#define MIGHTYBOARD_LCD
|
||||||
|
#if ENABLED(MIGHTYBOARD_LCD)
|
||||||
|
//#define MIGHTYBOARD_DEBUG // Lightweight debug output for buttons and encoder
|
||||||
|
//#define MIGHTYBOARD_DISABLE_ENC_PULLUP // Enable if the encoder button is unreliable
|
||||||
|
//#define MIGHTYBOARD_BUTTON_PULLUPS // Enable if other buttons are unreliable
|
||||||
|
//#define MIGHTYBOARD_BACK_STATUS_BUTTONS // Use LEFT/RIGHT buttons for Back / Home.
|
||||||
|
// Otherwise they act like encoder down / up.
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// TFT GLCD Panel with Marlin UI
|
// TFT GLCD Panel with Marlin UI
|
||||||
// Panel connected to main board by SPI or I2C interface.
|
// Panel connected to main board by SPI or I2C interface.
|
||||||
@@ -3080,7 +3168,7 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
// FYSETC variant of the MINI12864 graphic controller with SD support
|
// FYSETC variant of the MINI12864 graphic controller with SD support
|
||||||
// https://wiki.fysetc.com/Mini12864_Panel/
|
// https://wiki.fysetc.com/docs/Mini12864Panel
|
||||||
//
|
//
|
||||||
//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
|
//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default
|
||||||
//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
|
//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on)
|
||||||
@@ -3169,14 +3257,14 @@
|
|||||||
//
|
//
|
||||||
// Tiny, but very sharp OLED display
|
// 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
|
//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller
|
||||||
|
|
||||||
//
|
//
|
||||||
// Zonestar OLED 128×64 Full Graphics Controller
|
// Zonestar OLED 128×64 Full Graphics Controller
|
||||||
//
|
//
|
||||||
//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 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
|
//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -3254,7 +3342,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Touch-screen LCD for Malyan M200/M300 printers
|
// LCD for Malyan M200/M300 printers
|
||||||
//
|
//
|
||||||
//#define MALYAN_LCD
|
//#define MALYAN_LCD
|
||||||
|
|
||||||
@@ -3425,20 +3513,22 @@
|
|||||||
|
|
||||||
#if ENABLED(TFT_COLOR_UI)
|
#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.
|
* 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.
|
* UNIFONT - Lightweight font, no anti-aliasing. Supports Latin Extended and non-Latin characters.
|
||||||
* HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only.
|
* HELVETICA - Lightweight font, no anti-aliasing. Supports Basic Latin (0x0020-0x007F) and Latin-1 Supplement (0x0080-0x00FF) characters only.
|
||||||
|
* :['NOTOSANS', 'UNIFONT', 'HELVETICA']
|
||||||
*/
|
*/
|
||||||
#define TFT_FONT NOTOSANS
|
#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
|
* BLUE_MARLIN - Default theme with 'midnight blue' background
|
||||||
* BLACK_MARLIN - Theme with 'black' background
|
* BLACK_MARLIN - Theme with 'black' background
|
||||||
* ANET_BLACK - Theme used for Anet ET4/5
|
* ANET_BLACK - Theme used for Anet ET4/5
|
||||||
|
* :['BLUE_MARLIN', 'BLACK_MARLIN', 'ANET_BLACK']
|
||||||
*/
|
*/
|
||||||
#define TFT_THEME BLACK_MARLIN
|
#define TFT_THEME BLACK_MARLIN
|
||||||
|
|
||||||
@@ -3458,6 +3548,8 @@
|
|||||||
* TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y,
|
* 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_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y,
|
||||||
* TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION
|
* 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
|
//#define TFT_ROTATION TFT_NO_ROTATION
|
||||||
|
|
||||||
@@ -3474,6 +3566,11 @@
|
|||||||
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
|
//#define DWIN_MARLINUI_PORTRAIT // MarlinUI (portrait orientation)
|
||||||
//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
|
//#define DWIN_MARLINUI_LANDSCAPE // MarlinUI (landscape orientation)
|
||||||
|
|
||||||
|
#if ENABLED(DWIN_CREALITY_LCD)
|
||||||
|
//#define USE_STRING_HEADINGS // Use string headings for Creality UI instead of images
|
||||||
|
//#define USE_STRING_TITLES // Use string titles for Creality UI instead of images
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Touch Screen Settings
|
// Touch Screen Settings
|
||||||
//
|
//
|
||||||
@@ -3508,7 +3605,9 @@
|
|||||||
// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
|
// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/
|
||||||
//
|
//
|
||||||
//#define REPRAPWORLD_KEYPAD
|
//#define REPRAPWORLD_KEYPAD
|
||||||
|
#if ENABLED(REPRAPWORLD_KEYPAD)
|
||||||
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// EasyThreeD ET-4000+ with button input and status LED
|
// EasyThreeD ET-4000+ with button input and status LED
|
||||||
@@ -3525,22 +3624,26 @@
|
|||||||
// :[1,2,3,4,5,6,7,8]
|
// :[1,2,3,4,5,6,7,8]
|
||||||
//#define NUM_M106_FANS 1
|
//#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
|
* Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
|
||||||
// is too low, you should also increment SOFT_PWM_SCALE.
|
* 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
|
//#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.
|
* Incrementing this by 1 will double the software PWM frequency, affecting heaters, and
|
||||||
// However, control resolution will be halved for each increment;
|
* the fan if FAN_SOFT_PWM is enabled. However, control resolution will be halved for each
|
||||||
// at zero value, there are 128 effective control positions.
|
* increment; at zero value, there are 128 effective control positions.
|
||||||
// :[0,1,2,3,4,5,6,7]
|
* :[0,1,2,3,4,5,6,7]
|
||||||
|
*/
|
||||||
#define SOFT_PWM_SCALE 0
|
#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,
|
* If SOFT_PWM_SCALE is set to a value higher than 0, dithering can be used to mitigate the
|
||||||
// some of the PWM cycles are stretched so on average the desired
|
* associated resolution loss. If enabled, some of the PWM cycles are stretched so on average
|
||||||
// duty cycle is attained.
|
* the desired duty cycle is attained.
|
||||||
|
*/
|
||||||
//#define SOFT_PWM_DITHER
|
//#define SOFT_PWM_DITHER
|
||||||
|
|
||||||
// @section extras
|
// @section extras
|
||||||
@@ -3550,9 +3653,11 @@
|
|||||||
|
|
||||||
// @section lights
|
// @section lights
|
||||||
|
|
||||||
// Temperature status LEDs that display the hotend and bed temperature.
|
/**
|
||||||
// If all hotends, bed temperature, and target temperature are under 54C
|
* Temperature status LEDs that display the hotend and bed temperature.
|
||||||
// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis)
|
* 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
|
//#define TEMP_STAT_LEDS
|
||||||
|
|
||||||
// Support for BlinkM/CyzRgb
|
// Support for BlinkM/CyzRgb
|
||||||
|
|||||||
+340
-132
@@ -177,6 +177,7 @@
|
|||||||
//#define MAX31865_SENSOR_WIRES_0 2 // (2-4) Number of wires for the probe connected to a MAX31865 board.
|
//#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_1 2
|
||||||
//#define MAX31865_SENSOR_WIRES_2 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_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.
|
//#define MAX31865_USE_READ_ERROR_DETECTION // Treat value spikes (20°C delta in under 1s) as read errors.
|
||||||
@@ -188,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_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_1 0.0f
|
||||||
//#define MAX31865_WIRE_OHMS_2 0.0f
|
//#define MAX31865_WIRE_OHMS_2 0.0f
|
||||||
|
//#define MAX31865_WIRE_OHMS_BED 0.0f
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hephestos 2 24V heated bed upgrade kit.
|
* Hephestos 2 24V heated bed upgrade kit.
|
||||||
@@ -211,6 +213,12 @@
|
|||||||
//
|
//
|
||||||
// Heated Chamber options
|
// Heated Chamber options
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#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)
|
#if DISABLED(PIDTEMPCHAMBER)
|
||||||
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
#define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control
|
||||||
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
#if ENABLED(CHAMBER_LIMIT_SWITCHING)
|
||||||
@@ -218,11 +226,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#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)
|
|
||||||
|
|
||||||
//#define CHAMBER_FAN // Enable a fan on the chamber
|
//#define CHAMBER_FAN // Enable a fan on the chamber
|
||||||
#if ENABLED(CHAMBER_FAN)
|
#if ENABLED(CHAMBER_FAN)
|
||||||
//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
|
//#define CHAMBER_FAN_INDEX 2 // Index of a fan to repurpose as the chamber fan. (Default: first unused fan)
|
||||||
@@ -294,7 +297,7 @@
|
|||||||
* protect against a broken or disconnected thermistor wire.
|
* protect against a broken or disconnected thermistor wire.
|
||||||
*
|
*
|
||||||
* The issue: If a thermistor falls out, it will report the much lower
|
* The issue: If a thermistor falls out, it will report the much lower
|
||||||
* temperature of the air in the room, and the the firmware will keep
|
* temperature of the air in the room, and the firmware will keep
|
||||||
* the heater on.
|
* the heater on.
|
||||||
*
|
*
|
||||||
* The solution: Once the temperature reaches the target, start observing.
|
* The solution: Once the temperature reaches the target, start observing.
|
||||||
@@ -412,14 +415,19 @@
|
|||||||
// A well-chosen Kc value should add just enough power to melt the increased material volume.
|
// A well-chosen Kc value should add just enough power to melt the increased material volume.
|
||||||
//#define PID_EXTRUSION_SCALING
|
//#define PID_EXTRUSION_SCALING
|
||||||
#if ENABLED(PID_EXTRUSION_SCALING)
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
||||||
#define DEFAULT_Kc (100) // heating power = Kc * e_speed
|
|
||||||
#define LPQ_MAX_LEN 50
|
#define LPQ_MAX_LEN 50
|
||||||
|
#define DEFAULT_KC 100 // heating power = Kc * e_speed
|
||||||
|
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||||
|
// Specify up to one value per hotend here, according to your setup.
|
||||||
|
// If there are fewer values, the last one applies to the remaining hotends.
|
||||||
|
#define DEFAULT_KC_LIST { DEFAULT_KC, DEFAULT_KC } // heating power = Kc * e_speed
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an additional term to the heater power, proportional to the fan speed.
|
* Add an additional term to the heater power, proportional to the fan speed.
|
||||||
* A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
|
* A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan.
|
||||||
* You can either just add a constant compensation with the DEFAULT_Kf value
|
* You can either just add a constant compensation with the DEFAULT_KF value
|
||||||
* or follow the instruction below to get speed-dependent compensation.
|
* or follow the instruction below to get speed-dependent compensation.
|
||||||
*
|
*
|
||||||
* Constant compensation (use only with fan speeds of 0% and 100%)
|
* Constant compensation (use only with fan speeds of 0% and 100%)
|
||||||
@@ -450,21 +458,26 @@
|
|||||||
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
|
#if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION)
|
||||||
// The alternative definition is used for an easier configuration.
|
// The alternative definition is used for an easier configuration.
|
||||||
// Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED.
|
// Just figure out Kf at full speed (255) and PID_FAN_SCALING_MIN_SPEED.
|
||||||
// DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
|
// DEFAULT_KF and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly.
|
||||||
|
|
||||||
#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf
|
#define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_KF
|
||||||
#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf
|
#define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_KF
|
||||||
#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
|
#define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING
|
||||||
|
|
||||||
#define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
|
#define DEFAULT_KF (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED)
|
||||||
#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0
|
#define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_KF)/255.0
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define PID_FAN_SCALING_LIN_FACTOR (0) // Power-loss due to cooling = Kf * (fan_speed)
|
#define PID_FAN_SCALING_LIN_FACTOR (0) // Power-loss due to cooling = Kf * (fan_speed)
|
||||||
#define DEFAULT_Kf 10 // A constant value added to the PID-tuner
|
#define DEFAULT_KF 10 // A constant value added to the PID-tuner
|
||||||
#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
|
#define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||||
|
// Specify up to one value per hotend here, according to your setup.
|
||||||
|
// If there are fewer values, the last one applies to the remaining hotends.
|
||||||
|
#define DEFAULT_KF_LIST { DEFAULT_KF, DEFAULT_KF }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -775,7 +788,7 @@
|
|||||||
|
|
||||||
// @section endstops
|
// @section endstops
|
||||||
|
|
||||||
// If you want endstops to stay on (by default) even when not homing
|
// If you want endstops to stay on (by default) even when not homing,
|
||||||
// enable this option. Override at any time with M120, M121.
|
// enable this option. Override at any time with M120, M121.
|
||||||
//#define ENDSTOPS_ALWAYS_ON_DEFAULT
|
//#define ENDSTOPS_ALWAYS_ON_DEFAULT
|
||||||
|
|
||||||
@@ -1019,7 +1032,7 @@
|
|||||||
|
|
||||||
#endif // BLTOUCH
|
#endif // BLTOUCH
|
||||||
|
|
||||||
// @section calibration
|
// @section calibrate
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Z Steppers Auto-Alignment
|
* Z Steppers Auto-Alignment
|
||||||
@@ -1078,11 +1091,26 @@
|
|||||||
#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
|
#define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle
|
||||||
#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
|
#define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment
|
||||||
#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
|
#define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this
|
||||||
|
|
||||||
#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
|
#define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done?
|
||||||
|
|
||||||
// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
|
// After G34, re-home Z (G28 Z) or just calculate it from the last probe heights?
|
||||||
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
|
// Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed.
|
||||||
#define HOME_AFTER_G34
|
#define HOME_AFTER_G34
|
||||||
#endif
|
|
||||||
|
/**
|
||||||
|
* Commands to execute at the start of G34 probing,
|
||||||
|
* after switching to the PROBING_TOOL.
|
||||||
|
*/
|
||||||
|
//#define EVENT_GCODE_BEFORE_G34 "M300 P440 S200"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Commands to execute at the end of G34 probing.
|
||||||
|
* Useful to retract or move the Z probe out of the way.
|
||||||
|
*/
|
||||||
|
//#define EVENT_GCODE_AFTER_G34 "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10"
|
||||||
|
|
||||||
|
#endif // Z_STEPPER_AUTO_ALIGN
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assisted Tramming
|
* Assisted Tramming
|
||||||
@@ -1125,67 +1153,111 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Fixed-time-based Motion Control -- BETA FEATURE
|
* Fixed-time-based Motion Control -- BETA FEATURE
|
||||||
* Enable/disable and set parameters with G-code M493.
|
* Enable/disable and set parameters with G-code M493 and M494.
|
||||||
* See ft_types.h for named values used by FTM options.
|
* See ft_types.h for named values used by FTM options.
|
||||||
*/
|
*/
|
||||||
//#define FT_MOTION
|
//#define FT_MOTION
|
||||||
#if ENABLED(FT_MOTION)
|
#if ENABLED(FT_MOTION)
|
||||||
//#define FTM_IS_DEFAULT_MOTION // Use FT Motion as the factory default?
|
//#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 FT_MOTION_MENU // Provide a MarlinUI menu to set M493 and M494 parameters
|
||||||
#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. (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
|
|
||||||
|
|
||||||
|
//#define NO_STANDARD_MOTION // Disable the standard motion system entirely to save Flash and RAM
|
||||||
|
#if DISABLED(NO_STANDARD_MOTION)
|
||||||
|
//#define FTM_HOME_AND_PROBE // Use FT Motion for homing / probing. Disable if FT Motion breaks these functions.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//#define FTM_DYNAMIC_FREQ // Enable for linear adjustment of XY shaping frequency according to Z or E
|
||||||
|
#if ENABLED(FTM_DYNAMIC_FREQ)
|
||||||
|
#define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (DISABLED, Z_BASED, MASS_BASED)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Disable unused shapers if you need more free space
|
||||||
|
#define FTM_SHAPER_ZV
|
||||||
|
#define FTM_SHAPER_ZVD
|
||||||
|
#define FTM_SHAPER_ZVDD
|
||||||
|
#define FTM_SHAPER_ZVDDD
|
||||||
|
#define FTM_SHAPER_EI
|
||||||
|
#define FTM_SHAPER_2HEI
|
||||||
|
#define FTM_SHAPER_3HEI
|
||||||
|
#define FTM_SHAPER_MZV
|
||||||
|
|
||||||
|
#define FTM_DEFAULT_SHAPER_X ftMotionShaper_NONE // Default shaper mode on X axis (NONE, ZV, ZVD, ZVDD, ZVDDD, EI, 2HEI, 3HEI, MZV)
|
||||||
|
#define FTM_SHAPING_DEFAULT_FREQ_X 37.0f // (Hz) Default peak frequency used by input shapers
|
||||||
|
#define FTM_SHAPING_ZETA_X 0.1f // Zeta used by input shapers for X axis
|
||||||
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
|
#define FTM_SHAPING_V_TOL_X 0.05f // Vibration tolerance used by EI input shapers for X axis
|
||||||
|
|
||||||
|
#define FTM_DEFAULT_SHAPER_Y ftMotionShaper_NONE // Default shaper mode on Y axis
|
||||||
|
#define FTM_SHAPING_DEFAULT_FREQ_Y 37.0f // (Hz) Default peak frequency used by input shapers
|
||||||
|
#define FTM_SHAPING_ZETA_Y 0.1f // Zeta used by input shapers for Y axis
|
||||||
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
#define FTM_SHAPING_V_TOL_Y 0.05f // Vibration tolerance used by EI input shapers for Y axis
|
||||||
|
|
||||||
//#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters
|
//#define FTM_SHAPER_Z // Include Z shaping support
|
||||||
|
#define FTM_DEFAULT_SHAPER_Z ftMotionShaper_NONE // Default shaper mode on Z axis
|
||||||
|
#define FTM_SHAPING_DEFAULT_FREQ_Z 21.0f // (Hz) Default peak frequency used by input shapers
|
||||||
|
#define FTM_SHAPING_ZETA_Z 0.03f // Zeta used by input shapers for Z axis
|
||||||
|
#define FTM_SHAPING_V_TOL_Z 0.05f // Vibration tolerance used by EI input shapers for Z axis
|
||||||
|
|
||||||
|
//#define FTM_SHAPER_E // Include E shaping support
|
||||||
|
// Required to synchronize extruder with XYZ (better quality)
|
||||||
|
#define FTM_DEFAULT_SHAPER_E ftMotionShaper_NONE // Default shaper mode on Extruder axis
|
||||||
|
#define FTM_SHAPING_DEFAULT_FREQ_E 21.0f // (Hz) Default peak frequency used by input shapers
|
||||||
|
#define FTM_SHAPING_ZETA_E 0.03f // Zeta used by input shapers for E axis
|
||||||
|
#define FTM_SHAPING_V_TOL_E 0.05f // Vibration tolerance used by EI input shapers for E axis
|
||||||
|
|
||||||
|
//#define FTM_RESONANCE_TEST // Sine sweep motion for resonance study
|
||||||
|
|
||||||
|
//#define FTM_SMOOTHING // Smoothing can reduce artifacts and make steppers quieter
|
||||||
|
// on sharp corners, but too much will round corners.
|
||||||
|
#if ENABLED(FTM_SMOOTHING)
|
||||||
|
#define FTM_MAX_SMOOTHING_TIME 0.10f // (s) Maximum smoothing time. Higher values consume more RAM.
|
||||||
|
// Increase smoothing time to reduce jerky motion, ghosting and noises.
|
||||||
|
#define FTM_SMOOTHING_TIME_X 0.00f // (s) Smoothing time for X axis. Zero means disabled.
|
||||||
|
#define FTM_SMOOTHING_TIME_Y 0.00f // (s) Smoothing time for Y axis
|
||||||
|
#define FTM_SMOOTHING_TIME_Z 0.00f // (s) Smoothing time for Z axis
|
||||||
|
#define FTM_SMOOTHING_TIME_E 0.02f // (s) Smoothing time for E axis. Prevents noise/skipping from LA by
|
||||||
|
// smoothing acceleration peaks, which may also smooth curved surfaces.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FTM_POLYS // Disable POLY5/6 to save ~3k of Flash. Preserves TRAPEZOIDAL.
|
||||||
|
#if ENABLED(FTM_POLYS)
|
||||||
|
#define FTM_TRAJECTORY_TYPE TRAPEZOIDAL // Block acceleration profile (TRAPEZOIDAL, POLY5, POLY6)
|
||||||
|
// TRAPEZOIDAL: Continuous Velocity. Max acceleration is respected.
|
||||||
|
// POLY5: Like POLY6 with 1.5x but uses less CPU.
|
||||||
|
// POLY6: Continuous Acceleration (aka S_CURVE).
|
||||||
|
// POLY trajectories not only reduce resonances without rounding corners, but also
|
||||||
|
// reduce extruder strain due to linear advance.
|
||||||
|
|
||||||
|
#define FTM_POLY6_ACCELERATION_OVERSHOOT 1.875f // Max acceleration overshoot factor for POLY6 (1.25 to 1.875)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advanced configuration
|
* Advanced configuration
|
||||||
*/
|
*/
|
||||||
#define FTM_UNIFIED_BWS // DON'T DISABLE unless you use Ulendo FBS (not implemented)
|
#define FTM_BUFFER_SIZE 128 // Window size for trajectory generation, must be a power of 2 (e.g 64, 128, 256, ...)
|
||||||
#if ENABLED(FTM_UNIFIED_BWS)
|
// The total buffered time in seconds is (FTM_BUFFER_SIZE/FTM_FS)
|
||||||
#define FTM_BW_SIZE 100 // Unified Window and Batch size with a ratio of 2
|
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation.
|
||||||
#else
|
#define FTM_MIN_SHAPE_FREQ 20 // (Hz) Minimum shaping frequency, lower consumes more RAM
|
||||||
#define FTM_WINDOW_SIZE 200 // Custom Window size for trajectory generation needed by Ulendo FBS
|
|
||||||
#define FTM_BATCH_SIZE 100 // Custom Batch size for trajectory generation needed by Ulendo FBS
|
/**
|
||||||
|
* TMC2208 / TMC2208_STANDALONE drivers require a brief pause after a DIR change
|
||||||
|
* to prevent a standstill shutdown when using StealthChop (the standalone default).
|
||||||
|
* These options cause FT Motion to delay for > 750µs after a DIR change on a given axis.
|
||||||
|
* Disable only if you are certain that this can never happen with your TMC2208s.
|
||||||
|
*/
|
||||||
|
#if AXIS_DRIVER_TYPE_X(TMC2208) || AXIS_DRIVER_TYPE_X(TMC2208_STANDALONE)
|
||||||
|
#define FTM_DIR_CHANGE_HOLD_X
|
||||||
|
#endif
|
||||||
|
#if AXIS_DRIVER_TYPE_Y(TMC2208) || AXIS_DRIVER_TYPE_Y(TMC2208_STANDALONE)
|
||||||
|
#define FTM_DIR_CHANGE_HOLD_Y
|
||||||
|
#endif
|
||||||
|
#if AXIS_DRIVER_TYPE_Z(TMC2208) || AXIS_DRIVER_TYPE_Z(TMC2208_STANDALONE)
|
||||||
|
#define FTM_DIR_CHANGE_HOLD_Z
|
||||||
|
#endif
|
||||||
|
#if HAS_E_DRIVER(TMC2208) || HAS_E_DRIVER(TMC2208_STANDALONE)
|
||||||
|
#define FTM_DIR_CHANGE_HOLD_E
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (Reciprocal of FTM_TS)
|
#endif // FT_MOTION
|
||||||
#define FTM_TS 0.001f // (s) Time step for trajectory generation. (Reciprocal of FTM_FS)
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
#else
|
|
||||||
// CoreXY motion needs a larger buffer size. These values are based on our testing.
|
|
||||||
#define FTM_STEPPER_FS 30000
|
|
||||||
#define FTM_STEPPERCMD_BUFF_SIZE 6000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FTM_STEPS_PER_UNIT_TIME (FTM_STEPPER_FS / FTM_FS) // Interpolated stepper commands per unit time
|
|
||||||
#define FTM_CTS_COMPARE_VAL (FTM_STEPS_PER_UNIT_TIME / 2) // Comparison value used in interpolation algorithm
|
|
||||||
#define FTM_MIN_TICKS ((STEPPER_TIMER_RATE) / (FTM_STEPPER_FS)) // Minimum stepper ticks between steps
|
|
||||||
|
|
||||||
#define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency
|
|
||||||
#define FTM_RATIO (FTM_FS / FTM_MIN_SHAPE_FREQ) // Factor for use in FTM_ZMAX. DON'T CHANGE.
|
|
||||||
#define FTM_ZMAX (FTM_RATIO * 2) // Maximum delays for shaping functions (even numbers only!)
|
|
||||||
// Calculate as:
|
|
||||||
// ZV : FTM_RATIO / 2
|
|
||||||
// ZVD, MZV : FTM_RATIO
|
|
||||||
// 2HEI : FTM_RATIO * 3 / 2
|
|
||||||
// 3HEI : FTM_RATIO * 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input Shaping
|
* Input Shaping
|
||||||
@@ -1260,8 +1332,8 @@
|
|||||||
#define DISABLE_IDLE_E // Shut down all idle extruders
|
#define DISABLE_IDLE_E // Shut down all idle extruders
|
||||||
|
|
||||||
// Default Minimum Feedrates for printing and travel moves
|
// 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_MINIMUMFEEDRATE 0.0 // (mm/s) 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_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
|
// Minimum time that a segment needs to take as the buffer gets emptied
|
||||||
#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B.
|
#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B.
|
||||||
@@ -1339,20 +1411,20 @@
|
|||||||
//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
|
//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
|
||||||
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
|
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"
|
||||||
|
|
||||||
#define CALIBRATION_FEEDRATE_SLOW 60 // mm/min
|
#define CALIBRATION_FEEDRATE_SLOW 60 // (mm/min)
|
||||||
#define CALIBRATION_FEEDRATE_FAST 1200 // mm/min
|
#define CALIBRATION_FEEDRATE_FAST 1200 // (mm/min)
|
||||||
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min
|
#define CALIBRATION_FEEDRATE_TRAVEL 3000 // (mm/min)
|
||||||
|
|
||||||
// The following parameters refer to the conical section of the nozzle tip.
|
// The following parameters refer to the conical section of the nozzle tip.
|
||||||
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm
|
#define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // (mm)
|
||||||
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm
|
#define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // (mm)
|
||||||
|
|
||||||
// Uncomment to enable reporting (required for "G425 V", but consumes flash).
|
// Uncomment to enable reporting (required for "G425 V", but consumes flash).
|
||||||
//#define CALIBRATION_REPORTING
|
//#define CALIBRATION_REPORTING
|
||||||
|
|
||||||
// The true location and dimension the cube/bolt/washer on the bed.
|
// 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_CENTER { 264.0, -22.0, -2.0 } // (mm)
|
||||||
#define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.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
|
// Comment out any sides which are unreachable by the probe. For best
|
||||||
// auto-calibration results, all sides must be reachable.
|
// auto-calibration results, all sides must be reachable.
|
||||||
@@ -1473,6 +1545,9 @@
|
|||||||
|
|
||||||
// @section lcd
|
// @section lcd
|
||||||
|
|
||||||
|
// Turn off the display blinking that warns about possible accuracy reduction
|
||||||
|
//#define DISABLE_REDUCED_ACCURACY_WARNING
|
||||||
|
|
||||||
#if HAS_MANUAL_MOVE_MENU
|
#if HAS_MANUAL_MOVE_MENU
|
||||||
#define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel
|
#define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel
|
||||||
#define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
|
#define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines
|
||||||
@@ -1542,12 +1617,13 @@
|
|||||||
#define XATC_Z_OFFSETS { 0, 0, 0 } // Z offsets for X axis sample points
|
#define XATC_Z_OFFSETS { 0, 0, 0 } // Z offsets for X axis sample points
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif // HAS_BED_PROBE
|
||||||
|
|
||||||
// Include a page of printer information in the LCD Main Menu
|
// Include a page of printer information in the LCD Main Menu
|
||||||
//#define LCD_INFO_MENU
|
//#define LCD_INFO_MENU
|
||||||
#if ENABLED(LCD_INFO_MENU)
|
#if ENABLED(LCD_INFO_MENU)
|
||||||
//#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages
|
//#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
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1603,7 +1679,7 @@
|
|||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
|
//#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash.
|
||||||
#endif
|
#endif
|
||||||
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780)
|
#if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780, HAS_GRAPHICAL_TFT)
|
||||||
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
|
//#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup.
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1615,6 +1691,10 @@
|
|||||||
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
|
//#define SOUND_MENU_ITEM // Add a mute option to the LCD menu
|
||||||
#define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state
|
#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
|
#if HAS_WIRED_LCD
|
||||||
//#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards.
|
//#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards.
|
||||||
#endif
|
#endif
|
||||||
@@ -1665,11 +1745,12 @@
|
|||||||
|
|
||||||
#endif // HAS_DISPLAY
|
#endif // HAS_DISPLAY
|
||||||
|
|
||||||
#if HAS_FEEDRATE_EDIT
|
// Some displays offer Feedrate / Flow editing.
|
||||||
|
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN, ULTIPANEL_FEEDMULTIPLY)
|
||||||
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
|
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
|
||||||
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
|
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
|
||||||
#endif
|
#endif
|
||||||
#if HAS_FLOW_EDIT
|
#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
|
||||||
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
|
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
|
||||||
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
|
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
|
||||||
#endif
|
#endif
|
||||||
@@ -1720,6 +1801,12 @@
|
|||||||
*/
|
*/
|
||||||
//#define SD_SPI_SPEED SPI_HALF_SPEED
|
//#define SD_SPI_SPEED SPI_HALF_SPEED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reinit the LCD after SD Card insert/remove or when entering the menu.
|
||||||
|
* Required for some LCDs that use shared SPI with an external SD Card reader.
|
||||||
|
*/
|
||||||
|
#define REINIT_NOISY_LCD
|
||||||
|
|
||||||
// The standard SD detect circuit reads LOW when media is inserted and HIGH when empty.
|
// The standard SD detect circuit reads LOW when media is inserted and HIGH when empty.
|
||||||
// Enable this option and set to HIGH if your SD cards are incorrectly detected.
|
// Enable this option and set to HIGH if your SD cards are incorrectly detected.
|
||||||
//#define SD_DETECT_STATE HIGH
|
//#define SD_DETECT_STATE HIGH
|
||||||
@@ -1754,6 +1841,14 @@
|
|||||||
#define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination
|
#define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Priming for the Remaining Time estimate
|
||||||
|
* Long processes at the start of a G-code file can skew the Remaining Time estimate.
|
||||||
|
* Enable these options to start this estimation at a later point in the G-code file.
|
||||||
|
*/
|
||||||
|
//#define REMAINING_TIME_PRIME // Provide G-code 'M75 R' to prime the Remaining Time estimate
|
||||||
|
//#define REMAINING_TIME_AUTOPRIME // Prime the Remaining Time estimate later (e.g., at the end of 'M109')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Continue after Power-Loss (Creality3D)
|
* Continue after Power-Loss (Creality3D)
|
||||||
*
|
*
|
||||||
@@ -1765,6 +1860,8 @@
|
|||||||
//#define POWER_LOSS_RECOVERY
|
//#define POWER_LOSS_RECOVERY
|
||||||
#if ENABLED(POWER_LOSS_RECOVERY)
|
#if ENABLED(POWER_LOSS_RECOVERY)
|
||||||
#define PLR_ENABLED_DEFAULT false // Power-Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
|
#define PLR_ENABLED_DEFAULT false // Power-Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
|
||||||
|
//#define PLR_HEAT_BED_ON_REBOOT // Heat up bed immediately on reboot to mitigate object detaching/warping.
|
||||||
|
//#define PLR_HEAT_BED_EXTRA 0 // (°C) Relative increase of bed temperature for better adhesion (limited by max temp).
|
||||||
//#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable)
|
//#define PLR_BED_THRESHOLD BED_MAXTEMP // (°C) Skip user confirmation at or above this bed temperature (0 to disable)
|
||||||
|
|
||||||
//#define POWER_LOSS_PIN 44 // Pin to detect power-loss. Set to -1 to disable default pin on boards without module, or comment to use board default.
|
//#define POWER_LOSS_PIN 44 // Pin to detect power-loss. Set to -1 to disable default pin on boards without module, or comment to use board default.
|
||||||
@@ -1818,17 +1915,22 @@
|
|||||||
|
|
||||||
// SD Card Sorting options
|
// SD Card Sorting options
|
||||||
#if ENABLED(SDCARD_SORT_ALPHA)
|
#if ENABLED(SDCARD_SORT_ALPHA)
|
||||||
|
#define SDSORT_QUICK true // Use Quick Sort as a sorting algorithm. Otherwise use Bubble Sort.
|
||||||
#define SDSORT_REVERSE false // Default to sorting file names in reverse order.
|
#define SDSORT_REVERSE false // Default to sorting file names in reverse order.
|
||||||
#define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each.
|
#define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each.
|
||||||
#define SDSORT_FOLDERS -1 // -1=above 0=none 1=below
|
#define SDSORT_FOLDERS -1 // -1=above 0=none 1=below
|
||||||
#define SDSORT_GCODE false // Enable G-code M34 to set sorting behaviors: M34 S<-1|0|1> F<-1|0|1>
|
#define SDSORT_GCODE false // Enable G-code M34 to set sorting behaviors: M34 S<-1|0|1> F<-1|0|1>
|
||||||
#define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting.
|
|
||||||
#define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
|
#define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
|
||||||
|
#define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting.
|
||||||
|
#if ENABLED(SDSORT_USES_RAM)
|
||||||
#define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option.
|
#define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option.
|
||||||
|
#if ENABLED(SDSORT_CACHE_NAMES)
|
||||||
#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
|
#define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
|
||||||
#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
|
#define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting.
|
||||||
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
|
// Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// Allow international symbols in long filenames. To display correctly, the
|
// Allow international symbols in long filenames. To display correctly, the
|
||||||
// LCD's font must contain the characters. Check your selected LCD language.
|
// LCD's font must contain the characters. Check your selected LCD language.
|
||||||
@@ -1866,7 +1968,7 @@
|
|||||||
*
|
*
|
||||||
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
|
* SCLK, MOSI, MISO --> SCLK, MOSI, MISO
|
||||||
* INT --> SD_DETECT_PIN [1]
|
* INT --> SD_DETECT_PIN [1]
|
||||||
* SS --> SDSS
|
* SS --> SD_SS_PIN
|
||||||
*
|
*
|
||||||
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
|
* [1] On AVR an interrupt-capable pin is best for UHS3 compatibility.
|
||||||
*/
|
*/
|
||||||
@@ -1893,7 +1995,7 @@
|
|||||||
//#define USE_OTG_USB_HOST
|
//#define USE_OTG_USB_HOST
|
||||||
|
|
||||||
#if DISABLED(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
|
#define USB_INTR_PIN SD_DETECT_PIN
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@@ -1930,6 +2032,9 @@
|
|||||||
//#define CUSTOM_FIRMWARE_UPLOAD
|
//#define CUSTOM_FIRMWARE_UPLOAD
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// "Over-the-air" Firmware Update with M936 - Required to set EEPROM flag
|
||||||
|
//#define OTA_FIRMWARE_UPDATE
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set this option to one of the following (or the board's defaults apply):
|
* Set this option to one of the following (or the board's defaults apply):
|
||||||
*
|
*
|
||||||
@@ -1952,8 +2057,8 @@
|
|||||||
#if ENABLED(MULTI_VOLUME)
|
#if ENABLED(MULTI_VOLUME)
|
||||||
#define VOLUME_SD_ONBOARD
|
#define VOLUME_SD_ONBOARD
|
||||||
#define VOLUME_USB_FLASH_DRIVE
|
#define VOLUME_USB_FLASH_DRIVE
|
||||||
#define DEFAULT_VOLUME SV_SD_ONBOARD
|
#define DEFAULT_VOLUME SD_ONBOARD // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
||||||
#define DEFAULT_SHARED_VOLUME SV_USB_FLASH_DRIVE
|
#define DEFAULT_SHARED_VOLUME USB_FLASH_DRIVE // :[ 'SD_ONBOARD', 'USB_FLASH_DRIVE' ]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // HAS_MEDIA
|
#endif // HAS_MEDIA
|
||||||
@@ -2004,7 +2109,7 @@
|
|||||||
#if IS_U8GLIB_ST7920
|
#if IS_U8GLIB_ST7920
|
||||||
// Enable this option and reduce the value to optimize screen updates.
|
// 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.
|
// 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
|
//#define LIGHTWEIGHT_UI
|
||||||
#if ENABLED(LIGHTWEIGHT_UI)
|
#if ENABLED(LIGHTWEIGHT_UI)
|
||||||
@@ -2034,17 +2139,17 @@
|
|||||||
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
|
//#define STATUS_HEAT_PERCENT // Show heating in a progress bar
|
||||||
//#define STATUS_HEAT_POWER // Show heater output power as a vertical 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
|
#endif // HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB || IS_DWIN_MARLINUI
|
#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 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
|
//#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
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -2223,7 +2328,7 @@
|
|||||||
|
|
||||||
// Developer menu (accessed by touching "About Printer" copyright text)
|
// Developer menu (accessed by touching "About Printer" copyright text)
|
||||||
//#define TOUCH_UI_DEVELOPER_MENU
|
//#define TOUCH_UI_DEVELOPER_MENU
|
||||||
#endif
|
#endif // TOUCH_UI_FTDI_EVE
|
||||||
|
|
||||||
//
|
//
|
||||||
// Classic UI Options
|
// Classic UI Options
|
||||||
@@ -2257,9 +2362,11 @@
|
|||||||
// ADC Button Debounce
|
// ADC Button Debounce
|
||||||
//
|
//
|
||||||
#if HAS_ADC_BUTTONS
|
#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
|
#endif
|
||||||
|
|
||||||
|
//#define FAST_BUTTON_POLLING // Poll buttons at ~1kHz on 8-bit AVR. Set to 'false' for slow polling on 32-bit.
|
||||||
|
|
||||||
// @section safety
|
// @section safety
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2276,7 +2383,7 @@
|
|||||||
//#define WATCHDOG_RESET_MANUAL
|
//#define WATCHDOG_RESET_MANUAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section lcd
|
// @section baby-stepping
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Babystepping enables movement of the axes by tiny increments without changing
|
* Babystepping enables movement of the axes by tiny increments without changing
|
||||||
@@ -2298,7 +2405,7 @@
|
|||||||
|
|
||||||
//#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
|
//#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping.
|
||||||
#if ENABLED(DOUBLECLICK_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.
|
// 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.
|
//#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle.
|
||||||
#if ENABLED(MOVE_Z_WHEN_IDLE)
|
#if ENABLED(MOVE_Z_WHEN_IDLE)
|
||||||
@@ -2333,15 +2440,37 @@
|
|||||||
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
|
* See https://marlinfw.org/docs/features/lin_advance.html for full instructions.
|
||||||
*/
|
*/
|
||||||
//#define LIN_ADVANCE
|
//#define LIN_ADVANCE
|
||||||
#if ENABLED(LIN_ADVANCE)
|
|
||||||
|
#if ANY(LIN_ADVANCE, FT_MOTION)
|
||||||
#if ENABLED(DISTINCT_E_FACTORS)
|
#if ENABLED(DISTINCT_E_FACTORS)
|
||||||
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder
|
#define ADVANCE_K { 0.22 } // (mm) Compression length per 1mm/s extruder speed, per extruder. Override with 'M900 T<tool> K<mm>'.
|
||||||
#else
|
#else
|
||||||
#define ADVANCE_K 0.22 // (mm) Compression length applying to all extruders
|
#define ADVANCE_K 0.22 // (mm) Compression length for all extruders. Override with 'M900 K<mm>'.
|
||||||
#endif
|
#endif
|
||||||
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with M900 L.
|
//#define ADVANCE_K_EXTRA // Add a second linear advance constant, configurable with 'M900 L'.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ENABLED(LIN_ADVANCE)
|
||||||
//#define LA_DEBUG // Print debug information to serial during operation. Disable for production use.
|
//#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 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.02 } // (s) Smoothing time to reduce extruder acceleration, per extruder
|
||||||
|
#else
|
||||||
|
#define ADVANCE_TAU 0.02 // (s) Smoothing time to reduce extruder acceleration
|
||||||
|
#endif
|
||||||
|
#define SMOOTH_LIN_ADV_HZ 1000 // (Hz) How often to update extruder speed
|
||||||
|
#define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2352,6 +2481,9 @@
|
|||||||
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
|
||||||
*/
|
*/
|
||||||
//#define NONLINEAR_EXTRUSION
|
//#define NONLINEAR_EXTRUSION
|
||||||
|
#if ENABLED(NONLINEAR_EXTRUSION)
|
||||||
|
//#define NONLINEAR_EXTRUSION_DEFAULT_ON // Enable if NLE should be ON by default
|
||||||
|
#endif
|
||||||
|
|
||||||
// @section leveling
|
// @section leveling
|
||||||
|
|
||||||
@@ -2504,13 +2636,15 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif // PTC_PROBE || PTC_BED || PTC_HOTEND
|
#endif // PTC_PROBE || PTC_BED || PTC_HOTEND
|
||||||
|
|
||||||
// @section extras
|
// @section gcode
|
||||||
|
|
||||||
//
|
//
|
||||||
// G60/G61 Position Save and Return
|
// G60/G61 Position Save and Return
|
||||||
//
|
//
|
||||||
//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes
|
//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes
|
||||||
|
|
||||||
|
// @section motion
|
||||||
|
|
||||||
//
|
//
|
||||||
// G2/G3 Arc Support
|
// G2/G3 Arc Support
|
||||||
//
|
//
|
||||||
@@ -2542,6 +2676,8 @@
|
|||||||
*/
|
*/
|
||||||
//#define DIRECT_STEPPING
|
//#define DIRECT_STEPPING
|
||||||
|
|
||||||
|
// @section calibrate
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* G38 Probe Target
|
* G38 Probe Target
|
||||||
*
|
*
|
||||||
@@ -2630,19 +2766,23 @@
|
|||||||
#define MAX_CMD_SIZE 96
|
#define MAX_CMD_SIZE 96
|
||||||
#define BUFSIZE 4
|
#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.
|
* Host Transmit Buffer Size
|
||||||
// To buffer a simple "ok" you need 4 bytes.
|
* - Costs 386 bytes of flash and TX_BUFFER_SIZE+3 bytes of SRAM (if not 0).
|
||||||
// For ADVANCED_OK (M105) you need 32 bytes.
|
* - 4 bytes required to buffer a simple "ok".
|
||||||
// For debug-echo: 128 bytes for the optimal speed.
|
* - 32 bytes for ADVANCED_OK (M105).
|
||||||
// Other output doesn't need to be that speedy.
|
* - 128 bytes for the optimal speed of 'debug-echo:'
|
||||||
// :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
* - Other output doesn't need to be that speedy.
|
||||||
|
* :[0, 2, 4, 8, 16, 32, 64, 128, 256]
|
||||||
|
*/
|
||||||
#define TX_BUFFER_SIZE 0
|
#define TX_BUFFER_SIZE 0
|
||||||
|
|
||||||
// Host Receive Buffer Size
|
/**
|
||||||
// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
* Host Receive Buffer Size
|
||||||
// To use flow control, set this buffer size to at least 1024 bytes.
|
* Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
|
||||||
// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
|
* 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
|
//#define RX_BUFFER_SIZE 1024
|
||||||
|
|
||||||
#if RX_BUFFER_SIZE >= 1024
|
#if RX_BUFFER_SIZE >= 1024
|
||||||
@@ -2659,6 +2799,11 @@
|
|||||||
// Enable this option to collect and display the number
|
// Enable this option to collect and display the number
|
||||||
// of dropped bytes after a file transfer to SD.
|
// of dropped bytes after a file transfer to SD.
|
||||||
//#define SERIAL_STATS_DROPPED_RX
|
//#define SERIAL_STATS_DROPPED_RX
|
||||||
|
|
||||||
|
// Enable this option to collect and display framing errors.
|
||||||
|
// Framing errors occur when invalid start/stop bits or other
|
||||||
|
// serial protocol violations are detected.
|
||||||
|
//#define SERIAL_STATS_RX_FRAMING_ERRORS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Monitor RX buffer usage
|
// Monitor RX buffer usage
|
||||||
@@ -2686,8 +2831,8 @@
|
|||||||
*
|
*
|
||||||
* Adds support for commands:
|
* Adds support for commands:
|
||||||
* S000 : Report State and Position while moving.
|
* S000 : Report State and Position while moving.
|
||||||
* P000 : Instant Pause / Hold while moving.
|
* P000 : Instant Pause / Hold while moving. Enable SOFT_FEED_HOLD for soft deceleration.
|
||||||
* R000 : Resume from Pause / Hold.
|
* R000 : Resume from Pause / Hold. Enable SOFT_FEED_HOLD for soft acceleration.
|
||||||
*
|
*
|
||||||
* - During Hold all Emergency Parser commands are available, as usual.
|
* - During Hold all Emergency Parser commands are available, as usual.
|
||||||
* - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports.
|
* - Enable NANODLP_Z_SYNC and NANODLP_ALL_AXIS for move command end-state reports.
|
||||||
@@ -2744,7 +2889,7 @@
|
|||||||
*/
|
*/
|
||||||
//#define EXTRA_FAN_SPEED
|
//#define EXTRA_FAN_SPEED
|
||||||
|
|
||||||
// @section gcode
|
// @section firmware retraction
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Firmware-based and LCD-controlled retract
|
* Firmware-based and LCD-controlled retract
|
||||||
@@ -2961,7 +3106,7 @@
|
|||||||
/**
|
/**
|
||||||
* Trinamic Smart Drivers
|
* Trinamic Smart Drivers
|
||||||
*
|
*
|
||||||
* To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
* To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
|
||||||
* - Connect your SPI pins to the Hardware SPI interface on the board.
|
* - Connect your SPI pins to the Hardware SPI interface on the board.
|
||||||
* Some boards have simple jumper connections! See your board's documentation.
|
* Some boards have simple jumper connections! See your board's documentation.
|
||||||
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
|
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
|
||||||
@@ -2983,12 +3128,22 @@
|
|||||||
|
|
||||||
#define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current
|
#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
|
* Interpolate microsteps to 256
|
||||||
* Override for each driver with <driver>_INTERPOLATE settings below
|
* Override for each driver with <driver>_INTERPOLATE settings below
|
||||||
*/
|
*/
|
||||||
#define INTERPOLATE true
|
#define INTERPOLATE true
|
||||||
|
|
||||||
|
#if HAS_DRIVER(TMC2240)
|
||||||
|
#define TMC2240_RREF 12000 // (Ω) 12000 .. 60000. (FLY TMC2240 = 12300)
|
||||||
|
// Max Current. Lower for more internal resolution. Raise to run cooler.
|
||||||
|
#define TMC2240_CURRENT_RANGE 1 // :{ 0:'RMS=690mA PEAK=1A', 1:'RMS=1410mA PEAK=2A', 2:'RMS=2120mA PEAK=3A', 3:'RMS=2110mA PEAK=3A' }
|
||||||
|
// Slope Control: Lower is more silent. Higher runs cooler.
|
||||||
|
#define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/µs', 1:'200V/µs', 2:'400V/µs', 3:'800V/µs' }
|
||||||
|
#endif
|
||||||
|
|
||||||
#if AXIS_IS_TMC_CONFIG(X)
|
#if AXIS_IS_TMC_CONFIG(X)
|
||||||
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
|
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
|
||||||
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
|
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
|
||||||
@@ -3211,7 +3366,7 @@
|
|||||||
// @section tmc/spi
|
// @section tmc/spi
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
|
* Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
|
||||||
* The default pins can be found in your board's pins file.
|
* The default pins can be found in your board's pins file.
|
||||||
*/
|
*/
|
||||||
//#define X_CS_PIN -1
|
//#define X_CS_PIN -1
|
||||||
@@ -3238,7 +3393,7 @@
|
|||||||
//#define E7_CS_PIN -1
|
//#define E7_CS_PIN -1
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
|
* Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
|
||||||
* The default SW SPI pins are defined the respective pins files,
|
* The default SW SPI pins are defined the respective pins files,
|
||||||
* but you can override or define them here.
|
* but you can override or define them here.
|
||||||
*/
|
*/
|
||||||
@@ -3297,7 +3452,7 @@
|
|||||||
// @section tmc/stealthchop
|
// @section tmc/stealthchop
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
||||||
* Use Trinamic's ultra quiet stepping mode.
|
* Use Trinamic's ultra quiet stepping mode.
|
||||||
* When disabled, Marlin will use spreadCycle stepping mode.
|
* When disabled, Marlin will use spreadCycle stepping mode.
|
||||||
*/
|
*/
|
||||||
@@ -3376,7 +3531,7 @@
|
|||||||
// @section tmc/hybrid
|
// @section tmc/hybrid
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
|
* TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
|
||||||
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
|
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
|
||||||
* This mode allows for faster movements at the expense of higher noise levels.
|
* This mode allows for faster movements at the expense of higher noise levels.
|
||||||
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
|
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
|
||||||
@@ -3410,7 +3565,7 @@
|
|||||||
/**
|
/**
|
||||||
* Use StallGuard to home / probe X, Y, Z.
|
* Use StallGuard to home / probe X, Y, Z.
|
||||||
*
|
*
|
||||||
* TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
|
* TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
|
||||||
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
|
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
|
||||||
* X, Y, and Z homing will always be done in spreadCycle mode.
|
* X, Y, and Z homing will always be done in spreadCycle mode.
|
||||||
*
|
*
|
||||||
@@ -3423,7 +3578,7 @@
|
|||||||
*
|
*
|
||||||
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
|
||||||
*
|
*
|
||||||
* SPI_ENDSTOPS *** TMC2130/TMC5160 Only ***
|
* SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
|
||||||
* Poll the driver through SPI to determine load when homing.
|
* Poll the driver through SPI to determine load when homing.
|
||||||
* Removes the need for a wire from DIAG1 to an endstop pin.
|
* Removes the need for a wire from DIAG1 to an endstop pin.
|
||||||
*
|
*
|
||||||
@@ -3451,10 +3606,17 @@
|
|||||||
//#define U_STALL_SENSITIVITY 8
|
//#define U_STALL_SENSITIVITY 8
|
||||||
//#define V_STALL_SENSITIVITY 8
|
//#define V_STALL_SENSITIVITY 8
|
||||||
//#define W_STALL_SENSITIVITY 8
|
//#define W_STALL_SENSITIVITY 8
|
||||||
//#define SPI_ENDSTOPS // TMC2130/TMC5160 only
|
//#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
|
||||||
//#define IMPROVE_HOMING_RELIABILITY
|
//#define IMPROVE_HOMING_RELIABILITY
|
||||||
|
//#define SENSORLESS_STALLGUARD_DELAY 0 // (ms) Delay to allow drivers to settle
|
||||||
|
|
||||||
|
#if HAS_MARLINUI_MENU
|
||||||
|
// Convenient homing menu items next to Sensorless Homing edit items
|
||||||
|
//#define SENSORLESS_HOMING_TEST_MENU_ITEMS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // SENSORLESS_HOMING || SENSORLESS_PROBING
|
||||||
|
|
||||||
// @section tmc/config
|
// @section tmc/config
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3550,7 +3712,7 @@
|
|||||||
//#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S)
|
//#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S)
|
||||||
|
|
||||||
// Canon RC-1 or homebrew digital camera trigger
|
// Canon RC-1 or homebrew digital camera trigger
|
||||||
// Data from: https://www.doc-diy.net/photo/rc-1_hacked/
|
// Data from: https://web.archive.org/web/20250327153953/www.doc-diy.net/photo/rc-1_hacked/
|
||||||
//#define PHOTOGRAPH_PIN 23
|
//#define PHOTOGRAPH_PIN 23
|
||||||
|
|
||||||
// Canon Hack Development Kit
|
// Canon Hack Development Kit
|
||||||
@@ -3668,6 +3830,8 @@
|
|||||||
#define SPEED_POWER_MIN 5000 // (RPM)
|
#define SPEED_POWER_MIN 5000 // (RPM)
|
||||||
#define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 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 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
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -3909,7 +4073,7 @@
|
|||||||
/**
|
/**
|
||||||
* Extra options for the M114 "Current Position" report
|
* 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_REALTIME // Real current position based on forward kinematics
|
||||||
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
|
//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed.
|
||||||
|
|
||||||
@@ -3938,7 +4102,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* M115 - Report capabilites. Disable to save ~1150 bytes of flash.
|
* M115 - Report capabilities. Disable to save ~1150 bytes of flash.
|
||||||
* Some hosts (and serial TFT displays) rely on this feature.
|
* Some hosts (and serial TFT displays) rely on this feature.
|
||||||
*/
|
*/
|
||||||
#define CAPABILITIES_REPORT
|
#define CAPABILITIES_REPORT
|
||||||
@@ -3956,7 +4120,6 @@
|
|||||||
* Spend 28 bytes of SRAM to optimize the G-code parser
|
* Spend 28 bytes of SRAM to optimize the G-code parser
|
||||||
*/
|
*/
|
||||||
#define FASTER_GCODE_PARSER
|
#define FASTER_GCODE_PARSER
|
||||||
|
|
||||||
#if ENABLED(FASTER_GCODE_PARSER)
|
#if ENABLED(FASTER_GCODE_PARSER)
|
||||||
//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
|
//#define GCODE_QUOTED_STRINGS // Support for quoted string parameters
|
||||||
#endif
|
#endif
|
||||||
@@ -4014,13 +4177,17 @@
|
|||||||
/**
|
/**
|
||||||
* G-code Macros
|
* G-code Macros
|
||||||
*
|
*
|
||||||
* Add G-codes M810-M819 to define and run G-code macros.
|
* Add G-codes M810-M819 to define and run G-code macros
|
||||||
* Macros are not saved to EEPROM.
|
* and M820 to report the current set of macros.
|
||||||
|
* Macros are not saved to EEPROM unless enabled below.
|
||||||
*/
|
*/
|
||||||
//#define GCODE_MACROS
|
//#define GCODE_MACROS
|
||||||
#if ENABLED(GCODE_MACROS)
|
#if ENABLED(GCODE_MACROS)
|
||||||
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
|
#define GCODE_MACROS_SLOTS 5 // Up to 10 may be used
|
||||||
#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
|
#define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro
|
||||||
|
#if ENABLED(EEPROM_SETTINGS)
|
||||||
|
//#define GCODE_MACROS_IN_EEPROM // Include macros in EEPROM
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -4042,22 +4209,27 @@
|
|||||||
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
|
#define MAIN_MENU_ITEM_1_DESC "Home & UBL Info"
|
||||||
#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
|
#define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W"
|
||||||
//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
//#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
||||||
|
//#define MAIN_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
|
||||||
|
|
||||||
#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
|
#define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL
|
||||||
#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
#define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
||||||
//#define MAIN_MENU_ITEM_2_CONFIRM
|
//#define MAIN_MENU_ITEM_2_CONFIRM
|
||||||
|
//#define MAIN_MENU_ITEM_2_IMMEDIATE
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
|
//#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL
|
||||||
//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
//#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
||||||
//#define MAIN_MENU_ITEM_3_CONFIRM
|
//#define MAIN_MENU_ITEM_3_CONFIRM
|
||||||
|
//#define MAIN_MENU_ITEM_3_IMMEDIATE
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
|
//#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level"
|
||||||
//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
|
//#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
|
||||||
//#define MAIN_MENU_ITEM_4_CONFIRM
|
//#define MAIN_MENU_ITEM_4_CONFIRM
|
||||||
|
//#define MAIN_MENU_ITEM_4_IMMEDIATE
|
||||||
|
|
||||||
//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
|
//#define MAIN_MENU_ITEM_5_DESC "Home & Info"
|
||||||
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
|
//#define MAIN_MENU_ITEM_5_GCODE "G28\nM503"
|
||||||
//#define MAIN_MENU_ITEM_5_CONFIRM
|
//#define MAIN_MENU_ITEM_5_CONFIRM
|
||||||
|
//#define MAIN_MENU_ITEM_5_IMMEDIATE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section custom config menu
|
// @section custom config menu
|
||||||
@@ -4074,22 +4246,27 @@
|
|||||||
#define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
|
#define CONFIG_MENU_ITEM_1_DESC "Wifi ON"
|
||||||
#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
|
#define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
//#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action
|
||||||
|
//#define CONFIG_MENU_ITEM_1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
|
||||||
|
|
||||||
#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
|
#define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON"
|
||||||
#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
|
#define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_2_CONFIRM
|
//#define CONFIG_MENU_ITEM_2_CONFIRM
|
||||||
|
//#define CONFIG_MENU_ITEM_2_IMMEDIATE
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
|
//#define CONFIG_MENU_ITEM_3_DESC "Radio OFF"
|
||||||
//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
|
//#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678"
|
||||||
//#define CONFIG_MENU_ITEM_3_CONFIRM
|
//#define CONFIG_MENU_ITEM_3_CONFIRM
|
||||||
|
//#define CONFIG_MENU_ITEM_3_IMMEDIATE
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
|
//#define CONFIG_MENU_ITEM_4_DESC "Wifi ????"
|
||||||
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
|
//#define CONFIG_MENU_ITEM_4_GCODE "M118 ????"
|
||||||
//#define CONFIG_MENU_ITEM_4_CONFIRM
|
//#define CONFIG_MENU_ITEM_4_CONFIRM
|
||||||
|
//#define CONFIG_MENU_ITEM_4_IMMEDIATE
|
||||||
|
|
||||||
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
|
//#define CONFIG_MENU_ITEM_5_DESC "Wifi ????"
|
||||||
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
|
//#define CONFIG_MENU_ITEM_5_GCODE "M118 ????"
|
||||||
//#define CONFIG_MENU_ITEM_5_CONFIRM
|
//#define CONFIG_MENU_ITEM_5_CONFIRM
|
||||||
|
//#define CONFIG_MENU_ITEM_5_IMMEDIATE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// @section custom buttons
|
// @section custom buttons
|
||||||
@@ -4106,6 +4283,7 @@
|
|||||||
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
|
#define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing?
|
||||||
#define BUTTON1_GCODE "G28"
|
#define BUTTON1_GCODE "G28"
|
||||||
#define BUTTON1_DESC "Homing" // Optional string to set the LCD status
|
#define BUTTON1_DESC "Homing" // Optional string to set the LCD status
|
||||||
|
//#define BUTTON1_IMMEDIATE // Skip the queue and execute immediately. Rarely needed.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define BUTTON2_PIN -1
|
//#define BUTTON2_PIN -1
|
||||||
@@ -4114,6 +4292,7 @@
|
|||||||
#define BUTTON2_WHEN_PRINTING false
|
#define BUTTON2_WHEN_PRINTING false
|
||||||
#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
#define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
|
||||||
#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
|
#define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL
|
||||||
|
//#define BUTTON2_IMMEDIATE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define BUTTON3_PIN -1
|
//#define BUTTON3_PIN -1
|
||||||
@@ -4122,6 +4301,7 @@
|
|||||||
#define BUTTON3_WHEN_PRINTING false
|
#define BUTTON3_WHEN_PRINTING false
|
||||||
#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
#define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
|
||||||
#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
|
#define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL
|
||||||
|
//#define BUTTON3_IMMEDIATE
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4169,7 +4349,7 @@
|
|||||||
* Developed by Chris Barr at Aus3D.
|
* Developed by Chris Barr at Aus3D.
|
||||||
*
|
*
|
||||||
* Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder
|
* Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder
|
||||||
* Github: https://github.com/Aus3D/MagneticEncoder
|
* GitHub: https://github.com/Aus3D/MagneticEncoder
|
||||||
*
|
*
|
||||||
* Supplier: https://aus3d.com.au/products/magnetic-encoder-module
|
* Supplier: https://aus3d.com.au/products/magnetic-encoder-module
|
||||||
* Alternative Supplier: https://reliabuild3d.com/
|
* Alternative Supplier: https://reliabuild3d.com/
|
||||||
@@ -4194,7 +4374,7 @@
|
|||||||
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
|
//#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper
|
||||||
// steps per full revolution (motor steps/rev * microstepping)
|
// steps per full revolution (motor steps/rev * microstepping)
|
||||||
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
|
//#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel.
|
||||||
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction.
|
#define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error correction.
|
||||||
#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
|
#define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the
|
||||||
// printer will attempt to correct the error; errors
|
// printer will attempt to correct the error; errors
|
||||||
// smaller than this are ignored to minimize effects of
|
// smaller than this are ignored to minimize effects of
|
||||||
@@ -4288,17 +4468,40 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instant freeze / unfreeze functionality
|
* Freeze / Unfreeze
|
||||||
* Potentially useful for rapid stop that allows being resumed. Halts stepper movement.
|
*
|
||||||
* Note this does NOT pause spindles, lasers, fans, heaters or any other auxiliary device.
|
* Pause / Hold that keeps power available and does not stop the spindle can be initiated by
|
||||||
* @section interface
|
* the FREEZE_PIN. Halts instantly (default) or performs a soft feed hold that decelerates and
|
||||||
|
* halts movement at FREEZE_JERK (requires SOFT_FEED_HOLD).
|
||||||
|
* Motion can be resumed by using the FREEZE_PIN.
|
||||||
|
*
|
||||||
|
* NOTE: Controls Laser PWM but does NOT pause Spindle, Fans, Heaters or other devices.
|
||||||
|
* @section freeze
|
||||||
*/
|
*/
|
||||||
//#define FREEZE_FEATURE
|
//#define FREEZE_FEATURE
|
||||||
#if ENABLED(FREEZE_FEATURE)
|
#if ENABLED(FREEZE_FEATURE)
|
||||||
//#define FREEZE_PIN 41 // Override the default (KILL) pin here
|
//#define FREEZE_PIN -1 // Override the default (KILL) pin here
|
||||||
#define FREEZE_STATE LOW // State of pin indicating freeze
|
#define FREEZE_STATE LOW // State of pin indicating freeze
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if ANY(FREEZE_FEATURE, REALTIME_REPORTING_COMMANDS)
|
||||||
|
/**
|
||||||
|
* Command P000 (REALTIME_REPORTING_COMMANDS and EMERGENCY_PARSER) or
|
||||||
|
* FREEZE_PIN (FREEZE_FEATURE) initiates a soft feed hold that keeps
|
||||||
|
* power available and does not stop the spindle.
|
||||||
|
*
|
||||||
|
* The soft feed hold decelerates and halts movement at FREEZE_JERK.
|
||||||
|
* Motion can be resumed with command R000 (requires REALTIME_REPORTING_COMMANDS) or
|
||||||
|
* by using the FREEZE_PIN (requires FREEZE_FEATURE).
|
||||||
|
*
|
||||||
|
* NOTE: Affects Laser PWM but DOES NOT pause Spindle, Fans, Heaters or other devices.
|
||||||
|
*/
|
||||||
|
//#define SOFT_FEED_HOLD
|
||||||
|
#if ENABLED(SOFT_FEED_HOLD)
|
||||||
|
#define FREEZE_JERK 2 // (mm/s) Completely halt when motion has decelerated below this value
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MAX7219 Debug Matrix
|
* MAX7219 Debug Matrix
|
||||||
*
|
*
|
||||||
@@ -4626,6 +4829,11 @@
|
|||||||
//
|
//
|
||||||
//#define PINS_DEBUGGING
|
//#define PINS_DEBUGGING
|
||||||
|
|
||||||
|
//
|
||||||
|
// M265 - I2C Scanner
|
||||||
|
//
|
||||||
|
//#define I2C_SCANNER
|
||||||
|
|
||||||
// Enable Tests that will run at startup and produce a report
|
// Enable Tests that will run at startup and produce a report
|
||||||
//#define MARLIN_TEST_BUILD
|
//#define MARLIN_TEST_BUILD
|
||||||
|
|
||||||
|
|||||||
+74
-65
@@ -127,9 +127,9 @@ NEOPIXEL ?= 0
|
|||||||
# on GCC versions:
|
# on GCC versions:
|
||||||
# https://www.avrfreaks.net/comment/1789106#comment-1789106
|
# https://www.avrfreaks.net/comment/1789106#comment-1789106
|
||||||
|
|
||||||
CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | 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_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d' ' )
|
||||||
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ )
|
CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d' ' )
|
||||||
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) )))
|
||||||
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1)
|
||||||
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
$(warning This GCC version $(CC_VER) is likely broken. Enabling relocation workaround.)
|
||||||
@@ -188,15 +188,15 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1034)
|
||||||
|
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1035)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1040)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1036)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1041)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1037)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1042)
|
||||||
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1038)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1043)
|
||||||
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1039)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1044)
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMPS Derivatives - ATmega1280, ATmega2560
|
# RAMPS Derivatives - ATmega1280, ATmega2560
|
||||||
@@ -286,59 +286,62 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1138)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1139)
|
||||||
# Creality: CR10S, CR20, CR-X
|
# Creality: CR10S, CR20, CR-X
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1140)
|
||||||
# Dagoma F5
|
# Creality CR-10 V2, CR-10 V3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1141)
|
||||||
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
# Dagoma F5
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1142)
|
||||||
# FYSETC F6 1.3
|
# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1143)
|
||||||
# FYSETC F6 1.4
|
# FYSETC F6 1.3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1144)
|
||||||
# Wanhao Duplicator i3 Plus
|
# FYSETC F6 1.4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1145)
|
||||||
# VORON Design
|
# Wanhao Duplicator i3 Plus
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1146)
|
||||||
# Tronxy TRONXY-V3-1.0
|
# VORON Design
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1147)
|
||||||
# Z-Bolt X Series
|
# Tronxy TRONXY-V3-1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1148)
|
||||||
# TT OSCAR
|
# Z-Bolt X Series
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1149)
|
||||||
# BIQU Tango V1
|
# TT OSCAR
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1150)
|
||||||
# MKS GEN L V2
|
# BIQU Tango V1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1151)
|
||||||
# MKS GEN L V2.1
|
# MKS GEN L V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1152)
|
||||||
# Copymaster 3D
|
# MKS GEN L V2.1
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1153)
|
||||||
# Ortur 4
|
# Copymaster 3D
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1154)
|
||||||
# Tenlog D3 Hero IDEX printer
|
# Ortur 4
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1155)
|
||||||
# Tenlog D3, D5, D6 IDEX Printer
|
# Tenlog D3 Hero IDEX printer
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1156)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
# Tenlog D3, D5, D6 IDEX Printer
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1157)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1158)
|
||||||
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1159)
|
||||||
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
# Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1160)
|
||||||
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
# Longer LK1 PRO / Alfawise U20 Pro (PRO version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1161)
|
||||||
# Pxmalion Core I3
|
# Longer LKx PRO / Alfawise Uxx Pro (PRO version)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1162)
|
||||||
# Panowin Cutlass (as found in the Panowin F1)
|
# Pxmalion Core I3
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1163)
|
||||||
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
# Panowin Cutlass (as found in the Panowin F1)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1164)
|
||||||
# XTLW MFF V1.0
|
# Kodama Bardo V1.x (as found in the Kodama Trinus)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
|
||||||
# XTLW MFF V2.0
|
# XTLW MFF V1.0
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
|
||||||
|
# XTLW MFF V2.0
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1167)
|
||||||
|
# E3D Rumba BigBox
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1168)
|
||||||
|
|
||||||
#
|
#
|
||||||
# RAMBo and derivatives
|
# RAMBo and derivatives
|
||||||
@@ -407,32 +410,34 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1319)
|
|||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1320)
|
||||||
# Geeetech GT2560 Rev B for A20(M/T/D)
|
# Geeetech GT2560 Rev B for A20(M/T/D)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1321)
|
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)
|
|
||||||
# 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)
|
# Geeetech GT2560 V4.1B for A10(M/T/D)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1322)
|
||||||
|
# Einstart retrofit
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1323)
|
||||||
|
# Wanhao 0ne+ i3 Mini
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1324)
|
||||||
|
# Wanhao D9 MK2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1325)
|
||||||
|
# Overlord/Overlord Pro
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1326)
|
||||||
|
# ADIMLab Gantry v1
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1327)
|
||||||
|
# ADIMLab Gantry v2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1328)
|
||||||
|
# Leapfrog Xeed 2015
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1329)
|
||||||
|
# PICA Shield (original version)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1330)
|
||||||
|
# PICA Shield (rev C or later)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1331)
|
||||||
|
# Intamsys 4.0 (Funmat HT)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1332)
|
||||||
|
# Malyan M180 Mainboard Version 2
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1333)
|
||||||
|
# Mega controller & Protoneer CNC Shield V3.00
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1334)
|
||||||
|
# WEEDO 62A board (TINA2, Monoprice Cadet, etc.)
|
||||||
|
else ifeq ($(HARDWARE_MOTHERBOARD),1335)
|
||||||
|
|
||||||
#
|
#
|
||||||
# ATmega1281, ATmega2561
|
# ATmega1281, ATmega2561
|
||||||
@@ -512,7 +517,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
|||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
PROG_MCU ?= m1284p
|
PROG_MCU ?= m1284p
|
||||||
# ZoneStar ZMIB V2
|
# ZoneStar ZMIB V2
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),1511)
|
else ifeq ($(HARDWARE_MOTHERBOARD),1512)
|
||||||
HARDWARE_VARIANT ?= Sanguino
|
HARDWARE_VARIANT ?= Sanguino
|
||||||
MCU ?= atmega1284p
|
MCU ?= atmega1284p
|
||||||
PROG_MCU ?= m1284p
|
PROG_MCU ?= m1284p
|
||||||
@@ -626,6 +631,10 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1707)
|
|||||||
MCU ?= at90usb1286
|
MCU ?= at90usb1286
|
||||||
PROG_MCU ?= usb1286
|
PROG_MCU ?= usb1286
|
||||||
|
|
||||||
|
#
|
||||||
|
# SAM3X8E ARM Cortex-M3
|
||||||
|
#
|
||||||
|
|
||||||
# UltiMachine Archim1 (with DRV8825 drivers)
|
# UltiMachine Archim1 (with DRV8825 drivers)
|
||||||
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
else ifeq ($(HARDWARE_MOTHERBOARD),3023)
|
||||||
HARDWARE_VARIANT ?= archim
|
HARDWARE_VARIANT ?= archim
|
||||||
@@ -798,10 +807,10 @@ endif
|
|||||||
|
|
||||||
ifeq ($(TMC), 1)
|
ifeq ($(TMC), 1)
|
||||||
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
|
||||||
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
|
CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
|
||||||
DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
|
GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
|
||||||
SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
|
||||||
TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(RELOC_WORKAROUND), 1)
|
ifeq ($(RELOC_WORKAROUND), 1)
|
||||||
@@ -1026,7 +1035,7 @@ extcoff: $(TARGET).elf
|
|||||||
$(NM) -n $< > $@
|
$(NM) -n $< > $@
|
||||||
|
|
||||||
# Link: create ELF output file from library.
|
# Link: create ELF output file from library.
|
||||||
|
LDFLAGS+= -Wl,-V
|
||||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h
|
||||||
$(Pecho) " CXX $@"
|
$(Pecho) " CXX $@"
|
||||||
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
$P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX)
|
||||||
|
|||||||
+11
-4
@@ -41,7 +41,14 @@
|
|||||||
* here we define this default string as the date where the latest release
|
* here we define this default string as the date where the latest release
|
||||||
* version was tagged.
|
* version was tagged.
|
||||||
*/
|
*/
|
||||||
//#define STRING_DISTRIBUTION_DATE "2024-10-17"
|
//#define STRING_DISTRIBUTION_DATE "2026-03-19"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
* Defines a generic printer name to be output to the LCD after booting Marlin.
|
||||||
@@ -51,7 +58,7 @@
|
|||||||
/**
|
/**
|
||||||
* The SOURCE_CODE_URL is the location where users will find the Marlin Source
|
* The SOURCE_CODE_URL is the location where users will find the Marlin Source
|
||||||
* Code which is installed on the device. In most cases —unless the manufacturer
|
* Code which is installed on the device. In most cases —unless the manufacturer
|
||||||
* has a distinct Github fork— the Source Code URL should just be the main
|
* has a distinct GitHub fork— the Source Code URL should just be the main
|
||||||
* Marlin repository.
|
* Marlin repository.
|
||||||
*/
|
*/
|
||||||
//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
|
//#define SOURCE_CODE_URL "github.com/MarlinFirmware/Marlin"
|
||||||
@@ -68,8 +75,8 @@
|
|||||||
//#define WEBSITE_URL "marlinfw.org"
|
//#define WEBSITE_URL "marlinfw.org"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the vendor info the serial USB interface, if changable
|
* Set the vendor info the serial USB interface, if changeable.
|
||||||
* Currently only supported by DUE platform
|
* Currently only supported by DUE platform.
|
||||||
*/
|
*/
|
||||||
//#define USB_DEVICE_VENDOR_ID 0x0000
|
//#define USB_DEVICE_VENDOR_ID 0x0000
|
||||||
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
//#define USB_DEVICE_PRODUCT_ID 0x0000
|
||||||
|
|||||||
+66
-59
@@ -62,6 +62,11 @@ motherboard = BOARD_RAMPS_14_EFB
|
|||||||
serial_port = 0
|
serial_port = 0
|
||||||
baudrate = 250000
|
baudrate = 250000
|
||||||
|
|
||||||
|
string_config_h_author = "(default from config.ini)"
|
||||||
|
|
||||||
|
capabilities_report = on
|
||||||
|
extended_capabilities_report = on
|
||||||
|
|
||||||
use_watchdog = on
|
use_watchdog = on
|
||||||
thermal_protection_hotends = on
|
thermal_protection_hotends = on
|
||||||
thermal_protection_hysteresis = 4
|
thermal_protection_hysteresis = 4
|
||||||
@@ -77,18 +82,25 @@ temp_sensor_0 = 1
|
|||||||
temp_hysteresis = 3
|
temp_hysteresis = 3
|
||||||
heater_0_mintemp = 5
|
heater_0_mintemp = 5
|
||||||
heater_0_maxtemp = 275
|
heater_0_maxtemp = 275
|
||||||
preheat_1_temp_hotend = 180
|
|
||||||
|
|
||||||
bang_max = 255
|
|
||||||
pidtemp = on
|
pidtemp = on
|
||||||
pid_k1 = 0.95
|
pid_k1 = 0.95
|
||||||
pid_max = 255
|
pid_max = 255
|
||||||
pid_functional_range = 10
|
pid_functional_range = 20
|
||||||
|
|
||||||
default_kp = 22.20
|
default_kp = 22.20
|
||||||
default_ki = 1.08
|
default_ki = 1.08
|
||||||
default_kd = 114.00
|
default_kd = 114.00
|
||||||
|
|
||||||
|
temp_sensor_bed = 1
|
||||||
|
bed_check_interval = 5000
|
||||||
|
bed_mintemp = 5
|
||||||
|
bed_maxtemp = 150
|
||||||
|
|
||||||
|
thermal_protection_bed = on
|
||||||
|
thermal_protection_bed_hysteresis = 2
|
||||||
|
thermal_protection_bed_period = 20
|
||||||
|
|
||||||
x_driver_type = A4988
|
x_driver_type = A4988
|
||||||
y_driver_type = A4988
|
y_driver_type = A4988
|
||||||
z_driver_type = A4988
|
z_driver_type = A4988
|
||||||
@@ -121,10 +133,10 @@ default_max_acceleration = { 3000, 3000, 100, 10000 }
|
|||||||
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
homing_feedrate_mm_m = { (50*60), (50*60), (4*60) }
|
||||||
homing_bump_divisor = { 2, 2, 4 }
|
homing_bump_divisor = { 2, 2, 4 }
|
||||||
|
|
||||||
x_enable_on = 0
|
x_enable_on = LOW
|
||||||
y_enable_on = 0
|
y_enable_on = LOW
|
||||||
z_enable_on = 0
|
z_enable_on = LOW
|
||||||
e_enable_on = 0
|
e_enable_on = LOW
|
||||||
|
|
||||||
invert_x_dir = false
|
invert_x_dir = false
|
||||||
invert_y_dir = true
|
invert_y_dir = true
|
||||||
@@ -136,11 +148,6 @@ step_state_x = HIGH
|
|||||||
step_state_y = HIGH
|
step_state_y = HIGH
|
||||||
step_state_z = HIGH
|
step_state_z = HIGH
|
||||||
|
|
||||||
disable_x = off
|
|
||||||
disable_y = off
|
|
||||||
disable_z = off
|
|
||||||
disable_e = off
|
|
||||||
|
|
||||||
proportional_font_ratio = 1.0
|
proportional_font_ratio = 1.0
|
||||||
default_nominal_filament_dia = 1.75
|
default_nominal_filament_dia = 1.75
|
||||||
|
|
||||||
@@ -153,30 +160,33 @@ default_retract_acceleration = 3000
|
|||||||
default_minimumfeedrate = 0.0
|
default_minimumfeedrate = 0.0
|
||||||
default_mintravelfeedrate = 0.0
|
default_mintravelfeedrate = 0.0
|
||||||
|
|
||||||
minimum_planner_speed = 0.05
|
|
||||||
min_steps_per_segment = 6
|
min_steps_per_segment = 6
|
||||||
default_minsegmenttime = 20000
|
default_minsegmenttime = 20000
|
||||||
|
|
||||||
[config:basic]
|
[config:basic]
|
||||||
|
hotend_overshoot = 15
|
||||||
bed_overshoot = 10
|
bed_overshoot = 10
|
||||||
|
max_bed_power = 255
|
||||||
|
|
||||||
busy_while_heating = on
|
busy_while_heating = on
|
||||||
default_ejerk = 5.0
|
host_keepalive_feature = on
|
||||||
default_keepalive_interval = 2
|
default_keepalive_interval = 2
|
||||||
default_leveling_fade_height = 0.0
|
printjob_timer_autostart = on
|
||||||
disable_other_extruders = on
|
|
||||||
display_charset_hd44780 = JAPANESE
|
jd_handle_small_segments = on
|
||||||
|
validate_homing_endstops = on
|
||||||
|
editable_steps_per_unit = on
|
||||||
|
|
||||||
eeprom_boot_silent = on
|
eeprom_boot_silent = on
|
||||||
eeprom_chitchat = on
|
eeprom_chitchat = on
|
||||||
|
|
||||||
endstoppullups = on
|
endstoppullups = on
|
||||||
extrude_maxlength = 200
|
|
||||||
|
prevent_cold_extrusion = on
|
||||||
extrude_mintemp = 170
|
extrude_mintemp = 170
|
||||||
host_keepalive_feature = on
|
prevent_lengthy_extrude = on
|
||||||
hotend_overshoot = 15
|
extrude_maxlength = 200
|
||||||
jd_handle_small_segments = on
|
|
||||||
lcd_info_screen_style = 0
|
|
||||||
lcd_language = en
|
|
||||||
max_bed_power = 255
|
|
||||||
mesh_inset = 0
|
|
||||||
min_software_endstops = on
|
min_software_endstops = on
|
||||||
max_software_endstops = on
|
max_software_endstops = on
|
||||||
min_software_endstop_x = on
|
min_software_endstop_x = on
|
||||||
@@ -185,63 +195,60 @@ min_software_endstop_z = on
|
|||||||
max_software_endstop_x = on
|
max_software_endstop_x = on
|
||||||
max_software_endstop_y = on
|
max_software_endstop_y = on
|
||||||
max_software_endstop_z = on
|
max_software_endstop_z = on
|
||||||
preheat_1_fan_speed = 0
|
|
||||||
preheat_1_label = "PLA"
|
preheat_1_label = "PLA"
|
||||||
|
preheat_1_temp_hotend = 180
|
||||||
preheat_1_temp_bed = 70
|
preheat_1_temp_bed = 70
|
||||||
prevent_cold_extrusion = on
|
preheat_1_fan_speed = 0
|
||||||
prevent_lengthy_extrude = on
|
|
||||||
printjob_timer_autostart = on
|
preheat_2_label = "ABS"
|
||||||
probing_margin = 10
|
preheat_2_temp_hotend = 240
|
||||||
show_bootscreen = on
|
preheat_2_temp_bed = 110
|
||||||
soft_pwm_scale = 0
|
preheat_2_fan_speed = 0
|
||||||
string_config_h_author = "(none, default config)"
|
|
||||||
temp_bed_hysteresis = 3
|
temp_bed_hysteresis = 3
|
||||||
temp_bed_residency_time = 10
|
temp_bed_residency_time = 10
|
||||||
temp_bed_window = 1
|
temp_bed_window = 1
|
||||||
temp_residency_time = 10
|
temp_residency_time = 10
|
||||||
temp_window = 1
|
temp_window = 1
|
||||||
validate_homing_endstops = on
|
|
||||||
xy_probe_feedrate = (133*60)
|
|
||||||
z_clearance_between_probes = 5
|
|
||||||
z_clearance_deploy_probe = 10
|
|
||||||
z_clearance_multi_probe = 5
|
|
||||||
|
|
||||||
[config:advanced]
|
[config:advanced]
|
||||||
arc_support = on
|
arc_support = on
|
||||||
|
min_arc_segment_mm = 0.1
|
||||||
|
max_arc_segment_mm = 1.0
|
||||||
|
min_circle_segments = 72
|
||||||
|
n_arc_correction = 25
|
||||||
|
|
||||||
auto_report_temperatures = on
|
auto_report_temperatures = on
|
||||||
|
|
||||||
autotemp = on
|
autotemp = on
|
||||||
|
autotemp_min = 210
|
||||||
|
autotemp_max = 250
|
||||||
|
autotemp_factor = 0.1f
|
||||||
autotemp_oldweight = 0.98
|
autotemp_oldweight = 0.98
|
||||||
bed_check_interval = 5000
|
|
||||||
default_stepper_timeout_sec = 120
|
default_stepper_timeout_sec = 120
|
||||||
default_volumetric_extruder_limit = 0.00
|
|
||||||
disable_idle_x = on
|
disable_idle_x = on
|
||||||
disable_idle_y = on
|
disable_idle_y = on
|
||||||
disable_idle_z = on
|
disable_idle_z = on
|
||||||
disable_idle_e = on
|
disable_idle_e = on
|
||||||
|
|
||||||
e0_auto_fan_pin = -1
|
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
|
faster_gcode_parser = on
|
||||||
|
debug_flags_gcode = on
|
||||||
|
|
||||||
homing_bump_mm = { 5, 5, 2 }
|
homing_bump_mm = { 5, 5, 2 }
|
||||||
max_arc_segment_mm = 1.0
|
|
||||||
min_arc_segment_mm = 0.1
|
|
||||||
min_circle_segments = 72
|
|
||||||
n_arc_correction = 25
|
|
||||||
serial_overrun_protection = on
|
|
||||||
slowdown = on
|
slowdown = on
|
||||||
slowdown_divisor = 2
|
slowdown_divisor = 2
|
||||||
temp_sensor_bed = 0
|
multistepping_limit = 16
|
||||||
thermal_protection_bed_hysteresis = 2
|
|
||||||
thermocouple_max_errors = 15
|
serial_overrun_protection = on
|
||||||
tx_buffer_size = 0
|
tx_buffer_size = 0
|
||||||
|
|
||||||
|
watch_temp_increase = 2
|
||||||
|
watch_temp_period = 40
|
||||||
|
|
||||||
watch_bed_temp_increase = 2
|
watch_bed_temp_increase = 2
|
||||||
watch_bed_temp_period = 60
|
watch_bed_temp_period = 60
|
||||||
watch_temp_increase = 2
|
|
||||||
watch_temp_period = 20
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ void MarlinHAL::init() {
|
|||||||
// Might disable other peripherals using the pin; to circumvent that please undefine one of the above things!
|
// Might disable other peripherals using the pin; to circumvent that please undefine one of the above things!
|
||||||
// The true culprit is the AVR ArduinoCore that enables peripherals redundantly.
|
// The true culprit is the AVR ArduinoCore that enables peripherals redundantly.
|
||||||
// (USART1 on the GeeeTech GT2560)
|
// (USART1 on the GeeeTech GT2560)
|
||||||
// https://www.youtube.com/watch?v=jMgCvRXkexk
|
// https://youtube.be/jMgCvRXkexk
|
||||||
_ATmega_savePinAlternate(BEEPER_PIN);
|
_ATmega_savePinAlternate(BEEPER_PIN);
|
||||||
|
|
||||||
OUT_WRITE(BEEPER_PIN, LOW);
|
OUT_WRITE(BEEPER_PIN, LOW);
|
||||||
@@ -119,7 +119,6 @@ void MarlinHAL::reboot() {
|
|||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s.
|
||||||
void MarlinHAL::watchdog_init() {
|
void MarlinHAL::watchdog_init() {
|
||||||
@@ -154,7 +153,7 @@ void MarlinHAL::reboot() {
|
|||||||
ISR(WDT_vect) {
|
ISR(WDT_vect) {
|
||||||
sei(); // With the interrupt driven serial we need to allow interrupts.
|
sei(); // With the interrupt driven serial we need to allow interrupts.
|
||||||
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED);
|
||||||
minkill(); // interrupt-safe final kill and infinite loop
|
marlin.minkill(); // interrupt-safe final kill and infinite loop
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ public:
|
|||||||
static void isr_on() { sei(); }
|
static void isr_on() { sei(); }
|
||||||
static void isr_off() { cli(); }
|
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()
|
// Tasks, called from marlin.idle()
|
||||||
static void idletask() {}
|
static void idletask() {}
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -41,7 +41,6 @@
|
|||||||
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H))
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
#if ENABLED(DIRECT_STEPPING)
|
#if ENABLED(DIRECT_STEPPING)
|
||||||
#include "../../feature/direct_stepping.h"
|
#include "../../feature/direct_stepping.h"
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) {
|
|||||||
*
|
*
|
||||||
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
* DC values -1.0 to 1.0. Negative duty cycle inverts the pulse.
|
||||||
*/
|
*/
|
||||||
uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) {
|
uint16_t set_pwm_frequency_hz(const float hz, const float dca, const float dcb, const float dcc) {
|
||||||
float count = 0;
|
float count = 0;
|
||||||
if (hz > 0 && (dca || dcb || dcc)) {
|
if (hz > 0 && (dca || dcb || dcc)) {
|
||||||
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq.
|
||||||
@@ -254,7 +254,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
|
|||||||
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
else { prescaler = 1; SET_CS(5, PRESCALER_1); }
|
||||||
|
|
||||||
count /= float(prescaler);
|
count /= float(prescaler);
|
||||||
const float pwm_top = round(count); // Get the rounded count
|
const float pwm_top = roundf(count); // Get the rounded count
|
||||||
|
|
||||||
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP
|
||||||
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
OCR5A = pwm_top * ABS(dca); // Update and scale DCs
|
||||||
@@ -280,7 +280,7 @@ uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb
|
|||||||
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250kHz
|
||||||
OCR5A = OCR5B = OCR5C = 0;
|
OCR5A = OCR5B = OCR5C = 0;
|
||||||
}
|
}
|
||||||
return round(count);
|
return roundf(count);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -363,8 +363,11 @@
|
|||||||
#define AIO7_PWM 0
|
#define AIO7_PWM 0
|
||||||
#define AIO7_DDR DDRF
|
#define AIO7_DDR DDRF
|
||||||
|
|
||||||
//-- Begin not supported by Teensyduino
|
//-- 46-47 are not supported by Teensyduino
|
||||||
//-- don't use Arduino functions on these pins pinMode/digitalWrite/etc
|
//-- 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_PIN PINE2
|
||||||
#define DIO46_RPORT PINE
|
#define DIO46_RPORT PINE
|
||||||
#define DIO46_WPORT PORTE
|
#define DIO46_WPORT PORTE
|
||||||
@@ -377,10 +380,7 @@
|
|||||||
#define DIO47_PWM 0
|
#define DIO47_PWM 0
|
||||||
#define DIO47_DDR DDRE
|
#define DIO47_DDR DDRE
|
||||||
|
|
||||||
#define TEENSY_E2 46
|
//--
|
||||||
#define TEENSY_E3 47
|
|
||||||
|
|
||||||
//-- end not supported by Teensyduino
|
|
||||||
|
|
||||||
#undef PA0
|
#undef PA0
|
||||||
#define PA0_PIN PINA0
|
#define PA0_PIN PINA0
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
/**
|
/**
|
||||||
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
* The Trinamic library includes SoftwareSerial.h, leading to a compile error.
|
||||||
*/
|
*/
|
||||||
#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE)
|
#if ALL(HAS_TMC_SW_SERIAL, ENDSTOP_INTERRUPTS_FEATURE)
|
||||||
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
#error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,30 @@
|
|||||||
#pragma once
|
#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"
|
#include "../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
|
||||||
|
|
||||||
#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
|
#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14, MIGHTYBOARD_REVG)
|
||||||
#define AVR_ATmega2560_FAMILY_PLUS_70 1
|
#define AVR_ATmega2560_FAMILY_PLUS_70 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -39,30 +55,30 @@
|
|||||||
#include "pinsDebug_Teensyduino.h"
|
#include "pinsDebug_Teensyduino.h"
|
||||||
// Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
|
// Can't use the "digitalPinToPort" function from the Teensyduino type IDEs
|
||||||
// portModeRegister takes a different argument
|
// portModeRegister takes a different argument
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
||||||
#define getValidPinMode(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin))
|
#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
|
#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"
|
#include "pinsDebug_plus_70.h"
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p)
|
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer_plus_70(P)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p)
|
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask_plus_70(P)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p)
|
#define digitalPinToPort_DEBUG(P) digitalPinToPort_plus_70(P)
|
||||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p)
|
#define digitalPinToTimer_DEBUG(P) digitalPinToTimer(P)
|
||||||
#define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p)
|
#define digitalPinToBitMask_DEBUG(P) digitalPinToBitMask(P)
|
||||||
#define digitalPinToPort_DEBUG(p) digitalPinToPort(p)
|
#define digitalPinToPort_DEBUG(P) digitalPinToPort(P)
|
||||||
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
bool getValidPinMode(pin_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); }
|
||||||
#define getPinByIndex(p) pgm_read_byte(&pin_array[p].pin)
|
#define getPinByIndex(x) pgm_read_byte(&pin_array[x].pin)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define isValidPin(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0)
|
#define isValidPin(P) (P >= 0 && P < NUMBER_PINS_TOTAL)
|
||||||
#if AVR_ATmega1284_FAMILY
|
#if AVR_ATmega1284_FAMILY
|
||||||
#define isAnalogPin(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
#define isAnalogPin(P) WITHIN(P, analogInputToDigitalPin(7), analogInputToDigitalPin(0))
|
||||||
#define digitalPinToAnalogIndex(P) int(isAnalogPin(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
#define digitalPinToAnalogIndex(P) int(isAnalogPin(P) ? (P) - analogInputToDigitalPin(7) : -1)
|
||||||
@@ -72,11 +88,11 @@
|
|||||||
#define isAnalogPin(P) (_ANALOG1(P) || _ANALOG2(P))
|
#define isAnalogPin(P) (_ANALOG1(P) || _ANALOG2(P))
|
||||||
#define digitalPinToAnalogIndex(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
#define digitalPinToAnalogIndex(P) int(_ANALOG1(P) ? (P) - analogInputToDigitalPin(0) : _ANALOG2(P) ? (P) - analogInputToDigitalPin(8) + 8 : -1)
|
||||||
#endif
|
#endif
|
||||||
#define getPinByIndex(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
|
#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
void printPinNameByIndex(uint8_t x) {
|
void printPinNameByIndex(const uint8_t index) {
|
||||||
PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name);
|
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) {
|
for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) {
|
||||||
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
char temp_char = pgm_read_byte(name_mem_pointer + y);
|
||||||
if (temp_char != 0)
|
if (temp_char != 0)
|
||||||
@@ -109,7 +125,7 @@ void printPinNameByIndex(uint8_t x) {
|
|||||||
* Print a pin's PWM status.
|
* Print a pin's PWM status.
|
||||||
* Return true if it's currently a PWM pin.
|
* Return true if it's currently a PWM pin.
|
||||||
*/
|
*/
|
||||||
bool pwm_status(uint8_t pin) {
|
bool pwm_status(const uint8_t pin) {
|
||||||
char buffer[20]; // for the sprintf statements
|
char buffer[20]; // for the sprintf statements
|
||||||
|
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
@@ -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();
|
if (TEST(*TMSK, TOIE)) err_prob_interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void printPinPWM(uint8_t pin) {
|
void printPinPWM(const uint8_t pin) {
|
||||||
switch (digitalPinToTimer_DEBUG(pin)) {
|
switch (digitalPinToTimer_DEBUG(pin)) {
|
||||||
|
|
||||||
#if ABTEST(0)
|
#if ABTEST(0)
|
||||||
@@ -361,16 +377,16 @@ void printPinPort(const pin_t pin) { // print port number
|
|||||||
uint8_t x;
|
uint8_t x;
|
||||||
SERIAL_ECHOPGM(" Port: ");
|
SERIAL_ECHOPGM(" Port: ");
|
||||||
#if AVR_AT90USB1286_FAMILY
|
#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
|
#else
|
||||||
x = digitalPinToPort_DEBUG(pin) + 64;
|
x = 'A' + digitalPinToPort_DEBUG(pin) - 1;
|
||||||
#endif
|
#endif
|
||||||
SERIAL_CHAR(x);
|
SERIAL_CHAR(x);
|
||||||
|
|
||||||
#if AVR_AT90USB1286_FAMILY
|
#if AVR_AT90USB1286_FAMILY
|
||||||
if (pin == 46)
|
if (pin == PIN_E2)
|
||||||
x = '2';
|
x = '2';
|
||||||
else if (pin == 47)
|
else if (pin == PIN_E3)
|
||||||
x = '3';
|
x = '3';
|
||||||
else {
|
else {
|
||||||
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
uint8_t temp = digitalPinToBitMask_DEBUG(pin);
|
||||||
@@ -386,7 +402,7 @@ void printPinPort(const pin_t pin) { // print port number
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define printPinNumber(p) do{ sprintf_P(buffer, PSTR("%3d "), p); 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(pin)); SERIAL_ECHO(buffer); }while(0)
|
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||||
|
|
||||||
#undef ABTEST
|
#undef ABTEST
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
|||||||
|
|
||||||
// digitalPinToBitMask(pin) is OK
|
// 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
|
// disable the PWMs so we can use it as is
|
||||||
|
|
||||||
// portModeRegister(pin) is OK
|
// portModeRegister(pin) is OK
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
* Structures for 2560 family boards that use more than 70 pins
|
* Structures for 2560 family boards that use more than 70 pins
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
|
#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14, MIGHTYBOARD_REVG)
|
||||||
#undef NUM_DIGITAL_PINS
|
#undef NUM_DIGITAL_PINS
|
||||||
#define NUM_DIGITAL_PINS 85
|
#define NUM_DIGITAL_PINS 85
|
||||||
#elif MB(MIGHTYBOARD_REVE)
|
#elif MB(MIGHTYBOARD_REVE)
|
||||||
|
|||||||
@@ -93,15 +93,15 @@ namespace AVRHelpers {
|
|||||||
typedef T type;
|
typedef T type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 1u> {
|
struct voltype <T, 1U> {
|
||||||
typedef uint8_t type;
|
typedef uint8_t type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 2u> {
|
struct voltype <T, 2U> {
|
||||||
typedef uint16_t type;
|
typedef uint16_t type;
|
||||||
};
|
};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct voltype <T, 4u> {
|
struct voltype <T, 4U> {
|
||||||
typedef uint32_t type;
|
typedef uint32_t type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2007,7 +2007,7 @@ inline void _ATmega_resetperipherals() {
|
|||||||
|
|
||||||
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__)
|
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM05__)
|
||||||
_EEAR._EEAR = 0;
|
_EEAR._EEAR = 0;
|
||||||
dwrite(_EEDR, (uint8_t)0u);
|
dwrite(_EEDR, (uint8_t)0U);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
|
#if defined(__AVR_TRM01__) || defined(__AVR_TRM02__) || defined(__AVR_TRM03__) || defined(__AVR_TRM04__) || defined(__AVR_TRM05__)
|
||||||
|
|||||||
@@ -23,43 +23,41 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Define SPI Pins: SCK, MISO, MOSI, SS
|
* 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__)
|
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
|
||||||
#define AVR_SCK_PIN 13
|
#define _PIN_SPI_SCK 13
|
||||||
#define AVR_MISO_PIN 12
|
#define _PIN_SPI_MISO 12
|
||||||
#define AVR_MOSI_PIN 11
|
#define _PIN_SPI_MOSI 11
|
||||||
#define AVR_SS_PIN 10
|
#define _PIN_SPI_SS 10
|
||||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)
|
||||||
#define AVR_SCK_PIN 7
|
#define _PIN_SPI_SCK 7
|
||||||
#define AVR_MISO_PIN 6
|
#define _PIN_SPI_MISO 6
|
||||||
#define AVR_MOSI_PIN 5
|
#define _PIN_SPI_MOSI 5
|
||||||
#define AVR_SS_PIN 4
|
#define _PIN_SPI_SS 4
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
#define AVR_SCK_PIN 52
|
#define _PIN_SPI_SCK 52
|
||||||
#define AVR_MISO_PIN 50
|
#define _PIN_SPI_MISO 50
|
||||||
#define AVR_MOSI_PIN 51
|
#define _PIN_SPI_MOSI 51
|
||||||
#define AVR_SS_PIN 53
|
#define _PIN_SPI_SS 53
|
||||||
#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
|
#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
|
||||||
#define AVR_SCK_PIN 21
|
#define _PIN_SPI_SCK 21
|
||||||
#define AVR_MISO_PIN 23
|
#define _PIN_SPI_MISO 23
|
||||||
#define AVR_MOSI_PIN 22
|
#define _PIN_SPI_MOSI 22
|
||||||
#define AVR_SS_PIN 20
|
#define _PIN_SPI_SS 20
|
||||||
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)
|
||||||
#define AVR_SCK_PIN 10
|
#define _PIN_SPI_SCK 10
|
||||||
#define AVR_MISO_PIN 12
|
#define _PIN_SPI_MISO 12
|
||||||
#define AVR_MOSI_PIN 11
|
#define _PIN_SPI_MOSI 11
|
||||||
#define AVR_SS_PIN 16
|
#define _PIN_SPI_SS 16
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SD_SCK_PIN AVR_SCK_PIN
|
#define SD_SCK_PIN _PIN_SPI_SCK
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MISO_PIN
|
#ifndef SD_MISO_PIN
|
||||||
#define SD_MISO_PIN AVR_MISO_PIN
|
#define SD_MISO_PIN _PIN_SPI_MISO
|
||||||
#endif
|
#endif
|
||||||
#ifndef SD_MOSI_PIN
|
#ifndef SD_MOSI_PIN
|
||||||
#define SD_MOSI_PIN AVR_MOSI_PIN
|
#define SD_MOSI_PIN _PIN_SPI_MOSI
|
||||||
#endif
|
|
||||||
#ifndef SD_SS_PIN
|
|
||||||
#define SD_SS_PIN AVR_SS_PIN
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
typedef uint16_t hal_timer_t;
|
typedef uint16_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
#define HAL_TIMER_TYPE_MAX hal_timer_t(UINT16_MAX)
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Defines
|
// Defines
|
||||||
@@ -50,11 +50,10 @@ typedef uint16_t hal_timer_t;
|
|||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
#define STEPPER_TIMER_PRESCALE 8
|
#define STEPPER_TIMER_PRESCALE 8
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // (MHz) Stepper Timer ticks per µs
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
||||||
@@ -111,8 +110,8 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) {
|
|||||||
* (otherwise, characters will be lost due to UART overflow).
|
* (otherwise, characters will be lost due to UART overflow).
|
||||||
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
* Then: Stepper, Endstops, Temperature, and -finally- all others.
|
||||||
*/
|
*/
|
||||||
#define HAL_timer_isr_prologue(T) NOOP
|
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||||
#define HAL_timer_isr_epilogue(T) NOOP
|
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||||
|
|
||||||
#ifndef HAL_STEP_TIMER_ISR
|
#ifndef HAL_STEP_TIMER_ISR
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -55,12 +55,12 @@
|
|||||||
|
|
||||||
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
|
#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM)
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if HAS_MARLINUI_U8GLIB
|
#if HAS_MARLINUI_U8GLIB
|
||||||
|
|
||||||
#include "../shared/Marduino.h"
|
#include "../../shared/Marduino.h"
|
||||||
#include "../shared/Delay.h"
|
#include "../../shared/Delay.h"
|
||||||
|
|
||||||
#include <U8glib-HAL.h>
|
#include <U8glib-HAL.h>
|
||||||
|
|
||||||
+14
-10
@@ -27,7 +27,6 @@
|
|||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../inc/MarlinConfig.h"
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include "usb/usb_task.h"
|
#include "usb/usb_task.h"
|
||||||
@@ -48,7 +47,7 @@ uint16_t MarlinHAL::adc_result;
|
|||||||
|
|
||||||
void MarlinHAL::init() {
|
void MarlinHAL::init() {
|
||||||
#if HAS_MEDIA
|
#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
|
#endif
|
||||||
usb_task_init(); // Initialize the USB stack
|
usb_task_init(); // Initialize the USB stack
|
||||||
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler
|
||||||
@@ -102,6 +101,10 @@ void watchdogSetup() {
|
|||||||
|
|
||||||
#if ENABLED(USE_WATCHDOG)
|
#if ENABLED(USE_WATCHDOG)
|
||||||
|
|
||||||
|
#ifndef WATCHDOG_PIO_RESET
|
||||||
|
#define WATCHDOG_PIO_RESET
|
||||||
|
#endif
|
||||||
|
|
||||||
// 4 seconds timeout
|
// 4 seconds timeout
|
||||||
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
|
||||||
|
|
||||||
@@ -115,15 +118,16 @@ void watchdogSetup() {
|
|||||||
timeout = 0xFFF;
|
timeout = 0xFFF;
|
||||||
|
|
||||||
// We want to enable the watchdog with the specified timeout
|
// We want to enable the watchdog with the specified timeout
|
||||||
uint32_t value =
|
uint32_t value = (0
|
||||||
WDT_MR_WDV(timeout) | // With the specified timeout
|
| WDT_MR_WDV(timeout) // With the specified timeout
|
||||||
WDT_MR_WDD(timeout) | // and no invalid write window
|
| WDT_MR_WDD(timeout) // and no invalid write window
|
||||||
#if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
|
#if NONE(WATCHDOG_PIO_RESET, SAMV70, SAMV71, SAME70, SAMS70)
|
||||||
WDT_MR_WDRPROC | // WDT fault resets processor only - We want
|
| WDT_MR_WDRPROC // WDT fault resets processor only with this flag.
|
||||||
// to keep PIO controller state
|
// Omit to also reset the PIO controller.
|
||||||
#endif
|
#endif
|
||||||
WDT_MR_WDDBGHLT | // WDT stops in debug state.
|
| WDT_MR_WDDBGHLT // WDT stops in debug state.
|
||||||
WDT_MR_WDIDLEHLT; // WDT stops in idle state.
|
| WDT_MR_WDIDLEHLT // WDT stops in idle state.
|
||||||
|
);
|
||||||
|
|
||||||
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
#if ENABLED(WATCHDOG_RESET_MANUAL)
|
||||||
// We enable the watchdog timer, but only for the interrupt.
|
// We enable the watchdog timer, but only for the interrupt.
|
||||||
|
|||||||
@@ -35,67 +35,9 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "../../core/serial_hook.h"
|
//
|
||||||
|
// Serial Ports
|
||||||
// ------------------------
|
//
|
||||||
// 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 MMU_SERIAL_PORT
|
|
||||||
#if WITHIN(MMU_SERIAL_PORT, 0, 3)
|
|
||||||
#define MMU_SERIAL MSERIAL(MMU_SERIAL_PORT)
|
|
||||||
#else
|
|
||||||
#error "MMU_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
|
|
||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "MarlinSerialUSB.h"
|
#include "MarlinSerialUSB.h"
|
||||||
@@ -190,7 +132,7 @@ public:
|
|||||||
|
|
||||||
static void delay_ms(const int ms) { delay(ms); }
|
static void delay_ms(const int ms) { delay(ms); }
|
||||||
|
|
||||||
// Tasks, called from idle()
|
// Tasks, called from marlin.idle()
|
||||||
static void idletask();
|
static void idletask();
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -600,9 +600,8 @@
|
|||||||
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
OUT_WRITE(SPI_EEPROM1_CS_PIN, HIGH);
|
||||||
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
OUT_WRITE(SPI_EEPROM2_CS_PIN, HIGH);
|
||||||
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
|
||||||
WRITE(SD_SS_PIN, HIGH);
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
|
WRITE(SD_SS_PIN, LOW);
|
||||||
OUT_WRITE(SDSS, LOW);
|
|
||||||
|
|
||||||
PIO_Configure(
|
PIO_Configure(
|
||||||
g_APinDescription[SPI_PIN].pPort,
|
g_APinDescription[SPI_PIN].pPort,
|
||||||
@@ -767,7 +766,7 @@
|
|||||||
|
|
||||||
// Disable PIO on A26 and A27
|
// Disable PIO on A26 and A27
|
||||||
REG_PIOA_PDR = 0x0C000000;
|
REG_PIOA_PDR = 0x0C000000;
|
||||||
OUT_WRITE(SDSS, HIGH);
|
OUT_WRITE(SD_SS_PIN, HIGH);
|
||||||
|
|
||||||
// Reset SPI0 (from sam lib)
|
// Reset SPI0 (from sam lib)
|
||||||
SPI0->SPI_CR = SPI_CR_SPIDIS;
|
SPI0->SPI_CR = SPI_CR_SPIDIS;
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
#include "MarlinSerial.h"
|
#include "MarlinSerial.h"
|
||||||
#include "InterruptVectors.h"
|
#include "InterruptVectors.h"
|
||||||
#include "../../MarlinCore.h"
|
|
||||||
|
|
||||||
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } };
|
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_r MarlinSerial<Cfg>::rx_buffer = { 0, 0, { 0 } };
|
||||||
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 };
|
template<typename Cfg> typename MarlinSerial<Cfg>::ring_buffer_t MarlinSerial<Cfg>::tx_buffer = { 0 };
|
||||||
|
|||||||
@@ -33,6 +33,21 @@
|
|||||||
#include "../../core/types.h"
|
#include "../../core/types.h"
|
||||||
#include "../../core/serial_hook.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
|
// Define constants and variables for buffering incoming serial data. We're
|
||||||
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
// using a ring buffer (I think), in which rx_buffer_head is the index of the
|
||||||
// location to which to write the next incoming character and rx_buffer_tail
|
// location to which to write the next incoming character and rx_buffer_tail
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: Tone function for Arduino Due and compatible (SAM3X8E)
|
* Description: Tone function for Arduino Due and compatible (SAM3X8E)
|
||||||
* Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
* Derived from https://forum.arduino.cc/t/arduino-due-and-tone/133302/13
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if ENABLED(FLASH_EEPROM_EMULATION)
|
#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
|
curGroup = 0xFF; // Current FLASH group
|
||||||
|
|
||||||
#define DEBUG_OUT ENABLED(EE_EMU_DEBUG)
|
#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) {
|
static void ee_Dump(const int page, const void *data) {
|
||||||
|
|
||||||
@@ -953,7 +953,7 @@ static void ee_Init() {
|
|||||||
|
|
||||||
/* PersistentStore -----------------------------------------------------------*/
|
/* PersistentStore -----------------------------------------------------------*/
|
||||||
|
|
||||||
#include "../shared/eeprom_api.h"
|
#include "../../shared/eeprom_api.h"
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_SAM
|
#ifdef ARDUINO_ARCH_SAM
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#if USE_WIRED_EEPROM
|
#if USE_WIRED_EEPROM
|
||||||
|
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
* with simple implementations supplied by Marlin.
|
* with simple implementations supplied by Marlin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../shared/eeprom_if.h"
|
#include "../../shared/eeprom_if.h"
|
||||||
#include "../shared/eeprom_api.h"
|
#include "../../shared/eeprom_api.h"
|
||||||
|
|
||||||
#ifndef MARLIN_EEPROM_SIZE
|
#ifndef MARLIN_EEPROM_SIZE
|
||||||
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
#error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM."
|
||||||
@@ -40,11 +40,12 @@
|
|||||||
* Some jitter in the Vref signal is OK so the interrupt priority is left at its default value.
|
* 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)
|
#if MB(PRINTRBOARD_G2)
|
||||||
|
|
||||||
#include "G2_PWM.h"
|
#include "G2_PWM.h"
|
||||||
|
#include "../../../module/stepper.h"
|
||||||
|
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
||||||
#define G2_PWM_X 1
|
#define G2_PWM_X 1
|
||||||
@@ -56,16 +57,12 @@
|
|||||||
#else
|
#else
|
||||||
#define G2_PWM_Y 0
|
#define G2_PWM_Y 0
|
||||||
#endif
|
#endif
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
#if HAS_MOTOR_CURRENT_PWM_Z
|
||||||
#define G2_PWM_Z 1
|
#define G2_PWM_Z 1
|
||||||
#else
|
#else
|
||||||
#define G2_PWM_Z 0
|
#define G2_PWM_Z 0
|
||||||
#endif
|
#endif
|
||||||
#if HAS_MOTOR_CURRENT_PWM_E
|
#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E
|
||||||
#define G2_PWM_E 1
|
|
||||||
#else
|
|
||||||
#define G2_PWM_E 0
|
|
||||||
#endif
|
|
||||||
#define G2_MASK_X(V) (G2_PWM_X * (V))
|
#define G2_MASK_X(V) (G2_PWM_X * (V))
|
||||||
#define G2_MASK_Y(V) (G2_PWM_Y * (V))
|
#define G2_MASK_Y(V) (G2_PWM_Y * (V))
|
||||||
#define G2_MASK_Z(V) (G2_PWM_Z * (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() {
|
void Stepper::digipot_init() {
|
||||||
|
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_X)
|
#if G2_PWM_X
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins
|
OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins
|
||||||
#endif
|
#endif
|
||||||
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y)
|
#if G2_PWM_Y
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0);
|
OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if G2_PWM_Z
|
#if G2_PWM_Z
|
||||||
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0);
|
OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW);
|
||||||
#endif
|
#endif
|
||||||
#if G2_PWM_E
|
#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
|
#endif
|
||||||
|
|
||||||
#define WPKEY (0x50574D << 8) // “PWM” in ASCII
|
#define WPKEY (0x50574D << 8) // “PWM” in ASCII
|
||||||
|
|||||||
@@ -26,10 +26,7 @@
|
|||||||
* PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
|
* PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../../../inc/MarlinConfigPre.h"
|
#include <stdint.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
|
|
||||||
|
|
||||||
#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
|
#define PWM_PERIOD_US 100 // base repetition rate in micro seconds
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,26 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Support routines for Due
|
* Pins Debugging for DUE
|
||||||
*/
|
*
|
||||||
|
* - NUMBER_PINS_TOTAL
|
||||||
/**
|
* - MULTI_NAME_PAD
|
||||||
* Translation of routines & variables used by pinsDebug.h
|
* - 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"
|
#include "../shared/Marduino.h"
|
||||||
@@ -63,20 +76,20 @@
|
|||||||
|
|
||||||
#define NUMBER_PINS_TOTAL PINS_COUNT
|
#define NUMBER_PINS_TOTAL PINS_COUNT
|
||||||
|
|
||||||
#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin
|
#define digitalRead_mod(P) extDigitalRead(P) // AVR digitalRead disabled PWM before it read the pin
|
||||||
#define printPinNameByIndex(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); 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 printPinNumber(p) do{ sprintf_P(buffer, PSTR("%02d"), p); 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(pin)); SERIAL_ECHO(buffer); }while(0)
|
#define printPinAnalog(P) do{ sprintf_P(buffer, PSTR(" (A%2d) "), digitalPinToAnalogIndex(P)); SERIAL_ECHO(buffer); }while(0)
|
||||||
#define getPinByIndex(p) pin_array[p].pin
|
#define getPinByIndex(x) pin_array[x].pin
|
||||||
#define getPinIsDigitalByIndex(p) pin_array[p].is_digital
|
#define getPinIsDigitalByIndex(x) pin_array[x].is_digital
|
||||||
#define isValidPin(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL))
|
#define isValidPin(P) (P >= 0 && P < pin_t(NUMBER_PINS_TOTAL))
|
||||||
#define digitalPinToAnalogIndex(p) int(p - analogInputToDigitalPin(0))
|
#define digitalPinToAnalogIndex(P) int(P - analogInputToDigitalPin(0))
|
||||||
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
#define isAnalogPin(P) WITHIN(P, pin_t(analogInputToDigitalPin(0)), pin_t(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1)))
|
||||||
#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \
|
#define pwm_status(P) (((g_pinStatus[P] & 0xF) == PIN_STATUS_PWM) && \
|
||||||
((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_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
|
#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin
|
||||||
|
|
||||||
bool getValidPinMode(int8_t pin) { // 1: output, 0: input
|
bool getValidPinMode(const pin_t pin) { // 1: output, 0: input
|
||||||
volatile Pio* port = g_APinDescription[pin].pPort;
|
volatile Pio* port = g_APinDescription[pin].pPort;
|
||||||
uint32_t mask = g_APinDescription[pin].ulPin;
|
uint32_t mask = g_APinDescription[pin].ulPin;
|
||||||
uint8_t pin_status = g_pinStatus[pin] & 0xF;
|
uint8_t pin_status = g_pinStatus[pin] & 0xF;
|
||||||
@@ -85,7 +98,7 @@ bool getValidPinMode(int8_t pin) { // 1: output, 0: input
|
|||||||
|| pwm_status(pin));
|
|| pwm_status(pin));
|
||||||
}
|
}
|
||||||
|
|
||||||
void printPinPWM(int32_t pin) {
|
void printPinPWM(const int32_t pin) {
|
||||||
if (pwm_status(pin)) {
|
if (pwm_status(pin)) {
|
||||||
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
uint32_t chan = g_APinDescription[pin].ulPWMChannel;
|
||||||
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
SERIAL_ECHOPGM("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY);
|
||||||
|
|||||||
@@ -26,28 +26,28 @@
|
|||||||
*
|
*
|
||||||
* Available chip select pins for HW SPI are 4 10 52 77 87
|
* 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 SD_SS_PIN == 4 || SD_SS_PIN == 10 || SD_SS_PIN == 52 || SD_SS_PIN == 77 || SD_SS_PIN == 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_SCK_PIN 76
|
||||||
#define SD_MISO_PIN 74
|
#define SD_MISO_PIN 74
|
||||||
#define SD_MOSI_PIN 75
|
#define SD_MOSI_PIN 75
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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
|
#else
|
||||||
// defaults
|
|
||||||
#define SOFTWARE_SPI
|
#define SOFTWARE_SPI
|
||||||
#ifndef SD_SCK_PIN
|
#ifndef SD_SCK_PIN
|
||||||
#define SD_SCK_PIN 52
|
#define SD_SCK_PIN 52
|
||||||
@@ -59,6 +59,3 @@
|
|||||||
#define SD_MOSI_PIN 51
|
#define SD_MOSI_PIN 51
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* A.28, A.29, B.21, C.26, C.29 */
|
|
||||||
#define SD_SS_PIN SDSS
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX hal_timer_t(UINT32_MAX)
|
||||||
|
|
||||||
#define HAL_TIMER_PRESCALER 2
|
#define HAL_TIMER_PRESCALER 2
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
#define HAL_TIMER_RATE ((F_CPU) / (HAL_TIMER_PRESCALER)) // frequency of timers peripherals
|
||||||
@@ -52,15 +52,14 @@ typedef uint32_t hal_timer_t;
|
|||||||
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones
|
#define MF_TIMER_TONE 6 // index of timer to use for beeper tones
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // (Hz) Frequency of Stepper Timer ISR (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||||
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000UL) // (MHz) Stepper Timer ticks per µs
|
||||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||||
@@ -127,4 +126,4 @@ FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) {
|
|||||||
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HAL_timer_isr_epilogue(T) NOOP
|
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
[{*.c,*.cpp,*.h}]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
@@ -63,8 +63,8 @@
|
|||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
#include "preprocessor.h"
|
#include "preprocessor.h"
|
||||||
#ifdef FREERTOS_USED
|
#ifdef FREERTOS_USED
|
||||||
#include "FreeRTOS.h"
|
#include <FreeRTOS.h>
|
||||||
#include "semphr.h"
|
#include <semphr.h>
|
||||||
#endif
|
#endif
|
||||||
#include "ctrl_access.h"
|
#include "ctrl_access.h"
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,7 @@ void sd_mmc_spi_mem_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline bool media_ready() {
|
inline bool media_ready() {
|
||||||
return DISABLED(DISABLE_DUE_SD_MMC)
|
return card.isMounted() && card.isInserted() && !card.isFileOpen() && !card.isStillPrinting();
|
||||||
&& IS_SD_MOUNTED() && IS_SD_INSERTED()
|
|
||||||
&& !IS_SD_FILE_OPEN() && !IS_SD_PRINTING();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sd_mmc_spi_unload(bool) { return true; }
|
bool sd_mmc_spi_unload(bool) { return true; }
|
||||||
@@ -31,8 +29,10 @@ bool sd_mmc_spi_wr_protect() { return false; }
|
|||||||
bool sd_mmc_spi_removal() { return !media_ready(); }
|
bool sd_mmc_spi_removal() { return !media_ready(); }
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
Ctrl_status sd_mmc_spi_test_unit_ready() {
|
||||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||||
return CTRL_GOOD;
|
return CTRL_NO_PRESENT;
|
||||||
|
#endif
|
||||||
|
return sd_mmc_spi_removal() ? CTRL_NO_PRESENT : CTRL_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: This function is defined as returning the address of the last block
|
// NOTE: This function is defined as returning the address of the last block
|
||||||
@@ -57,6 +57,10 @@ uint8_t sector_buf[SD_MMC_BLOCK_SIZE];
|
|||||||
// #define DEBUG_MMC
|
// #define DEBUG_MMC
|
||||||
|
|
||||||
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) {
|
||||||
|
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
@@ -93,6 +97,10 @@ 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) {
|
Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) {
|
||||||
|
#if ENABLED(DISABLE_DUE_SD_MMC)
|
||||||
|
return CTRL_NO_PRESENT;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
if (sd_mmc_spi_removal()) return CTRL_NO_PRESENT;
|
||||||
|
|
||||||
#ifdef DEBUG_MMC
|
#ifdef DEBUG_MMC
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
|
|||||||
* - USB Device Controller (UDC) provides USB chapter 9 compliance
|
* - USB Device Controller (UDC) provides USB chapter 9 compliance
|
||||||
* - USB Device Interface (UDI) provides USB Class compliance
|
* - USB Device Interface (UDI) provides USB Class compliance
|
||||||
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
||||||
|
*
|
||||||
* Many USB Device applications can be implemented on Atmel MCU.
|
* Many USB Device applications can be implemented on Atmel MCU.
|
||||||
* Atmel provides many application notes for different applications:
|
* Atmel provides many application notes for different applications:
|
||||||
* - AVR4900, provides general information about Device Stack
|
* - AVR4900, provides general information about Device Stack
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ static bool udd_ep_interrupt(void);
|
|||||||
* \internal
|
* \internal
|
||||||
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts
|
* \brief Function called by UOTGHS interrupt to manage USB Device interrupts
|
||||||
*
|
*
|
||||||
* USB Device interrupt events are splited in three parts:
|
* USB Device interrupt events are split in three parts:
|
||||||
* - USB line events (SOF, reset, suspend, resume, wakeup)
|
* - USB line events (SOF, reset, suspend, resume, wakeup)
|
||||||
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
|
* - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
|
||||||
* - bulk/interrupt/isochronous endpoints events (end of data transfer)
|
* - bulk/interrupt/isochronous endpoints events (end of data transfer)
|
||||||
@@ -1567,7 +1567,7 @@ static void udd_ctrl_out_received(void)
|
|||||||
udd_ctrl_payload_buf_cnt))) {
|
udd_ctrl_payload_buf_cnt))) {
|
||||||
// End of reception because it is a short packet
|
// End of reception because it is a short packet
|
||||||
// Before send ZLP, call intermediate callback
|
// Before send ZLP, call intermediate callback
|
||||||
// in case of data receiv generate a stall
|
// in case of data receive generate a stall
|
||||||
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt;
|
||||||
if (NULL != udd_g_ctrlreq.over_under_run) {
|
if (NULL != udd_g_ctrlreq.over_under_run) {
|
||||||
if (!udd_g_ctrlreq.over_under_run()) {
|
if (!udd_g_ctrlreq.over_under_run()) {
|
||||||
@@ -1808,7 +1808,7 @@ static void udd_ep_trans_done(udd_ep_id_t ep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ptr_job->buf_cnt != ptr_job->buf_size) {
|
if (ptr_job->buf_cnt != ptr_job->buf_size) {
|
||||||
// Need to send or receiv other data
|
// Need to send or receive other data
|
||||||
next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
|
next_trans = ptr_job->buf_size - ptr_job->buf_cnt;
|
||||||
|
|
||||||
if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
|
if (UDD_ENDPOINT_MAX_TRANS < next_trans) {
|
||||||
|
|||||||
@@ -34,13 +34,13 @@
|
|||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
#include "wifi.h"
|
#include "wifi/wifi.h"
|
||||||
#if ENABLED(OTASUPPORT)
|
#if ENABLED(OTASUPPORT)
|
||||||
#include "ota.h"
|
#include "wifi/ota.h"
|
||||||
#endif
|
#endif
|
||||||
#if ENABLED(WEBSUPPORT)
|
#if ENABLED(WEBSUPPORT)
|
||||||
#include "spiffs.h"
|
#include "wifi/spiffs.h"
|
||||||
#include "web.h"
|
#include "wifi/web.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -175,8 +175,6 @@ uint8_t MarlinHAL::get_reset_source() { return rtc_get_reset_reason(1); }
|
|||||||
|
|
||||||
void MarlinHAL::reboot() { ESP.restart(); }
|
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
|
// return free memory between end of heap (or end bss) and whatever is current
|
||||||
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
int MarlinHAL::freeMemory() { return ESP.getFreeHeap(); }
|
||||||
|
|
||||||
@@ -244,12 +242,13 @@ void MarlinHAL::adc_init() {
|
|||||||
TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_PROBE, adc1_set_attenuation(get_channel(TEMP_PROBE_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(HAS_TEMP_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_TEMP_ADC_BOARD, adc1_set_attenuation(get_channel(TEMP_BOARD_PIN), ADC_ATTEN_11db));
|
||||||
TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
TERN_(HAS_FILWIDTH_ADC, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db));
|
||||||
|
TERN_(HAS_FILWIDTH2_ADC, adc1_set_attenuation(get_channel(FILWIDTH2_PIN), ADC_ATTEN_11db));
|
||||||
|
|
||||||
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
// Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail.
|
||||||
// That's why we're not setting it up here.
|
// That's why we're not setting it up here.
|
||||||
@@ -272,7 +271,8 @@ void MarlinHAL::adc_start(const pin_t pin) {
|
|||||||
uint32_t mv;
|
uint32_t mv;
|
||||||
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
|
esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv);
|
||||||
|
|
||||||
adc_result = mv * isr_float_t(1023) / isr_float_t(ADC_REFERENCE_VOLTAGE) / isr_float_t(1000);
|
static constexpr uint32_t adc_divisor = uint32_t((ADC_REFERENCE_VOLTAGE) * 1000UL);
|
||||||
|
adc_result = (mv * 1023UL) / adc_divisor;
|
||||||
|
|
||||||
// Change the attenuation level based on the new reading
|
// Change the attenuation level based on the new reading
|
||||||
adc_atten_t atten;
|
adc_atten_t atten;
|
||||||
|
|||||||
@@ -37,11 +37,11 @@
|
|||||||
#include "i2s.h"
|
#include "i2s.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
#include "WebSocketSerial.h"
|
#include "wifi/WebSocketSerial.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#include "esp3dlib.h"
|
#include <esp3dlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "FlushableHardwareSerial.h"
|
#include "FlushableHardwareSerial.h"
|
||||||
@@ -64,10 +64,10 @@
|
|||||||
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&hal.spinlock)
|
||||||
|
|
||||||
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment
|
||||||
#define PWM_FREQUENCY 1000u // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
#define PWM_FREQUENCY 1000U // Default PWM frequency when set_pwm_duty() is called without set_pwm_frequency()
|
||||||
#define PWM_RESOLUTION 10u // Default PWM bit resolution
|
#define PWM_RESOLUTION 10U // Default PWM bit resolution
|
||||||
#define CHANNEL_MAX_NUM 15u // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
#define CHANNEL_MAX_NUM 15U // max PWM channel # to allocate (7 to only use low speed, 15 to use low & high)
|
||||||
#define MAX_PWM_IOPIN 33u // hardware pwm pins < 34
|
#define MAX_PWM_IOPIN 33U // hardware pwm pins < 34
|
||||||
#ifndef MAX_EXPANDER_BITS
|
#ifndef MAX_EXPANDER_BITS
|
||||||
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
#define MAX_EXPANDER_BITS 32 // I2S expander bit width (max 32)
|
||||||
#endif
|
#endif
|
||||||
@@ -76,7 +76,6 @@
|
|||||||
// Types
|
// Types
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs.
|
|
||||||
typedef int16_t pin_t;
|
typedef int16_t pin_t;
|
||||||
|
|
||||||
typedef struct pwm_pin {
|
typedef struct pwm_pin {
|
||||||
@@ -165,8 +164,6 @@ int freeMemory();
|
|||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
void _delay_ms(const int ms);
|
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// MarlinHAL Class
|
// MarlinHAL Class
|
||||||
// ------------------------
|
// ------------------------
|
||||||
@@ -194,9 +191,9 @@ public:
|
|||||||
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
static void isr_on() { if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock); }
|
||||||
static void isr_off() { portENTER_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()
|
// Tasks, called from marlin.idle()
|
||||||
static void idletask();
|
static void idletask();
|
||||||
|
|
||||||
// Reset
|
// Reset
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Servo::Servo() {}
|
|||||||
|
|
||||||
int8_t Servo::attach(const int inPin) {
|
int8_t Servo::attach(const int inPin) {
|
||||||
if (inPin > 0) pin = inPin;
|
if (inPin > 0) pin = inPin;
|
||||||
channel = get_pwm_channel(pin, 50u, 16u);
|
channel = get_pwm_channel(pin, 50U, 16U);
|
||||||
return channel; // -1 if no PWM avail.
|
return channel; // -1 if no PWM avail.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: Tone function for ESP32
|
* Description: Tone function for ESP32
|
||||||
* Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012
|
* Derived from https://forum.arduino.cc/t/arduino-due-and-tone/133302/13
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|||||||
@@ -37,6 +37,10 @@
|
|||||||
// Set pin as output
|
// Set pin as output
|
||||||
#define _SET_OUTPUT(IO) pinMode(IO, 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
|
// Set pin as input with pullup mode
|
||||||
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT)
|
||||||
|
|
||||||
@@ -70,6 +74,9 @@
|
|||||||
// Set pin as output and init
|
// Set pin as output and init
|
||||||
#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
|
#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
|
// digitalRead/Write wrappers
|
||||||
#define extDigitalRead(IO) digitalRead(IO)
|
#define extDigitalRead(IO) digitalRead(IO)
|
||||||
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
#define extDigitalWrite(IO,V) digitalWrite(IO,V)
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ static void IRAM_ATTR i2s_intr_handler_default(void *arg) {
|
|||||||
void stepperTask(void *parameter) {
|
void stepperTask(void *parameter) {
|
||||||
uint32_t nextMainISR = 0;
|
uint32_t nextMainISR = 0;
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
uint32_t nextAdvanceISR = Stepper::LA_ADV_NEVER;
|
uint32_t nextAdvanceISR = stepper.LA_ADV_NEVER;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -156,24 +156,26 @@ void stepperTask(void *parameter) {
|
|||||||
|
|
||||||
while (dma.rw_pos < DMA_SAMPLE_COUNT) {
|
while (dma.rw_pos < DMA_SAMPLE_COUNT) {
|
||||||
|
|
||||||
#if ENABLED(FT_MOTION)
|
|
||||||
|
|
||||||
if (using_ftMotion) {
|
if (using_ftMotion) {
|
||||||
|
|
||||||
|
#if ENABLED(FT_MOTION)
|
||||||
if (!nextMainISR) stepper.ftMotion_stepper();
|
if (!nextMainISR) stepper.ftMotion_stepper();
|
||||||
nextMainISR = 0;
|
nextMainISR = 0;
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!using_ftMotion) {
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
#if HAS_STANDARD_MOTION
|
||||||
|
|
||||||
if (!nextMainISR) {
|
if (!nextMainISR) {
|
||||||
Stepper::pulse_phase_isr();
|
stepper.pulse_phase_isr();
|
||||||
nextMainISR = Stepper::block_phase_isr();
|
nextMainISR = stepper.block_phase_isr();
|
||||||
}
|
}
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
else if (!nextAdvanceISR) {
|
else if (!nextAdvanceISR) {
|
||||||
Stepper::advance_isr();
|
stepper.advance_isr();
|
||||||
nextAdvanceISR = Stepper::la_interval;
|
nextAdvanceISR = stepper.la_interval;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
@@ -182,12 +184,15 @@ void stepperTask(void *parameter) {
|
|||||||
nextMainISR--;
|
nextMainISR--;
|
||||||
|
|
||||||
#if ENABLED(LIN_ADVANCE)
|
#if ENABLED(LIN_ADVANCE)
|
||||||
if (nextAdvanceISR == Stepper::LA_ADV_NEVER)
|
if (nextAdvanceISR == stepper.LA_ADV_NEVER)
|
||||||
nextAdvanceISR = Stepper::la_interval;
|
nextAdvanceISR = stepper.la_interval;
|
||||||
|
|
||||||
if (nextAdvanceISR && nextAdvanceISR != Stepper::LA_ADV_NEVER)
|
if (nextAdvanceISR && nextAdvanceISR != stepper.LA_ADV_NEVER)
|
||||||
nextAdvanceISR--;
|
nextAdvanceISR--;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif // HAS_STANDARD_MOTION
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ALL(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA)
|
#if ALL(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA)
|
||||||
#error "I2S stream is currently incompatible with LIN_ADVANCE."
|
#error "I2S stream is currently incompatible with LIN_ADVANCE. Enable EXPERIMENTAL_I2S_LA to proceed anyway."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ALL(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC)
|
#if ALL(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC)
|
||||||
|
|||||||
@@ -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
|
#pragma once
|
||||||
|
|
||||||
#define SD_SS_PIN SDSS
|
#define PIN_SPI_SCK 18
|
||||||
#define SD_SCK_PIN 18
|
#define PIN_SPI_MISO 19
|
||||||
#define SD_MISO_PIN 19
|
#define PIN_SPI_MOSI 23
|
||||||
#define SD_MOSI_PIN 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
|
||||||
|
|||||||
@@ -30,41 +30,45 @@
|
|||||||
#define FORCE_INLINE __attribute__((always_inline)) inline
|
#define FORCE_INLINE __attribute__((always_inline)) inline
|
||||||
|
|
||||||
typedef uint64_t hal_timer_t;
|
typedef uint64_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL
|
#define HAL_TIMER_TYPE_MAX hal_timer_t(UINT64_MAX)
|
||||||
|
|
||||||
#ifndef MF_TIMER_STEP
|
#ifndef MF_TIMER_STEP
|
||||||
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
#define MF_TIMER_STEP 0 // Timer Index for Stepper
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_PULSE
|
#ifndef MF_TIMER_PULSE
|
||||||
#define MF_TIMER_PULSE MF_TIMER_STEP
|
#define MF_TIMER_PULSE MF_TIMER_STEP // Timer Index for Pulse interval
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_TEMP
|
#ifndef MF_TIMER_TEMP
|
||||||
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
#define MF_TIMER_TEMP 1 // Timer Index for Temperature
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_PWM
|
#ifndef MF_TIMER_PWM
|
||||||
#define MF_TIMER_PWM 2 // index of timer to use for PWM outputs
|
#define MF_TIMER_PWM 2 // Timer Index for PWM outputs
|
||||||
#endif
|
#endif
|
||||||
#ifndef MF_TIMER_TONE
|
#ifndef MF_TIMER_TONE
|
||||||
#define MF_TIMER_TONE 3 // index of timer for beeper tones
|
#define MF_TIMER_TONE 3 // Timer Index for beeper tones
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals
|
#define HAL_TIMER_RATE APB_CLK_FREQ // Frequency of timer peripherals
|
||||||
|
|
||||||
|
#define TEMP_TIMER_PRESCALE 1000 // Prescaler for setting Temp Timer, 72Khz
|
||||||
|
#define TEMP_TIMER_FREQUENCY 1000 // (Hz) Temperature ISR frequency
|
||||||
|
|
||||||
#if ENABLED(I2S_STEPPER_STREAM)
|
#if ENABLED(I2S_STEPPER_STREAM)
|
||||||
#define STEPPER_TIMER_PRESCALE 1
|
#define STEPPER_TIMER_PRESCALE 1
|
||||||
#define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock
|
#define STEPPER_TIMER_RATE 250'000 // 250khz, 4µs pulses of i2s word clock
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US 0.25 // (MHz) Stepper Timer ticks per µs
|
||||||
#else
|
#else
|
||||||
#define STEPPER_TIMER_PRESCALE 40
|
#define STEPPER_TIMER_PRESCALE 40
|
||||||
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz
|
#define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // (Hz) Frequency of Stepper Timer ISR, 2MHz
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1'000'000UL) // (MHz) Stepper Timer ticks per µs
|
||||||
#endif
|
#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
|
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
||||||
|
|
||||||
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // (Hz) Frequency of Pulse Timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TONE_TIMER_PRESCALE 1000 // Arbitrary value, no idea what i'm doing here
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
|
||||||
|
|
||||||
#define PWM_TIMER_PRESCALE 10
|
#define PWM_TIMER_PRESCALE 10
|
||||||
#if ENABLED(FAST_PWM_FAN)
|
#if ENABLED(FAST_PWM_FAN)
|
||||||
@@ -74,10 +78,6 @@ typedef uint64_t hal_timer_t;
|
|||||||
#endif
|
#endif
|
||||||
#define MAX_PWM_PINS 32 // Number of PWM pin-slots
|
#define MAX_PWM_PINS 32 // Number of PWM pin-slots
|
||||||
|
|
||||||
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
|
||||||
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
|
||||||
@@ -135,5 +135,5 @@ void HAL_timer_enable_interrupt(const uint8_t timer_num);
|
|||||||
void HAL_timer_disable_interrupt(const uint8_t timer_num);
|
void HAL_timer_disable_interrupt(const uint8_t timer_num);
|
||||||
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
bool HAL_timer_interrupt_enabled(const uint8_t timer_num);
|
||||||
|
|
||||||
#define HAL_timer_isr_prologue(T) NOOP
|
inline void HAL_timer_isr_prologue(const uint8_t) {}
|
||||||
#define HAL_timer_isr_epilogue(T) NOOP
|
inline void HAL_timer_isr_epilogue(const uint8_t) {}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
#if HAS_MEDIA
|
#if HAS_MEDIA
|
||||||
#include "../../sd/cardreader.h"
|
#include "../../sd/cardreader.h"
|
||||||
#if ENABLED(ESP3D_WIFISUPPORT)
|
#if ENABLED(ESP3D_WIFISUPPORT)
|
||||||
#include "sd_ESP32.h"
|
#include <sd_ESP32.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
|
|
||||||
+2
-2
@@ -21,8 +21,8 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
#include "../../core/serial_hook.h"
|
#include "../../../core/serial_hook.h"
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
||||||
@@ -22,11 +22,15 @@
|
|||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
#undef ENABLED
|
||||||
|
#undef DISABLED
|
||||||
|
|
||||||
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, OTASUPPORT)
|
#if ALL(WIFISUPPORT, OTASUPPORT)
|
||||||
|
|
||||||
#include <WiFi.h>
|
|
||||||
#include <ESPmDNS.h>
|
#include <ESPmDNS.h>
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
#include <ArduinoOTA.h>
|
#include <ArduinoOTA.h>
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||||
|
|
||||||
#include "../../core/serial.h"
|
#include "../../../core/serial.h"
|
||||||
|
|
||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
#include <SPIFFS.h>
|
#include <SPIFFS.h>
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
|
|
||||||
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
#if ALL(WIFISUPPORT, WEBSUPPORT)
|
||||||
|
|
||||||
#include "../../inc/MarlinConfig.h"
|
#include "../../../inc/MarlinConfig.h"
|
||||||
|
|
||||||
#undef DISABLED // esp32-hal-gpio.h
|
#undef DISABLED // esp32-hal-gpio.h
|
||||||
#include <SPIFFS.h>
|
#include <SPIFFS.h>
|
||||||
@@ -21,11 +21,12 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
|
||||||
#include "../../core/serial.h"
|
#include "../../../inc/MarlinConfigPre.h"
|
||||||
#include "../../inc/MarlinConfigPre.h"
|
|
||||||
|
|
||||||
#if ENABLED(WIFISUPPORT)
|
#if ENABLED(WIFISUPPORT)
|
||||||
|
|
||||||
|
#include "../../../core/serial.h"
|
||||||
|
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <ESPmDNS.h>
|
#include <ESPmDNS.h>
|
||||||
#include <ESPAsyncWebServer.h>
|
#include <ESPAsyncWebServer.h>
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
* 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() {
|
||||||
|
// Ensure F_CPU is a constant expression.
|
||||||
|
// If the compiler breaks here, it means that delay code that should compute at compile time will not work.
|
||||||
|
// So better safe than sorry here.
|
||||||
|
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,159 @@
|
|||||||
|
/**
|
||||||
|
* 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 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() = default;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
auto MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) -> MarlinSerial& {
|
||||||
|
auto& 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 auto 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 auto get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN) -> MarlinSerial&;
|
||||||
|
|
||||||
|
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
|
||||||
|
auto get_last_data() -> uint8_t { 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,9 @@
|
|||||||
|
# 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(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 // 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;
|
||||||
|
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,86 @@
|
|||||||
|
/**
|
||||||
|
* 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 GD32
|
||||||
|
|
||||||
|
#include <GPIO.hpp>
|
||||||
|
#include <variant.h>
|
||||||
|
#include <PinOps.hpp>
|
||||||
|
#include <PinOpsMap.hpp>
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
FORCE_INLINE static void fast_write_pin_wrapper(pin_size_t IO, T V) {
|
||||||
|
const PortPinPair& pp = port_pin_map[IO];
|
||||||
|
gpio::fast_write_pin(pp.port, pp.pin, static_cast<bool>(V));
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE static auto fast_read_pin_wrapper(pin_size_t IO) -> bool {
|
||||||
|
const PortPinPair& pp = port_pin_map[IO];
|
||||||
|
return gpio::fast_read_pin(pp.port, pp.pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
FORCE_INLINE static void fast_toggle_pin_wrapper(pin_size_t IO) {
|
||||||
|
const PortPinPair& pp = port_pin_map[IO];
|
||||||
|
gpio::fast_toggle_pin(pp.port, pp.pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// 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,104 @@
|
|||||||
|
/**
|
||||||
|
* 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) {
|
||||||
|
const PortPinPair& pp = port_pin_map[pin];
|
||||||
|
auto& instance = gpio::GPIO::get_instance(pp.port).value();
|
||||||
|
return instance.get_pin_mode(pp.pin) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getValidPinMode(const pin_t pin) {
|
||||||
|
if (!isValidPin(pin)) return false;
|
||||||
|
|
||||||
|
const PortPinPair& pp = port_pin_map[pin];
|
||||||
|
auto& instance = gpio::GPIO::get_instance(pp.port).value();
|
||||||
|
gpio::Pin_Mode mode = instance.get_pin_mode(pp.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,222 @@
|
|||||||
|
//
|
||||||
|
// 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 auto get_instance() -> CardDMA&;
|
||||||
|
|
||||||
|
// Initialization
|
||||||
|
auto init() -> SDIO_Error_Type;
|
||||||
|
auto card_init() -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Startup and shutdown procedures
|
||||||
|
auto begin_startup_procedure() -> SDIO_Error_Type;
|
||||||
|
void begin_shutdown_procedure();
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
auto set_hardware_bus_width(Bus_Width width) -> SDIO_Error_Type;
|
||||||
|
auto send_bus_width_command(uint32_t width_value) -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Main read/write/erase functions
|
||||||
|
auto read(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
|
||||||
|
auto write(uint8_t* buf, uint32_t address, uint32_t count) -> SDIO_Error_Type;
|
||||||
|
auto erase(uint32_t address_start, uint32_t address_end) -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Card select
|
||||||
|
auto select_deselect() -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Status and state
|
||||||
|
auto get_card_interface_status(uint32_t* status) -> SDIO_Error_Type;
|
||||||
|
auto get_sdcard_status(uint32_t* status) -> SDIO_Error_Type;
|
||||||
|
auto get_transfer_state() -> Transfer_State;
|
||||||
|
auto get_card_state(Card_State* card_state) -> SDIO_Error_Type;
|
||||||
|
auto check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false) -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// DMA
|
||||||
|
void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write);
|
||||||
|
void check_dma_complete();
|
||||||
|
|
||||||
|
// Stop transfer
|
||||||
|
auto stop_transfer() -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Card information
|
||||||
|
auto get_card_specific_data(Card_Info* info) -> SDIO_Error_Type;
|
||||||
|
constexpr auto get_data_block_size_index(uint16_t size) -> Block_Size;
|
||||||
|
[[nodiscard]] auto get_card_capacity() const -> uint32_t;
|
||||||
|
|
||||||
|
// SDIO configuration
|
||||||
|
void sdio_configure(const SDIO_Config config) { sdio_.init(config); }
|
||||||
|
|
||||||
|
// Interrupt handler
|
||||||
|
void handle_interrupts();
|
||||||
|
|
||||||
|
// Variable stored parameters
|
||||||
|
auto get_scr(uint16_t rca, uint32_t* scr) -> SDIO_Error_Type;
|
||||||
|
auto store_cid() -> SDIO_Error_Type;
|
||||||
|
auto store_csd() -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// Inlined accessor methods
|
||||||
|
auto get_config() -> SDIO_Config& { return config_; }
|
||||||
|
auto get_dma_instance() -> dma::DMA& { 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); }
|
||||||
|
auto get_is_sdio_rx() -> bool { 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); }
|
||||||
|
auto get_state() -> Operational_State { return current_state_; }
|
||||||
|
void set_state(Operational_State state) { current_state_ = state; }
|
||||||
|
void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; }
|
||||||
|
void set_transfer_end(bool end) { transfer_end_ = end; };
|
||||||
|
|
||||||
|
auto set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) -> SDIO_Error_Type {
|
||||||
|
sdio_.init(SDIO_Config{
|
||||||
|
.desired_clock = desired_clock,
|
||||||
|
.enable_bypass = false,
|
||||||
|
.enable_powersave = low_power,
|
||||||
|
.enable_hwclock = false,
|
||||||
|
.clock_edge = Clock_Edge::RISING_EDGE,
|
||||||
|
.width = wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT
|
||||||
|
});
|
||||||
|
|
||||||
|
sync_domains();
|
||||||
|
desired_clock_ = desired_clock;
|
||||||
|
|
||||||
|
return SDIO_Error_Type::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
CardDMA();
|
||||||
|
|
||||||
|
// Prevent copying or assigning
|
||||||
|
CardDMA(const CardDMA&) = delete;
|
||||||
|
auto operator=(const CardDMA&) -> CardDMA& = delete;
|
||||||
|
|
||||||
|
// Helper function
|
||||||
|
auto wait_for_card_ready() -> SDIO_Error_Type;
|
||||||
|
|
||||||
|
// 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 total_bytes_;
|
||||||
|
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_;
|
||||||
|
Operational_State current_state_;
|
||||||
|
bool transfer_end_;
|
||||||
|
bool multiblock_;
|
||||||
|
bool is_rx_;
|
||||||
|
|
||||||
|
// Private helper methods
|
||||||
|
auto validate_voltage() -> SDIO_Error_Type;
|
||||||
|
auto get_command_sent_result() -> SDIO_Error_Type;
|
||||||
|
auto get_r1_result(Command_Index index) -> SDIO_Error_Type;
|
||||||
|
auto get_r6_result(Command_Index index, uint16_t* rca) -> SDIO_Error_Type;
|
||||||
|
auto get_r7_result() -> SDIO_Error_Type { return check_sdio_status(Command_Index::INVALID, false, false); };
|
||||||
|
void sync_domains() { delayMicroseconds(8); }
|
||||||
|
|
||||||
|
auto validate_transfer_params(uint32_t* buf, uint16_t size) -> bool {
|
||||||
|
if (buf == nullptr) return false;
|
||||||
|
// Size must be > 0, <= 2048 and power of 2
|
||||||
|
return size > 0U && size <= 2048U && !(size & (size - 1U));
|
||||||
|
}
|
||||||
|
|
||||||
|
void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) {
|
||||||
|
const uint32_t device_size = ((csd_bytes[6] & 0x3U) << 10) |
|
||||||
|
(csd_bytes[7] << 2) |
|
||||||
|
((csd_bytes[8] >> 6) & 0x3U);
|
||||||
|
|
||||||
|
const uint8_t device_size_multiplier = ((csd_bytes[9] & 0x3U) << 1) |
|
||||||
|
((csd_bytes[10] >> 7) & 0x1U);
|
||||||
|
|
||||||
|
// Store calculated values
|
||||||
|
info->csd.device_size = device_size;
|
||||||
|
info->csd.device_size_multiplier = device_size_multiplier;
|
||||||
|
|
||||||
|
// Calculate block size and capacity
|
||||||
|
info->block_size = 1U << info->csd.read_block_length;
|
||||||
|
info->capacity = (device_size + 1U) *
|
||||||
|
(1U << (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) << 16) |
|
||||||
|
static_cast<uint32_t>((csd_bytes[8]) << 8) |
|
||||||
|
static_cast<uint32_t>(csd_bytes[9]);
|
||||||
|
|
||||||
|
// Set block size and calculate capacity
|
||||||
|
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) {
|
||||||
|
// Calculate sector_size
|
||||||
|
info->csd.sector_size = static_cast<uint8_t>(((csd_bytes[9] & 0x3FU) << 1) |
|
||||||
|
(csd_bytes[10] & 0x80U) >> 7);
|
||||||
|
|
||||||
|
// Calculate speed_factor and write_block_length
|
||||||
|
info->csd.speed_factor = static_cast<uint8_t>((csd_bytes[11] & 0x1CU) >> 2);
|
||||||
|
info->csd.write_block_length = static_cast<uint8_t>(((csd_bytes[11] & 0x3U) << 2) |
|
||||||
|
((csd_bytes[12] & 0xC0U) >> 6));
|
||||||
|
|
||||||
|
// Calculate checksum
|
||||||
|
info->csd.checksum = static_cast<uint8_t>((csd_bytes[15] & 0xFEU) >> 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
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>
|
||||||
|
auto send_command_and_check(Command_Index command, uint32_t argument,
|
||||||
|
Command_Response response, Wait_Type type, CheckFunc check_result) -> SDIO_Error_Type {
|
||||||
|
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;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user